@loomhq/lens 12.12.4 → 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,
@@ -3775,6 +3784,13 @@ function SvgCheck() {
3775
3784
  return /* @__PURE__ */ React22.createElement(import_check_mark.default, { label: "", testId: "ads-refreshed-icon" });
3776
3785
  }
3777
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
+
3778
3794
  // src/components/menu/menu.tsx
3779
3795
  var menuPositions = {
3780
3796
  left: "bottom-start",
@@ -3836,6 +3852,25 @@ var MenuItemWrapper = import_styled17.default.li`
3836
3852
  width: calc(100% + ${u(3)});
3837
3853
  }
3838
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
+ ` : ""}
3839
3874
  `;
3840
3875
  var Image2 = import_styled17.default.img`
3841
3876
  height: 100%;
@@ -3854,7 +3889,8 @@ var MenuItem = (_a) => {
3854
3889
  hasDivider,
3855
3890
  children,
3856
3891
  menuItemRole,
3857
- keyboardMove
3892
+ keyboardMove,
3893
+ showDeselectIcon = false
3858
3894
  } = _b, props = __objRest(_b, [
3859
3895
  "isDisabled",
3860
3896
  "isHighlighted",
@@ -3863,7 +3899,8 @@ var MenuItem = (_a) => {
3863
3899
  "hasDivider",
3864
3900
  "children",
3865
3901
  "menuItemRole",
3866
- "keyboardMove"
3902
+ "keyboardMove",
3903
+ "showDeselectIcon"
3867
3904
  ]);
3868
3905
  const checkColumn = isSelected ? "auto" : "";
3869
3906
  const iconColumn = icon ? "auto" : "";
@@ -3881,11 +3918,12 @@ var MenuItem = (_a) => {
3881
3918
  columns,
3882
3919
  hasDivider,
3883
3920
  tabIndex: isDisabled ? -1 : 0,
3884
- "data-highlighted": isHighlighted || void 0
3921
+ "data-highlighted": isHighlighted || void 0,
3922
+ showDeselectIcon
3885
3923
  }, updatedProps),
3886
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 })),
3887
3925
  /* @__PURE__ */ import_react23.default.createElement(text_default, { color, hasEllipsis: true }, children),
3888
- 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 })))
3889
3927
  );
3890
3928
  };
3891
3929
  var Menu = (_a) => {
@@ -3934,9 +3972,9 @@ var import_react24 = __toESM(require("react"));
3934
3972
 
3935
3973
  // src/components/icon/available-icons/search.tsx
3936
3974
  var import_search = __toESM(require("@atlaskit/icon/core/search"));
3937
- var React24 = __toESM(require("react"));
3975
+ var React25 = __toESM(require("react"));
3938
3976
  function SvgSearch() {
3939
- 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" });
3940
3978
  }
3941
3979
 
3942
3980
  // src/components/search-bar/search-bar.tsx
@@ -4194,7 +4232,7 @@ var getSelectedOption = (value, options) => {
4194
4232
  return options.find((item) => item.value === value);
4195
4233
  }
4196
4234
  };
4197
- var renderOption = (item, index, selectedItem, selectedOptionValue, highlightedIndex, getItemProps, keyboardMove, setKeyboardMove) => {
4235
+ var renderOption = (item, index, selectedItem, selectedOptionValue, highlightedIndex, getItemProps, keyboardMove, setKeyboardMove, allowsDeselect = false) => {
4198
4236
  const isSelected = !selectedItem && item.value === selectedOptionValue || selectedItem && selectedItem.value === item.value;
4199
4237
  return /* @__PURE__ */ import_react25.default.createElement(
4200
4238
  MenuItem,
@@ -4219,7 +4257,8 @@ var renderOption = (item, index, selectedItem, selectedOptionValue, highlightedI
4219
4257
  hasDivider: item.hasDivider,
4220
4258
  isHighlighted: highlightedIndex === index,
4221
4259
  keyboardMove: keyboardMove && highlightedIndex === index,
4222
- isSelected
4260
+ isSelected,
4261
+ showDeselectIcon: allowsDeselect && isSelected
4223
4262
  }),
4224
4263
  item.title
4225
4264
  );
@@ -4233,7 +4272,8 @@ var SelectMenu = (_a) => {
4233
4272
  getItemProps,
4234
4273
  search,
4235
4274
  keyboardMove,
4236
- setKeyboardMove
4275
+ setKeyboardMove,
4276
+ allowsDeselect
4237
4277
  } = _b, menuProps = __objRest(_b, [
4238
4278
  "options",
4239
4279
  "selectedItem",
@@ -4242,7 +4282,8 @@ var SelectMenu = (_a) => {
4242
4282
  "getItemProps",
4243
4283
  "search",
4244
4284
  "keyboardMove",
4245
- "setKeyboardMove"
4285
+ "setKeyboardMove",
4286
+ "allowsDeselect"
4246
4287
  ]);
4247
4288
  if (!isGrouped(options)) {
4248
4289
  return /* @__PURE__ */ import_react25.default.createElement(menu_default, __spreadValues({ search }, menuProps), options.map(
@@ -4254,7 +4295,8 @@ var SelectMenu = (_a) => {
4254
4295
  highlightedIndex,
4255
4296
  getItemProps,
4256
4297
  keyboardMove,
4257
- setKeyboardMove
4298
+ setKeyboardMove,
4299
+ allowsDeselect
4258
4300
  )
4259
4301
  ));
4260
4302
  }
@@ -4270,7 +4312,8 @@ var SelectMenu = (_a) => {
4270
4312
  highlightedIndex,
4271
4313
  getItemProps,
4272
4314
  keyboardMove,
4273
- setKeyboardMove
4315
+ setKeyboardMove,
4316
+ allowsDeselect
4274
4317
  );
4275
4318
  })));
4276
4319
  }));
@@ -4295,7 +4338,8 @@ var Select = (_a) => {
4295
4338
  trigger,
4296
4339
  hasError,
4297
4340
  errorMessage = "Oops, that didn't work.",
4298
- search
4341
+ search,
4342
+ allowsDeselect = false
4299
4343
  } = _b, props = __objRest(_b, [
4300
4344
  "container",
4301
4345
  "onChange",
@@ -4315,8 +4359,10 @@ var Select = (_a) => {
4315
4359
  "trigger",
4316
4360
  "hasError",
4317
4361
  "errorMessage",
4318
- "search"
4362
+ "search",
4363
+ "allowsDeselect"
4319
4364
  ]);
4365
+ var _a2;
4320
4366
  const environment = getDownshiftEnvironment(container);
4321
4367
  const [downshiftIsOpen, setDownshiftIsOpen] = (0, import_react25.useState)(false);
4322
4368
  const [keyboardMove, setKeyboardMove] = (0, import_react25.useState)(false);
@@ -4326,15 +4372,32 @@ var Select = (_a) => {
4326
4372
  setSearchValue(value);
4327
4373
  };
4328
4374
  const [selectedItem, setSelectedItem] = (0, import_react25.useState)(
4329
- getSelectedOption(selectedOptionValue, options)
4375
+ (_a2 = getSelectedOption(selectedOptionValue, options)) != null ? _a2 : null
4330
4376
  );
4331
4377
  const onDownshiftChange = (item) => {
4332
- setSelectedItem(item);
4333
- 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
+ }
4334
4396
  };
4335
4397
  const downshiftProps = {
4336
4398
  itemToString: (item) => item ? item.value : "",
4337
4399
  onChange: onDownshiftChange,
4400
+ onStateChange,
4338
4401
  onOuterClick,
4339
4402
  environment,
4340
4403
  selectedItem,
@@ -4353,10 +4416,8 @@ var Select = (_a) => {
4353
4416
  triggerOffset
4354
4417
  });
4355
4418
  (0, import_react25.useEffect)(() => {
4356
- const expectedSelectedItem = getSelectedOption(
4357
- selectedOptionValue,
4358
- options
4359
- );
4419
+ var _a3;
4420
+ const expectedSelectedItem = (_a3 = getSelectedOption(selectedOptionValue, options)) != null ? _a3 : null;
4360
4421
  if ((expectedSelectedItem == null ? void 0 : expectedSelectedItem.value) !== (selectedItem == null ? void 0 : selectedItem.value)) {
4361
4422
  setSelectedItem(expectedSelectedItem);
4362
4423
  }
@@ -4365,12 +4426,14 @@ var Select = (_a) => {
4365
4426
  onOpenChange && onOpenChange(downshiftIsOpen);
4366
4427
  }, [downshiftIsOpen, onOpenChange]);
4367
4428
  const stateReducer = (state, changes) => {
4368
- if (changes.isOpen !== void 0) {
4369
- if (changes.type === import_downshift.default.stateChangeTypes.keyDownEscape) {
4370
- setDownshiftIsOpen(false);
4371
- 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 });
4372
4433
  }
4373
- setDownshiftIsOpen(changes.isOpen);
4434
+ }
4435
+ if (changes.type === import_downshift.default.stateChangeTypes.keyDownEscape) {
4436
+ return { isOpen: false };
4374
4437
  }
4375
4438
  return changes;
4376
4439
  };
@@ -4501,7 +4564,8 @@ var Select = (_a) => {
4501
4564
  }
4502
4565
  ),
4503
4566
  keyboardMove,
4504
- setKeyboardMove
4567
+ setKeyboardMove,
4568
+ allowsDeselect
4505
4569
  }
4506
4570
  )
4507
4571
  )
@@ -4632,15 +4696,6 @@ var backdrop_default = Backdrop;
4632
4696
  var import_styled21 = __toESM(require("@emotion/styled"));
4633
4697
  var import_focus_trap_react = __toESM(require("focus-trap-react"));
4634
4698
  var import_react28 = __toESM(require("react"));
4635
-
4636
- // src/components/icon/available-icons/close.tsx
4637
- var import_close = __toESM(require("@atlaskit/icon/core/close"));
4638
- var React28 = __toESM(require("react"));
4639
- function SvgClose() {
4640
- return /* @__PURE__ */ React28.createElement(import_close.default, { label: "", testId: "ads-refreshed-icon" });
4641
- }
4642
-
4643
- // src/components/modal/modal.tsx
4644
4699
  var DEFAULT_MODAL_CARD_HEIGHT = "70vh";
4645
4700
  var ContentWrapper = import_styled21.default.div`
4646
4701
  display: grid;
@@ -4740,7 +4795,8 @@ var ModalCard = (_a) => {
4740
4795
  ariaLabelledBy,
4741
4796
  ref,
4742
4797
  removeClose,
4743
- initialFocus
4798
+ initialFocus,
4799
+ closeOnEscape = true
4744
4800
  } = _b, props = __objRest(_b, [
4745
4801
  "children",
4746
4802
  "onCloseClick",
@@ -4753,10 +4809,11 @@ var ModalCard = (_a) => {
4753
4809
  "ariaLabelledBy",
4754
4810
  "ref",
4755
4811
  "removeClose",
4756
- "initialFocus"
4812
+ "initialFocus",
4813
+ "closeOnEscape"
4757
4814
  ]);
4758
4815
  const keyListener = (e) => {
4759
- if (e.key === "Escape") {
4816
+ if (e.key === "Escape" && closeOnEscape) {
4760
4817
  e.preventDefault();
4761
4818
  if (!removeClose) {
4762
4819
  onCloseClick(e);
@@ -6745,12 +6802,13 @@ var Tooltip = (_a) => {
6745
6802
  const keyListener = (e) => {
6746
6803
  if (e.key === "Escape") {
6747
6804
  e.preventDefault();
6805
+ e.stopPropagation();
6748
6806
  handleBlur();
6749
6807
  }
6750
6808
  };
6751
- window.addEventListener("keydown", keyListener);
6809
+ window.addEventListener("keydown", keyListener, true);
6752
6810
  return () => {
6753
- window.removeEventListener("keydown", keyListener);
6811
+ window.removeEventListener("keydown", keyListener, true);
6754
6812
  };
6755
6813
  }, [isOpen, setIsOpen]);
6756
6814
  const { layerProps, triggerProps, renderLayer } = (0, import_react_laag4.useLayer)({