@launchpad-ui/filter 0.5.0-alpha.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.es.js +12 -13
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +12 -13
- package/dist/index.js.map +1 -1
- package/dist/style.css +48 -53
- package/package.json +7 -7
package/dist/index.es.js
CHANGED
@@ -8,24 +8,23 @@ import { Button, IconButton } from "@launchpad-ui/button";
|
|
8
8
|
import { Menu, MenuSearch, MenuDivider, MenuItem } from "@launchpad-ui/menu";
|
9
9
|
import { Tooltip } from "@launchpad-ui/tooltip";
|
10
10
|
import { VisuallyHidden } from "@react-aria/visually-hidden";
|
11
|
-
const filter = "
|
12
|
-
const buttonContainer = "
|
13
|
-
const button = "
|
14
|
-
const appliedButton = "
|
15
|
-
const name = "
|
16
|
-
const appliedName = "
|
17
|
-
const description = "
|
18
|
-
const appliedDescription = "
|
19
|
-
const clear = "
|
20
|
-
const isClearable = "
|
21
|
-
const clearTooltip = "
|
22
|
-
const filterClearButton = "
|
11
|
+
const filter = "_filter_1vct5_14";
|
12
|
+
const buttonContainer = "_buttonContainer_1vct5_18";
|
13
|
+
const button = "_button_1vct5_18";
|
14
|
+
const appliedButton = "_appliedButton_1vct5_37";
|
15
|
+
const name = "_name_1vct5_68";
|
16
|
+
const appliedName = "_appliedName_1vct5_73";
|
17
|
+
const description = "_description_1vct5_77";
|
18
|
+
const appliedDescription = "_appliedDescription_1vct5_83";
|
19
|
+
const clear = "_clear_1vct5_91";
|
20
|
+
const isClearable = "_isClearable_1vct5_96";
|
21
|
+
const clearTooltip = "_clearTooltip_1vct5_121";
|
22
|
+
const filterClearButton = "_filterClearButton_1vct5_127";
|
23
23
|
const styles = {
|
24
24
|
filter,
|
25
25
|
buttonContainer,
|
26
26
|
button,
|
27
27
|
appliedButton,
|
28
|
-
"focus-visible": "_focus-visible_1f7xm_1",
|
29
28
|
name,
|
30
29
|
appliedName,
|
31
30
|
description,
|
package/dist/index.es.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n children: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id': string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, children, onClickFilterButton, 'data-test-id': testId } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div data-test-id={testId}>\n <button\n aria-haspopup\n className={cx(styles.appliedButton, className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className={styles.appliedName} data-test-id={`${testId}-name`}>\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && (\n <span className={styles.appliedDescription} data-test-id={`${testId}-description`}>\n {children}\n </span>\n )}\n <ExpandMore size=\"small\" data-test-id={`${testId}-expand`} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\nimport styles from './styles/Filter.module.css';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size' | 'data-test-id'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n 'data-test-id': testId = 'filter-menu',\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button\n tabIndex={0}\n className={styles.filterClearButton}\n onClick={onClearFilter}\n kind=\"link\"\n data-test-id=\"clear-filter-button\"\n >\n CLEAR FILTER\n </Button>\n )}\n <Menu\n enableVirtualization={enableVirtualization}\n size={size}\n data-test-id={testId}\n onSelect={onSelect}\n >\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n 'data-test-id'?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n 'data-test-id': testId = 'applied-filter',\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n return (\n <Dropdown targetClassName={className} placement=\"bottom-start\" enableArrow={false} {...props}>\n <AppliedFilterButton\n data-test-id={testId}\n name={name}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id'?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n 'data-test-id': testId = 'filter-button',\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className={styles.name}>\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className={styles.buttonContainer} data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx(styles.button, className, (isClearable || isSelected) && styles.isClearable)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className={styles.description}>\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size=\"small\" />}\n </button>\n {isClearable && (\n <Tooltip targetClassName={styles.clearTooltip} content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className={styles.clear}\n data-test-id=\"clear-filter-button\"\n icon={<Close size=\"tiny\" />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\nimport styles from './styles/Filter.module.css';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n 'data-test-id'?: string;\n triggerTestId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n 'data-test-id': testId = 'filter',\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx(styles.filter, className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetTestId={testId} targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","children","onClickFilterButton","testId","hasDescription","Children","count","cx","styles","appliedButton","_jsxs","appliedName","_jsx","appliedDescription","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","size","filterOptions","value","isDisabled","_Fragment","filterClearButton","map","option","index","isDivider","isChecked","Check","undefined","nested","groupHeader","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","FilterButton","hideName","isClearable","clearTooltip","onClear","isSelected","rest","nameId","useId","descriptionId","nameElement","buttonContainer","button","clear","defaultProps","Filter","dropdownClasses","filter","handleClear","event","preventDefault"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n children: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id': string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, children, onClickFilterButton, 'data-test-id': testId } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div data-test-id={testId}>\n <button\n aria-haspopup\n className={cx(styles.appliedButton, className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className={styles.appliedName} data-test-id={`${testId}-name`}>\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && (\n <span className={styles.appliedDescription} data-test-id={`${testId}-description`}>\n {children}\n </span>\n )}\n <ExpandMore size=\"small\" data-test-id={`${testId}-expand`} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\nimport styles from './styles/Filter.module.css';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size' | 'data-test-id'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n 'data-test-id': testId = 'filter-menu',\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button\n tabIndex={0}\n className={styles.filterClearButton}\n onClick={onClearFilter}\n kind=\"link\"\n data-test-id=\"clear-filter-button\"\n >\n CLEAR FILTER\n </Button>\n )}\n <Menu\n enableVirtualization={enableVirtualization}\n size={size}\n data-test-id={testId}\n onSelect={onSelect}\n >\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n 'data-test-id'?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n 'data-test-id': testId = 'applied-filter',\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n return (\n <Dropdown targetClassName={className} placement=\"bottom-start\" enableArrow={false} {...props}>\n <AppliedFilterButton\n data-test-id={testId}\n name={name}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id'?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n 'data-test-id': testId = 'filter-button',\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className={styles.name}>\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className={styles.buttonContainer} data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx(styles.button, className, (isClearable || isSelected) && styles.isClearable)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className={styles.description}>\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size=\"small\" />}\n </button>\n {isClearable && (\n <Tooltip targetClassName={styles.clearTooltip} content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className={styles.clear}\n data-test-id=\"clear-filter-button\"\n icon={<Close size=\"tiny\" />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\nimport styles from './styles/Filter.module.css';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n 'data-test-id'?: string;\n triggerTestId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n 'data-test-id': testId = 'filter',\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx(styles.filter, className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetTestId={testId} targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","children","onClickFilterButton","testId","hasDescription","Children","count","cx","styles","appliedButton","onClick","_jsxs","appliedName","_jsx","appliedDescription","ExpandMore","size","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","filterOptions","value","isDisabled","_Fragment","Button","tabIndex","filterClearButton","kind","Menu","MenuSearch","placeholder","onChange","ariaLabel","map","option","index","isDivider","MenuDivider","MenuItem","item","disabled","icon","isChecked","Check","role","undefined","nested","groupHeader","tooltip","tooltipPlacement","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","Dropdown","targetClassName","placement","enableArrow","FilterButton","hideName","isClearable","clearTooltip","onClear","isSelected","rest","nameId","useId","descriptionId","nameElement","buttonContainer","button","VisuallyHidden","id","Tooltip","content","IconButton","clear","Close","defaultProps","Filter","dropdownClasses","filter","handleClear","event","preventDefault","targetTestId"],"mappings":"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"}
|
package/dist/index.js
CHANGED
@@ -10,24 +10,23 @@ const button$1 = require("@launchpad-ui/button");
|
|
10
10
|
const menu = require("@launchpad-ui/menu");
|
11
11
|
const tooltip = require("@launchpad-ui/tooltip");
|
12
12
|
const visuallyHidden = require("@react-aria/visually-hidden");
|
13
|
-
const filter = "
|
14
|
-
const buttonContainer = "
|
15
|
-
const button = "
|
16
|
-
const appliedButton = "
|
17
|
-
const name = "
|
18
|
-
const appliedName = "
|
19
|
-
const description = "
|
20
|
-
const appliedDescription = "
|
21
|
-
const clear = "
|
22
|
-
const isClearable = "
|
23
|
-
const clearTooltip = "
|
24
|
-
const filterClearButton = "
|
13
|
+
const filter = "_filter_1vct5_14";
|
14
|
+
const buttonContainer = "_buttonContainer_1vct5_18";
|
15
|
+
const button = "_button_1vct5_18";
|
16
|
+
const appliedButton = "_appliedButton_1vct5_37";
|
17
|
+
const name = "_name_1vct5_68";
|
18
|
+
const appliedName = "_appliedName_1vct5_73";
|
19
|
+
const description = "_description_1vct5_77";
|
20
|
+
const appliedDescription = "_appliedDescription_1vct5_83";
|
21
|
+
const clear = "_clear_1vct5_91";
|
22
|
+
const isClearable = "_isClearable_1vct5_96";
|
23
|
+
const clearTooltip = "_clearTooltip_1vct5_121";
|
24
|
+
const filterClearButton = "_filterClearButton_1vct5_127";
|
25
25
|
const styles = {
|
26
26
|
filter,
|
27
27
|
buttonContainer,
|
28
28
|
button,
|
29
29
|
appliedButton,
|
30
|
-
"focus-visible": "_focus-visible_1f7xm_1",
|
31
30
|
name,
|
32
31
|
appliedName,
|
33
32
|
description,
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n children: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id': string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, children, onClickFilterButton, 'data-test-id': testId } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div data-test-id={testId}>\n <button\n aria-haspopup\n className={cx(styles.appliedButton, className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className={styles.appliedName} data-test-id={`${testId}-name`}>\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && (\n <span className={styles.appliedDescription} data-test-id={`${testId}-description`}>\n {children}\n </span>\n )}\n <ExpandMore size=\"small\" data-test-id={`${testId}-expand`} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\nimport styles from './styles/Filter.module.css';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size' | 'data-test-id'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n 'data-test-id': testId = 'filter-menu',\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button\n tabIndex={0}\n className={styles.filterClearButton}\n onClick={onClearFilter}\n kind=\"link\"\n data-test-id=\"clear-filter-button\"\n >\n CLEAR FILTER\n </Button>\n )}\n <Menu\n enableVirtualization={enableVirtualization}\n size={size}\n data-test-id={testId}\n onSelect={onSelect}\n >\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n 'data-test-id'?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n 'data-test-id': testId = 'applied-filter',\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n return (\n <Dropdown targetClassName={className} placement=\"bottom-start\" enableArrow={false} {...props}>\n <AppliedFilterButton\n data-test-id={testId}\n name={name}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id'?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n 'data-test-id': testId = 'filter-button',\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className={styles.name}>\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className={styles.buttonContainer} data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx(styles.button, className, (isClearable || isSelected) && styles.isClearable)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className={styles.description}>\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size=\"small\" />}\n </button>\n {isClearable && (\n <Tooltip targetClassName={styles.clearTooltip} content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className={styles.clear}\n data-test-id=\"clear-filter-button\"\n icon={<Close size=\"tiny\" />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\nimport styles from './styles/Filter.module.css';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n 'data-test-id'?: string;\n triggerTestId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n 'data-test-id': testId = 'filter',\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx(styles.filter, className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetTestId={testId} targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","children","onClickFilterButton","testId","hasDescription","Children","count","cx","styles","appliedButton","_jsxs","appliedName","_jsx","appliedDescription","ExpandMore","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","size","filterOptions","value","isDisabled","_Fragment","Button","filterClearButton","Menu","MenuSearch","map","option","index","isDivider","MenuDivider","MenuItem","isChecked","Check","undefined","nested","groupHeader","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","Dropdown","FilterButton","hideName","isClearable","clearTooltip","onClear","isSelected","rest","nameId","useId","descriptionId","nameElement","buttonContainer","button","VisuallyHidden","Tooltip","IconButton","clear","Close","defaultProps","Filter","dropdownClasses","filter","handleClear","event","preventDefault"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n children: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id': string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, children, onClickFilterButton, 'data-test-id': testId } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div data-test-id={testId}>\n <button\n aria-haspopup\n className={cx(styles.appliedButton, className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className={styles.appliedName} data-test-id={`${testId}-name`}>\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && (\n <span className={styles.appliedDescription} data-test-id={`${testId}-description`}>\n {children}\n </span>\n )}\n <ExpandMore size=\"small\" data-test-id={`${testId}-expand`} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\nimport styles from './styles/Filter.module.css';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size' | 'data-test-id'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n 'data-test-id': testId = 'filter-menu',\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button\n tabIndex={0}\n className={styles.filterClearButton}\n onClick={onClearFilter}\n kind=\"link\"\n data-test-id=\"clear-filter-button\"\n >\n CLEAR FILTER\n </Button>\n )}\n <Menu\n enableVirtualization={enableVirtualization}\n size={size}\n data-test-id={testId}\n onSelect={onSelect}\n >\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n 'data-test-id'?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n 'data-test-id': testId = 'applied-filter',\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n return (\n <Dropdown targetClassName={className} placement=\"bottom-start\" enableArrow={false} {...props}>\n <AppliedFilterButton\n data-test-id={testId}\n name={name}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport styles from './styles/Filter.module.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n 'data-test-id'?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n 'data-test-id': testId = 'filter-button',\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className={styles.name}>\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className={styles.buttonContainer} data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx(styles.button, className, (isClearable || isSelected) && styles.isClearable)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className={styles.description}>\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size=\"small\" />}\n </button>\n {isClearable && (\n <Tooltip targetClassName={styles.clearTooltip} content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className={styles.clear}\n data-test-id=\"clear-filter-button\"\n icon={<Close size=\"tiny\" />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\nimport styles from './styles/Filter.module.css';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n 'data-test-id'?: string;\n triggerTestId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n 'data-test-id': testId = 'filter',\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx(styles.filter, className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetTestId={testId} targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","children","onClickFilterButton","testId","hasDescription","Children","count","cx","styles","appliedButton","onClick","_jsxs","appliedName","_jsx","appliedDescription","ExpandMore","size","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","filterOptions","value","isDisabled","_Fragment","Button","tabIndex","filterClearButton","kind","Menu","MenuSearch","placeholder","onChange","ariaLabel","map","option","index","isDivider","MenuDivider","MenuItem","item","disabled","icon","isChecked","Check","role","undefined","nested","groupHeader","tooltip","tooltipPlacement","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","Dropdown","targetClassName","placement","enableArrow","FilterButton","hideName","isClearable","clearTooltip","onClear","isSelected","rest","nameId","useId","descriptionId","nameElement","buttonContainer","button","VisuallyHidden","id","Tooltip","content","IconButton","clear","Close","defaultProps","Filter","dropdownClasses","filter","handleClear","event","preventDefault","targetTestId"],"mappings":"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"}
|
package/dist/style.css
CHANGED
@@ -1,15 +1,28 @@
|
|
1
|
-
|
1
|
+
:root,
|
2
|
+
[data-theme='default'] {
|
3
|
+
--lp-component-filter-color-bg-clearable: rgba(0, 0, 0, 0.15);
|
4
|
+
--lp-component-filter-color-bg-clearable-focus: rgba(0, 0, 0, 0.2);
|
5
|
+
--lp-component-filter-color-border-clearable-focus: var(--lp-color-gray-800);
|
6
|
+
}
|
7
|
+
|
8
|
+
[data-theme='dark'] {
|
9
|
+
--lp-component-filter-color-bg-clearable: rgba(248, 248, 248, 0.15);
|
10
|
+
--lp-component-filter-color-bg-clearable-focus: rgba(248, 248, 248, 0.2);
|
11
|
+
--lp-component-filter-color-border-clearable-focus: var(--lp-color-gray-500);
|
12
|
+
}
|
13
|
+
|
14
|
+
._filter_1vct5_14 {
|
2
15
|
font-family: var(--lp-font-family-base);
|
3
16
|
}
|
4
17
|
|
5
|
-
.
|
18
|
+
._buttonContainer_1vct5_18 {
|
6
19
|
cursor: pointer;
|
7
20
|
display: inline-flex;
|
8
21
|
align-items: center;
|
9
22
|
position: relative;
|
10
23
|
}
|
11
24
|
|
12
|
-
.
|
25
|
+
._button_1vct5_18 {
|
13
26
|
border-radius: var(--lp-border-radius-medium);
|
14
27
|
padding-top: 0;
|
15
28
|
padding-bottom: 0;
|
@@ -21,7 +34,7 @@
|
|
21
34
|
background-color: var(--lp-color-bg-interactive-secondary);
|
22
35
|
}
|
23
36
|
|
24
|
-
.
|
37
|
+
._appliedButton_1vct5_37 {
|
25
38
|
color: var(--lp-color-text-ui-primary);
|
26
39
|
height: 2rem;
|
27
40
|
background-color: var(--lp-color-bg-interactive-secondary-hover);
|
@@ -30,8 +43,8 @@
|
|
30
43
|
display: flex;
|
31
44
|
}
|
32
45
|
|
33
|
-
.
|
34
|
-
.
|
46
|
+
._button_1vct5_18,
|
47
|
+
._appliedButton_1vct5_37 {
|
35
48
|
font-family: inherit;
|
36
49
|
font-size: 1.3rem;
|
37
50
|
cursor: pointer;
|
@@ -40,41 +53,34 @@
|
|
40
53
|
border-color: transparent;
|
41
54
|
}
|
42
55
|
|
43
|
-
.
|
56
|
+
._button_1vct5_18:hover, ._appliedButton_1vct5_37:hover {
|
44
57
|
background-color: var(--lp-color-bg-interactive-secondary-hover);
|
45
58
|
border-color: var(--lp-color-border-interactive-secondary-hover);
|
46
59
|
}
|
47
60
|
|
48
|
-
.
|
49
|
-
outline: none;
|
50
|
-
border-color: var(--lp-color-border-interactive-secondary-focus);
|
51
|
-
box-shadow: 0 0 0 2px var(--lp-color-bg-ui-primary),
|
52
|
-
0 0 0 4px var(--lp-color-shadow-interactive-focus);
|
53
|
-
}
|
54
|
-
|
55
|
-
._button_1f7xm_5:focus-visible, ._appliedButton_1f7xm_24:focus-visible {
|
61
|
+
._button_1vct5_18:focus-visible, ._appliedButton_1vct5_37:focus-visible {
|
56
62
|
outline: none;
|
57
63
|
border-color: var(--lp-color-border-interactive-secondary-focus);
|
58
64
|
box-shadow: 0 0 0 2px var(--lp-color-bg-ui-primary),
|
59
65
|
0 0 0 4px var(--lp-color-shadow-interactive-focus);
|
60
66
|
}
|
61
67
|
|
62
|
-
.
|
68
|
+
._name_1vct5_68 {
|
63
69
|
margin-right: 0.5rem;
|
64
70
|
font-weight: var(--lp-font-weight-medium);
|
65
71
|
}
|
66
72
|
|
67
|
-
.
|
73
|
+
._appliedName_1vct5_73 {
|
68
74
|
margin-right: 0.3rem;
|
69
75
|
}
|
70
76
|
|
71
|
-
.
|
77
|
+
._description_1vct5_77 {
|
72
78
|
color: var(--lp-color-text-ui-primary);
|
73
79
|
font-weight: var(--lp-font-weight-medium);
|
74
80
|
}
|
75
81
|
|
76
|
-
.
|
77
|
-
.
|
82
|
+
._description_1vct5_77,
|
83
|
+
._appliedDescription_1vct5_83 {
|
78
84
|
margin-right: 0.5rem;
|
79
85
|
max-width: 16rem;
|
80
86
|
overflow: hidden;
|
@@ -82,56 +88,45 @@
|
|
82
88
|
white-space: nowrap;
|
83
89
|
}
|
84
90
|
|
85
|
-
.
|
91
|
+
._clear_1vct5_91 {
|
86
92
|
cursor: pointer;
|
87
93
|
padding: 0.3rem;
|
88
94
|
}
|
89
95
|
|
90
|
-
.
|
91
|
-
background-color: rgba(0, 0, 0, 0.15);
|
96
|
+
._button_1vct5_18._isClearable_1vct5_96 {
|
92
97
|
padding-right: 3.1rem;
|
98
|
+
background-color: rgba(0, 0, 0, 0.15);
|
99
|
+
background-color: var(--lp-component-filter-color-bg-clearable);
|
93
100
|
}
|
94
101
|
|
95
|
-
.
|
96
|
-
.
|
97
|
-
.
|
102
|
+
._button_1vct5_18._isClearable_1vct5_96:focus,
|
103
|
+
._button_1vct5_18._isClearable_1vct5_96:hover,
|
104
|
+
._button_1vct5_18._isClearable_1vct5_96:active {
|
98
105
|
background-color: rgba(0, 0, 0, 0.2);
|
106
|
+
background-color: var(--lp-component-filter-color-bg-clearable-focus);
|
99
107
|
border-color: var(--lp-color-gray-800);
|
108
|
+
border-color: var(--lp-component-filter-color-border-clearable-focus);
|
100
109
|
}
|
101
110
|
|
102
|
-
:
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
:root[data-theme='dark'] ._button_1f7xm_5._isClearable_1f7xm_83:focus,
|
107
|
-
:root[data-theme='dark'] ._button_1f7xm_5._isClearable_1f7xm_83:hover,
|
108
|
-
:root[data-theme='dark'] ._button_1f7xm_5._isClearable_1f7xm_83:active {
|
109
|
-
background-color: rgba(248, 248, 248, 0.2);
|
110
|
-
border-color: var(--lp-color-gray-500);
|
111
|
-
}
|
112
|
-
|
113
|
-
._button_1f7xm_5:hover:not(._isClearable_1f7xm_83),
|
114
|
-
._button_1f7xm_5:focus:not(._isClearable_1f7xm_83),
|
115
|
-
[data-state='open'] ._button_1f7xm_5:not(._isClearable_1f7xm_83) {
|
111
|
+
._button_1vct5_18:hover:not(._isClearable_1vct5_96),
|
112
|
+
._button_1vct5_18:focus:not(._isClearable_1vct5_96),
|
113
|
+
[data-state='open'] ._button_1vct5_18:not(._isClearable_1vct5_96) {
|
116
114
|
background-color: var(--lp-color-bg-interactive-secondary-hover);
|
117
115
|
border-color: var(--lp-color-border-interactive-secondary-hover);
|
118
116
|
}
|
119
117
|
|
120
|
-
.
|
121
|
-
background-color: var(--lp-color-bg-interactive-secondary-hover);
|
122
|
-
}
|
123
|
-
|
124
|
-
._button_1f7xm_5:focus:not(:focus-visible):not(._isClearable_1f7xm_83):hover {
|
118
|
+
._button_1vct5_18:focus:not(:focus-visible):not(._isClearable_1vct5_96):hover {
|
125
119
|
background-color: var(--lp-color-bg-interactive-secondary-hover);
|
126
120
|
}
|
127
121
|
|
128
|
-
.
|
122
|
+
._clearTooltip_1vct5_121 {
|
129
123
|
line-height: 1;
|
130
124
|
position: absolute;
|
131
125
|
right: 0.7rem;
|
132
126
|
}
|
133
127
|
|
134
|
-
.
|
128
|
+
._filterClearButton_1vct5_127 {
|
129
|
+
-webkit-text-decoration: none;
|
135
130
|
text-decoration: none;
|
136
131
|
color: var(--lp-color-text-interactive-destructive);
|
137
132
|
font-size: 1.3rem;
|
@@ -141,26 +136,26 @@
|
|
141
136
|
border-bottom: 1px solid var(--lp-color-border-interactive-secondary);
|
142
137
|
}
|
143
138
|
|
144
|
-
.
|
145
|
-
.
|
146
|
-
.
|
139
|
+
._filterClearButton_1vct5_127:active,
|
140
|
+
._filterClearButton_1vct5_127:focus,
|
141
|
+
._filterClearButton_1vct5_127:hover {
|
147
142
|
outline: none;
|
148
143
|
box-shadow: none;
|
149
144
|
box-shadow: initial;
|
150
145
|
color: var(--lp-color-text-interactive-destructive);
|
151
146
|
}
|
152
147
|
|
153
|
-
.
|
148
|
+
._filterClearButton_1vct5_127:active {
|
154
149
|
border-bottom-color: var(--lp-color-border-interactive-secondary-active);
|
155
150
|
background-color: var(--lp-color-bg-interactive-secondary-active);
|
156
151
|
}
|
157
152
|
|
158
|
-
.
|
153
|
+
._filterClearButton_1vct5_127:focus {
|
159
154
|
border-bottom-color: var(--lp-color-border-interactive-secondary-focus);
|
160
155
|
background-color: var(--lp-color-bg-interactive-secondary-focus);
|
161
156
|
}
|
162
157
|
|
163
|
-
.
|
158
|
+
._filterClearButton_1vct5_127:hover {
|
164
159
|
border-bottom-color: var(--lp-color-border-interactive-secondary-hover);
|
165
160
|
background-color: var(--lp-color-bg-interactive-secondary-hover);
|
166
161
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@launchpad-ui/filter",
|
3
|
-
"version": "0.5.
|
3
|
+
"version": "0.5.1",
|
4
4
|
"status": "beta",
|
5
5
|
"publishConfig": {
|
6
6
|
"access": "public"
|
@@ -28,12 +28,12 @@
|
|
28
28
|
"dependencies": {
|
29
29
|
"@react-aria/visually-hidden": "3.6.0",
|
30
30
|
"classix": "2.1.17",
|
31
|
-
"@launchpad-ui/button": "~0.
|
32
|
-
"@launchpad-ui/dropdown": "~0.6.
|
33
|
-
"@launchpad-ui/icons": "~0.
|
34
|
-
"@launchpad-ui/menu": "~0.7.
|
35
|
-
"@launchpad-ui/tokens": "~0.
|
36
|
-
"@launchpad-ui/tooltip": "~0.
|
31
|
+
"@launchpad-ui/button": "~0.8.0",
|
32
|
+
"@launchpad-ui/dropdown": "~0.6.31",
|
33
|
+
"@launchpad-ui/icons": "~0.7.2",
|
34
|
+
"@launchpad-ui/menu": "~0.7.7",
|
35
|
+
"@launchpad-ui/tokens": "~0.5.0",
|
36
|
+
"@launchpad-ui/tooltip": "~0.7.1"
|
37
37
|
},
|
38
38
|
"peerDependencies": {
|
39
39
|
"react": "18.2.0",
|