@foxford/ui 2.105.0 → 2.106.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/AddElement/AddElement.js +1 -1
- package/components/AddElement/AddElement.js.map +1 -1
- package/components/AddElement/AddElement.mjs +1 -1
- package/components/AddElement/AddElement.mjs.map +1 -1
- package/components/Anchor/Anchor.js +1 -1
- package/components/Anchor/Anchor.js.map +1 -1
- package/components/Anchor/Anchor.mjs +1 -1
- package/components/Anchor/Anchor.mjs.map +1 -1
- package/components/DialogComponent/Header.js +1 -1
- package/components/DialogComponent/Header.js.map +1 -1
- package/components/DialogComponent/Header.mjs +1 -1
- package/components/DialogComponent/Header.mjs.map +1 -1
- package/components/Dropdown/Dropdown.js +1 -1
- package/components/Dropdown/Dropdown.js.map +1 -1
- package/components/Dropdown/Dropdown.mjs +1 -1
- package/components/Dropdown/Dropdown.mjs.map +1 -1
- package/components/Dropdown/DropdownListItem.js +1 -1
- package/components/Dropdown/DropdownListItem.js.map +1 -1
- package/components/Dropdown/DropdownListItem.mjs +1 -1
- package/components/Dropdown/DropdownListItem.mjs.map +1 -1
- package/components/Dropdown/DropdownMenuMultiple.js +1 -1
- package/components/Dropdown/DropdownMenuMultiple.js.map +1 -1
- package/components/Dropdown/DropdownMenuMultiple.mjs +1 -1
- package/components/Dropdown/DropdownMenuMultiple.mjs.map +1 -1
- package/components/Dropdown/sizes.js +1 -1
- package/components/Dropdown/sizes.js.map +1 -1
- package/components/Dropdown/sizes.mjs +1 -1
- package/components/Dropdown/sizes.mjs.map +1 -1
- package/components/FormLabel/FormLabel.js +1 -1
- package/components/FormLabel/FormLabel.js.map +1 -1
- package/components/FormLabel/FormLabel.mjs +1 -1
- package/components/FormLabel/FormLabel.mjs.map +1 -1
- package/components/FormLabel/constants.js +1 -1
- package/components/FormLabel/constants.js.map +1 -1
- package/components/FormLabel/constants.mjs +1 -1
- package/components/FormLabel/constants.mjs.map +1 -1
- package/components/IconButton/IconButton.js +1 -1
- package/components/IconButton/IconButton.js.map +1 -1
- package/components/IconButton/IconButton.mjs +1 -1
- package/components/IconButton/IconButton.mjs.map +1 -1
- package/components/IconButton/sizes.js +1 -1
- package/components/IconButton/sizes.js.map +1 -1
- package/components/IconButton/sizes.mjs +1 -1
- package/components/IconButton/sizes.mjs.map +1 -1
- package/components/ListItem/ListItem.js +1 -1
- package/components/ListItem/ListItem.js.map +1 -1
- package/components/ListItem/ListItem.mjs +1 -1
- package/components/ListItem/ListItem.mjs.map +1 -1
- package/components/ListItem/sizes.js +2 -0
- package/components/ListItem/sizes.js.map +1 -0
- package/components/ListItem/sizes.mjs +2 -0
- package/components/ListItem/sizes.mjs.map +1 -0
- package/components/ListItem/style.js +1 -1
- package/components/ListItem/style.js.map +1 -1
- package/components/ListItem/style.mjs +1 -1
- package/components/ListItem/style.mjs.map +1 -1
- package/components/MenuDivider/MenuDivider.js +1 -1
- package/components/MenuDivider/MenuDivider.js.map +1 -1
- package/components/MenuDivider/MenuDivider.mjs +1 -1
- package/components/MenuDivider/MenuDivider.mjs.map +1 -1
- package/components/Notification/Notification.js +1 -1
- package/components/Notification/Notification.js.map +1 -1
- package/components/Notification/Notification.mjs +1 -1
- package/components/Notification/Notification.mjs.map +1 -1
- package/components/Slot/Slot.js +1 -1
- package/components/Slot/Slot.js.map +1 -1
- package/components/Slot/Slot.mjs +1 -1
- package/components/Slot/Slot.mjs.map +1 -1
- package/dts/index.d.ts +426 -260
- package/hocs/withMergedProps.js.map +1 -1
- package/hocs/withMergedProps.mjs.map +1 -1
- package/hooks/useMergedProps.js +1 -1
- package/hooks/useMergedProps.js.map +1 -1
- package/hooks/useMergedProps.mjs +1 -1
- package/hooks/useMergedProps.mjs.map +1 -1
- package/package.json +2 -2
- package/shared/utils/createPolymorphicComponentWithRef.js +2 -0
- package/shared/utils/createPolymorphicComponentWithRef.js.map +1 -0
- package/shared/utils/createPolymorphicComponentWithRef.mjs +2 -0
- package/shared/utils/createPolymorphicComponentWithRef.mjs.map +1 -0
- package/components/ListItem/constants.js +0 -2
- package/components/ListItem/constants.js.map +0 -1
- package/components/ListItem/constants.mjs +0 -2
- package/components/ListItem/constants.mjs.map +0 -1
- package/shared/utils/polymorphic.js +0 -2
- package/shared/utils/polymorphic.js.map +0 -1
- package/shared/utils/polymorphic.mjs +0 -2
- package/shared/utils/polymorphic.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var React=require('react');var withMergedProps=require('../../hocs/withMergedProps.js');var isNil=require('../../shared/utils/isNil.js');var sizes=require('./sizes.js');var style=require('./style.js');var jsxRuntime=require('react/jsx-runtime');var Slot=require('../Slot/Slot.js');var Icon=require('../Icon/Icon.js');var index=require('../../icon-pack/src/icons/PlusLarge/index.js');const AddElement=withMergedProps.withMergedProps(React.forwardRef((e,s)=>{const{type:i="button",size:r="m",variant:t="default",square:n,icon:o,title:l,text:a,content:S,children:c,sizeXXS:u,sizeXS:d,sizeS:E,sizeM:x,sizeL:j,sizeXL:z,...p}=e;const I={size:r,sizeXXS:u,sizeXS:d,sizeS:E,sizeM:x,sizeL:j,sizeXL:z};const R={...I,preset:'brand',color:'inherit',icon:jsxRuntime.jsx(index.PlusLarge,{}),sizes:n?sizes.SIZES_ICON_SQUARE:sizes.SIZES_ICON};const T=isNil.isNil(a)?sizes.SIZES_TITLE_WITHOUT_TEXT:sizes.SIZES_TITLE;const m=isNil.isNil(a)?sizes.SIZES_TITLE_SQUARE_WITHOUT_TEXT:sizes.SIZES_TITLE_SQUARE;const _={...I,as:'span',appearance:'subheading',weight:n?700:400,color:'inherit',wordBreak:'break-word',sizes:n?m:T};const
|
|
1
|
+
'use strict';var React=require('react');var withMergedProps=require('../../hocs/withMergedProps.js');var isNil=require('../../shared/utils/isNil.js');var sizes=require('./sizes.js');var style=require('./style.js');var jsxRuntime=require('react/jsx-runtime');var Slot=require('../Slot/Slot.js');var Icon=require('../Icon/Icon.js');var index=require('../../icon-pack/src/icons/PlusLarge/index.js');const AddElement=withMergedProps.withMergedProps(React.forwardRef((e,s)=>{const{type:i="button",size:r="m",variant:t="default",square:n,icon:o,title:l,text:a,content:S,children:c,sizeXXS:u,sizeXS:d,sizeS:E,sizeM:x,sizeL:j,sizeXL:z,...p}=e;const I={size:r,sizeXXS:u,sizeXS:d,sizeS:E,sizeM:x,sizeL:j,sizeXL:z};const R={...I,preset:'brand',color:'inherit',icon:jsxRuntime.jsx(index.PlusLarge,{}),sizes:n?sizes.SIZES_ICON_SQUARE:sizes.SIZES_ICON};const T=isNil.isNil(a)?sizes.SIZES_TITLE_WITHOUT_TEXT:sizes.SIZES_TITLE;const m=isNil.isNil(a)?sizes.SIZES_TITLE_SQUARE_WITHOUT_TEXT:sizes.SIZES_TITLE_SQUARE;const _={...I,as:'span',appearance:'subheading',weight:n?700:400,color:'inherit',wordBreak:'break-word',sizes:n?m:T};const N={...I,as:'span',appearance:'subheading',weight:400,color:'inherit',wordBreak:'break-word',sizes:n?sizes.SIZES_TEXT_SQUARE:sizes.SIZES_TEXT};return jsxRuntime.jsx(style.Root,{...p,...I,type:i,square:n,variant:t,ref:s,children:jsxRuntime.jsx(Slot.Slot,{render:c,props:{iconProps:R,titleProps:_,textProps:N},fallback:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(style.IconContainer,{...I,sizes:n?sizes.SIZES_ICON_CONTAINER_SQUARE:sizes.SIZES_ICON_CONTAINER,square:n,children:jsxRuntime.jsx(Slot.Slot,{render:o,props:R,fallback:jsxRuntime.jsx(Icon.Icon,{...R})})}),jsxRuntime.jsx(style.Content,{...I,sizes:n?sizes.SIZES_CONTENT_SQUARE:sizes.SIZES_CONTENT,square:n,children:jsxRuntime.jsx(Slot.Slot,{render:S,props:{titleProps:_,textProps:N},fallback:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Slot.Slot,{render:l,props:_}),isNil.isNil(a)?null:jsxRuntime.jsx(style.TextContainer,{children:jsxRuntime.jsx(Slot.Slot,{render:a,props:N})})]})})})]})})})}),{displayName:"AddElement",sizes:e=>e.square?sizes.SIZES_SQUARE:sizes.SIZES});exports.AddElement=AddElement,exports.COMPONENT_NAME="AddElement";
|
|
2
2
|
//# sourceMappingURL=AddElement.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddElement.js","sources":["../../../../src/components/AddElement/AddElement.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { PlusLarge } from '@foxford/icon-pack'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport type { TextProps } from 'components/Text'\nimport { isNil } from 'shared/utils/isNil'\nimport { Slot } from 'components/Slot'\nimport {\n SIZES_SQUARE,\n SIZES_CONTENT_SQUARE,\n SIZES_ICON_SQUARE,\n SIZES_ICON_CONTAINER_SQUARE,\n SIZES_ICON_CONTAINER,\n SIZES_ICON,\n SIZES,\n SIZES_TEXT_SQUARE,\n SIZES_TEXT,\n SIZES_TITLE_SQUARE,\n SIZES_TITLE,\n SIZES_CONTENT,\n SIZES_TITLE_SQUARE_WITHOUT_TEXT,\n SIZES_TITLE_WITHOUT_TEXT,\n} from './sizes'\nimport type { AddElementProps } from './types'\nimport * as Styled from './style'\n\nconst COMPONENT_NAME = 'AddElement'\n\n/**\n *\n * *v1.0.0*\n *\n * Контрол для добавления новых сущностей.\n *\n * Поддерживается \"ref\" и все нативные атрибуты \\<button\\> элемента.\n */\nconst AddElement: React.ForwardRefExoticComponent<AddElementProps> = withMergedProps<\n AddElementProps,\n HTMLButtonElement\n>(\n forwardRef<HTMLButtonElement, MergedProps<AddElementProps>>((props, ref) => {\n const {\n type = 'button',\n size = 'm',\n variant = 'default',\n square,\n icon,\n title,\n text,\n content,\n children,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n ...restProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconProps: IconProps = {\n ...sizeProps,\n preset: 'brand',\n color: 'inherit',\n icon: <PlusLarge />,\n sizes: square ? SIZES_ICON_SQUARE : SIZES_ICON,\n }\n\n const titleSizes = isNil(text) ? SIZES_TITLE_WITHOUT_TEXT : SIZES_TITLE\n const titleSquareSizes = isNil(text) ? SIZES_TITLE_SQUARE_WITHOUT_TEXT : SIZES_TITLE_SQUARE\n const titleProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: square ? 700 : 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? titleSquareSizes : titleSizes,\n }\n\n const textProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? SIZES_TEXT_SQUARE : SIZES_TEXT,\n }\n\n return (\n <Styled.Root {...restProps} {...sizeProps} type={type} square={square} variant={variant} ref={ref}>\n <Slot\n props={{ iconProps, titleProps, textProps }}\n fallback={\n <>\n <Styled.IconContainer\n {...sizeProps}\n sizes={square ? SIZES_ICON_CONTAINER_SQUARE : SIZES_ICON_CONTAINER}\n square={square}\n >\n <Slot props={iconProps} fallback={<Icon {...iconProps} />}
|
|
1
|
+
{"version":3,"file":"AddElement.js","sources":["../../../../src/components/AddElement/AddElement.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { PlusLarge } from '@foxford/icon-pack'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport type { TextProps } from 'components/Text'\nimport { isNil } from 'shared/utils/isNil'\nimport { Slot } from 'components/Slot'\nimport {\n SIZES_SQUARE,\n SIZES_CONTENT_SQUARE,\n SIZES_ICON_SQUARE,\n SIZES_ICON_CONTAINER_SQUARE,\n SIZES_ICON_CONTAINER,\n SIZES_ICON,\n SIZES,\n SIZES_TEXT_SQUARE,\n SIZES_TEXT,\n SIZES_TITLE_SQUARE,\n SIZES_TITLE,\n SIZES_CONTENT,\n SIZES_TITLE_SQUARE_WITHOUT_TEXT,\n SIZES_TITLE_WITHOUT_TEXT,\n} from './sizes'\nimport type { AddElementProps } from './types'\nimport * as Styled from './style'\n\nconst COMPONENT_NAME = 'AddElement'\n\n/**\n *\n * *v1.0.0*\n *\n * Контрол для добавления новых сущностей.\n *\n * Поддерживается \"ref\" и все нативные атрибуты \\<button\\> элемента.\n */\nconst AddElement: React.ForwardRefExoticComponent<AddElementProps> = withMergedProps<\n AddElementProps,\n HTMLButtonElement\n>(\n forwardRef<HTMLButtonElement, MergedProps<AddElementProps>>((props, ref) => {\n const {\n type = 'button',\n size = 'm',\n variant = 'default',\n square,\n icon,\n title,\n text,\n content,\n children,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n ...restProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconProps: IconProps = {\n ...sizeProps,\n preset: 'brand',\n color: 'inherit',\n icon: <PlusLarge />,\n sizes: square ? SIZES_ICON_SQUARE : SIZES_ICON,\n }\n\n const titleSizes = isNil(text) ? SIZES_TITLE_WITHOUT_TEXT : SIZES_TITLE\n const titleSquareSizes = isNil(text) ? SIZES_TITLE_SQUARE_WITHOUT_TEXT : SIZES_TITLE_SQUARE\n const titleProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: square ? 700 : 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? titleSquareSizes : titleSizes,\n }\n\n const textProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? SIZES_TEXT_SQUARE : SIZES_TEXT,\n }\n\n return (\n <Styled.Root {...restProps} {...sizeProps} type={type} square={square} variant={variant} ref={ref}>\n <Slot\n render={children}\n props={{ iconProps, titleProps, textProps }}\n fallback={\n <>\n <Styled.IconContainer\n {...sizeProps}\n sizes={square ? SIZES_ICON_CONTAINER_SQUARE : SIZES_ICON_CONTAINER}\n square={square}\n >\n <Slot render={icon} props={iconProps} fallback={<Icon {...iconProps} />} />\n </Styled.IconContainer>\n\n <Styled.Content {...sizeProps} sizes={square ? SIZES_CONTENT_SQUARE : SIZES_CONTENT} square={square}>\n <Slot\n render={content}\n props={{ titleProps, textProps }}\n fallback={\n <>\n <Slot render={title} props={titleProps} />\n {!isNil(text) ? (\n <Styled.TextContainer>\n <Slot render={text} props={textProps} />\n </Styled.TextContainer>\n ) : null}\n </>\n }\n />\n </Styled.Content>\n </>\n }\n />\n </Styled.Root>\n )\n }),\n {\n displayName: COMPONENT_NAME,\n sizes: (props) => (props.square ? SIZES_SQUARE : SIZES),\n }\n)\n\nexport { AddElement, COMPONENT_NAME }\n\nexport type { AddElementProps }\n"],"names":["AddElement","withMergedProps","forwardRef","props","ref","type","size","variant","square","icon","title","text","content","children","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","restProps","sizeProps","iconProps","preset","color","_jsx","PlusLarge","sizes","SIZES_ICON_SQUARE","SIZES_ICON","titleSizes","isNil","SIZES_TITLE_WITHOUT_TEXT","SIZES_TITLE","titleSquareSizes","SIZES_TITLE_SQUARE_WITHOUT_TEXT","SIZES_TITLE_SQUARE","titleProps","as","appearance","weight","wordBreak","textProps","SIZES_TEXT_SQUARE","SIZES_TEXT","Styled","Slot","render","fallback","_jsxs","_Fragment","SIZES_ICON_CONTAINER_SQUARE","SIZES_ICON_CONTAINER","Icon","SIZES_CONTENT_SQUARE","SIZES_CONTENT","displayName","SIZES_SQUARE","SIZES"],"mappings":"4YAsCA,MAAMA,WAA+DC,gBAAAA,gBAInEC,MAAAA,WAA4D,CAACC,EAAOC,KAClE,MAAMC,KACJA,EAAO,SAAQC,KACfA,EAAO,IAAGC,QACVA,EAAU,UAASC,OACnBA,EAAMC,KACNA,EAAIC,MACJA,EAAKC,KACLA,EAAIC,QACJA,EAAOC,SACPA,EAAQC,QACRA,EAAOC,OACPA,EAAMC,MACNA,EAAKC,MACLA,EAAKC,MACLA,EAAKC,OACLA,KACGC,GACDjB,EAEJ,MAAMkB,EAAY,CAChBf,OACAQ,UACAC,SACAC,QACAC,QACAC,QACAC,UAGF,MAAMG,EAAuB,IACxBD,EACHE,OAAQ,QACRC,MAAO,UACPf,KAAMgB,WAAAA,IAACC,MAAAA,cACPC,MAAOnB,EAASoB,wBAAoBC,MAAAA,YAGtC,MAAMC,EAAaC,MAAAA,MAAMpB,GAAQqB,MAAAA,yBAA2BC,MAAAA,YAC5D,MAAMC,EAAmBH,MAAAA,MAAMpB,GAAQwB,MAAAA,gCAAkCC,MAAAA,mBACzE,MAAMC,EAAwB,IACzBhB,EACHiB,GAAI,OACJC,WAAY,aACZC,OAAQhC,EAAS,IAAM,IACvBgB,MAAO,UACPiB,UAAW,aACXd,MAAOnB,EAAS0B,EAAmBJ,GAGrC,MAAMY,EAAuB,IACxBrB,EACHiB,GAAI,OACJC,WAAY,aACZC,OAAQ,IACRhB,MAAO,UACPiB,UAAW,aACXd,MAAOnB,EAASmC,wBAAoBC,MAAAA,YAGtC,OACEnB,WAAAA,IAACoB,MAAAA,KAAW,IAAKzB,KAAeC,EAAWhB,KAAMA,EAAMG,OAAQA,EAAQD,QAASA,EAASH,IAAKA,EAAIS,SAChGY,WAAAA,IAACqB,UAAI,CACHC,OAAQlC,EACRV,MAAO,CAAEmB,YAAWe,aAAYK,aAChCM,SACEC,WAAAA,KAAAC,oBAAA,CAAArC,SAAA,CACEY,WAAAA,IAACoB,oBAAoB,IACfxB,EACJM,MAAOnB,EAAS2C,MAAAA,4BAA8BC,MAAAA,qBAC9C5C,OAAQA,EAAOK,SAEfY,WAAAA,IAACqB,UAAI,CAACC,OAAQtC,EAAMN,MAAOmB,EAAW0B,SAAUvB,WAAAA,IAAC4B,UAAI,IAAK/B,QAG5DG,WAAAA,IAACoB,cAAc,IAAKxB,EAAWM,MAAOnB,EAAS8C,MAAAA,qBAAuBC,MAAAA,cAAe/C,OAAQA,EAAOK,SAClGY,WAAAA,IAACqB,UAAI,CACHC,OAAQnC,EACRT,MAAO,CAAEkC,aAAYK,aACrBM,SACEC,WAAAA,KAAAC,oBAAA,CAAArC,SAAA,CACEY,WAAAA,IAACqB,UAAI,CAACC,OAAQrC,EAAOP,MAAOkC,IAC1BN,MAAAA,MAAMpB,GAIJ,KAHFc,WAAAA,IAACoB,MAAAA,cAAoB,CAAAhC,SACnBY,WAAAA,IAACqB,UAAI,CAACC,OAAQpC,EAAMR,MAAOuC,sBAanD,CACEc,YAhHmB,aAiHnB7B,MAAQxB,GAAWA,EAAMK,OAASiD,MAAAA,aAAeC,MAAAA,6DAjH9B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{forwardRef}from'react';import{withMergedProps}from'../../hocs/withMergedProps.mjs';import{isNil}from'../../shared/utils/isNil.mjs';import{SIZES_SQUARE,SIZES,SIZES_TEXT_SQUARE,SIZES_TEXT,SIZES_TITLE_SQUARE_WITHOUT_TEXT,SIZES_TITLE_SQUARE,SIZES_TITLE_WITHOUT_TEXT,SIZES_TITLE,SIZES_ICON_SQUARE,SIZES_ICON,SIZES_ICON_CONTAINER_SQUARE,SIZES_ICON_CONTAINER,SIZES_CONTENT_SQUARE,SIZES_CONTENT}from'./sizes.mjs';import{Root,IconContainer,Content,TextContainer}from'./style.mjs';import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{Slot}from'../Slot/Slot.mjs';import{Icon}from'../Icon/Icon.mjs';import{PlusLarge}from'../../icon-pack/src/icons/PlusLarge/index.mjs';const COMPONENT_NAME='AddElement';const AddElement=withMergedProps(forwardRef((e,s)=>{const{type:r="button",size:o="m",variant:S="default",square:
|
|
1
|
+
import{forwardRef}from'react';import{withMergedProps}from'../../hocs/withMergedProps.mjs';import{isNil}from'../../shared/utils/isNil.mjs';import{SIZES_SQUARE,SIZES,SIZES_TEXT_SQUARE,SIZES_TEXT,SIZES_TITLE_SQUARE_WITHOUT_TEXT,SIZES_TITLE_SQUARE,SIZES_TITLE_WITHOUT_TEXT,SIZES_TITLE,SIZES_ICON_SQUARE,SIZES_ICON,SIZES_ICON_CONTAINER_SQUARE,SIZES_ICON_CONTAINER,SIZES_CONTENT_SQUARE,SIZES_CONTENT}from'./sizes.mjs';import{Root,IconContainer,Content,TextContainer}from'./style.mjs';import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{Slot}from'../Slot/Slot.mjs';import{Icon}from'../Icon/Icon.mjs';import{PlusLarge}from'../../icon-pack/src/icons/PlusLarge/index.mjs';const COMPONENT_NAME='AddElement';const AddElement=withMergedProps(forwardRef((e,s)=>{const{type:r="button",size:o="m",variant:S="default",square:t,icon:i,title:E,text:n,content:I,children:T,sizeXXS:_,sizeXS:a,sizeS:l,sizeM:c,sizeL:p,sizeXL:d,...N}=e;const m={size:o,sizeXXS:_,sizeXS:a,sizeS:l,sizeM:c,sizeL:p,sizeXL:d};const Z={...m,preset:'brand',color:'inherit',icon:jsx(PlusLarge,{}),sizes:t?SIZES_ICON_SQUARE:SIZES_ICON};const A=isNil(n)?SIZES_TITLE_WITHOUT_TEXT:SIZES_TITLE;const C=isNil(n)?SIZES_TITLE_SQUARE_WITHOUT_TEXT:SIZES_TITLE_SQUARE;const O={...m,as:'span',appearance:'subheading',weight:t?700:400,color:'inherit',wordBreak:'break-word',sizes:t?C:A};const j={...m,as:'span',appearance:'subheading',weight:400,color:'inherit',wordBreak:'break-word',sizes:t?SIZES_TEXT_SQUARE:SIZES_TEXT};return jsx(Root,{...N,...m,type:r,square:t,variant:S,ref:s,children:jsx(Slot,{render:T,props:{iconProps:Z,titleProps:O,textProps:j},fallback:jsxs(Fragment,{children:[jsx(IconContainer,{...m,sizes:t?SIZES_ICON_CONTAINER_SQUARE:SIZES_ICON_CONTAINER,square:t,children:jsx(Slot,{render:i,props:Z,fallback:jsx(Icon,{...Z})})}),jsx(Content,{...m,sizes:t?SIZES_CONTENT_SQUARE:SIZES_CONTENT,square:t,children:jsx(Slot,{render:I,props:{titleProps:O,textProps:j},fallback:jsxs(Fragment,{children:[jsx(Slot,{render:E,props:O}),isNil(n)?null:jsx(TextContainer,{children:jsx(Slot,{render:n,props:j})})]})})})]})})})}),{displayName:"AddElement",sizes:e=>e.square?SIZES_SQUARE:SIZES});export{AddElement,COMPONENT_NAME};
|
|
2
2
|
//# sourceMappingURL=AddElement.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddElement.mjs","sources":["../../../../src/components/AddElement/AddElement.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { PlusLarge } from '@foxford/icon-pack'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport type { TextProps } from 'components/Text'\nimport { isNil } from 'shared/utils/isNil'\nimport { Slot } from 'components/Slot'\nimport {\n SIZES_SQUARE,\n SIZES_CONTENT_SQUARE,\n SIZES_ICON_SQUARE,\n SIZES_ICON_CONTAINER_SQUARE,\n SIZES_ICON_CONTAINER,\n SIZES_ICON,\n SIZES,\n SIZES_TEXT_SQUARE,\n SIZES_TEXT,\n SIZES_TITLE_SQUARE,\n SIZES_TITLE,\n SIZES_CONTENT,\n SIZES_TITLE_SQUARE_WITHOUT_TEXT,\n SIZES_TITLE_WITHOUT_TEXT,\n} from './sizes'\nimport type { AddElementProps } from './types'\nimport * as Styled from './style'\n\nconst COMPONENT_NAME = 'AddElement'\n\n/**\n *\n * *v1.0.0*\n *\n * Контрол для добавления новых сущностей.\n *\n * Поддерживается \"ref\" и все нативные атрибуты \\<button\\> элемента.\n */\nconst AddElement: React.ForwardRefExoticComponent<AddElementProps> = withMergedProps<\n AddElementProps,\n HTMLButtonElement\n>(\n forwardRef<HTMLButtonElement, MergedProps<AddElementProps>>((props, ref) => {\n const {\n type = 'button',\n size = 'm',\n variant = 'default',\n square,\n icon,\n title,\n text,\n content,\n children,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n ...restProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconProps: IconProps = {\n ...sizeProps,\n preset: 'brand',\n color: 'inherit',\n icon: <PlusLarge />,\n sizes: square ? SIZES_ICON_SQUARE : SIZES_ICON,\n }\n\n const titleSizes = isNil(text) ? SIZES_TITLE_WITHOUT_TEXT : SIZES_TITLE\n const titleSquareSizes = isNil(text) ? SIZES_TITLE_SQUARE_WITHOUT_TEXT : SIZES_TITLE_SQUARE\n const titleProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: square ? 700 : 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? titleSquareSizes : titleSizes,\n }\n\n const textProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? SIZES_TEXT_SQUARE : SIZES_TEXT,\n }\n\n return (\n <Styled.Root {...restProps} {...sizeProps} type={type} square={square} variant={variant} ref={ref}>\n <Slot\n props={{ iconProps, titleProps, textProps }}\n fallback={\n <>\n <Styled.IconContainer\n {...sizeProps}\n sizes={square ? SIZES_ICON_CONTAINER_SQUARE : SIZES_ICON_CONTAINER}\n square={square}\n >\n <Slot props={iconProps} fallback={<Icon {...iconProps} />}
|
|
1
|
+
{"version":3,"file":"AddElement.mjs","sources":["../../../../src/components/AddElement/AddElement.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { PlusLarge } from '@foxford/icon-pack'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport type { TextProps } from 'components/Text'\nimport { isNil } from 'shared/utils/isNil'\nimport { Slot } from 'components/Slot'\nimport {\n SIZES_SQUARE,\n SIZES_CONTENT_SQUARE,\n SIZES_ICON_SQUARE,\n SIZES_ICON_CONTAINER_SQUARE,\n SIZES_ICON_CONTAINER,\n SIZES_ICON,\n SIZES,\n SIZES_TEXT_SQUARE,\n SIZES_TEXT,\n SIZES_TITLE_SQUARE,\n SIZES_TITLE,\n SIZES_CONTENT,\n SIZES_TITLE_SQUARE_WITHOUT_TEXT,\n SIZES_TITLE_WITHOUT_TEXT,\n} from './sizes'\nimport type { AddElementProps } from './types'\nimport * as Styled from './style'\n\nconst COMPONENT_NAME = 'AddElement'\n\n/**\n *\n * *v1.0.0*\n *\n * Контрол для добавления новых сущностей.\n *\n * Поддерживается \"ref\" и все нативные атрибуты \\<button\\> элемента.\n */\nconst AddElement: React.ForwardRefExoticComponent<AddElementProps> = withMergedProps<\n AddElementProps,\n HTMLButtonElement\n>(\n forwardRef<HTMLButtonElement, MergedProps<AddElementProps>>((props, ref) => {\n const {\n type = 'button',\n size = 'm',\n variant = 'default',\n square,\n icon,\n title,\n text,\n content,\n children,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n ...restProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconProps: IconProps = {\n ...sizeProps,\n preset: 'brand',\n color: 'inherit',\n icon: <PlusLarge />,\n sizes: square ? SIZES_ICON_SQUARE : SIZES_ICON,\n }\n\n const titleSizes = isNil(text) ? SIZES_TITLE_WITHOUT_TEXT : SIZES_TITLE\n const titleSquareSizes = isNil(text) ? SIZES_TITLE_SQUARE_WITHOUT_TEXT : SIZES_TITLE_SQUARE\n const titleProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: square ? 700 : 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? titleSquareSizes : titleSizes,\n }\n\n const textProps: TextProps = {\n ...sizeProps,\n as: 'span',\n appearance: 'subheading',\n weight: 400,\n color: 'inherit',\n wordBreak: 'break-word',\n sizes: square ? SIZES_TEXT_SQUARE : SIZES_TEXT,\n }\n\n return (\n <Styled.Root {...restProps} {...sizeProps} type={type} square={square} variant={variant} ref={ref}>\n <Slot\n render={children}\n props={{ iconProps, titleProps, textProps }}\n fallback={\n <>\n <Styled.IconContainer\n {...sizeProps}\n sizes={square ? SIZES_ICON_CONTAINER_SQUARE : SIZES_ICON_CONTAINER}\n square={square}\n >\n <Slot render={icon} props={iconProps} fallback={<Icon {...iconProps} />} />\n </Styled.IconContainer>\n\n <Styled.Content {...sizeProps} sizes={square ? SIZES_CONTENT_SQUARE : SIZES_CONTENT} square={square}>\n <Slot\n render={content}\n props={{ titleProps, textProps }}\n fallback={\n <>\n <Slot render={title} props={titleProps} />\n {!isNil(text) ? (\n <Styled.TextContainer>\n <Slot render={text} props={textProps} />\n </Styled.TextContainer>\n ) : null}\n </>\n }\n />\n </Styled.Content>\n </>\n }\n />\n </Styled.Root>\n )\n }),\n {\n displayName: COMPONENT_NAME,\n sizes: (props) => (props.square ? SIZES_SQUARE : SIZES),\n }\n)\n\nexport { AddElement, COMPONENT_NAME }\n\nexport type { AddElementProps }\n"],"names":["COMPONENT_NAME","AddElement","withMergedProps","forwardRef","props","ref","type","size","variant","square","icon","title","text","content","children","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","restProps","sizeProps","iconProps","preset","color","_jsx","PlusLarge","sizes","SIZES_ICON_SQUARE","SIZES_ICON","titleSizes","isNil","SIZES_TITLE_WITHOUT_TEXT","SIZES_TITLE","titleSquareSizes","SIZES_TITLE_SQUARE_WITHOUT_TEXT","SIZES_TITLE_SQUARE","titleProps","as","appearance","weight","wordBreak","textProps","SIZES_TEXT_SQUARE","SIZES_TEXT","Styled","Slot","render","fallback","_jsxs","_Fragment","SIZES_ICON_CONTAINER_SQUARE","SIZES_ICON_CONTAINER","Icon","SIZES_CONTENT_SQUARE","SIZES_CONTENT","displayName","SIZES_SQUARE","SIZES"],"mappings":"0pBA4BA,MAAMA,eAAiB,aAUvB,MAAMC,WAA+DC,gBAInEC,WAA4D,CAACC,EAAOC,KAClE,MAAMC,KACJA,EAAO,SAAQC,KACfA,EAAO,IAAGC,QACVA,EAAU,UAASC,OACnBA,EAAMC,KACNA,EAAIC,MACJA,EAAKC,KACLA,EAAIC,QACJA,EAAOC,SACPA,EAAQC,QACRA,EAAOC,OACPA,EAAMC,MACNA,EAAKC,MACLA,EAAKC,MACLA,EAAKC,OACLA,KACGC,GACDjB,EAEJ,MAAMkB,EAAY,CAChBf,OACAQ,UACAC,SACAC,QACAC,QACAC,QACAC,UAGF,MAAMG,EAAuB,IACxBD,EACHE,OAAQ,QACRC,MAAO,UACPf,KAAMgB,IAACC,cACPC,MAAOnB,EAASoB,kBAAoBC,YAGtC,MAAMC,EAAaC,MAAMpB,GAAQqB,yBAA2BC,YAC5D,MAAMC,EAAmBH,MAAMpB,GAAQwB,gCAAkCC,mBACzE,MAAMC,EAAwB,IACzBhB,EACHiB,GAAI,OACJC,WAAY,aACZC,OAAQhC,EAAS,IAAM,IACvBgB,MAAO,UACPiB,UAAW,aACXd,MAAOnB,EAAS0B,EAAmBJ,GAGrC,MAAMY,EAAuB,IACxBrB,EACHiB,GAAI,OACJC,WAAY,aACZC,OAAQ,IACRhB,MAAO,UACPiB,UAAW,aACXd,MAAOnB,EAASmC,kBAAoBC,YAGtC,OACEnB,IAACoB,KAAW,IAAKzB,KAAeC,EAAWhB,KAAMA,EAAMG,OAAQA,EAAQD,QAASA,EAASH,IAAKA,EAAIS,SAChGY,IAACqB,KAAI,CACHC,OAAQlC,EACRV,MAAO,CAAEmB,YAAWe,aAAYK,aAChCM,SACEC,KAAAC,SAAA,CAAArC,SAAA,CACEY,IAACoB,cAAoB,IACfxB,EACJM,MAAOnB,EAAS2C,4BAA8BC,qBAC9C5C,OAAQA,EAAOK,SAEfY,IAACqB,KAAI,CAACC,OAAQtC,EAAMN,MAAOmB,EAAW0B,SAAUvB,IAAC4B,KAAI,IAAK/B,QAG5DG,IAACoB,QAAc,IAAKxB,EAAWM,MAAOnB,EAAS8C,qBAAuBC,cAAe/C,OAAQA,EAAOK,SAClGY,IAACqB,KAAI,CACHC,OAAQnC,EACRT,MAAO,CAAEkC,aAAYK,aACrBM,SACEC,KAAAC,SAAA,CAAArC,SAAA,CACEY,IAACqB,KAAI,CAACC,OAAQrC,EAAOP,MAAOkC,IAC1BN,MAAMpB,GAIJ,KAHFc,IAACoB,cAAoB,CAAAhC,SACnBY,IAACqB,KAAI,CAACC,OAAQpC,EAAMR,MAAOuC,sBAanD,CACEc,YAhHmB,aAiHnB7B,MAAQxB,GAAWA,EAAMK,OAASiD,aAAeC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var styled=require('styled-components');var
|
|
1
|
+
'use strict';var styled=require('styled-components');var createPolymorphicComponentWithRef=require('../../shared/utils/createPolymorphicComponentWithRef.js');var useMergedProps=require('../../hooks/useMergedProps.js');var useClassname=require('../../hooks/useClassname.js');var isNil=require('../../shared/utils/isNil.js');var constants=require('./constants.js');var style=require('./style.js');var jsxRuntime=require('react/jsx-runtime');var Icon=require('../Icon/Icon.js');var Text=require('../Text/Text.js');const Anchor=createPolymorphicComponentWithRef.createPolymorphicComponentWithRef((e,s)=>{const r=styled.useTheme();const n=useMergedProps.useMergedProps(e,{componentName:"Anchor",sizes:constants.SIZES});const{component:t,size:o="inherit",autoRel:i=!0,textProps:a={},iconProps:c={},icon:l,children:u,content:p,...m}=n;const d=useClassname.useClassname("Anchor",m.className);const h=r.utils?.relBuilder;const[x,j]=Array.isArray(l)?l:[l];const y={as:'span',size:'inherit',color:'inherit',underline:m.underline,marginLeft:x?'0.20em':void 0,marginRight:j?'0.20em':void 0};const f={as:'span',color:'inherit'};return jsxRuntime.jsx(style.Root,{...m,ref:s,as:(()=>{let e='a';return m.to&&(e=r.link),m.pseudo&&(e='div'),m.disabled&&(e='span'),m.as&&(e=m.as),t&&(e=t),e})(),className:d,size:o,rel:(()=>{if(!isNil.isNil(m.rel))return m.rel;const e=m.href??m.to;if(i&&h&&typeof e=='string'){const s=m.target;if(typeof s=='string'||s===void 0)return h(e,s)}})(),"data-disabled":m.disabled,children:typeof u=='function'?u({baseTextProps:y,textProps:a,iconBaseProps:f,iconProps:c,icon:l}):m.preset==='brand'?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[x?jsxRuntime.jsx(Icon.Icon,{name:typeof x=='string'?x:void 0,icon:typeof x!='string'?x:void 0,...f,...c}):null,jsxRuntime.jsx(Text.Text,{...y,...a,children:u||p}),j?jsxRuntime.jsx(Icon.Icon,{name:typeof j=='string'?j:void 0,icon:typeof j!='string'?j:void 0,...f,...c}):null]}):u||p})});exports.Anchor=Anchor,exports.COMPONENT_NAME="Anchor";
|
|
2
2
|
//# sourceMappingURL=Anchor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Anchor.js","sources":["../../../../src/components/Anchor/Anchor.tsx"],"sourcesContent":["import { useTheme } from 'styled-components'\nimport {
|
|
1
|
+
{"version":3,"file":"Anchor.js","sources":["../../../../src/components/Anchor/Anchor.tsx"],"sourcesContent":["import { useTheme } from 'styled-components'\nimport { createPolymorphicComponentWithRef } from 'shared/utils/createPolymorphicComponentWithRef'\nimport { useMergedProps } from 'hooks/useMergedProps'\nimport { Text } from 'components/Text'\nimport type { TextProps } from 'components/Text'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport { useClassname } from 'hooks/useClassname'\nimport type { PolymorphicProps } from 'shared/interfaces'\nimport { isNil } from 'shared/utils/isNil'\nimport { SIZES } from './constants'\nimport type { AnchorProps } from './types'\nimport * as Styled from './style'\n\nconst COMPONENT_NAME = 'Anchor'\n\n/**\n *\n * Контрол многоцелевого назначения.\n *\n * Полиморфный компонент.\n *\n * Можно передать \"ref\" и атрибуты выбранного HTML-элемента (по умолчанию \\<a\\>).\n */\nconst Anchor = createPolymorphicComponentWithRef<'a', AnchorProps>((props, ref) => {\n const theme = useTheme()\n const mergedProps = useMergedProps<PolymorphicProps<React.ElementType, AnchorProps>>(props, {\n componentName: COMPONENT_NAME,\n sizes: SIZES,\n })\n\n const {\n component,\n size = 'inherit',\n autoRel = true,\n textProps = {},\n iconProps = {},\n icon,\n children,\n content,\n ...restProps\n } = mergedProps\n\n const rootNode = () => {\n let root: React.ElementType | undefined = 'a'\n\n if (restProps.to) {\n root = theme.link\n }\n if (restProps.pseudo) {\n root = 'div'\n }\n if (restProps.disabled) {\n root = 'span'\n }\n if (restProps.as) {\n root = restProps.as\n }\n if (component) {\n root = component\n }\n\n return root\n }\n\n const className = useClassname(COMPONENT_NAME, restProps.className)\n\n const relBuilder = theme.utils?.relBuilder\n\n const getRel = () => {\n if (!isNil(restProps.rel)) {\n return restProps.rel\n }\n\n const href = restProps.href ?? restProps.to\n if (autoRel && relBuilder && typeof href === 'string') {\n const target = restProps.target\n if (typeof target === 'string' || target === undefined) {\n return relBuilder(href, target)\n }\n }\n\n return undefined\n }\n\n const [before, after] = Array.isArray(icon) ? icon : [icon]\n\n const baseTextProps: TextProps = {\n as: 'span',\n size: 'inherit',\n color: 'inherit',\n underline: restProps.underline,\n marginLeft: before ? '0.20em' : undefined,\n marginRight: after ? '0.20em' : undefined,\n }\n\n const iconBaseProps: IconProps = { as: 'span', color: 'inherit' }\n\n return (\n <Styled.Root\n {...restProps}\n ref={ref}\n as={rootNode()}\n className={className}\n size={size}\n rel={getRel()}\n data-disabled={restProps.disabled}\n >\n {typeof children === 'function' ? (\n children({ baseTextProps, textProps, iconBaseProps, iconProps, icon })\n ) : restProps.preset === 'brand' ? (\n <>\n {before ? (\n <Icon\n name={typeof before === 'string' ? before : undefined}\n icon={typeof before !== 'string' ? before : undefined}\n {...iconBaseProps}\n {...iconProps}\n />\n ) : null}\n <Text {...baseTextProps} {...textProps}>\n {children || content}\n </Text>\n {after ? (\n <Icon\n name={typeof after === 'string' ? after : undefined}\n icon={typeof after !== 'string' ? after : undefined}\n {...iconBaseProps}\n {...iconProps}\n />\n ) : null}\n </>\n ) : (\n children || content\n )}\n </Styled.Root>\n )\n})\n\nconst AnchorDoc: React.FC<AnchorProps> = () => null\n\nexport { AnchorDoc, Anchor, COMPONENT_NAME }\n"],"names":["Anchor","createPolymorphicComponentWithRef","props","ref","theme","useTheme","mergedProps","useMergedProps","componentName","sizes","SIZES","component","size","autoRel","textProps","iconProps","icon","children","content","restProps","className","useClassname","relBuilder","utils","before","after","Array","isArray","baseTextProps","as","color","underline","marginLeft","undefined","marginRight","iconBaseProps","_jsx","Styled","rootNode","root","to","link","pseudo","disabled","rel","getRel","isNil","href","target","preset","_jsxs","_Fragment","Icon","name","Text"],"mappings":"+fAwBA,MAAMA,OAASC,kCAAAA,kCAAoD,CAACC,EAAOC,KACzE,MAAMC,EAAQC,OAAAA,WACd,MAAMC,EAAcC,eAAAA,eAAiEL,EAAO,CAC1FM,cAbmB,SAcnBC,MAAOC,UAAAA,QAGT,MAAMC,UACJA,EAASC,KACTA,EAAO,UAASC,QAChBA,GAAU,EAAIC,UACdA,EAAY,CAAA,EAAEC,UACdA,EAAY,CAAA,EAAEC,KACdA,EAAIC,SACJA,EAAQC,QACRA,KACGC,GACDb,EAwBJ,MAAMc,EAAYC,aAAAA,aAnDG,SAmD0BF,EAAUC,WAEzD,MAAME,EAAalB,EAAMmB,OAAOD,WAkBhC,MAAOE,EAAQC,GAASC,MAAMC,QAAQX,GAAQA,EAAO,CAACA,GAEtD,MAAMY,EAA2B,CAC/BC,GAAI,OACJjB,KAAM,UACNkB,MAAO,UACPC,UAAWZ,EAAUY,UACrBC,WAAYR,EAAS,cAAWS,EAChCC,YAAaT,EAAQ,cAAWQ,GAGlC,MAAME,EAA2B,CAAEN,GAAI,OAAQC,MAAO,WAEtD,OACEM,WAAAA,IAACC,MAAAA,KAAW,IACNlB,EACJhB,IAAKA,EACL0B,GA3DaS,MACf,IAAIC,EAAsC,IAkB1C,OAhBIpB,EAAUqB,KACZD,EAAOnC,EAAMqC,MAEXtB,EAAUuB,SACZH,EAAO,OAELpB,EAAUwB,WACZJ,EAAO,QAELpB,EAAUU,KACZU,EAAOpB,EAAUU,IAEflB,IACF4B,EAAO5B,GAGF4B,GAwCDD,GACJlB,UAAWA,EACXR,KAAMA,EACNgC,IApCWC,MACb,IAAKC,MAAAA,MAAM3B,EAAUyB,KACnB,OAAOzB,EAAUyB,IAGnB,MAAMG,EAAO5B,EAAU4B,MAAQ5B,EAAUqB,GACzC,GAAI3B,GAAWS,UAAqByB,GAAS,SAAU,CACrD,MAAMC,EAAS7B,EAAU6B,OACzB,UAAWA,GAAW,UAAYA,SAAWf,EAC3C,OAAOX,EAAWyB,EAAMC,EAE5B,GAyBOH,GACL,gBAAe1B,EAAUwB,SAAS1B,gBAE1BA,GAAa,WACnBA,EAAS,CAAEW,gBAAed,YAAWqB,gBAAepB,YAAWC,SAC7DG,EAAU8B,SAAW,QACvBC,WAAAA,KAAAC,WAAAA,SAAA,CAAAlC,SAAA,CACGO,EACCY,WAAAA,IAACgB,UAAI,CACHC,YAAa7B,GAAW,SAAWA,OAASS,EAC5CjB,YAAaQ,GAAW,SAAWA,OAASS,KACxCE,KACApB,IAEJ,KACJqB,WAAAA,IAACkB,UAAI,IAAK1B,KAAmBd,EAASG,SACnCA,GAAYC,IAEdO,EACCW,WAAAA,IAACgB,UAAI,CACHC,YAAa5B,GAAU,SAAWA,OAAQQ,EAC1CjB,YAAaS,GAAU,SAAWA,OAAQQ,KACtCE,KACApB,IAEJ,QAGNE,GAAYC,mDAvHG"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useTheme}from'styled-components';import{
|
|
1
|
+
import{useTheme}from'styled-components';import{createPolymorphicComponentWithRef}from'../../shared/utils/createPolymorphicComponentWithRef.mjs';import{useMergedProps}from'../../hooks/useMergedProps.mjs';import{useClassname}from'../../hooks/useClassname.mjs';import{isNil}from'../../shared/utils/isNil.mjs';import{SIZES}from'./constants.mjs';import{Root}from'./style.mjs';import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{Icon}from'../Icon/Icon.mjs';import{Text}from'../Text/Text.mjs';const COMPONENT_NAME='Anchor';const Anchor=createPolymorphicComponentWithRef((o,e)=>{const s=useTheme();const r=useMergedProps(o,{componentName:"Anchor",sizes:SIZES});const{component:t,size:n="inherit",autoRel:i=!0,textProps:m={},iconProps:c={},icon:a,children:p,content:l,...d}=r;const f=useClassname("Anchor",d.className);const h=s.utils?.relBuilder;const[u,j]=Array.isArray(a)?a:[a];const x={as:'span',size:'inherit',color:'inherit',underline:d.underline,marginLeft:u?'0.20em':void 0,marginRight:j?'0.20em':void 0};const g={as:'span',color:'inherit'};return jsx(Root,{...d,ref:e,as:(()=>{let o='a';return d.to&&(o=s.link),d.pseudo&&(o='div'),d.disabled&&(o='span'),d.as&&(o=d.as),t&&(o=t),o})(),className:f,size:n,rel:(()=>{if(!isNil(d.rel))return d.rel;const o=d.href??d.to;if(i&&h&&typeof o=='string'){const e=d.target;if(typeof e=='string'||e===void 0)return h(o,e)}})(),"data-disabled":d.disabled,children:typeof p=='function'?p({baseTextProps:x,textProps:m,iconBaseProps:g,iconProps:c,icon:a}):d.preset==='brand'?jsxs(Fragment,{children:[u?jsx(Icon,{name:typeof u=='string'?u:void 0,icon:typeof u!='string'?u:void 0,...g,...c}):null,jsx(Text,{...x,...m,children:p||l}),j?jsx(Icon,{name:typeof j=='string'?j:void 0,icon:typeof j!='string'?j:void 0,...g,...c}):null]}):p||l})});export{Anchor,COMPONENT_NAME};
|
|
2
2
|
//# sourceMappingURL=Anchor.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Anchor.mjs","sources":["../../../../src/components/Anchor/Anchor.tsx"],"sourcesContent":["import { useTheme } from 'styled-components'\nimport {
|
|
1
|
+
{"version":3,"file":"Anchor.mjs","sources":["../../../../src/components/Anchor/Anchor.tsx"],"sourcesContent":["import { useTheme } from 'styled-components'\nimport { createPolymorphicComponentWithRef } from 'shared/utils/createPolymorphicComponentWithRef'\nimport { useMergedProps } from 'hooks/useMergedProps'\nimport { Text } from 'components/Text'\nimport type { TextProps } from 'components/Text'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport { useClassname } from 'hooks/useClassname'\nimport type { PolymorphicProps } from 'shared/interfaces'\nimport { isNil } from 'shared/utils/isNil'\nimport { SIZES } from './constants'\nimport type { AnchorProps } from './types'\nimport * as Styled from './style'\n\nconst COMPONENT_NAME = 'Anchor'\n\n/**\n *\n * Контрол многоцелевого назначения.\n *\n * Полиморфный компонент.\n *\n * Можно передать \"ref\" и атрибуты выбранного HTML-элемента (по умолчанию \\<a\\>).\n */\nconst Anchor = createPolymorphicComponentWithRef<'a', AnchorProps>((props, ref) => {\n const theme = useTheme()\n const mergedProps = useMergedProps<PolymorphicProps<React.ElementType, AnchorProps>>(props, {\n componentName: COMPONENT_NAME,\n sizes: SIZES,\n })\n\n const {\n component,\n size = 'inherit',\n autoRel = true,\n textProps = {},\n iconProps = {},\n icon,\n children,\n content,\n ...restProps\n } = mergedProps\n\n const rootNode = () => {\n let root: React.ElementType | undefined = 'a'\n\n if (restProps.to) {\n root = theme.link\n }\n if (restProps.pseudo) {\n root = 'div'\n }\n if (restProps.disabled) {\n root = 'span'\n }\n if (restProps.as) {\n root = restProps.as\n }\n if (component) {\n root = component\n }\n\n return root\n }\n\n const className = useClassname(COMPONENT_NAME, restProps.className)\n\n const relBuilder = theme.utils?.relBuilder\n\n const getRel = () => {\n if (!isNil(restProps.rel)) {\n return restProps.rel\n }\n\n const href = restProps.href ?? restProps.to\n if (autoRel && relBuilder && typeof href === 'string') {\n const target = restProps.target\n if (typeof target === 'string' || target === undefined) {\n return relBuilder(href, target)\n }\n }\n\n return undefined\n }\n\n const [before, after] = Array.isArray(icon) ? icon : [icon]\n\n const baseTextProps: TextProps = {\n as: 'span',\n size: 'inherit',\n color: 'inherit',\n underline: restProps.underline,\n marginLeft: before ? '0.20em' : undefined,\n marginRight: after ? '0.20em' : undefined,\n }\n\n const iconBaseProps: IconProps = { as: 'span', color: 'inherit' }\n\n return (\n <Styled.Root\n {...restProps}\n ref={ref}\n as={rootNode()}\n className={className}\n size={size}\n rel={getRel()}\n data-disabled={restProps.disabled}\n >\n {typeof children === 'function' ? (\n children({ baseTextProps, textProps, iconBaseProps, iconProps, icon })\n ) : restProps.preset === 'brand' ? (\n <>\n {before ? (\n <Icon\n name={typeof before === 'string' ? before : undefined}\n icon={typeof before !== 'string' ? before : undefined}\n {...iconBaseProps}\n {...iconProps}\n />\n ) : null}\n <Text {...baseTextProps} {...textProps}>\n {children || content}\n </Text>\n {after ? (\n <Icon\n name={typeof after === 'string' ? after : undefined}\n icon={typeof after !== 'string' ? after : undefined}\n {...iconBaseProps}\n {...iconProps}\n />\n ) : null}\n </>\n ) : (\n children || content\n )}\n </Styled.Root>\n )\n})\n\nconst AnchorDoc: React.FC<AnchorProps> = () => null\n\nexport { AnchorDoc, Anchor, COMPONENT_NAME }\n"],"names":["COMPONENT_NAME","Anchor","createPolymorphicComponentWithRef","props","ref","theme","useTheme","mergedProps","useMergedProps","componentName","sizes","SIZES","component","size","autoRel","textProps","iconProps","icon","children","content","restProps","className","useClassname","relBuilder","utils","before","after","Array","isArray","baseTextProps","as","color","underline","marginLeft","undefined","marginRight","iconBaseProps","_jsx","Styled","rootNode","root","to","link","pseudo","disabled","rel","getRel","isNil","href","target","preset","_jsxs","_Fragment","Icon","name","Text"],"mappings":"0eAcA,MAAMA,eAAiB,SAUvB,MAAMC,OAASC,kCAAoD,CAACC,EAAOC,KACzE,MAAMC,EAAQC,WACd,MAAMC,EAAcC,eAAiEL,EAAO,CAC1FM,cAbmB,SAcnBC,MAAOC,QAGT,MAAMC,UACJA,EAASC,KACTA,EAAO,UAASC,QAChBA,GAAU,EAAIC,UACdA,EAAY,CAAA,EAAEC,UACdA,EAAY,CAAA,EAAEC,KACdA,EAAIC,SACJA,EAAQC,QACRA,KACGC,GACDb,EAwBJ,MAAMc,EAAYC,aAnDG,SAmD0BF,EAAUC,WAEzD,MAAME,EAAalB,EAAMmB,OAAOD,WAkBhC,MAAOE,EAAQC,GAASC,MAAMC,QAAQX,GAAQA,EAAO,CAACA,GAEtD,MAAMY,EAA2B,CAC/BC,GAAI,OACJjB,KAAM,UACNkB,MAAO,UACPC,UAAWZ,EAAUY,UACrBC,WAAYR,EAAS,cAAWS,EAChCC,YAAaT,EAAQ,cAAWQ,GAGlC,MAAME,EAA2B,CAAEN,GAAI,OAAQC,MAAO,WAEtD,OACEM,IAACC,KAAW,IACNlB,EACJhB,IAAKA,EACL0B,GA3DaS,MACf,IAAIC,EAAsC,IAkB1C,OAhBIpB,EAAUqB,KACZD,EAAOnC,EAAMqC,MAEXtB,EAAUuB,SACZH,EAAO,OAELpB,EAAUwB,WACZJ,EAAO,QAELpB,EAAUU,KACZU,EAAOpB,EAAUU,IAEflB,IACF4B,EAAO5B,GAGF4B,GAwCDD,GACJlB,UAAWA,EACXR,KAAMA,EACNgC,IApCWC,MACb,IAAKC,MAAM3B,EAAUyB,KACnB,OAAOzB,EAAUyB,IAGnB,MAAMG,EAAO5B,EAAU4B,MAAQ5B,EAAUqB,GACzC,GAAI3B,GAAWS,UAAqByB,GAAS,SAAU,CACrD,MAAMC,EAAS7B,EAAU6B,OACzB,UAAWA,GAAW,UAAYA,SAAWf,EAC3C,OAAOX,EAAWyB,EAAMC,EAE5B,GAyBOH,GACL,gBAAe1B,EAAUwB,SAAS1B,gBAE1BA,GAAa,WACnBA,EAAS,CAAEW,gBAAed,YAAWqB,gBAAepB,YAAWC,SAC7DG,EAAU8B,SAAW,QACvBC,KAAAC,SAAA,CAAAlC,SAAA,CACGO,EACCY,IAACgB,KAAI,CACHC,YAAa7B,GAAW,SAAWA,OAASS,EAC5CjB,YAAaQ,GAAW,SAAWA,OAASS,KACxCE,KACApB,IAEJ,KACJqB,IAACkB,KAAI,IAAK1B,KAAmBd,EAASG,SACnCA,GAAYC,IAEdO,EACCW,IAACgB,KAAI,CACHC,YAAa5B,GAAU,SAAWA,OAAQQ,EAC1CjB,YAAaS,GAAU,SAAWA,OAAQQ,KACtCE,KACApB,IAEJ,QAGNE,GAAYC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var jsxRuntime=require('react/jsx-runtime');var Slot=require('../Slot/Slot.js');exports.Header=({header:t,caption:e,title:
|
|
1
|
+
'use strict';var jsxRuntime=require('react/jsx-runtime');var Slot=require('../Slot/Slot.js');exports.Header=({header:t,caption:e,title:r,subtitle:s,captionProps:o,titleProps:i,subtitleProps:l})=>jsxRuntime.jsx(Slot.Slot,{render:t,props:{captionProps:o,titleProps:i,subtitleProps:l},fallback:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Slot.Slot,{render:e,props:o}),jsxRuntime.jsx(Slot.Slot,{render:r,props:i}),jsxRuntime.jsx(Slot.Slot,{render:s,props:l})]})});
|
|
2
2
|
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sources":["../../../../src/components/DialogComponent/Header.tsx"],"sourcesContent":["import type { FC } from 'react'\nimport { Slot } from 'components/Slot'\nimport type { HeaderProps } from './types'\n\nconst Header: FC<HeaderProps> = ({ header, caption, title, subtitle, captionProps, titleProps, subtitleProps }) => (\n <Slot\n props={{ captionProps, titleProps, subtitleProps }}\n fallback={\n <>\n <Slot props={captionProps}
|
|
1
|
+
{"version":3,"file":"Header.js","sources":["../../../../src/components/DialogComponent/Header.tsx"],"sourcesContent":["import type { FC } from 'react'\nimport { Slot } from 'components/Slot'\nimport type { HeaderProps } from './types'\n\nconst Header: FC<HeaderProps> = ({ header, caption, title, subtitle, captionProps, titleProps, subtitleProps }) => (\n <Slot\n render={header}\n props={{ captionProps, titleProps, subtitleProps }}\n fallback={\n <>\n <Slot render={caption} props={captionProps} />\n <Slot render={title} props={titleProps} />\n <Slot render={subtitle} props={subtitleProps} />\n </>\n }\n />\n)\n\nexport { Header }\n"],"names":["Header","header","caption","title","subtitle","captionProps","titleProps","subtitleProps","_jsx","Slot","render","props","fallback","_jsxs","_Fragment","children"],"mappings":"4GAIgCA,EAAGC,SAAQC,UAASC,QAAOC,WAAUC,eAAcC,aAAYC,mBAC7FC,WAAAA,IAACC,KAAAA,KAAI,CACHC,OAAQT,EACRU,MAAO,CAAEN,eAAcC,aAAYC,iBACnCK,SACEC,WAAAA,KAAAC,oBAAA,CAAAC,SAAA,CACEP,WAAAA,IAACC,UAAI,CAACC,OAAQR,EAASS,MAAON,IAC9BG,WAAAA,IAACC,UAAI,CAACC,OAAQP,EAAOQ,MAAOL,IAC5BE,WAAAA,IAACC,UAAI,CAACC,OAAQN,EAAUO,MAAOJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{Slot}from'../Slot/Slot.mjs';const Header=({header:
|
|
1
|
+
import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{Slot}from'../Slot/Slot.mjs';const Header=({header:r,caption:t,title:e,subtitle:o,captionProps:s,titleProps:p,subtitleProps:l})=>jsx(Slot,{render:r,props:{captionProps:s,titleProps:p,subtitleProps:l},fallback:jsxs(Fragment,{children:[jsx(Slot,{render:t,props:s}),jsx(Slot,{render:e,props:p}),jsx(Slot,{render:o,props:l})]})});export{Header};
|
|
2
2
|
//# sourceMappingURL=Header.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.mjs","sources":["../../../../src/components/DialogComponent/Header.tsx"],"sourcesContent":["import type { FC } from 'react'\nimport { Slot } from 'components/Slot'\nimport type { HeaderProps } from './types'\n\nconst Header: FC<HeaderProps> = ({ header, caption, title, subtitle, captionProps, titleProps, subtitleProps }) => (\n <Slot\n props={{ captionProps, titleProps, subtitleProps }}\n fallback={\n <>\n <Slot props={captionProps}
|
|
1
|
+
{"version":3,"file":"Header.mjs","sources":["../../../../src/components/DialogComponent/Header.tsx"],"sourcesContent":["import type { FC } from 'react'\nimport { Slot } from 'components/Slot'\nimport type { HeaderProps } from './types'\n\nconst Header: FC<HeaderProps> = ({ header, caption, title, subtitle, captionProps, titleProps, subtitleProps }) => (\n <Slot\n render={header}\n props={{ captionProps, titleProps, subtitleProps }}\n fallback={\n <>\n <Slot render={caption} props={captionProps} />\n <Slot render={title} props={titleProps} />\n <Slot render={subtitle} props={subtitleProps} />\n </>\n }\n />\n)\n\nexport { Header }\n"],"names":["Header","header","caption","title","subtitle","captionProps","titleProps","subtitleProps","_jsx","Slot","render","props","fallback","_jsxs","_Fragment","children"],"mappings":"oFAIA,MAAMA,OAA0BA,EAAGC,SAAQC,UAASC,QAAOC,WAAUC,eAAcC,aAAYC,mBAC7FC,IAACC,KAAI,CACHC,OAAQT,EACRU,MAAO,CAAEN,eAAcC,aAAYC,iBACnCK,SACEC,KAAAC,SAAA,CAAAC,SAAA,CACEP,IAACC,KAAI,CAACC,OAAQR,EAASS,MAAON,IAC9BG,IAACC,KAAI,CAACC,OAAQP,EAAOQ,MAAOL,IAC5BE,IAACC,KAAI,CAACC,OAAQN,EAAUO,MAAOJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var React=require('react');var nanoid=require('nanoid');var withMergedProps=require('../../hocs/withMergedProps.js');var useScrollMonitor=require('../../hooks/useScrollMonitor.js');var dom=require('../../shared/utils/dom.js');var misc=require('../../shared/utils/misc.js');var constants=require('../../shared/constants.js');var DropdownMenu=require('./DropdownMenu.js');var hooks=require('./hooks.js');var sizes=require('./sizes.js');var utils=require('./utils.js');var style=require('./style.js');var DropdownMenuMultiple=require('./DropdownMenuMultiple.js');var DropdownMenuSingle=require('./DropdownMenuSingle.js');var jsxRuntime=require('react/jsx-runtime');var FormInputLabel=require('../FormInputLabel/FormInputLabel.js');var Chip=require('../Chip/Chip.js');var IconButton=require('../IconButton/IconButton.js');var index=require('../../icon-pack/src/icons/Close/index.js');var index$1=require('../../icon-pack/src/icons/ChevronDown/index.js');var Icon=require('../Icon/Icon.js');var Slot=require('../Slot/Slot.js');var FormInput=require('../FormInput/FormInput.js');const Dropdown=withMergedProps.withMergedProps(React.forwardRef((e,o)=>{const{size:n="m",name:t="fox-dropdown",labelPosition:r="dynamic",searchable:s=!0,primary:a=!0,optionsMultiToggle:i=!0,iconProps:l={},menuProps:c={},loadingIconProps:u={},optionsEmptyIconProps:d={},loading:p,autoFocus:b,disableAutoScrollToSelectedOption:g,closeMenuOnScroll:m,scrollMonitorTarget:f,contrast:v,selectedOption:x,defaultSelectedOption:y,icon:D,addonLeft:j,inputMode:w,loadingMessage:C,loadingIcon:M,maxLength:I,multiple:R,clearable:
|
|
1
|
+
'use strict';var React=require('react');var nanoid=require('nanoid');var withMergedProps=require('../../hocs/withMergedProps.js');var useScrollMonitor=require('../../hooks/useScrollMonitor.js');var dom=require('../../shared/utils/dom.js');var misc=require('../../shared/utils/misc.js');var constants=require('../../shared/constants.js');var DropdownMenu=require('./DropdownMenu.js');var hooks=require('./hooks.js');var sizes=require('./sizes.js');var utils=require('./utils.js');var style=require('./style.js');var DropdownMenuMultiple=require('./DropdownMenuMultiple.js');var DropdownMenuSingle=require('./DropdownMenuSingle.js');var jsxRuntime=require('react/jsx-runtime');var FormInputLabel=require('../FormInputLabel/FormInputLabel.js');var Chip=require('../Chip/Chip.js');var IconButton=require('../IconButton/IconButton.js');var index=require('../../icon-pack/src/icons/Close/index.js');var index$1=require('../../icon-pack/src/icons/ChevronDown/index.js');var Icon=require('../Icon/Icon.js');var Slot=require('../Slot/Slot.js');var FormInput=require('../FormInput/FormInput.js');const Dropdown=withMergedProps.withMergedProps(React.forwardRef((e,o)=>{const{size:n="m",name:t="fox-dropdown",labelPosition:r="dynamic",searchable:s=!0,primary:a=!0,optionsMultiToggle:i=!0,iconProps:l={},menuProps:c={},loadingIconProps:u={},optionsEmptyIconProps:d={},loading:p,autoFocus:b,disableAutoScrollToSelectedOption:g,closeMenuOnScroll:m,scrollMonitorTarget:f,contrast:v,selectedOption:x,defaultSelectedOption:y,icon:D,addonLeft:j,inputMode:w,loadingMessage:C,loadingIcon:M,maxLength:I,multiple:R,clearable:k,onChangeInput:h,onCloseMenu:S,onOpenMenu:O,onSelectOption:T,options:q,loadOptions:F,renderOption:P,groupSelectedOptions:z,optionsMultiToggleCaption:L,optionsEmptyMessage:E,optionsEmptyIcon:B,palette:K,placeholder:X,readOnly:N,required:A,status:H,sizeXXS:$,sizeXS:Z,sizeS:_,sizeM:U,sizeL:G,sizeXL:J,form:Q,label:V,...W}=e;const Y={size:n,sizeXXS:$,sizeXS:Z,sizeS:_,sizeM:U,sizeL:G,sizeXL:J};const ee={...Y,...l,sizes:sizes.SIZES_ICON,color:W.disabled?'content-disabled':'content-onmain-tertiary'};const oe=React.useMemo(()=>W.id??`${t}-${nanoid.nanoid()}`,[t,W.id]);const ne=React.useMemo(()=>nanoid.nanoid(),[]);const te=React.useMemo(()=>nanoid.nanoid(),[]);const[re,se]=hooks.useFilteredOptions({options:q});const[ae,ie,le]=hooks.useLoadedOptions({loadOptions:F,options:q});const[ce,ue]=React.useState(()=>utils.getDropdownSelectedOption(x!==void 0?x:y,R));const[de,pe]=React.useState(()=>utils.getDropdownInputText(ce,R));const[be,ge]=React.useState(!1);const[me,fe]=React.useState(!1);const ve=F?ae:re;const xe=F?p??ie:p;const ye=me&&!W.disabled;const De=A&&ce.length===0;const je=Boolean(ye||de||be);const we=React.useRef(null);const[Ce,Me]=React.useState(null);const Ie=React.useRef(null);const Re=React.useRef(null);const ke=React.useRef(ye);const he=React.useCallback(e=>{pe(e),h&&h(e)},[h]);const Se=React.useCallback(e=>{F?le(e):se(e)},[F,le,se]);const Oe=React.useMemo(()=>misc.createDebouncedCallback(Se,150),[Se]);const preventBlur=e=>{e.target!==we.current&&e.target instanceof Node&&(e.currentTarget.contains(e.target)||c.renderInPortal&&ye&&Ce&&Ce.contains(e.target))&&e.preventDefault()};return useScrollMonitor.useScrollMonitor({target:f,onScrollStart:()=>{m&&ye&&(we.current?.focus(),fe(!1))}}),React.useLayoutEffect(()=>{x!==void 0&&(R||ye||he(utils.getDropdownInputText(x)),ue(utils.getDropdownSelectedOption(x,R)))},[R,x,ye,he]),React.useEffect(()=>{ye!==ke.current&&(ye&&O&&O(),!ye&&S&&S(),ke.current=ye)},[ye,S,O]),React.useEffect(()=>{if(!R&&!g&&ye&&!xe&&de.length===0&&Ce&&Re.current){const e=Ce.getBoundingClientRect();const o=Re.current.getBoundingClientRect();(o.top<e.top||o.bottom>e.bottom)&&setTimeout(()=>{Ce&&Re.current&&Ce.scrollTo(0,Re.current.offsetTop)},0)}},[R,g,ye,xe,de,Ce]),React.useEffect(()=>{W.disabled&&ge(!1)},[W.disabled]),jsxRuntime.jsx(FormInputLabel.FormInputLabel,{...W,...Y,ref:o,id:oe,onColored:v,primary:a,error:H==='error',success:H==='success',focus:be,palette:{color:W.disabled?K.labelColorDisabled:K.labelColor,backgroundColor:W.disabled?K.backgroundColorDisabled:K.backgroundColor,backgroundColorHover:W.disabled?K.backgroundColorDisabled:K.backgroundColorHover,borderColor:W.disabled?K.borderColorDisabled:K.borderColor},onClick:e=>{W.onClick&&W.onClick(e),W.disabled||(we.current?.focus(),ye?Ce&&e.target instanceof Node&&!Ce.contains(e.target)&&(fe(!1),he(utils.getDropdownInputText(ce,R))):(fe(!0),Se(''),s&&he('')))},onPointerDown:e=>{W.onPointerDown&&W.onPointerDown(e),preventBlur(e)},onMouseDown:e=>{W.onMouseDown&&W.onMouseDown(e),window.PointerEvent||preventBlur(e)},onFocus:e=>{W.onFocus&&W.onFocus(e),ge(!0),we.current&&e.target===we.current&&s&&!R&&!ye&&he('')},onBlur:e=>{W.onBlur&&W.onBlur(e),e.currentTarget.contains(e.relatedTarget)||c.renderInPortal&&ye&&Ce&&Ce.contains(e.relatedTarget)||(ge(!1),he(utils.getDropdownInputText(ce,R)),fe(!1))},input:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[!De||s||N?null:jsxRuntime.jsx(style.InputMimic,{required:!0,type:"text",inputMode:"none",form:Q,tabIndex:-1,onFocus:()=>{we.current?.focus()}}),jsxRuntime.jsx(FormInput.FormInput,{...Y,ref:we,role:"combobox","aria-controls":te,"aria-expanded":ye,type:"text",autoComplete:"off",autoCapitalize:"off",autoCorrect:"off",spellCheck:"false",active:je,label:V,labelId:ne,labelPosition:r,form:Q,autoFocus:b,inputMode:s?w:'none',maxLength:I,placeholder:X,readOnly:N||!s,required:De,disabled:W.disabled,value:de,palette:{color:K.color,colorDisabled:K.colorDisabled,placeholderColor:K.placeholderColor,placeholderColorDisabled:K.placeholderColorDisabled},onClick:e=>{ye&&e.currentTarget.selectionStart!==e.currentTarget.selectionEnd&&e.stopPropagation()},onChange:e=>{const o=e.currentTarget.value;he(o),Oe(o),fe(!0)},onKeyDown:e=>{if(constants.keyboardKeys.Enter.validate(e.key)&&(he(utils.getDropdownInputText(ce,R)),fe(!1)),!constants.keyboardKeys.Space.validate(e.key)||ye&&e.currentTarget.selectionStart!==0||(e.preventDefault(),ye||(Se(''),s&&he('')),fe(e=>!e)),constants.keyboardKeys.Esc.validate(e.key)&&fe(!1),constants.keyboardKeys.Tab.validate(e.key)&&ye&&(e.preventDefault(),fe(!1)),constants.keyboardKeys.ArrowDown.validate(e.key)&&ye&&Ie.current)if(e.preventDefault(),!R&&Re.current){const e=[...Ie.current.children];const o=e.findIndex(e=>e.contains(Re.current));const n=e[o+1]??e[0];n instanceof HTMLElement&&dom.focusFirstFocusable(n)}else dom.focusFirstFocusable(Ie.current);if(constants.keyboardKeys.ArrowUp.validate(e.key)&&ye&&Ie.current)if(e.preventDefault(),!R&&Re.current){const e=[...Ie.current.children];const o=e.findIndex(e=>e.contains(Re.current));const n=e[o-1]??e[e.length-1];n instanceof HTMLElement&&dom.focusFirstFocusable(n)}else dom.focusLastFocusable(Ie.current)}}),ce.map(e=>jsxRuntime.jsx("input",{type:"hidden",name:t,value:e.value,form:Q,disabled:W.disabled||e.disabled},e.value))]}),addonLeft:D?jsxRuntime.jsx(Icon.Icon,{name:typeof D=='string'?D:void 0,icon:typeof D!='string'?D:void 0,...ee}):j?jsxRuntime.jsx(Slot.Slot,{render:j,props:{iconProps:ee}}):null,addonRight:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[R&&ce.length>0?jsxRuntime.jsx(Chip.Chip,{size:"xs",active:!0,black:!0,disabled:W.disabled,cursor:W.disabled?'not-allowed':void 0,text:ce.length,textProps:{appearance:'caption',size:'xs'},palette:W.disabled?{color:'content-disabled',colorHover:'content-disabled',backgroundColor:'bg-disabled-small',backgroundColorHover:'bg-disabled-small'}:void 0,onPointerDown:e=>{e.preventDefault()},onMouseDown:e=>{window.PointerEvent||e.preventDefault()},discardButtonProps:{square:!0,contrast:!W.disabled,onClick:e=>{e.stopPropagation(),N||(x===void 0&&ue([]),T&&T([]),we.current?.focus(),he(''),Se(''),fe(!0))}}}):null,!R&&k&&ce.length>0?jsxRuntime.jsx(IconButton.IconButton,{icon:jsxRuntime.jsx(index.Close,{}),size:"l",square:!0,disabled:W.disabled,onClick:e=>{e.stopPropagation(),N||(x===void 0&&ue([]),T&&T(null),we.current?.focus(),he(''),Se(''),fe(!0))}}):null,jsxRuntime.jsx(style.IconAnimated,{icon:jsxRuntime.jsx(index$1.ChevronDown,{}),up:ye,...ee})]}),dropdown:jsxRuntime.jsx(DropdownMenu.DropdownMenu,{...c,setRef:Me,open:ye,popperReferenceId:oe,secondary:!v,elevated:v,disableAutoFocus:!0,palette:{backgroundColor:K.menuBackgroundColor,borderColor:K.menuBorderColor},empty:ve.length===0,loading:xe,loadingMessage:C,loadingIcon:M,loadingIconProps:{...ee,...u},emptyMessage:E,emptyIcon:B,emptyIconProps:{...ee,...d},onKeyDown:e=>{constants.keyboardKeys.Tab.validate(e.key)&&(e.preventDefault(),we.current?.focus(),fe(!1)),constants.keyboardKeys.Enter.validate(e.key)&&(we.current?.focus(),he(utils.getDropdownInputText(ce,R)),fe(!1)),constants.keyboardKeys.Esc.validate(e.key)&&(we.current?.focus(),fe(!1)),constants.keyboardKeys.Backspace.validate(e.key)&&!N&&(R||!R&&k)&&(x===void 0&&ue([]),T&&T(R?[]:null),he(''),Se(''))},children:R?jsxRuntime.jsx(DropdownMenuMultiple.DropdownMenuMultiple,{...Y,ref:Ie,inputRef:we,label:V,name:t,disabled:W.disabled,readOnly:N,menuListId:te,inputLabelId:ne,menuOptions:ve,dropdownSelectedOption:ce,inputText:de,optionsMultiToggle:i,groupSelectedOptions:z,optionsMultiToggleCaption:L,renderOption:P,onChange:e=>{x===void 0&&ue(e),T&&T(e)}}):jsxRuntime.jsx(DropdownMenuSingle.DropdownMenuSingle,{...Y,ref:Ie,label:V,readOnly:N,multiple:R,disabled:W.disabled,status:H,menuListId:te,inputLabelId:ne,menuOptions:ve,dropdownSelectedOption:ce,selectedOptionRef:Re,renderOption:P,onChange:e=>{const o={...e};x===void 0&&(he(utils.getDropdownInputText(o)),ue(utils.getDropdownSelectedOption(o))),T&&T(o),we.current?.focus(),fe(!1)}})})})}),{sizes:sizes.SIZES,displayName:"Dropdown"});exports.COMPONENT_NAME="Dropdown",exports.Dropdown=Dropdown;
|
|
2
2
|
//# sourceMappingURL=Dropdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react'\nimport { nanoid } from 'nanoid'\nimport { ChevronDown, Close } from '@foxford/icon-pack'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { useScrollMonitor } from 'hooks/useScrollMonitor'\nimport { focusFirstFocusable, focusLastFocusable } from 'shared/utils/dom'\nimport { createDebouncedCallback } from 'shared/utils/misc'\nimport { keyboardKeys } from 'shared/constants'\nimport type { Nullable } from 'shared/types'\nimport { FormInput } from 'components/FormInput'\nimport { FormInputLabel } from 'components/FormInputLabel'\nimport { Chip } from 'components/Chip'\nimport { IconButton } from 'components/IconButton'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport { Slot } from 'components/Slot'\nimport { DropdownMenu } from './DropdownMenu'\nimport { useFilteredOptions, useLoadedOptions } from './hooks'\nimport { SIZES, SIZES_ICON } from './sizes'\nimport { getDropdownInputText, getDropdownSelectedOption } from './utils'\nimport * as Styled from './style'\nimport type { DropdownProps, DropdownOption, DropdownOptionGroup } from './types'\nimport { DropdownMenuMultiple } from './DropdownMenuMultiple'\nimport { DropdownMenuSingle } from './DropdownMenuSingle'\n\nconst COMPONENT_NAME = 'Dropdown'\n\n/**\n *\n * Компонент для выбора одной или нескольких опций из числа доступных.\n *\n * Поддерживается \"ref\" и все нативные атрибуты \\<div\\> элемента.\n */\nconst Dropdown: React.ForwardRefExoticComponent<DropdownProps> = withMergedProps<DropdownProps, HTMLDivElement>(\n forwardRef<HTMLDivElement, MergedProps<DropdownProps>>((props, ref) => {\n const {\n size = 'm',\n name = 'fox-dropdown',\n labelPosition = 'dynamic',\n searchable = true,\n primary = true,\n optionsMultiToggle = true,\n iconProps = {},\n menuProps = {},\n loadingIconProps = {},\n optionsEmptyIconProps = {},\n loading,\n autoFocus,\n disableAutoScrollToSelectedOption,\n closeMenuOnScroll,\n scrollMonitorTarget,\n contrast,\n selectedOption,\n defaultSelectedOption,\n icon,\n addonLeft,\n inputMode,\n loadingMessage,\n loadingIcon,\n maxLength,\n multiple,\n clearable,\n onChangeInput,\n onCloseMenu,\n onOpenMenu,\n onSelectOption,\n options,\n loadOptions,\n renderOption,\n groupSelectedOptions,\n optionsMultiToggleCaption,\n optionsEmptyMessage,\n optionsEmptyIcon,\n palette,\n placeholder,\n readOnly,\n required,\n status,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n form,\n label,\n ...rootProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconBaseProps: IconProps = {\n ...sizeProps,\n ...iconProps,\n sizes: SIZES_ICON,\n color: rootProps.disabled ? 'content-disabled' : 'content-onmain-tertiary',\n }\n\n const formInputLabelId = useMemo(() => rootProps.id ?? `${name}-${nanoid()}`, [name, rootProps.id])\n const inputLabelId = useMemo(() => nanoid(), [])\n const menuListId = useMemo(() => nanoid(), [])\n\n const [filteredOptions, getFilteredOptions] = useFilteredOptions({\n options,\n })\n\n const [loadedOptions, optionsLoading, getLoadedOptions] = useLoadedOptions({\n loadOptions,\n options,\n })\n\n const [dropdownSelectedOption, setDropdownSelectedOption] = useState<DropdownOption[]>(() =>\n getDropdownSelectedOption(selectedOption !== undefined ? selectedOption : defaultSelectedOption, multiple)\n )\n\n const [inputText, setInputText] = useState<string>(() => getDropdownInputText(dropdownSelectedOption, multiple))\n\n const [focusWithin, setFocusWithin] = useState<boolean>(false)\n\n const [menuOpenRequest, setMenuOpenRequest] = useState<boolean>(false)\n\n const menuOptions: (DropdownOption | DropdownOptionGroup)[] = loadOptions ? loadedOptions : filteredOptions\n const menuOptionsLoading = loadOptions ? (loading ?? optionsLoading) : loading\n\n const menuOpen = menuOpenRequest && !rootProps.disabled\n\n const inputRequired = required && dropdownSelectedOption.length === 0\n const inputActive = Boolean(menuOpen || inputText || focusWithin)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const [menuRef, setMenuRef] = useState<Nullable<HTMLElement>>(null)\n const menuListRef = useRef<HTMLUListElement>(null)\n const selectedOptionRef = useRef<HTMLElement>(null)\n const menuOpenPrevRef = useRef<boolean>(menuOpen)\n\n const updateInputText = useCallback(\n (inputTextValue: string) => {\n setInputText(inputTextValue)\n\n if (onChangeInput) {\n onChangeInput(inputTextValue)\n }\n },\n [onChangeInput]\n )\n\n const updateOptions = useCallback(\n (inputTextValue: string) => {\n if (loadOptions) {\n getLoadedOptions(inputTextValue)\n } else {\n getFilteredOptions(inputTextValue)\n }\n },\n [loadOptions, getLoadedOptions, getFilteredOptions]\n )\n\n const updateOptionsDebounced = useMemo(() => {\n return createDebouncedCallback(updateOptions, 150)\n }, [updateOptions])\n\n const preventBlur = (evt: React.PointerEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (\n evt.target !== inputRef.current &&\n evt.target instanceof Node &&\n (evt.currentTarget.contains(evt.target) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.target)))\n ) {\n evt.preventDefault()\n }\n }\n\n useScrollMonitor({\n target: scrollMonitorTarget,\n onScrollStart: () => {\n if (closeMenuOnScroll && menuOpen) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n },\n })\n\n useLayoutEffect(() => {\n if (selectedOption === undefined) return\n\n if (!multiple && !menuOpen) {\n updateInputText(getDropdownInputText(selectedOption))\n }\n setDropdownSelectedOption(getDropdownSelectedOption(selectedOption, multiple))\n }, [multiple, selectedOption, menuOpen, updateInputText])\n\n useEffect(() => {\n if (menuOpen === menuOpenPrevRef.current) return\n\n if (menuOpen && onOpenMenu) onOpenMenu()\n if (!menuOpen && onCloseMenu) onCloseMenu()\n\n menuOpenPrevRef.current = menuOpen\n }, [menuOpen, onCloseMenu, onOpenMenu])\n\n useEffect(() => {\n if (\n !multiple &&\n !disableAutoScrollToSelectedOption &&\n menuOpen &&\n !menuOptionsLoading &&\n inputText.length === 0 &&\n menuRef &&\n selectedOptionRef.current\n ) {\n const menuRect = menuRef.getBoundingClientRect()\n const selectedOptionRect = selectedOptionRef.current.getBoundingClientRect()\n\n if (selectedOptionRect.top < menuRect.top || selectedOptionRect.bottom > menuRect.bottom) {\n setTimeout(() => {\n if (menuRef && selectedOptionRef.current) {\n menuRef.scrollTo(0, selectedOptionRef.current.offsetTop)\n }\n }, 0)\n }\n }\n }, [multiple, disableAutoScrollToSelectedOption, menuOpen, menuOptionsLoading, inputText, menuRef])\n\n useEffect(() => {\n if (rootProps.disabled) {\n setFocusWithin(false)\n }\n }, [rootProps.disabled])\n\n return (\n <FormInputLabel\n {...rootProps}\n {...sizeProps}\n ref={ref}\n id={formInputLabelId}\n onColored={contrast}\n primary={primary}\n error={status === 'error'}\n success={status === 'success'}\n focus={focusWithin}\n palette={{\n color: rootProps.disabled ? palette.labelColorDisabled : palette.labelColor,\n backgroundColor: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColor,\n backgroundColorHover: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColorHover,\n borderColor: rootProps.disabled ? palette.borderColorDisabled : palette.borderColor,\n }}\n onClick={(evt) => {\n if (rootProps.onClick) rootProps.onClick(evt)\n\n if (rootProps.disabled) return\n\n inputRef.current?.focus()\n\n if (!menuOpen) {\n setMenuOpenRequest(true)\n\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n } else if (menuRef && evt.target instanceof Node && !menuRef.contains(evt.target)) {\n setMenuOpenRequest(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n }\n }}\n onPointerDown={(evt) => {\n if (rootProps.onPointerDown) rootProps.onPointerDown(evt)\n\n preventBlur(evt)\n }}\n onMouseDown={(evt) => {\n if (rootProps.onMouseDown) rootProps.onMouseDown(evt)\n\n if (!window.PointerEvent) preventBlur(evt)\n }}\n onFocus={(evt) => {\n if (rootProps.onFocus) rootProps.onFocus(evt)\n\n setFocusWithin(true)\n\n if (inputRef.current && evt.target === inputRef.current && searchable && !multiple && !menuOpen) {\n updateInputText('')\n }\n }}\n onBlur={(evt) => {\n if (rootProps.onBlur) rootProps.onBlur(evt)\n\n if (\n evt.currentTarget.contains(evt.relatedTarget) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.relatedTarget))\n ) {\n return\n }\n\n setFocusWithin(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }}\n input={\n <>\n {inputRequired && !searchable && !readOnly ? (\n <Styled.InputMimic\n required\n type='text'\n inputMode='none'\n form={form}\n tabIndex={-1}\n onFocus={() => {\n inputRef.current?.focus()\n }}\n />\n ) : null}\n <FormInput\n {...sizeProps}\n ref={inputRef}\n role='combobox'\n aria-controls={menuListId}\n aria-expanded={menuOpen}\n type='text'\n autoComplete='off'\n autoCapitalize='off'\n autoCorrect='off'\n spellCheck='false'\n active={inputActive}\n label={label}\n labelId={inputLabelId}\n labelPosition={labelPosition}\n form={form}\n autoFocus={autoFocus}\n inputMode={searchable ? inputMode : 'none'}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly || !searchable}\n required={inputRequired}\n disabled={rootProps.disabled}\n value={inputText}\n palette={{\n color: palette.color,\n colorDisabled: palette.colorDisabled,\n placeholderColor: palette.placeholderColor,\n placeholderColorDisabled: palette.placeholderColorDisabled,\n }}\n onClick={(evt) => {\n if (menuOpen && evt.currentTarget.selectionStart !== evt.currentTarget.selectionEnd) {\n evt.stopPropagation()\n }\n }}\n onChange={(evt) => {\n const inputValue = evt.currentTarget.value\n\n updateInputText(inputValue)\n updateOptionsDebounced(inputValue)\n setMenuOpenRequest(true)\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Enter.validate(evt.key)) {\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Space.validate(evt.key) && (!menuOpen || evt.currentTarget.selectionStart === 0)) {\n evt.preventDefault()\n\n if (!menuOpen) {\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n }\n\n setMenuOpenRequest((prev) => !prev)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Tab.validate(evt.key) && menuOpen) {\n evt.preventDefault()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.ArrowDown.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx + 1] ?? menuItems[0]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusFirstFocusable(menuListRef.current)\n }\n }\n\n if (keyboardKeys.ArrowUp.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx - 1] ?? menuItems[menuItems.length - 1]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusLastFocusable(menuListRef.current)\n }\n }\n }}\n />\n {dropdownSelectedOption.map((option) => (\n <input\n key={option.value}\n type='hidden'\n name={name}\n value={option.value}\n form={form}\n disabled={rootProps.disabled || option.disabled}\n />\n ))}\n </>\n }\n addonLeft={\n icon ? (\n <Icon\n name={typeof icon === 'string' ? icon : undefined}\n icon={typeof icon !== 'string' ? icon : undefined}\n {...iconBaseProps}\n />\n ) : addonLeft ? (\n <Slot props={{ iconProps: iconBaseProps }}>{addonLeft}</Slot>\n ) : null\n }\n addonRight={\n <>\n {multiple && dropdownSelectedOption.length > 0 ? (\n <Chip\n size='xs'\n active\n black\n disabled={rootProps.disabled}\n cursor={rootProps.disabled ? 'not-allowed' : undefined}\n text={dropdownSelectedOption.length}\n textProps={{\n appearance: 'caption',\n size: 'xs',\n }}\n palette={\n rootProps.disabled\n ? {\n color: 'content-disabled',\n colorHover: 'content-disabled',\n backgroundColor: 'bg-disabled-small',\n backgroundColorHover: 'bg-disabled-small',\n }\n : undefined\n }\n onPointerDown={(evt) => {\n evt.preventDefault()\n }}\n onMouseDown={(evt) => {\n if (!window.PointerEvent) evt.preventDefault()\n }}\n discardButtonProps={{\n square: true,\n contrast: !rootProps.disabled,\n onClick: (evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption([])\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n },\n }}\n />\n ) : null}\n {!multiple && clearable && dropdownSelectedOption.length > 0 ? (\n <IconButton\n icon={<Close />}\n size='l'\n square\n disabled={rootProps.disabled}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(null)\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n }}\n />\n ) : null}\n <Styled.IconAnimated icon={<ChevronDown />} up={menuOpen} {...iconBaseProps} />\n </>\n }\n dropdown={\n <DropdownMenu\n {...menuProps}\n setRef={setMenuRef}\n open={menuOpen}\n popperReferenceId={formInputLabelId}\n secondary={!contrast}\n elevated={contrast}\n disableAutoFocus\n palette={{\n backgroundColor: palette.menuBackgroundColor,\n borderColor: palette.menuBorderColor,\n }}\n empty={menuOptions.length === 0}\n loading={menuOptionsLoading}\n loadingMessage={loadingMessage}\n loadingIcon={loadingIcon}\n loadingIconProps={{\n ...iconBaseProps,\n ...loadingIconProps,\n }}\n emptyMessage={optionsEmptyMessage}\n emptyIcon={optionsEmptyIcon}\n emptyIconProps={{\n ...iconBaseProps,\n ...optionsEmptyIconProps,\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Tab.validate(evt.key)) {\n evt.preventDefault()\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Enter.validate(evt.key)) {\n inputRef.current?.focus()\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Backspace.validate(evt.key) && !readOnly && (multiple || (!multiple && clearable))) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(multiple ? [] : null)\n\n updateInputText('')\n updateOptions('')\n }\n }}\n >\n {multiple ? (\n <DropdownMenuMultiple\n {...sizeProps}\n ref={menuListRef}\n inputRef={inputRef}\n label={label}\n name={name}\n disabled={rootProps.disabled}\n readOnly={readOnly}\n menuListId={menuListId}\n inputLabelId={inputLabelId}\n menuOptions={menuOptions}\n dropdownSelectedOption={dropdownSelectedOption}\n inputText={inputText}\n optionsMultiToggle={optionsMultiToggle}\n groupSelectedOptions={groupSelectedOptions}\n optionsMultiToggleCaption={optionsMultiToggleCaption}\n renderOption={renderOption}\n onChange={(update) => {\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }}\n />\n ) : (\n <DropdownMenuSingle\n {...sizeProps}\n ref={menuListRef}\n label={label}\n readOnly={readOnly}\n multiple={multiple}\n disabled={rootProps.disabled}\n status={status}\n menuListId={menuListId}\n inputLabelId={inputLabelId}\n menuOptions={menuOptions}\n dropdownSelectedOption={dropdownSelectedOption}\n selectedOptionRef={selectedOptionRef}\n renderOption={renderOption}\n onChange={(option) => {\n const update = { ...option }\n\n if (selectedOption === undefined) {\n updateInputText(getDropdownInputText(update))\n setDropdownSelectedOption(getDropdownSelectedOption(update))\n }\n\n if (onSelectOption) onSelectOption(update)\n\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }}\n />\n )}\n </DropdownMenu>\n }\n />\n )\n }),\n {\n sizes: SIZES,\n displayName: COMPONENT_NAME,\n }\n)\n\nexport { Dropdown, COMPONENT_NAME }\n"],"names":["Dropdown","withMergedProps","forwardRef","props","ref","size","name","labelPosition","searchable","primary","optionsMultiToggle","iconProps","menuProps","loadingIconProps","optionsEmptyIconProps","loading","autoFocus","disableAutoScrollToSelectedOption","closeMenuOnScroll","scrollMonitorTarget","contrast","selectedOption","defaultSelectedOption","icon","addonLeft","inputMode","loadingMessage","loadingIcon","maxLength","multiple","clearable","onChangeInput","onCloseMenu","onOpenMenu","onSelectOption","options","loadOptions","renderOption","groupSelectedOptions","optionsMultiToggleCaption","optionsEmptyMessage","optionsEmptyIcon","palette","placeholder","readOnly","required","status","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","form","label","rootProps","sizeProps","iconBaseProps","sizes","SIZES_ICON","color","disabled","formInputLabelId","useMemo","id","nanoid","inputLabelId","menuListId","filteredOptions","getFilteredOptions","useFilteredOptions","loadedOptions","optionsLoading","getLoadedOptions","useLoadedOptions","dropdownSelectedOption","setDropdownSelectedOption","useState","getDropdownSelectedOption","undefined","inputText","setInputText","getDropdownInputText","focusWithin","setFocusWithin","menuOpenRequest","setMenuOpenRequest","menuOptions","menuOptionsLoading","menuOpen","inputRequired","length","inputActive","Boolean","inputRef","useRef","menuRef","setMenuRef","menuListRef","selectedOptionRef","menuOpenPrevRef","updateInputText","useCallback","inputTextValue","updateOptions","updateOptionsDebounced","createDebouncedCallback","preventBlur","evt","target","current","Node","currentTarget","contains","renderInPortal","preventDefault","useScrollMonitor","onScrollStart","focus","useLayoutEffect","useEffect","menuRect","getBoundingClientRect","selectedOptionRect","top","bottom","setTimeout","scrollTo","offsetTop","_jsx","FormInputLabel","onColored","error","success","labelColorDisabled","labelColor","backgroundColor","backgroundColorDisabled","backgroundColorHover","borderColor","borderColorDisabled","onClick","onPointerDown","onMouseDown","window","PointerEvent","onFocus","onBlur","relatedTarget","input","_jsxs","_Fragment","children","Styled","type","tabIndex","FormInput","role","autoComplete","autoCapitalize","autoCorrect","spellCheck","active","labelId","value","colorDisabled","placeholderColor","placeholderColorDisabled","selectionStart","selectionEnd","stopPropagation","onChange","inputValue","onKeyDown","keyboardKeys","Enter","validate","key","Space","prev","Esc","Tab","ArrowDown","menuItems","idx","findIndex","item","focusTarget","HTMLElement","focusFirstFocusable","ArrowUp","focusLastFocusable","map","option","Icon","Slot","addonRight","Chip","black","cursor","text","textProps","appearance","colorHover","discardButtonProps","square","IconButton","Close","ChevronDown","up","dropdown","DropdownMenu","setRef","open","popperReferenceId","secondary","elevated","disableAutoFocus","menuBackgroundColor","menuBorderColor","empty","emptyMessage","emptyIcon","emptyIconProps","Backspace","DropdownMenuMultiple","update","DropdownMenuSingle","SIZES","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react'\nimport { nanoid } from 'nanoid'\nimport { ChevronDown, Close } from '@foxford/icon-pack'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { useScrollMonitor } from 'hooks/useScrollMonitor'\nimport { focusFirstFocusable, focusLastFocusable } from 'shared/utils/dom'\nimport { createDebouncedCallback } from 'shared/utils/misc'\nimport { keyboardKeys } from 'shared/constants'\nimport type { Nullable } from 'shared/types'\nimport { FormInput } from 'components/FormInput'\nimport { FormInputLabel } from 'components/FormInputLabel'\nimport { Chip } from 'components/Chip'\nimport { IconButton } from 'components/IconButton'\nimport { Icon } from 'components/Icon'\nimport type { IconProps } from 'components/Icon'\nimport { Slot } from 'components/Slot'\nimport { DropdownMenu } from './DropdownMenu'\nimport { useFilteredOptions, useLoadedOptions } from './hooks'\nimport { SIZES, SIZES_ICON } from './sizes'\nimport { getDropdownInputText, getDropdownSelectedOption } from './utils'\nimport * as Styled from './style'\nimport type { DropdownProps, DropdownOption, DropdownOptionGroup } from './types'\nimport { DropdownMenuMultiple } from './DropdownMenuMultiple'\nimport { DropdownMenuSingle } from './DropdownMenuSingle'\n\nconst COMPONENT_NAME = 'Dropdown'\n\n/**\n *\n * Компонент для выбора одной или нескольких опций из числа доступных.\n *\n * Поддерживается \"ref\" и все нативные атрибуты \\<div\\> элемента.\n */\nconst Dropdown: React.ForwardRefExoticComponent<DropdownProps> = withMergedProps<DropdownProps, HTMLDivElement>(\n forwardRef<HTMLDivElement, MergedProps<DropdownProps>>((props, ref) => {\n const {\n size = 'm',\n name = 'fox-dropdown',\n labelPosition = 'dynamic',\n searchable = true,\n primary = true,\n optionsMultiToggle = true,\n iconProps = {},\n menuProps = {},\n loadingIconProps = {},\n optionsEmptyIconProps = {},\n loading,\n autoFocus,\n disableAutoScrollToSelectedOption,\n closeMenuOnScroll,\n scrollMonitorTarget,\n contrast,\n selectedOption,\n defaultSelectedOption,\n icon,\n addonLeft,\n inputMode,\n loadingMessage,\n loadingIcon,\n maxLength,\n multiple,\n clearable,\n onChangeInput,\n onCloseMenu,\n onOpenMenu,\n onSelectOption,\n options,\n loadOptions,\n renderOption,\n groupSelectedOptions,\n optionsMultiToggleCaption,\n optionsEmptyMessage,\n optionsEmptyIcon,\n palette,\n placeholder,\n readOnly,\n required,\n status,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n form,\n label,\n ...rootProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconBaseProps: IconProps = {\n ...sizeProps,\n ...iconProps,\n sizes: SIZES_ICON,\n color: rootProps.disabled ? 'content-disabled' : 'content-onmain-tertiary',\n }\n\n const formInputLabelId = useMemo(() => rootProps.id ?? `${name}-${nanoid()}`, [name, rootProps.id])\n const inputLabelId = useMemo(() => nanoid(), [])\n const menuListId = useMemo(() => nanoid(), [])\n\n const [filteredOptions, getFilteredOptions] = useFilteredOptions({\n options,\n })\n\n const [loadedOptions, optionsLoading, getLoadedOptions] = useLoadedOptions({\n loadOptions,\n options,\n })\n\n const [dropdownSelectedOption, setDropdownSelectedOption] = useState<DropdownOption[]>(() =>\n getDropdownSelectedOption(selectedOption !== undefined ? selectedOption : defaultSelectedOption, multiple)\n )\n\n const [inputText, setInputText] = useState<string>(() => getDropdownInputText(dropdownSelectedOption, multiple))\n\n const [focusWithin, setFocusWithin] = useState<boolean>(false)\n\n const [menuOpenRequest, setMenuOpenRequest] = useState<boolean>(false)\n\n const menuOptions: (DropdownOption | DropdownOptionGroup)[] = loadOptions ? loadedOptions : filteredOptions\n const menuOptionsLoading = loadOptions ? (loading ?? optionsLoading) : loading\n\n const menuOpen = menuOpenRequest && !rootProps.disabled\n\n const inputRequired = required && dropdownSelectedOption.length === 0\n const inputActive = Boolean(menuOpen || inputText || focusWithin)\n\n const inputRef = useRef<HTMLInputElement>(null)\n const [menuRef, setMenuRef] = useState<Nullable<HTMLElement>>(null)\n const menuListRef = useRef<HTMLUListElement>(null)\n const selectedOptionRef = useRef<HTMLElement>(null)\n const menuOpenPrevRef = useRef<boolean>(menuOpen)\n\n const updateInputText = useCallback(\n (inputTextValue: string) => {\n setInputText(inputTextValue)\n\n if (onChangeInput) {\n onChangeInput(inputTextValue)\n }\n },\n [onChangeInput]\n )\n\n const updateOptions = useCallback(\n (inputTextValue: string) => {\n if (loadOptions) {\n getLoadedOptions(inputTextValue)\n } else {\n getFilteredOptions(inputTextValue)\n }\n },\n [loadOptions, getLoadedOptions, getFilteredOptions]\n )\n\n const updateOptionsDebounced = useMemo(() => {\n return createDebouncedCallback(updateOptions, 150)\n }, [updateOptions])\n\n const preventBlur = (evt: React.PointerEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (\n evt.target !== inputRef.current &&\n evt.target instanceof Node &&\n (evt.currentTarget.contains(evt.target) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.target)))\n ) {\n evt.preventDefault()\n }\n }\n\n useScrollMonitor({\n target: scrollMonitorTarget,\n onScrollStart: () => {\n if (closeMenuOnScroll && menuOpen) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n },\n })\n\n useLayoutEffect(() => {\n if (selectedOption === undefined) return\n\n if (!multiple && !menuOpen) {\n updateInputText(getDropdownInputText(selectedOption))\n }\n setDropdownSelectedOption(getDropdownSelectedOption(selectedOption, multiple))\n }, [multiple, selectedOption, menuOpen, updateInputText])\n\n useEffect(() => {\n if (menuOpen === menuOpenPrevRef.current) return\n\n if (menuOpen && onOpenMenu) onOpenMenu()\n if (!menuOpen && onCloseMenu) onCloseMenu()\n\n menuOpenPrevRef.current = menuOpen\n }, [menuOpen, onCloseMenu, onOpenMenu])\n\n useEffect(() => {\n if (\n !multiple &&\n !disableAutoScrollToSelectedOption &&\n menuOpen &&\n !menuOptionsLoading &&\n inputText.length === 0 &&\n menuRef &&\n selectedOptionRef.current\n ) {\n const menuRect = menuRef.getBoundingClientRect()\n const selectedOptionRect = selectedOptionRef.current.getBoundingClientRect()\n\n if (selectedOptionRect.top < menuRect.top || selectedOptionRect.bottom > menuRect.bottom) {\n setTimeout(() => {\n if (menuRef && selectedOptionRef.current) {\n menuRef.scrollTo(0, selectedOptionRef.current.offsetTop)\n }\n }, 0)\n }\n }\n }, [multiple, disableAutoScrollToSelectedOption, menuOpen, menuOptionsLoading, inputText, menuRef])\n\n useEffect(() => {\n if (rootProps.disabled) {\n setFocusWithin(false)\n }\n }, [rootProps.disabled])\n\n return (\n <FormInputLabel\n {...rootProps}\n {...sizeProps}\n ref={ref}\n id={formInputLabelId}\n onColored={contrast}\n primary={primary}\n error={status === 'error'}\n success={status === 'success'}\n focus={focusWithin}\n palette={{\n color: rootProps.disabled ? palette.labelColorDisabled : palette.labelColor,\n backgroundColor: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColor,\n backgroundColorHover: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColorHover,\n borderColor: rootProps.disabled ? palette.borderColorDisabled : palette.borderColor,\n }}\n onClick={(evt) => {\n if (rootProps.onClick) rootProps.onClick(evt)\n\n if (rootProps.disabled) return\n\n inputRef.current?.focus()\n\n if (!menuOpen) {\n setMenuOpenRequest(true)\n\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n } else if (menuRef && evt.target instanceof Node && !menuRef.contains(evt.target)) {\n setMenuOpenRequest(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n }\n }}\n onPointerDown={(evt) => {\n if (rootProps.onPointerDown) rootProps.onPointerDown(evt)\n\n preventBlur(evt)\n }}\n onMouseDown={(evt) => {\n if (rootProps.onMouseDown) rootProps.onMouseDown(evt)\n\n if (!window.PointerEvent) preventBlur(evt)\n }}\n onFocus={(evt) => {\n if (rootProps.onFocus) rootProps.onFocus(evt)\n\n setFocusWithin(true)\n\n if (inputRef.current && evt.target === inputRef.current && searchable && !multiple && !menuOpen) {\n updateInputText('')\n }\n }}\n onBlur={(evt) => {\n if (rootProps.onBlur) rootProps.onBlur(evt)\n\n if (\n evt.currentTarget.contains(evt.relatedTarget) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.relatedTarget))\n ) {\n return\n }\n\n setFocusWithin(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }}\n input={\n <>\n {inputRequired && !searchable && !readOnly ? (\n <Styled.InputMimic\n required\n type='text'\n inputMode='none'\n form={form}\n tabIndex={-1}\n onFocus={() => {\n inputRef.current?.focus()\n }}\n />\n ) : null}\n <FormInput\n {...sizeProps}\n ref={inputRef}\n role='combobox'\n aria-controls={menuListId}\n aria-expanded={menuOpen}\n type='text'\n autoComplete='off'\n autoCapitalize='off'\n autoCorrect='off'\n spellCheck='false'\n active={inputActive}\n label={label}\n labelId={inputLabelId}\n labelPosition={labelPosition}\n form={form}\n autoFocus={autoFocus}\n inputMode={searchable ? inputMode : 'none'}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly || !searchable}\n required={inputRequired}\n disabled={rootProps.disabled}\n value={inputText}\n palette={{\n color: palette.color,\n colorDisabled: palette.colorDisabled,\n placeholderColor: palette.placeholderColor,\n placeholderColorDisabled: palette.placeholderColorDisabled,\n }}\n onClick={(evt) => {\n if (menuOpen && evt.currentTarget.selectionStart !== evt.currentTarget.selectionEnd) {\n evt.stopPropagation()\n }\n }}\n onChange={(evt) => {\n const inputValue = evt.currentTarget.value\n\n updateInputText(inputValue)\n updateOptionsDebounced(inputValue)\n setMenuOpenRequest(true)\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Enter.validate(evt.key)) {\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Space.validate(evt.key) && (!menuOpen || evt.currentTarget.selectionStart === 0)) {\n evt.preventDefault()\n\n if (!menuOpen) {\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n }\n\n setMenuOpenRequest((prev) => !prev)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Tab.validate(evt.key) && menuOpen) {\n evt.preventDefault()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.ArrowDown.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx + 1] ?? menuItems[0]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusFirstFocusable(menuListRef.current)\n }\n }\n\n if (keyboardKeys.ArrowUp.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx - 1] ?? menuItems[menuItems.length - 1]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusLastFocusable(menuListRef.current)\n }\n }\n }}\n />\n {dropdownSelectedOption.map((option) => (\n <input\n key={option.value}\n type='hidden'\n name={name}\n value={option.value}\n form={form}\n disabled={rootProps.disabled || option.disabled}\n />\n ))}\n </>\n }\n addonLeft={\n icon ? (\n <Icon\n name={typeof icon === 'string' ? icon : undefined}\n icon={typeof icon !== 'string' ? icon : undefined}\n {...iconBaseProps}\n />\n ) : addonLeft ? (\n <Slot render={addonLeft} props={{ iconProps: iconBaseProps }} />\n ) : null\n }\n addonRight={\n <>\n {multiple && dropdownSelectedOption.length > 0 ? (\n <Chip\n size='xs'\n active\n black\n disabled={rootProps.disabled}\n cursor={rootProps.disabled ? 'not-allowed' : undefined}\n text={dropdownSelectedOption.length}\n textProps={{\n appearance: 'caption',\n size: 'xs',\n }}\n palette={\n rootProps.disabled\n ? {\n color: 'content-disabled',\n colorHover: 'content-disabled',\n backgroundColor: 'bg-disabled-small',\n backgroundColorHover: 'bg-disabled-small',\n }\n : undefined\n }\n onPointerDown={(evt) => {\n evt.preventDefault()\n }}\n onMouseDown={(evt) => {\n if (!window.PointerEvent) evt.preventDefault()\n }}\n discardButtonProps={{\n square: true,\n contrast: !rootProps.disabled,\n onClick: (evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption([])\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n },\n }}\n />\n ) : null}\n {!multiple && clearable && dropdownSelectedOption.length > 0 ? (\n <IconButton\n icon={<Close />}\n size='l'\n square\n disabled={rootProps.disabled}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(null)\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n }}\n />\n ) : null}\n <Styled.IconAnimated icon={<ChevronDown />} up={menuOpen} {...iconBaseProps} />\n </>\n }\n dropdown={\n <DropdownMenu\n {...menuProps}\n setRef={setMenuRef}\n open={menuOpen}\n popperReferenceId={formInputLabelId}\n secondary={!contrast}\n elevated={contrast}\n disableAutoFocus\n palette={{\n backgroundColor: palette.menuBackgroundColor,\n borderColor: palette.menuBorderColor,\n }}\n empty={menuOptions.length === 0}\n loading={menuOptionsLoading}\n loadingMessage={loadingMessage}\n loadingIcon={loadingIcon}\n loadingIconProps={{\n ...iconBaseProps,\n ...loadingIconProps,\n }}\n emptyMessage={optionsEmptyMessage}\n emptyIcon={optionsEmptyIcon}\n emptyIconProps={{\n ...iconBaseProps,\n ...optionsEmptyIconProps,\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Tab.validate(evt.key)) {\n evt.preventDefault()\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Enter.validate(evt.key)) {\n inputRef.current?.focus()\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Backspace.validate(evt.key) && !readOnly && (multiple || (!multiple && clearable))) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(multiple ? [] : null)\n\n updateInputText('')\n updateOptions('')\n }\n }}\n >\n {multiple ? (\n <DropdownMenuMultiple\n {...sizeProps}\n ref={menuListRef}\n inputRef={inputRef}\n label={label}\n name={name}\n disabled={rootProps.disabled}\n readOnly={readOnly}\n menuListId={menuListId}\n inputLabelId={inputLabelId}\n menuOptions={menuOptions}\n dropdownSelectedOption={dropdownSelectedOption}\n inputText={inputText}\n optionsMultiToggle={optionsMultiToggle}\n groupSelectedOptions={groupSelectedOptions}\n optionsMultiToggleCaption={optionsMultiToggleCaption}\n renderOption={renderOption}\n onChange={(update) => {\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }}\n />\n ) : (\n <DropdownMenuSingle\n {...sizeProps}\n ref={menuListRef}\n label={label}\n readOnly={readOnly}\n multiple={multiple}\n disabled={rootProps.disabled}\n status={status}\n menuListId={menuListId}\n inputLabelId={inputLabelId}\n menuOptions={menuOptions}\n dropdownSelectedOption={dropdownSelectedOption}\n selectedOptionRef={selectedOptionRef}\n renderOption={renderOption}\n onChange={(option) => {\n const update = { ...option }\n\n if (selectedOption === undefined) {\n updateInputText(getDropdownInputText(update))\n setDropdownSelectedOption(getDropdownSelectedOption(update))\n }\n\n if (onSelectOption) onSelectOption(update)\n\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }}\n />\n )}\n </DropdownMenu>\n }\n />\n )\n }),\n {\n sizes: SIZES,\n displayName: COMPONENT_NAME,\n }\n)\n\nexport { Dropdown, COMPONENT_NAME }\n"],"names":["Dropdown","withMergedProps","forwardRef","props","ref","size","name","labelPosition","searchable","primary","optionsMultiToggle","iconProps","menuProps","loadingIconProps","optionsEmptyIconProps","loading","autoFocus","disableAutoScrollToSelectedOption","closeMenuOnScroll","scrollMonitorTarget","contrast","selectedOption","defaultSelectedOption","icon","addonLeft","inputMode","loadingMessage","loadingIcon","maxLength","multiple","clearable","onChangeInput","onCloseMenu","onOpenMenu","onSelectOption","options","loadOptions","renderOption","groupSelectedOptions","optionsMultiToggleCaption","optionsEmptyMessage","optionsEmptyIcon","palette","placeholder","readOnly","required","status","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","form","label","rootProps","sizeProps","iconBaseProps","sizes","SIZES_ICON","color","disabled","formInputLabelId","useMemo","id","nanoid","inputLabelId","menuListId","filteredOptions","getFilteredOptions","useFilteredOptions","loadedOptions","optionsLoading","getLoadedOptions","useLoadedOptions","dropdownSelectedOption","setDropdownSelectedOption","useState","getDropdownSelectedOption","undefined","inputText","setInputText","getDropdownInputText","focusWithin","setFocusWithin","menuOpenRequest","setMenuOpenRequest","menuOptions","menuOptionsLoading","menuOpen","inputRequired","length","inputActive","Boolean","inputRef","useRef","menuRef","setMenuRef","menuListRef","selectedOptionRef","menuOpenPrevRef","updateInputText","useCallback","inputTextValue","updateOptions","updateOptionsDebounced","createDebouncedCallback","preventBlur","evt","target","current","Node","currentTarget","contains","renderInPortal","preventDefault","useScrollMonitor","onScrollStart","focus","useLayoutEffect","useEffect","menuRect","getBoundingClientRect","selectedOptionRect","top","bottom","setTimeout","scrollTo","offsetTop","_jsx","FormInputLabel","onColored","error","success","labelColorDisabled","labelColor","backgroundColor","backgroundColorDisabled","backgroundColorHover","borderColor","borderColorDisabled","onClick","onPointerDown","onMouseDown","window","PointerEvent","onFocus","onBlur","relatedTarget","input","_jsxs","_Fragment","children","Styled","type","tabIndex","FormInput","role","autoComplete","autoCapitalize","autoCorrect","spellCheck","active","labelId","value","colorDisabled","placeholderColor","placeholderColorDisabled","selectionStart","selectionEnd","stopPropagation","onChange","inputValue","onKeyDown","keyboardKeys","Enter","validate","key","Space","prev","Esc","Tab","ArrowDown","menuItems","idx","findIndex","item","focusTarget","HTMLElement","focusFirstFocusable","ArrowUp","focusLastFocusable","map","option","Icon","Slot","render","addonRight","Chip","black","cursor","text","textProps","appearance","colorHover","discardButtonProps","square","IconButton","Close","ChevronDown","up","dropdown","DropdownMenu","setRef","open","popperReferenceId","secondary","elevated","disableAutoFocus","menuBackgroundColor","menuBorderColor","empty","emptyMessage","emptyIcon","emptyIconProps","Backspace","DropdownMenuMultiple","update","DropdownMenuSingle","SIZES","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{forwardRef,useMemo,useState,useRef,useCallback,useLayoutEffect,useEffect}from'react';import{nanoid}from'nanoid';import{withMergedProps}from'../../hocs/withMergedProps.mjs';import{useScrollMonitor}from'../../hooks/useScrollMonitor.mjs';import{focusFirstFocusable,focusLastFocusable}from'../../shared/utils/dom.mjs';import{createDebouncedCallback}from'../../shared/utils/misc.mjs';import{keyboardKeys}from'../../shared/constants.mjs';import{DropdownMenu}from'./DropdownMenu.mjs';import{useFilteredOptions,useLoadedOptions}from'./hooks.mjs';import{SIZES,SIZES_ICON}from'./sizes.mjs';import{getDropdownSelectedOption,getDropdownInputText}from'./utils.mjs';import{IconAnimated,InputMimic}from'./style.mjs';import{DropdownMenuMultiple}from'./DropdownMenuMultiple.mjs';import{DropdownMenuSingle}from'./DropdownMenuSingle.mjs';import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{FormInputLabel}from'../FormInputLabel/FormInputLabel.mjs';import{Chip}from'../Chip/Chip.mjs';import{IconButton}from'../IconButton/IconButton.mjs';import{Close}from'../../icon-pack/src/icons/Close/index.mjs';import{ChevronDown}from'../../icon-pack/src/icons/ChevronDown/index.mjs';import{Icon}from'../Icon/Icon.mjs';import{Slot}from'../Slot/Slot.mjs';import{FormInput}from'../FormInput/FormInput.mjs';const COMPONENT_NAME='Dropdown';const Dropdown=withMergedProps(forwardRef((e,o)=>{const{size:t="m",name:n="fox-dropdown",labelPosition:r="dynamic",searchable:s=!0,primary:l=!0,optionsMultiToggle:a=!0,iconProps:i={},menuProps:d={},loadingIconProps:c={},optionsEmptyIconProps:u={},loading:p,autoFocus:m,disableAutoScrollToSelectedOption:f,closeMenuOnScroll:b,scrollMonitorTarget:g,contrast:C,selectedOption:y,defaultSelectedOption:D,icon:w,addonLeft:I,inputMode:M,loadingMessage:k,loadingIcon:S,maxLength:v,multiple:
|
|
1
|
+
import{forwardRef,useMemo,useState,useRef,useCallback,useLayoutEffect,useEffect}from'react';import{nanoid}from'nanoid';import{withMergedProps}from'../../hocs/withMergedProps.mjs';import{useScrollMonitor}from'../../hooks/useScrollMonitor.mjs';import{focusFirstFocusable,focusLastFocusable}from'../../shared/utils/dom.mjs';import{createDebouncedCallback}from'../../shared/utils/misc.mjs';import{keyboardKeys}from'../../shared/constants.mjs';import{DropdownMenu}from'./DropdownMenu.mjs';import{useFilteredOptions,useLoadedOptions}from'./hooks.mjs';import{SIZES,SIZES_ICON}from'./sizes.mjs';import{getDropdownSelectedOption,getDropdownInputText}from'./utils.mjs';import{IconAnimated,InputMimic}from'./style.mjs';import{DropdownMenuMultiple}from'./DropdownMenuMultiple.mjs';import{DropdownMenuSingle}from'./DropdownMenuSingle.mjs';import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{FormInputLabel}from'../FormInputLabel/FormInputLabel.mjs';import{Chip}from'../Chip/Chip.mjs';import{IconButton}from'../IconButton/IconButton.mjs';import{Close}from'../../icon-pack/src/icons/Close/index.mjs';import{ChevronDown}from'../../icon-pack/src/icons/ChevronDown/index.mjs';import{Icon}from'../Icon/Icon.mjs';import{Slot}from'../Slot/Slot.mjs';import{FormInput}from'../FormInput/FormInput.mjs';const COMPONENT_NAME='Dropdown';const Dropdown=withMergedProps(forwardRef((e,o)=>{const{size:t="m",name:n="fox-dropdown",labelPosition:r="dynamic",searchable:s=!0,primary:l=!0,optionsMultiToggle:a=!0,iconProps:i={},menuProps:d={},loadingIconProps:c={},optionsEmptyIconProps:u={},loading:p,autoFocus:m,disableAutoScrollToSelectedOption:f,closeMenuOnScroll:b,scrollMonitorTarget:g,contrast:C,selectedOption:y,defaultSelectedOption:D,icon:w,addonLeft:I,inputMode:M,loadingMessage:k,loadingIcon:S,maxLength:v,multiple:x,clearable:h,onChangeInput:j,onCloseMenu:O,onOpenMenu:T,onSelectOption:F,options:P,loadOptions:E,renderOption:L,groupSelectedOptions:z,optionsMultiToggleCaption:B,optionsEmptyMessage:R,optionsEmptyIcon:K,palette:N,placeholder:A,readOnly:X,required:H,status:q,sizeXXS:Z,sizeXS:_,sizeS:$,sizeM:U,sizeL:G,sizeXL:J,form:Q,label:V,...W}=e;const Y={size:t,sizeXXS:Z,sizeXS:_,sizeS:$,sizeM:U,sizeL:G,sizeXL:J};const ee={...Y,...i,sizes:SIZES_ICON,color:W.disabled?'content-disabled':'content-onmain-tertiary'};const oe=useMemo(()=>W.id??`${n}-${nanoid()}`,[n,W.id]);const te=useMemo(()=>nanoid(),[]);const ne=useMemo(()=>nanoid(),[]);const[re,se]=useFilteredOptions({options:P});const[le,ae,ie]=useLoadedOptions({loadOptions:E,options:P});const[de,ce]=useState(()=>getDropdownSelectedOption(y!==void 0?y:D,x));const[ue,pe]=useState(()=>getDropdownInputText(de,x));const[me,fe]=useState(!1);const[be,ge]=useState(!1);const Ce=E?le:re;const ye=E?p??ae:p;const De=be&&!W.disabled;const we=H&&de.length===0;const Ie=Boolean(De||ue||me);const Me=useRef(null);const[ke,Se]=useState(null);const ve=useRef(null);const xe=useRef(null);const he=useRef(De);const je=useCallback(e=>{pe(e),j&&j(e)},[j]);const Oe=useCallback(e=>{E?ie(e):se(e)},[E,ie,se]);const Te=useMemo(()=>createDebouncedCallback(Oe,150),[Oe]);const preventBlur=e=>{e.target!==Me.current&&e.target instanceof Node&&(e.currentTarget.contains(e.target)||d.renderInPortal&&De&&ke&&ke.contains(e.target))&&e.preventDefault()};return useScrollMonitor({target:g,onScrollStart:()=>{b&&De&&(Me.current?.focus(),ge(!1))}}),useLayoutEffect(()=>{y!==void 0&&(x||De||je(getDropdownInputText(y)),ce(getDropdownSelectedOption(y,x)))},[x,y,De,je]),useEffect(()=>{De!==he.current&&(De&&T&&T(),!De&&O&&O(),he.current=De)},[De,O,T]),useEffect(()=>{if(!x&&!f&&De&&!ye&&ue.length===0&&ke&&xe.current){const e=ke.getBoundingClientRect();const o=xe.current.getBoundingClientRect();(o.top<e.top||o.bottom>e.bottom)&&setTimeout(()=>{ke&&xe.current&&ke.scrollTo(0,xe.current.offsetTop)},0)}},[x,f,De,ye,ue,ke]),useEffect(()=>{W.disabled&&fe(!1)},[W.disabled]),jsx(FormInputLabel,{...W,...Y,ref:o,id:oe,onColored:C,primary:l,error:q==='error',success:q==='success',focus:me,palette:{color:W.disabled?N.labelColorDisabled:N.labelColor,backgroundColor:W.disabled?N.backgroundColorDisabled:N.backgroundColor,backgroundColorHover:W.disabled?N.backgroundColorDisabled:N.backgroundColorHover,borderColor:W.disabled?N.borderColorDisabled:N.borderColor},onClick:e=>{W.onClick&&W.onClick(e),W.disabled||(Me.current?.focus(),De?ke&&e.target instanceof Node&&!ke.contains(e.target)&&(ge(!1),je(getDropdownInputText(de,x))):(ge(!0),Oe(''),s&&je('')))},onPointerDown:e=>{W.onPointerDown&&W.onPointerDown(e),preventBlur(e)},onMouseDown:e=>{W.onMouseDown&&W.onMouseDown(e),window.PointerEvent||preventBlur(e)},onFocus:e=>{W.onFocus&&W.onFocus(e),fe(!0),Me.current&&e.target===Me.current&&s&&!x&&!De&&je('')},onBlur:e=>{W.onBlur&&W.onBlur(e),e.currentTarget.contains(e.relatedTarget)||d.renderInPortal&&De&&ke&&ke.contains(e.relatedTarget)||(fe(!1),je(getDropdownInputText(de,x)),ge(!1))},input:jsxs(Fragment,{children:[!we||s||X?null:jsx(InputMimic,{required:!0,type:"text",inputMode:"none",form:Q,tabIndex:-1,onFocus:()=>{Me.current?.focus()}}),jsx(FormInput,{...Y,ref:Me,role:"combobox","aria-controls":ne,"aria-expanded":De,type:"text",autoComplete:"off",autoCapitalize:"off",autoCorrect:"off",spellCheck:"false",active:Ie,label:V,labelId:te,labelPosition:r,form:Q,autoFocus:m,inputMode:s?M:'none',maxLength:v,placeholder:A,readOnly:X||!s,required:we,disabled:W.disabled,value:ue,palette:{color:N.color,colorDisabled:N.colorDisabled,placeholderColor:N.placeholderColor,placeholderColorDisabled:N.placeholderColorDisabled},onClick:e=>{De&&e.currentTarget.selectionStart!==e.currentTarget.selectionEnd&&e.stopPropagation()},onChange:e=>{const o=e.currentTarget.value;je(o),Te(o),ge(!0)},onKeyDown:e=>{if(keyboardKeys.Enter.validate(e.key)&&(je(getDropdownInputText(de,x)),ge(!1)),!keyboardKeys.Space.validate(e.key)||De&&e.currentTarget.selectionStart!==0||(e.preventDefault(),De||(Oe(''),s&&je('')),ge(e=>!e)),keyboardKeys.Esc.validate(e.key)&&ge(!1),keyboardKeys.Tab.validate(e.key)&&De&&(e.preventDefault(),ge(!1)),keyboardKeys.ArrowDown.validate(e.key)&&De&&ve.current)if(e.preventDefault(),!x&&xe.current){const e=[...ve.current.children];const o=e.findIndex(e=>e.contains(xe.current));const t=e[o+1]??e[0];t instanceof HTMLElement&&focusFirstFocusable(t)}else focusFirstFocusable(ve.current);if(keyboardKeys.ArrowUp.validate(e.key)&&De&&ve.current)if(e.preventDefault(),!x&&xe.current){const e=[...ve.current.children];const o=e.findIndex(e=>e.contains(xe.current));const t=e[o-1]??e[e.length-1];t instanceof HTMLElement&&focusFirstFocusable(t)}else focusLastFocusable(ve.current)}}),de.map(e=>jsx("input",{type:"hidden",name:n,value:e.value,form:Q,disabled:W.disabled||e.disabled},e.value))]}),addonLeft:w?jsx(Icon,{name:typeof w=='string'?w:void 0,icon:typeof w!='string'?w:void 0,...ee}):I?jsx(Slot,{render:I,props:{iconProps:ee}}):null,addonRight:jsxs(Fragment,{children:[x&&de.length>0?jsx(Chip,{size:"xs",active:!0,black:!0,disabled:W.disabled,cursor:W.disabled?'not-allowed':void 0,text:de.length,textProps:{appearance:'caption',size:'xs'},palette:W.disabled?{color:'content-disabled',colorHover:'content-disabled',backgroundColor:'bg-disabled-small',backgroundColorHover:'bg-disabled-small'}:void 0,onPointerDown:e=>{e.preventDefault()},onMouseDown:e=>{window.PointerEvent||e.preventDefault()},discardButtonProps:{square:!0,contrast:!W.disabled,onClick:e=>{e.stopPropagation(),X||(y===void 0&&ce([]),F&&F([]),Me.current?.focus(),je(''),Oe(''),ge(!0))}}}):null,!x&&h&&de.length>0?jsx(IconButton,{icon:jsx(Close,{}),size:"l",square:!0,disabled:W.disabled,onClick:e=>{e.stopPropagation(),X||(y===void 0&&ce([]),F&&F(null),Me.current?.focus(),je(''),Oe(''),ge(!0))}}):null,jsx(IconAnimated,{icon:jsx(ChevronDown,{}),up:De,...ee})]}),dropdown:jsx(DropdownMenu,{...d,setRef:Se,open:De,popperReferenceId:oe,secondary:!C,elevated:C,disableAutoFocus:!0,palette:{backgroundColor:N.menuBackgroundColor,borderColor:N.menuBorderColor},empty:Ce.length===0,loading:ye,loadingMessage:k,loadingIcon:S,loadingIconProps:{...ee,...c},emptyMessage:R,emptyIcon:K,emptyIconProps:{...ee,...u},onKeyDown:e=>{keyboardKeys.Tab.validate(e.key)&&(e.preventDefault(),Me.current?.focus(),ge(!1)),keyboardKeys.Enter.validate(e.key)&&(Me.current?.focus(),je(getDropdownInputText(de,x)),ge(!1)),keyboardKeys.Esc.validate(e.key)&&(Me.current?.focus(),ge(!1)),keyboardKeys.Backspace.validate(e.key)&&!X&&(x||!x&&h)&&(y===void 0&&ce([]),F&&F(x?[]:null),je(''),Oe(''))},children:x?jsx(DropdownMenuMultiple,{...Y,ref:ve,inputRef:Me,label:V,name:n,disabled:W.disabled,readOnly:X,menuListId:ne,inputLabelId:te,menuOptions:Ce,dropdownSelectedOption:de,inputText:ue,optionsMultiToggle:a,groupSelectedOptions:z,optionsMultiToggleCaption:B,renderOption:L,onChange:e=>{y===void 0&&ce(e),F&&F(e)}}):jsx(DropdownMenuSingle,{...Y,ref:ve,label:V,readOnly:X,multiple:x,disabled:W.disabled,status:q,menuListId:ne,inputLabelId:te,menuOptions:Ce,dropdownSelectedOption:de,selectedOptionRef:xe,renderOption:L,onChange:e=>{const o={...e};y===void 0&&(je(getDropdownInputText(o)),ce(getDropdownSelectedOption(o))),F&&F(o),Me.current?.focus(),ge(!1)}})})})}),{sizes:SIZES,displayName:"Dropdown"});export{COMPONENT_NAME,Dropdown};
|
|
2
2
|
//# sourceMappingURL=Dropdown.mjs.map
|