@contentful/f36-autocomplete 4.6.0 → 4.7.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # Change Log
2
2
 
3
+ ## 4.7.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`e50b8945`](https://github.com/contentful/forma-36/commit/e50b8945faef7323187e1bd9a2a9cbfcbae2e405)]:
8
+ - @contentful/f36-core@4.7.0
9
+ - @contentful/f36-button@4.7.0
10
+ - @contentful/f36-forms@4.7.0
11
+ - @contentful/f36-icons@4.7.0
12
+ - @contentful/f36-popover@4.7.0
13
+ - @contentful/f36-skeleton@4.7.0
14
+ - @contentful/f36-typography@4.7.0
15
+ - @contentful/f36-utils@4.7.0
16
+
17
+ ## 4.6.2
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies []:
22
+ - @contentful/f36-button@4.6.2
23
+ - @contentful/f36-forms@4.6.2
24
+ - @contentful/f36-icons@4.6.2
25
+ - @contentful/f36-popover@4.6.2
26
+ - @contentful/f36-skeleton@4.6.2
27
+ - @contentful/f36-typography@4.6.2
28
+ - @contentful/f36-utils@4.6.2
29
+ - @contentful/f36-core@4.6.2
30
+
31
+ ## 4.6.1
32
+
33
+ ### Patch Changes
34
+
35
+ - Updated dependencies []:
36
+ - @contentful/f36-button@4.6.1
37
+ - @contentful/f36-forms@4.6.1
38
+ - @contentful/f36-icons@4.6.1
39
+ - @contentful/f36-popover@4.6.1
40
+ - @contentful/f36-skeleton@4.6.1
41
+ - @contentful/f36-typography@4.6.1
42
+ - @contentful/f36-utils@4.6.1
43
+ - @contentful/f36-core@4.6.1
44
+
3
45
  ## 4.6.0
4
46
 
5
47
  ### Patch Changes
package/dist/main.js CHANGED
@@ -96,7 +96,7 @@ const $e938248654439d1d$export$71b73d9f7d678746 = (listMaxHeight)=>({
96
96
  function $26b30f0765231b47$export$4db5c29873bb228f(props) {
97
97
  const { items: items , elementStartIndex: elementStartIndex , highlightedIndex: highlightedIndex , getItemProps: getItemProps , renderItem: renderItem , inputValue: inputValue , listMaxHeight: listMaxHeight = 180 } = props;
98
98
  const styles = $e938248654439d1d$export$71b73d9f7d678746(listMaxHeight);
99
- return(/*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement("ul", {
99
+ return /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement("ul", {
100
100
  className: styles.list,
101
101
  "data-test-id": "cf-autocomplete-list"
102
102
  }, items.map((item, index)=>{
@@ -105,7 +105,7 @@ function $26b30f0765231b47$export$4db5c29873bb228f(props) {
105
105
  item: item,
106
106
  index: itemIndex
107
107
  });
108
- return(/*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement($hVoOH$contentfulf36typography.Text, {
108
+ return /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement($hVoOH$contentfulf36typography.Text, {
109
109
  ...itemProps,
110
110
  as: "li",
111
111
  key: itemIndex,
@@ -117,13 +117,13 @@ function $26b30f0765231b47$export$4db5c29873bb228f(props) {
117
117
  }, renderItem ? renderItem(item, inputValue) : typeof item === 'string' ? /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement($26b30f0765231b47$var$HighlightedItem, {
118
118
  item: item,
119
119
  inputValue: inputValue
120
- }) : item));
121
- })));
120
+ }) : item);
121
+ }));
122
122
  }
123
123
  $26b30f0765231b47$export$4db5c29873bb228f.displayName = 'AutocompleteItems';
124
124
  function $26b30f0765231b47$var$HighlightedItem({ item: item , inputValue: inputValue }) {
125
125
  const { before: before , match: match , after: after } = $hVoOH$contentfulf36utils.getStringMatch(item, inputValue);
126
- return(/*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement(($parcel$interopDefault($hVoOH$react)).Fragment, null, before, /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement("b", null, match), after));
126
+ return /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement(($parcel$interopDefault($hVoOH$react)).Fragment, null, before, /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement("b", null, match), after);
127
127
  }
128
128
  $26b30f0765231b47$var$HighlightedItem.displayName = 'HighlightedItem';
129
129
 
@@ -177,7 +177,7 @@ function $56e6e764f18116b7$var$_Autocomplete(props, ref) {
177
177
  const toggleProps = getToggleButtonProps();
178
178
  const menuProps = getMenuProps();
179
179
  let elementStartIndex = 0;
180
- return(/*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement("div", {
180
+ return /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement("div", {
181
181
  "data-test-id": testId,
182
182
  className: $hVoOH$emotion.cx(styles.autocomplete, className),
183
183
  ref: ref
@@ -270,14 +270,14 @@ function $56e6e764f18116b7$var$_Autocomplete(props, ref) {
270
270
  getItemProps: getItemProps,
271
271
  renderItem: renderItem,
272
272
  inputValue: inputValue1
273
- })))));
273
+ }))));
274
274
  }
275
275
  const $56e6e764f18116b7$var$ListItemLoadingState = ()=>{
276
- return(/*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement($hVoOH$contentfulf36skeleton.SkeletonContainer, {
276
+ return /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement($hVoOH$contentfulf36skeleton.SkeletonContainer, {
277
277
  svgHeight: 16
278
278
  }, /*#__PURE__*/ ($parcel$interopDefault($hVoOH$react)).createElement($hVoOH$contentfulf36skeleton.SkeletonBodyText, {
279
279
  numberOfLines: 1
280
- })));
280
+ }));
281
281
  }; // This is required to infer correct typings when differentiating groups and items
282
282
  function $56e6e764f18116b7$var$isUsingGroups(isGrouped, items) {
283
283
  return isGrouped;
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/components/autocomplete/src/index.ts","packages/components/autocomplete/src/Autocomplete.tsx","packages/components/autocomplete/src/AutocompleteItems.tsx","packages/components/autocomplete/src/Autocomplete.styles.ts"],"sourcesContent":["export { Autocomplete } from './Autocomplete';\nexport type { AutocompleteProps } from './Autocomplete';\n","import React, { useCallback, useState } from 'react';\nimport { cx } from 'emotion';\nimport { useCombobox } from 'downshift';\n\nimport { mergeRefs } from '@contentful/f36-core';\nimport type { CommonProps, ExpandProps } from '@contentful/f36-core';\nimport { IconButton } from '@contentful/f36-button';\nimport { TextInput } from '@contentful/f36-forms';\nimport type { TextInputProps } from '@contentful/f36-forms';\nimport { CloseIcon, ChevronDownIcon } from '@contentful/f36-icons';\nimport { SkeletonContainer, SkeletonBodyText } from '@contentful/f36-skeleton';\nimport { Popover } from '@contentful/f36-popover';\nimport { Subheading, SectionHeading } from '@contentful/f36-typography';\n\nimport { AutocompleteItems } from './AutocompleteItems';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\n\nexport interface GenericGroupType<ItemType> {\n groupTitle: string;\n options: ItemType[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface AutocompleteProps<ItemType>\n extends CommonProps,\n Pick<\n TextInputProps,\n | 'isDisabled'\n | 'isInvalid'\n | 'isReadOnly'\n | 'isRequired'\n | 'id'\n | 'defaultValue'\n > {\n /**\n * It’s an array of data to be used as \"options\" by the autocomplete component.\n * This can either be a plain list of items or a list of groups of items.\n */\n items: ItemType[] | GenericGroupType<ItemType>[];\n\n /**\n * Tells if the item is a object with groups\n */\n isGrouped?: boolean;\n\n /**\n * Function called whenever the input value changes\n */\n onInputValueChange?: (value: string) => void;\n /**\n * This is the function that will be called when the user selects one of the \"options\" in the list.\n * The component will pass the selected \"item\" as an argument to the function..\n */\n onSelectItem: (item: ItemType) => void;\n /**\n * This is the function that will be called for each \"item\" passed in the `items` prop.\n * It receives the \"item\" and \"inputValue\" as arguments and returns a ReactNode.\n * The inputValue is passed in case you want to highlight the match on the render.\n */\n renderItem?: (item: ItemType, inputValue: string) => React.ReactNode;\n /**\n * When using objects as `items`, we recommend passing a function that tells Downshift how to extract a string\n * from those objetcs to be used as inputValue\n */\n itemToString?: (item: ItemType) => string;\n /**\n * If this is set to `true` the text input will be cleared after an item is selected\n * @default false\n */\n clearAfterSelect?: boolean;\n /**\n * This is the value will be passed to the `placeholder` prop of the input.\n * @default \"Search\"\n */\n placeholder?: string;\n /**\n * A message that will be shown when it is not possible to find any option that matches the input value\n * @default \"No matches\"\n */\n noMatchesMessage?: string;\n /**\n * Use this prop to get a ref to the input element of the component\n */\n inputRef?: React.Ref<HTMLInputElement>;\n /**\n * Use this prop to get a ref to the toggle button of the component\n */\n toggleRef?: React.Ref<HTMLButtonElement>;\n /**\n * Use this prop to get a ref to the list of items of the component\n */\n listRef?: React.Ref<HTMLUListElement>;\n /**\n * It sets the width of the list\n * @default \"auto\"\n */\n listWidth?: 'auto' | 'full';\n /**\n * It sets the max-height, in pixels, of the list\n * The default value is the height of 5 single line items\n * @default 180\n */\n listMaxHeight?: number;\n /**\n * Sets the list to show its loading state\n * @default false\n */\n isLoading?: boolean;\n /**\n * Boolean to control whether or not to render the suggestions box in a React Portal.\n * Rendering content inside a Portal allows the suggestions box to escape the bounds\n * of its parent while still being positioned correctly.\n * Defaults to `false`\n */\n usePortal?: boolean;\n}\n\nfunction _Autocomplete<ItemType>(\n props: AutocompleteProps<ItemType>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const {\n id,\n className,\n clearAfterSelect = false,\n defaultValue = '',\n items,\n onInputValueChange,\n onSelectItem,\n renderItem,\n itemToString = (item: ItemType) => (item as unknown) as string,\n isInvalid,\n isDisabled,\n isRequired,\n isReadOnly,\n noMatchesMessage = 'No matches found',\n placeholder = 'Search',\n inputRef,\n toggleRef,\n listRef,\n listWidth = 'auto',\n listMaxHeight = 180,\n isGrouped = false,\n isLoading = false,\n usePortal = false,\n testId = 'cf-autocomplete',\n } = props;\n\n type GroupType = GenericGroupType<ItemType>;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n const [inputValue, setInputValue] = useState(defaultValue);\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n\n onInputValueChange?.(value);\n },\n [onInputValueChange],\n );\n\n // Handle manually to avoid a jumping cursor, see https://github.com/downshift-js/downshift/issues/1108#issuecomment-842407759\n const handleNativeChangeEvent = useCallback(\n (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = event.target.value;\n handleInputValueChange(value);\n },\n [handleInputValueChange],\n );\n\n const flattenItems = isUsingGroups(isGrouped, items)\n ? items.reduce(\n (acc: ItemType[], group: GroupType) => [...acc, ...group.options],\n [],\n )\n : items;\n\n const isShowingNoMatches = isUsingGroups(isGrouped, items)\n ? items.every((group: GroupType) => group.options.length === 0)\n : items.length === 0;\n\n const {\n getComboboxProps,\n getInputProps,\n getItemProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n isOpen,\n toggleMenu,\n } = useCombobox({\n items: flattenItems,\n inputValue,\n itemToString,\n onInputValueChange: ({ type, inputValue }) => {\n if (type !== '__input_change__') {\n handleInputValueChange(inputValue);\n }\n },\n onStateChange: ({ type, selectedItem }) => {\n switch (type) {\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n if (selectedItem) {\n onSelectItem(selectedItem);\n }\n if (clearAfterSelect) {\n handleInputValueChange('');\n }\n break;\n default:\n break;\n }\n },\n });\n\n const {\n 'aria-labelledby': _labelledby,\n id: _inputId,\n ...inputProps\n } = getInputProps();\n const comboboxProps = getComboboxProps();\n const toggleProps = getToggleButtonProps();\n const menuProps = getMenuProps();\n let elementStartIndex = 0;\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles.autocomplete, className)}\n ref={ref}\n >\n <Popover\n usePortal={usePortal}\n isOpen={isOpen}\n isFullWidth={listWidth === 'full'}\n renderOnlyWhenOpen={false}\n // This is necessary, otherwise the focus will change from the input to the Popover\n // and the user won't be able to type in the input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={false}\n id={menuProps.id}\n >\n <Popover.Trigger>\n <div {...comboboxProps} className={styles.combobox}>\n <TextInput\n {...inputProps}\n onFocus={() => {\n if (!isOpen) {\n toggleMenu();\n }\n }}\n id={id}\n isInvalid={isInvalid}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n ref={mergeRefs(inputProps.ref, inputRef)}\n testId=\"cf-autocomplete-input\"\n placeholder={placeholder}\n onChange={(event) => {\n inputProps.onChange(event);\n handleNativeChangeEvent(event);\n }}\n />\n <IconButton\n {...toggleProps}\n ref={mergeRefs(toggleProps.ref, toggleRef)}\n aria-label=\"toggle menu\"\n className={styles.toggleButton}\n variant=\"transparent\"\n icon={\n inputValue ? (\n <CloseIcon aria-label=\"Clear\" variant=\"muted\" />\n ) : (\n <ChevronDownIcon aria-label=\"Show list\" variant=\"muted\" />\n )\n }\n onClick={() => {\n if (inputValue) {\n handleInputValueChange('');\n } else {\n toggleMenu();\n }\n }}\n isDisabled={isDisabled}\n size=\"small\"\n />\n </div>\n </Popover.Trigger>\n\n <Popover.Content\n {...menuProps}\n ref={mergeRefs(menuProps.ref, listRef)}\n className={styles.content}\n testId=\"cf-autocomplete-container\"\n >\n {isLoading &&\n [...Array(3)].map((_, index) => (\n <div key={index} className={cx(styles.item, styles.disabled)}>\n <ListItemLoadingState />\n </div>\n ))}\n\n {!isLoading && isShowingNoMatches && (\n <div className={styles.item}>\n <Subheading className={styles.noMatchesTitle}>\n {noMatchesMessage}\n </Subheading>\n </div>\n )}\n\n {!isLoading &&\n isUsingGroups(isGrouped, items) &&\n items.map((group: GroupType, index: number) => {\n if (group.options.length < 1) {\n return;\n }\n const render = (\n <div key={index}>\n <SectionHeading\n key={index}\n data-test-id=\"cf-autocomplete-grouptitle\"\n marginBottom=\"none\"\n className={styles.groupTitle}\n >\n {group.groupTitle}\n </SectionHeading>\n <AutocompleteItems<ItemType>\n items={group.options}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n elementStartIndex={elementStartIndex}\n />\n </div>\n );\n elementStartIndex += group.options.length;\n return render;\n })}\n\n {!isLoading &&\n !isUsingGroups(isGrouped, items) &&\n items.length > 0 && (\n <AutocompleteItems<ItemType>\n items={items}\n elementStartIndex={elementStartIndex}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n />\n )}\n </Popover.Content>\n </Popover>\n </div>\n );\n}\n\nconst ListItemLoadingState = () => {\n return (\n <SkeletonContainer svgHeight={16}>\n <SkeletonBodyText numberOfLines={1} />\n </SkeletonContainer>\n );\n};\n\n// This is required to infer correct typings when differentiating groups and items\nfunction isUsingGroups<ItemType>(\n isGrouped: boolean,\n items: ItemType[] | GenericGroupType<ItemType>[],\n): items is GenericGroupType<ItemType>[] {\n return isGrouped;\n}\n\n/**\n * The Autocomplete is a component that will show a `TextInput` where a user can type any word which will be used\n * to filter a list of items. That list of filtered items will be shown to the user as possible options for the input.\n * Once one of the options is selected, that option becomes the value of the `TextInput`.\n */\nexport const Autocomplete = React.forwardRef(_Autocomplete) as <T>(\n props: ExpandProps<AutocompleteProps<T>> & {\n ref?: React.Ref<HTMLDivElement>;\n },\n) => ReturnType<typeof _Autocomplete>;\n","import React, { HTMLAttributes } from 'react';\nimport { cx } from 'emotion';\n\nimport { getStringMatch } from '@contentful/f36-utils';\nimport { Text } from '@contentful/f36-typography';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\nimport type { UseComboboxGetItemPropsOptions } from 'downshift';\n\ninterface AutocompleteItemsProps<ItemType> {\n items: ItemType[];\n elementStartIndex: number;\n highlightedIndex: number;\n getItemProps: (\n options: UseComboboxGetItemPropsOptions<ItemType>,\n ) => HTMLAttributes<HTMLLIElement>;\n renderItem: (item: ItemType, inputValue: string) => React.ReactNode;\n inputValue: string;\n listMaxHeight?: number;\n}\n\nexport function AutocompleteItems<ItemType>(\n props: AutocompleteItemsProps<ItemType>,\n) {\n const {\n items,\n elementStartIndex,\n highlightedIndex,\n getItemProps,\n renderItem,\n inputValue,\n listMaxHeight = 180,\n } = props;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n return (\n <ul className={styles.list} data-test-id=\"cf-autocomplete-list\">\n {items.map((item: ItemType, index: number) => {\n const itemIndex = elementStartIndex + index;\n const itemProps = getItemProps({ item, index: itemIndex });\n return (\n <Text\n {...itemProps}\n as=\"li\"\n key={itemIndex}\n className={cx([\n styles.item,\n highlightedIndex === itemIndex && styles.highlighted,\n ])}\n data-test-id={`cf-autocomplete-list-item-${itemIndex}`}\n >\n {renderItem ? (\n renderItem(item, inputValue)\n ) : typeof item === 'string' ? (\n <HighlightedItem item={item} inputValue={inputValue} />\n ) : (\n item\n )}\n </Text>\n );\n })}\n </ul>\n );\n}\n\nAutocompleteItems.displayName = 'AutocompleteItems';\n\nfunction HighlightedItem({\n item,\n inputValue,\n}: {\n item: string;\n inputValue: string;\n}) {\n const { before, match, after } = getStringMatch(item, inputValue);\n\n return (\n <>\n {before}\n <b>{match}</b>\n {after}\n </>\n );\n}\n\nHighlightedItem.displayName = 'HighlightedItem';\n","import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getAutocompleteStyles = (listMaxHeight: number) => ({\n autocomplete: css({\n position: 'relative',\n width: '100%',\n }),\n combobox: css({\n position: 'relative',\n }),\n toggleButton: css({\n position: 'absolute',\n top: '4px',\n right: '4px',\n zIndex: 1,\n padding: tokens.spacing2Xs,\n }),\n content: css({\n overflow: 'auto',\n maxHeight: `${listMaxHeight}px`,\n }),\n list: css({\n listStyle: 'none',\n padding: `${tokens.spacingXs} 0`,\n margin: 0,\n }),\n groupTitle: css({\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n lineHeight: tokens.lineHeightM,\n }),\n noMatchesTitle: css({\n color: tokens.gray500,\n margin: `${tokens.spacingM} 0 ${tokens.spacingM} 0`,\n }),\n item: css({\n display: 'block',\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n wordBreak: 'break-word',\n whiteSpace: 'break-spaces',\n cursor: 'pointer',\n hyphens: 'auto',\n\n '&:focus, &:hover': {\n backgroundColor: tokens.gray100,\n },\n '&:active': {\n backgroundColor: tokens.gray200,\n },\n }),\n disabled: css({\n opacity: 0.5,\n pointerEvents: 'none',\n }),\n highlighted: css({\n backgroundColor: tokens.gray100,\n }),\n});\n"],"names":["Autocomplete","AutocompleteProps","React","useCallback","useState","useCombobox","mergeRefs","CommonProps","ExpandProps","IconButton","TextInput","TextInputProps","CloseIcon","ChevronDownIcon","SkeletonContainer","SkeletonBodyText","Popover","Subheading","SectionHeading","AutocompleteItems","getAutocompleteStyles","GenericGroupType","groupTitle","options","ItemType","Pick","items","isGrouped","onInputValueChange","value","onSelectItem","item","renderItem","inputValue","ReactNode","itemToString","clearAfterSelect","placeholder","noMatchesMessage","inputRef","Ref","HTMLInputElement","toggleRef","HTMLButtonElement","listRef","HTMLUListElement","listWidth","listMaxHeight","isLoading","usePortal","_Autocomplete","props","ref","HTMLDivElement","id","className","defaultValue","isInvalid","isDisabled","isRequired","isReadOnly","testId","GroupType","styles","setInputValue","handleInputValueChange","handleNativeChangeEvent","event","ChangeEvent","HTMLTextAreaElement","target","flattenItems","isUsingGroups","reduce","acc","group","isShowingNoMatches","every","length","getComboboxProps","getInputProps","getItemProps","getMenuProps","getToggleButtonProps","highlightedIndex","isOpen","toggleMenu","type","onStateChange","selectedItem","stateChangeTypes","InputKeyDownEnter","ItemClick","_labelledby","_inputId","inputProps","comboboxProps","toggleProps","menuProps","elementStartIndex","autocomplete","combobox","onChange","toggleButton","content","Array","map","_","index","disabled","noMatchesTitle","render","ListItemLoadingState","forwardRef","T","ReturnType","HTMLAttributes","getStringMatch","Text","UseComboboxGetItemPropsOptions","AutocompleteItemsProps","HTMLLIElement","list","itemIndex","itemProps","highlighted","displayName","HighlightedItem","before","match","after","tokens","position","top","right","zIndex","padding","spacing2Xs","overflow","maxHeight","listStyle","spacingXs","margin","spacingM","lineHeight","lineHeightM","color","gray500","display","wordBreak","whiteSpace","cursor","hyphens","backgroundColor","gray100","gray200"],"version":3,"file":"main.js.map"}
1
+ {"mappings":"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","sources":["packages/components/autocomplete/src/index.ts","packages/components/autocomplete/src/Autocomplete.tsx","packages/components/autocomplete/src/AutocompleteItems.tsx","packages/components/autocomplete/src/Autocomplete.styles.ts"],"sourcesContent":["export { Autocomplete } from './Autocomplete';\nexport type { AutocompleteProps } from './Autocomplete';\n","import React, { useCallback, useState } from 'react';\nimport { cx } from 'emotion';\nimport { useCombobox } from 'downshift';\n\nimport { mergeRefs } from '@contentful/f36-core';\nimport type { CommonProps, ExpandProps } from '@contentful/f36-core';\nimport { IconButton } from '@contentful/f36-button';\nimport { TextInput } from '@contentful/f36-forms';\nimport type { TextInputProps } from '@contentful/f36-forms';\nimport { CloseIcon, ChevronDownIcon } from '@contentful/f36-icons';\nimport { SkeletonContainer, SkeletonBodyText } from '@contentful/f36-skeleton';\nimport { Popover } from '@contentful/f36-popover';\nimport { Subheading, SectionHeading } from '@contentful/f36-typography';\n\nimport { AutocompleteItems } from './AutocompleteItems';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\n\nexport interface GenericGroupType<ItemType> {\n groupTitle: string;\n options: ItemType[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface AutocompleteProps<ItemType>\n extends CommonProps,\n Pick<\n TextInputProps,\n | 'isDisabled'\n | 'isInvalid'\n | 'isReadOnly'\n | 'isRequired'\n | 'id'\n | 'defaultValue'\n > {\n /**\n * It’s an array of data to be used as \"options\" by the autocomplete component.\n * This can either be a plain list of items or a list of groups of items.\n */\n items: ItemType[] | GenericGroupType<ItemType>[];\n\n /**\n * Tells if the item is a object with groups\n */\n isGrouped?: boolean;\n\n /**\n * Function called whenever the input value changes\n */\n onInputValueChange?: (value: string) => void;\n /**\n * This is the function that will be called when the user selects one of the \"options\" in the list.\n * The component will pass the selected \"item\" as an argument to the function..\n */\n onSelectItem: (item: ItemType) => void;\n /**\n * This is the function that will be called for each \"item\" passed in the `items` prop.\n * It receives the \"item\" and \"inputValue\" as arguments and returns a ReactNode.\n * The inputValue is passed in case you want to highlight the match on the render.\n */\n renderItem?: (item: ItemType, inputValue: string) => React.ReactNode;\n /**\n * When using objects as `items`, we recommend passing a function that tells Downshift how to extract a string\n * from those objetcs to be used as inputValue\n */\n itemToString?: (item: ItemType) => string;\n /**\n * If this is set to `true` the text input will be cleared after an item is selected\n * @default false\n */\n clearAfterSelect?: boolean;\n /**\n * This is the value will be passed to the `placeholder` prop of the input.\n * @default \"Search\"\n */\n placeholder?: string;\n /**\n * A message that will be shown when it is not possible to find any option that matches the input value\n * @default \"No matches\"\n */\n noMatchesMessage?: string;\n /**\n * Use this prop to get a ref to the input element of the component\n */\n inputRef?: React.Ref<HTMLInputElement>;\n /**\n * Use this prop to get a ref to the toggle button of the component\n */\n toggleRef?: React.Ref<HTMLButtonElement>;\n /**\n * Use this prop to get a ref to the list of items of the component\n */\n listRef?: React.Ref<HTMLUListElement>;\n /**\n * It sets the width of the list\n * @default \"auto\"\n */\n listWidth?: 'auto' | 'full';\n /**\n * It sets the max-height, in pixels, of the list\n * The default value is the height of 5 single line items\n * @default 180\n */\n listMaxHeight?: number;\n /**\n * Sets the list to show its loading state\n * @default false\n */\n isLoading?: boolean;\n /**\n * Boolean to control whether or not to render the suggestions box in a React Portal.\n * Rendering content inside a Portal allows the suggestions box to escape the bounds\n * of its parent while still being positioned correctly.\n * Defaults to `false`\n */\n usePortal?: boolean;\n}\n\nfunction _Autocomplete<ItemType>(\n props: AutocompleteProps<ItemType>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const {\n id,\n className,\n clearAfterSelect = false,\n defaultValue = '',\n items,\n onInputValueChange,\n onSelectItem,\n renderItem,\n itemToString = (item: ItemType) => (item as unknown) as string,\n isInvalid,\n isDisabled,\n isRequired,\n isReadOnly,\n noMatchesMessage = 'No matches found',\n placeholder = 'Search',\n inputRef,\n toggleRef,\n listRef,\n listWidth = 'auto',\n listMaxHeight = 180,\n isGrouped = false,\n isLoading = false,\n usePortal = false,\n testId = 'cf-autocomplete',\n } = props;\n\n type GroupType = GenericGroupType<ItemType>;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n const [inputValue, setInputValue] = useState(defaultValue);\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n\n onInputValueChange?.(value);\n },\n [onInputValueChange],\n );\n\n // Handle manually to avoid a jumping cursor, see https://github.com/downshift-js/downshift/issues/1108#issuecomment-842407759\n const handleNativeChangeEvent = useCallback(\n (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = event.target.value;\n handleInputValueChange(value);\n },\n [handleInputValueChange],\n );\n\n const flattenItems = isUsingGroups(isGrouped, items)\n ? items.reduce(\n (acc: ItemType[], group: GroupType) => [...acc, ...group.options],\n [],\n )\n : items;\n\n const isShowingNoMatches = isUsingGroups(isGrouped, items)\n ? items.every((group: GroupType) => group.options.length === 0)\n : items.length === 0;\n\n const {\n getComboboxProps,\n getInputProps,\n getItemProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n isOpen,\n toggleMenu,\n } = useCombobox({\n items: flattenItems,\n inputValue,\n itemToString,\n onInputValueChange: ({ type, inputValue }) => {\n if (type !== '__input_change__') {\n handleInputValueChange(inputValue);\n }\n },\n onStateChange: ({ type, selectedItem }) => {\n switch (type) {\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n if (selectedItem) {\n onSelectItem(selectedItem);\n }\n if (clearAfterSelect) {\n handleInputValueChange('');\n }\n break;\n default:\n break;\n }\n },\n });\n\n const {\n 'aria-labelledby': _labelledby,\n id: _inputId,\n ...inputProps\n } = getInputProps();\n const comboboxProps = getComboboxProps();\n const toggleProps = getToggleButtonProps();\n const menuProps = getMenuProps();\n let elementStartIndex = 0;\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles.autocomplete, className)}\n ref={ref}\n >\n <Popover\n usePortal={usePortal}\n isOpen={isOpen}\n isFullWidth={listWidth === 'full'}\n renderOnlyWhenOpen={false}\n // This is necessary, otherwise the focus will change from the input to the Popover\n // and the user won't be able to type in the input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={false}\n id={menuProps.id}\n >\n <Popover.Trigger>\n <div {...comboboxProps} className={styles.combobox}>\n <TextInput\n {...inputProps}\n onFocus={() => {\n if (!isOpen) {\n toggleMenu();\n }\n }}\n id={id}\n isInvalid={isInvalid}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n ref={mergeRefs(inputProps.ref, inputRef)}\n testId=\"cf-autocomplete-input\"\n placeholder={placeholder}\n onChange={(event) => {\n inputProps.onChange(event);\n handleNativeChangeEvent(event);\n }}\n />\n <IconButton\n {...toggleProps}\n ref={mergeRefs(toggleProps.ref, toggleRef)}\n aria-label=\"toggle menu\"\n className={styles.toggleButton}\n variant=\"transparent\"\n icon={\n inputValue ? (\n <CloseIcon aria-label=\"Clear\" variant=\"muted\" />\n ) : (\n <ChevronDownIcon aria-label=\"Show list\" variant=\"muted\" />\n )\n }\n onClick={() => {\n if (inputValue) {\n handleInputValueChange('');\n } else {\n toggleMenu();\n }\n }}\n isDisabled={isDisabled}\n size=\"small\"\n />\n </div>\n </Popover.Trigger>\n\n <Popover.Content\n {...menuProps}\n ref={mergeRefs(menuProps.ref, listRef)}\n className={styles.content}\n testId=\"cf-autocomplete-container\"\n >\n {isLoading &&\n [...Array(3)].map((_, index) => (\n <div key={index} className={cx(styles.item, styles.disabled)}>\n <ListItemLoadingState />\n </div>\n ))}\n\n {!isLoading && isShowingNoMatches && (\n <div className={styles.item}>\n <Subheading className={styles.noMatchesTitle}>\n {noMatchesMessage}\n </Subheading>\n </div>\n )}\n\n {!isLoading &&\n isUsingGroups(isGrouped, items) &&\n items.map((group: GroupType, index: number) => {\n if (group.options.length < 1) {\n return;\n }\n const render = (\n <div key={index}>\n <SectionHeading\n key={index}\n data-test-id=\"cf-autocomplete-grouptitle\"\n marginBottom=\"none\"\n className={styles.groupTitle}\n >\n {group.groupTitle}\n </SectionHeading>\n <AutocompleteItems<ItemType>\n items={group.options}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n elementStartIndex={elementStartIndex}\n />\n </div>\n );\n elementStartIndex += group.options.length;\n return render;\n })}\n\n {!isLoading &&\n !isUsingGroups(isGrouped, items) &&\n items.length > 0 && (\n <AutocompleteItems<ItemType>\n items={items}\n elementStartIndex={elementStartIndex}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n />\n )}\n </Popover.Content>\n </Popover>\n </div>\n );\n}\n\nconst ListItemLoadingState = () => {\n return (\n <SkeletonContainer svgHeight={16}>\n <SkeletonBodyText numberOfLines={1} />\n </SkeletonContainer>\n );\n};\n\n// This is required to infer correct typings when differentiating groups and items\nfunction isUsingGroups<ItemType>(\n isGrouped: boolean,\n items: ItemType[] | GenericGroupType<ItemType>[],\n): items is GenericGroupType<ItemType>[] {\n return isGrouped;\n}\n\n/**\n * The Autocomplete is a component that will show a `TextInput` where a user can type any word which will be used\n * to filter a list of items. That list of filtered items will be shown to the user as possible options for the input.\n * Once one of the options is selected, that option becomes the value of the `TextInput`.\n */\nexport const Autocomplete = React.forwardRef(_Autocomplete) as <T>(\n props: ExpandProps<AutocompleteProps<T>> & {\n ref?: React.Ref<HTMLDivElement>;\n },\n) => ReturnType<typeof _Autocomplete>;\n","import React, { HTMLAttributes } from 'react';\nimport { cx } from 'emotion';\n\nimport { getStringMatch } from '@contentful/f36-utils';\nimport { Text } from '@contentful/f36-typography';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\nimport type { UseComboboxGetItemPropsOptions } from 'downshift';\n\ninterface AutocompleteItemsProps<ItemType> {\n items: ItemType[];\n elementStartIndex: number;\n highlightedIndex: number;\n getItemProps: (\n options: UseComboboxGetItemPropsOptions<ItemType>,\n ) => HTMLAttributes<HTMLLIElement>;\n renderItem: (item: ItemType, inputValue: string) => React.ReactNode;\n inputValue: string;\n listMaxHeight?: number;\n}\n\nexport function AutocompleteItems<ItemType>(\n props: AutocompleteItemsProps<ItemType>,\n) {\n const {\n items,\n elementStartIndex,\n highlightedIndex,\n getItemProps,\n renderItem,\n inputValue,\n listMaxHeight = 180,\n } = props;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n return (\n <ul className={styles.list} data-test-id=\"cf-autocomplete-list\">\n {items.map((item: ItemType, index: number) => {\n const itemIndex = elementStartIndex + index;\n const itemProps = getItemProps({ item, index: itemIndex });\n return (\n <Text\n {...itemProps}\n as=\"li\"\n key={itemIndex}\n className={cx([\n styles.item,\n highlightedIndex === itemIndex && styles.highlighted,\n ])}\n data-test-id={`cf-autocomplete-list-item-${itemIndex}`}\n >\n {renderItem ? (\n renderItem(item, inputValue)\n ) : typeof item === 'string' ? (\n <HighlightedItem item={item} inputValue={inputValue} />\n ) : (\n item\n )}\n </Text>\n );\n })}\n </ul>\n );\n}\n\nAutocompleteItems.displayName = 'AutocompleteItems';\n\nfunction HighlightedItem({\n item,\n inputValue,\n}: {\n item: string;\n inputValue: string;\n}) {\n const { before, match, after } = getStringMatch(item, inputValue);\n\n return (\n <>\n {before}\n <b>{match}</b>\n {after}\n </>\n );\n}\n\nHighlightedItem.displayName = 'HighlightedItem';\n","import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getAutocompleteStyles = (listMaxHeight: number) => ({\n autocomplete: css({\n position: 'relative',\n width: '100%',\n }),\n combobox: css({\n position: 'relative',\n }),\n toggleButton: css({\n position: 'absolute',\n top: '4px',\n right: '4px',\n zIndex: 1,\n padding: tokens.spacing2Xs,\n }),\n content: css({\n overflow: 'auto',\n maxHeight: `${listMaxHeight}px`,\n }),\n list: css({\n listStyle: 'none',\n padding: `${tokens.spacingXs} 0`,\n margin: 0,\n }),\n groupTitle: css({\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n lineHeight: tokens.lineHeightM,\n }),\n noMatchesTitle: css({\n color: tokens.gray500,\n margin: `${tokens.spacingM} 0 ${tokens.spacingM} 0`,\n }),\n item: css({\n display: 'block',\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n wordBreak: 'break-word',\n whiteSpace: 'break-spaces',\n cursor: 'pointer',\n hyphens: 'auto',\n\n '&:focus, &:hover': {\n backgroundColor: tokens.gray100,\n },\n '&:active': {\n backgroundColor: tokens.gray200,\n },\n }),\n disabled: css({\n opacity: 0.5,\n pointerEvents: 'none',\n }),\n highlighted: css({\n backgroundColor: tokens.gray100,\n }),\n});\n"],"names":["Autocomplete","AutocompleteProps","React","useCallback","useState","useCombobox","mergeRefs","CommonProps","ExpandProps","IconButton","TextInput","TextInputProps","CloseIcon","ChevronDownIcon","SkeletonContainer","SkeletonBodyText","Popover","Subheading","SectionHeading","AutocompleteItems","getAutocompleteStyles","GenericGroupType","groupTitle","options","ItemType","Pick","items","isGrouped","onInputValueChange","value","onSelectItem","item","renderItem","inputValue","ReactNode","itemToString","clearAfterSelect","placeholder","noMatchesMessage","inputRef","Ref","HTMLInputElement","toggleRef","HTMLButtonElement","listRef","HTMLUListElement","listWidth","listMaxHeight","isLoading","usePortal","_Autocomplete","props","ref","HTMLDivElement","id","className","defaultValue","isInvalid","isDisabled","isRequired","isReadOnly","testId","GroupType","styles","setInputValue","handleInputValueChange","handleNativeChangeEvent","event","ChangeEvent","HTMLTextAreaElement","target","flattenItems","isUsingGroups","reduce","acc","group","isShowingNoMatches","every","length","getComboboxProps","getInputProps","getItemProps","getMenuProps","getToggleButtonProps","highlightedIndex","isOpen","toggleMenu","type","onStateChange","selectedItem","stateChangeTypes","InputKeyDownEnter","ItemClick","_labelledby","_inputId","inputProps","comboboxProps","toggleProps","menuProps","elementStartIndex","autocomplete","combobox","onChange","toggleButton","content","Array","map","_","index","disabled","noMatchesTitle","render","ListItemLoadingState","forwardRef","T","ReturnType","HTMLAttributes","getStringMatch","Text","UseComboboxGetItemPropsOptions","AutocompleteItemsProps","HTMLLIElement","list","itemIndex","itemProps","highlighted","displayName","HighlightedItem","before","match","after","tokens","position","top","right","zIndex","padding","spacing2Xs","overflow","maxHeight","listStyle","spacingXs","margin","spacingM","lineHeight","lineHeightM","color","gray500","display","wordBreak","whiteSpace","cursor","hyphens","backgroundColor","gray100","gray200"],"version":3,"file":"main.js.map"}
package/dist/module.js CHANGED
@@ -88,7 +88,7 @@ const $b76be67e84921f58$export$71b73d9f7d678746 = (listMaxHeight)=>({
88
88
  function $641c6dc49f14cfd8$export$4db5c29873bb228f(props) {
89
89
  const { items: items , elementStartIndex: elementStartIndex , highlightedIndex: highlightedIndex , getItemProps: getItemProps , renderItem: renderItem , inputValue: inputValue , listMaxHeight: listMaxHeight = 180 } = props;
90
90
  const styles = $b76be67e84921f58$export$71b73d9f7d678746(listMaxHeight);
91
- return(/*#__PURE__*/ $7oe8x$react.createElement("ul", {
91
+ return /*#__PURE__*/ $7oe8x$react.createElement("ul", {
92
92
  className: styles.list,
93
93
  "data-test-id": "cf-autocomplete-list"
94
94
  }, items.map((item, index)=>{
@@ -97,7 +97,7 @@ function $641c6dc49f14cfd8$export$4db5c29873bb228f(props) {
97
97
  item: item,
98
98
  index: itemIndex
99
99
  });
100
- return(/*#__PURE__*/ $7oe8x$react.createElement($7oe8x$Text, {
100
+ return /*#__PURE__*/ $7oe8x$react.createElement($7oe8x$Text, {
101
101
  ...itemProps,
102
102
  as: "li",
103
103
  key: itemIndex,
@@ -109,13 +109,13 @@ function $641c6dc49f14cfd8$export$4db5c29873bb228f(props) {
109
109
  }, renderItem ? renderItem(item, inputValue) : typeof item === 'string' ? /*#__PURE__*/ $7oe8x$react.createElement($641c6dc49f14cfd8$var$HighlightedItem, {
110
110
  item: item,
111
111
  inputValue: inputValue
112
- }) : item));
113
- })));
112
+ }) : item);
113
+ }));
114
114
  }
115
115
  $641c6dc49f14cfd8$export$4db5c29873bb228f.displayName = 'AutocompleteItems';
116
116
  function $641c6dc49f14cfd8$var$HighlightedItem({ item: item , inputValue: inputValue }) {
117
117
  const { before: before , match: match , after: after } = $7oe8x$getStringMatch(item, inputValue);
118
- return(/*#__PURE__*/ $7oe8x$react.createElement($7oe8x$react.Fragment, null, before, /*#__PURE__*/ $7oe8x$react.createElement("b", null, match), after));
118
+ return /*#__PURE__*/ $7oe8x$react.createElement($7oe8x$react.Fragment, null, before, /*#__PURE__*/ $7oe8x$react.createElement("b", null, match), after);
119
119
  }
120
120
  $641c6dc49f14cfd8$var$HighlightedItem.displayName = 'HighlightedItem';
121
121
 
@@ -169,7 +169,7 @@ function $7cd5ba9838c72bf9$var$_Autocomplete(props, ref) {
169
169
  const toggleProps = getToggleButtonProps();
170
170
  const menuProps = getMenuProps();
171
171
  let elementStartIndex = 0;
172
- return(/*#__PURE__*/ $7oe8x$react.createElement("div", {
172
+ return /*#__PURE__*/ $7oe8x$react.createElement("div", {
173
173
  "data-test-id": testId,
174
174
  className: $7oe8x$cx(styles.autocomplete, className),
175
175
  ref: ref
@@ -262,14 +262,14 @@ function $7cd5ba9838c72bf9$var$_Autocomplete(props, ref) {
262
262
  getItemProps: getItemProps,
263
263
  renderItem: renderItem,
264
264
  inputValue: inputValue1
265
- })))));
265
+ }))));
266
266
  }
267
267
  const $7cd5ba9838c72bf9$var$ListItemLoadingState = ()=>{
268
- return(/*#__PURE__*/ $7oe8x$react.createElement($7oe8x$SkeletonContainer, {
268
+ return /*#__PURE__*/ $7oe8x$react.createElement($7oe8x$SkeletonContainer, {
269
269
  svgHeight: 16
270
270
  }, /*#__PURE__*/ $7oe8x$react.createElement($7oe8x$SkeletonBodyText, {
271
271
  numberOfLines: 1
272
- })));
272
+ }));
273
273
  }; // This is required to infer correct typings when differentiating groups and items
274
274
  function $7cd5ba9838c72bf9$var$isUsingGroups(isGrouped, items) {
275
275
  return isGrouped;
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/components/autocomplete/src/index.ts","packages/components/autocomplete/src/Autocomplete.tsx","packages/components/autocomplete/src/AutocompleteItems.tsx","packages/components/autocomplete/src/Autocomplete.styles.ts"],"sourcesContent":["export { Autocomplete } from './Autocomplete';\nexport type { AutocompleteProps } from './Autocomplete';\n","import React, { useCallback, useState } from 'react';\nimport { cx } from 'emotion';\nimport { useCombobox } from 'downshift';\n\nimport { mergeRefs } from '@contentful/f36-core';\nimport type { CommonProps, ExpandProps } from '@contentful/f36-core';\nimport { IconButton } from '@contentful/f36-button';\nimport { TextInput } from '@contentful/f36-forms';\nimport type { TextInputProps } from '@contentful/f36-forms';\nimport { CloseIcon, ChevronDownIcon } from '@contentful/f36-icons';\nimport { SkeletonContainer, SkeletonBodyText } from '@contentful/f36-skeleton';\nimport { Popover } from '@contentful/f36-popover';\nimport { Subheading, SectionHeading } from '@contentful/f36-typography';\n\nimport { AutocompleteItems } from './AutocompleteItems';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\n\nexport interface GenericGroupType<ItemType> {\n groupTitle: string;\n options: ItemType[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface AutocompleteProps<ItemType>\n extends CommonProps,\n Pick<\n TextInputProps,\n | 'isDisabled'\n | 'isInvalid'\n | 'isReadOnly'\n | 'isRequired'\n | 'id'\n | 'defaultValue'\n > {\n /**\n * It’s an array of data to be used as \"options\" by the autocomplete component.\n * This can either be a plain list of items or a list of groups of items.\n */\n items: ItemType[] | GenericGroupType<ItemType>[];\n\n /**\n * Tells if the item is a object with groups\n */\n isGrouped?: boolean;\n\n /**\n * Function called whenever the input value changes\n */\n onInputValueChange?: (value: string) => void;\n /**\n * This is the function that will be called when the user selects one of the \"options\" in the list.\n * The component will pass the selected \"item\" as an argument to the function..\n */\n onSelectItem: (item: ItemType) => void;\n /**\n * This is the function that will be called for each \"item\" passed in the `items` prop.\n * It receives the \"item\" and \"inputValue\" as arguments and returns a ReactNode.\n * The inputValue is passed in case you want to highlight the match on the render.\n */\n renderItem?: (item: ItemType, inputValue: string) => React.ReactNode;\n /**\n * When using objects as `items`, we recommend passing a function that tells Downshift how to extract a string\n * from those objetcs to be used as inputValue\n */\n itemToString?: (item: ItemType) => string;\n /**\n * If this is set to `true` the text input will be cleared after an item is selected\n * @default false\n */\n clearAfterSelect?: boolean;\n /**\n * This is the value will be passed to the `placeholder` prop of the input.\n * @default \"Search\"\n */\n placeholder?: string;\n /**\n * A message that will be shown when it is not possible to find any option that matches the input value\n * @default \"No matches\"\n */\n noMatchesMessage?: string;\n /**\n * Use this prop to get a ref to the input element of the component\n */\n inputRef?: React.Ref<HTMLInputElement>;\n /**\n * Use this prop to get a ref to the toggle button of the component\n */\n toggleRef?: React.Ref<HTMLButtonElement>;\n /**\n * Use this prop to get a ref to the list of items of the component\n */\n listRef?: React.Ref<HTMLUListElement>;\n /**\n * It sets the width of the list\n * @default \"auto\"\n */\n listWidth?: 'auto' | 'full';\n /**\n * It sets the max-height, in pixels, of the list\n * The default value is the height of 5 single line items\n * @default 180\n */\n listMaxHeight?: number;\n /**\n * Sets the list to show its loading state\n * @default false\n */\n isLoading?: boolean;\n /**\n * Boolean to control whether or not to render the suggestions box in a React Portal.\n * Rendering content inside a Portal allows the suggestions box to escape the bounds\n * of its parent while still being positioned correctly.\n * Defaults to `false`\n */\n usePortal?: boolean;\n}\n\nfunction _Autocomplete<ItemType>(\n props: AutocompleteProps<ItemType>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const {\n id,\n className,\n clearAfterSelect = false,\n defaultValue = '',\n items,\n onInputValueChange,\n onSelectItem,\n renderItem,\n itemToString = (item: ItemType) => (item as unknown) as string,\n isInvalid,\n isDisabled,\n isRequired,\n isReadOnly,\n noMatchesMessage = 'No matches found',\n placeholder = 'Search',\n inputRef,\n toggleRef,\n listRef,\n listWidth = 'auto',\n listMaxHeight = 180,\n isGrouped = false,\n isLoading = false,\n usePortal = false,\n testId = 'cf-autocomplete',\n } = props;\n\n type GroupType = GenericGroupType<ItemType>;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n const [inputValue, setInputValue] = useState(defaultValue);\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n\n onInputValueChange?.(value);\n },\n [onInputValueChange],\n );\n\n // Handle manually to avoid a jumping cursor, see https://github.com/downshift-js/downshift/issues/1108#issuecomment-842407759\n const handleNativeChangeEvent = useCallback(\n (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = event.target.value;\n handleInputValueChange(value);\n },\n [handleInputValueChange],\n );\n\n const flattenItems = isUsingGroups(isGrouped, items)\n ? items.reduce(\n (acc: ItemType[], group: GroupType) => [...acc, ...group.options],\n [],\n )\n : items;\n\n const isShowingNoMatches = isUsingGroups(isGrouped, items)\n ? items.every((group: GroupType) => group.options.length === 0)\n : items.length === 0;\n\n const {\n getComboboxProps,\n getInputProps,\n getItemProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n isOpen,\n toggleMenu,\n } = useCombobox({\n items: flattenItems,\n inputValue,\n itemToString,\n onInputValueChange: ({ type, inputValue }) => {\n if (type !== '__input_change__') {\n handleInputValueChange(inputValue);\n }\n },\n onStateChange: ({ type, selectedItem }) => {\n switch (type) {\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n if (selectedItem) {\n onSelectItem(selectedItem);\n }\n if (clearAfterSelect) {\n handleInputValueChange('');\n }\n break;\n default:\n break;\n }\n },\n });\n\n const {\n 'aria-labelledby': _labelledby,\n id: _inputId,\n ...inputProps\n } = getInputProps();\n const comboboxProps = getComboboxProps();\n const toggleProps = getToggleButtonProps();\n const menuProps = getMenuProps();\n let elementStartIndex = 0;\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles.autocomplete, className)}\n ref={ref}\n >\n <Popover\n usePortal={usePortal}\n isOpen={isOpen}\n isFullWidth={listWidth === 'full'}\n renderOnlyWhenOpen={false}\n // This is necessary, otherwise the focus will change from the input to the Popover\n // and the user won't be able to type in the input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={false}\n id={menuProps.id}\n >\n <Popover.Trigger>\n <div {...comboboxProps} className={styles.combobox}>\n <TextInput\n {...inputProps}\n onFocus={() => {\n if (!isOpen) {\n toggleMenu();\n }\n }}\n id={id}\n isInvalid={isInvalid}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n ref={mergeRefs(inputProps.ref, inputRef)}\n testId=\"cf-autocomplete-input\"\n placeholder={placeholder}\n onChange={(event) => {\n inputProps.onChange(event);\n handleNativeChangeEvent(event);\n }}\n />\n <IconButton\n {...toggleProps}\n ref={mergeRefs(toggleProps.ref, toggleRef)}\n aria-label=\"toggle menu\"\n className={styles.toggleButton}\n variant=\"transparent\"\n icon={\n inputValue ? (\n <CloseIcon aria-label=\"Clear\" variant=\"muted\" />\n ) : (\n <ChevronDownIcon aria-label=\"Show list\" variant=\"muted\" />\n )\n }\n onClick={() => {\n if (inputValue) {\n handleInputValueChange('');\n } else {\n toggleMenu();\n }\n }}\n isDisabled={isDisabled}\n size=\"small\"\n />\n </div>\n </Popover.Trigger>\n\n <Popover.Content\n {...menuProps}\n ref={mergeRefs(menuProps.ref, listRef)}\n className={styles.content}\n testId=\"cf-autocomplete-container\"\n >\n {isLoading &&\n [...Array(3)].map((_, index) => (\n <div key={index} className={cx(styles.item, styles.disabled)}>\n <ListItemLoadingState />\n </div>\n ))}\n\n {!isLoading && isShowingNoMatches && (\n <div className={styles.item}>\n <Subheading className={styles.noMatchesTitle}>\n {noMatchesMessage}\n </Subheading>\n </div>\n )}\n\n {!isLoading &&\n isUsingGroups(isGrouped, items) &&\n items.map((group: GroupType, index: number) => {\n if (group.options.length < 1) {\n return;\n }\n const render = (\n <div key={index}>\n <SectionHeading\n key={index}\n data-test-id=\"cf-autocomplete-grouptitle\"\n marginBottom=\"none\"\n className={styles.groupTitle}\n >\n {group.groupTitle}\n </SectionHeading>\n <AutocompleteItems<ItemType>\n items={group.options}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n elementStartIndex={elementStartIndex}\n />\n </div>\n );\n elementStartIndex += group.options.length;\n return render;\n })}\n\n {!isLoading &&\n !isUsingGroups(isGrouped, items) &&\n items.length > 0 && (\n <AutocompleteItems<ItemType>\n items={items}\n elementStartIndex={elementStartIndex}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n />\n )}\n </Popover.Content>\n </Popover>\n </div>\n );\n}\n\nconst ListItemLoadingState = () => {\n return (\n <SkeletonContainer svgHeight={16}>\n <SkeletonBodyText numberOfLines={1} />\n </SkeletonContainer>\n );\n};\n\n// This is required to infer correct typings when differentiating groups and items\nfunction isUsingGroups<ItemType>(\n isGrouped: boolean,\n items: ItemType[] | GenericGroupType<ItemType>[],\n): items is GenericGroupType<ItemType>[] {\n return isGrouped;\n}\n\n/**\n * The Autocomplete is a component that will show a `TextInput` where a user can type any word which will be used\n * to filter a list of items. That list of filtered items will be shown to the user as possible options for the input.\n * Once one of the options is selected, that option becomes the value of the `TextInput`.\n */\nexport const Autocomplete = React.forwardRef(_Autocomplete) as <T>(\n props: ExpandProps<AutocompleteProps<T>> & {\n ref?: React.Ref<HTMLDivElement>;\n },\n) => ReturnType<typeof _Autocomplete>;\n","import React, { HTMLAttributes } from 'react';\nimport { cx } from 'emotion';\n\nimport { getStringMatch } from '@contentful/f36-utils';\nimport { Text } from '@contentful/f36-typography';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\nimport type { UseComboboxGetItemPropsOptions } from 'downshift';\n\ninterface AutocompleteItemsProps<ItemType> {\n items: ItemType[];\n elementStartIndex: number;\n highlightedIndex: number;\n getItemProps: (\n options: UseComboboxGetItemPropsOptions<ItemType>,\n ) => HTMLAttributes<HTMLLIElement>;\n renderItem: (item: ItemType, inputValue: string) => React.ReactNode;\n inputValue: string;\n listMaxHeight?: number;\n}\n\nexport function AutocompleteItems<ItemType>(\n props: AutocompleteItemsProps<ItemType>,\n) {\n const {\n items,\n elementStartIndex,\n highlightedIndex,\n getItemProps,\n renderItem,\n inputValue,\n listMaxHeight = 180,\n } = props;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n return (\n <ul className={styles.list} data-test-id=\"cf-autocomplete-list\">\n {items.map((item: ItemType, index: number) => {\n const itemIndex = elementStartIndex + index;\n const itemProps = getItemProps({ item, index: itemIndex });\n return (\n <Text\n {...itemProps}\n as=\"li\"\n key={itemIndex}\n className={cx([\n styles.item,\n highlightedIndex === itemIndex && styles.highlighted,\n ])}\n data-test-id={`cf-autocomplete-list-item-${itemIndex}`}\n >\n {renderItem ? (\n renderItem(item, inputValue)\n ) : typeof item === 'string' ? (\n <HighlightedItem item={item} inputValue={inputValue} />\n ) : (\n item\n )}\n </Text>\n );\n })}\n </ul>\n );\n}\n\nAutocompleteItems.displayName = 'AutocompleteItems';\n\nfunction HighlightedItem({\n item,\n inputValue,\n}: {\n item: string;\n inputValue: string;\n}) {\n const { before, match, after } = getStringMatch(item, inputValue);\n\n return (\n <>\n {before}\n <b>{match}</b>\n {after}\n </>\n );\n}\n\nHighlightedItem.displayName = 'HighlightedItem';\n","import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getAutocompleteStyles = (listMaxHeight: number) => ({\n autocomplete: css({\n position: 'relative',\n width: '100%',\n }),\n combobox: css({\n position: 'relative',\n }),\n toggleButton: css({\n position: 'absolute',\n top: '4px',\n right: '4px',\n zIndex: 1,\n padding: tokens.spacing2Xs,\n }),\n content: css({\n overflow: 'auto',\n maxHeight: `${listMaxHeight}px`,\n }),\n list: css({\n listStyle: 'none',\n padding: `${tokens.spacingXs} 0`,\n margin: 0,\n }),\n groupTitle: css({\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n lineHeight: tokens.lineHeightM,\n }),\n noMatchesTitle: css({\n color: tokens.gray500,\n margin: `${tokens.spacingM} 0 ${tokens.spacingM} 0`,\n }),\n item: css({\n display: 'block',\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n wordBreak: 'break-word',\n whiteSpace: 'break-spaces',\n cursor: 'pointer',\n hyphens: 'auto',\n\n '&:focus, &:hover': {\n backgroundColor: tokens.gray100,\n },\n '&:active': {\n backgroundColor: tokens.gray200,\n },\n }),\n disabled: css({\n opacity: 0.5,\n pointerEvents: 'none',\n }),\n highlighted: css({\n backgroundColor: tokens.gray100,\n }),\n});\n"],"names":["Autocomplete","AutocompleteProps","React","useCallback","useState","useCombobox","mergeRefs","CommonProps","ExpandProps","IconButton","TextInput","TextInputProps","CloseIcon","ChevronDownIcon","SkeletonContainer","SkeletonBodyText","Popover","Subheading","SectionHeading","AutocompleteItems","getAutocompleteStyles","GenericGroupType","groupTitle","options","ItemType","Pick","items","isGrouped","onInputValueChange","value","onSelectItem","item","renderItem","inputValue","ReactNode","itemToString","clearAfterSelect","placeholder","noMatchesMessage","inputRef","Ref","HTMLInputElement","toggleRef","HTMLButtonElement","listRef","HTMLUListElement","listWidth","listMaxHeight","isLoading","usePortal","_Autocomplete","props","ref","HTMLDivElement","id","className","defaultValue","isInvalid","isDisabled","isRequired","isReadOnly","testId","GroupType","styles","setInputValue","handleInputValueChange","handleNativeChangeEvent","event","ChangeEvent","HTMLTextAreaElement","target","flattenItems","isUsingGroups","reduce","acc","group","isShowingNoMatches","every","length","getComboboxProps","getInputProps","getItemProps","getMenuProps","getToggleButtonProps","highlightedIndex","isOpen","toggleMenu","type","onStateChange","selectedItem","stateChangeTypes","InputKeyDownEnter","ItemClick","_labelledby","_inputId","inputProps","comboboxProps","toggleProps","menuProps","elementStartIndex","autocomplete","combobox","onChange","toggleButton","content","Array","map","_","index","disabled","noMatchesTitle","render","ListItemLoadingState","forwardRef","T","ReturnType","HTMLAttributes","getStringMatch","Text","UseComboboxGetItemPropsOptions","AutocompleteItemsProps","HTMLLIElement","list","itemIndex","itemProps","highlighted","displayName","HighlightedItem","before","match","after","tokens","position","top","right","zIndex","padding","spacing2Xs","overflow","maxHeight","listStyle","spacingXs","margin","spacingM","lineHeight","lineHeightM","color","gray500","display","wordBreak","whiteSpace","cursor","hyphens","backgroundColor","gray100","gray200"],"version":3,"file":"module.js.map"}
1
+ {"mappings":"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","sources":["packages/components/autocomplete/src/index.ts","packages/components/autocomplete/src/Autocomplete.tsx","packages/components/autocomplete/src/AutocompleteItems.tsx","packages/components/autocomplete/src/Autocomplete.styles.ts"],"sourcesContent":["export { Autocomplete } from './Autocomplete';\nexport type { AutocompleteProps } from './Autocomplete';\n","import React, { useCallback, useState } from 'react';\nimport { cx } from 'emotion';\nimport { useCombobox } from 'downshift';\n\nimport { mergeRefs } from '@contentful/f36-core';\nimport type { CommonProps, ExpandProps } from '@contentful/f36-core';\nimport { IconButton } from '@contentful/f36-button';\nimport { TextInput } from '@contentful/f36-forms';\nimport type { TextInputProps } from '@contentful/f36-forms';\nimport { CloseIcon, ChevronDownIcon } from '@contentful/f36-icons';\nimport { SkeletonContainer, SkeletonBodyText } from '@contentful/f36-skeleton';\nimport { Popover } from '@contentful/f36-popover';\nimport { Subheading, SectionHeading } from '@contentful/f36-typography';\n\nimport { AutocompleteItems } from './AutocompleteItems';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\n\nexport interface GenericGroupType<ItemType> {\n groupTitle: string;\n options: ItemType[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface AutocompleteProps<ItemType>\n extends CommonProps,\n Pick<\n TextInputProps,\n | 'isDisabled'\n | 'isInvalid'\n | 'isReadOnly'\n | 'isRequired'\n | 'id'\n | 'defaultValue'\n > {\n /**\n * It’s an array of data to be used as \"options\" by the autocomplete component.\n * This can either be a plain list of items or a list of groups of items.\n */\n items: ItemType[] | GenericGroupType<ItemType>[];\n\n /**\n * Tells if the item is a object with groups\n */\n isGrouped?: boolean;\n\n /**\n * Function called whenever the input value changes\n */\n onInputValueChange?: (value: string) => void;\n /**\n * This is the function that will be called when the user selects one of the \"options\" in the list.\n * The component will pass the selected \"item\" as an argument to the function..\n */\n onSelectItem: (item: ItemType) => void;\n /**\n * This is the function that will be called for each \"item\" passed in the `items` prop.\n * It receives the \"item\" and \"inputValue\" as arguments and returns a ReactNode.\n * The inputValue is passed in case you want to highlight the match on the render.\n */\n renderItem?: (item: ItemType, inputValue: string) => React.ReactNode;\n /**\n * When using objects as `items`, we recommend passing a function that tells Downshift how to extract a string\n * from those objetcs to be used as inputValue\n */\n itemToString?: (item: ItemType) => string;\n /**\n * If this is set to `true` the text input will be cleared after an item is selected\n * @default false\n */\n clearAfterSelect?: boolean;\n /**\n * This is the value will be passed to the `placeholder` prop of the input.\n * @default \"Search\"\n */\n placeholder?: string;\n /**\n * A message that will be shown when it is not possible to find any option that matches the input value\n * @default \"No matches\"\n */\n noMatchesMessage?: string;\n /**\n * Use this prop to get a ref to the input element of the component\n */\n inputRef?: React.Ref<HTMLInputElement>;\n /**\n * Use this prop to get a ref to the toggle button of the component\n */\n toggleRef?: React.Ref<HTMLButtonElement>;\n /**\n * Use this prop to get a ref to the list of items of the component\n */\n listRef?: React.Ref<HTMLUListElement>;\n /**\n * It sets the width of the list\n * @default \"auto\"\n */\n listWidth?: 'auto' | 'full';\n /**\n * It sets the max-height, in pixels, of the list\n * The default value is the height of 5 single line items\n * @default 180\n */\n listMaxHeight?: number;\n /**\n * Sets the list to show its loading state\n * @default false\n */\n isLoading?: boolean;\n /**\n * Boolean to control whether or not to render the suggestions box in a React Portal.\n * Rendering content inside a Portal allows the suggestions box to escape the bounds\n * of its parent while still being positioned correctly.\n * Defaults to `false`\n */\n usePortal?: boolean;\n}\n\nfunction _Autocomplete<ItemType>(\n props: AutocompleteProps<ItemType>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const {\n id,\n className,\n clearAfterSelect = false,\n defaultValue = '',\n items,\n onInputValueChange,\n onSelectItem,\n renderItem,\n itemToString = (item: ItemType) => (item as unknown) as string,\n isInvalid,\n isDisabled,\n isRequired,\n isReadOnly,\n noMatchesMessage = 'No matches found',\n placeholder = 'Search',\n inputRef,\n toggleRef,\n listRef,\n listWidth = 'auto',\n listMaxHeight = 180,\n isGrouped = false,\n isLoading = false,\n usePortal = false,\n testId = 'cf-autocomplete',\n } = props;\n\n type GroupType = GenericGroupType<ItemType>;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n const [inputValue, setInputValue] = useState(defaultValue);\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n\n onInputValueChange?.(value);\n },\n [onInputValueChange],\n );\n\n // Handle manually to avoid a jumping cursor, see https://github.com/downshift-js/downshift/issues/1108#issuecomment-842407759\n const handleNativeChangeEvent = useCallback(\n (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = event.target.value;\n handleInputValueChange(value);\n },\n [handleInputValueChange],\n );\n\n const flattenItems = isUsingGroups(isGrouped, items)\n ? items.reduce(\n (acc: ItemType[], group: GroupType) => [...acc, ...group.options],\n [],\n )\n : items;\n\n const isShowingNoMatches = isUsingGroups(isGrouped, items)\n ? items.every((group: GroupType) => group.options.length === 0)\n : items.length === 0;\n\n const {\n getComboboxProps,\n getInputProps,\n getItemProps,\n getMenuProps,\n getToggleButtonProps,\n highlightedIndex,\n isOpen,\n toggleMenu,\n } = useCombobox({\n items: flattenItems,\n inputValue,\n itemToString,\n onInputValueChange: ({ type, inputValue }) => {\n if (type !== '__input_change__') {\n handleInputValueChange(inputValue);\n }\n },\n onStateChange: ({ type, selectedItem }) => {\n switch (type) {\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n if (selectedItem) {\n onSelectItem(selectedItem);\n }\n if (clearAfterSelect) {\n handleInputValueChange('');\n }\n break;\n default:\n break;\n }\n },\n });\n\n const {\n 'aria-labelledby': _labelledby,\n id: _inputId,\n ...inputProps\n } = getInputProps();\n const comboboxProps = getComboboxProps();\n const toggleProps = getToggleButtonProps();\n const menuProps = getMenuProps();\n let elementStartIndex = 0;\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles.autocomplete, className)}\n ref={ref}\n >\n <Popover\n usePortal={usePortal}\n isOpen={isOpen}\n isFullWidth={listWidth === 'full'}\n renderOnlyWhenOpen={false}\n // This is necessary, otherwise the focus will change from the input to the Popover\n // and the user won't be able to type in the input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={false}\n id={menuProps.id}\n >\n <Popover.Trigger>\n <div {...comboboxProps} className={styles.combobox}>\n <TextInput\n {...inputProps}\n onFocus={() => {\n if (!isOpen) {\n toggleMenu();\n }\n }}\n id={id}\n isInvalid={isInvalid}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n ref={mergeRefs(inputProps.ref, inputRef)}\n testId=\"cf-autocomplete-input\"\n placeholder={placeholder}\n onChange={(event) => {\n inputProps.onChange(event);\n handleNativeChangeEvent(event);\n }}\n />\n <IconButton\n {...toggleProps}\n ref={mergeRefs(toggleProps.ref, toggleRef)}\n aria-label=\"toggle menu\"\n className={styles.toggleButton}\n variant=\"transparent\"\n icon={\n inputValue ? (\n <CloseIcon aria-label=\"Clear\" variant=\"muted\" />\n ) : (\n <ChevronDownIcon aria-label=\"Show list\" variant=\"muted\" />\n )\n }\n onClick={() => {\n if (inputValue) {\n handleInputValueChange('');\n } else {\n toggleMenu();\n }\n }}\n isDisabled={isDisabled}\n size=\"small\"\n />\n </div>\n </Popover.Trigger>\n\n <Popover.Content\n {...menuProps}\n ref={mergeRefs(menuProps.ref, listRef)}\n className={styles.content}\n testId=\"cf-autocomplete-container\"\n >\n {isLoading &&\n [...Array(3)].map((_, index) => (\n <div key={index} className={cx(styles.item, styles.disabled)}>\n <ListItemLoadingState />\n </div>\n ))}\n\n {!isLoading && isShowingNoMatches && (\n <div className={styles.item}>\n <Subheading className={styles.noMatchesTitle}>\n {noMatchesMessage}\n </Subheading>\n </div>\n )}\n\n {!isLoading &&\n isUsingGroups(isGrouped, items) &&\n items.map((group: GroupType, index: number) => {\n if (group.options.length < 1) {\n return;\n }\n const render = (\n <div key={index}>\n <SectionHeading\n key={index}\n data-test-id=\"cf-autocomplete-grouptitle\"\n marginBottom=\"none\"\n className={styles.groupTitle}\n >\n {group.groupTitle}\n </SectionHeading>\n <AutocompleteItems<ItemType>\n items={group.options}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n elementStartIndex={elementStartIndex}\n />\n </div>\n );\n elementStartIndex += group.options.length;\n return render;\n })}\n\n {!isLoading &&\n !isUsingGroups(isGrouped, items) &&\n items.length > 0 && (\n <AutocompleteItems<ItemType>\n items={items}\n elementStartIndex={elementStartIndex}\n highlightedIndex={highlightedIndex}\n getItemProps={getItemProps}\n renderItem={renderItem}\n inputValue={inputValue}\n />\n )}\n </Popover.Content>\n </Popover>\n </div>\n );\n}\n\nconst ListItemLoadingState = () => {\n return (\n <SkeletonContainer svgHeight={16}>\n <SkeletonBodyText numberOfLines={1} />\n </SkeletonContainer>\n );\n};\n\n// This is required to infer correct typings when differentiating groups and items\nfunction isUsingGroups<ItemType>(\n isGrouped: boolean,\n items: ItemType[] | GenericGroupType<ItemType>[],\n): items is GenericGroupType<ItemType>[] {\n return isGrouped;\n}\n\n/**\n * The Autocomplete is a component that will show a `TextInput` where a user can type any word which will be used\n * to filter a list of items. That list of filtered items will be shown to the user as possible options for the input.\n * Once one of the options is selected, that option becomes the value of the `TextInput`.\n */\nexport const Autocomplete = React.forwardRef(_Autocomplete) as <T>(\n props: ExpandProps<AutocompleteProps<T>> & {\n ref?: React.Ref<HTMLDivElement>;\n },\n) => ReturnType<typeof _Autocomplete>;\n","import React, { HTMLAttributes } from 'react';\nimport { cx } from 'emotion';\n\nimport { getStringMatch } from '@contentful/f36-utils';\nimport { Text } from '@contentful/f36-typography';\nimport { getAutocompleteStyles } from './Autocomplete.styles';\nimport type { UseComboboxGetItemPropsOptions } from 'downshift';\n\ninterface AutocompleteItemsProps<ItemType> {\n items: ItemType[];\n elementStartIndex: number;\n highlightedIndex: number;\n getItemProps: (\n options: UseComboboxGetItemPropsOptions<ItemType>,\n ) => HTMLAttributes<HTMLLIElement>;\n renderItem: (item: ItemType, inputValue: string) => React.ReactNode;\n inputValue: string;\n listMaxHeight?: number;\n}\n\nexport function AutocompleteItems<ItemType>(\n props: AutocompleteItemsProps<ItemType>,\n) {\n const {\n items,\n elementStartIndex,\n highlightedIndex,\n getItemProps,\n renderItem,\n inputValue,\n listMaxHeight = 180,\n } = props;\n\n const styles = getAutocompleteStyles(listMaxHeight);\n\n return (\n <ul className={styles.list} data-test-id=\"cf-autocomplete-list\">\n {items.map((item: ItemType, index: number) => {\n const itemIndex = elementStartIndex + index;\n const itemProps = getItemProps({ item, index: itemIndex });\n return (\n <Text\n {...itemProps}\n as=\"li\"\n key={itemIndex}\n className={cx([\n styles.item,\n highlightedIndex === itemIndex && styles.highlighted,\n ])}\n data-test-id={`cf-autocomplete-list-item-${itemIndex}`}\n >\n {renderItem ? (\n renderItem(item, inputValue)\n ) : typeof item === 'string' ? (\n <HighlightedItem item={item} inputValue={inputValue} />\n ) : (\n item\n )}\n </Text>\n );\n })}\n </ul>\n );\n}\n\nAutocompleteItems.displayName = 'AutocompleteItems';\n\nfunction HighlightedItem({\n item,\n inputValue,\n}: {\n item: string;\n inputValue: string;\n}) {\n const { before, match, after } = getStringMatch(item, inputValue);\n\n return (\n <>\n {before}\n <b>{match}</b>\n {after}\n </>\n );\n}\n\nHighlightedItem.displayName = 'HighlightedItem';\n","import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getAutocompleteStyles = (listMaxHeight: number) => ({\n autocomplete: css({\n position: 'relative',\n width: '100%',\n }),\n combobox: css({\n position: 'relative',\n }),\n toggleButton: css({\n position: 'absolute',\n top: '4px',\n right: '4px',\n zIndex: 1,\n padding: tokens.spacing2Xs,\n }),\n content: css({\n overflow: 'auto',\n maxHeight: `${listMaxHeight}px`,\n }),\n list: css({\n listStyle: 'none',\n padding: `${tokens.spacingXs} 0`,\n margin: 0,\n }),\n groupTitle: css({\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n lineHeight: tokens.lineHeightM,\n }),\n noMatchesTitle: css({\n color: tokens.gray500,\n margin: `${tokens.spacingM} 0 ${tokens.spacingM} 0`,\n }),\n item: css({\n display: 'block',\n padding: `${tokens.spacingXs} ${tokens.spacingM}`,\n wordBreak: 'break-word',\n whiteSpace: 'break-spaces',\n cursor: 'pointer',\n hyphens: 'auto',\n\n '&:focus, &:hover': {\n backgroundColor: tokens.gray100,\n },\n '&:active': {\n backgroundColor: tokens.gray200,\n },\n }),\n disabled: css({\n opacity: 0.5,\n pointerEvents: 'none',\n }),\n highlighted: css({\n backgroundColor: tokens.gray100,\n }),\n});\n"],"names":["Autocomplete","AutocompleteProps","React","useCallback","useState","useCombobox","mergeRefs","CommonProps","ExpandProps","IconButton","TextInput","TextInputProps","CloseIcon","ChevronDownIcon","SkeletonContainer","SkeletonBodyText","Popover","Subheading","SectionHeading","AutocompleteItems","getAutocompleteStyles","GenericGroupType","groupTitle","options","ItemType","Pick","items","isGrouped","onInputValueChange","value","onSelectItem","item","renderItem","inputValue","ReactNode","itemToString","clearAfterSelect","placeholder","noMatchesMessage","inputRef","Ref","HTMLInputElement","toggleRef","HTMLButtonElement","listRef","HTMLUListElement","listWidth","listMaxHeight","isLoading","usePortal","_Autocomplete","props","ref","HTMLDivElement","id","className","defaultValue","isInvalid","isDisabled","isRequired","isReadOnly","testId","GroupType","styles","setInputValue","handleInputValueChange","handleNativeChangeEvent","event","ChangeEvent","HTMLTextAreaElement","target","flattenItems","isUsingGroups","reduce","acc","group","isShowingNoMatches","every","length","getComboboxProps","getInputProps","getItemProps","getMenuProps","getToggleButtonProps","highlightedIndex","isOpen","toggleMenu","type","onStateChange","selectedItem","stateChangeTypes","InputKeyDownEnter","ItemClick","_labelledby","_inputId","inputProps","comboboxProps","toggleProps","menuProps","elementStartIndex","autocomplete","combobox","onChange","toggleButton","content","Array","map","_","index","disabled","noMatchesTitle","render","ListItemLoadingState","forwardRef","T","ReturnType","HTMLAttributes","getStringMatch","Text","UseComboboxGetItemPropsOptions","AutocompleteItemsProps","HTMLLIElement","list","itemIndex","itemProps","highlighted","displayName","HighlightedItem","before","match","after","tokens","position","top","right","zIndex","padding","spacing2Xs","overflow","maxHeight","listStyle","spacingXs","margin","spacingM","lineHeight","lineHeightM","color","gray500","display","wordBreak","whiteSpace","cursor","hyphens","backgroundColor","gray100","gray200"],"version":3,"file":"module.js.map"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import React from "react";
2
2
  import { CommonProps } from "@contentful/f36-core";
3
3
  import { TextInputProps } from "@contentful/f36-forms";
4
+ declare export namespace AutocompleteItems {
5
+ var displayName: string;
6
+ }
4
7
  interface GenericGroupType<ItemType> {
5
8
  groupTitle: string;
6
9
  options: ItemType[];
@@ -1 +1 @@
1
- {"mappings":";;;AEiBA,2BAAkC,QAAQ;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAGD,mCAAmC,QAAQ,CACzC,SAAQ,WAAW,EACjB,IAAI,CACF,cAAc,EACZ,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,IAAI,GACJ,cAAc,CACjB;IACH;;;OAGG;IACH,KAAK,EAAE,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,CAAC,EAAE,CAAC;IAEjD;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;OAGG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,SAAS,CAAC;IACrE;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,+BAAuB,QAAQ,EAC7B,KAAK,EAAE,kBAAkB,QAAQ,CAAC,EAClC,GAAG,EAAE,MAAM,GAAG,CAAC,cAAc,CAAC,eAiP/B;AAkBD;;;;GAIG;AACH,OAAO,MAAM;UAEH,MAAM,GAAG,CAAC,cAAc,CAAC;MAE9B,WAAW,oBAAoB,CAAC,CAAC","sources":["packages/components/autocomplete/src/src/Autocomplete.styles.ts","packages/components/autocomplete/src/src/AutocompleteItems.tsx","packages/components/autocomplete/src/src/Autocomplete.tsx","packages/components/autocomplete/src/src/index.ts","packages/components/autocomplete/src/index.ts"],"sourcesContent":[null,null,null,null,"export { Autocomplete } from './Autocomplete';\nexport type { AutocompleteProps } from './Autocomplete';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
1
+ {"mappings":";;;QCoBA,MAAM,WAAU,iBAAiB;;;ACHjC,2BAAkC,QAAQ;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAGD,mCAAmC,QAAQ,CACzC,SAAQ,WAAW,EACjB,IAAI,CACF,cAAc,EACZ,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,IAAI,GACJ,cAAc,CACjB;IACH;;;OAGG;IACH,KAAK,EAAE,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,CAAC,EAAE,CAAC;IAEjD;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;OAGG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,SAAS,CAAC;IACrE;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,+BAAuB,QAAQ,EAC7B,KAAK,EAAE,kBAAkB,QAAQ,CAAC,EAClC,GAAG,EAAE,MAAM,GAAG,CAAC,cAAc,CAAC,eAiP/B;AAkBD;;;;GAIG;AACH,OAAO,MAAM;UAEH,MAAM,GAAG,CAAC,cAAc,CAAC;MAE9B,WAAW,oBAAoB,CAAC,CAAC","sources":["packages/components/autocomplete/src/src/Autocomplete.styles.ts","packages/components/autocomplete/src/src/AutocompleteItems.tsx","packages/components/autocomplete/src/src/Autocomplete.tsx","packages/components/autocomplete/src/src/index.ts","packages/components/autocomplete/src/index.ts"],"sourcesContent":[null,null,null,null,"export { Autocomplete } from './Autocomplete';\nexport type { AutocompleteProps } from './Autocomplete';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "@contentful/f36-autocomplete",
3
- "version": "4.6.0",
3
+ "version": "4.7.0",
4
4
  "description": "Forma 36: Autocomplete component",
5
5
  "scripts": {
6
6
  "build": "parcel build"
7
7
  },
8
8
  "dependencies": {
9
9
  "@babel/runtime": "^7.6.2",
10
- "@contentful/f36-button": "^4.6.0",
11
- "@contentful/f36-core": "^4.6.0",
12
- "@contentful/f36-forms": "^4.6.0",
13
- "@contentful/f36-icons": "^4.6.0",
14
- "@contentful/f36-popover": "^4.6.0",
15
- "@contentful/f36-skeleton": "^4.6.0",
10
+ "@contentful/f36-button": "^4.7.0",
11
+ "@contentful/f36-core": "^4.7.0",
12
+ "@contentful/f36-forms": "^4.7.0",
13
+ "@contentful/f36-icons": "^4.7.0",
14
+ "@contentful/f36-popover": "^4.7.0",
15
+ "@contentful/f36-skeleton": "^4.7.0",
16
16
  "@contentful/f36-tokens": "^4.0.1",
17
- "@contentful/f36-typography": "^4.6.0",
18
- "@contentful/f36-utils": "^4.6.0",
17
+ "@contentful/f36-typography": "^4.7.0",
18
+ "@contentful/f36-utils": "^4.7.0",
19
19
  "downshift": "^6.1.7",
20
20
  "emotion": "^10.0.17"
21
21
  },