@noya-app/noya-designsystem 0.1.54 → 0.1.55

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/index.js CHANGED
@@ -113,6 +113,7 @@ __export(src_exports, {
113
113
  MediaThumbnail: () => MediaThumbnail,
114
114
  MenuViewport: () => MenuViewport,
115
115
  Message: () => Message,
116
+ OpenPortalsProvider: () => OpenPortalsProvider,
116
117
  PatternPreviewBackground: () => PatternPreviewBackground,
117
118
  PipelineResultLayout: () => PipelineResultLayout,
118
119
  PipelineResultLink: () => PipelineResultLink,
@@ -205,6 +206,7 @@ __export(src_exports, {
205
206
  useGlobalInputBlur: () => useGlobalInputBlur,
206
207
  useGlobalInputBlurListener: () => useGlobalInputBlurListener,
207
208
  useGlobalInputBlurTrigger: () => useGlobalInputBlurTrigger,
209
+ useHasOpenPortals: () => useHasOpenPortals,
208
210
  useHover: () => useHover,
209
211
  useImageData: () => useImageData,
210
212
  useIndent: () => useIndent,
@@ -215,6 +217,7 @@ __export(src_exports, {
215
217
  useOpenConfirmationDialog: () => useOpenConfirmationDialog,
216
218
  useOpenDialog: () => useOpenDialog,
217
219
  useOpenInputDialog: () => useOpenInputDialog,
220
+ useOpenPortalsControls: () => useOpenPortalsControls,
218
221
  usePlatform: () => usePlatform,
219
222
  usePlatformModKey: () => usePlatformModKey,
220
223
  usePortalScopeId: () => usePortalScopeId,
@@ -676,14 +679,14 @@ var import_react32 = __toESM(require("react"));
676
679
 
677
680
  // src/contexts/DesignSystemConfiguration.tsx
678
681
  var import_noya_keymap = require("@noya-app/noya-keymap");
679
- var React21 = __toESM(require("react"));
682
+ var React22 = __toESM(require("react"));
680
683
 
681
684
  // src/components/Toast.tsx
682
685
  var ToastPrimitive = __toESM(require("@radix-ui/react-toast"));
683
686
  var import_react21 = __toESM(require("react"));
684
687
 
685
688
  // src/components/IconButton.tsx
686
- var React10 = __toESM(require("react"));
689
+ var React11 = __toESM(require("react"));
687
690
 
688
691
  // src/components/Button.tsx
689
692
  var import_react20 = __toESM(require("react"));
@@ -751,9 +754,58 @@ function mergeConflictingClassNames(classNames, options) {
751
754
  return classNamesList.join(" ");
752
755
  }
753
756
 
757
+ // src/components/Icons.tsx
758
+ var Icons = __toESM(require("@noya-app/noya-icons"));
759
+ var React6 = __toESM(require("react"));
760
+ function renderIcon(iconName) {
761
+ if (typeof iconName === "string") {
762
+ const Icon = Icons[iconName];
763
+ return /* @__PURE__ */ React6.createElement(Icon, null);
764
+ }
765
+ return iconName;
766
+ }
767
+
768
+ // src/components/Spacer.tsx
769
+ var React7 = __toESM(require("react"));
770
+ var SpacerVertical = React7.forwardRef(
771
+ ({ size: size2, inline, ...props }, ref) => {
772
+ return /* @__PURE__ */ React7.createElement(
773
+ "span",
774
+ {
775
+ className: `${inline ? "inline-block" : "block"} ${size2 === void 0 ? "flex flex-1" : ""}`,
776
+ style: size2 ? {
777
+ minHeight: `${size2}px`
778
+ } : void 0,
779
+ ...props,
780
+ ref
781
+ }
782
+ );
783
+ }
784
+ );
785
+ var SpacerHorizontal = React7.forwardRef(
786
+ ({ size: size2, inline, ...props }, ref) => {
787
+ return /* @__PURE__ */ React7.createElement(
788
+ "span",
789
+ {
790
+ className: `${inline ? "inline-block" : "block"} ${size2 === void 0 ? "flex flex-1" : ""}`,
791
+ style: size2 ? {
792
+ minWidth: `${size2}px`
793
+ } : void 0,
794
+ ...props,
795
+ ref
796
+ }
797
+ );
798
+ }
799
+ );
800
+ var Spacer;
801
+ ((Spacer2) => {
802
+ Spacer2.Vertical = SpacerVertical;
803
+ Spacer2.Horizontal = SpacerHorizontal;
804
+ })(Spacer || (Spacer = {}));
805
+
754
806
  // src/components/Tooltip.tsx
755
807
  var TooltipPrimitive = __toESM(require("@radix-ui/react-tooltip"));
756
- var React7 = __toESM(require("react"));
808
+ var React9 = __toESM(require("react"));
757
809
 
758
810
  // src/components/Text.tsx
759
811
  var import_react19 = __toESM(require("react"));
@@ -849,13 +901,13 @@ var Italic = ({ children }) => /* @__PURE__ */ import_react19.default.createElem
849
901
  );
850
902
 
851
903
  // src/components/Tooltip.tsx
852
- var Tooltip = React7.memo(function Tooltip2({
904
+ var Tooltip = React9.memo(function Tooltip2({
853
905
  children,
854
906
  content,
855
907
  sideOffset = 2
856
908
  }) {
857
909
  const portalScopeId = usePortalScopeId();
858
- return /* @__PURE__ */ React7.createElement(TooltipPrimitive.Provider, null, /* @__PURE__ */ React7.createElement(TooltipPrimitive.Root, null, /* @__PURE__ */ React7.createElement(TooltipPrimitive.Trigger, { asChild: true }, children), /* @__PURE__ */ React7.createElement(TooltipPrimitive.Portal, null, /* @__PURE__ */ React7.createElement(
910
+ return /* @__PURE__ */ React9.createElement(TooltipPrimitive.Provider, null, /* @__PURE__ */ React9.createElement(TooltipPrimitive.Root, null, /* @__PURE__ */ React9.createElement(TooltipPrimitive.Trigger, { asChild: true }, children), /* @__PURE__ */ React9.createElement(TooltipPrimitive.Portal, null, /* @__PURE__ */ React9.createElement(
859
911
  TooltipPrimitive.Content,
860
912
  {
861
913
  ...portalScopeProps(portalScopeId),
@@ -892,6 +944,8 @@ var Button = (0, import_react20.forwardRef)(function Button2({
892
944
  className,
893
945
  style: style2,
894
946
  tabIndex,
947
+ icon,
948
+ iconRight,
895
949
  tooltip,
896
950
  active = false,
897
951
  disabled = false,
@@ -936,36 +990,29 @@ var Button = (0, import_react20.forwardRef)(function Button2({
936
990
  className: "min-h-[19px] flex items-center flex-1 justify-center leading-[15px]",
937
991
  style: contentStyle
938
992
  },
939
- children
993
+ icon && renderIcon(icon),
994
+ icon && children && /* @__PURE__ */ import_react20.default.createElement(Spacer.Horizontal, { inline: true, size: 6 }),
995
+ children,
996
+ iconRight && (icon || children) && /* @__PURE__ */ import_react20.default.createElement(Spacer.Horizontal, { inline: true, size: 6 }),
997
+ iconRight && renderIcon(iconRight)
940
998
  )
941
999
  );
942
1000
  return tooltip ? /* @__PURE__ */ import_react20.default.createElement(Tooltip, { content: tooltip }, buttonElement) : buttonElement;
943
1001
  });
944
1002
  var Button_default = Button;
945
1003
 
946
- // src/components/Icons.tsx
947
- var Icons = __toESM(require("@noya-app/noya-icons"));
948
- var React9 = __toESM(require("react"));
949
- function renderIcon(iconName) {
950
- if (typeof iconName === "string") {
951
- const Icon = Icons[iconName];
952
- return /* @__PURE__ */ React9.createElement(Icon, null);
953
- }
954
- return iconName;
955
- }
956
-
957
1004
  // src/components/IconButton.tsx
958
- var IconButton = React10.memo(
959
- React10.forwardRef(function IconButton2({ selected, iconName, color, size: size2, contentStyle, ...props }, forwardedRef) {
1005
+ var IconButton = React11.memo(
1006
+ React11.forwardRef(function IconButton2({ selected, iconName, color, size: size2, contentStyle, ...props }, forwardedRef) {
960
1007
  const Icon = Icons[iconName];
961
- const style2 = React10.useMemo(() => {
1008
+ const style2 = React11.useMemo(() => {
962
1009
  return {
963
1010
  padding: "0 2px",
964
1011
  ...size2 && { minHeight: size2 },
965
1012
  ...contentStyle
966
1013
  };
967
1014
  }, [contentStyle, size2]);
968
- return /* @__PURE__ */ React10.createElement(Button, { ref: forwardedRef, ...props, variant: "none", contentStyle: style2 }, /* @__PURE__ */ React10.createElement(
1015
+ return /* @__PURE__ */ React11.createElement(Button, { ref: forwardedRef, ...props, variant: "none", contentStyle: style2 }, /* @__PURE__ */ React11.createElement(
969
1016
  Icon,
970
1017
  {
971
1018
  color: color ?? (selected ? cssVars.colors.iconSelected : cssVars.colors.icon),
@@ -1014,46 +1061,6 @@ var import_react29 = __toESM(require("react"));
1014
1061
  // src/components/Dialog.tsx
1015
1062
  var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"));
1016
1063
  var import_react22 = __toESM(require("react"));
1017
-
1018
- // src/components/Spacer.tsx
1019
- var React12 = __toESM(require("react"));
1020
- var SpacerVertical = React12.forwardRef(
1021
- ({ size: size2, inline, ...props }, ref) => {
1022
- return /* @__PURE__ */ React12.createElement(
1023
- "span",
1024
- {
1025
- className: `${inline ? "inline-block" : "block"} ${size2 === void 0 ? "flex flex-1" : ""}`,
1026
- style: size2 ? {
1027
- minHeight: `${size2}px`
1028
- } : void 0,
1029
- ...props,
1030
- ref
1031
- }
1032
- );
1033
- }
1034
- );
1035
- var SpacerHorizontal = React12.forwardRef(
1036
- ({ size: size2, inline, ...props }, ref) => {
1037
- return /* @__PURE__ */ React12.createElement(
1038
- "span",
1039
- {
1040
- className: `${inline ? "inline-block" : "block"} ${size2 === void 0 ? "flex flex-1" : ""}`,
1041
- style: size2 ? {
1042
- minWidth: `${size2}px`
1043
- } : void 0,
1044
- ...props,
1045
- ref
1046
- }
1047
- );
1048
- }
1049
- );
1050
- var Spacer;
1051
- ((Spacer2) => {
1052
- Spacer2.Vertical = SpacerVertical;
1053
- Spacer2.Horizontal = SpacerHorizontal;
1054
- })(Spacer || (Spacer = {}));
1055
-
1056
- // src/components/Dialog.tsx
1057
1064
  var StyledOverlay = (0, import_react22.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react22.default.createElement(
1058
1065
  DialogPrimitive.Overlay,
1059
1066
  {
@@ -1068,9 +1075,8 @@ var StyledContent = (0, import_react22.forwardRef)(({ className, children, ...pr
1068
1075
  {
1069
1076
  ref,
1070
1077
  className: cx(
1071
- `
1072
- fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2
1073
- w-[90vw] max-w-[450px] max-h-[85vh] p-dialog-padding rounded-[2px]
1078
+ `fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2
1079
+ w-[90vw] max-w-[550px] max-h-[85vh] p-dialog-padding rounded-[2px]
1074
1080
  font-sans text-heading5 font-normal leading-[19px] text-text-muted
1075
1081
  bg-popover-background pointer-events-all z-[1000] focus:outline-none
1076
1082
  shadow-dialog-shadow
@@ -1088,7 +1094,7 @@ var StyledTitle = (0, import_react22.forwardRef)(({ className, ...props }, ref)
1088
1094
  {
1089
1095
  ref,
1090
1096
  className: cx(
1091
- `m-0 font-sans text-base font-normal leading-[1.4] text-text `,
1097
+ `m-0 font-sans text-heading3 font-medium leading-[1.4] text-text `,
1092
1098
  className
1093
1099
  ),
1094
1100
  ...props
@@ -1149,7 +1155,7 @@ var Dialog = (0, import_react22.forwardRef)(function Dialog2({
1149
1155
  }
1150
1156
  )),
1151
1157
  title && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(StyledTitle, null, title), /* @__PURE__ */ import_react22.default.createElement(Spacer.Vertical, { size: description ? 10 : 20 })),
1152
- description && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(Spacer.Vertical, { size: 10 }), /* @__PURE__ */ import_react22.default.createElement(StyledDescription, null, description), /* @__PURE__ */ import_react22.default.createElement(Spacer.Vertical, { size: 20 })),
1158
+ description && /* @__PURE__ */ import_react22.default.createElement(import_react22.default.Fragment, null, /* @__PURE__ */ import_react22.default.createElement(StyledDescription, null, description), /* @__PURE__ */ import_react22.default.createElement(Spacer.Vertical, { size: 20 })),
1153
1159
  children
1154
1160
  ));
1155
1161
  });
@@ -1502,6 +1508,47 @@ var Label = (0, import_react26.memo)(
1502
1508
  // src/components/Popover.tsx
1503
1509
  var PopoverPrimitive = __toESM(require("@radix-ui/react-popover"));
1504
1510
  var import_react27 = __toESM(require("react"));
1511
+
1512
+ // src/contexts/OpenPortalsContext.tsx
1513
+ var React17 = __toESM(require("react"));
1514
+ var OpenPortalsContext = React17.createContext({
1515
+ hasOpenPortals: false
1516
+ });
1517
+ var OpenPortalControlsContext = React17.createContext({
1518
+ addOpenPortal: () => {
1519
+ },
1520
+ removeOpenPortal: () => {
1521
+ }
1522
+ });
1523
+ var OpenPortalsProvider = React17.memo(function OpenPortalsProvider2({
1524
+ children
1525
+ }) {
1526
+ const [openPortals, setOpenPortals] = React17.useState([]);
1527
+ const value = React17.useMemo(
1528
+ () => ({ hasOpenPortals: openPortals.length > 0 }),
1529
+ [openPortals]
1530
+ );
1531
+ const controlsValue = React17.useMemo(
1532
+ () => ({
1533
+ addOpenPortal: (portal) => {
1534
+ setOpenPortals((prev) => [...prev, portal]);
1535
+ },
1536
+ removeOpenPortal: (portal) => {
1537
+ setOpenPortals((prev) => prev.filter((p) => p !== portal));
1538
+ }
1539
+ }),
1540
+ []
1541
+ );
1542
+ return /* @__PURE__ */ React17.createElement(OpenPortalsContext.Provider, { value }, /* @__PURE__ */ React17.createElement(OpenPortalControlsContext.Provider, { value: controlsValue }, children));
1543
+ });
1544
+ function useHasOpenPortals() {
1545
+ return React17.useContext(OpenPortalsContext).hasOpenPortals;
1546
+ }
1547
+ function useOpenPortalsControls() {
1548
+ return React17.useContext(OpenPortalControlsContext);
1549
+ }
1550
+
1551
+ // src/components/Popover.tsx
1505
1552
  var closeStyles = {
1506
1553
  all: "unset",
1507
1554
  fontFamily: "inherit"
@@ -1527,13 +1574,30 @@ function Popover({
1527
1574
  onInteractOutside,
1528
1575
  onFocusOutside,
1529
1576
  onClickClose,
1530
- className
1577
+ className,
1578
+ portalContainer
1531
1579
  }) {
1580
+ const defaultId = (0, import_react27.useId)();
1532
1581
  const portalScopeId = usePortalScopeId();
1533
- return /* @__PURE__ */ import_react27.default.createElement(PopoverPrimitive.Root, { open, onOpenChange }, /* @__PURE__ */ import_react27.default.createElement(PopoverPrimitive.Trigger, { asChild: true }, trigger), /* @__PURE__ */ import_react27.default.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ import_react27.default.createElement(
1582
+ const contentRef = (0, import_react27.useRef)(null);
1583
+ const [isOpen, setIsOpen] = useControlledOrUncontrolled({
1584
+ value: open,
1585
+ onChange: onOpenChange,
1586
+ defaultValue: false
1587
+ });
1588
+ const { addOpenPortal, removeOpenPortal } = useOpenPortalsControls();
1589
+ (0, import_react27.useEffect)(() => {
1590
+ if (!isOpen) return;
1591
+ addOpenPortal(portalScopeId || defaultId);
1592
+ return () => {
1593
+ removeOpenPortal(portalScopeId || defaultId);
1594
+ };
1595
+ }, [addOpenPortal, isOpen, portalScopeId, removeOpenPortal, defaultId]);
1596
+ return /* @__PURE__ */ import_react27.default.createElement(PopoverPrimitive.Root, { open: isOpen, onOpenChange: setIsOpen }, /* @__PURE__ */ import_react27.default.createElement(PopoverPrimitive.Trigger, { asChild: true }, trigger), /* @__PURE__ */ import_react27.default.createElement(PopoverPrimitive.Portal, { container: portalContainer }, /* @__PURE__ */ import_react27.default.createElement(
1534
1597
  PopoverPrimitive.Content,
1535
1598
  {
1536
1599
  ...portalScopeProps(portalScopeId),
1600
+ ref: contentRef,
1537
1601
  className: cx(
1538
1602
  popoverStyle.base,
1539
1603
  variant === "large" && popoverStyle.large,
@@ -1547,7 +1611,15 @@ function Popover({
1547
1611
  onCloseAutoFocus,
1548
1612
  onInteractOutside,
1549
1613
  onFocusOutside,
1550
- onPointerDownOutside,
1614
+ onPointerDownOutside: (event) => {
1615
+ if (isEventInsideElement(
1616
+ event.detail.originalEvent,
1617
+ contentRef.current
1618
+ )) {
1619
+ event.preventDefault();
1620
+ }
1621
+ onPointerDownOutside?.(event);
1622
+ },
1551
1623
  collisionPadding: 8,
1552
1624
  arrowPadding: 2
1553
1625
  },
@@ -1563,6 +1635,19 @@ function Popover({
1563
1635
  )
1564
1636
  )));
1565
1637
  }
1638
+ function isEventInsideElement(event, element) {
1639
+ if (!element) return false;
1640
+ const body = document.body;
1641
+ const originalPointerEvents = body.style.pointerEvents;
1642
+ body.style.pointerEvents = "auto";
1643
+ const elementsAtPoint = document.elementsFromPoint(
1644
+ event.clientX,
1645
+ event.clientY
1646
+ );
1647
+ body.style.pointerEvents = originalPointerEvents;
1648
+ const target = elementsAtPoint.at(0);
1649
+ return target && element.contains(target);
1650
+ }
1566
1651
 
1567
1652
  // src/components/InputField.tsx
1568
1653
  var InputFieldContext = (0, import_react28.createContext)({
@@ -1685,7 +1770,7 @@ var InputElement = (0, import_react28.forwardRef)(
1685
1770
  readOnly ? "text-text-muted" : disabled ? "text-text-disabled" : "text-text",
1686
1771
  "font-sans font-normal",
1687
1772
  $textAlign && `text-${$textAlign}`,
1688
- size2 === "small" ? "text-[11px] leading-[19px] py-[1px]" : size2 === "large" ? "py-2.5 text-heading5" : size2 === "medium" ? "py-1 text-heading5" : $variant === "bare" && "py-1 -m-1",
1773
+ size2 === "small" ? "text-[11px] leading-[19px] py-[1px]" : size2 === "large" ? "py-2.5 text-heading5" : size2 === "medium" ? "py-1 text-heading5" : $variant === "bare" && "py-1 -m-1",
1689
1774
  className
1690
1775
  );
1691
1776
  const mergedClassName = (0, import_react28.useMemo)(
@@ -1856,6 +1941,8 @@ function InputFieldRoot({
1856
1941
  className,
1857
1942
  start,
1858
1943
  end,
1944
+ startClassName,
1945
+ endClassName,
1859
1946
  label: labelProp
1860
1947
  }) {
1861
1948
  const randomId = (0, import_react28.useId)();
@@ -1896,7 +1983,15 @@ function InputFieldRoot({
1896
1983
  () => /* @__PURE__ */ import_react28.default.createElement(Label, { htmlFor: id, className: "!text-text-disabled" }, labelProp ?? label),
1897
1984
  [id, labelProp, label]
1898
1985
  );
1899
- const rootElement = /* @__PURE__ */ import_react28.default.createElement(RootContainer, { $width: width, style: style2, className }, children, start && /* @__PURE__ */ import_react28.default.createElement("span", { ref: startRef, className: startBaseStyles }, start), (end || label) && /* @__PURE__ */ import_react28.default.createElement("span", { ref: endRef, className: cx(endStyles, label && end && "gap-1.5") }, labelProp ? insetLabel : label && labelPosition === "inset" && insetLabel, end));
1986
+ const rootElement = /* @__PURE__ */ import_react28.default.createElement(RootContainer, { $width: width, style: style2, className }, children, start && /* @__PURE__ */ import_react28.default.createElement("span", { ref: startRef, className: cx(startBaseStyles, startClassName) }, start), (end || label) && /* @__PURE__ */ import_react28.default.createElement(
1987
+ "span",
1988
+ {
1989
+ ref: endRef,
1990
+ className: cx(endStyles, label && end && "gap-1.5", endClassName)
1991
+ },
1992
+ labelProp ? insetLabel : label && labelPosition === "inset" && insetLabel,
1993
+ end
1994
+ ));
1900
1995
  const measuredWidthObject = (0, import_react28.useMemo)(
1901
1996
  () => measuredInputSize ? { width: measuredInputSize.width + 4 } : void 0,
1902
1997
  [measuredInputSize]
@@ -2278,30 +2373,30 @@ var useCurrentFloatingWindowInternal = () => {
2278
2373
  };
2279
2374
 
2280
2375
  // src/contexts/DesignSystemConfiguration.tsx
2281
- var DesignSystemConfigurationContext = React21.createContext({
2376
+ var DesignSystemConfigurationContext = React22.createContext({
2282
2377
  platform: "key"
2283
2378
  });
2284
- var DesignSystemConfigurationProvider = React21.memo(
2379
+ var DesignSystemConfigurationProvider = React22.memo(
2285
2380
  function DesignSystemConfigurationProvider2({
2286
2381
  children,
2287
2382
  platform
2288
2383
  }) {
2289
- const [internalPlatform, setInternalPlatform] = React21.useState(platform ?? "key");
2290
- React21.useEffect(() => {
2384
+ const [internalPlatform, setInternalPlatform] = React22.useState(platform ?? "key");
2385
+ React22.useEffect(() => {
2291
2386
  if (platform !== void 0) return;
2292
2387
  if (typeof navigator !== "undefined") {
2293
2388
  setInternalPlatform((0, import_noya_keymap.getCurrentPlatform)(navigator));
2294
2389
  }
2295
2390
  }, [platform]);
2296
- const contextValue = React21.useMemo(
2391
+ const contextValue = React22.useMemo(
2297
2392
  () => ({ platform: platform ?? internalPlatform }),
2298
2393
  [platform, internalPlatform]
2299
2394
  );
2300
- return /* @__PURE__ */ React21.createElement(DesignSystemConfigurationContext.Provider, { value: contextValue }, /* @__PURE__ */ React21.createElement(DialogProvider, null, /* @__PURE__ */ React21.createElement(ToastProvider, null, /* @__PURE__ */ React21.createElement(FloatingWindowProvider, null, children))));
2395
+ return /* @__PURE__ */ React22.createElement(DesignSystemConfigurationContext.Provider, { value: contextValue }, /* @__PURE__ */ React22.createElement(OpenPortalsProvider, null, /* @__PURE__ */ React22.createElement(DialogProvider, null, /* @__PURE__ */ React22.createElement(ToastProvider, null, /* @__PURE__ */ React22.createElement(FloatingWindowProvider, null, children)))));
2301
2396
  }
2302
2397
  );
2303
2398
  function useDesignSystemConfiguration() {
2304
- return React21.useContext(DesignSystemConfigurationContext);
2399
+ return React22.useContext(DesignSystemConfigurationContext);
2305
2400
  }
2306
2401
 
2307
2402
  // src/utils/withSeparatorElements.ts
@@ -2762,16 +2857,16 @@ var ActionMenu = memoGeneric(function ActionMenu2({
2762
2857
  });
2763
2858
 
2764
2859
  // src/components/ActivityIndicator.tsx
2765
- var React27 = __toESM(require("react"));
2766
- var ActivityIndicator = React27.memo(function ActivityIndicator2({
2860
+ var React28 = __toESM(require("react"));
2861
+ var ActivityIndicator = React28.memo(function ActivityIndicator2({
2767
2862
  size: size2 = 16,
2768
2863
  opacity = 1,
2769
2864
  color = "black",
2770
2865
  trackColor = "rgba(0, 0, 0, 0.1)",
2771
2866
  className
2772
2867
  }) {
2773
- const opacityStyle = React27.useMemo(() => ({ opacity }), [opacity]);
2774
- const dynamicStyles = React27.useMemo(
2868
+ const opacityStyle = React28.useMemo(() => ({ opacity }), [opacity]);
2869
+ const dynamicStyles = React28.useMemo(
2775
2870
  () => ({
2776
2871
  border: `2px solid ${trackColor}`,
2777
2872
  borderTopColor: color,
@@ -2780,13 +2875,13 @@ var ActivityIndicator = React27.memo(function ActivityIndicator2({
2780
2875
  }),
2781
2876
  [size2, color, trackColor]
2782
2877
  );
2783
- return /* @__PURE__ */ React27.createElement(
2878
+ return /* @__PURE__ */ React28.createElement(
2784
2879
  "div",
2785
2880
  {
2786
2881
  className: cx("flex justify-center items-center", className),
2787
2882
  style: opacityStyle
2788
2883
  },
2789
- /* @__PURE__ */ React27.createElement("div", { style: dynamicStyles, className: "animate-spin rounded-[50%]" })
2884
+ /* @__PURE__ */ React28.createElement("div", { style: dynamicStyles, className: "animate-spin rounded-[50%]" })
2790
2885
  );
2791
2886
  });
2792
2887
 
@@ -3432,16 +3527,16 @@ var BreadcrumbSlash = () => {
3432
3527
  };
3433
3528
 
3434
3529
  // src/components/Checkbox.tsx
3435
- var React35 = __toESM(require("react"));
3530
+ var React36 = __toESM(require("react"));
3436
3531
  var colorSchemeStyles = {
3437
3532
  normal: "text-text-subtle",
3438
3533
  primary: "text-primary",
3439
3534
  secondary: "text-secondary"
3440
3535
  };
3441
- var Checkbox = React35.memo(
3442
- React35.forwardRef(function Checkbox2({ className, style: style2, colorScheme = "secondary", ...props }, ref) {
3536
+ var Checkbox = React36.memo(
3537
+ React36.forwardRef(function Checkbox2({ className, style: style2, colorScheme = "secondary", ...props }, ref) {
3443
3538
  const { fieldId: id } = useLabel({ fieldId: props.id });
3444
- return /* @__PURE__ */ React35.createElement(
3539
+ return /* @__PURE__ */ React36.createElement(
3445
3540
  "div",
3446
3541
  {
3447
3542
  className: cx(
@@ -3451,7 +3546,7 @@ var Checkbox = React35.memo(
3451
3546
  ),
3452
3547
  style: style2
3453
3548
  },
3454
- /* @__PURE__ */ React35.createElement(
3549
+ /* @__PURE__ */ React36.createElement(
3455
3550
  "input",
3456
3551
  {
3457
3552
  ref,
@@ -3480,7 +3575,7 @@ var Checkbox = React35.memo(
3480
3575
  id
3481
3576
  }
3482
3577
  ),
3483
- /* @__PURE__ */ React35.createElement(
3578
+ /* @__PURE__ */ React36.createElement(
3484
3579
  "svg",
3485
3580
  {
3486
3581
  className: `
@@ -3500,7 +3595,7 @@ var Checkbox = React35.memo(
3500
3595
  xmlns: "http://www.w3.org/2000/svg",
3501
3596
  "aria-hidden": "true"
3502
3597
  },
3503
- /* @__PURE__ */ React35.createElement(
3598
+ /* @__PURE__ */ React36.createElement(
3504
3599
  "path",
3505
3600
  {
3506
3601
  d: "M3 6L4.5 7.5L8 4",
@@ -3519,7 +3614,7 @@ var import_noya_icons3 = require("@noya-app/noya-icons");
3519
3614
  var import_react45 = __toESM(require("react"));
3520
3615
 
3521
3616
  // src/hooks/useHover.ts
3522
- var React36 = __toESM(require("react"));
3617
+ var React37 = __toESM(require("react"));
3523
3618
  var globalIgnoreEmulatedMouseEvents = false;
3524
3619
  var hoverCount = 0;
3525
3620
  function setGlobalIgnoreEmulatedMouseEvents() {
@@ -3549,13 +3644,13 @@ function setupGlobalTouchEvents() {
3549
3644
  }
3550
3645
  function useHover(props = {}) {
3551
3646
  const { onHoverStart, onHoverChange, onHoverEnd, isDisabled } = props;
3552
- const [isHovered, setHovered] = React36.useState(false);
3553
- const state = React36.useRef({
3647
+ const [isHovered, setHovered] = React37.useState(false);
3648
+ const state = React37.useRef({
3554
3649
  isHovered: false,
3555
3650
  ignoreEmulatedMouseEvents: false
3556
3651
  }).current;
3557
- React36.useEffect(setupGlobalTouchEvents, []);
3558
- const hoverProps = React36.useMemo(
3652
+ React37.useEffect(setupGlobalTouchEvents, []);
3653
+ const hoverProps = React37.useMemo(
3559
3654
  function getHoverProps() {
3560
3655
  function triggerHoverStart(event, pointerType) {
3561
3656
  if (isDisabled || pointerType === "touch" || state.isHovered) {
@@ -3954,26 +4049,26 @@ var ContextMenu = memoGeneric(ContextMenuRoot);
3954
4049
 
3955
4050
  // src/components/ScrollArea.tsx
3956
4051
  var RadixScrollArea = __toESM(require("@radix-ui/react-scroll-area"));
3957
- var React40 = __toESM(require("react"));
3958
- var ScrollArea = React40.memo(function ScrollArea2({ children }) {
3959
- const [scrollElementRef, setScrollElementRef] = React40.useState(null);
3960
- return /* @__PURE__ */ React40.createElement("div", { className: "flex-1 min-h-0" }, /* @__PURE__ */ React40.createElement(RadixScrollArea.Root, { style: { width: "100%", height: "100%" } }, /* @__PURE__ */ React40.createElement(
4052
+ var React41 = __toESM(require("react"));
4053
+ var ScrollArea = React41.memo(function ScrollArea2({ children }) {
4054
+ const [scrollElementRef, setScrollElementRef] = React41.useState(null);
4055
+ return /* @__PURE__ */ React41.createElement("div", { className: "flex-1 min-h-0" }, /* @__PURE__ */ React41.createElement(RadixScrollArea.Root, { style: { width: "100%", height: "100%" } }, /* @__PURE__ */ React41.createElement(
3961
4056
  RadixScrollArea.Viewport,
3962
4057
  {
3963
4058
  className: "w-full h-full [&>div]:block",
3964
- ref: React40.useCallback(
4059
+ ref: React41.useCallback(
3965
4060
  (ref) => setScrollElementRef(ref),
3966
4061
  []
3967
4062
  )
3968
4063
  },
3969
4064
  typeof children === "function" ? scrollElementRef ? children(scrollElementRef) : null : children
3970
- ), /* @__PURE__ */ React40.createElement(
4065
+ ), /* @__PURE__ */ React41.createElement(
3971
4066
  RadixScrollArea.Scrollbar,
3972
4067
  {
3973
4068
  orientation: "vertical",
3974
4069
  className: "scroll-component flex p-[3px] data-[orientation=vertical]:w-[10px]"
3975
4070
  },
3976
- /* @__PURE__ */ React40.createElement(RadixScrollArea.Thumb, { className: "scroll-component flex-1 rounded-[10px] bg-scrollbar" })
4071
+ /* @__PURE__ */ React41.createElement(RadixScrollArea.Thumb, { className: "scroll-component flex-1 rounded-[10px] bg-scrollbar" })
3977
4072
  )));
3978
4073
  });
3979
4074
 
@@ -4102,7 +4197,7 @@ var GridViewItem = forwardRefGeneric(function GridViewItem2({
4102
4197
  },
4103
4198
  children
4104
4199
  ),
4105
- textPosition === "below" && /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement(Spacer.Vertical, { size: 8 }), /* @__PURE__ */ import_react48.default.createElement(ItemTitle, null, title || " "), /* @__PURE__ */ import_react48.default.createElement(ItemDescription, null, subtitle || " ")),
4200
+ textPosition === "below" && /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement(Spacer.Vertical, { size: 8 }), /* @__PURE__ */ import_react48.default.createElement(ItemTitle, null, title || " "), /* @__PURE__ */ import_react48.default.createElement(Spacer.Vertical, { size: 2 }), /* @__PURE__ */ import_react48.default.createElement(ItemDescription, null, subtitle || " ")),
4106
4201
  textPosition === "overlay" && hovered && (title || subtitle) && /* @__PURE__ */ import_react48.default.createElement("div", { className: "absolute inset-0 flex flex-col justify-end items-start p-1 pointer-events-none truncate gap-0.5" }, title && /* @__PURE__ */ import_react48.default.createElement(ItemTitle, { showBackground: true }, title), subtitle && /* @__PURE__ */ import_react48.default.createElement(ItemDescription, { showBackground: true }, subtitle)),
4107
4202
  action && /* @__PURE__ */ import_react48.default.createElement("div", { className: "absolute top-[7px] right-[7px] flex flex-col justify-end items-start p-1 truncate gap-0.5" }, action),
4108
4203
  loading && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col justify-start items-end p-1 pointer-events-none animate-shimmer absolute inset-0 bg-gradient-to-r from-white/0 via-[rgb(226,232,240)]/50 to-white/0 bg-length:200%_100%]" }, /* @__PURE__ */ import_react48.default.createElement(ActivityIndicator, { opacity: 0.5, size: 13 }))
@@ -4409,7 +4504,7 @@ var Grid = memoGeneric(
4409
4504
  {
4410
4505
  ...props2,
4411
4506
  className: cx(
4412
- isSelected && "text-selected-list-item-text",
4507
+ isSelected ? "text-selected-list-item-text" : "text-text",
4413
4508
  "truncate select-none"
4414
4509
  )
4415
4510
  }
@@ -4502,7 +4597,7 @@ function mergeEventHandlers(...handlerMaps) {
4502
4597
  // src/components/Sortable.tsx
4503
4598
  var import_core = require("@dnd-kit/core");
4504
4599
  var import_sortable = require("@dnd-kit/sortable");
4505
- var React43 = __toESM(require("react"));
4600
+ var React44 = __toESM(require("react"));
4506
4601
  var import_react50 = require("react");
4507
4602
  var import_react_dom2 = require("react-dom");
4508
4603
  var normalizeListTargetIndex = (index, position) => {
@@ -4516,7 +4611,7 @@ var defaultAcceptsDrop = (sourceIndex, targetIndex, position) => {
4516
4611
  }
4517
4612
  return true;
4518
4613
  };
4519
- var SortableItemContext = React43.createContext({
4614
+ var SortableItemContext = React44.createContext({
4520
4615
  keys: [],
4521
4616
  acceptsDrop: defaultAcceptsDrop,
4522
4617
  axis: "y",
@@ -4571,7 +4666,7 @@ function SortableItem({
4571
4666
  setActivatorEvent,
4572
4667
  axis,
4573
4668
  getDropTargetParentIndex
4574
- } = React43.useContext(SortableItemContext);
4669
+ } = React44.useContext(SortableItemContext);
4575
4670
  const sortable = (0, import_sortable.useSortable)({ id, disabled });
4576
4671
  const { activatorEvent } = (0, import_core.useDndContext)();
4577
4672
  const {
@@ -4592,7 +4687,7 @@ function SortableItem({
4592
4687
  const eventY = activatorEvent?.clientY ?? 0;
4593
4688
  const offsetLeft = eventX + position.x;
4594
4689
  const offsetTop = eventY + position.y;
4595
- const ref = React43.useCallback((node) => setNodeRef(node), [setNodeRef]);
4690
+ const ref = React44.useCallback((node) => setNodeRef(node), [setNodeRef]);
4596
4691
  const parentIndex = overIndex === -1 ? void 0 : getDropTargetParentIndex?.(overIndex);
4597
4692
  const isValidParent = parentIndex === void 0 || parentIndex === -1 ? false : acceptsDrop2(activeIndex, parentIndex, "inside");
4598
4693
  const overIdAcceptsDrop = overIndex === -1 ? void 0 : acceptsDrop2(activeIndex, overIndex, "inside");
@@ -4629,26 +4724,26 @@ function SortableRoot({
4629
4724
  }
4630
4725
  })
4631
4726
  );
4632
- const [activeIndex, setActiveIndex] = React43.useState();
4633
- const activatorEvent = React43.useRef(null);
4634
- const [position, setPosition] = React43.useState({
4727
+ const [activeIndex, setActiveIndex] = React44.useState();
4728
+ const activatorEvent = React44.useRef(null);
4729
+ const [position, setPosition] = React44.useState({
4635
4730
  x: 0,
4636
4731
  y: 0
4637
4732
  });
4638
- const setActivatorEvent = React43.useCallback((event) => {
4733
+ const setActivatorEvent = React44.useCallback((event) => {
4639
4734
  activatorEvent.current = event;
4640
4735
  }, []);
4641
- const handleDragStart = React43.useCallback(
4736
+ const handleDragStart = React44.useCallback(
4642
4737
  (event) => {
4643
4738
  const index = keys.findIndex((id) => id === event.active.id);
4644
4739
  setActiveIndex(index);
4645
4740
  },
4646
4741
  [keys]
4647
4742
  );
4648
- const handleDragMove = React43.useCallback((event) => {
4743
+ const handleDragMove = React44.useCallback((event) => {
4649
4744
  setPosition({ ...event.delta });
4650
4745
  }, []);
4651
- const handleDragEnd = React43.useCallback(
4746
+ const handleDragEnd = React44.useCallback(
4652
4747
  (event) => {
4653
4748
  const { active, over } = event;
4654
4749
  setActiveIndex(void 0);
@@ -4675,14 +4770,14 @@ function SortableRoot({
4675
4770
  },
4676
4771
  [acceptsDrop2, axis, keys, onMoveItem, position.x, position.y]
4677
4772
  );
4678
- const [mounted, setMounted] = React43.useState(false);
4679
- React43.useEffect(() => {
4773
+ const [mounted, setMounted] = React44.useState(false);
4774
+ React44.useEffect(() => {
4680
4775
  setMounted(true);
4681
4776
  }, []);
4682
- return /* @__PURE__ */ React43.createElement(
4777
+ return /* @__PURE__ */ React44.createElement(
4683
4778
  SortableItemContext.Provider,
4684
4779
  {
4685
- value: React43.useMemo(
4780
+ value: React44.useMemo(
4686
4781
  () => ({
4687
4782
  keys,
4688
4783
  acceptsDrop: acceptsDrop2,
@@ -4701,7 +4796,7 @@ function SortableRoot({
4701
4796
  ]
4702
4797
  )
4703
4798
  },
4704
- /* @__PURE__ */ React43.createElement(
4799
+ /* @__PURE__ */ React44.createElement(
4705
4800
  import_core.DndContext,
4706
4801
  {
4707
4802
  sensors,
@@ -4710,7 +4805,7 @@ function SortableRoot({
4710
4805
  onDragMove: handleDragMove,
4711
4806
  onDragEnd: handleDragEnd
4712
4807
  },
4713
- /* @__PURE__ */ React43.createElement(
4808
+ /* @__PURE__ */ React44.createElement(
4714
4809
  import_sortable.SortableContext,
4715
4810
  {
4716
4811
  items: keys,
@@ -4719,7 +4814,7 @@ function SortableRoot({
4719
4814
  children
4720
4815
  ),
4721
4816
  mounted && renderOverlay && (0, import_react_dom2.createPortal)(
4722
- /* @__PURE__ */ React43.createElement(import_core.DragOverlay, { dropAnimation: null }, activeIndex !== void 0 && activeIndex >= 0 && renderOverlay(activeIndex)),
4817
+ /* @__PURE__ */ React44.createElement(import_core.DragOverlay, { dropAnimation: null }, activeIndex !== void 0 && activeIndex >= 0 && renderOverlay(activeIndex)),
4723
4818
  document.body
4724
4819
  )
4725
4820
  )
@@ -4737,11 +4832,11 @@ var SortableComponent = memoGeneric(function Sortable(props) {
4737
4832
  shouldRenderOverlay = true,
4738
4833
  ...rest
4739
4834
  } = props;
4740
- const keys = React43.useMemo(
4835
+ const keys = React44.useMemo(
4741
4836
  () => items.map(keyExtractor),
4742
4837
  [items, keyExtractor]
4743
4838
  );
4744
- const renderOverlay = React43.useCallback(
4839
+ const renderOverlay = React44.useCallback(
4745
4840
  (index) => {
4746
4841
  return renderItem(
4747
4842
  items[index],
@@ -4761,14 +4856,14 @@ var SortableComponent = memoGeneric(function Sortable(props) {
4761
4856
  },
4762
4857
  [renderItem, items]
4763
4858
  );
4764
- return /* @__PURE__ */ React43.createElement(
4859
+ return /* @__PURE__ */ React44.createElement(
4765
4860
  SortableSubcomponents.Root,
4766
4861
  {
4767
4862
  ...rest,
4768
4863
  keys,
4769
4864
  renderOverlay: shouldRenderOverlay ? renderOverlay : void 0
4770
4865
  },
4771
- keys.map((key, index) => /* @__PURE__ */ React43.createElement(SortableSubcomponents.Item, { key, id: key }, (props2) => {
4866
+ keys.map((key, index) => /* @__PURE__ */ React44.createElement(SortableSubcomponents.Item, { key, id: key }, (props2) => {
4772
4867
  return renderItem(
4773
4868
  items[index],
4774
4869
  props2,
@@ -6976,7 +7071,6 @@ var CommandPalette = (0, import_react62.memo)(function CommandPalette2({
6976
7071
  });
6977
7072
 
6978
7073
  // src/components/connected-users-menu/ConnectedUsersMenuLayout.tsx
6979
- var import_noya_icons6 = require("@noya-app/noya-icons");
6980
7074
  var import_react63 = __toESM(require("react"));
6981
7075
  var UserAvatar = ({ userId, name, image }) => /* @__PURE__ */ import_react63.default.createElement(
6982
7076
  Tooltip,
@@ -6988,38 +7082,22 @@ var UserAvatar = ({ userId, name, image }) => /* @__PURE__ */ import_react63.def
6988
7082
  );
6989
7083
  var ConnectedUsersMenuLayout = ({
6990
7084
  renderUsers,
6991
- currentUserId,
6992
7085
  launchAIAssistant,
6993
7086
  isAssistantOpen
6994
7087
  }) => {
6995
- return /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex gap-1.5" }, /* @__PURE__ */ import_react63.default.createElement(AvatarStack, { size: INPUT_HEIGHT, className: "mr-1" }, renderUsers()), launchAIAssistant && /* @__PURE__ */ import_react63.default.createElement(
6996
- Tooltip,
7088
+ return /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex gap-1.5" }, /* @__PURE__ */ import_react63.default.createElement(AvatarStack, { size: INPUT_HEIGHT, className: "mr-1" }, renderUsers()), launchAIAssistant && /* @__PURE__ */ import_react63.default.createElement(Tooltip, { content: "AI Assistant" }, /* @__PURE__ */ import_react63.default.createElement(
7089
+ Button_default,
6997
7090
  {
6998
- content: /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react63.default.createElement(Small, null, "AI Assistant"))
7091
+ active: isAssistantOpen,
7092
+ onClick: launchAIAssistant,
7093
+ icon: "ChatBubbleWithDotsIcon"
6999
7094
  },
7000
- /* @__PURE__ */ import_react63.default.createElement(
7001
- Button_default,
7002
- {
7003
- variant: isAssistantOpen ? "secondary" : void 0,
7004
- onClick: launchAIAssistant,
7005
- style: {
7006
- backgroundColor: isAssistantOpen ? colorFromString(currentUserId ?? "") : void 0
7007
- }
7008
- },
7009
- /* @__PURE__ */ import_react63.default.createElement(
7010
- import_noya_icons6.ChatBubbleWithDotsIcon,
7011
- {
7012
- color: isAssistantOpen ? void 0 : cssVars.colors.icon
7013
- }
7014
- ),
7015
- /* @__PURE__ */ import_react63.default.createElement(Spacer.Horizontal, { inline: true, size: 6 }),
7016
- "AI"
7017
- )
7018
- ));
7095
+ "AI"
7096
+ )));
7019
7097
  };
7020
7098
 
7021
7099
  // src/components/DraggableMenuButton.tsx
7022
- var import_noya_icons7 = require("@noya-app/noya-icons");
7100
+ var import_noya_icons6 = require("@noya-app/noya-icons");
7023
7101
  var import_react64 = __toESM(require("react"));
7024
7102
  var DraggableMenuButton = memoGeneric(function DraggableMenuButton2({
7025
7103
  items,
@@ -7092,13 +7170,13 @@ var DraggableMenuButton = memoGeneric(function DraggableMenuButton2({
7092
7170
  shouldBindKeyboardShortcuts: false
7093
7171
  },
7094
7172
  /* @__PURE__ */ import_react64.default.createElement("div", { className: "pointer-events-none h-[15px]" }, /* @__PURE__ */ import_react64.default.createElement(
7095
- import_noya_icons7.DragHandleDots2Icon,
7173
+ import_noya_icons6.DragHandleDots2Icon,
7096
7174
  {
7097
7175
  color: isVisible || open ? cssVars.colors.icon : "transparent"
7098
7176
  }
7099
7177
  ))
7100
7178
  ) : /* @__PURE__ */ import_react64.default.createElement(
7101
- import_noya_icons7.DragHandleDots2Icon,
7179
+ import_noya_icons6.DragHandleDots2Icon,
7102
7180
  {
7103
7181
  color: isVisible || open ? cssVars.colors.icon : "transparent"
7104
7182
  }
@@ -7108,10 +7186,10 @@ var DraggableMenuButton = memoGeneric(function DraggableMenuButton2({
7108
7186
 
7109
7187
  // src/components/Drawer.tsx
7110
7188
  var Dialog3 = __toESM(require("@radix-ui/react-dialog"));
7111
- var React57 = __toESM(require("react"));
7189
+ var React58 = __toESM(require("react"));
7112
7190
  var import_react65 = require("react");
7113
- var Drawer = React57.memo(
7114
- React57.forwardRef(function Drawer2({
7191
+ var Drawer = React58.memo(
7192
+ React58.forwardRef(function Drawer2({
7115
7193
  open,
7116
7194
  onOpenChange,
7117
7195
  trigger,
@@ -7141,7 +7219,7 @@ var Drawer = React57.memo(
7141
7219
  return internalOpen;
7142
7220
  }
7143
7221
  }));
7144
- const inner = /* @__PURE__ */ React57.createElement(React57.Fragment, null, /* @__PURE__ */ React57.createElement(
7222
+ const inner = /* @__PURE__ */ React58.createElement(React58.Fragment, null, /* @__PURE__ */ React58.createElement(
7145
7223
  Dialog3.Overlay,
7146
7224
  {
7147
7225
  className: cx(
@@ -7149,7 +7227,7 @@ var Drawer = React57.memo(
7149
7227
  positioning === "absolute" ? "absolute" : "fixed"
7150
7228
  )
7151
7229
  }
7152
- ), /* @__PURE__ */ React57.createElement(
7230
+ ), /* @__PURE__ */ React58.createElement(
7153
7231
  Dialog3.Content,
7154
7232
  {
7155
7233
  id,
@@ -7161,18 +7239,18 @@ var Drawer = React57.memo(
7161
7239
  className
7162
7240
  )
7163
7241
  },
7164
- title && /* @__PURE__ */ React57.createElement(Dialog3.Title, null, title),
7242
+ title && /* @__PURE__ */ React58.createElement(Dialog3.Title, null, title),
7165
7243
  children
7166
7244
  ));
7167
- return /* @__PURE__ */ React57.createElement(
7245
+ return /* @__PURE__ */ React58.createElement(
7168
7246
  Dialog3.Root,
7169
7247
  {
7170
7248
  key: "dialog",
7171
7249
  open: internalOpen,
7172
7250
  onOpenChange: setInternalOpen
7173
7251
  },
7174
- /* @__PURE__ */ React57.createElement(Dialog3.Trigger, { key: "trigger" }, trigger),
7175
- portalled ? /* @__PURE__ */ React57.createElement(Dialog3.Portal, { container: portalContainer }, inner) : inner
7252
+ /* @__PURE__ */ React58.createElement(Dialog3.Trigger, { key: "trigger" }, trigger),
7253
+ portalled ? /* @__PURE__ */ React58.createElement(Dialog3.Portal, { container: portalContainer }, inner) : inner
7176
7254
  );
7177
7255
  })
7178
7256
  );
@@ -7588,25 +7666,25 @@ var ClassValue = /* @__PURE__ */ ((ClassValue2) => {
7588
7666
  })(ClassValue || {});
7589
7667
 
7590
7668
  // src/components/FillPreviewBackground.tsx
7591
- var React61 = __toESM(require("react"));
7669
+ var React62 = __toESM(require("react"));
7592
7670
 
7593
7671
  // src/contexts/ImageDataContext.tsx
7594
- var React60 = __toESM(require("react"));
7595
- var ImageDataContext = React60.createContext(
7672
+ var React61 = __toESM(require("react"));
7673
+ var ImageDataContext = React61.createContext(
7596
7674
  void 0
7597
7675
  );
7598
- var ImageDataProvider = React60.memo(function ImageDataProvider2({
7676
+ var ImageDataProvider = React61.memo(function ImageDataProvider2({
7599
7677
  children,
7600
7678
  getImageData
7601
7679
  }) {
7602
- const contextValue = React60.useMemo(
7680
+ const contextValue = React61.useMemo(
7603
7681
  () => ({ getImageData: getImageData ?? (() => void 0) }),
7604
7682
  [getImageData]
7605
7683
  );
7606
- return /* @__PURE__ */ React60.createElement(ImageDataContext.Provider, { value: contextValue }, children);
7684
+ return /* @__PURE__ */ React61.createElement(ImageDataContext.Provider, { value: contextValue }, children);
7607
7685
  });
7608
7686
  function useImageData(ref) {
7609
- const value = React60.useContext(ImageDataContext);
7687
+ const value = React61.useContext(ImageDataContext);
7610
7688
  if (!value) {
7611
7689
  throw new Error("Missing ImageDataProvider");
7612
7690
  }
@@ -7672,10 +7750,10 @@ var dotsHorizontalSvg = (fillColor) => `
7672
7750
  <path d='M3.625 7.5C3.625 8.12132 3.12132 8.625 2.5 8.625C1.87868 8.625 1.375 8.12132 1.375 7.5C1.375 6.87868 1.87868 6.375 2.5 6.375C3.12132 6.375 3.625 6.87868 3.625 7.5ZM8.625 7.5C8.625 8.12132 8.12132 8.625 7.5 8.625C6.87868 8.625 6.375 8.12132 6.375 7.5C6.375 6.87868 6.87868 6.375 7.5 6.375C8.12132 6.375 8.625 6.87868 8.625 7.5ZM12.5 8.625C13.1213 8.625 13.625 8.12132 13.625 7.5C13.625 6.87868 13.1213 6.375 12.5 6.375C11.8787 6.375 11.375 6.87868 11.375 7.5C11.375 8.12132 11.8787 8.625 12.5 8.625Z'></path>
7673
7751
  </svg>
7674
7752
  `;
7675
- var Background = React61.memo(function Background2({
7753
+ var Background = React62.memo(function Background2({
7676
7754
  background: background2
7677
7755
  }) {
7678
- return /* @__PURE__ */ React61.createElement(
7756
+ return /* @__PURE__ */ React62.createElement(
7679
7757
  "span",
7680
7758
  {
7681
7759
  className: `${background2 ? `bg-[${background2}]` : "bg-input-background"} absolute inset-0`
@@ -7694,7 +7772,7 @@ function getPatternSizeAndPosition(fillType, tileScale) {
7694
7772
  return "center / 100% 100%";
7695
7773
  }
7696
7774
  }
7697
- var PatternPreviewBackground = React61.memo(
7775
+ var PatternPreviewBackground = React62.memo(
7698
7776
  function PatternPreviewBackground2({
7699
7777
  fillType,
7700
7778
  tileScale,
@@ -7703,7 +7781,7 @@ var PatternPreviewBackground = React61.memo(
7703
7781
  const image = useImageData(imageRef);
7704
7782
  const url = useObjectURL(image);
7705
7783
  const size2 = getPatternSizeAndPosition(fillType, tileScale);
7706
- const background2 = React61.useMemo(
7784
+ const background2 = React62.useMemo(
7707
7785
  () => [
7708
7786
  size2,
7709
7787
  `url(${url})`,
@@ -7711,44 +7789,44 @@ var PatternPreviewBackground = React61.memo(
7711
7789
  ].join(" "),
7712
7790
  [fillType, size2, url]
7713
7791
  );
7714
- return /* @__PURE__ */ React61.createElement(Background, { background: background2 });
7792
+ return /* @__PURE__ */ React62.createElement(Background, { background: background2 });
7715
7793
  }
7716
7794
  );
7717
- var ColorPreviewBackground = React61.memo(function ColorPreviewBackground2({
7795
+ var ColorPreviewBackground = React62.memo(function ColorPreviewBackground2({
7718
7796
  color
7719
7797
  }) {
7720
- const background2 = React61.useMemo(
7798
+ const background2 = React62.useMemo(
7721
7799
  () => sketchColorToRgbaString(color),
7722
7800
  [color]
7723
7801
  );
7724
- return /* @__PURE__ */ React61.createElement(Background, { background: background2 });
7802
+ return /* @__PURE__ */ React62.createElement(Background, { background: background2 });
7725
7803
  });
7726
- var GradientPreviewBackground = React61.memo(
7804
+ var GradientPreviewBackground = React62.memo(
7727
7805
  function GradientPreviewBackground2({
7728
7806
  gradient
7729
7807
  }) {
7730
- const background2 = React61.useMemo(
7808
+ const background2 = React62.useMemo(
7731
7809
  () => getGradientBackground(gradient.stops, gradient.gradientType, 180),
7732
7810
  [gradient.gradientType, gradient.stops]
7733
7811
  );
7734
- return /* @__PURE__ */ React61.createElement(Background, { background: background2 });
7812
+ return /* @__PURE__ */ React62.createElement(Background, { background: background2 });
7735
7813
  }
7736
7814
  );
7737
7815
  var background = `center url("data:image/svg+xml;utf8,${dotsHorizontalSvg(
7738
7816
  cssVars.colors.placeholderDots
7739
7817
  )}") no-repeat`;
7740
- var FillPreviewBackground = React61.memo(function FillPreviewBackground2({
7818
+ var FillPreviewBackground = React62.memo(function FillPreviewBackground2({
7741
7819
  value
7742
7820
  }) {
7743
- if (!value) return /* @__PURE__ */ React61.createElement(Background, { background });
7821
+ if (!value) return /* @__PURE__ */ React62.createElement(Background, { background });
7744
7822
  switch (value._class) {
7745
7823
  case "color":
7746
- return /* @__PURE__ */ React61.createElement(ColorPreviewBackground, { color: value });
7824
+ return /* @__PURE__ */ React62.createElement(ColorPreviewBackground, { color: value });
7747
7825
  case "gradient":
7748
- return /* @__PURE__ */ React61.createElement(GradientPreviewBackground, { gradient: value });
7826
+ return /* @__PURE__ */ React62.createElement(GradientPreviewBackground, { gradient: value });
7749
7827
  case "pattern":
7750
7828
  if (!value.image) return null;
7751
- return /* @__PURE__ */ React61.createElement(
7829
+ return /* @__PURE__ */ React62.createElement(
7752
7830
  PatternPreviewBackground,
7753
7831
  {
7754
7832
  fillType: value.patternFillType,
@@ -8048,8 +8126,8 @@ var FloatingWindow = ({
8048
8126
 
8049
8127
  // src/components/GradientPicker.tsx
8050
8128
  var import_noya_colorpicker2 = require("@noya-app/noya-colorpicker");
8051
- var React64 = __toESM(require("react"));
8052
- var GradientPicker = React64.memo(function GradientPicker2({
8129
+ var React65 = __toESM(require("react"));
8130
+ var GradientPicker = React65.memo(function GradientPicker2({
8053
8131
  value,
8054
8132
  selectedStop,
8055
8133
  onChangeColor,
@@ -8058,7 +8136,7 @@ var GradientPicker = React64.memo(function GradientPicker2({
8058
8136
  onDelete,
8059
8137
  onSelectStop
8060
8138
  }) {
8061
- const colorModel = React64.useMemo(
8139
+ const colorModel = React65.useMemo(
8062
8140
  () => ({
8063
8141
  defaultColor: { r: 0, g: 0, b: 0, a: 1 },
8064
8142
  toHsva: import_noya_colorpicker2.rgbaToHsva,
@@ -8067,30 +8145,30 @@ var GradientPicker = React64.memo(function GradientPicker2({
8067
8145
  }),
8068
8146
  []
8069
8147
  );
8070
- const rgbaColor = React64.useMemo(
8148
+ const rgbaColor = React65.useMemo(
8071
8149
  () => sketchColorToRgba(value[selectedStop].color),
8072
8150
  [value, selectedStop]
8073
8151
  );
8074
- const handleChangeColor = React64.useCallback(
8152
+ const handleChangeColor = React65.useCallback(
8075
8153
  (value2) => {
8076
8154
  onChangeColor(rgbaToSketchColor(value2));
8077
8155
  },
8078
8156
  [onChangeColor]
8079
8157
  );
8080
- const handleAddGradientStop = React64.useCallback(
8158
+ const handleAddGradientStop = React65.useCallback(
8081
8159
  (value2, position) => {
8082
8160
  onAdd(rgbaToSketchColor(value2), position);
8083
8161
  },
8084
8162
  [onAdd]
8085
8163
  );
8086
- return /* @__PURE__ */ React64.createElement(
8164
+ return /* @__PURE__ */ React65.createElement(
8087
8165
  import_noya_colorpicker2.ColorPicker,
8088
8166
  {
8089
8167
  onChange: handleChangeColor,
8090
8168
  colorModel,
8091
8169
  color: rgbaColor
8092
8170
  },
8093
- /* @__PURE__ */ React64.createElement(
8171
+ /* @__PURE__ */ React65.createElement(
8094
8172
  import_noya_colorpicker2.Gradient,
8095
8173
  {
8096
8174
  gradients: value,
@@ -8101,12 +8179,12 @@ var GradientPicker = React64.memo(function GradientPicker2({
8101
8179
  onDelete
8102
8180
  }
8103
8181
  ),
8104
- /* @__PURE__ */ React64.createElement(Spacer.Vertical, { size: 10 }),
8105
- /* @__PURE__ */ React64.createElement(import_noya_colorpicker2.Saturation, null),
8106
- /* @__PURE__ */ React64.createElement(Spacer.Vertical, { size: 12 }),
8107
- /* @__PURE__ */ React64.createElement(import_noya_colorpicker2.Hue, null),
8108
- /* @__PURE__ */ React64.createElement(Spacer.Vertical, { size: 5 }),
8109
- /* @__PURE__ */ React64.createElement(import_noya_colorpicker2.Alpha, null)
8182
+ /* @__PURE__ */ React65.createElement(Spacer.Vertical, { size: 10 }),
8183
+ /* @__PURE__ */ React65.createElement(import_noya_colorpicker2.Saturation, null),
8184
+ /* @__PURE__ */ React65.createElement(Spacer.Vertical, { size: 12 }),
8185
+ /* @__PURE__ */ React65.createElement(import_noya_colorpicker2.Hue, null),
8186
+ /* @__PURE__ */ React65.createElement(Spacer.Vertical, { size: 5 }),
8187
+ /* @__PURE__ */ React65.createElement(import_noya_colorpicker2.Alpha, null)
8110
8188
  );
8111
8189
  });
8112
8190
 
@@ -8144,25 +8222,25 @@ var InspectorContainer = (0, import_react71.memo)(
8144
8222
 
8145
8223
  // src/components/LabeledElementView.tsx
8146
8224
  var kiwi = __toESM(require("kiwi.js"));
8147
- var React66 = __toESM(require("react"));
8148
- var LabeledElementView = React66.memo(function LabeledElementView2({
8225
+ var React67 = __toESM(require("react"));
8226
+ var LabeledElementView = React67.memo(function LabeledElementView2({
8149
8227
  children,
8150
8228
  renderLabel
8151
8229
  }) {
8152
- const elementIds = React66.Children.toArray(children).flatMap(
8153
- (child) => React66.isValidElement(child) && child.type === React66.Fragment ? child.props.children : [child]
8230
+ const elementIds = React67.Children.toArray(children).flatMap(
8231
+ (child) => React67.isValidElement(child) && child.type === React67.Fragment ? child.props.children : [child]
8154
8232
  ).map(
8155
- (child) => React66.isValidElement(child) && "id" in child.props ? child.props.id : null
8233
+ (child) => React67.isValidElement(child) && "id" in child.props ? child.props.id : null
8156
8234
  ).filter((id) => !!id);
8157
8235
  const serializedIds = elementIds.join(",");
8158
- const containerRef = React66.useRef(null);
8159
- const refs = React66.useMemo(() => {
8236
+ const containerRef = React67.useRef(null);
8237
+ const refs = React67.useMemo(() => {
8160
8238
  return Object.fromEntries(
8161
- serializedIds.split(",").map((id) => [id, React66.createRef()])
8239
+ serializedIds.split(",").map((id) => [id, React67.createRef()])
8162
8240
  );
8163
8241
  }, [serializedIds]);
8164
- const labelElements = React66.useMemo(() => {
8165
- return serializedIds.split(",").map((id, index) => /* @__PURE__ */ React66.createElement(
8242
+ const labelElements = React67.useMemo(() => {
8243
+ return serializedIds.split(",").map((id, index) => /* @__PURE__ */ React67.createElement(
8166
8244
  "span",
8167
8245
  {
8168
8246
  key: id,
@@ -8175,7 +8253,7 @@ var LabeledElementView = React66.memo(function LabeledElementView2({
8175
8253
  })
8176
8254
  ));
8177
8255
  }, [refs, serializedIds, renderLabel]);
8178
- React66.useLayoutEffect(() => {
8256
+ React67.useLayoutEffect(() => {
8179
8257
  if (!containerRef.current) return;
8180
8258
  const containerRect = containerRef.current.getBoundingClientRect();
8181
8259
  const solver = new kiwi.Solver();
@@ -8237,7 +8315,7 @@ var LabeledElementView = React66.memo(function LabeledElementView2({
8237
8315
  `${Math.max(...heights)}px`
8238
8316
  );
8239
8317
  }, [refs, labelElements]);
8240
- return /* @__PURE__ */ React66.createElement("div", { className: "flex flex-1 flex-col relative", ref: containerRef }, /* @__PURE__ */ React66.createElement("div", { className: "flex flex-1 items-center" }, children), /* @__PURE__ */ React66.createElement("div", { className: "relative overflow-hidden select-none" }, labelElements));
8318
+ return /* @__PURE__ */ React67.createElement("div", { className: "flex flex-1 flex-col relative", ref: containerRef }, /* @__PURE__ */ React67.createElement("div", { className: "flex flex-1 items-center" }, children), /* @__PURE__ */ React67.createElement("div", { className: "relative overflow-hidden select-none" }, labelElements));
8241
8319
  });
8242
8320
 
8243
8321
  // src/components/LabeledField.tsx
@@ -8321,7 +8399,7 @@ var LabeledField = (0, import_react73.memo)(function LabeledField2({
8321
8399
  });
8322
8400
 
8323
8401
  // src/components/MediaThumbnail.tsx
8324
- var import_noya_icons8 = require("@noya-app/noya-icons");
8402
+ var import_noya_icons7 = require("@noya-app/noya-icons");
8325
8403
  var import_react74 = __toESM(require("react"));
8326
8404
 
8327
8405
  // src/components/catppuccin/fileIcons.ts
@@ -10787,7 +10865,7 @@ var MediaThumbnail = (0, import_react74.memo)(function MediaThumbnail2({
10787
10865
  const content = (0, import_react74.useMemo)(() => {
10788
10866
  switch (contentType) {
10789
10867
  case "image":
10790
- if (!url) return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons8.ImageIcon, { color: iconColor, style: iconStyles });
10868
+ if (!url) return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons7.ImageIcon, { color: iconColor, style: iconStyles });
10791
10869
  return /* @__PURE__ */ import_react74.default.createElement(
10792
10870
  "img",
10793
10871
  {
@@ -10798,9 +10876,9 @@ var MediaThumbnail = (0, import_react74.memo)(function MediaThumbnail2({
10798
10876
  }
10799
10877
  );
10800
10878
  case "video":
10801
- return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons8.VideoIcon, { color: iconColor, style: iconStyles });
10879
+ return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons7.VideoIcon, { color: iconColor, style: iconStyles });
10802
10880
  case "audio":
10803
- return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons8.SpeakerLoudIcon, { color: iconColor, style: iconStyles });
10881
+ return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons7.SpeakerLoudIcon, { color: iconColor, style: iconStyles });
10804
10882
  default:
10805
10883
  if (iconName) {
10806
10884
  const Icon = Icons[iconName];
@@ -10819,7 +10897,7 @@ var MediaThumbnail = (0, import_react74.memo)(function MediaThumbnail2({
10819
10897
  );
10820
10898
  }
10821
10899
  }
10822
- return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons8.FileIcon, { color: iconColor, style: iconStyles });
10900
+ return /* @__PURE__ */ import_react74.default.createElement(import_noya_icons7.FileIcon, { color: iconColor, style: iconStyles });
10823
10901
  }
10824
10902
  }, [contentType, url, iconColor, iconStyles, iconName, fileName]);
10825
10903
  return /* @__PURE__ */ import_react74.default.createElement(
@@ -10913,7 +10991,7 @@ var Message = (0, import_react75.memo)(
10913
10991
  );
10914
10992
 
10915
10993
  // src/components/pipeline/PipelineResultLayout.tsx
10916
- var import_noya_icons9 = require("@noya-app/noya-icons");
10994
+ var import_noya_icons8 = require("@noya-app/noya-icons");
10917
10995
  var import_react76 = __toESM(require("react"));
10918
10996
  var PipelineResultLink = ({ url }) => {
10919
10997
  return /* @__PURE__ */ import_react76.default.createElement("div", { className: "flex flex-col gap-0.5" }, /* @__PURE__ */ import_react76.default.createElement(
@@ -10924,7 +11002,7 @@ var PipelineResultLink = ({ url }) => {
10924
11002
  rel: "noopener noreferrer",
10925
11003
  className: "flex text-primary hover:opacity-80 border border-divider rounded-md"
10926
11004
  },
10927
- /* @__PURE__ */ import_react76.default.createElement("div", { className: "flex gap-1 items-center p-2" }, /* @__PURE__ */ import_react76.default.createElement(import_noya_icons9.Link1Icon, { className: "w-[15px] h-[15px] flex-shrink-0" })),
11005
+ /* @__PURE__ */ import_react76.default.createElement("div", { className: "flex gap-1 items-center p-2" }, /* @__PURE__ */ import_react76.default.createElement(import_noya_icons8.Link1Icon, { className: "w-[15px] h-[15px] flex-shrink-0" })),
10928
11006
  /* @__PURE__ */ import_react76.default.createElement(DividerVertical, null),
10929
11007
  /* @__PURE__ */ import_react76.default.createElement(Small, { className: "truncate p-2 flex-1" }, url)
10930
11008
  ));
@@ -10948,27 +11026,27 @@ function getPipelineResultLink(value) {
10948
11026
  // src/components/Progress.tsx
10949
11027
  var import_noya_utils10 = require("@noya-app/noya-utils");
10950
11028
  var ProgressPrimitive = __toESM(require("@radix-ui/react-progress"));
10951
- var React72 = __toESM(require("react"));
11029
+ var React73 = __toESM(require("react"));
10952
11030
  function Progress({
10953
11031
  value,
10954
11032
  variant = "normal",
10955
11033
  className
10956
11034
  }) {
10957
11035
  const clampedValue = (0, import_noya_utils10.clamp)(value, 0, 100);
10958
- const transformStyles = React72.useMemo(
11036
+ const transformStyles = React73.useMemo(
10959
11037
  () => ({
10960
11038
  transform: `translateX(-${100 - clampedValue}%)`
10961
11039
  }),
10962
11040
  [clampedValue]
10963
11041
  );
10964
- return /* @__PURE__ */ React72.createElement(
11042
+ return /* @__PURE__ */ React73.createElement(
10965
11043
  ProgressPrimitive.Root,
10966
11044
  {
10967
11045
  className: cx(`relative hidden bg-input-background h-[5px] `, className),
10968
11046
  style: { transform: "translateZ(0)" },
10969
11047
  value: clampedValue
10970
11048
  },
10971
- /* @__PURE__ */ React72.createElement(
11049
+ /* @__PURE__ */ React73.createElement(
10972
11050
  ProgressPrimitive.Indicator,
10973
11051
  {
10974
11052
  className: `${variant === "primary" ? "bg-primary" : variant === "secondary" ? "bg-secondary" : variant === "warning" ? "bg-warning" : "bg-text"} transition-[transform_660ms_cubic-bezier(0.65,0,0.35,1) w-full h-full`,
@@ -11071,6 +11149,7 @@ var SegmentedControlItem = (0, import_react78.forwardRef)(function SegmentedCont
11071
11149
  disabled = false,
11072
11150
  icon,
11073
11151
  className,
11152
+ variant = "default",
11074
11153
  ...props
11075
11154
  }, forwardedRef) {
11076
11155
  const { colorScheme } = (0, import_react78.useContext)(SegmentedControlContext);
@@ -11081,21 +11160,30 @@ var SegmentedControlItem = (0, import_react78.forwardRef)(function SegmentedCont
11081
11160
  value: (value ?? "").toString(),
11082
11161
  disabled,
11083
11162
  className: cx(
11084
- "font-sans text-button font-normal relative flex-1 appearance-none text-segmented-control-item rounded inline-flex gap-1.5 items-center justify-center align-middle text-center focus:outline-none transition-colors",
11085
- colorScheme === "secondary" ? "focus:ring-2 focus:ring-secondary focus:ring-offset-1" : "focus:ring-2 focus:ring-primary focus:ring-offset-1",
11086
- colorScheme === "secondary" ? "aria-checked:bg-secondary aria-checked:text-white" : colorScheme === "primary" ? "aria-checked:bg-primary aria-checked:text-white" : "aria-checked:bg-background aria-checked:text-text",
11163
+ "group",
11164
+ "flex items-center justify-center",
11165
+ "font-sans text-button relative flex-1 appearance-none text-segmented-control-item focus:outline-none transition-colors",
11166
+ variant === "tabs" ? "font-semibold" : "font-normal",
11167
+ variant === "tabs" ? "" : colorScheme === "secondary" ? "focus:ring-2 focus:ring-secondary focus:ring-offset-1" : "focus:ring-2 focus:ring-primary focus:ring-offset-1",
11168
+ variant === "tabs" ? "aria-checked:text-primary" : colorScheme === "secondary" ? "aria-checked:bg-secondary aria-checked:text-white" : colorScheme === "primary" ? "aria-checked:bg-primary aria-checked:text-white" : "aria-checked:bg-background aria-checked:text-text",
11087
11169
  "focus:z-interactable",
11088
- "aria-checked:shadow-segment",
11089
- "whitespace-pre px-1",
11090
- "border-r border-divider last:border-r-0",
11091
- "aria-checked:border-r-transparent",
11092
- "[&:has(+[aria-checked=true])]:border-r-transparent",
11170
+ variant === "default" ? "px-1 rounded aria-checked:shadow-segment" : "px-1.5 border-y-2 border-y-transparent aria-checked:border-b-primary",
11171
+ variant === "default" && "border-r border-divider last:border-r-0 aria-checked:border-r-transparent [&:has(+[aria-checked=true])]:border-r-transparent",
11093
11172
  className
11094
11173
  ),
11095
11174
  ...props
11096
11175
  },
11097
- icon && renderIcon(icon),
11098
- title
11176
+ /* @__PURE__ */ import_react78.default.createElement(
11177
+ "span",
11178
+ {
11179
+ className: cx(
11180
+ "inline-flex whitespace-pre flex-nowrap gap-1.5 items-center justify-center align-middle text-center",
11181
+ variant === "tabs" && "group-focus:ring-2 group-focus:ring-primary-pastel group-focus:ring-offset-2"
11182
+ )
11183
+ },
11184
+ icon && renderIcon(icon),
11185
+ title
11186
+ )
11099
11187
  );
11100
11188
  return tooltip ? /* @__PURE__ */ import_react78.default.createElement(Tooltip, { content: tooltip }, itemElement) : itemElement;
11101
11189
  });
@@ -11106,6 +11194,7 @@ var SegmentedControl = memoGeneric(function SegmentedControl2({
11106
11194
  colorScheme,
11107
11195
  allowEmpty,
11108
11196
  items,
11197
+ variant = "default",
11109
11198
  className,
11110
11199
  style: style2
11111
11200
  }) {
@@ -11126,7 +11215,9 @@ var SegmentedControl = memoGeneric(function SegmentedControl2({
11126
11215
  value,
11127
11216
  onValueChange: handleValueChange,
11128
11217
  className: cx(
11129
- `grid appearance-none relative outline-none min-h-input-height rounded bg-input-background py-0.5 px-0.5`,
11218
+ `appearance-none relative outline-none`,
11219
+ variant === "default" && "grid min-h-input-height bg-input-background rounded py-0.5 px-0.5",
11220
+ variant === "tabs" && "flex gap-1.5 min-h-[33px]",
11130
11221
  className
11131
11222
  ),
11132
11223
  style: {
@@ -11134,13 +11225,14 @@ var SegmentedControl = memoGeneric(function SegmentedControl2({
11134
11225
  gridTemplateColumns: `repeat(${items.length}, 1fr)`
11135
11226
  }
11136
11227
  },
11137
- items.map((item, index) => /* @__PURE__ */ import_react78.default.createElement(SegmentedControlItem, { key: index, ...item }))
11228
+ items.map((item, index) => /* @__PURE__ */ import_react78.default.createElement(SegmentedControlItem, { key: index, ...item, variant }))
11138
11229
  ));
11139
11230
  });
11140
11231
 
11141
11232
  // src/components/SelectionToolbar.tsx
11142
11233
  var PopperPrimitive = __toESM(require("@radix-ui/react-popper"));
11143
11234
  var import_react79 = __toESM(require("react"));
11235
+ var import_react_dom3 = require("react-dom");
11144
11236
  var createVirtualElement = (rect) => ({
11145
11237
  getBoundingClientRect: () => ({
11146
11238
  width: rect.width,
@@ -11157,7 +11249,8 @@ var createVirtualElement = (rect) => ({
11157
11249
  var SelectionToolbarContainer = (0, import_react79.memo)(
11158
11250
  function SelectionToolbarContainer2({
11159
11251
  rect,
11160
- children
11252
+ children,
11253
+ portalContainer
11161
11254
  }) {
11162
11255
  const portalScopeId = usePortalScopeId();
11163
11256
  const containerRef = import_react79.default.useRef(null);
@@ -11168,7 +11261,7 @@ var SelectionToolbarContainer = (0, import_react79.memo)(
11168
11261
  }),
11169
11262
  [rect]
11170
11263
  );
11171
- return /* @__PURE__ */ import_react79.default.createElement(PopperPrimitive.Root, null, /* @__PURE__ */ import_react79.default.createElement(PopperPrimitive.Anchor, { virtualRef }), /* @__PURE__ */ import_react79.default.createElement(
11264
+ const popperContent = /* @__PURE__ */ import_react79.default.createElement(
11172
11265
  PopperPrimitive.Content,
11173
11266
  {
11174
11267
  ...portalScopeProps(portalScopeId),
@@ -11189,16 +11282,21 @@ var SelectionToolbarContainer = (0, import_react79.memo)(
11189
11282
  "div",
11190
11283
  {
11191
11284
  ref: containerRef,
11192
- className: "flex gap-1 bg-popover-background rounded shadow-popover p-1"
11285
+ className: "flex gap-1 bg-popover-background rounded shadow-popover p-1",
11286
+ onClick: (e) => e.stopPropagation(),
11287
+ onMouseDown: (e) => e.stopPropagation(),
11288
+ onPointerDown: (e) => e.stopPropagation(),
11289
+ onWheel: (e) => e.stopPropagation()
11193
11290
  },
11194
11291
  children
11195
11292
  )
11196
- ));
11293
+ );
11294
+ return /* @__PURE__ */ import_react79.default.createElement(PopperPrimitive.Root, null, /* @__PURE__ */ import_react79.default.createElement(PopperPrimitive.Anchor, { virtualRef }), portalContainer ? (0, import_react_dom3.createPortal)(popperContent, portalContainer) : popperContent);
11197
11295
  }
11198
11296
  );
11199
11297
 
11200
11298
  // src/components/SelectMenu.tsx
11201
- var import_noya_icons10 = require("@noya-app/noya-icons");
11299
+ var import_noya_icons9 = require("@noya-app/noya-icons");
11202
11300
  var Select = __toESM(require("@radix-ui/react-select"));
11203
11301
  var import_react80 = __toESM(require("react"));
11204
11302
  var readOnlyStyle = {
@@ -11247,7 +11345,7 @@ var SelectMenuTrigger = memoGeneric(function SelectMenuTrigger2({
11247
11345
  label && labelPosition === "inset" && /* @__PURE__ */ import_react80.default.createElement("div", { className: insetEndStyles }, /* @__PURE__ */ import_react80.default.createElement(Label, { className: "pr-4 text-text-disabled", htmlFor: id }, label)),
11248
11346
  /* @__PURE__ */ import_react80.default.createElement("span", { className: "flex-1 flex" }, /* @__PURE__ */ import_react80.default.createElement(Select.Value, { placeholder })),
11249
11347
  /* @__PURE__ */ import_react80.default.createElement(
11250
- import_noya_icons10.DropdownChevronIcon,
11348
+ import_noya_icons9.DropdownChevronIcon,
11251
11349
  {
11252
11350
  className: cx(
11253
11351
  "transition-transform duration-100 ml-1.5",
@@ -11352,13 +11450,13 @@ var SelectMenu = memoGeneric(function SelectMenu2({
11352
11450
  style: contentStyle
11353
11451
  },
11354
11452
  /* @__PURE__ */ import_react80.default.createElement(Select.ScrollUpButton, { className: scrollButtonStyles }, /* @__PURE__ */ import_react80.default.createElement(
11355
- import_noya_icons10.ChevronUpIcon,
11453
+ import_noya_icons9.ChevronUpIcon,
11356
11454
  {
11357
11455
  className: cx("transition-transform duration-100")
11358
11456
  }
11359
11457
  )),
11360
11458
  /* @__PURE__ */ import_react80.default.createElement(Select.Viewport, null, /* @__PURE__ */ import_react80.default.createElement(MenuViewport, { items, Components: Components3 })),
11361
- /* @__PURE__ */ import_react80.default.createElement(Select.ScrollDownButton, { className: scrollButtonStyles }, /* @__PURE__ */ import_react80.default.createElement(import_noya_icons10.ChevronDownIcon, null))
11459
+ /* @__PURE__ */ import_react80.default.createElement(Select.ScrollDownButton, { className: scrollButtonStyles }, /* @__PURE__ */ import_react80.default.createElement(import_noya_icons9.ChevronDownIcon, null))
11362
11460
  ))
11363
11461
  );
11364
11462
  return readOnly ? readOnlyButton : content;
@@ -11468,7 +11566,7 @@ var Slider = (0, import_react81.memo)(function Slider2({
11468
11566
 
11469
11567
  // src/components/Switch.tsx
11470
11568
  var SwitchPrimitive = __toESM(require("@radix-ui/react-switch"));
11471
- var React78 = __toESM(require("react"));
11569
+ var React79 = __toESM(require("react"));
11472
11570
  var Switch = function Switch2({
11473
11571
  id,
11474
11572
  value,
@@ -11480,7 +11578,7 @@ var Switch = function Switch2({
11480
11578
  style: style2,
11481
11579
  className
11482
11580
  }) {
11483
- return /* @__PURE__ */ React78.createElement(
11581
+ return /* @__PURE__ */ React79.createElement(
11484
11582
  SwitchPrimitive.Root,
11485
11583
  {
11486
11584
  id,
@@ -11499,7 +11597,7 @@ var Switch = function Switch2({
11499
11597
  onFocus,
11500
11598
  onBlur
11501
11599
  },
11502
- /* @__PURE__ */ React78.createElement(SwitchPrimitive.Thumb, { className: "block w-[15px] h-[15px] bg-background rounded-full transition-transform translate-x-[2px] data-[state=checked]:translate-x-[15px]" })
11600
+ /* @__PURE__ */ React79.createElement(SwitchPrimitive.Thumb, { className: "block w-[15px] h-[15px] bg-background rounded-full transition-transform translate-x-[2px] data-[state=checked]:translate-x-[15px]" })
11503
11601
  );
11504
11602
  };
11505
11603
 
@@ -12289,11 +12387,11 @@ var SUPPORTED_CANVAS_UPLOAD_TYPES = [
12289
12387
 
12290
12388
  // src/components/DimensionInput.tsx
12291
12389
  var import_noya_utils12 = require("@noya-app/noya-utils");
12292
- var React84 = __toESM(require("react"));
12390
+ var React85 = __toESM(require("react"));
12293
12391
  function getNewValue(value, mode, delta) {
12294
12392
  return delta === void 0 ? value : mode === "replace" ? delta : value + delta;
12295
12393
  }
12296
- var DimensionInput = React84.memo(function DimensionInput2({
12394
+ var DimensionInput = React85.memo(function DimensionInput2({
12297
12395
  id,
12298
12396
  value,
12299
12397
  onSetValue,
@@ -12303,15 +12401,15 @@ var DimensionInput = React84.memo(function DimensionInput2({
12303
12401
  disabled,
12304
12402
  trigger = "submit"
12305
12403
  }) {
12306
- const handleNudgeValue = React84.useCallback(
12404
+ const handleNudgeValue = React85.useCallback(
12307
12405
  (value2) => onSetValue(value2, "adjust"),
12308
12406
  [onSetValue]
12309
12407
  );
12310
- const handleSetValue = React84.useCallback(
12408
+ const handleSetValue = React85.useCallback(
12311
12409
  (value2) => onSetValue(value2, "replace"),
12312
12410
  [onSetValue]
12313
12411
  );
12314
- return /* @__PURE__ */ React84.createElement(LabeledField, { label, labelPosition: "inset" }, /* @__PURE__ */ React84.createElement(InputField2.Root, { id, width: size2 }, /* @__PURE__ */ React84.createElement(
12412
+ return /* @__PURE__ */ React85.createElement(LabeledField, { label, labelPosition: "inset" }, /* @__PURE__ */ React85.createElement(InputField2.Root, { id, width: size2 }, /* @__PURE__ */ React85.createElement(
12315
12413
  InputField2.NumberInput,
12316
12414
  {
12317
12415
  value: value === void 0 ? value : (0, import_noya_utils12.round)(value, 2),
@@ -12464,7 +12562,6 @@ function BaseToolbar({
12464
12562
  }
12465
12563
 
12466
12564
  // src/components/Toolbar.tsx
12467
- var import_noya_icons11 = require("@noya-app/noya-icons");
12468
12565
  var import_noya_keymap7 = require("@noya-app/noya-keymap");
12469
12566
  var import_react91 = __toESM(require("react"));
12470
12567
  var iconButtonStyle = {
@@ -12489,7 +12586,16 @@ var ToolbarMenuDropdown = memoGeneric(function ToolbarMenuDropdown2({
12489
12586
  }
12490
12587
  }
12491
12588
  },
12492
- /* @__PURE__ */ import_react91.default.createElement(Button, { disabled: item.disabled, active: item.checked || open }, item.icon && renderIcon(item.icon), item.title && item.icon && /* @__PURE__ */ import_react91.default.createElement(Spacer.Horizontal, { inline: true, size: 6 }), item.title, /* @__PURE__ */ import_react91.default.createElement(Spacer.Horizontal, { inline: true, size: 6 }), /* @__PURE__ */ import_react91.default.createElement(import_noya_icons11.DropdownChevronIcon, null))
12589
+ /* @__PURE__ */ import_react91.default.createElement(
12590
+ Button,
12591
+ {
12592
+ disabled: item.disabled,
12593
+ active: item.checked || open,
12594
+ icon: item.icon,
12595
+ iconRight: "DropdownChevronIcon"
12596
+ },
12597
+ item.title
12598
+ )
12493
12599
  );
12494
12600
  });
12495
12601
  var ToolbarMenuButton = memoGeneric(function ToolbarMenuButton2({
@@ -12501,6 +12607,7 @@ var ToolbarMenuButton = memoGeneric(function ToolbarMenuButton2({
12501
12607
  {
12502
12608
  disabled: item.disabled,
12503
12609
  active: item.checked,
12610
+ icon: item.icon,
12504
12611
  style: item.icon && !item.title ? iconButtonStyle : void 0,
12505
12612
  onClick: () => {
12506
12613
  if (onSelectMenuItem && item.value) {
@@ -12508,8 +12615,6 @@ var ToolbarMenuButton = memoGeneric(function ToolbarMenuButton2({
12508
12615
  }
12509
12616
  }
12510
12617
  },
12511
- item.icon && renderIcon(item.icon),
12512
- item.title && item.icon && /* @__PURE__ */ import_react91.default.createElement(Spacer.Horizontal, { inline: true, size: 6 }),
12513
12618
  item.title
12514
12619
  );
12515
12620
  return item.tooltip ? /* @__PURE__ */ import_react91.default.createElement(Tooltip, { sideOffset: 10, content: item.tooltip }, content) : content;
@@ -12667,6 +12772,7 @@ function Toolbar({
12667
12772
  MediaThumbnail,
12668
12773
  MenuViewport,
12669
12774
  Message,
12775
+ OpenPortalsProvider,
12670
12776
  PatternPreviewBackground,
12671
12777
  PipelineResultLayout,
12672
12778
  PipelineResultLink,
@@ -12759,6 +12865,7 @@ function Toolbar({
12759
12865
  useGlobalInputBlur,
12760
12866
  useGlobalInputBlurListener,
12761
12867
  useGlobalInputBlurTrigger,
12868
+ useHasOpenPortals,
12762
12869
  useHover,
12763
12870
  useImageData,
12764
12871
  useIndent,
@@ -12769,6 +12876,7 @@ function Toolbar({
12769
12876
  useOpenConfirmationDialog,
12770
12877
  useOpenDialog,
12771
12878
  useOpenInputDialog,
12879
+ useOpenPortalsControls,
12772
12880
  usePlatform,
12773
12881
  usePlatformModKey,
12774
12882
  usePortalScopeId,