@noya-app/noya-designsystem 0.1.69 → 0.1.71

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
@@ -3257,6 +3257,7 @@ __export(src_exports, {
3257
3257
  Tooltip: () => Tooltip,
3258
3258
  TreeView: () => TreeView,
3259
3259
  UserAvatar: () => UserAvatar,
3260
+ UserPicker: () => UserPicker,
3260
3261
  UserPointer: () => UserPointer,
3261
3262
  WorkspaceLayout: () => WorkspaceLayout,
3262
3263
  WorkspaceSideProvider: () => WorkspaceSideProvider,
@@ -3290,6 +3291,7 @@ __export(src_exports, {
3290
3291
  getNextIndex: () => getNextIndex,
3291
3292
  getPipelineResultLink: () => getPipelineResultLink,
3292
3293
  getThumbnailColors: () => getThumbnailColors,
3294
+ getUserDisplayName: () => getUserDisplayName,
3293
3295
  isMenuItemSectionHeader: () => isMenuItemSectionHeader,
3294
3296
  isNonSelectableMenuItem: () => isNonSelectableMenuItem,
3295
3297
  isPopoverMenuItem: () => isPopoverMenuItem,
@@ -4193,7 +4195,8 @@ var variantStyles = {
4193
4195
  floating: "n-bg-floating-button n-text-text n-shadow-[0_1px_2px_rgba(0,0,0,0.1)] hover:n-opacity-80 active:n-opacity-90",
4194
4196
  thin: "n-bg-transparent n-text-text hover:n-bg-input-background-light",
4195
4197
  none: "n-bg-transparent n-text-text hover:n-bg-input-background-light",
4196
- ghost: "n-bg-transparent n-text-text hover:n-bg-input-background-light"
4198
+ ghost: "n-bg-transparent n-text-text hover:n-bg-input-background-light",
4199
+ link: "n-bg-transparent n-text-text hover:n-bg-input-background-light"
4197
4200
  };
4198
4201
  var sizeStyles = {
4199
4202
  small: "n-px-[2px] n-font-sans n-text-[10px] n-font-medium",
@@ -5138,7 +5141,15 @@ function parseNumber(value) {
5138
5141
  return value ? Number(value) : NaN;
5139
5142
  }
5140
5143
  function InputFieldNumberInput(props) {
5141
- const { value, placeholder, onNudge, onBlur, readOnly, ...rest } = props;
5144
+ const {
5145
+ value,
5146
+ placeholder,
5147
+ onNudge,
5148
+ onBlur,
5149
+ readOnly,
5150
+ triggersOnEmpty,
5151
+ ...rest
5152
+ } = props;
5142
5153
  const onSubmit = "onSubmit" in props ? props.onSubmit : void 0;
5143
5154
  const onChange = "onChange" in props ? props.onChange : void 0;
5144
5155
  const [internalValue, setInternalValue] = (0, import_react29.useState)();
@@ -5166,6 +5177,9 @@ function InputFieldNumberInput(props) {
5166
5177
  (value2) => {
5167
5178
  if (value2 === "" || value2 === "-" || value2 === ".") {
5168
5179
  setInternalValue(value2);
5180
+ if (triggersOnEmpty) {
5181
+ onChange?.(0, { isEmpty: true });
5182
+ }
5169
5183
  return;
5170
5184
  }
5171
5185
  if (value2.endsWith(".")) {
@@ -5175,10 +5189,10 @@ function InputFieldNumberInput(props) {
5175
5189
  setInternalValue(void 0);
5176
5190
  const newValue = parseNumber(value2);
5177
5191
  if (!isNaN(newValue)) {
5178
- onChange?.(newValue);
5192
+ onChange?.(newValue, { isEmpty: false });
5179
5193
  }
5180
5194
  },
5181
- [onChange]
5195
+ [onChange, triggersOnEmpty]
5182
5196
  );
5183
5197
  const handleBlur = (0, import_react29.useCallback)(
5184
5198
  (event) => {
@@ -9899,7 +9913,7 @@ var TreeRow = forwardRefGeneric(function TreeRow2({
9899
9913
  onClick: handleClickChevron,
9900
9914
  selected: rest.selected
9901
9915
  }
9902
- ), /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 6 })), icon && /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, renderIcon(icon), /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 10 })), children, expandable && chevronPosition === "end" && /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 6 }), expanded === void 0 ? /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 19 }), /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 8 })) : /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement(
9916
+ ), /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 6 })), icon && /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, renderIcon(icon), /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 10 })), children, expandable && chevronPosition === "end" && /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement(Spacer.Horizontal, { size: 6 }), expanded === void 0 ? /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null) : /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement(
9903
9917
  IconButton,
9904
9918
  {
9905
9919
  as: chevronAs,
@@ -11026,6 +11040,7 @@ var Combobox = memoGeneric(
11026
11040
  openMenuBehavior = "showFilteredItems",
11027
11041
  onFocus,
11028
11042
  onDeleteWhenEmpty,
11043
+ iconPosition = "right",
11029
11044
  ...rest
11030
11045
  }, forwardedRef) {
11031
11046
  const props = (0, import_react72.useMemo)(() => {
@@ -11366,6 +11381,7 @@ var Combobox = memoGeneric(
11366
11381
  onSelectItem: handleUpdateSelection,
11367
11382
  onHoverIndex: handleIndexChange,
11368
11383
  listSize: adjustedListSize,
11384
+ iconPosition,
11369
11385
  style: {
11370
11386
  flex: `0 0 ${computedHeight}px`
11371
11387
  },
@@ -11679,6 +11695,9 @@ var DraggableMenuButton = memoGeneric(function DraggableMenuButton2({
11679
11695
  (event) => {
11680
11696
  if (open || !downPosition) {
11681
11697
  setDownPosition(null);
11698
+ if (open && event.target === event.currentTarget) {
11699
+ setOpen(false);
11700
+ }
11682
11701
  return;
11683
11702
  }
11684
11703
  const dx = event.clientX - downPosition.x;
@@ -15106,7 +15125,7 @@ function ListMenu({
15106
15125
  }) {
15107
15126
  const selectedIds = items.flatMap(
15108
15127
  (item) => isSelectableMenuItem(item) && item.checked ? [item.value] : []
15109
- ).concat(selectedIdsProp);
15128
+ ).concat(selectedIdsProp ?? []);
15110
15129
  let chunks = (0, import_noya_utils15.chunkBy)(
15111
15130
  items,
15112
15131
  (a, b) => a.type !== "separator" && b.type !== "separator"
@@ -16885,16 +16904,105 @@ function Tabs({
16885
16904
  )), /* @__PURE__ */ React101.createElement(Divider, null), renderContent({ value: activeTab }));
16886
16905
  }
16887
16906
 
16888
- // src/components/UserPointer.tsx
16907
+ // src/components/UserPicker.tsx
16889
16908
  var import_react101 = __toESM(require("react"));
16890
- var UserPointerContainer = (0, import_react101.memo)(function UserPointerContainer2({
16909
+ function UserPicker({
16910
+ users,
16911
+ value,
16912
+ defaultValue: defaultValue2,
16913
+ onChangeUserId,
16914
+ onSelectUser,
16915
+ placeholder = "Search users...",
16916
+ ...rest
16917
+ }) {
16918
+ const sortedUsers = (0, import_react101.useMemo)(() => {
16919
+ return [...users].sort(
16920
+ (a, b) => getUserDisplayName(a).localeCompare(getUserDisplayName(b), void 0, {
16921
+ sensitivity: "base"
16922
+ })
16923
+ );
16924
+ }, [users]);
16925
+ const usersById = (0, import_react101.useMemo)(() => {
16926
+ return new Map(sortedUsers.map((user) => [user.id, user]));
16927
+ }, [sortedUsers]);
16928
+ const items = (0, import_react101.useMemo)(() => {
16929
+ return sortedUsers.map(createUserMenuItem);
16930
+ }, [sortedUsers]);
16931
+ const isControlled = value !== void 0;
16932
+ const [uncontrolledValue, setUncontrolledValue] = (0, import_react101.useState)(defaultValue2);
16933
+ const selectedUserId = isControlled ? value : uncontrolledValue;
16934
+ const selectedItem = (0, import_react101.useMemo)(() => {
16935
+ if (!selectedUserId) return void 0;
16936
+ return items.find((item) => item.value === selectedUserId);
16937
+ }, [items, selectedUserId]);
16938
+ const updateSelectedUserId = (0, import_react101.useCallback)(
16939
+ (userId) => {
16940
+ if (!isControlled) {
16941
+ setUncontrolledValue(userId);
16942
+ }
16943
+ onChangeUserId?.(userId);
16944
+ },
16945
+ [isControlled, onChangeUserId]
16946
+ );
16947
+ const handleSelectItem = (0, import_react101.useCallback)(
16948
+ (item) => {
16949
+ updateSelectedUserId(item.value);
16950
+ onSelectUser?.(usersById.get(item.value));
16951
+ },
16952
+ [updateSelectedUserId, onSelectUser, usersById]
16953
+ );
16954
+ return /* @__PURE__ */ import_react101.default.createElement(
16955
+ Combobox,
16956
+ {
16957
+ ...rest,
16958
+ placeholder,
16959
+ mode: "option",
16960
+ items,
16961
+ value: selectedItem,
16962
+ onSelectItem: handleSelectItem,
16963
+ iconPosition: "left"
16964
+ }
16965
+ );
16966
+ }
16967
+ function getUserDisplayName(user) {
16968
+ const name = user.name?.trim();
16969
+ const email = user.email?.trim();
16970
+ return name || email || "Anonymous user";
16971
+ }
16972
+ function createUserMenuItem(user) {
16973
+ const title = getUserDisplayName(user);
16974
+ const overflow = 3;
16975
+ return {
16976
+ value: user.id,
16977
+ title,
16978
+ icon: /* @__PURE__ */ import_react101.default.createElement("div", { className: "n-relative n-w-[15px] n-h-[15px]" }, /* @__PURE__ */ import_react101.default.createElement(
16979
+ Avatar,
16980
+ {
16981
+ size: 15 + overflow * 2,
16982
+ name: title,
16983
+ userId: user.id,
16984
+ image: user.image ?? void 0,
16985
+ className: "n-pointer-events-none",
16986
+ variant: "bare",
16987
+ style: {
16988
+ position: "absolute",
16989
+ inset: -overflow
16990
+ }
16991
+ }
16992
+ ))
16993
+ };
16994
+ }
16995
+
16996
+ // src/components/UserPointer.tsx
16997
+ var import_react102 = __toESM(require("react"));
16998
+ var UserPointerContainer = (0, import_react102.memo)(function UserPointerContainer2({
16891
16999
  point,
16892
17000
  visible,
16893
17001
  children,
16894
17002
  className,
16895
17003
  style: style2
16896
17004
  }) {
16897
- return /* @__PURE__ */ import_react101.default.createElement(
17005
+ return /* @__PURE__ */ import_react102.default.createElement(
16898
17006
  "div",
16899
17007
  {
16900
17008
  style: {
@@ -16911,7 +17019,7 @@ var UserPointerContainer = (0, import_react101.memo)(function UserPointerContain
16911
17019
  children
16912
17020
  );
16913
17021
  });
16914
- var UserNameTag = (0, import_react101.memo)(function UserNameTag2({
17022
+ var UserNameTag = (0, import_react102.memo)(function UserNameTag2({
16915
17023
  backgroundColor,
16916
17024
  className,
16917
17025
  style: style2,
@@ -16920,7 +17028,7 @@ var UserNameTag = (0, import_react101.memo)(function UserNameTag2({
16920
17028
  size = "medium",
16921
17029
  bordered = true
16922
17030
  }) {
16923
- return /* @__PURE__ */ import_react101.default.createElement(
17031
+ return /* @__PURE__ */ import_react102.default.createElement(
16924
17032
  "span",
16925
17033
  {
16926
17034
  className: cx(
@@ -16939,14 +17047,14 @@ var UserNameTag = (0, import_react101.memo)(function UserNameTag2({
16939
17047
  children
16940
17048
  );
16941
17049
  });
16942
- var UserPointerIcon = (0, import_react101.memo)(function PointerIcon({
17050
+ var UserPointerIcon = (0, import_react102.memo)(function PointerIcon({
16943
17051
  size,
16944
17052
  color = "black",
16945
17053
  className,
16946
17054
  style: style2
16947
17055
  }) {
16948
17056
  const points = "0,5 10,0 10,10";
16949
- return /* @__PURE__ */ import_react101.default.createElement(
17057
+ return /* @__PURE__ */ import_react102.default.createElement(
16950
17058
  "svg",
16951
17059
  {
16952
17060
  width: size,
@@ -16961,7 +17069,7 @@ var UserPointerIcon = (0, import_react101.memo)(function PointerIcon({
16961
17069
  ...style2
16962
17070
  }
16963
17071
  },
16964
- /* @__PURE__ */ import_react101.default.createElement(
17072
+ /* @__PURE__ */ import_react102.default.createElement(
16965
17073
  "polygon",
16966
17074
  {
16967
17075
  points,
@@ -16974,7 +17082,7 @@ var UserPointerIcon = (0, import_react101.memo)(function PointerIcon({
16974
17082
  });
16975
17083
  var POINTER_SIZE = 12;
16976
17084
  var POINTER_OVERLAP = 6;
16977
- var UserPointer = (0, import_react101.memo)(function UserPointer2({
17085
+ var UserPointer = (0, import_react102.memo)(function UserPointer2({
16978
17086
  userId,
16979
17087
  name,
16980
17088
  visible = true,
@@ -16987,22 +17095,22 @@ var UserPointer = (0, import_react101.memo)(function UserPointer2({
16987
17095
  labelSize = "medium",
16988
17096
  bordered = true
16989
17097
  }) {
16990
- const userBackgroundColor = (0, import_react101.useMemo)(
17098
+ const userBackgroundColor = (0, import_react102.useMemo)(
16991
17099
  () => backgroundColor ?? colorFromString(userId ?? name ?? ""),
16992
17100
  [backgroundColor, userId, name]
16993
17101
  );
16994
- const pointerOverlapStyle = (0, import_react101.useMemo)(
17102
+ const pointerOverlapStyle = (0, import_react102.useMemo)(
16995
17103
  () => ({
16996
17104
  marginRight: `-${POINTER_OVERLAP}px`,
16997
17105
  marginBottom: `-${POINTER_OVERLAP}px`
16998
17106
  }),
16999
17107
  []
17000
17108
  );
17001
- const nameTagOverlapStyle = (0, import_react101.useMemo)(
17109
+ const nameTagOverlapStyle = (0, import_react102.useMemo)(
17002
17110
  () => ({ marginLeft: `${POINTER_SIZE - POINTER_OVERLAP + 1}px` }),
17003
17111
  []
17004
17112
  );
17005
- return /* @__PURE__ */ import_react101.default.createElement(
17113
+ return /* @__PURE__ */ import_react102.default.createElement(
17006
17114
  UserPointerContainer,
17007
17115
  {
17008
17116
  point,
@@ -17010,14 +17118,14 @@ var UserPointer = (0, import_react101.memo)(function UserPointer2({
17010
17118
  className,
17011
17119
  style: style2
17012
17120
  },
17013
- name && /* @__PURE__ */ import_react101.default.createElement("div", { className: "n-relative" }, showPointerIcon && /* @__PURE__ */ import_react101.default.createElement(
17121
+ name && /* @__PURE__ */ import_react102.default.createElement("div", { className: "n-relative" }, showPointerIcon && /* @__PURE__ */ import_react102.default.createElement(
17014
17122
  UserPointerIcon,
17015
17123
  {
17016
17124
  size: POINTER_SIZE,
17017
17125
  color: userBackgroundColor,
17018
17126
  style: pointerOverlapStyle
17019
17127
  }
17020
- ), /* @__PURE__ */ import_react101.default.createElement(
17128
+ ), /* @__PURE__ */ import_react102.default.createElement(
17021
17129
  UserNameTag,
17022
17130
  {
17023
17131
  backgroundColor: userBackgroundColor,
@@ -17033,10 +17141,10 @@ var UserPointer = (0, import_react101.memo)(function UserPointer2({
17033
17141
 
17034
17142
  // src/components/workspace/WorkspaceLayout.tsx
17035
17143
  var import_noya_keymap7 = require("@noya-app/noya-keymap");
17036
- var import_react108 = __toESM(require("react"));
17144
+ var import_react109 = __toESM(require("react"));
17037
17145
 
17038
17146
  // src/components/workspace/DrawerWorkspaceLayout.tsx
17039
- var import_react105 = __toESM(require("react"));
17147
+ var import_react106 = __toESM(require("react"));
17040
17148
 
17041
17149
  // src/components/workspace/constants.ts
17042
17150
  var EDITOR_PANEL_GROUP_ID = "editor-panel-group";
@@ -17045,17 +17153,17 @@ var RIGHT_SIDEBAR_ID = "editor-3-right-sidebar";
17045
17153
  var CONTENT_AREA_ID = "editor-2-content-area";
17046
17154
 
17047
17155
  // src/components/workspace/VerticalTabMenu.tsx
17048
- var import_react104 = __toESM(require("react"));
17156
+ var import_react105 = __toESM(require("react"));
17049
17157
 
17050
17158
  // src/components/Toolbar.tsx
17051
17159
  var import_noya_keymap6 = require("@noya-app/noya-keymap");
17052
- var import_react103 = __toESM(require("react"));
17160
+ var import_react104 = __toESM(require("react"));
17053
17161
 
17054
17162
  // src/components/ToolbarDrawer.tsx
17055
- var import_react102 = __toESM(require("react"));
17056
- var ToolbarDrawer = (0, import_react102.memo)(
17057
- (0, import_react102.forwardRef)(function ToolbarDrawer2({ children, trigger, sideOffset = 8 }, ref) {
17058
- return /* @__PURE__ */ import_react102.default.createElement("div", { className: "n-relative", ref }, /* @__PURE__ */ import_react102.default.createElement(
17163
+ var import_react103 = __toESM(require("react"));
17164
+ var ToolbarDrawer = (0, import_react103.memo)(
17165
+ (0, import_react103.forwardRef)(function ToolbarDrawer2({ children, trigger, sideOffset = 8 }, ref) {
17166
+ return /* @__PURE__ */ import_react103.default.createElement("div", { className: "n-relative", ref }, /* @__PURE__ */ import_react103.default.createElement(
17059
17167
  "div",
17060
17168
  {
17061
17169
  className: "n-absolute n-bottom-full n-left-1/2 -n-translate-x-1/2 n-rounded-t-lg n-border n-border-toolbar-drawer-border n-border-b-transparent n-bg-toolbar-drawer-background -n-z-10",
@@ -17071,13 +17179,13 @@ var ToolbarDrawer = (0, import_react102.memo)(
17071
17179
 
17072
17180
  // src/components/Toolbar.tsx
17073
17181
  var SIDE_OFFSET = 6;
17074
- var ToolbarMenuContext = (0, import_react103.createContext)({});
17182
+ var ToolbarMenuContext = (0, import_react104.createContext)({});
17075
17183
  var ToolbarMenuDropdown = memoGeneric(function ToolbarMenuDropdown2({
17076
17184
  item,
17077
17185
  onSelectMenuItem
17078
17186
  }) {
17079
- const [open, setOpen] = import_react103.default.useState(false);
17080
- return /* @__PURE__ */ import_react103.default.createElement(
17187
+ const [open, setOpen] = import_react104.default.useState(false);
17188
+ return /* @__PURE__ */ import_react104.default.createElement(
17081
17189
  DropdownMenu,
17082
17190
  {
17083
17191
  open,
@@ -17089,7 +17197,7 @@ var ToolbarMenuDropdown = memoGeneric(function ToolbarMenuDropdown2({
17089
17197
  }
17090
17198
  }
17091
17199
  },
17092
- /* @__PURE__ */ import_react103.default.createElement(
17200
+ /* @__PURE__ */ import_react104.default.createElement(
17093
17201
  Button,
17094
17202
  {
17095
17203
  disabled: item.disabled,
@@ -17105,7 +17213,7 @@ var ToolbarShortcut = ({
17105
17213
  shortcut,
17106
17214
  label
17107
17215
  }) => {
17108
- return /* @__PURE__ */ import_react103.default.createElement("div", { className: "n-flex n-items-center" }, label, /* @__PURE__ */ import_react103.default.createElement(Spacer.Horizontal, { size: 6 }), /* @__PURE__ */ import_react103.default.createElement(KeyboardShortcut, { shortcut }));
17216
+ return /* @__PURE__ */ import_react104.default.createElement("div", { className: "n-flex n-items-center" }, label, /* @__PURE__ */ import_react104.default.createElement(Spacer.Horizontal, { size: 6 }), /* @__PURE__ */ import_react104.default.createElement(KeyboardShortcut, { shortcut }));
17109
17217
  };
17110
17218
  var ToolbarMenuPopover = memoGeneric(function ToolbarMenuPopover2({
17111
17219
  item,
@@ -17119,8 +17227,8 @@ var ToolbarMenuPopover = memoGeneric(function ToolbarMenuPopover2({
17119
17227
  content: itemContent,
17120
17228
  checked
17121
17229
  } = item;
17122
- const [open, setOpen] = import_react103.default.useState(false);
17123
- const content = /* @__PURE__ */ import_react103.default.createElement("span", null, /* @__PURE__ */ import_react103.default.createElement(
17230
+ const [open, setOpen] = import_react104.default.useState(false);
17231
+ const content = /* @__PURE__ */ import_react104.default.createElement("span", null, /* @__PURE__ */ import_react104.default.createElement(
17124
17232
  Popover,
17125
17233
  {
17126
17234
  open,
@@ -17129,7 +17237,7 @@ var ToolbarMenuPopover = memoGeneric(function ToolbarMenuPopover2({
17129
17237
  showArrow: false,
17130
17238
  sideOffset: SIDE_OFFSET,
17131
17239
  portalContainer,
17132
- trigger: /* @__PURE__ */ import_react103.default.createElement(
17240
+ trigger: /* @__PURE__ */ import_react104.default.createElement(
17133
17241
  Button,
17134
17242
  {
17135
17243
  disabled,
@@ -17142,7 +17250,7 @@ var ToolbarMenuPopover = memoGeneric(function ToolbarMenuPopover2({
17142
17250
  },
17143
17251
  typeof itemContent === "function" ? itemContent({ close: () => setOpen(false) }) : itemContent
17144
17252
  ));
17145
- return tooltip && !open ? /* @__PURE__ */ import_react103.default.createElement(
17253
+ return tooltip && !open ? /* @__PURE__ */ import_react104.default.createElement(
17146
17254
  Tooltip,
17147
17255
  {
17148
17256
  sideOffset: SIDE_OFFSET,
@@ -17162,7 +17270,7 @@ var ToolbarMenuButton = memoGeneric(function ToolbarMenuButton2({
17162
17270
  displayFilter
17163
17271
  }) {
17164
17272
  const isActive = item.checked || activeValue === item.value;
17165
- const content = /* @__PURE__ */ import_react103.default.createElement(
17273
+ const content = /* @__PURE__ */ import_react104.default.createElement(
17166
17274
  Button,
17167
17275
  {
17168
17276
  as,
@@ -17179,7 +17287,7 @@ var ToolbarMenuButton = memoGeneric(function ToolbarMenuButton2({
17179
17287
  displayFilter === "iconOnly" ? void 0 : item.title
17180
17288
  );
17181
17289
  const tooltip = item.tooltip ?? (displayFilter === "iconOnly" && item.title ? item.title : void 0);
17182
- return item.drawer && isActive ? /* @__PURE__ */ import_react103.default.createElement(ToolbarDrawer, { trigger: content }, item.drawer) : tooltip ? /* @__PURE__ */ import_react103.default.createElement(Tooltip, { sideOffset: SIDE_OFFSET, content: tooltip, side: tooltipSide }, content) : content;
17290
+ return item.drawer && isActive ? /* @__PURE__ */ import_react104.default.createElement(ToolbarDrawer, { trigger: content }, item.drawer) : tooltip ? /* @__PURE__ */ import_react104.default.createElement(Tooltip, { sideOffset: SIDE_OFFSET, content: tooltip, side: tooltipSide }, content) : content;
17183
17291
  });
17184
17292
  var ToolbarMenuItem = memoGeneric(function ToolbarMenuItem2({
17185
17293
  item,
@@ -17191,17 +17299,17 @@ var ToolbarMenuItem = memoGeneric(function ToolbarMenuItem2({
17191
17299
  displayFilter,
17192
17300
  dividerOverflow: dividerOverflowProp
17193
17301
  }) {
17194
- const { dividerOverflow: contextDividerOverflow } = (0, import_react103.useContext)(ToolbarMenuContext);
17302
+ const { dividerOverflow: contextDividerOverflow } = (0, import_react104.useContext)(ToolbarMenuContext);
17195
17303
  const dividerOverflow = dividerOverflowProp ?? contextDividerOverflow ?? 4;
17196
17304
  if (item.type === "sectionHeader") return null;
17197
17305
  if (item.type === "separator") {
17198
- return /* @__PURE__ */ import_react103.default.createElement(DividerVertical, { overflow: dividerOverflow });
17306
+ return /* @__PURE__ */ import_react104.default.createElement(DividerVertical, { overflow: dividerOverflow });
17199
17307
  }
17200
17308
  if (item.type === "popover") {
17201
- return /* @__PURE__ */ import_react103.default.createElement(ToolbarMenuPopover, { item, portalContainer });
17309
+ return /* @__PURE__ */ import_react104.default.createElement(ToolbarMenuPopover, { item, portalContainer });
17202
17310
  }
17203
17311
  if (isSelectableMenuItem(item)) {
17204
- return /* @__PURE__ */ import_react103.default.createElement(
17312
+ return /* @__PURE__ */ import_react104.default.createElement(
17205
17313
  ToolbarMenuButton,
17206
17314
  {
17207
17315
  item,
@@ -17213,7 +17321,7 @@ var ToolbarMenuItem = memoGeneric(function ToolbarMenuItem2({
17213
17321
  }
17214
17322
  );
17215
17323
  }
17216
- return /* @__PURE__ */ import_react103.default.createElement(ToolbarMenuDropdown, { item, onSelectMenuItem });
17324
+ return /* @__PURE__ */ import_react104.default.createElement(ToolbarMenuDropdown, { item, onSelectMenuItem });
17217
17325
  });
17218
17326
  var ToolbarMenu = memoGeneric(function ToolbarMenu2({
17219
17327
  items,
@@ -17225,8 +17333,8 @@ var ToolbarMenu = memoGeneric(function ToolbarMenu2({
17225
17333
  displayFilter = "iconAndText",
17226
17334
  dividerOverflow
17227
17335
  }) {
17228
- return /* @__PURE__ */ import_react103.default.createElement(import_react103.default.Fragment, null, items.map((item, i) => {
17229
- return /* @__PURE__ */ import_react103.default.createElement(
17336
+ return /* @__PURE__ */ import_react104.default.createElement(import_react104.default.Fragment, null, items.map((item, i) => {
17337
+ return /* @__PURE__ */ import_react104.default.createElement(
17230
17338
  ToolbarMenuItem,
17231
17339
  {
17232
17340
  key: i,
@@ -17251,21 +17359,21 @@ function Toolbar({
17251
17359
  shouldBindKeyboardShortcuts = true,
17252
17360
  dividerOverflow
17253
17361
  }) {
17254
- const allMenuItems = import_react103.default.useMemo(
17362
+ const allMenuItems = import_react104.default.useMemo(
17255
17363
  () => [...leftMenuItems, ...rightMenuItems],
17256
17364
  [leftMenuItems, rightMenuItems]
17257
17365
  );
17258
17366
  (0, import_noya_keymap6.useKeyboardShortcuts)(
17259
- import_react103.default.useMemo(
17367
+ import_react104.default.useMemo(
17260
17368
  () => onSelectMenuItem && shouldBindKeyboardShortcuts ? getKeyboardShortcutsForMenuItems(allMenuItems, onSelectMenuItem) : {},
17261
17369
  [allMenuItems, onSelectMenuItem, shouldBindKeyboardShortcuts]
17262
17370
  )
17263
17371
  );
17264
- return /* @__PURE__ */ import_react103.default.createElement(
17372
+ return /* @__PURE__ */ import_react104.default.createElement(
17265
17373
  BaseToolbar,
17266
17374
  {
17267
17375
  logo,
17268
- left: leftMenuItems.length > 0 && /* @__PURE__ */ import_react103.default.createElement("div", { className: "n-flex n-gap-2" }, /* @__PURE__ */ import_react103.default.createElement(
17376
+ left: leftMenuItems.length > 0 && /* @__PURE__ */ import_react104.default.createElement("div", { className: "n-flex n-gap-2" }, /* @__PURE__ */ import_react104.default.createElement(
17269
17377
  ToolbarMenu,
17270
17378
  {
17271
17379
  items: leftMenuItems,
@@ -17273,7 +17381,7 @@ function Toolbar({
17273
17381
  dividerOverflow
17274
17382
  }
17275
17383
  )),
17276
- right: rightMenuItems.length > 0 && /* @__PURE__ */ import_react103.default.createElement("div", { className: "n-flex n-gap-2" }, /* @__PURE__ */ import_react103.default.createElement(
17384
+ right: rightMenuItems.length > 0 && /* @__PURE__ */ import_react104.default.createElement("div", { className: "n-flex n-gap-2" }, /* @__PURE__ */ import_react104.default.createElement(
17277
17385
  ToolbarMenu,
17278
17386
  {
17279
17387
  items: rightMenuItems,
@@ -17294,19 +17402,19 @@ var VerticalTabMenu = memoGeneric(function VerticalTabMenu2({
17294
17402
  onChange,
17295
17403
  tooltipSide
17296
17404
  }) {
17297
- const style2 = (0, import_react104.useMemo)(() => {
17405
+ const style2 = (0, import_react105.useMemo)(() => {
17298
17406
  return {
17299
17407
  [cssVarNames.colors.inputBackground]: "transparent",
17300
17408
  [cssVarNames.colors.buttonBackground]: "transparent"
17301
17409
  };
17302
17410
  }, []);
17303
- return /* @__PURE__ */ import_react104.default.createElement(
17411
+ return /* @__PURE__ */ import_react105.default.createElement(
17304
17412
  "div",
17305
17413
  {
17306
17414
  className: "n-w-[calc(var(--n-toolbar-height)+1px)] n-h-full n-bg-sidebar-background n-flex n-flex-col n-items-center n-py-3 n-gap-3",
17307
17415
  style: style2
17308
17416
  },
17309
- /* @__PURE__ */ import_react104.default.createElement(
17417
+ /* @__PURE__ */ import_react105.default.createElement(
17310
17418
  ToolbarMenu,
17311
17419
  {
17312
17420
  items,
@@ -17331,14 +17439,15 @@ var DrawerWorkspaceLayout = memoGeneric(function DrawerWorkspaceLayout2({
17331
17439
  rightTabItems,
17332
17440
  rightTabValue,
17333
17441
  onChangeRightTab,
17334
- onChangeLeftTab
17442
+ onChangeLeftTab,
17443
+ compactDrawerMenu
17335
17444
  }) {
17336
- const portalContainer = (0, import_react105.useRef)(null);
17337
- const [{ leftSidebarCollapsed, rightSidebarCollapsed }, setLayoutState] = (0, import_react105.useState)({
17445
+ const portalContainer = (0, import_react106.useRef)(null);
17446
+ const [{ leftSidebarCollapsed, rightSidebarCollapsed }, setLayoutState] = (0, import_react106.useState)({
17338
17447
  leftSidebarCollapsed: true,
17339
17448
  rightSidebarCollapsed: true
17340
17449
  });
17341
- const allTabItems = (0, import_react105.useMemo)(
17450
+ const allTabItems = (0, import_react106.useMemo)(
17342
17451
  () => [
17343
17452
  ...leftPanel ? leftTabItems ?? [] : [],
17344
17453
  ...rightPanel ? rightTabItems ?? [] : []
@@ -17346,77 +17455,100 @@ var DrawerWorkspaceLayout = memoGeneric(function DrawerWorkspaceLayout2({
17346
17455
  [leftTabItems, rightTabItems, leftPanel, rightPanel]
17347
17456
  );
17348
17457
  const hasTabs = allTabItems.length > 0;
17349
- const leftSelectableTabItems = (0, import_react105.useMemo)(
17458
+ const allSelectableTabItems = (0, import_react106.useMemo)(
17459
+ () => allTabItems.filter(isSelectableMenuItem),
17460
+ [allTabItems]
17461
+ );
17462
+ const useCompactInToolbar = !!compactDrawerMenu && allSelectableTabItems.length <= 1;
17463
+ const leftSelectableTabItems = (0, import_react106.useMemo)(
17350
17464
  () => (leftTabItems ?? []).filter(isSelectableMenuItem),
17351
17465
  [leftTabItems]
17352
17466
  );
17353
- const rightSelectableTabItems = (0, import_react105.useMemo)(
17467
+ const rightSelectableTabItems = (0, import_react106.useMemo)(
17354
17468
  () => (rightTabItems ?? []).filter(isSelectableMenuItem),
17355
17469
  [rightTabItems]
17356
17470
  );
17471
+ const toggleSidebar = (ref) => {
17472
+ if (ref.current?.isExpanded()) {
17473
+ ref.current?.collapse();
17474
+ } else {
17475
+ ref.current?.expand();
17476
+ }
17477
+ };
17478
+ const ensureExpanded = (ref) => {
17479
+ if (!ref.current?.isExpanded()) {
17480
+ ref.current?.expand();
17481
+ }
17482
+ };
17483
+ const handleSelectTab = (value) => {
17484
+ if (leftSelectableTabItems.some((item) => item.value === value)) {
17485
+ if (value === leftTabValue) {
17486
+ toggleSidebar(leftSidebarRef);
17487
+ } else {
17488
+ ensureExpanded(leftSidebarRef);
17489
+ onChangeLeftTab?.(value);
17490
+ }
17491
+ } else if (rightSelectableTabItems.some((item) => item.value === value)) {
17492
+ if (value === rightTabValue) {
17493
+ toggleSidebar(rightSidebarRef);
17494
+ } else {
17495
+ ensureExpanded(rightSidebarRef);
17496
+ onChangeRightTab?.(value);
17497
+ }
17498
+ }
17499
+ };
17357
17500
  const { activeValue, isSidebarCollapsed } = leftSelectableTabItems.length > 0 && !leftSidebarCollapsed ? { activeValue: leftTabValue, isSidebarCollapsed: leftSidebarCollapsed } : rightSelectableTabItems.length > 0 && !rightSidebarCollapsed ? {
17358
17501
  activeValue: rightTabValue,
17359
17502
  isSidebarCollapsed: rightSidebarCollapsed
17360
17503
  } : { activeValue: void 0, isSidebarCollapsed: true };
17361
- return /* @__PURE__ */ import_react105.default.createElement(
17504
+ return /* @__PURE__ */ import_react106.default.createElement(
17362
17505
  "div",
17363
17506
  {
17364
17507
  ref: portalContainer,
17365
17508
  id: EDITOR_PANEL_GROUP_ID,
17366
17509
  className: "n-flex n-flex-1 n-relative focus:n-outline-none"
17367
17510
  },
17368
- hasTabs && /* @__PURE__ */ import_react105.default.createElement(
17511
+ hasTabs && !useCompactInToolbar && /* @__PURE__ */ import_react106.default.createElement(import_react106.default.Fragment, null, /* @__PURE__ */ import_react106.default.createElement(
17369
17512
  VerticalTabMenu,
17370
17513
  {
17371
17514
  tooltipSide: "right",
17372
17515
  items: allTabItems,
17373
17516
  activeValue,
17374
17517
  isSidebarCollapsed,
17375
- onChange: (value) => {
17376
- if (leftSelectableTabItems.some((item) => item.value === value)) {
17377
- if (value === leftTabValue) {
17378
- if (leftSidebarRef.current?.isExpanded()) {
17379
- leftSidebarRef.current?.collapse();
17380
- } else {
17381
- leftSidebarRef.current?.expand();
17382
- }
17383
- } else {
17384
- if (!leftSidebarRef.current?.isExpanded()) {
17385
- leftSidebarRef.current?.expand();
17386
- }
17387
- onChangeLeftTab?.(value);
17388
- }
17389
- } else if (rightSelectableTabItems.some((item) => item.value === value)) {
17390
- if (value === rightTabValue) {
17391
- if (rightSidebarRef.current?.isExpanded()) {
17392
- rightSidebarRef.current?.collapse();
17393
- } else {
17394
- rightSidebarRef.current?.expand();
17395
- }
17396
- } else {
17397
- if (!rightSidebarRef.current?.isExpanded()) {
17398
- rightSidebarRef.current?.expand();
17399
- }
17400
- onChangeRightTab?.(value);
17401
- }
17402
- }
17518
+ onChange: (value) => handleSelectTab(value)
17519
+ }
17520
+ ), /* @__PURE__ */ import_react106.default.createElement(DividerVertical, { className: "n-h-full" })),
17521
+ useCompactInToolbar && /* @__PURE__ */ import_react106.default.createElement("div", { className: "n-absolute n-top-0 n-left-0 n-h-[calc(var(--n-toolbar-height)+1px)] n-w-[calc(var(--n-toolbar-height)+1px)] n-bg-sidebar-background n-border-r n-border-b n-border-divider-strong n-z-10 n-flex n-items-center n-justify-center" }, allSelectableTabItems[0] && /* @__PURE__ */ import_react106.default.createElement(
17522
+ Button,
17523
+ {
17524
+ variant: "none",
17525
+ className: "n-rounded",
17526
+ style: {
17527
+ width: "var(--n-input-height)",
17528
+ height: "var(--n-input-height)"
17529
+ },
17530
+ icon: allSelectableTabItems[0].icon,
17531
+ tooltip: allSelectableTabItems[0].tooltip ?? allSelectableTabItems[0].title,
17532
+ active: (() => {
17533
+ const value = allSelectableTabItems[0].value;
17534
+ const isLeftItem = leftSelectableTabItems.some((i) => i.value === value);
17535
+ const isRightItem = rightSelectableTabItems.some((i) => i.value === value);
17536
+ return isLeftItem ? !leftSidebarCollapsed : isRightItem ? !rightSidebarCollapsed : false;
17537
+ })(),
17538
+ onClick: () => {
17539
+ const value = allSelectableTabItems[0].value;
17540
+ handleSelectTab(value);
17403
17541
  }
17404
17542
  }
17405
- ),
17406
- hasTabs && /* @__PURE__ */ import_react105.default.createElement(DividerVertical, { className: "n-h-full" }),
17407
- /* @__PURE__ */ import_react105.default.createElement("div", { className: "n-flex-1 n-flex n-relative" }, centerPanel),
17408
- leftPanel && /* @__PURE__ */ import_react105.default.createElement(
17543
+ )),
17544
+ /* @__PURE__ */ import_react106.default.createElement("div", { className: "n-flex-1 n-flex n-relative" }, centerPanel),
17545
+ leftPanel && /* @__PURE__ */ import_react106.default.createElement(
17409
17546
  Drawer,
17410
17547
  {
17411
17548
  ref: leftSidebarRef,
17412
17549
  className: "n-flex-1",
17413
- style: {
17414
- left: 48,
17415
- maxWidth: "calc(100% - 48px)"
17416
- },
17417
- overlayStyle: {
17418
- left: 48
17419
- },
17550
+ style: useCompactInToolbar ? void 0 : { left: 48, maxWidth: "calc(100% - 48px)" },
17551
+ overlayStyle: useCompactInToolbar ? void 0 : { left: 48 },
17420
17552
  open: !leftSidebarCollapsed,
17421
17553
  positioning: "absolute",
17422
17554
  side: "left",
@@ -17431,19 +17563,14 @@ var DrawerWorkspaceLayout = memoGeneric(function DrawerWorkspaceLayout2({
17431
17563
  },
17432
17564
  leftPanel
17433
17565
  ),
17434
- rightPanel && /* @__PURE__ */ import_react105.default.createElement(
17566
+ rightPanel && /* @__PURE__ */ import_react106.default.createElement(
17435
17567
  Drawer,
17436
17568
  {
17437
17569
  id: RIGHT_SIDEBAR_ID,
17438
17570
  ref: rightSidebarRef,
17439
17571
  className: "n-flex-1",
17440
- style: {
17441
- left: 48,
17442
- maxWidth: "calc(100% - 48px)"
17443
- },
17444
- overlayStyle: {
17445
- left: 48
17446
- },
17572
+ style: useCompactInToolbar ? void 0 : { left: 48, maxWidth: "calc(100% - 48px)" },
17573
+ overlayStyle: useCompactInToolbar ? void 0 : { left: 48 },
17447
17574
  open: !rightSidebarCollapsed,
17448
17575
  positioning: "absolute",
17449
17576
  side: "left",
@@ -17462,7 +17589,7 @@ var DrawerWorkspaceLayout = memoGeneric(function DrawerWorkspaceLayout2({
17462
17589
  });
17463
17590
 
17464
17591
  // src/components/workspace/PanelWorkspaceLayout.tsx
17465
- var import_react106 = __toESM(require("react"));
17592
+ var import_react107 = __toESM(require("react"));
17466
17593
  var import_react_resizable_panels = require("react-resizable-panels");
17467
17594
 
17468
17595
  // src/components/workspace/panelStorage.ts
@@ -17625,13 +17752,14 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17625
17752
  leftTabValue,
17626
17753
  rightTabValue,
17627
17754
  onChangeLeftTab,
17628
- onChangeRightTab
17755
+ onChangeRightTab,
17756
+ compactDrawerMenu
17629
17757
  }) {
17630
- const panelGroupRef = (0, import_react106.useRef)(null);
17758
+ const panelGroupRef = (0, import_react107.useRef)(null);
17631
17759
  const hasLeftPanel = !!leftPanel;
17632
17760
  const hasRightPanel = !!rightPanel;
17633
17761
  const hasCenterPanel = !!centerPanel;
17634
- const autoSaveId = (0, import_react106.useMemo)(() => {
17762
+ const autoSaveId = (0, import_react107.useMemo)(() => {
17635
17763
  return autoSavePrefix ? `${autoSavePrefix}--v2--${EDITOR_PANEL_GROUP_ID}` : Math.random().toString(36).substring(2, 15);
17636
17764
  }, [autoSavePrefix]);
17637
17765
  const layoutIds = getLayoutIds({
@@ -17658,7 +17786,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17658
17786
  });
17659
17787
  const [data, setData] = usePersistentStateObject(clientStorage, storageKey, {});
17660
17788
  const layoutGroup = data?.[propertyKey];
17661
- const { leftSidebarCollapsed, rightSidebarCollapsed } = (0, import_react106.useMemo)(() => {
17789
+ const { leftSidebarCollapsed, rightSidebarCollapsed } = (0, import_react107.useMemo)(() => {
17662
17790
  return getLayoutCollapsedState({
17663
17791
  layoutGroup,
17664
17792
  propertyKey,
@@ -17667,7 +17795,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17667
17795
  hasRightPanel
17668
17796
  });
17669
17797
  }, [layoutGroup, propertyKey, layoutIds, hasLeftPanel, hasRightPanel]);
17670
- const handleLeftTabChange = (0, import_react106.useCallback)(
17798
+ const handleLeftTabChange = (0, import_react107.useCallback)(
17671
17799
  (value) => {
17672
17800
  if (value === leftTabValue) {
17673
17801
  if (leftSidebarRef.current?.isExpanded()) {
@@ -17684,7 +17812,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17684
17812
  },
17685
17813
  [leftSidebarRef, leftTabValue, onChangeLeftTab]
17686
17814
  );
17687
- const handleRightTabChange = (0, import_react106.useCallback)(
17815
+ const handleRightTabChange = (0, import_react107.useCallback)(
17688
17816
  (value) => {
17689
17817
  if (value === rightTabValue) {
17690
17818
  if (rightSidebarRef.current?.isExpanded()) {
@@ -17701,7 +17829,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17701
17829
  },
17702
17830
  [onChangeRightTab, rightSidebarRef, rightTabValue]
17703
17831
  );
17704
- const handleLayoutChange = (0, import_react106.useCallback)(
17832
+ const handleLayoutChange = (0, import_react107.useCallback)(
17705
17833
  (layout) => {
17706
17834
  setData((prev) => {
17707
17835
  const newData = {
@@ -17716,7 +17844,10 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17716
17844
  },
17717
17845
  [setData, propertyKey]
17718
17846
  );
17719
- return /* @__PURE__ */ import_react106.default.createElement(
17847
+ const showLeftTabs = !!leftSidebarOptions.showTabs && !!leftTabItems && // When compact drawer UI is enabled, only show the rail when the
17848
+ // sidebar is collapsed (for large screens/panel layout).
17849
+ (!compactDrawerMenu || leftSidebarCollapsed);
17850
+ return /* @__PURE__ */ import_react107.default.createElement(
17720
17851
  import_react_resizable_panels.PanelGroup,
17721
17852
  {
17722
17853
  ref: panelGroupRef,
@@ -17727,7 +17858,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17727
17858
  autoSaveId,
17728
17859
  onLayout: handleLayoutChange
17729
17860
  },
17730
- leftPanel && /* @__PURE__ */ import_react106.default.createElement(import_react106.default.Fragment, null, leftSidebarOptions.showTabs && leftTabItems && /* @__PURE__ */ import_react106.default.createElement(
17861
+ leftPanel && /* @__PURE__ */ import_react107.default.createElement(import_react107.default.Fragment, null, showLeftTabs && /* @__PURE__ */ import_react107.default.createElement(
17731
17862
  VerticalTabMenu,
17732
17863
  {
17733
17864
  tooltipSide: "right",
@@ -17736,7 +17867,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17736
17867
  isSidebarCollapsed: leftSidebarCollapsed,
17737
17868
  onChange: handleLeftTabChange
17738
17869
  }
17739
- ), leftSidebarOptions.showTabs && leftTabItems && !leftSidebarCollapsed && /* @__PURE__ */ import_react106.default.createElement(DividerVertical, { className: "n-h-full" }), /* @__PURE__ */ import_react106.default.createElement(
17870
+ ), showLeftTabs && !leftSidebarCollapsed && /* @__PURE__ */ import_react107.default.createElement(DividerVertical, { className: "n-h-full" }), /* @__PURE__ */ import_react107.default.createElement(
17740
17871
  import_react_resizable_panels.Panel,
17741
17872
  {
17742
17873
  id: LEFT_SIDEBAR_ID,
@@ -17749,8 +17880,8 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17749
17880
  collapsible: true
17750
17881
  },
17751
17882
  leftSidebarCollapsed ? null : leftPanel
17752
- ), /* @__PURE__ */ import_react106.default.createElement(import_react_resizable_panels.PanelResizeHandle, { className: "n-cursor-col-resize n-w-px n-h-full n-bg-divider" })),
17753
- /* @__PURE__ */ import_react106.default.createElement(
17883
+ ), /* @__PURE__ */ import_react107.default.createElement(import_react_resizable_panels.PanelResizeHandle, { className: "n-cursor-col-resize n-w-px n-h-full n-bg-divider" })),
17884
+ /* @__PURE__ */ import_react107.default.createElement(
17754
17885
  import_react_resizable_panels.Panel,
17755
17886
  {
17756
17887
  id: CONTENT_AREA_ID,
@@ -17761,7 +17892,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17761
17892
  },
17762
17893
  centerPanel
17763
17894
  ),
17764
- rightPanel && /* @__PURE__ */ import_react106.default.createElement(import_react106.default.Fragment, null, /* @__PURE__ */ import_react106.default.createElement(import_react_resizable_panels.PanelResizeHandle, { className: "n-cursor-col-resize n-w-px n-h-full n-bg-divider" }), /* @__PURE__ */ import_react106.default.createElement(
17895
+ rightPanel && /* @__PURE__ */ import_react107.default.createElement(import_react107.default.Fragment, null, /* @__PURE__ */ import_react107.default.createElement(import_react_resizable_panels.PanelResizeHandle, { className: "n-cursor-col-resize n-w-px n-h-full n-bg-divider" }), /* @__PURE__ */ import_react107.default.createElement(
17765
17896
  import_react_resizable_panels.Panel,
17766
17897
  {
17767
17898
  id: RIGHT_SIDEBAR_ID,
@@ -17774,7 +17905,7 @@ var PanelWorkspaceLayout = memoGeneric(function PanelWorkspaceLayout2({
17774
17905
  collapsible: true
17775
17906
  },
17776
17907
  rightSidebarCollapsed ? null : rightPanel
17777
- ), rightSidebarOptions.showTabs && rightTabItems && !rightSidebarCollapsed && /* @__PURE__ */ import_react106.default.createElement(DividerVertical, { className: "n-h-full" }), rightSidebarOptions.showTabs && rightTabItems && /* @__PURE__ */ import_react106.default.createElement(
17908
+ ), rightSidebarOptions.showTabs && rightTabItems && !rightSidebarCollapsed && /* @__PURE__ */ import_react107.default.createElement(DividerVertical, { className: "n-h-full" }), rightSidebarOptions.showTabs && rightTabItems && /* @__PURE__ */ import_react107.default.createElement(
17778
17909
  VerticalTabMenu,
17779
17910
  {
17780
17911
  tooltipSide: "left",
@@ -17796,11 +17927,11 @@ function renderPanelChildren(fn, props) {
17796
17927
  }
17797
17928
 
17798
17929
  // src/components/workspace/WorkspaceSideContext.tsx
17799
- var import_react107 = require("react");
17800
- var WorkspaceSideContext = (0, import_react107.createContext)({});
17930
+ var import_react108 = require("react");
17931
+ var WorkspaceSideContext = (0, import_react108.createContext)({});
17801
17932
  var WorkspaceSideProvider = WorkspaceSideContext.Provider;
17802
17933
  function useWorkspaceSide() {
17803
- return (0, import_react107.useContext)(WorkspaceSideContext);
17934
+ return (0, import_react108.useContext)(WorkspaceSideContext);
17804
17935
  }
17805
17936
 
17806
17937
  // src/components/workspace/WorkspaceLayout.tsx
@@ -17860,9 +17991,10 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
17860
17991
  defaultCollapsed: rightDefaultCollapsed = false,
17861
17992
  showTabs: rightShowTabs = true
17862
17993
  } = {},
17863
- theme
17994
+ theme,
17995
+ compactDrawerMenu
17864
17996
  }, forwardedRef) {
17865
- const containerRef = import_react108.default.useRef(null);
17997
+ const containerRef = import_react109.default.useRef(null);
17866
17998
  const containerSize = useSize(containerRef);
17867
17999
  const windowSize = useWindowSize();
17868
18000
  const parentSize = detectSize === "window" ? windowSize : containerSize && containerSize.width > 0 ? containerSize : windowSize;
@@ -17893,8 +18025,8 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
17893
18025
  rightSidebarMinPercentage,
17894
18026
  rightSidebarMaxPercentage
17895
18027
  );
17896
- const leftSidebarRef = (0, import_react108.useRef)(null);
17897
- const rightSidebarRef = (0, import_react108.useRef)(null);
18028
+ const leftSidebarRef = (0, import_react109.useRef)(null);
18029
+ const rightSidebarRef = (0, import_react109.useRef)(null);
17898
18030
  const [leftTabValue, setLeftTabValue] = useControlledOrUncontrolled({
17899
18031
  value: leftTabValueProp,
17900
18032
  onChange: onChangeLeftTab,
@@ -17905,7 +18037,7 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
17905
18037
  onChange: onChangeRightTab,
17906
18038
  defaultValue: getFirstTabValue(rightTabItems, "")
17907
18039
  });
17908
- (0, import_react108.useImperativeHandle)(forwardedRef, () => ({
18040
+ (0, import_react109.useImperativeHandle)(forwardedRef, () => ({
17909
18041
  setLeftExpanded: (expanded) => {
17910
18042
  if (expanded) {
17911
18043
  leftSidebarRef.current?.expand();
@@ -17963,56 +18095,56 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
17963
18095
  });
17964
18096
  const centerPanelPercentage = 100 - (left ? leftSidebarPercentage : 0) - (right ? rightSidebarPercentage : 0);
17965
18097
  const isDrawerActive = sideType === "drawer" || sideType === "auto" && parentSize.width <= sideTypeBreakpoint;
17966
- const closeLeftSidebar = (0, import_react108.useCallback)(() => {
18098
+ const closeLeftSidebar = (0, import_react109.useCallback)(() => {
17967
18099
  if (isDrawerActive) {
17968
18100
  leftSidebarRef.current?.collapse();
17969
18101
  }
17970
18102
  }, [isDrawerActive]);
17971
- const closeRightSidebar = (0, import_react108.useCallback)(() => {
18103
+ const closeRightSidebar = (0, import_react109.useCallback)(() => {
17972
18104
  if (isDrawerActive) {
17973
18105
  rightSidebarRef.current?.collapse();
17974
18106
  }
17975
18107
  }, [isDrawerActive]);
17976
- const leftChildrenProps = (0, import_react108.useMemo)(() => {
18108
+ const leftChildrenProps = (0, import_react109.useMemo)(() => {
17977
18109
  return {
17978
18110
  activeTabValue: leftTabValue,
17979
18111
  closeSidebar: closeLeftSidebar
17980
18112
  };
17981
18113
  }, [leftTabValue, closeLeftSidebar]);
17982
- const rightChildrenProps = (0, import_react108.useMemo)(() => {
18114
+ const rightChildrenProps = (0, import_react109.useMemo)(() => {
17983
18115
  return {
17984
18116
  activeTabValue: rightTabValue,
17985
18117
  closeSidebar: closeRightSidebar
17986
18118
  };
17987
18119
  }, [rightTabValue, closeRightSidebar]);
17988
- const leftSidebarProviderValue = (0, import_react108.useMemo)(() => {
18120
+ const leftSidebarProviderValue = (0, import_react109.useMemo)(() => {
17989
18121
  return {
17990
18122
  closeSidebar: closeLeftSidebar
17991
18123
  };
17992
18124
  }, [closeLeftSidebar]);
17993
- const rightSidebarProviderValue = (0, import_react108.useMemo)(() => {
18125
+ const rightSidebarProviderValue = (0, import_react109.useMemo)(() => {
17994
18126
  return {
17995
18127
  closeSidebar: closeRightSidebar
17996
18128
  };
17997
18129
  }, [closeRightSidebar]);
17998
- const leftPanel = left && leftVisible !== false ? /* @__PURE__ */ import_react108.default.createElement(
18130
+ const leftPanel = left && leftVisible !== false ? /* @__PURE__ */ import_react109.default.createElement(
17999
18131
  PanelInner,
18000
18132
  {
18001
18133
  style: leftStyle,
18002
18134
  className: cx("n-bg-sidebar-background n-flex-col", leftClassName)
18003
18135
  },
18004
- /* @__PURE__ */ import_react108.default.createElement(WorkspaceSideProvider, { value: leftSidebarProviderValue }, leftTabValue ? renderPanelChildren(left, leftChildrenProps) : null)
18136
+ /* @__PURE__ */ import_react109.default.createElement(WorkspaceSideProvider, { value: leftSidebarProviderValue }, leftTabValue ? renderPanelChildren(left, leftChildrenProps) : null)
18005
18137
  ) : null;
18006
- const rightPanel = right && rightVisible !== false ? /* @__PURE__ */ import_react108.default.createElement(
18138
+ const rightPanel = right && rightVisible !== false ? /* @__PURE__ */ import_react109.default.createElement(
18007
18139
  PanelInner,
18008
18140
  {
18009
18141
  style: rightStyle,
18010
18142
  className: cx("n-bg-sidebar-background n-flex-col", rightClassName)
18011
18143
  },
18012
- /* @__PURE__ */ import_react108.default.createElement(WorkspaceSideProvider, { value: rightSidebarProviderValue }, rightTabValue ? renderPanelChildren(right, rightChildrenProps) : null)
18144
+ /* @__PURE__ */ import_react109.default.createElement(WorkspaceSideProvider, { value: rightSidebarProviderValue }, rightTabValue ? renderPanelChildren(right, rightChildrenProps) : null)
18013
18145
  ) : null;
18014
- const centerPanel = /* @__PURE__ */ import_react108.default.createElement(PanelInner, { className: "n-bg-canvas-background" }, children);
18015
- const leftSidebarOptions = (0, import_react108.useMemo)(
18146
+ const centerPanel = /* @__PURE__ */ import_react109.default.createElement(PanelInner, { className: "n-bg-canvas-background" }, children);
18147
+ const leftSidebarOptions = (0, import_react109.useMemo)(
18016
18148
  () => ({
18017
18149
  minSize: leftSidebarMinPercentage,
18018
18150
  maxSize: leftSidebarMaxPercentage,
@@ -18030,7 +18162,7 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
18030
18162
  leftShowTabs
18031
18163
  ]
18032
18164
  );
18033
- const rightSidebarOptions = (0, import_react108.useMemo)(
18165
+ const rightSidebarOptions = (0, import_react109.useMemo)(
18034
18166
  () => ({
18035
18167
  minSize: rightSidebarMinPercentage,
18036
18168
  maxSize: rightSidebarMaxPercentage,
@@ -18050,7 +18182,7 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
18050
18182
  );
18051
18183
  const LayoutComponent = sideType === "panel" ? PanelWorkspaceLayout : sideType === "drawer" ? DrawerWorkspaceLayout : parentSize.width > sideTypeBreakpoint ? PanelWorkspaceLayout : DrawerWorkspaceLayout;
18052
18184
  const readyToRender = detectSize === "window" || containerSize && containerSize.width > 0;
18053
- return /* @__PURE__ */ import_react108.default.createElement(
18185
+ return /* @__PURE__ */ import_react109.default.createElement(
18054
18186
  "div",
18055
18187
  {
18056
18188
  ref: containerRef,
@@ -18063,7 +18195,7 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
18063
18195
  "data-theme": theme
18064
18196
  },
18065
18197
  toolbar,
18066
- /* @__PURE__ */ import_react108.default.createElement("div", { className: "n-flex n-flex-row n-flex-1 n-relative" }, readyToRender && /* @__PURE__ */ import_react108.default.createElement(
18198
+ /* @__PURE__ */ import_react109.default.createElement("div", { className: "n-flex n-flex-row n-flex-1 n-relative" }, readyToRender && /* @__PURE__ */ import_react109.default.createElement(
18067
18199
  LayoutComponent,
18068
18200
  {
18069
18201
  leftPanel,
@@ -18080,17 +18212,18 @@ var WorkspaceLayout = forwardRefGeneric(function WorkspaceLayout2({
18080
18212
  centerPanelPercentage,
18081
18213
  autoSavePrefix,
18082
18214
  leftSidebarRef,
18083
- rightSidebarRef
18215
+ rightSidebarRef,
18216
+ compactDrawerMenu
18084
18217
  }
18085
18218
  ))
18086
18219
  );
18087
18220
  });
18088
- var PanelInner = (0, import_react108.memo)(function PanelInner2({
18221
+ var PanelInner = (0, import_react109.memo)(function PanelInner2({
18089
18222
  children,
18090
18223
  style: style2,
18091
18224
  className
18092
18225
  }) {
18093
- return /* @__PURE__ */ import_react108.default.createElement(
18226
+ return /* @__PURE__ */ import_react109.default.createElement(
18094
18227
  "div",
18095
18228
  {
18096
18229
  style: style2,
@@ -18105,22 +18238,22 @@ function getFirstTabValue(items, defaultValue2) {
18105
18238
  }
18106
18239
 
18107
18240
  // src/contexts/ImageDataContext.tsx
18108
- var React109 = __toESM(require("react"));
18109
- var ImageDataContext = React109.createContext(
18241
+ var React110 = __toESM(require("react"));
18242
+ var ImageDataContext = React110.createContext(
18110
18243
  void 0
18111
18244
  );
18112
- var ImageDataProvider = React109.memo(function ImageDataProvider2({
18245
+ var ImageDataProvider = React110.memo(function ImageDataProvider2({
18113
18246
  children,
18114
18247
  getImageData
18115
18248
  }) {
18116
- const contextValue = React109.useMemo(
18249
+ const contextValue = React110.useMemo(
18117
18250
  () => ({ getImageData: getImageData ?? (() => void 0) }),
18118
18251
  [getImageData]
18119
18252
  );
18120
- return /* @__PURE__ */ React109.createElement(ImageDataContext.Provider, { value: contextValue }, children);
18253
+ return /* @__PURE__ */ React110.createElement(ImageDataContext.Provider, { value: contextValue }, children);
18121
18254
  });
18122
18255
  function useImageData(ref) {
18123
- const value = React109.useContext(ImageDataContext);
18256
+ const value = React110.useContext(ImageDataContext);
18124
18257
  if (!value) {
18125
18258
  throw new Error("Missing ImageDataProvider");
18126
18259
  }
@@ -18137,9 +18270,9 @@ function usePlatformModKey() {
18137
18270
  }
18138
18271
 
18139
18272
  // src/hooks/useTheme.ts
18140
- var import_react109 = require("react");
18273
+ var import_react110 = require("react");
18141
18274
  function useTheme() {
18142
- const [theme, setTheme] = (0, import_react109.useState)("light");
18275
+ const [theme, setTheme] = (0, import_react110.useState)("light");
18143
18276
  const checkTheme = () => {
18144
18277
  const currentTheme = document.body.getAttribute("data-theme");
18145
18278
  switch (currentTheme) {
@@ -18151,7 +18284,7 @@ function useTheme() {
18151
18284
  break;
18152
18285
  }
18153
18286
  };
18154
- (0, import_react109.useEffect)(() => {
18287
+ (0, import_react110.useEffect)(() => {
18155
18288
  checkTheme();
18156
18289
  const observer = new MutationObserver((mutations) => {
18157
18290
  mutations.forEach((mutation) => {
@@ -18274,11 +18407,11 @@ var SUPPORTED_CANVAS_UPLOAD_TYPES = [
18274
18407
 
18275
18408
  // src/components/DimensionInput.tsx
18276
18409
  var import_noya_utils21 = require("@noya-app/noya-utils");
18277
- var React110 = __toESM(require("react"));
18410
+ var React111 = __toESM(require("react"));
18278
18411
  function getNewValue(value, mode, delta) {
18279
18412
  return delta === void 0 ? value : mode === "replace" ? delta : value + delta;
18280
18413
  }
18281
- var DimensionInput = React110.memo(function DimensionInput2({
18414
+ var DimensionInput = React111.memo(function DimensionInput2({
18282
18415
  id,
18283
18416
  value,
18284
18417
  onSetValue,
@@ -18288,15 +18421,15 @@ var DimensionInput = React110.memo(function DimensionInput2({
18288
18421
  disabled,
18289
18422
  trigger = "submit"
18290
18423
  }) {
18291
- const handleNudgeValue = React110.useCallback(
18424
+ const handleNudgeValue = React111.useCallback(
18292
18425
  (value2) => onSetValue(value2, "adjust"),
18293
18426
  [onSetValue]
18294
18427
  );
18295
- const handleSetValue = React110.useCallback(
18428
+ const handleSetValue = React111.useCallback(
18296
18429
  (value2) => onSetValue(value2, "replace"),
18297
18430
  [onSetValue]
18298
18431
  );
18299
- return /* @__PURE__ */ React110.createElement(LabeledField, { label, labelType: "inset" }, /* @__PURE__ */ React110.createElement(InputField2.Root, { id, width: size }, /* @__PURE__ */ React110.createElement(
18432
+ return /* @__PURE__ */ React111.createElement(LabeledField, { label, labelType: "inset" }, /* @__PURE__ */ React111.createElement(InputField2.Root, { id, width: size }, /* @__PURE__ */ React111.createElement(
18300
18433
  InputField2.NumberInput,
18301
18434
  {
18302
18435
  value: value === void 0 ? value : (0, import_noya_utils21.round)(value, 2),
@@ -18323,8 +18456,8 @@ __export(InspectorPrimitives_exports, {
18323
18456
  Title: () => Title,
18324
18457
  VerticalSeparator: () => VerticalSeparator
18325
18458
  });
18326
- var import_react110 = __toESM(require("react"));
18327
- var Section2 = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react110.default.createElement(
18459
+ var import_react111 = __toESM(require("react"));
18460
+ var Section2 = (0, import_react111.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react111.default.createElement(
18328
18461
  "div",
18329
18462
  {
18330
18463
  ref,
@@ -18332,8 +18465,8 @@ var Section2 = (0, import_react110.forwardRef)(({ className, ...props }, ref) =>
18332
18465
  ...props
18333
18466
  }
18334
18467
  ));
18335
- var SectionHeader2 = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react110.default.createElement("div", { ref, className: cx(`n-flex n-items-center`, className), ...props }));
18336
- var Title = (0, import_react110.forwardRef)(({ className, $textStyle, ...props }, ref) => /* @__PURE__ */ import_react110.default.createElement(
18468
+ var SectionHeader2 = (0, import_react111.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react111.default.createElement("div", { ref, className: cx(`n-flex n-items-center`, className), ...props }));
18469
+ var Title = (0, import_react111.forwardRef)(({ className, $textStyle, ...props }, ref) => /* @__PURE__ */ import_react111.default.createElement(
18337
18470
  "div",
18338
18471
  {
18339
18472
  ref,
@@ -18344,7 +18477,7 @@ var Title = (0, import_react110.forwardRef)(({ className, $textStyle, ...props }
18344
18477
  ...props
18345
18478
  }
18346
18479
  ));
18347
- var Row = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react110.default.createElement(
18480
+ var Row = (0, import_react111.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react111.default.createElement(
18348
18481
  "div",
18349
18482
  {
18350
18483
  ref,
@@ -18352,7 +18485,7 @@ var Row = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /* @
18352
18485
  ...props
18353
18486
  }
18354
18487
  ));
18355
- var Column = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react110.default.createElement(
18488
+ var Column = (0, import_react111.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react111.default.createElement(
18356
18489
  "div",
18357
18490
  {
18358
18491
  ref,
@@ -18360,7 +18493,7 @@ var Column = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /
18360
18493
  ...props
18361
18494
  }
18362
18495
  ));
18363
- var Checkbox3 = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react110.default.createElement(
18496
+ var Checkbox3 = (0, import_react111.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react111.default.createElement(
18364
18497
  "input",
18365
18498
  {
18366
18499
  ref,
@@ -18369,7 +18502,7 @@ var Checkbox3 = (0, import_react110.forwardRef)(({ className, ...props }, ref) =
18369
18502
  ...props
18370
18503
  }
18371
18504
  ));
18372
- var Text3 = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react110.default.createElement(
18505
+ var Text3 = (0, import_react111.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ import_react111.default.createElement(
18373
18506
  "span",
18374
18507
  {
18375
18508
  ref,
@@ -18377,14 +18510,14 @@ var Text3 = (0, import_react110.forwardRef)(({ className, ...props }, ref) => /*
18377
18510
  ...props
18378
18511
  }
18379
18512
  ));
18380
- var VerticalSeparator = () => /* @__PURE__ */ import_react110.default.createElement(Spacer.Vertical, { size: "inspector-v-separator" });
18381
- var HorizontalSeparator = () => /* @__PURE__ */ import_react110.default.createElement(Spacer.Horizontal, { size: "inspector-h-separator" });
18382
- var RowLabel = (0, import_react110.forwardRef)(function RowLabel2({
18513
+ var VerticalSeparator = () => /* @__PURE__ */ import_react111.default.createElement(Spacer.Vertical, { size: "inspector-v-separator" });
18514
+ var HorizontalSeparator = () => /* @__PURE__ */ import_react111.default.createElement(Spacer.Horizontal, { size: "inspector-h-separator" });
18515
+ var RowLabel = (0, import_react111.forwardRef)(function RowLabel2({
18383
18516
  className,
18384
18517
  $textStyle,
18385
18518
  ...props
18386
18519
  }, ref) {
18387
- return /* @__PURE__ */ import_react110.default.createElement(
18520
+ return /* @__PURE__ */ import_react111.default.createElement(
18388
18521
  "label",
18389
18522
  {
18390
18523
  ref,
@@ -18396,7 +18529,7 @@ var RowLabel = (0, import_react110.forwardRef)(function RowLabel2({
18396
18529
  }
18397
18530
  );
18398
18531
  });
18399
- var LabeledRow = (0, import_react110.memo)(function LabeledRow2({
18532
+ var LabeledRow = (0, import_react111.memo)(function LabeledRow2({
18400
18533
  id,
18401
18534
  children,
18402
18535
  label,
@@ -18404,7 +18537,7 @@ var LabeledRow = (0, import_react110.memo)(function LabeledRow2({
18404
18537
  right,
18405
18538
  className
18406
18539
  }) {
18407
- return /* @__PURE__ */ import_react110.default.createElement(Row, { id, className }, /* @__PURE__ */ import_react110.default.createElement(Column, null, /* @__PURE__ */ import_react110.default.createElement(RowLabel, { $textStyle: labelTextStyle }, label, right && /* @__PURE__ */ import_react110.default.createElement(Spacer.Horizontal, null), right), /* @__PURE__ */ import_react110.default.createElement(Row, null, children)));
18540
+ return /* @__PURE__ */ import_react111.default.createElement(Row, { id, className }, /* @__PURE__ */ import_react111.default.createElement(Column, null, /* @__PURE__ */ import_react111.default.createElement(RowLabel, { $textStyle: labelTextStyle }, label, right && /* @__PURE__ */ import_react111.default.createElement(Spacer.Horizontal, null), right), /* @__PURE__ */ import_react111.default.createElement(Row, null, children)));
18408
18541
  });
18409
18542
  // Annotate the CommonJS export names for ESM import in node:
18410
18543
  0 && (module.exports = {
@@ -18544,6 +18677,7 @@ var LabeledRow = (0, import_react110.memo)(function LabeledRow2({
18544
18677
  Tooltip,
18545
18678
  TreeView,
18546
18679
  UserAvatar,
18680
+ UserPicker,
18547
18681
  UserPointer,
18548
18682
  WorkspaceLayout,
18549
18683
  WorkspaceSideProvider,
@@ -18577,6 +18711,7 @@ var LabeledRow = (0, import_react110.memo)(function LabeledRow2({
18577
18711
  getNextIndex,
18578
18712
  getPipelineResultLink,
18579
18713
  getThumbnailColors,
18714
+ getUserDisplayName,
18580
18715
  isMenuItemSectionHeader,
18581
18716
  isNonSelectableMenuItem,
18582
18717
  isPopoverMenuItem,