@equinor/eds-core-react 0.27.0 → 0.28.0-dev12152022

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.
@@ -18,6 +18,7 @@ var reactDomInteractions = require('@floating-ui/react-dom-interactions');
18
18
  var ReactDom = require('react-dom');
19
19
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
20
20
  var downshift = require('downshift');
21
+ var reactVirtual = require('@tanstack/react-virtual');
21
22
 
22
23
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
23
24
 
@@ -1653,7 +1654,7 @@ var Text$2 = styled__default["default"].span.withConfig({
1653
1654
  displayName: "Label__Text",
1654
1655
  componentId: "sc-1gi2bcn-1"
1655
1656
  })(["margin:0;"]);
1656
- var Label$2 = /*#__PURE__*/react.forwardRef(function Label(props, ref) {
1657
+ var Label$3 = /*#__PURE__*/react.forwardRef(function Label(props, ref) {
1657
1658
  var _props$label = props.label,
1658
1659
  label = _props$label === void 0 ? '' : _props$label,
1659
1660
  meta = props.meta,
@@ -1908,7 +1909,7 @@ var HelperText = styled__default["default"](TextfieldHelperText).withConfig({
1908
1909
  displayName: "InputWrapper__HelperText",
1909
1910
  componentId: "sc-v6o9z1-1"
1910
1911
  })(["margin-top:8px;margin-left:8px;"]);
1911
- var Label$1 = styled__default["default"](Label$2).withConfig({
1912
+ var Label$2 = styled__default["default"](Label$3).withConfig({
1912
1913
  displayName: "InputWrapper__Label",
1913
1914
  componentId: "sc-v6o9z1-2"
1914
1915
  })(["margin-left:8px;margin-right:8px;"]);
@@ -1940,7 +1941,7 @@ var InputWrapper$2 = /*#__PURE__*/react.forwardRef(function InputWrapper(_ref, r
1940
1941
  theme: token,
1941
1942
  children: /*#__PURE__*/jsxRuntime.jsxs(Container$4, _objectSpread__default["default"](_objectSpread__default["default"]({}, other), {}, {
1942
1943
  ref: ref,
1943
- children: [hasLabel && /*#__PURE__*/jsxRuntime.jsx(Label$1, _objectSpread__default["default"]({}, _objectSpread__default["default"]({
1944
+ children: [hasLabel && /*#__PURE__*/jsxRuntime.jsx(Label$2, _objectSpread__default["default"]({}, _objectSpread__default["default"]({
1944
1945
  label: label
1945
1946
  }, labelProps))), children, hasHelperText && /*#__PURE__*/jsxRuntime.jsx(HelperText, _objectSpread__default["default"]({
1946
1947
  color: helperTextColor
@@ -7244,7 +7245,7 @@ var NativeSelect = /*#__PURE__*/react.forwardRef(function NativeSelect(_ref2, re
7244
7245
  return /*#__PURE__*/jsxRuntime.jsx(styled.ThemeProvider, {
7245
7246
  theme: token,
7246
7247
  children: /*#__PURE__*/jsxRuntime.jsxs(Container$2, _objectSpread__default["default"](_objectSpread__default["default"]({}, containerProps), {}, {
7247
- children: [showLabel && /*#__PURE__*/jsxRuntime.jsx(Label$2, _objectSpread__default["default"]({}, labelProps)), /*#__PURE__*/jsxRuntime.jsx(StyledSelect, _objectSpread__default["default"](_objectSpread__default["default"]({}, selectProps), {}, {
7248
+ children: [showLabel && /*#__PURE__*/jsxRuntime.jsx(Label$3, _objectSpread__default["default"]({}, labelProps)), /*#__PURE__*/jsxRuntime.jsx(StyledSelect, _objectSpread__default["default"](_objectSpread__default["default"]({}, selectProps), {}, {
7248
7249
  children: children
7249
7250
  }))]
7250
7251
  }))
@@ -7946,7 +7947,7 @@ var StyledLabel = styled__default["default"].label.withConfig({
7946
7947
  var isDisabled = _ref.isDisabled;
7947
7948
  return isDisabled ? 'not-allowed' : 'pointer';
7948
7949
  });
7949
- var Label = styled__default["default"].span.withConfig({
7950
+ var Label$1 = styled__default["default"].span.withConfig({
7950
7951
  displayName: "Switch__Label",
7951
7952
  componentId: "sc-sdaahx-1"
7952
7953
  })(function (_ref2) {
@@ -7982,7 +7983,7 @@ var Switch = /*#__PURE__*/react.forwardRef(function Switch(_ref3, ref) {
7982
7983
  disabled: disabled
7983
7984
  }, rest), {}, {
7984
7985
  ref: ref
7985
- })), label && /*#__PURE__*/jsxRuntime.jsx(Label, {
7986
+ })), label && /*#__PURE__*/jsxRuntime.jsx(Label$1, {
7986
7987
  children: label
7987
7988
  })]
7988
7989
  }) : size === 'small' ? /*#__PURE__*/jsxRuntime.jsx(SwitchSmall, _objectSpread__default["default"](_objectSpread__default["default"]({
@@ -8019,9 +8020,9 @@ var selectTokens = {
8019
8020
  boxShadow: boxShadow,
8020
8021
  minHeight: straight.minHeight,
8021
8022
  spacings: {
8022
- top: spacingMedium,
8023
+ top: '0',
8023
8024
  right: spacingLarge,
8024
- bottom: spacingMedium,
8025
+ bottom: '0',
8025
8026
  left: spacingLarge
8026
8027
  },
8027
8028
  typography: _objectSpread__default["default"](_objectSpread__default["default"]({}, typography.navigation.menu_title), {}, {
@@ -8053,6 +8054,14 @@ var selectTokens = {
8053
8054
  right: spacingSmall,
8054
8055
  top: '6px'
8055
8056
  }
8057
+ },
8058
+ label: {
8059
+ spacings: {
8060
+ left: '0',
8061
+ right: '0',
8062
+ top: spacingMedium,
8063
+ bottom: spacingMedium
8064
+ }
8056
8065
  }
8057
8066
  },
8058
8067
  modes: {
@@ -8060,8 +8069,8 @@ var selectTokens = {
8060
8069
  spacings: {
8061
8070
  left: spacingSmall,
8062
8071
  right: spacingSmall,
8063
- top: spacingSmall,
8064
- bottom: spacingSmall
8072
+ top: '0',
8073
+ bottom: '0'
8065
8074
  },
8066
8075
  entities: {
8067
8076
  button: {
@@ -8070,6 +8079,14 @@ var selectTokens = {
8070
8079
  right: spacingSmall,
8071
8080
  top: '0'
8072
8081
  }
8082
+ },
8083
+ label: {
8084
+ spacings: {
8085
+ left: '0',
8086
+ right: '0',
8087
+ top: spacingSmall,
8088
+ bottom: spacingSmall
8089
+ }
8073
8090
  }
8074
8091
  }
8075
8092
  }
@@ -8092,8 +8109,8 @@ var multiSelect = mergeDeepRight$1(selectTokens, {
8092
8109
  }
8093
8110
  });
8094
8111
 
8095
- var _excluded$6 = ["value", "multiple", "isSelected", "isDisabled", "onClick", "aria-selected"];
8096
- var StyledListItem = styled__default["default"](List$1.Item).withConfig({
8112
+ var _excluded$6 = ["value", "multiple", "isSelected", "isDisabled", "multiline", "onClick", "aria-selected"];
8113
+ var StyledListItem = styled__default["default"].li.withConfig({
8097
8114
  displayName: "Option__StyledListItem",
8098
8115
  componentId: "sc-1ly11zu-0"
8099
8116
  })(function (_ref) {
@@ -8102,16 +8119,25 @@ var StyledListItem = styled__default["default"](List$1.Item).withConfig({
8102
8119
  active = _ref.active,
8103
8120
  isdisabled = _ref.isdisabled;
8104
8121
  var backgroundColor = highlighted === 'true' ? theme.states.hover.background : active === 'true' ? theme.states.active.background : theme.background;
8105
- return styled.css(["display:flex;align-items:center;margin:0;list-style:none;background-color:", ";user-select:none;cursor:", ";", " ", " ", ""], backgroundColor, highlighted === 'true' ? 'pointer' : 'default', edsUtils.typographyTemplate(theme.typography), edsUtils.spacingsTemplate(theme.spacings), isdisabled === 'true' ? styled.css(["color:", ";"], theme.states.disabled.typography.color) : '');
8106
- });
8107
- var AutocompleteOption = /*#__PURE__*/react.forwardRef(function AutocompleteOption(_ref2, ref) {
8108
- var value = _ref2.value,
8109
- multiple = _ref2.multiple,
8110
- isSelected = _ref2.isSelected,
8111
- isDisabled = _ref2.isDisabled,
8112
- _onClick = _ref2.onClick,
8113
- ariaSelected = _ref2['aria-selected'],
8114
- other = _objectWithoutProperties__default["default"](_ref2, _excluded$6);
8122
+ return styled.css(["display:flex;grid-area:1 / -1;align-items:center;align-self:start;margin:0;list-style:none;background-color:", ";user-select:none;overflow:hidden;cursor:", ";", " ", " ", ""], backgroundColor, highlighted === 'true' ? 'pointer' : 'default', edsUtils.typographyTemplate(theme.typography), edsUtils.spacingsTemplate(theme.spacings), isdisabled === 'true' ? styled.css(["color:", ";"], theme.states.disabled.typography.color) : '');
8123
+ });
8124
+ var Label = styled__default["default"].span.withConfig({
8125
+ displayName: "Option__Label",
8126
+ componentId: "sc-1ly11zu-1"
8127
+ })(function (_ref2) {
8128
+ var theme = _ref2.theme,
8129
+ multiline = _ref2.multiline;
8130
+ return styled.css(["", " text-overflow:ellipsis;white-space:", ";overflow:", ";overflow-wrap:anywhere;"], edsUtils.spacingsTemplate(theme.entities.label.spacings), multiline ? 'normal' : 'nowrap', multiline ? 'initial' : 'hidden');
8131
+ });
8132
+ var AutocompleteOption = /*#__PURE__*/react.forwardRef(function AutocompleteOption(_ref3, ref) {
8133
+ var value = _ref3.value,
8134
+ multiple = _ref3.multiple,
8135
+ isSelected = _ref3.isSelected,
8136
+ isDisabled = _ref3.isDisabled,
8137
+ multiline = _ref3.multiline,
8138
+ _onClick = _ref3.onClick,
8139
+ ariaSelected = _ref3['aria-selected'],
8140
+ other = _objectWithoutProperties__default["default"](_ref3, _excluded$6);
8115
8141
  return /*#__PURE__*/jsxRuntime.jsxs(StyledListItem, _objectSpread__default["default"](_objectSpread__default["default"]({
8116
8142
  ref: ref,
8117
8143
  isdisabled: isDisabled ? 'true' : 'false',
@@ -8129,13 +8155,14 @@ var AutocompleteOption = /*#__PURE__*/react.forwardRef(function AutocompleteOpti
8129
8155
  onChange: function onChange() {
8130
8156
  return null;
8131
8157
  }
8132
- }), /*#__PURE__*/jsxRuntime.jsx("span", {
8158
+ }), /*#__PURE__*/jsxRuntime.jsx(Label, {
8159
+ multiline: multiline,
8133
8160
  children: value
8134
8161
  })]
8135
8162
  }));
8136
8163
  });
8137
8164
 
8138
- var _excluded$5 = ["options", "label", "meta", "className", "style", "disabled", "readOnly", "hideClearButton", "onOptionsChange", "selectedOptions", "multiple", "initialSelectedOptions", "disablePortal", "optionDisabled", "optionsFilter", "autoWidth", "placeholder", "optionLabel", "clearSearchOnChange"];
8165
+ var _excluded$5 = ["options", "label", "meta", "className", "style", "disabled", "readOnly", "hideClearButton", "onOptionsChange", "selectedOptions", "multiple", "initialSelectedOptions", "disablePortal", "optionDisabled", "optionsFilter", "autoWidth", "placeholder", "optionLabel", "clearSearchOnChange", "multiline"];
8139
8166
  var Container$1 = styled__default["default"].div.withConfig({
8140
8167
  displayName: "Autocomplete__Container",
8141
8168
  componentId: "sc-yvif0e-0"
@@ -8145,7 +8172,7 @@ var StyledList = styled__default["default"](List$1).withConfig({
8145
8172
  componentId: "sc-yvif0e-1"
8146
8173
  })(function (_ref) {
8147
8174
  var theme = _ref.theme;
8148
- return styled.css(["background-color:", ";box-shadow:", ";", " overflow-y:auto;max-height:300px;padding:0;"], theme.background, theme.boxShadow, edsUtils.bordersTemplate(theme.border));
8175
+ return styled.css(["background-color:", ";box-shadow:", ";", " overflow-y:auto;overflow-x:hidden;max-height:300px;padding:0;display:grid;"], theme.background, theme.boxShadow, edsUtils.bordersTemplate(theme.border));
8149
8176
  });
8150
8177
  var StyledButton = styled__default["default"](Button).withConfig({
8151
8178
  displayName: "Autocomplete__StyledButton",
@@ -8242,6 +8269,8 @@ function AutocompleteInner(props, ref) {
8242
8269
  optionLabel = props.optionLabel,
8243
8270
  _props$clearSearchOnC = props.clearSearchOnChange,
8244
8271
  clearSearchOnChange = _props$clearSearchOnC === void 0 ? true : _props$clearSearchOnC,
8272
+ _props$multiline = props.multiline,
8273
+ multiline = _props$multiline === void 0 ? false : _props$multiline,
8245
8274
  other = _objectWithoutProperties__default["default"](props, _excluded$5);
8246
8275
  var anchorRef = react.useRef(null);
8247
8276
  var isControlled = Boolean(selectedOptions);
@@ -8323,6 +8352,17 @@ function AutocompleteInner(props, ref) {
8323
8352
  throw new Error('Unable to find label, make sure your are using options as documented');
8324
8353
  }
8325
8354
  }, [optionLabel]);
8355
+ var scrollContainer = react.useRef(null);
8356
+ var rowVirtualizer = reactVirtual.useVirtualizer({
8357
+ count: availableItems.length,
8358
+ getScrollElement: function getScrollElement() {
8359
+ return scrollContainer.current;
8360
+ },
8361
+ estimateSize: react.useCallback(function () {
8362
+ return 48;
8363
+ }, []),
8364
+ overscan: 25
8365
+ });
8326
8366
  var comboBoxProps = {
8327
8367
  items: availableItems,
8328
8368
  initialSelectedItem: initialSelectedOptions[0],
@@ -8336,21 +8376,28 @@ function AutocompleteInner(props, ref) {
8336
8376
  return getLabel(item).toLowerCase().includes(inputValue.toLowerCase());
8337
8377
  }));
8338
8378
  },
8339
- onIsOpenChange: function onIsOpenChange(_ref7) {
8340
- var selectedItem = _ref7.selectedItem;
8379
+ onHighlightedIndexChange: function onHighlightedIndexChange(_ref7) {
8380
+ var highlightedIndex = _ref7.highlightedIndex,
8381
+ type = _ref7.type;
8382
+ if (type !== downshift.useCombobox.stateChangeTypes.ItemMouseMove && type !== downshift.useCombobox.stateChangeTypes.MenuMouseLeave && highlightedIndex >= 0) {
8383
+ rowVirtualizer.scrollToIndex(highlightedIndex);
8384
+ }
8385
+ },
8386
+ onIsOpenChange: function onIsOpenChange(_ref8) {
8387
+ var selectedItem = _ref8.selectedItem;
8341
8388
  if (!multiple && selectedItem !== null) {
8342
8389
  setAvailableItems(options);
8343
8390
  }
8344
8391
  },
8345
- onStateChange: function onStateChange(_ref8) {
8346
- var type = _ref8.type,
8347
- selectedItem = _ref8.selectedItem;
8392
+ onStateChange: function onStateChange(_ref9) {
8393
+ var type = _ref9.type,
8394
+ selectedItem = _ref9.selectedItem;
8348
8395
  switch (type) {
8349
8396
  case downshift.useCombobox.stateChangeTypes.InputChange:
8397
+ case downshift.useCombobox.stateChangeTypes.InputBlur:
8350
8398
  break;
8351
8399
  case downshift.useCombobox.stateChangeTypes.InputKeyDownEnter:
8352
8400
  case downshift.useCombobox.stateChangeTypes.ItemClick:
8353
- case downshift.useCombobox.stateChangeTypes.InputBlur:
8354
8401
  if (selectedItem && !optionDisabled(selectedItem)) {
8355
8402
  if (multiple) {
8356
8403
  selectedItems.includes(selectedItem) ? removeSelectedItem(selectedItem) : addSelectedItem(selectedItem);
@@ -8480,10 +8527,10 @@ function AutocompleteInner(props, ref) {
8480
8527
  middleware: [reactDomInteractions.offset(4), reactDomInteractions.flip(), reactDomInteractions.shift({
8481
8528
  padding: 8
8482
8529
  }), reactDomInteractions.size({
8483
- apply: function apply(_ref9) {
8484
- var rects = _ref9.rects,
8485
- availableHeight = _ref9.availableHeight,
8486
- elements = _ref9.elements;
8530
+ apply: function apply(_ref10) {
8531
+ var rects = _ref10.rects,
8532
+ availableHeight = _ref10.availableHeight,
8533
+ elements = _ref10.elements;
8487
8534
  var anchorWidth = "".concat(rects.reference.width, "px");
8488
8535
  Object.assign(elements.floating.style, {
8489
8536
  width: "".concat(autoWidth ? anchorWidth : 'auto'),
@@ -8528,27 +8575,48 @@ function AutocompleteInner(props, ref) {
8528
8575
  zIndex: 1500
8529
8576
  }
8530
8577
  })), {}, {
8531
- children: /*#__PURE__*/jsxRuntime.jsx(StyledList, _objectSpread__default["default"](_objectSpread__default["default"]({}, getMenuProps({
8532
- 'aria-multiselectable': multiple ? 'true' : null
8578
+ children: /*#__PURE__*/jsxRuntime.jsxs(StyledList, _objectSpread__default["default"](_objectSpread__default["default"]({}, getMenuProps({
8579
+ 'aria-multiselectable': multiple ? 'true' : null,
8580
+ ref: scrollContainer
8533
8581
  }, {
8534
8582
  suppressRefError: true
8535
8583
  })), {}, {
8536
- children: !isOpen ? null : availableItems.map(function (item, index) {
8584
+ children: [isOpen && /*#__PURE__*/jsxRuntime.jsx("li", {
8585
+ role: "presentation",
8586
+ style: {
8587
+ height: "".concat(rowVirtualizer.getTotalSize(), "px"),
8588
+ margin: '0',
8589
+ gridArea: '1 / -1'
8590
+ }
8591
+ }, "total-size"), !isOpen ? null : rowVirtualizer.getVirtualItems().map(function (virtualItem) {
8592
+ var index = virtualItem.index;
8593
+ var item = availableItems[index];
8537
8594
  var label = getLabel(item);
8538
8595
  var isDisabled = optionDisabled(item);
8539
8596
  var isSelected = selectedItemsLabels.includes(label);
8540
8597
  return /*#__PURE__*/jsxRuntime.jsx(AutocompleteOption, _objectSpread__default["default"]({
8598
+ "data-index": virtualItem.index,
8599
+ "aria-setsize": availableItems.length,
8600
+ "aria-posinset": index + 1,
8541
8601
  value: label,
8542
8602
  multiple: multiple,
8543
8603
  highlighted: highlightedIndex === index && !isDisabled ? 'true' : 'false',
8544
8604
  isSelected: isSelected,
8545
- isDisabled: isDisabled
8546
- }, getItemProps({
8605
+ isDisabled: isDisabled,
8606
+ multiline: multiline
8607
+ }, getItemProps(_objectSpread__default["default"](_objectSpread__default["default"]({}, multiline && {
8608
+ ref: rowVirtualizer.measureElement
8609
+ }), {}, {
8547
8610
  item: item,
8548
8611
  index: index,
8549
- disabled: disabled
8550
- })), label);
8551
- })
8612
+ disabled: disabled,
8613
+ style: _objectSpread__default["default"]({
8614
+ transform: "translateY(".concat(virtualItem.start, "px)")
8615
+ }, !multiline && {
8616
+ height: "".concat(virtualItem.size, "px")
8617
+ })
8618
+ }))), virtualItem.key);
8619
+ })]
8552
8620
  }))
8553
8621
  }));
8554
8622
  return /*#__PURE__*/jsxRuntime.jsx(styled.ThemeProvider, {
@@ -8557,7 +8625,7 @@ function AutocompleteInner(props, ref) {
8557
8625
  className: className,
8558
8626
  style: style,
8559
8627
  ref: ref,
8560
- children: [/*#__PURE__*/jsxRuntime.jsx(Label$2, _objectSpread__default["default"](_objectSpread__default["default"]({}, getLabelProps()), {}, {
8628
+ children: [/*#__PURE__*/jsxRuntime.jsx(Label$3, _objectSpread__default["default"](_objectSpread__default["default"]({}, getLabelProps()), {}, {
8561
8629
  label: label,
8562
8630
  meta: meta,
8563
8631
  disabled: disabled
@@ -9088,7 +9156,7 @@ exports.EdsProvider = EdsProvider;
9088
9156
  exports.Icon = Icon$1;
9089
9157
  exports.Input = Input$4;
9090
9158
  exports.InputWrapper = InputWrapper$2;
9091
- exports.Label = Label$2;
9159
+ exports.Label = Label$3;
9092
9160
  exports.LinearProgress = LinearProgress;
9093
9161
  exports.List = List$1;
9094
9162
  exports.Menu = Menu;
@@ -4,6 +4,7 @@ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProper
4
4
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
5
5
  import { forwardRef, useRef, useState, useEffect, useMemo, useCallback } from 'react';
6
6
  import { useMultipleSelection, useCombobox } from 'downshift';
7
+ import { useVirtualizer } from '@tanstack/react-virtual';
7
8
  import styled, { css, ThemeProvider } from 'styled-components';
8
9
  import { Button } from '../Button/index.js';
9
10
  import { List } from '../List/index.js';
@@ -18,7 +19,7 @@ import { useEds } from '../EdsProvider/eds.context.js';
18
19
  import { Label } from '../Label/Label.js';
19
20
  import { Input } from '../Input/Input.js';
20
21
 
21
- var _excluded = ["options", "label", "meta", "className", "style", "disabled", "readOnly", "hideClearButton", "onOptionsChange", "selectedOptions", "multiple", "initialSelectedOptions", "disablePortal", "optionDisabled", "optionsFilter", "autoWidth", "placeholder", "optionLabel", "clearSearchOnChange"];
22
+ var _excluded = ["options", "label", "meta", "className", "style", "disabled", "readOnly", "hideClearButton", "onOptionsChange", "selectedOptions", "multiple", "initialSelectedOptions", "disablePortal", "optionDisabled", "optionsFilter", "autoWidth", "placeholder", "optionLabel", "clearSearchOnChange", "multiline"];
22
23
  var Container = styled.div.withConfig({
23
24
  displayName: "Autocomplete__Container",
24
25
  componentId: "sc-yvif0e-0"
@@ -28,7 +29,7 @@ var StyledList = styled(List).withConfig({
28
29
  componentId: "sc-yvif0e-1"
29
30
  })(function (_ref) {
30
31
  var theme = _ref.theme;
31
- return css(["background-color:", ";box-shadow:", ";", " overflow-y:auto;max-height:300px;padding:0;"], theme.background, theme.boxShadow, bordersTemplate(theme.border));
32
+ return css(["background-color:", ";box-shadow:", ";", " overflow-y:auto;overflow-x:hidden;max-height:300px;padding:0;display:grid;"], theme.background, theme.boxShadow, bordersTemplate(theme.border));
32
33
  });
33
34
  var StyledButton = styled(Button).withConfig({
34
35
  displayName: "Autocomplete__StyledButton",
@@ -125,6 +126,8 @@ function AutocompleteInner(props, ref) {
125
126
  optionLabel = props.optionLabel,
126
127
  _props$clearSearchOnC = props.clearSearchOnChange,
127
128
  clearSearchOnChange = _props$clearSearchOnC === void 0 ? true : _props$clearSearchOnC,
129
+ _props$multiline = props.multiline,
130
+ multiline = _props$multiline === void 0 ? false : _props$multiline,
128
131
  other = _objectWithoutProperties(props, _excluded);
129
132
  var anchorRef = useRef(null);
130
133
  var isControlled = Boolean(selectedOptions);
@@ -206,6 +209,17 @@ function AutocompleteInner(props, ref) {
206
209
  throw new Error('Unable to find label, make sure your are using options as documented');
207
210
  }
208
211
  }, [optionLabel]);
212
+ var scrollContainer = useRef(null);
213
+ var rowVirtualizer = useVirtualizer({
214
+ count: availableItems.length,
215
+ getScrollElement: function getScrollElement() {
216
+ return scrollContainer.current;
217
+ },
218
+ estimateSize: useCallback(function () {
219
+ return 48;
220
+ }, []),
221
+ overscan: 25
222
+ });
209
223
  var comboBoxProps = {
210
224
  items: availableItems,
211
225
  initialSelectedItem: initialSelectedOptions[0],
@@ -219,21 +233,28 @@ function AutocompleteInner(props, ref) {
219
233
  return getLabel(item).toLowerCase().includes(inputValue.toLowerCase());
220
234
  }));
221
235
  },
222
- onIsOpenChange: function onIsOpenChange(_ref7) {
223
- var selectedItem = _ref7.selectedItem;
236
+ onHighlightedIndexChange: function onHighlightedIndexChange(_ref7) {
237
+ var highlightedIndex = _ref7.highlightedIndex,
238
+ type = _ref7.type;
239
+ if (type !== useCombobox.stateChangeTypes.ItemMouseMove && type !== useCombobox.stateChangeTypes.MenuMouseLeave && highlightedIndex >= 0) {
240
+ rowVirtualizer.scrollToIndex(highlightedIndex);
241
+ }
242
+ },
243
+ onIsOpenChange: function onIsOpenChange(_ref8) {
244
+ var selectedItem = _ref8.selectedItem;
224
245
  if (!multiple && selectedItem !== null) {
225
246
  setAvailableItems(options);
226
247
  }
227
248
  },
228
- onStateChange: function onStateChange(_ref8) {
229
- var type = _ref8.type,
230
- selectedItem = _ref8.selectedItem;
249
+ onStateChange: function onStateChange(_ref9) {
250
+ var type = _ref9.type,
251
+ selectedItem = _ref9.selectedItem;
231
252
  switch (type) {
232
253
  case useCombobox.stateChangeTypes.InputChange:
254
+ case useCombobox.stateChangeTypes.InputBlur:
233
255
  break;
234
256
  case useCombobox.stateChangeTypes.InputKeyDownEnter:
235
257
  case useCombobox.stateChangeTypes.ItemClick:
236
- case useCombobox.stateChangeTypes.InputBlur:
237
258
  if (selectedItem && !optionDisabled(selectedItem)) {
238
259
  if (multiple) {
239
260
  selectedItems.includes(selectedItem) ? removeSelectedItem(selectedItem) : addSelectedItem(selectedItem);
@@ -363,10 +384,10 @@ function AutocompleteInner(props, ref) {
363
384
  middleware: [offset(4), flip(), shift({
364
385
  padding: 8
365
386
  }), size({
366
- apply: function apply(_ref9) {
367
- var rects = _ref9.rects,
368
- availableHeight = _ref9.availableHeight,
369
- elements = _ref9.elements;
387
+ apply: function apply(_ref10) {
388
+ var rects = _ref10.rects,
389
+ availableHeight = _ref10.availableHeight,
390
+ elements = _ref10.elements;
370
391
  var anchorWidth = "".concat(rects.reference.width, "px");
371
392
  Object.assign(elements.floating.style, {
372
393
  width: "".concat(autoWidth ? anchorWidth : 'auto'),
@@ -411,27 +432,48 @@ function AutocompleteInner(props, ref) {
411
432
  zIndex: 1500
412
433
  }
413
434
  })), {}, {
414
- children: /*#__PURE__*/jsx(StyledList, _objectSpread(_objectSpread({}, getMenuProps({
415
- 'aria-multiselectable': multiple ? 'true' : null
435
+ children: /*#__PURE__*/jsxs(StyledList, _objectSpread(_objectSpread({}, getMenuProps({
436
+ 'aria-multiselectable': multiple ? 'true' : null,
437
+ ref: scrollContainer
416
438
  }, {
417
439
  suppressRefError: true
418
440
  })), {}, {
419
- children: !isOpen ? null : availableItems.map(function (item, index) {
441
+ children: [isOpen && /*#__PURE__*/jsx("li", {
442
+ role: "presentation",
443
+ style: {
444
+ height: "".concat(rowVirtualizer.getTotalSize(), "px"),
445
+ margin: '0',
446
+ gridArea: '1 / -1'
447
+ }
448
+ }, "total-size"), !isOpen ? null : rowVirtualizer.getVirtualItems().map(function (virtualItem) {
449
+ var index = virtualItem.index;
450
+ var item = availableItems[index];
420
451
  var label = getLabel(item);
421
452
  var isDisabled = optionDisabled(item);
422
453
  var isSelected = selectedItemsLabels.includes(label);
423
454
  return /*#__PURE__*/jsx(AutocompleteOption, _objectSpread({
455
+ "data-index": virtualItem.index,
456
+ "aria-setsize": availableItems.length,
457
+ "aria-posinset": index + 1,
424
458
  value: label,
425
459
  multiple: multiple,
426
460
  highlighted: highlightedIndex === index && !isDisabled ? 'true' : 'false',
427
461
  isSelected: isSelected,
428
- isDisabled: isDisabled
429
- }, getItemProps({
462
+ isDisabled: isDisabled,
463
+ multiline: multiline
464
+ }, getItemProps(_objectSpread(_objectSpread({}, multiline && {
465
+ ref: rowVirtualizer.measureElement
466
+ }), {}, {
430
467
  item: item,
431
468
  index: index,
432
- disabled: disabled
433
- })), label);
434
- })
469
+ disabled: disabled,
470
+ style: _objectSpread({
471
+ transform: "translateY(".concat(virtualItem.start, "px)")
472
+ }, !multiline && {
473
+ height: "".concat(virtualItem.size, "px")
474
+ })
475
+ }))), virtualItem.key);
476
+ })]
435
477
  }))
436
478
  }));
437
479
  return /*#__PURE__*/jsx(ThemeProvider, {
@@ -19,9 +19,9 @@ var selectTokens = {
19
19
  boxShadow: boxShadow,
20
20
  minHeight: straight.minHeight,
21
21
  spacings: {
22
- top: spacingMedium,
22
+ top: '0',
23
23
  right: spacingLarge,
24
- bottom: spacingMedium,
24
+ bottom: '0',
25
25
  left: spacingLarge
26
26
  },
27
27
  typography: _objectSpread(_objectSpread({}, typography.navigation.menu_title), {}, {
@@ -53,6 +53,14 @@ var selectTokens = {
53
53
  right: spacingSmall,
54
54
  top: '6px'
55
55
  }
56
+ },
57
+ label: {
58
+ spacings: {
59
+ left: '0',
60
+ right: '0',
61
+ top: spacingMedium,
62
+ bottom: spacingMedium
63
+ }
56
64
  }
57
65
  },
58
66
  modes: {
@@ -60,8 +68,8 @@ var selectTokens = {
60
68
  spacings: {
61
69
  left: spacingSmall,
62
70
  right: spacingSmall,
63
- top: spacingSmall,
64
- bottom: spacingSmall
71
+ top: '0',
72
+ bottom: '0'
65
73
  },
66
74
  entities: {
67
75
  button: {
@@ -70,6 +78,14 @@ var selectTokens = {
70
78
  right: spacingSmall,
71
79
  top: '0'
72
80
  }
81
+ },
82
+ label: {
83
+ spacings: {
84
+ left: '0',
85
+ right: '0',
86
+ top: spacingSmall,
87
+ bottom: spacingSmall
88
+ }
73
89
  }
74
90
  }
75
91
  }
@@ -2,13 +2,12 @@ import _objectSpread from '@babel/runtime/helpers/objectSpread2';
2
2
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
3
3
  import { forwardRef } from 'react';
4
4
  import styled, { css } from 'styled-components';
5
- import { List } from '../List/index.js';
6
5
  import { typographyTemplate, spacingsTemplate } from '@equinor/eds-utils';
7
6
  import { jsxs, jsx } from 'react/jsx-runtime';
8
7
  import { Checkbox } from '../Checkbox/Checkbox.js';
9
8
 
10
- var _excluded = ["value", "multiple", "isSelected", "isDisabled", "onClick", "aria-selected"];
11
- var StyledListItem = styled(List.Item).withConfig({
9
+ var _excluded = ["value", "multiple", "isSelected", "isDisabled", "multiline", "onClick", "aria-selected"];
10
+ var StyledListItem = styled.li.withConfig({
12
11
  displayName: "Option__StyledListItem",
13
12
  componentId: "sc-1ly11zu-0"
14
13
  })(function (_ref) {
@@ -17,16 +16,25 @@ var StyledListItem = styled(List.Item).withConfig({
17
16
  active = _ref.active,
18
17
  isdisabled = _ref.isdisabled;
19
18
  var backgroundColor = highlighted === 'true' ? theme.states.hover.background : active === 'true' ? theme.states.active.background : theme.background;
20
- return css(["display:flex;align-items:center;margin:0;list-style:none;background-color:", ";user-select:none;cursor:", ";", " ", " ", ""], backgroundColor, highlighted === 'true' ? 'pointer' : 'default', typographyTemplate(theme.typography), spacingsTemplate(theme.spacings), isdisabled === 'true' ? css(["color:", ";"], theme.states.disabled.typography.color) : '');
19
+ return css(["display:flex;grid-area:1 / -1;align-items:center;align-self:start;margin:0;list-style:none;background-color:", ";user-select:none;overflow:hidden;cursor:", ";", " ", " ", ""], backgroundColor, highlighted === 'true' ? 'pointer' : 'default', typographyTemplate(theme.typography), spacingsTemplate(theme.spacings), isdisabled === 'true' ? css(["color:", ";"], theme.states.disabled.typography.color) : '');
21
20
  });
22
- var AutocompleteOption = /*#__PURE__*/forwardRef(function AutocompleteOption(_ref2, ref) {
23
- var value = _ref2.value,
24
- multiple = _ref2.multiple,
25
- isSelected = _ref2.isSelected,
26
- isDisabled = _ref2.isDisabled,
27
- _onClick = _ref2.onClick,
28
- ariaSelected = _ref2['aria-selected'],
29
- other = _objectWithoutProperties(_ref2, _excluded);
21
+ var Label = styled.span.withConfig({
22
+ displayName: "Option__Label",
23
+ componentId: "sc-1ly11zu-1"
24
+ })(function (_ref2) {
25
+ var theme = _ref2.theme,
26
+ multiline = _ref2.multiline;
27
+ return css(["", " text-overflow:ellipsis;white-space:", ";overflow:", ";overflow-wrap:anywhere;"], spacingsTemplate(theme.entities.label.spacings), multiline ? 'normal' : 'nowrap', multiline ? 'initial' : 'hidden');
28
+ });
29
+ var AutocompleteOption = /*#__PURE__*/forwardRef(function AutocompleteOption(_ref3, ref) {
30
+ var value = _ref3.value,
31
+ multiple = _ref3.multiple,
32
+ isSelected = _ref3.isSelected,
33
+ isDisabled = _ref3.isDisabled,
34
+ multiline = _ref3.multiline,
35
+ _onClick = _ref3.onClick,
36
+ ariaSelected = _ref3['aria-selected'],
37
+ other = _objectWithoutProperties(_ref3, _excluded);
30
38
  return /*#__PURE__*/jsxs(StyledListItem, _objectSpread(_objectSpread({
31
39
  ref: ref,
32
40
  isdisabled: isDisabled ? 'true' : 'false',
@@ -44,7 +52,8 @@ var AutocompleteOption = /*#__PURE__*/forwardRef(function AutocompleteOption(_re
44
52
  onChange: function onChange() {
45
53
  return null;
46
54
  }
47
- }), /*#__PURE__*/jsx("span", {
55
+ }), /*#__PURE__*/jsx(Label, {
56
+ multiline: multiline,
48
57
  children: value
49
58
  })]
50
59
  }));
@@ -42,6 +42,8 @@ export declare type AutocompleteProps<T> = {
42
42
  placeholder?: string;
43
43
  /** Toggle if input is cleared when an options is selected when `multiple` is `true`*/
44
44
  clearSearchOnChange?: boolean;
45
+ /** Will wrap overflowing text at the expence of some performance overhead to calculate item heigths. Mostly relevant in combination with autoWidth */
46
+ multiline?: boolean;
45
47
  } & HTMLAttributes<HTMLDivElement>;
46
48
  declare function AutocompleteInner<T>(props: AutocompleteProps<T>, ref: React.ForwardedRef<HTMLDivElement>): JSX.Element;
47
49
  export declare const Autocomplete: <T>(props: {
@@ -84,6 +86,8 @@ export declare const Autocomplete: <T>(props: {
84
86
  placeholder?: string;
85
87
  /** Toggle if input is cleared when an options is selected when `multiple` is `true`*/
86
88
  clearSearchOnChange?: boolean;
89
+ /** Will wrap overflowing text at the expence of some performance overhead to calculate item heigths. Mostly relevant in combination with autoWidth */
90
+ multiline?: boolean;
87
91
  } & HTMLAttributes<HTMLDivElement> & {
88
92
  ref?: React.ForwardedRef<HTMLDivElement>;
89
93
  displayName?: string | undefined;
@@ -5,6 +5,7 @@ export declare type AutocompleteOptionProps = {
5
5
  highlighted: string;
6
6
  isSelected: boolean;
7
7
  isDisabled?: boolean;
8
+ multiline: boolean;
8
9
  } & LiHTMLAttributes<HTMLLIElement>;
9
10
  export declare const AutocompleteOption: import("react").ForwardRefExoticComponent<{
10
11
  value: string;
@@ -12,4 +13,5 @@ export declare const AutocompleteOption: import("react").ForwardRefExoticCompone
12
13
  highlighted: string;
13
14
  isSelected: boolean;
14
15
  isDisabled?: boolean;
16
+ multiline: boolean;
15
17
  } & LiHTMLAttributes<HTMLLIElement> & import("react").RefAttributes<HTMLLIElement>>;
@@ -11,8 +11,8 @@ export declare type SliderProps = {
11
11
  onChange?: (event: ChangeEvent<HTMLInputElement>, newValue: number[] | number) => void;
12
12
  /** Function to be called when value is committed by mouseup event */
13
13
  onChangeCommitted?: (event: MouseEvent | KeyboardEvent, newValue: number[] | number) => void;
14
- /** Function for formatting the output, e.g. with dates */
15
- outputFunction?: (text: number) => string;
14
+ /** Function for formatting the displayed value. E.g. formatting dates, or adding a unit suffix */
15
+ outputFunction?: (value: number) => string;
16
16
  /** Max value */
17
17
  max?: number;
18
18
  /** Min value */
@@ -38,8 +38,8 @@ export declare const Slider: import("react").ForwardRefExoticComponent<{
38
38
  onChange?: (event: ChangeEvent<HTMLInputElement>, newValue: number[] | number) => void;
39
39
  /** Function to be called when value is committed by mouseup event */
40
40
  onChangeCommitted?: (event: MouseEvent | KeyboardEvent, newValue: number[] | number) => void;
41
- /** Function for formatting the output, e.g. with dates */
42
- outputFunction?: (text: number) => string;
41
+ /** Function for formatting the displayed value. E.g. formatting dates, or adding a unit suffix */
42
+ outputFunction?: (value: number) => string;
43
43
  /** Max value */
44
44
  max?: number;
45
45
  /** Min value */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@equinor/eds-core-react",
3
- "version": "0.27.0",
3
+ "version": "0.28.0-dev12152022",
4
4
  "description": "The React implementation of the Equinor Design System",
5
5
  "sideEffects": [
6
6
  "**/*.css"
@@ -79,11 +79,12 @@
79
79
  },
80
80
  "dependencies": {
81
81
  "@babel/runtime": "^7.19.0",
82
- "@equinor/eds-icons": "0.16.0",
83
- "@equinor/eds-tokens": "0.9.0",
84
- "@equinor/eds-utils": "0.7.0",
85
82
  "@floating-ui/react-dom-interactions": "^0.10.1",
86
- "downshift": "^7.0.1"
83
+ "@tanstack/react-virtual": "3.0.0-beta.30",
84
+ "downshift": "^7.0.1",
85
+ "@equinor/eds-icons": "0.17.0",
86
+ "@equinor/eds-tokens": "0.9.0",
87
+ "@equinor/eds-utils": "0.7.0"
87
88
  },
88
89
  "engines": {
89
90
  "pnpm": ">=4",