@loomhq/lens 12.12.3 → 12.12.5

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/cjs/index.js CHANGED
@@ -1107,6 +1107,11 @@ var layoutDeprecatedWarning = `Lens: Layout component is deprecated. Use Arrange
1107
1107
 
1108
1108
  // src/components/text/text.tsx
1109
1109
  var dimAmount = 0.6;
1110
+ var FontFamily = /* @__PURE__ */ ((FontFamily2) => {
1111
+ FontFamily2["sans-serif"] = "inherit";
1112
+ FontFamily2["mono"] = "Atlassian Mono";
1113
+ return FontFamily2;
1114
+ })(FontFamily || {});
1110
1115
  var variants = {
1111
1116
  body: {
1112
1117
  size: "body-md",
@@ -1149,6 +1154,7 @@ var TextWrapper = import_styled.default.span`
1149
1154
  -webkit-line-clamp: ${props.ellipsisLines};
1150
1155
  `};
1151
1156
  ${(props) => !props.hasEllipsis && props.noWrap && "white-space: nowrap; overflow: hidden;"};
1157
+ ${(props) => props.fontFamily && `font-family: ${FontFamily[props.fontFamily]};`};
1152
1158
  ${(props) => props.sizeMinMax && `
1153
1159
  min-height: 0vw;
1154
1160
  font-size: clamp(
@@ -1181,6 +1187,7 @@ var Text = (_a) => {
1181
1187
  color,
1182
1188
  isInline,
1183
1189
  isDimmed,
1190
+ fontFamily = "sans-serif",
1184
1191
  fontWeight = "regular",
1185
1192
  hasEllipsis,
1186
1193
  ellipsisLines,
@@ -1196,6 +1203,7 @@ var Text = (_a) => {
1196
1203
  "color",
1197
1204
  "isInline",
1198
1205
  "isDimmed",
1206
+ "fontFamily",
1199
1207
  "fontWeight",
1200
1208
  "hasEllipsis",
1201
1209
  "ellipsisLines",
@@ -1220,6 +1228,7 @@ var Text = (_a) => {
1220
1228
  isInline,
1221
1229
  isDimmed,
1222
1230
  fontWeight: variant ? variants[variant].fontWeight : fontWeight,
1231
+ fontFamily,
1223
1232
  hasEllipsis,
1224
1233
  ellipsisLines,
1225
1234
  noWrap,
@@ -3379,8 +3388,7 @@ var IconButtonBox = import_styled14.default.button`
3379
3388
  border-radius: ${(props) => sizeStyles[props.size].radius};
3380
3389
  }
3381
3390
 
3382
- &:focus-visible:before,
3383
- &:focus:before {
3391
+ &:focus-visible:before {
3384
3392
  ${getFocusRing()};
3385
3393
  }
3386
3394
 
@@ -3776,6 +3784,13 @@ function SvgCheck() {
3776
3784
  return /* @__PURE__ */ React22.createElement(import_check_mark.default, { label: "", testId: "ads-refreshed-icon" });
3777
3785
  }
3778
3786
 
3787
+ // src/components/icon/available-icons/close.tsx
3788
+ var import_close = __toESM(require("@atlaskit/icon/core/close"));
3789
+ var React23 = __toESM(require("react"));
3790
+ function SvgClose() {
3791
+ return /* @__PURE__ */ React23.createElement(import_close.default, { label: "", testId: "ads-refreshed-icon" });
3792
+ }
3793
+
3779
3794
  // src/components/menu/menu.tsx
3780
3795
  var menuPositions = {
3781
3796
  left: "bottom-start",
@@ -3837,6 +3852,25 @@ var MenuItemWrapper = import_styled17.default.li`
3837
3852
  width: calc(100% + ${u(3)});
3838
3853
  }
3839
3854
  `};
3855
+
3856
+ /* Default state: show checkmark for selected items */
3857
+ .check-icon {
3858
+ display: block;
3859
+ }
3860
+
3861
+ .deselect-icon {
3862
+ display: none;
3863
+ }
3864
+
3865
+ /* When highlighted (mouse hover OR keyboard navigation) and allowsDeselect: swap to X */
3866
+ ${(props) => props.showDeselectIcon && props.isHighlighted ? `
3867
+ .check-icon {
3868
+ display: none;
3869
+ }
3870
+ .deselect-icon {
3871
+ display: block;
3872
+ }
3873
+ ` : ""}
3840
3874
  `;
3841
3875
  var Image2 = import_styled17.default.img`
3842
3876
  height: 100%;
@@ -3855,7 +3889,8 @@ var MenuItem = (_a) => {
3855
3889
  hasDivider,
3856
3890
  children,
3857
3891
  menuItemRole,
3858
- keyboardMove
3892
+ keyboardMove,
3893
+ showDeselectIcon = false
3859
3894
  } = _b, props = __objRest(_b, [
3860
3895
  "isDisabled",
3861
3896
  "isHighlighted",
@@ -3864,7 +3899,8 @@ var MenuItem = (_a) => {
3864
3899
  "hasDivider",
3865
3900
  "children",
3866
3901
  "menuItemRole",
3867
- "keyboardMove"
3902
+ "keyboardMove",
3903
+ "showDeselectIcon"
3868
3904
  ]);
3869
3905
  const checkColumn = isSelected ? "auto" : "";
3870
3906
  const iconColumn = icon ? "auto" : "";
@@ -3882,11 +3918,12 @@ var MenuItem = (_a) => {
3882
3918
  columns,
3883
3919
  hasDivider,
3884
3920
  tabIndex: isDisabled ? -1 : 0,
3885
- "data-highlighted": isHighlighted || void 0
3921
+ "data-highlighted": isHighlighted || void 0,
3922
+ showDeselectIcon
3886
3923
  }, updatedProps),
3887
3924
  icon && (typeof icon === "string" ? /* @__PURE__ */ import_react23.default.createElement(container_default, { radius: "50", width: 3, height: 3, overflow: "hidden" }, /* @__PURE__ */ import_react23.default.createElement(align_default, { alignment: "center" }, /* @__PURE__ */ import_react23.default.createElement(Image2, { src: icon, alt: "", isDisabled }))) : /* @__PURE__ */ import_react23.default.createElement(icon_default, { icon, color })),
3888
3925
  /* @__PURE__ */ import_react23.default.createElement(text_default, { color, hasEllipsis: true }, children),
3889
- isSelected && /* @__PURE__ */ import_react23.default.createElement(icon_default, { icon: /* @__PURE__ */ import_react23.default.createElement(SvgCheck, null), color })
3926
+ isSelected && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement("span", { className: "check-icon", "aria-hidden": "true" }, /* @__PURE__ */ import_react23.default.createElement(icon_default, { icon: /* @__PURE__ */ import_react23.default.createElement(SvgCheck, null), color })), /* @__PURE__ */ import_react23.default.createElement("span", { className: "deselect-icon", "aria-hidden": "true" }, /* @__PURE__ */ import_react23.default.createElement(icon_default, { icon: /* @__PURE__ */ import_react23.default.createElement(SvgClose, null), color })))
3890
3927
  );
3891
3928
  };
3892
3929
  var Menu = (_a) => {
@@ -3935,9 +3972,9 @@ var import_react24 = __toESM(require("react"));
3935
3972
 
3936
3973
  // src/components/icon/available-icons/search.tsx
3937
3974
  var import_search = __toESM(require("@atlaskit/icon/core/search"));
3938
- var React24 = __toESM(require("react"));
3975
+ var React25 = __toESM(require("react"));
3939
3976
  function SvgSearch() {
3940
- return /* @__PURE__ */ React24.createElement(import_search.default, { label: "", testId: "ads-refreshed-icon" });
3977
+ return /* @__PURE__ */ React25.createElement(import_search.default, { label: "", testId: "ads-refreshed-icon" });
3941
3978
  }
3942
3979
 
3943
3980
  // src/components/search-bar/search-bar.tsx
@@ -4195,7 +4232,7 @@ var getSelectedOption = (value, options) => {
4195
4232
  return options.find((item) => item.value === value);
4196
4233
  }
4197
4234
  };
4198
- var renderOption = (item, index, selectedItem, selectedOptionValue, highlightedIndex, getItemProps, keyboardMove, setKeyboardMove) => {
4235
+ var renderOption = (item, index, selectedItem, selectedOptionValue, highlightedIndex, getItemProps, keyboardMove, setKeyboardMove, allowsDeselect = false) => {
4199
4236
  const isSelected = !selectedItem && item.value === selectedOptionValue || selectedItem && selectedItem.value === item.value;
4200
4237
  return /* @__PURE__ */ import_react25.default.createElement(
4201
4238
  MenuItem,
@@ -4220,7 +4257,8 @@ var renderOption = (item, index, selectedItem, selectedOptionValue, highlightedI
4220
4257
  hasDivider: item.hasDivider,
4221
4258
  isHighlighted: highlightedIndex === index,
4222
4259
  keyboardMove: keyboardMove && highlightedIndex === index,
4223
- isSelected
4260
+ isSelected,
4261
+ showDeselectIcon: allowsDeselect && isSelected
4224
4262
  }),
4225
4263
  item.title
4226
4264
  );
@@ -4234,7 +4272,8 @@ var SelectMenu = (_a) => {
4234
4272
  getItemProps,
4235
4273
  search,
4236
4274
  keyboardMove,
4237
- setKeyboardMove
4275
+ setKeyboardMove,
4276
+ allowsDeselect
4238
4277
  } = _b, menuProps = __objRest(_b, [
4239
4278
  "options",
4240
4279
  "selectedItem",
@@ -4243,7 +4282,8 @@ var SelectMenu = (_a) => {
4243
4282
  "getItemProps",
4244
4283
  "search",
4245
4284
  "keyboardMove",
4246
- "setKeyboardMove"
4285
+ "setKeyboardMove",
4286
+ "allowsDeselect"
4247
4287
  ]);
4248
4288
  if (!isGrouped(options)) {
4249
4289
  return /* @__PURE__ */ import_react25.default.createElement(menu_default, __spreadValues({ search }, menuProps), options.map(
@@ -4255,7 +4295,8 @@ var SelectMenu = (_a) => {
4255
4295
  highlightedIndex,
4256
4296
  getItemProps,
4257
4297
  keyboardMove,
4258
- setKeyboardMove
4298
+ setKeyboardMove,
4299
+ allowsDeselect
4259
4300
  )
4260
4301
  ));
4261
4302
  }
@@ -4271,7 +4312,8 @@ var SelectMenu = (_a) => {
4271
4312
  highlightedIndex,
4272
4313
  getItemProps,
4273
4314
  keyboardMove,
4274
- setKeyboardMove
4315
+ setKeyboardMove,
4316
+ allowsDeselect
4275
4317
  );
4276
4318
  })));
4277
4319
  }));
@@ -4296,7 +4338,8 @@ var Select = (_a) => {
4296
4338
  trigger,
4297
4339
  hasError,
4298
4340
  errorMessage = "Oops, that didn't work.",
4299
- search
4341
+ search,
4342
+ allowsDeselect = false
4300
4343
  } = _b, props = __objRest(_b, [
4301
4344
  "container",
4302
4345
  "onChange",
@@ -4316,8 +4359,10 @@ var Select = (_a) => {
4316
4359
  "trigger",
4317
4360
  "hasError",
4318
4361
  "errorMessage",
4319
- "search"
4362
+ "search",
4363
+ "allowsDeselect"
4320
4364
  ]);
4365
+ var _a2;
4321
4366
  const environment = getDownshiftEnvironment(container);
4322
4367
  const [downshiftIsOpen, setDownshiftIsOpen] = (0, import_react25.useState)(false);
4323
4368
  const [keyboardMove, setKeyboardMove] = (0, import_react25.useState)(false);
@@ -4327,15 +4372,32 @@ var Select = (_a) => {
4327
4372
  setSearchValue(value);
4328
4373
  };
4329
4374
  const [selectedItem, setSelectedItem] = (0, import_react25.useState)(
4330
- getSelectedOption(selectedOptionValue, options)
4375
+ (_a2 = getSelectedOption(selectedOptionValue, options)) != null ? _a2 : null
4331
4376
  );
4332
4377
  const onDownshiftChange = (item) => {
4333
- setSelectedItem(item);
4334
- onChange && onChange(item ? item : "");
4378
+ const isCurrentlySelected = selectedItem && item && item.value === selectedItem.value || !selectedItem && item && item.value === selectedOptionValue;
4379
+ if (allowsDeselect && isCurrentlySelected) {
4380
+ setSelectedItem(null);
4381
+ setDownshiftIsOpen(false);
4382
+ onChange && onChange(null);
4383
+ } else {
4384
+ setSelectedItem(item != null ? item : null);
4385
+ if (item) {
4386
+ onChange && onChange(item);
4387
+ } else if (allowsDeselect) {
4388
+ onChange && onChange(null);
4389
+ }
4390
+ }
4391
+ };
4392
+ const onStateChange = (changes) => {
4393
+ if (changes.isOpen !== void 0) {
4394
+ setDownshiftIsOpen(changes.isOpen);
4395
+ }
4335
4396
  };
4336
4397
  const downshiftProps = {
4337
4398
  itemToString: (item) => item ? item.value : "",
4338
4399
  onChange: onDownshiftChange,
4400
+ onStateChange,
4339
4401
  onOuterClick,
4340
4402
  environment,
4341
4403
  selectedItem,
@@ -4354,10 +4416,8 @@ var Select = (_a) => {
4354
4416
  triggerOffset
4355
4417
  });
4356
4418
  (0, import_react25.useEffect)(() => {
4357
- const expectedSelectedItem = getSelectedOption(
4358
- selectedOptionValue,
4359
- options
4360
- );
4419
+ var _a3;
4420
+ const expectedSelectedItem = (_a3 = getSelectedOption(selectedOptionValue, options)) != null ? _a3 : null;
4361
4421
  if ((expectedSelectedItem == null ? void 0 : expectedSelectedItem.value) !== (selectedItem == null ? void 0 : selectedItem.value)) {
4362
4422
  setSelectedItem(expectedSelectedItem);
4363
4423
  }
@@ -4366,12 +4426,14 @@ var Select = (_a) => {
4366
4426
  onOpenChange && onOpenChange(downshiftIsOpen);
4367
4427
  }, [downshiftIsOpen, onOpenChange]);
4368
4428
  const stateReducer = (state, changes) => {
4369
- if (changes.isOpen !== void 0) {
4370
- if (changes.type === import_downshift.default.stateChangeTypes.keyDownEscape) {
4371
- setDownshiftIsOpen(false);
4372
- return { isOpen: false };
4429
+ if (allowsDeselect && changes.type === import_downshift.default.stateChangeTypes.clickItem && changes.selectedItem) {
4430
+ const isCurrentlySelected = state.selectedItem && changes.selectedItem.value === state.selectedItem.value || !state.selectedItem && changes.selectedItem.value === selectedOptionValue;
4431
+ if (isCurrentlySelected) {
4432
+ return __spreadProps(__spreadValues({}, changes), { selectedItem: null, isOpen: false });
4373
4433
  }
4374
- setDownshiftIsOpen(changes.isOpen);
4434
+ }
4435
+ if (changes.type === import_downshift.default.stateChangeTypes.keyDownEscape) {
4436
+ return { isOpen: false };
4375
4437
  }
4376
4438
  return changes;
4377
4439
  };
@@ -4502,7 +4564,8 @@ var Select = (_a) => {
4502
4564
  }
4503
4565
  ),
4504
4566
  keyboardMove,
4505
- setKeyboardMove
4567
+ setKeyboardMove,
4568
+ allowsDeselect
4506
4569
  }
4507
4570
  )
4508
4571
  )
@@ -4633,15 +4696,6 @@ var backdrop_default = Backdrop;
4633
4696
  var import_styled21 = __toESM(require("@emotion/styled"));
4634
4697
  var import_focus_trap_react = __toESM(require("focus-trap-react"));
4635
4698
  var import_react28 = __toESM(require("react"));
4636
-
4637
- // src/components/icon/available-icons/close.tsx
4638
- var import_close = __toESM(require("@atlaskit/icon/core/close"));
4639
- var React28 = __toESM(require("react"));
4640
- function SvgClose() {
4641
- return /* @__PURE__ */ React28.createElement(import_close.default, { label: "", testId: "ads-refreshed-icon" });
4642
- }
4643
-
4644
- // src/components/modal/modal.tsx
4645
4699
  var DEFAULT_MODAL_CARD_HEIGHT = "70vh";
4646
4700
  var ContentWrapper = import_styled21.default.div`
4647
4701
  display: grid;
@@ -4741,7 +4795,8 @@ var ModalCard = (_a) => {
4741
4795
  ariaLabelledBy,
4742
4796
  ref,
4743
4797
  removeClose,
4744
- initialFocus
4798
+ initialFocus,
4799
+ closeOnEscape = true
4745
4800
  } = _b, props = __objRest(_b, [
4746
4801
  "children",
4747
4802
  "onCloseClick",
@@ -4754,10 +4809,11 @@ var ModalCard = (_a) => {
4754
4809
  "ariaLabelledBy",
4755
4810
  "ref",
4756
4811
  "removeClose",
4757
- "initialFocus"
4812
+ "initialFocus",
4813
+ "closeOnEscape"
4758
4814
  ]);
4759
4815
  const keyListener = (e) => {
4760
- if (e.key === "Escape") {
4816
+ if (e.key === "Escape" && closeOnEscape) {
4761
4817
  e.preventDefault();
4762
4818
  if (!removeClose) {
4763
4819
  onCloseClick(e);
@@ -6746,12 +6802,13 @@ var Tooltip = (_a) => {
6746
6802
  const keyListener = (e) => {
6747
6803
  if (e.key === "Escape") {
6748
6804
  e.preventDefault();
6805
+ e.stopPropagation();
6749
6806
  handleBlur();
6750
6807
  }
6751
6808
  };
6752
- window.addEventListener("keydown", keyListener);
6809
+ window.addEventListener("keydown", keyListener, true);
6753
6810
  return () => {
6754
- window.removeEventListener("keydown", keyListener);
6811
+ window.removeEventListener("keydown", keyListener, true);
6755
6812
  };
6756
6813
  }, [isOpen, setIsOpen]);
6757
6814
  const { layerProps, triggerProps, renderLayer } = (0, import_react_laag4.useLayer)({