@alfalab/core-components-radio-group 6.0.2 → 6.0.3
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/Component.responsive.d.ts +4 -4
- package/components/base-radio-group/Component.d.ts +2 -2
- package/components/base-radio-group/Component.js.map +1 -1
- package/components/base-radio-group/index.css +15 -15
- package/components/base-radio-group/index.module.css.js +1 -1
- package/cssm/Component.responsive.d.ts +4 -4
- package/cssm/components/base-radio-group/Component.d.ts +2 -2
- package/cssm/components/base-radio-group/Component.js.map +1 -1
- package/cssm/desktop/Component.desktop.d.ts +1 -1
- package/cssm/mobile/Component.mobile.d.ts +1 -1
- package/desktop/Component.desktop.d.ts +1 -1
- package/desktop/desktop.css +5 -5
- package/desktop/desktop.module.css.js +1 -1
- package/esm/Component.responsive.d.ts +4 -4
- package/esm/components/base-radio-group/Component.d.ts +2 -2
- package/esm/components/base-radio-group/Component.js.map +1 -1
- package/esm/components/base-radio-group/index.css +15 -15
- package/esm/components/base-radio-group/index.module.css.js +1 -1
- package/esm/desktop/Component.desktop.d.ts +1 -1
- package/esm/desktop/desktop.css +5 -5
- package/esm/desktop/desktop.module.css.js +1 -1
- package/esm/mobile/Component.mobile.d.ts +1 -1
- package/esm/mobile/mobile.css +7 -7
- package/esm/mobile/mobile.module.css.js +1 -1
- package/mobile/Component.mobile.d.ts +1 -1
- package/mobile/mobile.css +7 -7
- package/mobile/mobile.module.css.js +1 -1
- package/modern/Component.responsive.d.ts +4 -4
- package/modern/components/base-radio-group/Component.d.ts +2 -2
- package/modern/components/base-radio-group/Component.js.map +1 -1
- package/modern/components/base-radio-group/index.css +15 -15
- package/modern/components/base-radio-group/index.module.css.js +1 -1
- package/modern/desktop/Component.desktop.d.ts +1 -1
- package/modern/desktop/desktop.css +5 -5
- package/modern/desktop/desktop.module.css.js +1 -1
- package/modern/mobile/Component.mobile.d.ts +1 -1
- package/modern/mobile/mobile.css +7 -7
- package/modern/mobile/mobile.module.css.js +1 -1
- package/moderncssm/Component.responsive.d.ts +4 -4
- package/moderncssm/components/base-radio-group/Component.d.ts +2 -2
- package/moderncssm/components/base-radio-group/Component.js.map +1 -1
- package/moderncssm/desktop/Component.desktop.d.ts +1 -1
- package/moderncssm/mobile/Component.mobile.d.ts +1 -1
- package/package.json +5 -5
- package/src/vars.css +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from './components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupProps = Omit<BaseRadioGroupProps, 'styles'> & {
|
|
4
4
|
/**
|
|
5
5
|
* Контрольная точка, с нее начинается desktop версия
|
|
6
6
|
* @default 1024
|
|
@@ -21,14 +21,14 @@ export declare const RadioGroup: React.ForwardRefExoticComponent<Omit<BaseRadioG
|
|
|
21
21
|
* Контрольная точка, с нее начинается desktop версия
|
|
22
22
|
* @default 1024
|
|
23
23
|
*/
|
|
24
|
-
breakpoint?: number
|
|
24
|
+
breakpoint?: number;
|
|
25
25
|
/**
|
|
26
26
|
* Версия, которая будет использоваться при серверном рендеринге
|
|
27
27
|
*/
|
|
28
|
-
client?: "
|
|
28
|
+
client?: "desktop" | "mobile";
|
|
29
29
|
/**
|
|
30
30
|
* Значение по-умолчанию для хука useMatchMedia
|
|
31
31
|
* @deprecated Используйте client
|
|
32
32
|
*/
|
|
33
|
-
defaultMatchMediaValue?: boolean | (() => boolean)
|
|
33
|
+
defaultMatchMediaValue?: boolean | (() => boolean);
|
|
34
34
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { type AriaAttributes, type ChangeEvent, type FocusEvent, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type Direction = 'horizontal' | 'vertical';
|
|
3
|
+
export type RadioGroupType = 'radio' | 'tag';
|
|
4
4
|
export interface BaseRadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'>, AriaAttributes {
|
|
5
5
|
/**
|
|
6
6
|
* Заголовок группы
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Component.js","sources":["../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":["forwardRef","__rest","useState","useDidUpdateEffect","cloneElement","__assign","cn","commonStyles","React","getDataTestId","Children","isValidElement"],"mappings":";;;;;;;;;;;;;;;;IAqHa,cAAc,GAAGA,gBAAU,CACpC,UACI,EAkBC,EACD,GAAG,EAAA;;AAlBC,IAAA,IAAA,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,kBAAkB,GAAA,EAAA,CAAA,kBAAA,EAClB,EAAA,GAAA,EAAA,CAAA,SAAsB,EAAtB,SAAS,GAAG,EAAA,KAAA,MAAA,GAAA,UAAU,GAAA,EAAA,EACtB,KAAK,GAAA,EAAA,CAAA,KAAA,EACL,KAAK,GAAA,EAAA,CAAA,KAAA,EACL,IAAI,GAAA,EAAA,CAAA,IAAA,EACJ,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,EAAA,GAAA,EAAA,CAAA,IAAc,EAAd,IAAI,GAAG,EAAA,KAAA,MAAA,GAAA,OAAO,GAAA,EAAA,EACd,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,EAAA,GAAA,EAAA,CAAA,QAAgB,EAAhB,QAAQ,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA,EAChB,IAAI,GAAA,EAAA,CAAA,IAAA,EACJ,KAAK,GAAA,EAAA,CAAA,KAAA,EACL,MAAM,GAAA,EAAA,CAAA,MAAA,EACH,SAAS,GAAAC,YAAA,CAAA,EAAA,EAjBhB,oLAkBC,CADe;IAIV,IAAA,EAAA,GAA8BC,cAAQ,CAA+B,EAAE,CAAC,EAAvE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAA8C;AAE9E,IAAAC,wBAAkB,CAAC,YAAA;QACf,aAAa,CAAC,KAAK,CAAC;AACxB,KAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAEX,IAAM,SAAS,GAAG,UAAC,UAAkB,EAAA;QACjC,OAAA,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,UAAU,MAAM,UAAU;AAAtD,KAAsD;AAE1D,IAAA,IAAM,YAAY,GAAG,UAAC,KAA+B,EAAE,UAAkB,EAAA;QACrE,aAAa,CAAC,UAAU,CAAC;AACzB,QAAA,IAAI,QAAQ,EAAE;AACV,YAAA,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAA,IAAA,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/C;AACL,KAAC;IAED,IAAM,WAAW,GAAG,UAAC,KAAmB,EAAA;QAC9B,IAAA,EAAA,GAAmD,KAAK,CAAC,KAAK,EAAjD,cAAc,GAAA,EAAA,CAAA,SAAA,EAAS,UAAU,GAAA,EAAA,CAAA,KAAgB;QAEpE,OAAOC,kBAAY,CAAC,KAAK,EAAAC,cAAA,CAAAA,cAAA,CAAA,EACrB,QAAQ,EAAE,UAAC,KAAkB,EAAA,EAAK,OAAA,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAA/B,EAA+B,EACjE,QAAQ,EAAA,QAAA,EACL,EAAA,KAAK,CAAC,KAAK,KACd,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,EAC9B,IAAI,EAAA,IAAA,EACJ,SAAS,EAAEC,mBAAE,CAAC,cAAc,EAAEC,YAAY,CAAC,EAAA,CAAA,MAAA,CAAG,SAAS,EAAO,OAAA,CAAA,CAAC,CAAC,EAAA,CAAA,CAClE;AACN,KAAC;IAED,IAAM,SAAS,GAAG,UAAC,KAAmB,EAAA;AAClC,QAAA,IAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK;AACpC,QAAA,IAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC;AACrC,QAAA,IAAM,KAAK,GAAGH,kBAAY,CAAC,KAAK,kCAC5B,OAAO,EAAE,UAAC,KAAiB,IAAK,OAAA,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA,EAAA,EAC/D,QAAQ,EAAA,QAAA,EAAA,EACL,KAAK,CAAC,KAAK,KACd,OAAO,EAAA,OAAA,EACP,IAAI,MAAA,EACJ,QAAQ,EAAE,EAAE,IACd;QAEF,QACII,gDACI,SAAS,EAAEF,mBAAE,CACTC,YAAY,CAAC,EAAA,CAAA,MAAA,CAAG,SAAS,EAAA,OAAA,CAAO,CAAC,EACjCA,YAAY,CAAC,EAAA,CAAA,MAAA,CAAG,SAAS,EAAA,UAAA,CAAU,CAAC,EACpCA,YAAY,CAAC,QAAQ,CACxB,EAAA;YAEDC,sBACI,CAAA,aAAA,CAAA,OAAA,EAAA,EAAA,IAAI,EAAC,OAAO,EACZ,YAAY,EAAC,KAAK,EAClB,QAAQ,EAAE,UAAC,KAAkB,IAAK,OAAA,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA,EAAA,EACjE,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAED,YAAY,CAAC,WAAW,EACnC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAC1B,CAAA;YACD,KAAK,CACF;AAEhB,KAAC;AAED,IAAA,IAAM,YAAY,GAAG,OAAO,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,KAAK;AAE5D,IAAA,QACIC,sBAAA,CAAA,aAAA,CAAA,KAAA,EAAAH,cAAA,CAAA,EACI,SAAS,EAAEC,mBAAE,CACTC,YAAY,CAAC,SAAS,EACtBA,YAAY,CAAC,IAAI,CAAC,GAAA,EAAA,GAAA,EAAA,EAChB,EAAC,CAAA,MAAM,CAAC,KAAK,CAAG,GAAA,KAAK,OACvB,SAAS,CACZ,EACD,GAAG,EAAE,GAAG,EACM,cAAA,EAAA,UAAU,IACpB,SAAS,CAAA;QAEZ,KAAK,IACFC,sBAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EACI,SAAS,EAAEF,mBAAE,CAAC,MAAM,CAAC,KAAK,GAAA,EAAA,GAAA,EAAA;AACtB,gBAAA,EAAA,CAAC,MAAM,CAAC,GAAG,CAAG,GAAA,IAAI,KAAK,KAAK;AAC9B,gBAAA,EAAA,EAAA,EAAA,cAAA,EACYG,kCAAa,CAAC,UAAU,EAAE,OAAO,CAAC,EAE/C,EAAA,KAAK,CACH,IACP,IAAI;QAEP,QAAQ,IACLD,8CACI,SAAS,EAAEF,mBAAE,CACTC,YAAY,CAAC,SAAS,EACtBA,YAAY,CAAC,EAAA,CAAA,MAAA,CAAG,SAAS,EAAW,WAAA,CAAA,CAAC,EACrC,kBAAkB,GAChB,EAAA,GAAA,EAAA,EAAA,EAAA,CAAC,MAAM,CAAC,SAAS,IAAG,IAAI,KAAK,OAAO,EACzC,EAAA,EAAA,EACD,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,IAEfG,cAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAC,KAAK,EAAA;AAC1B,YAAA,IAAIC,oBAAc,CAAC,KAAK,CAAC,EAAE;AACvB,gBAAA,OAAO,IAAI,KAAK,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;AAClE;AAED,YAAA,OAAO,IAAI;AACf,SAAC,CAAC,CACA,IACN,IAAI;QAEP,YAAY,KACTH,sBACI,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,SAAS,EAAEF,mBAAE,CACT,MAAM,CAAC,GAAG,GAAA,EAAA,GAAA,EAAA;AAEN,gBAAA,EAAA,CAAC,MAAM,CAAC,GAAG,CAAG,GAAA,IAAI,KAAK,KAAK;AAEhC,gBAAA,EAAA,GAAAC,YAAY,CAAC,YAAY,CAC5B,EACD,IAAI,EAAC,OAAO,EAAA,cAAA,EACEE,kCAAa,CAAC,UAAU,EAAE,OAAO,CAAC,EAE/C,EAAA,YAAY,CACV,CACV;AAEA,QAAA,IAAI,IAAI,CAAC,YAAY,KAClBD,sBAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EACI,SAAS,EAAEF,mBAAE,CACT,MAAM,CAAC,GAAG,GAAA,EAAA,GAAA,EAAA;AAEN,gBAAA,EAAA,CAAC,MAAM,CAAC,GAAG,CAAG,GAAA,IAAI,KAAK,KAAK;AAEhC,gBAAA,EAAA,GAAAC,YAAY,CAAC,IAAI,CACpB,EACa,cAAA,EAAAE,kCAAa,CAAC,UAAU,EAAE,MAAM,CAAC,IAE9C,IAAI,CACF,CACV,CACC;AAEd,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":["forwardRef","__rest","useState","useDidUpdateEffect","cloneElement","__assign","cn","commonStyles","React","getDataTestId","Children","isValidElement"],"mappings":"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"}
|
|
@@ -21,56 +21,56 @@
|
|
|
21
21
|
--radio-group-hint-color: var(--color-light-text-secondary);
|
|
22
22
|
--radio-group-error-color: var(--color-light-text-negative);
|
|
23
23
|
}
|
|
24
|
-
.radio-
|
|
24
|
+
.radio-group__component_1lufd {
|
|
25
25
|
display: flex;
|
|
26
26
|
flex-direction: column;
|
|
27
27
|
}
|
|
28
|
-
.radio-
|
|
28
|
+
.radio-group__radioList_1lufd {
|
|
29
29
|
display: flex;
|
|
30
30
|
}
|
|
31
|
-
.radio-
|
|
31
|
+
.radio-group__verticalRadioList_1lufd {
|
|
32
32
|
flex-direction: column;
|
|
33
33
|
align-items: flex-start;
|
|
34
34
|
}
|
|
35
|
-
.radio-
|
|
35
|
+
.radio-group__horizontalRadioList_1lufd {
|
|
36
36
|
flex-wrap: wrap;
|
|
37
37
|
margin-bottom: var(--gap-8-neg);
|
|
38
38
|
}
|
|
39
|
-
.radio-
|
|
39
|
+
.radio-group__verticalRadio_1lufd {
|
|
40
40
|
margin-bottom: var(--gap-12);
|
|
41
41
|
}
|
|
42
|
-
.radio-
|
|
42
|
+
.radio-group__verticalRadio_1lufd:last-child {
|
|
43
43
|
margin-bottom: var(--gap-0);
|
|
44
44
|
}
|
|
45
|
-
.radio-
|
|
45
|
+
.radio-group__horizontalRadio_1lufd {
|
|
46
46
|
margin-right: var(--gap-24);
|
|
47
47
|
margin-bottom: var(--gap-8);
|
|
48
48
|
}
|
|
49
|
-
.radio-
|
|
49
|
+
.radio-group__horizontalTagLabel_1lufd {
|
|
50
50
|
margin-right: var(--gap-8);
|
|
51
51
|
}
|
|
52
|
-
.radio-
|
|
53
|
-
.radio-
|
|
52
|
+
.radio-group__horizontalRadio_1lufd:last-child,
|
|
53
|
+
.radio-group__horizontalTagLabel_1lufd:last-child {
|
|
54
54
|
margin-right: var(--gap-0);
|
|
55
55
|
}
|
|
56
|
-
.radio-
|
|
56
|
+
.radio-group__errorMessage_1lufd {
|
|
57
57
|
color: var(--radio-group-error-color);
|
|
58
58
|
}
|
|
59
|
-
.radio-
|
|
59
|
+
.radio-group__hint_1lufd {
|
|
60
60
|
color: var(--radio-group-hint-color);
|
|
61
61
|
}
|
|
62
|
-
.radio-
|
|
62
|
+
.radio-group__hiddenInput_1lufd {
|
|
63
63
|
position: absolute;
|
|
64
64
|
z-index: -1;
|
|
65
65
|
top: var(--gap-0);
|
|
66
66
|
left: var(--gap-0);
|
|
67
67
|
opacity: 0;
|
|
68
68
|
}
|
|
69
|
-
.radio-
|
|
69
|
+
.radio-group__hiddenInput_1lufd:focus ~ button {
|
|
70
70
|
outline: 2px solid var(--focus-color);
|
|
71
71
|
outline-offset: 2px;
|
|
72
72
|
}
|
|
73
|
-
.radio-
|
|
73
|
+
.radio-group__tagLabel_1lufd {
|
|
74
74
|
position: relative;
|
|
75
75
|
max-width: 100%;
|
|
76
76
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require('./index.css');
|
|
4
4
|
|
|
5
|
-
var commonStyles = {"component":"radio-
|
|
5
|
+
var commonStyles = {"component":"radio-group__component_1lufd","radioList":"radio-group__radioList_1lufd","verticalRadioList":"radio-group__verticalRadioList_1lufd","horizontalRadioList":"radio-group__horizontalRadioList_1lufd","verticalRadio":"radio-group__verticalRadio_1lufd","horizontalRadio":"radio-group__horizontalRadio_1lufd","horizontalTagLabel":"radio-group__horizontalTagLabel_1lufd","errorMessage":"radio-group__errorMessage_1lufd","hint":"radio-group__hint_1lufd","hiddenInput":"radio-group__hiddenInput_1lufd","tagLabel":"radio-group__tagLabel_1lufd"};
|
|
6
6
|
|
|
7
7
|
module.exports = commonStyles;
|
|
8
8
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from './components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupProps = Omit<BaseRadioGroupProps, 'styles'> & {
|
|
4
4
|
/**
|
|
5
5
|
* Контрольная точка, с нее начинается desktop версия
|
|
6
6
|
* @default 1024
|
|
@@ -21,14 +21,14 @@ export declare const RadioGroup: React.ForwardRefExoticComponent<Omit<BaseRadioG
|
|
|
21
21
|
* Контрольная точка, с нее начинается desktop версия
|
|
22
22
|
* @default 1024
|
|
23
23
|
*/
|
|
24
|
-
breakpoint?: number
|
|
24
|
+
breakpoint?: number;
|
|
25
25
|
/**
|
|
26
26
|
* Версия, которая будет использоваться при серверном рендеринге
|
|
27
27
|
*/
|
|
28
|
-
client?: "
|
|
28
|
+
client?: "desktop" | "mobile";
|
|
29
29
|
/**
|
|
30
30
|
* Значение по-умолчанию для хука useMatchMedia
|
|
31
31
|
* @deprecated Используйте client
|
|
32
32
|
*/
|
|
33
|
-
defaultMatchMediaValue?: boolean | (() => boolean)
|
|
33
|
+
defaultMatchMediaValue?: boolean | (() => boolean);
|
|
34
34
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { type AriaAttributes, type ChangeEvent, type FocusEvent, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type Direction = 'horizontal' | 'vertical';
|
|
3
|
+
export type RadioGroupType = 'radio' | 'tag';
|
|
4
4
|
export interface BaseRadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'>, AriaAttributes {
|
|
5
5
|
/**
|
|
6
6
|
* Заголовок группы
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":["forwardRef","__rest","useState","useDidUpdateEffect","cloneElement","__assign","cn","commonStyles","React","getDataTestId","Children","isValidElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":["forwardRef","__rest","useState","useDidUpdateEffect","cloneElement","__assign","cn","commonStyles","React","getDataTestId","Children","isValidElement"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupDesktopProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupDesktop: React.ForwardRefExoticComponent<RadioGroupDesktopProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupMobileProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupMobile: React.ForwardRefExoticComponent<RadioGroupMobileProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupDesktopProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupDesktop: React.ForwardRefExoticComponent<RadioGroupDesktopProps & React.RefAttributes<HTMLDivElement>>;
|
package/desktop/desktop.css
CHANGED
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
--radio-group-error-padding-left: var(--gap-8);
|
|
21
21
|
--radio-group-error-border-left: 1px solid var(--color-light-status-negative);
|
|
22
22
|
}
|
|
23
|
-
.radio-
|
|
23
|
+
.radio-group__radioList_16gra {
|
|
24
24
|
padding-left: var(--radio-group-list-padding-left);
|
|
25
25
|
}
|
|
26
|
-
.radio-
|
|
26
|
+
.radio-group__label_16gra {
|
|
27
27
|
font-size: 16px;
|
|
28
28
|
line-height: 24px;
|
|
29
29
|
font-weight: 400;
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
margin-bottom: var(--gap-12);
|
|
33
33
|
padding-left: var(--radio-group-sub-padding-left);
|
|
34
34
|
}
|
|
35
|
-
.radio-
|
|
35
|
+
.radio-group__sub_16gra {
|
|
36
36
|
font-size: 14px;
|
|
37
37
|
line-height: 18px;
|
|
38
38
|
font-weight: 400;
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
margin-top: var(--gap-12);
|
|
41
41
|
padding-left: var(--radio-group-sub-padding-left);
|
|
42
42
|
}
|
|
43
|
-
.radio-
|
|
43
|
+
.radio-group__error_16gra {
|
|
44
44
|
padding-left: var(--radio-group-error-padding-left);
|
|
45
45
|
border-left: var(--radio-group-error-border-left);
|
|
46
46
|
}
|
|
47
|
-
.radio-
|
|
47
|
+
.radio-group__error_16gra.radio-group__tag_16gra {
|
|
48
48
|
padding-left: var(--gap-8);
|
|
49
49
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require('./desktop.css');
|
|
4
4
|
|
|
5
|
-
var styles = {"radioList":"radio-
|
|
5
|
+
var styles = {"radioList":"radio-group__radioList_16gra","label":"radio-group__label_16gra","sub":"radio-group__sub_16gra","error":"radio-group__error_16gra","tag":"radio-group__tag_16gra"};
|
|
6
6
|
|
|
7
7
|
module.exports = styles;
|
|
8
8
|
//# sourceMappingURL=desktop.module.css.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from './components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupProps = Omit<BaseRadioGroupProps, 'styles'> & {
|
|
4
4
|
/**
|
|
5
5
|
* Контрольная точка, с нее начинается desktop версия
|
|
6
6
|
* @default 1024
|
|
@@ -21,14 +21,14 @@ export declare const RadioGroup: React.ForwardRefExoticComponent<Omit<BaseRadioG
|
|
|
21
21
|
* Контрольная точка, с нее начинается desktop версия
|
|
22
22
|
* @default 1024
|
|
23
23
|
*/
|
|
24
|
-
breakpoint?: number
|
|
24
|
+
breakpoint?: number;
|
|
25
25
|
/**
|
|
26
26
|
* Версия, которая будет использоваться при серверном рендеринге
|
|
27
27
|
*/
|
|
28
|
-
client?: "
|
|
28
|
+
client?: "desktop" | "mobile";
|
|
29
29
|
/**
|
|
30
30
|
* Значение по-умолчанию для хука useMatchMedia
|
|
31
31
|
* @deprecated Используйте client
|
|
32
32
|
*/
|
|
33
|
-
defaultMatchMediaValue?: boolean | (() => boolean)
|
|
33
|
+
defaultMatchMediaValue?: boolean | (() => boolean);
|
|
34
34
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { type AriaAttributes, type ChangeEvent, type FocusEvent, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type Direction = 'horizontal' | 'vertical';
|
|
3
|
+
export type RadioGroupType = 'radio' | 'tag';
|
|
4
4
|
export interface BaseRadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'>, AriaAttributes {
|
|
5
5
|
/**
|
|
6
6
|
* Заголовок группы
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -21,56 +21,56 @@
|
|
|
21
21
|
--radio-group-hint-color: var(--color-light-text-secondary);
|
|
22
22
|
--radio-group-error-color: var(--color-light-text-negative);
|
|
23
23
|
}
|
|
24
|
-
.radio-
|
|
24
|
+
.radio-group__component_1lufd {
|
|
25
25
|
display: flex;
|
|
26
26
|
flex-direction: column;
|
|
27
27
|
}
|
|
28
|
-
.radio-
|
|
28
|
+
.radio-group__radioList_1lufd {
|
|
29
29
|
display: flex;
|
|
30
30
|
}
|
|
31
|
-
.radio-
|
|
31
|
+
.radio-group__verticalRadioList_1lufd {
|
|
32
32
|
flex-direction: column;
|
|
33
33
|
align-items: flex-start;
|
|
34
34
|
}
|
|
35
|
-
.radio-
|
|
35
|
+
.radio-group__horizontalRadioList_1lufd {
|
|
36
36
|
flex-wrap: wrap;
|
|
37
37
|
margin-bottom: var(--gap-8-neg);
|
|
38
38
|
}
|
|
39
|
-
.radio-
|
|
39
|
+
.radio-group__verticalRadio_1lufd {
|
|
40
40
|
margin-bottom: var(--gap-12);
|
|
41
41
|
}
|
|
42
|
-
.radio-
|
|
42
|
+
.radio-group__verticalRadio_1lufd:last-child {
|
|
43
43
|
margin-bottom: var(--gap-0);
|
|
44
44
|
}
|
|
45
|
-
.radio-
|
|
45
|
+
.radio-group__horizontalRadio_1lufd {
|
|
46
46
|
margin-right: var(--gap-24);
|
|
47
47
|
margin-bottom: var(--gap-8);
|
|
48
48
|
}
|
|
49
|
-
.radio-
|
|
49
|
+
.radio-group__horizontalTagLabel_1lufd {
|
|
50
50
|
margin-right: var(--gap-8);
|
|
51
51
|
}
|
|
52
|
-
.radio-
|
|
53
|
-
.radio-
|
|
52
|
+
.radio-group__horizontalRadio_1lufd:last-child,
|
|
53
|
+
.radio-group__horizontalTagLabel_1lufd:last-child {
|
|
54
54
|
margin-right: var(--gap-0);
|
|
55
55
|
}
|
|
56
|
-
.radio-
|
|
56
|
+
.radio-group__errorMessage_1lufd {
|
|
57
57
|
color: var(--radio-group-error-color);
|
|
58
58
|
}
|
|
59
|
-
.radio-
|
|
59
|
+
.radio-group__hint_1lufd {
|
|
60
60
|
color: var(--radio-group-hint-color);
|
|
61
61
|
}
|
|
62
|
-
.radio-
|
|
62
|
+
.radio-group__hiddenInput_1lufd {
|
|
63
63
|
position: absolute;
|
|
64
64
|
z-index: -1;
|
|
65
65
|
top: var(--gap-0);
|
|
66
66
|
left: var(--gap-0);
|
|
67
67
|
opacity: 0;
|
|
68
68
|
}
|
|
69
|
-
.radio-
|
|
69
|
+
.radio-group__hiddenInput_1lufd:focus ~ button {
|
|
70
70
|
outline: 2px solid var(--focus-color);
|
|
71
71
|
outline-offset: 2px;
|
|
72
72
|
}
|
|
73
|
-
.radio-
|
|
73
|
+
.radio-group__tagLabel_1lufd {
|
|
74
74
|
position: relative;
|
|
75
75
|
max-width: 100%;
|
|
76
76
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
var commonStyles = {"component":"radio-
|
|
3
|
+
var commonStyles = {"component":"radio-group__component_1lufd","radioList":"radio-group__radioList_1lufd","verticalRadioList":"radio-group__verticalRadioList_1lufd","horizontalRadioList":"radio-group__horizontalRadioList_1lufd","verticalRadio":"radio-group__verticalRadio_1lufd","horizontalRadio":"radio-group__horizontalRadio_1lufd","horizontalTagLabel":"radio-group__horizontalTagLabel_1lufd","errorMessage":"radio-group__errorMessage_1lufd","hint":"radio-group__hint_1lufd","hiddenInput":"radio-group__hiddenInput_1lufd","tagLabel":"radio-group__tagLabel_1lufd"};
|
|
4
4
|
|
|
5
5
|
export { commonStyles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupDesktopProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupDesktop: React.ForwardRefExoticComponent<RadioGroupDesktopProps & React.RefAttributes<HTMLDivElement>>;
|
package/esm/desktop/desktop.css
CHANGED
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
--radio-group-error-padding-left: var(--gap-8);
|
|
21
21
|
--radio-group-error-border-left: 1px solid var(--color-light-status-negative);
|
|
22
22
|
}
|
|
23
|
-
.radio-
|
|
23
|
+
.radio-group__radioList_16gra {
|
|
24
24
|
padding-left: var(--radio-group-list-padding-left);
|
|
25
25
|
}
|
|
26
|
-
.radio-
|
|
26
|
+
.radio-group__label_16gra {
|
|
27
27
|
font-size: 16px;
|
|
28
28
|
line-height: 24px;
|
|
29
29
|
font-weight: 400;
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
margin-bottom: var(--gap-12);
|
|
33
33
|
padding-left: var(--radio-group-sub-padding-left);
|
|
34
34
|
}
|
|
35
|
-
.radio-
|
|
35
|
+
.radio-group__sub_16gra {
|
|
36
36
|
font-size: 14px;
|
|
37
37
|
line-height: 18px;
|
|
38
38
|
font-weight: 400;
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
margin-top: var(--gap-12);
|
|
41
41
|
padding-left: var(--radio-group-sub-padding-left);
|
|
42
42
|
}
|
|
43
|
-
.radio-
|
|
43
|
+
.radio-group__error_16gra {
|
|
44
44
|
padding-left: var(--radio-group-error-padding-left);
|
|
45
45
|
border-left: var(--radio-group-error-border-left);
|
|
46
46
|
}
|
|
47
|
-
.radio-
|
|
47
|
+
.radio-group__error_16gra.radio-group__tag_16gra {
|
|
48
48
|
padding-left: var(--gap-8);
|
|
49
49
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './desktop.css';
|
|
2
2
|
|
|
3
|
-
var styles = {"radioList":"radio-
|
|
3
|
+
var styles = {"radioList":"radio-group__radioList_16gra","label":"radio-group__label_16gra","sub":"radio-group__sub_16gra","error":"radio-group__error_16gra","tag":"radio-group__tag_16gra"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=desktop.module.css.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupMobileProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupMobile: React.ForwardRefExoticComponent<RadioGroupMobileProps & React.RefAttributes<HTMLDivElement>>;
|
package/esm/mobile/mobile.css
CHANGED
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
--radio-group-mobile-error-padding-left: var(--gap-0);
|
|
24
24
|
--radio-group-mobile-error-border-left: none;
|
|
25
25
|
}
|
|
26
|
-
.radio-
|
|
26
|
+
.radio-group__radioList_1xg6n {
|
|
27
27
|
padding-left: var(--radio-group-mobile-list-padding-left);
|
|
28
28
|
}
|
|
29
|
-
.radio-
|
|
29
|
+
.radio-group__label_1xg6n {
|
|
30
30
|
font-size: 14px;
|
|
31
31
|
line-height: 18px;
|
|
32
32
|
font-weight: 400;
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
padding-left: var(--radio-group-mobile-sub-padding-left);
|
|
36
36
|
margin-bottom: var(--gap-12);
|
|
37
37
|
}
|
|
38
|
-
.radio-
|
|
38
|
+
.radio-group__label_1xg6n.radio-group__tag_1xg6n {
|
|
39
39
|
margin-bottom: var(--gap-8);
|
|
40
40
|
}
|
|
41
|
-
.radio-
|
|
41
|
+
.radio-group__sub_1xg6n {
|
|
42
42
|
font-size: 14px;
|
|
43
43
|
line-height: 18px;
|
|
44
44
|
font-weight: 400;
|
|
@@ -46,13 +46,13 @@
|
|
|
46
46
|
margin-top: var(--gap-12);
|
|
47
47
|
padding-left: var(--radio-group-mobile-sub-padding-left);
|
|
48
48
|
}
|
|
49
|
-
.radio-
|
|
49
|
+
.radio-group__sub_1xg6n.radio-group__tag_1xg6n {
|
|
50
50
|
margin-top: var(--gap-8);
|
|
51
51
|
}
|
|
52
|
-
.radio-
|
|
52
|
+
.radio-group__error_1xg6n {
|
|
53
53
|
padding-left: var(--radio-group-mobile-error-padding-left);
|
|
54
54
|
border-left: var(--radio-group-mobile-error-border-left);
|
|
55
55
|
}
|
|
56
|
-
.radio-
|
|
56
|
+
.radio-group__error_1xg6n.radio-group__tag_1xg6n {
|
|
57
57
|
padding-left: var(--gap-0);
|
|
58
58
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './mobile.css';
|
|
2
2
|
|
|
3
|
-
var styles = {"radioList":"radio-
|
|
3
|
+
var styles = {"radioList":"radio-group__radioList_1xg6n","label":"radio-group__label_1xg6n","tag":"radio-group__tag_1xg6n","sub":"radio-group__sub_1xg6n","error":"radio-group__error_1xg6n"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=mobile.module.css.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupMobileProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupMobile: React.ForwardRefExoticComponent<RadioGroupMobileProps & React.RefAttributes<HTMLDivElement>>;
|
package/mobile/mobile.css
CHANGED
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
--radio-group-mobile-error-padding-left: var(--gap-0);
|
|
24
24
|
--radio-group-mobile-error-border-left: none;
|
|
25
25
|
}
|
|
26
|
-
.radio-
|
|
26
|
+
.radio-group__radioList_1xg6n {
|
|
27
27
|
padding-left: var(--radio-group-mobile-list-padding-left);
|
|
28
28
|
}
|
|
29
|
-
.radio-
|
|
29
|
+
.radio-group__label_1xg6n {
|
|
30
30
|
font-size: 14px;
|
|
31
31
|
line-height: 18px;
|
|
32
32
|
font-weight: 400;
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
padding-left: var(--radio-group-mobile-sub-padding-left);
|
|
36
36
|
margin-bottom: var(--gap-12);
|
|
37
37
|
}
|
|
38
|
-
.radio-
|
|
38
|
+
.radio-group__label_1xg6n.radio-group__tag_1xg6n {
|
|
39
39
|
margin-bottom: var(--gap-8);
|
|
40
40
|
}
|
|
41
|
-
.radio-
|
|
41
|
+
.radio-group__sub_1xg6n {
|
|
42
42
|
font-size: 14px;
|
|
43
43
|
line-height: 18px;
|
|
44
44
|
font-weight: 400;
|
|
@@ -46,13 +46,13 @@
|
|
|
46
46
|
margin-top: var(--gap-12);
|
|
47
47
|
padding-left: var(--radio-group-mobile-sub-padding-left);
|
|
48
48
|
}
|
|
49
|
-
.radio-
|
|
49
|
+
.radio-group__sub_1xg6n.radio-group__tag_1xg6n {
|
|
50
50
|
margin-top: var(--gap-8);
|
|
51
51
|
}
|
|
52
|
-
.radio-
|
|
52
|
+
.radio-group__error_1xg6n {
|
|
53
53
|
padding-left: var(--radio-group-mobile-error-padding-left);
|
|
54
54
|
border-left: var(--radio-group-mobile-error-border-left);
|
|
55
55
|
}
|
|
56
|
-
.radio-
|
|
56
|
+
.radio-group__error_1xg6n.radio-group__tag_1xg6n {
|
|
57
57
|
padding-left: var(--gap-0);
|
|
58
58
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require('./mobile.css');
|
|
4
4
|
|
|
5
|
-
var styles = {"radioList":"radio-
|
|
5
|
+
var styles = {"radioList":"radio-group__radioList_1xg6n","label":"radio-group__label_1xg6n","tag":"radio-group__tag_1xg6n","sub":"radio-group__sub_1xg6n","error":"radio-group__error_1xg6n"};
|
|
6
6
|
|
|
7
7
|
module.exports = styles;
|
|
8
8
|
//# sourceMappingURL=mobile.module.css.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from './components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupProps = Omit<BaseRadioGroupProps, 'styles'> & {
|
|
4
4
|
/**
|
|
5
5
|
* Контрольная точка, с нее начинается desktop версия
|
|
6
6
|
* @default 1024
|
|
@@ -21,14 +21,14 @@ export declare const RadioGroup: React.ForwardRefExoticComponent<Omit<BaseRadioG
|
|
|
21
21
|
* Контрольная точка, с нее начинается desktop версия
|
|
22
22
|
* @default 1024
|
|
23
23
|
*/
|
|
24
|
-
breakpoint?: number
|
|
24
|
+
breakpoint?: number;
|
|
25
25
|
/**
|
|
26
26
|
* Версия, которая будет использоваться при серверном рендеринге
|
|
27
27
|
*/
|
|
28
|
-
client?: "
|
|
28
|
+
client?: "desktop" | "mobile";
|
|
29
29
|
/**
|
|
30
30
|
* Значение по-умолчанию для хука useMatchMedia
|
|
31
31
|
* @deprecated Используйте client
|
|
32
32
|
*/
|
|
33
|
-
defaultMatchMediaValue?: boolean | (() => boolean)
|
|
33
|
+
defaultMatchMediaValue?: boolean | (() => boolean);
|
|
34
34
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { type AriaAttributes, type ChangeEvent, type FocusEvent, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type Direction = 'horizontal' | 'vertical';
|
|
3
|
+
export type RadioGroupType = 'radio' | 'tag';
|
|
4
4
|
export interface BaseRadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'>, AriaAttributes {
|
|
5
5
|
/**
|
|
6
6
|
* Заголовок группы
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -21,56 +21,56 @@
|
|
|
21
21
|
--radio-group-hint-color: var(--color-light-text-secondary);
|
|
22
22
|
--radio-group-error-color: var(--color-light-text-negative);
|
|
23
23
|
}
|
|
24
|
-
.radio-
|
|
24
|
+
.radio-group__component_1lufd {
|
|
25
25
|
display: flex;
|
|
26
26
|
flex-direction: column;
|
|
27
27
|
}
|
|
28
|
-
.radio-
|
|
28
|
+
.radio-group__radioList_1lufd {
|
|
29
29
|
display: flex;
|
|
30
30
|
}
|
|
31
|
-
.radio-
|
|
31
|
+
.radio-group__verticalRadioList_1lufd {
|
|
32
32
|
flex-direction: column;
|
|
33
33
|
align-items: flex-start;
|
|
34
34
|
}
|
|
35
|
-
.radio-
|
|
35
|
+
.radio-group__horizontalRadioList_1lufd {
|
|
36
36
|
flex-wrap: wrap;
|
|
37
37
|
margin-bottom: var(--gap-8-neg);
|
|
38
38
|
}
|
|
39
|
-
.radio-
|
|
39
|
+
.radio-group__verticalRadio_1lufd {
|
|
40
40
|
margin-bottom: var(--gap-12);
|
|
41
41
|
}
|
|
42
|
-
.radio-
|
|
42
|
+
.radio-group__verticalRadio_1lufd:last-child {
|
|
43
43
|
margin-bottom: var(--gap-0);
|
|
44
44
|
}
|
|
45
|
-
.radio-
|
|
45
|
+
.radio-group__horizontalRadio_1lufd {
|
|
46
46
|
margin-right: var(--gap-24);
|
|
47
47
|
margin-bottom: var(--gap-8);
|
|
48
48
|
}
|
|
49
|
-
.radio-
|
|
49
|
+
.radio-group__horizontalTagLabel_1lufd {
|
|
50
50
|
margin-right: var(--gap-8);
|
|
51
51
|
}
|
|
52
|
-
.radio-
|
|
53
|
-
.radio-
|
|
52
|
+
.radio-group__horizontalRadio_1lufd:last-child,
|
|
53
|
+
.radio-group__horizontalTagLabel_1lufd:last-child {
|
|
54
54
|
margin-right: var(--gap-0);
|
|
55
55
|
}
|
|
56
|
-
.radio-
|
|
56
|
+
.radio-group__errorMessage_1lufd {
|
|
57
57
|
color: var(--radio-group-error-color);
|
|
58
58
|
}
|
|
59
|
-
.radio-
|
|
59
|
+
.radio-group__hint_1lufd {
|
|
60
60
|
color: var(--radio-group-hint-color);
|
|
61
61
|
}
|
|
62
|
-
.radio-
|
|
62
|
+
.radio-group__hiddenInput_1lufd {
|
|
63
63
|
position: absolute;
|
|
64
64
|
z-index: -1;
|
|
65
65
|
top: var(--gap-0);
|
|
66
66
|
left: var(--gap-0);
|
|
67
67
|
opacity: 0;
|
|
68
68
|
}
|
|
69
|
-
.radio-
|
|
69
|
+
.radio-group__hiddenInput_1lufd:focus ~ button {
|
|
70
70
|
outline: 2px solid var(--focus-color);
|
|
71
71
|
outline-offset: 2px;
|
|
72
72
|
}
|
|
73
|
-
.radio-
|
|
73
|
+
.radio-group__tagLabel_1lufd {
|
|
74
74
|
position: relative;
|
|
75
75
|
max-width: 100%;
|
|
76
76
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
const commonStyles = {"component":"radio-
|
|
3
|
+
const commonStyles = {"component":"radio-group__component_1lufd","radioList":"radio-group__radioList_1lufd","verticalRadioList":"radio-group__verticalRadioList_1lufd","horizontalRadioList":"radio-group__horizontalRadioList_1lufd","verticalRadio":"radio-group__verticalRadio_1lufd","horizontalRadio":"radio-group__horizontalRadio_1lufd","horizontalTagLabel":"radio-group__horizontalTagLabel_1lufd","errorMessage":"radio-group__errorMessage_1lufd","hint":"radio-group__hint_1lufd","hiddenInput":"radio-group__hiddenInput_1lufd","tagLabel":"radio-group__tagLabel_1lufd"};
|
|
4
4
|
|
|
5
5
|
export { commonStyles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupDesktopProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupDesktop: React.ForwardRefExoticComponent<RadioGroupDesktopProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
--radio-group-error-padding-left: var(--gap-8);
|
|
21
21
|
--radio-group-error-border-left: 1px solid var(--color-light-status-negative);
|
|
22
22
|
}
|
|
23
|
-
.radio-
|
|
23
|
+
.radio-group__radioList_16gra {
|
|
24
24
|
padding-left: var(--radio-group-list-padding-left);
|
|
25
25
|
}
|
|
26
|
-
.radio-
|
|
26
|
+
.radio-group__label_16gra {
|
|
27
27
|
font-size: 16px;
|
|
28
28
|
line-height: 24px;
|
|
29
29
|
font-weight: 400;
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
margin-bottom: var(--gap-12);
|
|
33
33
|
padding-left: var(--radio-group-sub-padding-left);
|
|
34
34
|
}
|
|
35
|
-
.radio-
|
|
35
|
+
.radio-group__sub_16gra {
|
|
36
36
|
font-size: 14px;
|
|
37
37
|
line-height: 18px;
|
|
38
38
|
font-weight: 400;
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
margin-top: var(--gap-12);
|
|
41
41
|
padding-left: var(--radio-group-sub-padding-left);
|
|
42
42
|
}
|
|
43
|
-
.radio-
|
|
43
|
+
.radio-group__error_16gra {
|
|
44
44
|
padding-left: var(--radio-group-error-padding-left);
|
|
45
45
|
border-left: var(--radio-group-error-border-left);
|
|
46
46
|
}
|
|
47
|
-
.radio-
|
|
47
|
+
.radio-group__error_16gra.radio-group__tag_16gra {
|
|
48
48
|
padding-left: var(--gap-8);
|
|
49
49
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './desktop.css';
|
|
2
2
|
|
|
3
|
-
const styles = {"radioList":"radio-
|
|
3
|
+
const styles = {"radioList":"radio-group__radioList_16gra","label":"radio-group__label_16gra","sub":"radio-group__sub_16gra","error":"radio-group__error_16gra","tag":"radio-group__tag_16gra"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=desktop.module.css.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupMobileProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupMobile: React.ForwardRefExoticComponent<RadioGroupMobileProps & React.RefAttributes<HTMLDivElement>>;
|
package/modern/mobile/mobile.css
CHANGED
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
--radio-group-mobile-error-padding-left: var(--gap-0);
|
|
24
24
|
--radio-group-mobile-error-border-left: none;
|
|
25
25
|
}
|
|
26
|
-
.radio-
|
|
26
|
+
.radio-group__radioList_1xg6n {
|
|
27
27
|
padding-left: var(--radio-group-mobile-list-padding-left);
|
|
28
28
|
}
|
|
29
|
-
.radio-
|
|
29
|
+
.radio-group__label_1xg6n {
|
|
30
30
|
font-size: 14px;
|
|
31
31
|
line-height: 18px;
|
|
32
32
|
font-weight: 400;
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
padding-left: var(--radio-group-mobile-sub-padding-left);
|
|
36
36
|
margin-bottom: var(--gap-12);
|
|
37
37
|
}
|
|
38
|
-
.radio-
|
|
38
|
+
.radio-group__label_1xg6n.radio-group__tag_1xg6n {
|
|
39
39
|
margin-bottom: var(--gap-8);
|
|
40
40
|
}
|
|
41
|
-
.radio-
|
|
41
|
+
.radio-group__sub_1xg6n {
|
|
42
42
|
font-size: 14px;
|
|
43
43
|
line-height: 18px;
|
|
44
44
|
font-weight: 400;
|
|
@@ -46,13 +46,13 @@
|
|
|
46
46
|
margin-top: var(--gap-12);
|
|
47
47
|
padding-left: var(--radio-group-mobile-sub-padding-left);
|
|
48
48
|
}
|
|
49
|
-
.radio-
|
|
49
|
+
.radio-group__sub_1xg6n.radio-group__tag_1xg6n {
|
|
50
50
|
margin-top: var(--gap-8);
|
|
51
51
|
}
|
|
52
|
-
.radio-
|
|
52
|
+
.radio-group__error_1xg6n {
|
|
53
53
|
padding-left: var(--radio-group-mobile-error-padding-left);
|
|
54
54
|
border-left: var(--radio-group-mobile-error-border-left);
|
|
55
55
|
}
|
|
56
|
-
.radio-
|
|
56
|
+
.radio-group__error_1xg6n.radio-group__tag_1xg6n {
|
|
57
57
|
padding-left: var(--gap-0);
|
|
58
58
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './mobile.css';
|
|
2
2
|
|
|
3
|
-
const styles = {"radioList":"radio-
|
|
3
|
+
const styles = {"radioList":"radio-group__radioList_1xg6n","label":"radio-group__label_1xg6n","tag":"radio-group__tag_1xg6n","sub":"radio-group__sub_1xg6n","error":"radio-group__error_1xg6n"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=mobile.module.css.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from './components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupProps = Omit<BaseRadioGroupProps, 'styles'> & {
|
|
4
4
|
/**
|
|
5
5
|
* Контрольная точка, с нее начинается desktop версия
|
|
6
6
|
* @default 1024
|
|
@@ -21,14 +21,14 @@ export declare const RadioGroup: React.ForwardRefExoticComponent<Omit<BaseRadioG
|
|
|
21
21
|
* Контрольная точка, с нее начинается desktop версия
|
|
22
22
|
* @default 1024
|
|
23
23
|
*/
|
|
24
|
-
breakpoint?: number
|
|
24
|
+
breakpoint?: number;
|
|
25
25
|
/**
|
|
26
26
|
* Версия, которая будет использоваться при серверном рендеринге
|
|
27
27
|
*/
|
|
28
|
-
client?: "
|
|
28
|
+
client?: "desktop" | "mobile";
|
|
29
29
|
/**
|
|
30
30
|
* Значение по-умолчанию для хука useMatchMedia
|
|
31
31
|
* @deprecated Используйте client
|
|
32
32
|
*/
|
|
33
|
-
defaultMatchMediaValue?: boolean | (() => boolean)
|
|
33
|
+
defaultMatchMediaValue?: boolean | (() => boolean);
|
|
34
34
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { type AriaAttributes, type ChangeEvent, type FocusEvent, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type Direction = 'horizontal' | 'vertical';
|
|
3
|
+
export type RadioGroupType = 'radio' | 'tag';
|
|
4
4
|
export interface BaseRadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'>, AriaAttributes {
|
|
5
5
|
/**
|
|
6
6
|
* Заголовок группы
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../../../src/components/base-radio-group/Component.tsx"],"sourcesContent":["import React, {\n type AriaAttributes,\n type ChangeEvent,\n Children,\n cloneElement,\n type FocusEvent,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\nimport cn from 'classnames';\n\nimport { getDataTestId } from '@alfalab/core-components-shared';\nimport { useDidUpdateEffect } from '@alfalab/hooks';\n\nimport commonStyles from './index.module.css';\n\nexport type Direction = 'horizontal' | 'vertical';\nexport type RadioGroupType = 'radio' | 'tag';\n\nexport interface BaseRadioGroupProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'onBlur' | 'onFocus' | 'children' | 'className'\n >,\n AriaAttributes {\n /**\n * Заголовок группы\n */\n label?: ReactNode;\n\n /**\n * Направление\n */\n direction?: Direction;\n\n /**\n * Тип компонента\n */\n type?: RadioGroupType;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для списка радио элементов\n */\n radioListClassName?: string;\n\n /**\n * Отображение ошибки\n */\n error?: ReactNode | boolean;\n\n /**\n * Текст подсказки снизу\n */\n hint?: ReactNode;\n\n /**\n * Дочерние элементы. Ожидаются компоненты `Radio` или `Tag`\n */\n children: ReactNode;\n\n /**\n * Обработчик изменения значения 'checked' одного из дочерних компонентов\n */\n onChange?: (\n event: ChangeEvent | MouseEvent,\n payload: {\n value: string;\n name?: string;\n },\n ) => void;\n\n /**\n * Обработчик блюра.\n */\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Обработчик фокуса.\n */\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n\n /**\n * Управление возможностью изменения состояния 'checked' дочерних компонентов Radio | Tag\n */\n disabled?: boolean;\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n\n /**\n * Атрибут name для всех дочерних компонентов\n */\n name?: string;\n\n /**\n * Value выбранного дочернего элемента\n */\n value?: string | null;\n\n /**\n * Основные стили компонента.\n */\n styles: { [key: string]: string };\n}\n\nexport const BaseRadioGroup = forwardRef<HTMLDivElement, BaseRadioGroupProps>(\n (\n {\n children,\n className,\n radioListClassName,\n direction = 'vertical',\n label,\n error,\n hint,\n onChange,\n onBlur,\n onFocus,\n type = 'radio',\n dataTestId,\n disabled = false,\n name,\n value,\n styles,\n ...restProps\n },\n ref,\n ) => {\n const [stateValue, setStateValue] = useState<BaseRadioGroupProps['value']>('');\n\n useDidUpdateEffect(() => {\n setStateValue(value);\n }, [value]);\n\n const isChecked = (childValue: string) =>\n value !== null && (value || stateValue) === childValue;\n\n const handleChange = (event: ChangeEvent | MouseEvent, childValue: string) => {\n setStateValue(childValue);\n if (onChange) {\n onChange(event, { name, value: childValue });\n }\n };\n\n const renderRadio = (child: ReactElement) => {\n const { className: childClassName, value: childValue } = child.props;\n\n return cloneElement(child, {\n onChange: (event: ChangeEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked: isChecked(childValue),\n name,\n className: cn(childClassName, commonStyles[`${direction}Radio`]),\n });\n };\n\n const renderTag = (child: ReactElement) => {\n const childValue = child.props.value;\n const checked = isChecked(childValue);\n const clone = cloneElement(child, {\n onClick: (event: MouseEvent) => handleChange(event, childValue),\n disabled,\n ...child.props,\n checked,\n name,\n tabIndex: -1,\n });\n\n return (\n <label\n className={cn(\n commonStyles[`${direction}Radio`],\n commonStyles[`${direction}TagLabel`],\n commonStyles.tagLabel,\n )}\n >\n <input\n type='radio'\n autoComplete='off'\n onChange={(event: ChangeEvent) => handleChange(event, childValue)}\n disabled={disabled || child.props.disabled}\n name={name}\n checked={checked}\n className={commonStyles.hiddenInput}\n value={child.props.value}\n />\n {clone}\n </label>\n );\n };\n\n const errorMessage = typeof error === 'boolean' ? '' : error;\n\n return (\n <div\n className={cn(\n commonStyles.component,\n commonStyles[type],\n { [styles.error]: error },\n className,\n )}\n ref={ref}\n data-test-id={dataTestId}\n {...restProps}\n >\n {label ? (\n <span\n className={cn(styles.label, {\n [styles.tag]: type === 'tag',\n })}\n data-test-id={getDataTestId(dataTestId, 'label')}\n >\n {label}\n </span>\n ) : null}\n\n {children ? (\n <div\n className={cn(\n commonStyles.radioList,\n commonStyles[`${direction}RadioList`],\n radioListClassName,\n { [styles.radioList]: type === 'radio' },\n )}\n onBlur={onBlur}\n onFocus={onFocus}\n >\n {Children.map(children, (child) => {\n if (isValidElement(child)) {\n return type === 'radio' ? renderRadio(child) : renderTag(child);\n }\n\n return null;\n })}\n </div>\n ) : null}\n\n {errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.errorMessage,\n )}\n role='alert'\n data-test-id={getDataTestId(dataTestId, 'error')}\n >\n {errorMessage}\n </span>\n )}\n\n {hint && !errorMessage && (\n <span\n className={cn(\n styles.sub,\n {\n [styles.tag]: type === 'tag',\n },\n commonStyles.hint,\n )}\n data-test-id={getDataTestId(dataTestId, 'hint')}\n >\n {hint}\n </span>\n )}\n </div>\n );\n },\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupDesktopProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupDesktop: React.ForwardRefExoticComponent<RadioGroupDesktopProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BaseRadioGroupProps } from '../components/base-radio-group';
|
|
3
|
-
export
|
|
3
|
+
export type RadioGroupMobileProps = Omit<BaseRadioGroupProps, 'styles'>;
|
|
4
4
|
export declare const RadioGroupMobile: React.ForwardRefExoticComponent<RadioGroupMobileProps & React.RefAttributes<HTMLDivElement>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-radio-group",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.3",
|
|
4
4
|
"description": "Radio group",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"main": "index.js",
|
|
11
11
|
"module": "./esm/index.js",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@alfalab/core-components-mq": "^6.0.
|
|
14
|
-
"@alfalab/core-components-shared": "^2.1.
|
|
13
|
+
"@alfalab/core-components-mq": "^6.0.3",
|
|
14
|
+
"@alfalab/core-components-shared": "^2.1.1",
|
|
15
15
|
"@alfalab/hooks": "^1.13.1",
|
|
16
16
|
"classnames": "^2.5.1",
|
|
17
17
|
"tslib": "^2.4.0"
|
|
@@ -24,6 +24,6 @@
|
|
|
24
24
|
"access": "public",
|
|
25
25
|
"directory": "dist"
|
|
26
26
|
},
|
|
27
|
-
"themesVersion": "15.0.
|
|
28
|
-
"varsVersion": "11.0.
|
|
27
|
+
"themesVersion": "15.0.2",
|
|
28
|
+
"varsVersion": "11.0.2"
|
|
29
29
|
}
|
package/src/vars.css
CHANGED