@os-design/core 1.0.138 → 1.0.142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/DatePicker/index.js +70 -27
- package/dist/cjs/DatePicker/index.js.map +1 -1
- package/dist/cjs/Select/SelectToggle.js +104 -41
- package/dist/cjs/Select/SelectToggle.js.map +1 -1
- package/dist/cjs/Select/index.js +15 -5
- package/dist/cjs/Select/index.js.map +1 -1
- package/dist/esm/DatePicker/index.js +60 -26
- package/dist/esm/DatePicker/index.js.map +1 -1
- package/dist/esm/Select/SelectToggle.js +99 -37
- package/dist/esm/Select/SelectToggle.js.map +1 -1
- package/dist/esm/Select/index.js +11 -5
- package/dist/esm/Select/index.js.map +1 -1
- package/dist/types/DatePicker/index.d.ts +4 -0
- package/dist/types/DatePicker/index.d.ts.map +1 -1
- package/dist/types/Select/SelectToggle.d.ts +28 -3
- package/dist/types/Select/SelectToggle.d.ts.map +1 -1
- package/dist/types/Select/index.d.ts +4 -0
- package/dist/types/Select/index.d.ts.map +1 -1
- package/package.json +13 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["paddingStyles","p","paddingVertical","theme","baseHeight","selectToggleListItemHeight","css","inputPaddingHorizontal","openedStyles","opened","unbordered","clr","inputFocusColorBorder","inputFocusColorShadow","unborderedStyles","transitionStyles","unborderedHoverStyles","disabled","buttonGhostColorBgHover","SelectContainer","styled","InputContainer","omitEmotionProps","SelectMenu","Menu","m","min","xs","width","NotFound","div","menuItemHeight","selectNotFoundColorText","InputSearchContainer","menuPaddingVertical","Select","forwardRef","ref","options","placeholder","searchVisible","searchProps","notFoundText","loading","clearVisible","threshold","visibleCount","overscanCount","maxSelectedItems","locale","defaultLocale","value","defaultValue","onChange","onLoadNext","size","placement","rest","useForwardedRef","containerRef","mergedContainerRef","useState","setWidth","inputSearchContainerRef","useRef","setOpened","useForwardedState","forwardedValue","setForwardedValue","resizeHandler","useCallback","window","requestAnimationFrame","current","nextWidth","getBoundingClientRect","useBrowserLayoutEffect","useResizeObserver","useEvent","undefined","setAttribute","selectedItems","useMemo","map","v","option","find","item","title","listBoxId","Math","random","toString","slice","e","includes","key","preventDefault","filter","focus","length","displayName"],"sources":["../../../src/Select/index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { transitionStyles, WithSize } from '@os-design/styles';\nimport {\n omitEmotionProps,\n useEvent,\n useForwardedRef,\n useForwardedState,\n useResizeObserver,\n useBrowserLayoutEffect,\n} from '@os-design/utils';\nimport styled from '@emotion/styled';\nimport { m } from '@os-design/media';\nimport { css } from '@emotion/react';\nimport { clr } from '@os-design/theming';\nimport { InputContainer } from '../Input';\nimport Menu from '../Menu';\nimport InputSearch, { InputSearchProps } from '../InputSearch';\nimport SelectToggle from './SelectToggle';\nimport SelectList, { OptionProps } from './SelectList';\nimport { PopoverProps } from '../Popover';\nimport defaultLocale, { SelectLocale } from './utils/defaultLocale';\n\ntype JsxDivProps = Omit<\n JSX.IntrinsicElements['div'],\n 'value' | 'defaultValue' | 'onChange' | 'ref'\n>;\nexport interface SelectProps\n extends JsxDivProps,\n WithSize,\n Pick<PopoverProps, 'placement'> {\n /**\n * Options of the select.\n * @default undefined\n */\n options?: OptionProps[];\n /**\n * The placeholder of the select.\n * @default undefined\n */\n placeholder?: string;\n /**\n * Whether the search input visible.\n * @default false\n */\n searchVisible?: boolean;\n /**\n * Props of the search input.\n * @default undefined\n */\n searchProps?: InputSearchProps;\n /**\n * Text displayed when there are no list items.\n * @default Not found\n */\n notFoundText?: string;\n /**\n * Whether the border is hidden.\n * @default false\n */\n unbordered?: boolean;\n /**\n * Shows the loading status.\n * @default false\n */\n loading?: boolean;\n /**\n * Whether the select is disabled.\n * @default false\n */\n disabled?: boolean;\n /**\n * Whether the select has the clear button.\n * @default false\n */\n clearVisible?: boolean;\n /**\n * A threshold N means that the onLoadNext function calls when a user scrolls all items except N.\n * @default 10\n */\n threshold?: number;\n /**\n * Defines how many items inside of the visible \"window\" to render.\n * @default 6\n */\n visibleCount?: number;\n /**\n * Defines how many items outside of the visible \"window\" to render at all times.\n * @default 10\n */\n overscanCount?: number;\n /**\n * The max number of options that the user can select.\n * @default 1\n */\n maxSelectedItems?: number | 'all';\n /**\n * The locale.\n * @default undefined\n */\n locale?: SelectLocale;\n /**\n * Selected options.\n * @default undefined\n */\n value?: string[];\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: string[];\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: string[]) => void;\n /**\n * The callback to load more items.\n * @default undefined\n */\n onLoadNext?: () => void;\n}\n\nconst paddingStyles = (p) => {\n const paddingVertical =\n (p.theme.baseHeight - p.theme.selectToggleListItemHeight) / 2;\n\n return css`\n padding: calc(${paddingVertical}em - 1px) 3.5em\n calc(${paddingVertical}em - 1px) ${p.theme.inputPaddingHorizontal}em;\n `;\n};\n\nconst openedStyles = (p) =>\n p.opened &&\n !p.unbordered &&\n css`\n border-color: ${clr(p.theme.inputFocusColorBorder)};\n box-shadow: 0 0 0 0.15em ${clr(p.theme.inputFocusColorShadow)};\n `;\n\nconst unborderedStyles = (p) =>\n p.unbordered &&\n css`\n border: 0;\n padding-right: 1.8em;\n box-shadow: none !important;\n ${transitionStyles('background-color')(p)};\n `;\n\nconst unborderedHoverStyles = (p) =>\n p.unbordered &&\n !p.disabled &&\n css`\n @media (hover: hover) {\n &:hover,\n &:focus {\n background-color: ${clr(p.theme.buttonGhostColorBgHover)};\n }\n }\n `;\n\ninterface SelectContainerProps {\n opened: boolean;\n unbordered?: boolean;\n disabled?: boolean;\n}\nexport const SelectContainer = styled(\n InputContainer,\n omitEmotionProps('opened', 'unbordered', 'disabled')\n)<SelectContainerProps>`\n cursor: ${(p) => (!p.disabled ? 'pointer' : 'not-allowed')};\n user-select: none;\n position: relative;\n display: flex;\n align-items: center;\n\n height: unset;\n min-height: ${(p) => p.theme.baseHeight}em;\n\n ${paddingStyles};\n ${openedStyles};\n ${unborderedStyles};\n ${unborderedHoverStyles};\n`;\n\ninterface SelectMenuProps {\n width: number;\n}\nconst SelectMenu = styled(Menu, omitEmotionProps('width'))<SelectMenuProps>`\n padding-top: 0;\n padding-bottom: 0;\n max-height: unset;\n\n ${m.min.xs} {\n width: ${(p) => p.width}px;\n }\n`;\n\nconst NotFound = styled.div`\n height: ${(p) => p.theme.menuItemHeight}em;\n display: flex;\n align-items: center;\n\n padding: 0 ${(p) => p.theme.inputPaddingHorizontal}em;\n color: ${(p) => clr(p.theme.selectNotFoundColorText)};\n`;\n\nconst InputSearchContainer = styled.div`\n padding: ${(p) => p.theme.menuPaddingVertical}em\n ${(p) => p.theme.inputPaddingHorizontal}em 0;\n`;\n\n/**\n * The component that allows to pick a value from predefined options.\n */\nconst Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options = [],\n placeholder,\n searchVisible = false,\n searchProps = {},\n notFoundText = 'Not found',\n unbordered = false,\n loading = false,\n disabled = false,\n clearVisible = false,\n threshold = 10,\n visibleCount = 6,\n overscanCount = 10,\n maxSelectedItems = 1,\n locale = defaultLocale,\n value,\n defaultValue,\n onChange,\n onLoadNext = () => {},\n size,\n placement,\n ...rest\n },\n ref\n ) => {\n const [containerRef, mergedContainerRef] = useForwardedRef(ref);\n const [width, setWidth] = useState(0);\n const inputSearchContainerRef = useRef<HTMLDivElement>(null);\n const [opened, setOpened] = useState(false);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n /**\n * Detect the width of the container when the select was opened and update\n * it when either the container size or the window size has been changed.\n */\n const resizeHandler = useCallback(() => {\n window.requestAnimationFrame(() => {\n if (!opened || !containerRef.current) return;\n const nextWidth = containerRef.current.getBoundingClientRect().width;\n if (width === nextWidth) return;\n setWidth(nextWidth);\n });\n }, [opened, containerRef, width]);\n useBrowserLayoutEffect(() => resizeHandler(), [resizeHandler]);\n useResizeObserver(containerRef, resizeHandler);\n useEvent(\n (typeof window !== 'undefined' ? window : undefined) as EventTarget,\n 'resize',\n resizeHandler\n );\n\n // Replace the aria-haspopup attribute from menu to listbox\n useBrowserLayoutEffect(() => {\n if (!containerRef.current) return;\n containerRef.current.setAttribute('aria-haspopup', 'listbox');\n }, []);\n\n const selectedItems = useMemo(\n () =>\n (forwardedValue || []).map((v) => {\n const option = (options || []).find((item) => item.value === v);\n return { title: option ? option.title || '' : '', value: v };\n }),\n [forwardedValue, options]\n );\n\n const listBoxId = useMemo(\n () => `listbox-${Math.random().toString(36).slice(2, 11)}`,\n []\n );\n\n return (\n <>\n <SelectContainer\n opened={opened}\n unbordered={unbordered}\n disabled={disabled}\n size={size}\n tabIndex={!disabled ? 0 : -1}\n onClick={() => {\n if (disabled) return;\n setOpened(!opened);\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (['Enter', ' '].includes(e.key)) {\n setOpened(!opened);\n e.preventDefault();\n }\n }}\n onMouseDown={(e) => e.preventDefault()}\n role='combobox'\n aria-disabled={disabled}\n aria-busy={loading}\n aria-haspopup='listbox'\n aria-owns={listBoxId}\n {...rest}\n ref={mergedContainerRef}\n >\n <SelectToggle\n selectedItems={selectedItems}\n onDelete={(v) =>\n setForwardedValue(\n (forwardedValue || []).filter((item) => item !== v)\n )\n }\n onClear={() => {\n setForwardedValue([]);\n if (!containerRef.current) return;\n containerRef.current.focus();\n }}\n opened={opened}\n unbordered={unbordered}\n multiple={maxSelectedItems !== 1}\n disabled={disabled}\n clearVisible={clearVisible}\n placeholder={placeholder}\n loading={loading}\n locale={locale}\n />\n </SelectContainer>\n\n <SelectMenu\n trigger={containerRef}\n visible={opened}\n onClose={() => setOpened(false)}\n size={size}\n width={width}\n closeOnSelect={maxSelectedItems === 1}\n modalTitle={placeholder}\n placement={placement}\n >\n {searchVisible && (\n <InputSearchContainer ref={inputSearchContainerRef}>\n <InputSearch {...searchProps} />\n </InputSearchContainer>\n )}\n\n {options.length > 0 ? (\n <SelectList\n searchVisible={searchVisible}\n options={options}\n visibleCount={visibleCount}\n overscanCount={overscanCount}\n threshold={threshold}\n onLoadNext={onLoadNext}\n maxSelectedItems={maxSelectedItems}\n containerRef={containerRef}\n value={forwardedValue}\n onChange={setForwardedValue}\n id={listBoxId}\n size={size}\n />\n ) : (\n <NotFound>{notFoundText}</NotFound>\n )}\n </SelectMenu>\n </>\n );\n }\n);\n\nSelect.displayName = 'Select';\n\nexport default Select;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["paddingStyles","p","paddingVertical","theme","baseHeight","selectToggleListItemHeight","css","openedStyles","opened","unbordered","clr","inputFocusColorBorder","inputFocusColorShadow","unborderedStyles","transitionStyles","unborderedHoverStyles","disabled","buttonGhostColorBgHover","SelectContainer","styled","InputContainer","omitEmotionProps","SelectMenu","Menu","m","min","xs","width","NotFound","div","menuItemHeight","inputPaddingHorizontal","selectNotFoundColorText","InputSearchContainer","menuPaddingVertical","Select","forwardRef","ref","options","left","leftHasPadding","right","rightHasPadding","placeholder","searchVisible","searchProps","notFoundText","loading","clearVisible","threshold","visibleCount","overscanCount","maxSelectedItems","locale","defaultLocale","value","defaultValue","onChange","onLoadNext","size","placement","rest","useForwardedRef","containerRef","mergedContainerRef","useState","setWidth","inputSearchContainerRef","useRef","setOpened","useForwardedState","forwardedValue","setForwardedValue","resizeHandler","useCallback","window","requestAnimationFrame","current","nextWidth","getBoundingClientRect","useBrowserLayoutEffect","useResizeObserver","useEvent","undefined","setAttribute","selectedItems","useMemo","map","v","option","find","item","title","listBoxId","Math","random","toString","slice","e","includes","key","preventDefault","filter","focus","length","displayName"],"sources":["../../../src/Select/index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { transitionStyles, WithSize } from '@os-design/styles';\nimport {\n omitEmotionProps,\n useEvent,\n useForwardedRef,\n useForwardedState,\n useResizeObserver,\n useBrowserLayoutEffect,\n} from '@os-design/utils';\nimport styled from '@emotion/styled';\nimport { m } from '@os-design/media';\nimport { css } from '@emotion/react';\nimport { clr } from '@os-design/theming';\nimport { InputContainer } from '../Input';\nimport Menu from '../Menu';\nimport InputSearch, { InputSearchProps } from '../InputSearch';\nimport SelectToggle from './SelectToggle';\nimport SelectList, { OptionProps } from './SelectList';\nimport { PopoverProps } from '../Popover';\nimport defaultLocale, { SelectLocale } from './utils/defaultLocale';\n\ntype JsxDivProps = Omit<\n JSX.IntrinsicElements['div'],\n 'value' | 'defaultValue' | 'onChange' | 'ref'\n>;\nexport interface SelectProps\n extends JsxDivProps,\n WithSize,\n Pick<PopoverProps, 'placement'> {\n /**\n * Options of the select.\n * @default undefined\n */\n options?: OptionProps[];\n /**\n * The component located on the left side.\n * @default undefined\n */\n left?: React.ReactNode;\n /**\n * Adds padding to the left component.\n * It can be useful when passing an icon or text in the left component.\n * @default false\n */\n leftHasPadding?: boolean;\n /**\n * The component located on the right side.\n * @default undefined\n */\n right?: React.ReactNode;\n /**\n * Adds padding to the right component.\n * It can be useful when passing an icon or text in the right component.\n * @default false\n */\n rightHasPadding?: boolean;\n /**\n * The placeholder of the select.\n * @default undefined\n */\n placeholder?: string;\n /**\n * Whether the search input visible.\n * @default false\n */\n searchVisible?: boolean;\n /**\n * Props of the search input.\n * @default undefined\n */\n searchProps?: InputSearchProps;\n /**\n * Text displayed when there are no list items.\n * @default Not found\n */\n notFoundText?: string;\n /**\n * Whether the border is hidden.\n * @default false\n */\n unbordered?: boolean;\n /**\n * Shows the loading status.\n * @default false\n */\n loading?: boolean;\n /**\n * Whether the select is disabled.\n * @default false\n */\n disabled?: boolean;\n /**\n * Whether the select has the clear button.\n * @default false\n */\n clearVisible?: boolean;\n /**\n * A threshold N means that the onLoadNext function calls when a user scrolls all items except N.\n * @default 10\n */\n threshold?: number;\n /**\n * Defines how many items inside of the visible \"window\" to render.\n * @default 6\n */\n visibleCount?: number;\n /**\n * Defines how many items outside of the visible \"window\" to render at all times.\n * @default 10\n */\n overscanCount?: number;\n /**\n * The max number of options that the user can select.\n * @default 1\n */\n maxSelectedItems?: number | 'all';\n /**\n * The locale.\n * @default undefined\n */\n locale?: SelectLocale;\n /**\n * Selected options.\n * @default undefined\n */\n value?: string[];\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: string[];\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: string[]) => void;\n /**\n * The callback to load more items.\n * @default undefined\n */\n onLoadNext?: () => void;\n}\n\nconst paddingStyles = (p) => {\n const paddingVertical =\n (p.theme.baseHeight - p.theme.selectToggleListItemHeight) / 2;\n\n return css`\n padding: calc(${paddingVertical}em - 1px) 0;\n `;\n};\n\nconst openedStyles = (p) =>\n p.opened &&\n !p.unbordered &&\n css`\n border-color: ${clr(p.theme.inputFocusColorBorder)};\n box-shadow: 0 0 0 0.15em ${clr(p.theme.inputFocusColorShadow)};\n `;\n\nconst unborderedStyles = (p) =>\n p.unbordered &&\n css`\n border: 0;\n box-shadow: none !important;\n ${transitionStyles('background-color')(p)};\n `;\n\nconst unborderedHoverStyles = (p) =>\n p.unbordered &&\n !p.disabled &&\n css`\n @media (hover: hover) {\n &:hover,\n &:focus {\n background-color: ${clr(p.theme.buttonGhostColorBgHover)};\n }\n }\n `;\n\ninterface SelectContainerProps {\n opened: boolean;\n unbordered?: boolean;\n disabled?: boolean;\n}\nexport const SelectContainer = styled(\n InputContainer,\n omitEmotionProps('opened', 'unbordered', 'disabled')\n)<SelectContainerProps>`\n cursor: ${(p) => (!p.disabled ? 'pointer' : 'not-allowed')};\n user-select: none;\n position: relative;\n display: flex;\n align-items: center;\n\n height: unset;\n min-height: ${(p) => p.theme.baseHeight}em;\n\n ${paddingStyles};\n ${openedStyles};\n ${unborderedStyles};\n ${unborderedHoverStyles};\n`;\n\ninterface SelectMenuProps {\n width: number;\n}\nconst SelectMenu = styled(Menu, omitEmotionProps('width'))<SelectMenuProps>`\n padding-top: 0;\n padding-bottom: 0;\n max-height: unset;\n\n ${m.min.xs} {\n width: ${(p) => p.width}px;\n }\n`;\n\nconst NotFound = styled.div`\n height: ${(p) => p.theme.menuItemHeight}em;\n display: flex;\n align-items: center;\n\n padding: 0 ${(p) => p.theme.inputPaddingHorizontal}em;\n color: ${(p) => clr(p.theme.selectNotFoundColorText)};\n`;\n\nconst InputSearchContainer = styled.div`\n padding: ${(p) => p.theme.menuPaddingVertical}em\n ${(p) => p.theme.inputPaddingHorizontal}em 0;\n`;\n\n/**\n * The component that allows to pick a value from predefined options.\n */\nconst Select = forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options = [],\n left,\n leftHasPadding = false,\n right,\n rightHasPadding = false,\n placeholder,\n searchVisible = false,\n searchProps = {},\n notFoundText = 'Not found',\n unbordered = false,\n loading = false,\n disabled = false,\n clearVisible = false,\n threshold = 10,\n visibleCount = 6,\n overscanCount = 10,\n maxSelectedItems = 1,\n locale = defaultLocale,\n value,\n defaultValue,\n onChange,\n onLoadNext = () => {},\n size,\n placement,\n ...rest\n },\n ref\n ) => {\n const [containerRef, mergedContainerRef] = useForwardedRef(ref);\n const [width, setWidth] = useState(0);\n const inputSearchContainerRef = useRef<HTMLDivElement>(null);\n const [opened, setOpened] = useState(false);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n /**\n * Detect the width of the container when the select was opened and update\n * it when either the container size or the window size has been changed.\n */\n const resizeHandler = useCallback(() => {\n window.requestAnimationFrame(() => {\n if (!opened || !containerRef.current) return;\n const nextWidth = containerRef.current.getBoundingClientRect().width;\n if (width === nextWidth) return;\n setWidth(nextWidth);\n });\n }, [opened, containerRef, width]);\n useBrowserLayoutEffect(() => resizeHandler(), [resizeHandler]);\n useResizeObserver(containerRef, resizeHandler);\n useEvent(\n (typeof window !== 'undefined' ? window : undefined) as EventTarget,\n 'resize',\n resizeHandler\n );\n\n // Replace the aria-haspopup attribute from menu to listbox\n useBrowserLayoutEffect(() => {\n if (!containerRef.current) return;\n containerRef.current.setAttribute('aria-haspopup', 'listbox');\n }, []);\n\n const selectedItems = useMemo(\n () =>\n (forwardedValue || []).map((v) => {\n const option = (options || []).find((item) => item.value === v);\n return { title: option ? option.title || '' : '', value: v };\n }),\n [forwardedValue, options]\n );\n\n const listBoxId = useMemo(\n () => `listbox-${Math.random().toString(36).slice(2, 11)}`,\n []\n );\n\n return (\n <>\n <SelectContainer\n opened={opened}\n unbordered={unbordered}\n disabled={disabled}\n size={size}\n tabIndex={!disabled ? 0 : -1}\n onClick={() => {\n if (disabled) return;\n setOpened(!opened);\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (['Enter', ' '].includes(e.key)) {\n setOpened(!opened);\n e.preventDefault();\n }\n }}\n onMouseDown={(e) => e.preventDefault()}\n role='combobox'\n aria-disabled={disabled}\n aria-busy={loading}\n aria-haspopup='listbox'\n aria-owns={listBoxId}\n {...rest}\n ref={mergedContainerRef}\n >\n <SelectToggle\n selectedItems={selectedItems}\n onDelete={(v) =>\n setForwardedValue(\n (forwardedValue || []).filter((item) => item !== v)\n )\n }\n onClear={() => {\n setForwardedValue([]);\n if (!containerRef.current) return;\n containerRef.current.focus();\n }}\n opened={opened}\n multiple={maxSelectedItems !== 1}\n placeholder={placeholder}\n left={left}\n leftHasPadding={leftHasPadding}\n right={right}\n rightHasPadding={rightHasPadding}\n unbordered={unbordered}\n disabled={disabled}\n clearVisible={clearVisible}\n loading={loading}\n locale={locale}\n />\n </SelectContainer>\n\n <SelectMenu\n trigger={containerRef}\n visible={opened}\n onClose={() => setOpened(false)}\n size={size}\n width={width}\n closeOnSelect={maxSelectedItems === 1}\n modalTitle={placeholder}\n placement={placement}\n >\n {searchVisible && (\n <InputSearchContainer ref={inputSearchContainerRef}>\n <InputSearch {...searchProps} />\n </InputSearchContainer>\n )}\n\n {options.length > 0 ? (\n <SelectList\n searchVisible={searchVisible}\n options={options}\n visibleCount={visibleCount}\n overscanCount={overscanCount}\n threshold={threshold}\n onLoadNext={onLoadNext}\n maxSelectedItems={maxSelectedItems}\n containerRef={containerRef}\n value={forwardedValue}\n onChange={setForwardedValue}\n id={listBoxId}\n size={size}\n />\n ) : (\n <NotFound>{notFoundText}</NotFound>\n )}\n </SelectMenu>\n </>\n );\n }\n);\n\nSelect.displayName = 'Select';\n\nexport default Select;\n"],"mappings":"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"}
|
|
@@ -5,8 +5,9 @@ import { useForwardedRef, useForwardedState, useKeyPress } from '@os-design/util
|
|
|
5
5
|
import { Down, Up } from '@os-design/icons';
|
|
6
6
|
import { useIsMinWidth } from '@os-design/media';
|
|
7
7
|
import { defaultLocale, defaultFormat, getAccessibilityDateLabel } from '@os-design/date-picker-utils';
|
|
8
|
+
import { ThemeOverrider } from '@os-design/theming';
|
|
8
9
|
import { SelectContainer } from '../Select';
|
|
9
|
-
import {
|
|
10
|
+
import { Content, LeftAddon, RightAddon, ClearIcon, IconContainer, Placeholder, Title } from '../Select/SelectToggle';
|
|
10
11
|
import Popover from '../Popover';
|
|
11
12
|
import Modal from '../Modal';
|
|
12
13
|
import DatePickerCalendar from './DatePickerCalendar';
|
|
@@ -16,6 +17,10 @@ import Button from '../Button';
|
|
|
16
17
|
* The component to choose a date.
|
|
17
18
|
*/
|
|
18
19
|
const DatePicker = /*#__PURE__*/forwardRef(({
|
|
20
|
+
left,
|
|
21
|
+
leftHasPadding = false,
|
|
22
|
+
right,
|
|
23
|
+
rightHasPadding = false,
|
|
19
24
|
placeholder,
|
|
20
25
|
disabled = false,
|
|
21
26
|
format = defaultFormat,
|
|
@@ -52,6 +57,41 @@ const DatePicker = /*#__PURE__*/forwardRef(({
|
|
|
52
57
|
closeHandler();
|
|
53
58
|
}
|
|
54
59
|
});
|
|
60
|
+
const valueIsSpecified = useMemo(() => formattedValue !== undefined && formattedValue !== null, [formattedValue]);
|
|
61
|
+
const rightValue = useMemo(() => {
|
|
62
|
+
if (valueIsSpecified) {
|
|
63
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
64
|
+
"aria-hidden": true
|
|
65
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
66
|
+
type: "ghost",
|
|
67
|
+
wide: "never",
|
|
68
|
+
size: "small",
|
|
69
|
+
disabled: disabled,
|
|
70
|
+
onClick: e => {
|
|
71
|
+
setForwardedValue(null);
|
|
72
|
+
e.stopPropagation();
|
|
73
|
+
},
|
|
74
|
+
onKeyDown: e => {
|
|
75
|
+
if (disabled) return;
|
|
76
|
+
|
|
77
|
+
if (['Enter', ' '].includes(e.key)) {
|
|
78
|
+
setForwardedValue(null);
|
|
79
|
+
if (!containerRef.current) return;
|
|
80
|
+
containerRef.current.focus();
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
e.stopPropagation();
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"aria-label": locale.clearLabel
|
|
86
|
+
}, /*#__PURE__*/React.createElement(ClearIcon, null)));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return right || /*#__PURE__*/React.createElement(IconContainer, null, opened ? /*#__PURE__*/React.createElement(Up, null) : /*#__PURE__*/React.createElement(Down, null));
|
|
90
|
+
}, [containerRef, disabled, locale.clearLabel, opened, right, setForwardedValue, valueIsSpecified]);
|
|
91
|
+
const rightHasPaddingValue = useMemo(() => {
|
|
92
|
+
if (valueIsSpecified) return false;
|
|
93
|
+
return right ? rightHasPadding : true;
|
|
94
|
+
}, [right, rightHasPadding, valueIsSpecified]);
|
|
55
95
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SelectContainer, _extends({
|
|
56
96
|
opened: opened,
|
|
57
97
|
disabled: disabled,
|
|
@@ -75,33 +115,27 @@ const DatePicker = /*#__PURE__*/forwardRef(({
|
|
|
75
115
|
"aria-disabled": disabled
|
|
76
116
|
}, rest, {
|
|
77
117
|
ref: mergedContainerRef
|
|
78
|
-
}),
|
|
118
|
+
}), left && /*#__PURE__*/React.createElement(ThemeOverrider, {
|
|
119
|
+
overrides: t => ({
|
|
120
|
+
buttonPaddingHorizontal: 0.8,
|
|
121
|
+
baseHeight: t.selectToggleListItemHeight / t.sizes.small
|
|
122
|
+
})
|
|
123
|
+
}, /*#__PURE__*/React.createElement(LeftAddon, {
|
|
124
|
+
hasPadding: leftHasPadding
|
|
125
|
+
}, left)), /*#__PURE__*/React.createElement(Content, {
|
|
126
|
+
hasLeft: !!left,
|
|
127
|
+
hasRight: !!right
|
|
128
|
+
}, valueIsSpecified ? /*#__PURE__*/React.createElement(Title, {
|
|
79
129
|
disabled: disabled,
|
|
80
130
|
"aria-hidden": true
|
|
81
|
-
}, formattedValue), /*#__PURE__*/React.createElement(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
setForwardedValue(null);
|
|
90
|
-
e.stopPropagation();
|
|
91
|
-
},
|
|
92
|
-
onKeyDown: e => {
|
|
93
|
-
if (disabled) return;
|
|
94
|
-
|
|
95
|
-
if (['Enter', ' '].includes(e.key)) {
|
|
96
|
-
setForwardedValue(null);
|
|
97
|
-
if (!containerRef.current) return;
|
|
98
|
-
containerRef.current.focus();
|
|
99
|
-
e.preventDefault();
|
|
100
|
-
e.stopPropagation();
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
"aria-label": locale.clearLabel
|
|
104
|
-
}, /*#__PURE__*/React.createElement(ClearIcon, null)))) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Placeholder, null, placeholder), /*#__PURE__*/React.createElement(IconContainer, null, opened ? /*#__PURE__*/React.createElement(Up, null) : /*#__PURE__*/React.createElement(Down, null)))), isMinXs ? /*#__PURE__*/React.createElement(Popover, {
|
|
131
|
+
}, formattedValue) : /*#__PURE__*/React.createElement(Placeholder, null, placeholder)), rightValue && /*#__PURE__*/React.createElement(ThemeOverrider, {
|
|
132
|
+
overrides: t => ({
|
|
133
|
+
buttonPaddingHorizontal: 0.8,
|
|
134
|
+
baseHeight: t.selectToggleListItemHeight / t.sizes.small
|
|
135
|
+
})
|
|
136
|
+
}, /*#__PURE__*/React.createElement(RightAddon, {
|
|
137
|
+
hasPadding: rightHasPaddingValue
|
|
138
|
+
}, rightValue))), isMinXs ? /*#__PURE__*/React.createElement(Popover, {
|
|
105
139
|
trigger: containerRef,
|
|
106
140
|
placement: "bottom-start",
|
|
107
141
|
visible: opened,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["React","forwardRef","useCallback","useMemo","useState","useForwardedRef","useForwardedState","useKeyPress","Down","Up","useIsMinWidth","defaultLocale","defaultFormat","getAccessibilityDateLabel","SelectContainer","ClearButtonContainer","ClearIcon","IconContainer","Placeholder","Title","Popover","Modal","DatePickerCalendar","Button","DatePicker","placeholder","disabled","format","firstDayOfWeek","locale","value","defaultValue","onChange","size","rest","ref","containerRef","mergedContainerRef","opened","setOpened","forwardedValue","setForwardedValue","formattedValue","Date","closeHandler","window","undefined","isMinXs","calendar","v","e","includes","key","preventDefault","stopPropagation","current","focus","clearLabel","displayName"],"sources":["../../../src/DatePicker/index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo, useState } from 'react';\nimport { WithSize } from '@os-design/styles';\nimport {\n useForwardedRef,\n useForwardedState,\n useKeyPress,\n} from '@os-design/utils';\nimport { Down, Up } from '@os-design/icons';\nimport { useIsMinWidth } from '@os-design/media';\nimport {\n defaultLocale,\n DatePickerLocale,\n defaultFormat,\n getAccessibilityDateLabel,\n} from '@os-design/date-picker-utils';\nimport { SelectContainer } from '../Select';\nimport {\n ClearButtonContainer,\n ClearIcon,\n IconContainer,\n Placeholder,\n Title,\n} from '../Select/SelectToggle';\nimport Popover from '../Popover';\nimport Modal from '../Modal';\nimport DatePickerCalendar from './DatePickerCalendar';\nimport Button from '../Button';\n\ntype JsxDivProps = Omit<\n JSX.IntrinsicElements['div'],\n 'value' | 'defaultValue' | 'onChange' | 'ref'\n>;\nexport interface DatePickerProps extends JsxDivProps, WithSize {\n /**\n * The placeholder of the date picker.\n * @default undefined\n */\n placeholder?: string;\n /**\n * Whether the date picker is disabled.\n * @default false\n */\n disabled?: boolean;\n /**\n * The format of the date.\n * @default undefined\n */\n format?: (date: Date) => string;\n /**\n * The first day of the week.\n * @default sunday\n */\n firstDayOfWeek?: 'sunday' | 'monday';\n /**\n * The locale of the date picker.\n * @default undefined\n */\n locale?: DatePickerLocale;\n /**\n * Selected timestamp.\n * @default undefined\n */\n value?: number | null;\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: number | null;\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: number | null) => void;\n}\n\n/**\n * The component to choose a date.\n */\nconst DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n placeholder,\n disabled = false,\n format = defaultFormat,\n firstDayOfWeek = 'sunday',\n locale = defaultLocale,\n value,\n defaultValue,\n onChange,\n size,\n ...rest\n },\n ref\n ) => {\n const [containerRef, mergedContainerRef] = useForwardedRef(ref);\n const [opened, setOpened] = useState(false);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n const formattedValue = useMemo(() => {\n if (!forwardedValue) return forwardedValue;\n return format(new Date(forwardedValue * 1000), locale);\n }, [forwardedValue, format, locale]);\n\n const closeHandler = useCallback(() => {\n setOpened(false);\n }, []);\n\n useKeyPress(\n (typeof window !== 'undefined' ? window : undefined) as EventTarget,\n 'Escape',\n closeHandler\n );\n const isMinXs = useIsMinWidth('xs');\n\n const calendar = (\n <DatePickerCalendar\n firstDayOfWeek={firstDayOfWeek}\n locale={locale}\n value={forwardedValue}\n onChange={(v) => {\n setForwardedValue(v);\n closeHandler();\n }}\n />\n );\n\n return (\n <>\n <SelectContainer\n opened={opened}\n disabled={disabled}\n size={size}\n tabIndex={!disabled ? 0 : -1}\n onClick={() => {\n if (disabled) return;\n setOpened(!opened);\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (['Enter', ' '].includes(e.key)) {\n setOpened(!opened);\n e.preventDefault();\n }\n }}\n onMouseDown={(e) => e.preventDefault()}\n role='combobox'\n aria-label={\n forwardedValue !== undefined && forwardedValue !== null\n ? getAccessibilityDateLabel(\n new Date(forwardedValue * 1000),\n locale\n )\n : undefined\n }\n aria-disabled={disabled}\n {...rest}\n ref={mergedContainerRef}\n >\n {formattedValue !== undefined && formattedValue !== null ? (\n <>\n <Title disabled={disabled} aria-hidden>\n {formattedValue}\n </Title>\n <ClearButtonContainer aria-hidden>\n <Button\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={(e) => {\n setForwardedValue(null);\n e.stopPropagation();\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (['Enter', ' '].includes(e.key)) {\n setForwardedValue(null);\n if (!containerRef.current) return;\n containerRef.current.focus();\n e.preventDefault();\n e.stopPropagation();\n }\n }}\n aria-label={locale.clearLabel}\n >\n <ClearIcon />\n </Button>\n </ClearButtonContainer>\n </>\n ) : (\n <>\n <Placeholder>{placeholder}</Placeholder>\n <IconContainer>{opened ? <Up /> : <Down />}</IconContainer>\n </>\n )}\n </SelectContainer>\n\n {isMinXs ? (\n <Popover\n trigger={containerRef}\n placement='bottom-start'\n visible={opened}\n onClose={closeHandler}\n size={size}\n >\n {calendar}\n </Popover>\n ) : (\n <Modal\n title={placeholder}\n footer={null}\n visible={opened}\n onClose={closeHandler}\n size={size}\n >\n {calendar}\n </Modal>\n )}\n </>\n );\n }\n);\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["React","forwardRef","useCallback","useMemo","useState","useForwardedRef","useForwardedState","useKeyPress","Down","Up","useIsMinWidth","defaultLocale","defaultFormat","getAccessibilityDateLabel","ThemeOverrider","SelectContainer","Content","LeftAddon","RightAddon","ClearIcon","IconContainer","Placeholder","Title","Popover","Modal","DatePickerCalendar","Button","DatePicker","left","leftHasPadding","right","rightHasPadding","placeholder","disabled","format","firstDayOfWeek","locale","value","defaultValue","onChange","size","rest","ref","containerRef","mergedContainerRef","opened","setOpened","forwardedValue","setForwardedValue","formattedValue","Date","closeHandler","window","undefined","isMinXs","calendar","v","valueIsSpecified","rightValue","e","stopPropagation","includes","key","current","focus","preventDefault","clearLabel","rightHasPaddingValue","t","buttonPaddingHorizontal","baseHeight","selectToggleListItemHeight","sizes","small","displayName"],"sources":["../../../src/DatePicker/index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useMemo, useState } from 'react';\nimport { WithSize } from '@os-design/styles';\nimport {\n useForwardedRef,\n useForwardedState,\n useKeyPress,\n} from '@os-design/utils';\nimport { Down, Up } from '@os-design/icons';\nimport { useIsMinWidth } from '@os-design/media';\nimport {\n defaultLocale,\n DatePickerLocale,\n defaultFormat,\n getAccessibilityDateLabel,\n} from '@os-design/date-picker-utils';\nimport { ThemeOverrider } from '@os-design/theming';\nimport { SelectContainer } from '../Select';\nimport {\n Content,\n LeftAddon,\n RightAddon,\n ClearIcon,\n IconContainer,\n Placeholder,\n Title,\n} from '../Select/SelectToggle';\nimport Popover from '../Popover';\nimport Modal from '../Modal';\nimport DatePickerCalendar from './DatePickerCalendar';\nimport Button from '../Button';\n\ntype JsxDivProps = Omit<\n JSX.IntrinsicElements['div'],\n 'value' | 'defaultValue' | 'onChange' | 'ref'\n>;\nexport interface DatePickerProps extends JsxDivProps, WithSize {\n /**\n * The component located on the left side.\n * @default undefined\n */\n left?: React.ReactNode;\n /**\n * Adds padding to the left component.\n * It can be useful when passing an icon or text in the left component.\n * @default false\n */\n leftHasPadding?: boolean;\n /**\n * The component located on the right side.\n * @default undefined\n */\n right?: React.ReactNode;\n /**\n * Adds padding to the right component.\n * It can be useful when passing an icon or text in the right component.\n * @default false\n */\n rightHasPadding?: boolean;\n /**\n * The placeholder of the date picker.\n * @default undefined\n */\n placeholder?: string;\n /**\n * Whether the date picker is disabled.\n * @default false\n */\n disabled?: boolean;\n /**\n * The format of the date.\n * @default undefined\n */\n format?: (date: Date) => string;\n /**\n * The first day of the week.\n * @default sunday\n */\n firstDayOfWeek?: 'sunday' | 'monday';\n /**\n * The locale of the date picker.\n * @default undefined\n */\n locale?: DatePickerLocale;\n /**\n * Selected timestamp.\n * @default undefined\n */\n value?: number | null;\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: number | null;\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: number | null) => void;\n}\n\n/**\n * The component to choose a date.\n */\nconst DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n left,\n leftHasPadding = false,\n right,\n rightHasPadding = false,\n placeholder,\n disabled = false,\n format = defaultFormat,\n firstDayOfWeek = 'sunday',\n locale = defaultLocale,\n value,\n defaultValue,\n onChange,\n size,\n ...rest\n },\n ref\n ) => {\n const [containerRef, mergedContainerRef] = useForwardedRef(ref);\n const [opened, setOpened] = useState(false);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n const formattedValue = useMemo(() => {\n if (!forwardedValue) return forwardedValue;\n return format(new Date(forwardedValue * 1000), locale);\n }, [forwardedValue, format, locale]);\n\n const closeHandler = useCallback(() => {\n setOpened(false);\n }, []);\n\n useKeyPress(\n (typeof window !== 'undefined' ? window : undefined) as EventTarget,\n 'Escape',\n closeHandler\n );\n const isMinXs = useIsMinWidth('xs');\n\n const calendar = (\n <DatePickerCalendar\n firstDayOfWeek={firstDayOfWeek}\n locale={locale}\n value={forwardedValue}\n onChange={(v) => {\n setForwardedValue(v);\n closeHandler();\n }}\n />\n );\n\n const valueIsSpecified = useMemo(\n () => formattedValue !== undefined && formattedValue !== null,\n [formattedValue]\n );\n\n const rightValue = useMemo(() => {\n if (valueIsSpecified) {\n return (\n <div aria-hidden>\n <Button\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={(e) => {\n setForwardedValue(null);\n e.stopPropagation();\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (['Enter', ' '].includes(e.key)) {\n setForwardedValue(null);\n if (!containerRef.current) return;\n containerRef.current.focus();\n e.preventDefault();\n e.stopPropagation();\n }\n }}\n aria-label={locale.clearLabel}\n >\n <ClearIcon />\n </Button>\n </div>\n );\n }\n return (\n right || <IconContainer>{opened ? <Up /> : <Down />}</IconContainer>\n );\n }, [\n containerRef,\n disabled,\n locale.clearLabel,\n opened,\n right,\n setForwardedValue,\n valueIsSpecified,\n ]);\n\n const rightHasPaddingValue = useMemo(() => {\n if (valueIsSpecified) return false;\n return right ? rightHasPadding : true;\n }, [right, rightHasPadding, valueIsSpecified]);\n\n return (\n <>\n <SelectContainer\n opened={opened}\n disabled={disabled}\n size={size}\n tabIndex={!disabled ? 0 : -1}\n onClick={() => {\n if (disabled) return;\n setOpened(!opened);\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (['Enter', ' '].includes(e.key)) {\n setOpened(!opened);\n e.preventDefault();\n }\n }}\n onMouseDown={(e) => e.preventDefault()}\n role='combobox'\n aria-label={\n forwardedValue !== undefined && forwardedValue !== null\n ? getAccessibilityDateLabel(\n new Date(forwardedValue * 1000),\n locale\n )\n : undefined\n }\n aria-disabled={disabled}\n {...rest}\n ref={mergedContainerRef}\n >\n {left && (\n <ThemeOverrider\n overrides={(t) => ({\n buttonPaddingHorizontal: 0.8,\n baseHeight: t.selectToggleListItemHeight / t.sizes.small,\n })}\n >\n <LeftAddon hasPadding={leftHasPadding}>{left}</LeftAddon>\n </ThemeOverrider>\n )}\n\n <Content hasLeft={!!left} hasRight={!!right}>\n {valueIsSpecified ? (\n <Title disabled={disabled} aria-hidden>\n {formattedValue}\n </Title>\n ) : (\n <Placeholder>{placeholder}</Placeholder>\n )}\n </Content>\n\n {rightValue && (\n <ThemeOverrider\n overrides={(t) => ({\n buttonPaddingHorizontal: 0.8,\n baseHeight: t.selectToggleListItemHeight / t.sizes.small,\n })}\n >\n <RightAddon hasPadding={rightHasPaddingValue}>\n {rightValue}\n </RightAddon>\n </ThemeOverrider>\n )}\n </SelectContainer>\n\n {isMinXs ? (\n <Popover\n trigger={containerRef}\n placement='bottom-start'\n visible={opened}\n onClose={closeHandler}\n size={size}\n >\n {calendar}\n </Popover>\n ) : (\n <Modal\n title={placeholder}\n footer={null}\n visible={opened}\n onClose={closeHandler}\n size={size}\n >\n {calendar}\n </Modal>\n )}\n </>\n );\n }\n);\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n"],"mappings":"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"}
|
|
@@ -3,10 +3,31 @@ import styled from '@emotion/styled';
|
|
|
3
3
|
import { Up, Down, Loading, Close, CloseCircle } from '@os-design/icons';
|
|
4
4
|
import { ellipsisStyles, resetButtonStyles, transitionStyles } from '@os-design/styles';
|
|
5
5
|
import { omitEmotionProps } from '@os-design/utils';
|
|
6
|
-
import { clr } from '@os-design/theming';
|
|
6
|
+
import { clr, ThemeOverrider } from '@os-design/theming';
|
|
7
7
|
import { css } from '@emotion/react';
|
|
8
8
|
import Tag from '../Tag';
|
|
9
9
|
import Button from '../Button';
|
|
10
|
+
export const Container = styled.div`
|
|
11
|
+
flex: 1;
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
overflow: hidden;
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
const notHasLeftStyles = p => !p.hasLeft && css`
|
|
18
|
+
padding-left: ${p.theme.inputPaddingHorizontal}em;
|
|
19
|
+
`;
|
|
20
|
+
|
|
21
|
+
const notHasRightStyles = p => !p.hasRight && css`
|
|
22
|
+
padding-right: ${p.theme.inputPaddingHorizontal}em;
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
export const Content = styled('div', omitEmotionProps('hasLeft', 'hasRight'))`
|
|
26
|
+
flex: 1;
|
|
27
|
+
${notHasLeftStyles};
|
|
28
|
+
${notHasRightStyles};
|
|
29
|
+
${ellipsisStyles};
|
|
30
|
+
`;
|
|
10
31
|
export const Placeholder = styled.span`
|
|
11
32
|
color: ${p => clr(p.theme.inputColorPlaceholder)};
|
|
12
33
|
${ellipsisStyles};
|
|
@@ -75,32 +96,48 @@ const unborderedIconContainerStyles = p => p.unbordered && css`
|
|
|
75
96
|
`;
|
|
76
97
|
|
|
77
98
|
export const IconContainer = styled('span', omitEmotionProps('unbordered', 'disabled'))`
|
|
78
|
-
position: absolute;
|
|
79
|
-
top: 0;
|
|
80
|
-
right: ${p => p.theme.inputPaddingHorizontal}em;
|
|
81
|
-
bottom: 0;
|
|
82
|
-
|
|
83
|
-
display: flex;
|
|
84
|
-
align-items: center;
|
|
85
99
|
color: ${p => clr(p.theme.selectColorIcon)};
|
|
86
|
-
|
|
100
|
+
line-height: 1;
|
|
87
101
|
${unborderedIconContainerStyles};
|
|
88
102
|
`;
|
|
89
|
-
export const ClearButtonContainer = styled(IconContainer)`
|
|
90
|
-
right: 0;
|
|
91
|
-
`;
|
|
92
103
|
export const ClearIcon = styled(CloseCircle)`
|
|
93
104
|
transform: scale(1.2) !important;
|
|
94
105
|
`;
|
|
106
|
+
const Addon = styled('span', omitEmotionProps('hasPadding'))`
|
|
107
|
+
display: flex;
|
|
108
|
+
align-items: center;
|
|
109
|
+
user-select: none;
|
|
110
|
+
color: ${p => clr(p.theme.inputColorPlaceholder)};
|
|
111
|
+
|
|
112
|
+
svg {
|
|
113
|
+
transform: scale(1.2);
|
|
114
|
+
}
|
|
115
|
+
`;
|
|
116
|
+
export const LeftAddon = styled(Addon)`
|
|
117
|
+
padding-right: ${p => p.theme.inputAddonPaddingHorizontal}em;
|
|
118
|
+
${p => p.hasPadding && css`
|
|
119
|
+
padding-left: ${p.theme.inputPaddingHorizontal}em;
|
|
120
|
+
`}
|
|
121
|
+
`;
|
|
122
|
+
export const RightAddon = styled(Addon)`
|
|
123
|
+
padding-left: ${p => p.theme.inputAddonPaddingHorizontal}em;
|
|
124
|
+
${p => p.hasPadding && css`
|
|
125
|
+
padding-right: ${p.theme.inputPaddingHorizontal}em;
|
|
126
|
+
`}
|
|
127
|
+
`;
|
|
95
128
|
|
|
96
129
|
const SelectToggle = ({
|
|
97
130
|
selectedItems,
|
|
98
131
|
onDelete,
|
|
99
132
|
onClear,
|
|
100
133
|
opened,
|
|
101
|
-
unbordered,
|
|
102
134
|
multiple,
|
|
135
|
+
left,
|
|
136
|
+
leftHasPadding = false,
|
|
137
|
+
right,
|
|
138
|
+
rightHasPadding = false,
|
|
103
139
|
placeholder,
|
|
140
|
+
unbordered,
|
|
104
141
|
loading,
|
|
105
142
|
disabled,
|
|
106
143
|
clearVisible,
|
|
@@ -136,31 +173,56 @@ const SelectToggle = ({
|
|
|
136
173
|
unbordered: unbordered
|
|
137
174
|
}, selectedItems[0].title);
|
|
138
175
|
}, [selectedItems, multiple, disabled, unbordered, placeholder, locale.deleteLabel, onDelete]);
|
|
139
|
-
const
|
|
176
|
+
const showClearButton = useMemo(() => clearVisible && selectedItems.length > 0, [clearVisible, selectedItems.length]);
|
|
177
|
+
const rightValue = useMemo(() => {
|
|
140
178
|
if (loading) return /*#__PURE__*/React.createElement(Loading, null);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
179
|
+
|
|
180
|
+
if (showClearButton) {
|
|
181
|
+
return /*#__PURE__*/React.createElement(Button, {
|
|
182
|
+
type: "ghost",
|
|
183
|
+
wide: "never",
|
|
184
|
+
size: "small",
|
|
185
|
+
disabled: disabled,
|
|
186
|
+
onClick: e => {
|
|
187
|
+
onClear();
|
|
188
|
+
e.stopPropagation();
|
|
189
|
+
},
|
|
190
|
+
onKeyDown: e => {
|
|
191
|
+
if (e.key === 'Enter') onClear();
|
|
192
|
+
e.stopPropagation();
|
|
193
|
+
},
|
|
194
|
+
"aria-label": locale.clearLabel
|
|
195
|
+
}, /*#__PURE__*/React.createElement(ClearIcon, null));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return right || /*#__PURE__*/React.createElement(IconContainer, {
|
|
199
|
+
unbordered: unbordered,
|
|
200
|
+
disabled: disabled
|
|
201
|
+
}, opened ? /*#__PURE__*/React.createElement(Up, null) : /*#__PURE__*/React.createElement(Down, null));
|
|
202
|
+
}, [disabled, loading, locale.clearLabel, onClear, opened, right, showClearButton, unbordered]);
|
|
203
|
+
const rightHasPaddingValue = useMemo(() => {
|
|
204
|
+
if (loading) return true;
|
|
205
|
+
if (showClearButton) return false;
|
|
206
|
+
return right ? rightHasPadding : true;
|
|
207
|
+
}, [loading, right, rightHasPadding, showClearButton]);
|
|
208
|
+
return /*#__PURE__*/React.createElement(Container, null, left && /*#__PURE__*/React.createElement(ThemeOverrider, {
|
|
209
|
+
overrides: t => ({
|
|
210
|
+
buttonPaddingHorizontal: 0.8,
|
|
211
|
+
baseHeight: t.selectToggleListItemHeight / t.sizes.small
|
|
212
|
+
})
|
|
213
|
+
}, /*#__PURE__*/React.createElement(LeftAddon, {
|
|
214
|
+
hasPadding: leftHasPadding
|
|
215
|
+
}, left)), /*#__PURE__*/React.createElement(Content, {
|
|
216
|
+
hasLeft: !!left,
|
|
217
|
+
hasRight: !!right
|
|
218
|
+
}, renderContent()), rightValue && /*#__PURE__*/React.createElement(ThemeOverrider, {
|
|
219
|
+
overrides: t => ({
|
|
220
|
+
buttonPaddingHorizontal: 0.8,
|
|
221
|
+
baseHeight: t.selectToggleListItemHeight / t.sizes.small
|
|
222
|
+
})
|
|
223
|
+
}, /*#__PURE__*/React.createElement(RightAddon, {
|
|
224
|
+
hasPadding: rightHasPaddingValue
|
|
225
|
+
}, rightValue)));
|
|
164
226
|
};
|
|
165
227
|
|
|
166
228
|
SelectToggle.displayName = 'SelectToggle';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectToggle.js","names":["React","useCallback","useMemo","styled","Up","Down","Loading","Close","CloseCircle","ellipsisStyles","resetButtonStyles","transitionStyles","omitEmotionProps","clr","css","Tag","Button","Placeholder","span","p","theme","inputColorPlaceholder","unborderedTitleStyles","unbordered","disabled","colorPrimary","disabledStyles","inputDisabledColorText","Title","colorText","ListItem","selectToggleListItemHeight","List","div","selectToggleListItemGap","DeleteButton","button","selectToggleDeleteButtonColorIcon","selectToggleDeleteButtonColorIconHover","unborderedIconContainerStyles","IconContainer","inputPaddingHorizontal","selectColorIcon","ClearButtonContainer","ClearIcon","SelectToggle","selectedItems","onDelete","onClear","opened","multiple","placeholder","loading","clearVisible","locale","renderContent","length","map","title","value","e","stopPropagation","deleteLabel","undefined","icon","key","clearLabel","displayName"],"sources":["../../../src/Select/SelectToggle.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport styled from '@emotion/styled';\nimport { Up, Down, Loading, Close, CloseCircle } from '@os-design/icons';\nimport {\n ellipsisStyles,\n resetButtonStyles,\n transitionStyles,\n} from '@os-design/styles';\nimport { omitEmotionProps } from '@os-design/utils';\nimport { clr } from '@os-design/theming';\nimport { css } from '@emotion/react';\nimport Tag from '../Tag';\nimport Button from '../Button';\nimport { SelectLocale } from './utils/defaultLocale';\n\ninterface SelectToggleProps {\n selectedItems: Array<{ title: string; value: string }>;\n onDelete: (value: string) => void;\n onClear: () => void;\n opened: boolean;\n multiple: boolean;\n placeholder?: string;\n unbordered?: boolean;\n loading?: boolean;\n disabled?: boolean;\n clearVisible?: boolean;\n locale: SelectLocale;\n}\n\nexport const Placeholder = styled.span`\n color: ${(p) => clr(p.theme.inputColorPlaceholder)};\n ${ellipsisStyles};\n`;\n\nconst unborderedTitleStyles = (p) =>\n p.unbordered &&\n css`\n font-weight: 500;\n ${!p.disabled && `color: ${clr(p.theme.colorPrimary)};`}\n `;\n\nconst disabledStyles = (p) =>\n p.disabled &&\n css`\n color: ${clr(p.theme.inputDisabledColorText)};\n `;\n\ntype TitleProps = Pick<SelectToggleProps, 'disabled' | 'unbordered'>;\nexport const Title = styled(\n 'span',\n omitEmotionProps('disabled', 'unbordered')\n)<TitleProps>`\n color: ${(p) => clr(p.theme.colorText)};\n ${unborderedTitleStyles};\n ${disabledStyles};\n ${ellipsisStyles};\n`;\n\ntype ListItemProps = Pick<SelectToggleProps, 'disabled'>;\nconst ListItem = styled(Tag, omitEmotionProps('disabled'))<ListItemProps>`\n // Reset tag styles\n padding-top: 0;\n padding-bottom: 0;\n\n height: ${(p) => p.theme.selectToggleListItemHeight}em;\n ${disabledStyles};\n`;\n\nconst List = styled.div`\n display: flex;\n flex-wrap: wrap;\n overflow: hidden; // For ellipsis styles\n\n margin: 0 ${(p) => p.theme.selectToggleListItemGap}em\n ${(p) => -p.theme.selectToggleListItemGap}em 0;\n\n & > div {\n margin: 0 ${(p) => p.theme.selectToggleListItemGap}em\n ${(p) => p.theme.selectToggleListItemGap}em 0;\n }\n`;\n\nconst DeleteButton = styled.button`\n ${resetButtonStyles};\n cursor: pointer;\n display: inherit;\n font-size: 1em;\n margin-left: 0.2em;\n\n background-color: transparent;\n color: ${(p) => clr(p.theme.selectToggleDeleteButtonColorIcon)};\n\n @media (hover: hover) {\n &:hover,\n &:focus {\n color: ${(p) => clr(p.theme.selectToggleDeleteButtonColorIconHover)};\n }\n }\n\n ${transitionStyles('color')};\n`;\n\nconst unborderedIconContainerStyles = (p) =>\n p.unbordered &&\n css`\n padding-top: 0.2em;\n font-size: 0.8em;\n ${!p.disabled && `color: ${clr(p.theme.colorPrimary)};`}\n `;\n\ninterface IconContainerProps {\n unbordered?: boolean;\n disabled?: boolean;\n}\nexport const IconContainer = styled(\n 'span',\n omitEmotionProps('unbordered', 'disabled')\n)<IconContainerProps>`\n position: absolute;\n top: 0;\n right: ${(p) => p.theme.inputPaddingHorizontal}em;\n bottom: 0;\n\n display: flex;\n align-items: center;\n color: ${(p) => clr(p.theme.selectColorIcon)};\n\n ${unborderedIconContainerStyles};\n`;\n\nexport const ClearButtonContainer = styled(IconContainer)`\n right: 0;\n`;\n\nexport const ClearIcon = styled(CloseCircle)`\n transform: scale(1.2) !important;\n`;\n\nconst SelectToggle: React.FC<SelectToggleProps> = ({\n selectedItems,\n onDelete,\n onClear,\n opened,\n unbordered,\n multiple,\n placeholder,\n loading,\n disabled,\n clearVisible,\n locale,\n}) => {\n const renderContent = useCallback(() => {\n if (selectedItems.length === 0) {\n return <Placeholder>{placeholder}</Placeholder>;\n }\n if (multiple) {\n return (\n <List>\n {selectedItems.map(({ title, value }) => (\n <ListItem\n key={value}\n disabled={disabled}\n right={\n !disabled ? (\n <DeleteButton\n onClick={(e) => {\n onDelete(value);\n e.stopPropagation();\n }}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={`${locale.deleteLabel} ${title}`}\n aria-hidden\n >\n <Close />\n </DeleteButton>\n ) : undefined\n }\n aria-hidden\n >\n {title}\n </ListItem>\n ))}\n </List>\n );\n }\n return (\n <Title disabled={disabled} unbordered={unbordered}>\n {selectedItems[0].title}\n </Title>\n );\n }, [\n selectedItems,\n multiple,\n disabled,\n unbordered,\n placeholder,\n locale.deleteLabel,\n onDelete,\n ]);\n\n const icon = useMemo(() => {\n if (loading) return <Loading />;\n return opened ? <Up /> : <Down />;\n }, [loading, opened]);\n\n return (\n <>\n {renderContent()}\n {clearVisible && selectedItems.length > 0 ? (\n <ClearButtonContainer unbordered={unbordered} disabled={disabled}>\n <Button\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={(e) => {\n onClear();\n e.stopPropagation();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onClear();\n e.stopPropagation();\n }}\n aria-label={locale.clearLabel}\n >\n <ClearIcon />\n </Button>\n </ClearButtonContainer>\n ) : (\n <IconContainer unbordered={unbordered} disabled={disabled}>\n {icon}\n </IconContainer>\n )}\n </>\n );\n};\n\nSelectToggle.displayName = 'SelectToggle';\n\nexport default SelectToggle;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectToggle.js","names":["React","useCallback","useMemo","styled","Up","Down","Loading","Close","CloseCircle","ellipsisStyles","resetButtonStyles","transitionStyles","omitEmotionProps","clr","ThemeOverrider","css","Tag","Button","Container","div","notHasLeftStyles","p","hasLeft","theme","inputPaddingHorizontal","notHasRightStyles","hasRight","Content","Placeholder","span","inputColorPlaceholder","unborderedTitleStyles","unbordered","disabled","colorPrimary","disabledStyles","inputDisabledColorText","Title","colorText","ListItem","selectToggleListItemHeight","List","selectToggleListItemGap","DeleteButton","button","selectToggleDeleteButtonColorIcon","selectToggleDeleteButtonColorIconHover","unborderedIconContainerStyles","IconContainer","selectColorIcon","ClearIcon","Addon","LeftAddon","inputAddonPaddingHorizontal","hasPadding","RightAddon","SelectToggle","selectedItems","onDelete","onClear","opened","multiple","left","leftHasPadding","right","rightHasPadding","placeholder","loading","clearVisible","locale","renderContent","length","map","title","value","e","stopPropagation","deleteLabel","undefined","showClearButton","rightValue","key","clearLabel","rightHasPaddingValue","t","buttonPaddingHorizontal","baseHeight","sizes","small","displayName"],"sources":["../../../src/Select/SelectToggle.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport styled from '@emotion/styled';\nimport { Up, Down, Loading, Close, CloseCircle } from '@os-design/icons';\nimport {\n ellipsisStyles,\n resetButtonStyles,\n transitionStyles,\n} from '@os-design/styles';\nimport { omitEmotionProps } from '@os-design/utils';\nimport { clr, ThemeOverrider } from '@os-design/theming';\nimport { css } from '@emotion/react';\nimport Tag from '../Tag';\nimport Button from '../Button';\nimport { SelectLocale } from './utils/defaultLocale';\n\ninterface SelectToggleProps {\n selectedItems: Array<{ title: string; value: string }>;\n onDelete: (value: string) => void;\n onClear: () => void;\n opened: boolean;\n multiple: boolean;\n left?: React.ReactNode;\n leftHasPadding?: boolean;\n right?: React.ReactNode;\n rightHasPadding?: boolean;\n placeholder?: string;\n unbordered?: boolean;\n loading?: boolean;\n disabled?: boolean;\n clearVisible?: boolean;\n locale: SelectLocale;\n}\n\nexport const Container = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n overflow: hidden;\n`;\n\nconst notHasLeftStyles = (p) =>\n !p.hasLeft &&\n css`\n padding-left: ${p.theme.inputPaddingHorizontal}em;\n `;\n\nconst notHasRightStyles = (p) =>\n !p.hasRight &&\n css`\n padding-right: ${p.theme.inputPaddingHorizontal}em;\n `;\n\ninterface ContentProps {\n hasLeft?: boolean;\n hasRight?: boolean;\n}\nexport const Content = styled(\n 'div',\n omitEmotionProps('hasLeft', 'hasRight')\n)<ContentProps>`\n flex: 1;\n ${notHasLeftStyles};\n ${notHasRightStyles};\n ${ellipsisStyles};\n`;\n\nexport const Placeholder = styled.span`\n color: ${(p) => clr(p.theme.inputColorPlaceholder)};\n ${ellipsisStyles};\n`;\n\nconst unborderedTitleStyles = (p) =>\n p.unbordered &&\n css`\n font-weight: 500;\n ${!p.disabled && `color: ${clr(p.theme.colorPrimary)};`}\n `;\n\nconst disabledStyles = (p) =>\n p.disabled &&\n css`\n color: ${clr(p.theme.inputDisabledColorText)};\n `;\n\ntype TitleProps = Pick<SelectToggleProps, 'disabled' | 'unbordered'>;\nexport const Title = styled(\n 'span',\n omitEmotionProps('disabled', 'unbordered')\n)<TitleProps>`\n color: ${(p) => clr(p.theme.colorText)};\n ${unborderedTitleStyles};\n ${disabledStyles};\n ${ellipsisStyles};\n`;\n\ntype ListItemProps = Pick<SelectToggleProps, 'disabled'>;\nconst ListItem = styled(Tag, omitEmotionProps('disabled'))<ListItemProps>`\n // Reset tag styles\n padding-top: 0;\n padding-bottom: 0;\n\n height: ${(p) => p.theme.selectToggleListItemHeight}em;\n ${disabledStyles};\n`;\n\nconst List = styled.div`\n display: flex;\n flex-wrap: wrap;\n overflow: hidden; // For ellipsis styles\n\n margin: 0 ${(p) => p.theme.selectToggleListItemGap}em\n ${(p) => -p.theme.selectToggleListItemGap}em 0;\n\n & > div {\n margin: 0 ${(p) => p.theme.selectToggleListItemGap}em\n ${(p) => p.theme.selectToggleListItemGap}em 0;\n }\n`;\n\nconst DeleteButton = styled.button`\n ${resetButtonStyles};\n cursor: pointer;\n display: inherit;\n font-size: 1em;\n margin-left: 0.2em;\n\n background-color: transparent;\n color: ${(p) => clr(p.theme.selectToggleDeleteButtonColorIcon)};\n\n @media (hover: hover) {\n &:hover,\n &:focus {\n color: ${(p) => clr(p.theme.selectToggleDeleteButtonColorIconHover)};\n }\n }\n\n ${transitionStyles('color')};\n`;\n\nconst unborderedIconContainerStyles = (p) =>\n p.unbordered &&\n css`\n padding-top: 0.2em;\n font-size: 0.8em;\n ${!p.disabled && `color: ${clr(p.theme.colorPrimary)};`}\n `;\n\ninterface IconContainerProps {\n unbordered?: boolean;\n disabled?: boolean;\n}\nexport const IconContainer = styled(\n 'span',\n omitEmotionProps('unbordered', 'disabled')\n)<IconContainerProps>`\n color: ${(p) => clr(p.theme.selectColorIcon)};\n line-height: 1;\n ${unborderedIconContainerStyles};\n`;\n\nexport const ClearIcon = styled(CloseCircle)`\n transform: scale(1.2) !important;\n`;\n\ninterface AddonProps {\n hasPadding: boolean;\n}\nconst Addon = styled('span', omitEmotionProps('hasPadding'))<AddonProps>`\n display: flex;\n align-items: center;\n user-select: none;\n color: ${(p) => clr(p.theme.inputColorPlaceholder)};\n\n svg {\n transform: scale(1.2);\n }\n`;\n\nexport const LeftAddon = styled(Addon)`\n padding-right: ${(p) => p.theme.inputAddonPaddingHorizontal}em;\n ${(p) =>\n p.hasPadding &&\n css`\n padding-left: ${p.theme.inputPaddingHorizontal}em;\n `}\n`;\n\nexport const RightAddon = styled(Addon)`\n padding-left: ${(p) => p.theme.inputAddonPaddingHorizontal}em;\n ${(p) =>\n p.hasPadding &&\n css`\n padding-right: ${p.theme.inputPaddingHorizontal}em;\n `}\n`;\n\nconst SelectToggle: React.FC<SelectToggleProps> = ({\n selectedItems,\n onDelete,\n onClear,\n opened,\n multiple,\n left,\n leftHasPadding = false,\n right,\n rightHasPadding = false,\n placeholder,\n unbordered,\n loading,\n disabled,\n clearVisible,\n locale,\n}) => {\n const renderContent = useCallback(() => {\n if (selectedItems.length === 0) {\n return <Placeholder>{placeholder}</Placeholder>;\n }\n if (multiple) {\n return (\n <List>\n {selectedItems.map(({ title, value }) => (\n <ListItem\n key={value}\n disabled={disabled}\n right={\n !disabled ? (\n <DeleteButton\n onClick={(e) => {\n onDelete(value);\n e.stopPropagation();\n }}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={`${locale.deleteLabel} ${title}`}\n aria-hidden\n >\n <Close />\n </DeleteButton>\n ) : undefined\n }\n aria-hidden\n >\n {title}\n </ListItem>\n ))}\n </List>\n );\n }\n return (\n <Title disabled={disabled} unbordered={unbordered}>\n {selectedItems[0].title}\n </Title>\n );\n }, [\n selectedItems,\n multiple,\n disabled,\n unbordered,\n placeholder,\n locale.deleteLabel,\n onDelete,\n ]);\n\n const showClearButton = useMemo(\n () => clearVisible && selectedItems.length > 0,\n [clearVisible, selectedItems.length]\n );\n\n const rightValue = useMemo(() => {\n if (loading) return <Loading />;\n if (showClearButton) {\n return (\n <Button\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={(e) => {\n onClear();\n e.stopPropagation();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onClear();\n e.stopPropagation();\n }}\n aria-label={locale.clearLabel}\n >\n <ClearIcon />\n </Button>\n );\n }\n return (\n right || (\n <IconContainer unbordered={unbordered} disabled={disabled}>\n {opened ? <Up /> : <Down />}\n </IconContainer>\n )\n );\n }, [\n disabled,\n loading,\n locale.clearLabel,\n onClear,\n opened,\n right,\n showClearButton,\n unbordered,\n ]);\n\n const rightHasPaddingValue = useMemo(() => {\n if (loading) return true;\n if (showClearButton) return false;\n return right ? rightHasPadding : true;\n }, [loading, right, rightHasPadding, showClearButton]);\n\n return (\n <Container>\n {left && (\n <ThemeOverrider\n overrides={(t) => ({\n buttonPaddingHorizontal: 0.8,\n baseHeight: t.selectToggleListItemHeight / t.sizes.small,\n })}\n >\n <LeftAddon hasPadding={leftHasPadding}>{left}</LeftAddon>\n </ThemeOverrider>\n )}\n\n <Content hasLeft={!!left} hasRight={!!right}>\n {renderContent()}\n </Content>\n\n {rightValue && (\n <ThemeOverrider\n overrides={(t) => ({\n buttonPaddingHorizontal: 0.8,\n baseHeight: t.selectToggleListItemHeight / t.sizes.small,\n })}\n >\n <RightAddon hasPadding={rightHasPaddingValue}>\n {rightValue}\n </RightAddon>\n </ThemeOverrider>\n )}\n </Container>\n );\n};\n\nSelectToggle.displayName = 'SelectToggle';\n\nexport default SelectToggle;\n"],"mappings":"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"}
|
package/dist/esm/Select/index.js
CHANGED
|
@@ -17,8 +17,7 @@ import defaultLocale from './utils/defaultLocale';
|
|
|
17
17
|
const paddingStyles = p => {
|
|
18
18
|
const paddingVertical = (p.theme.baseHeight - p.theme.selectToggleListItemHeight) / 2;
|
|
19
19
|
return css`
|
|
20
|
-
padding: calc(${paddingVertical}em - 1px)
|
|
21
|
-
calc(${paddingVertical}em - 1px) ${p.theme.inputPaddingHorizontal}em;
|
|
20
|
+
padding: calc(${paddingVertical}em - 1px) 0;
|
|
22
21
|
`;
|
|
23
22
|
};
|
|
24
23
|
|
|
@@ -29,7 +28,6 @@ const openedStyles = p => p.opened && !p.unbordered && css`
|
|
|
29
28
|
|
|
30
29
|
const unborderedStyles = p => p.unbordered && css`
|
|
31
30
|
border: 0;
|
|
32
|
-
padding-right: 1.8em;
|
|
33
31
|
box-shadow: none !important;
|
|
34
32
|
${transitionStyles('background-color')(p)};
|
|
35
33
|
`;
|
|
@@ -85,6 +83,10 @@ const InputSearchContainer = styled.div`
|
|
|
85
83
|
|
|
86
84
|
const Select = /*#__PURE__*/forwardRef(({
|
|
87
85
|
options = [],
|
|
86
|
+
left,
|
|
87
|
+
leftHasPadding = false,
|
|
88
|
+
right,
|
|
89
|
+
rightHasPadding = false,
|
|
88
90
|
placeholder,
|
|
89
91
|
searchVisible = false,
|
|
90
92
|
searchProps = {},
|
|
@@ -179,11 +181,15 @@ const Select = /*#__PURE__*/forwardRef(({
|
|
|
179
181
|
containerRef.current.focus();
|
|
180
182
|
},
|
|
181
183
|
opened: opened,
|
|
182
|
-
unbordered: unbordered,
|
|
183
184
|
multiple: maxSelectedItems !== 1,
|
|
185
|
+
placeholder: placeholder,
|
|
186
|
+
left: left,
|
|
187
|
+
leftHasPadding: leftHasPadding,
|
|
188
|
+
right: right,
|
|
189
|
+
rightHasPadding: rightHasPadding,
|
|
190
|
+
unbordered: unbordered,
|
|
184
191
|
disabled: disabled,
|
|
185
192
|
clearVisible: clearVisible,
|
|
186
|
-
placeholder: placeholder,
|
|
187
193
|
loading: loading,
|
|
188
194
|
locale: locale
|
|
189
195
|
})), /*#__PURE__*/React.createElement(SelectMenu, {
|