@cloud-ru/ds-accordion 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/LICENSE +201 -0
- package/README.md +484 -0
- package/dist/cjs/Accordion.d.ts +160 -0
- package/dist/cjs/Accordion.js +21 -0
- package/dist/cjs/components/CollapseBlock/CollapseBlock.d.ts +45 -0
- package/dist/cjs/components/CollapseBlock/CollapseBlock.js +47 -0
- package/dist/cjs/components/CollapseBlock/hooks.d.ts +12 -0
- package/dist/cjs/components/CollapseBlock/hooks.js +43 -0
- package/dist/cjs/components/CollapseBlock/index.d.ts +1 -0
- package/dist/cjs/components/CollapseBlock/index.js +17 -0
- package/dist/cjs/components/CollapseBlock/styles.module.css +480 -0
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/index.js +17 -0
- package/dist/cjs/constants.d.ts +22 -0
- package/dist/cjs/constants.js +25 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/style.css +480 -0
- package/dist/cjs/types.d.ts +5 -0
- package/dist/cjs/types.js +2 -0
- package/dist/esm/Accordion.d.ts +160 -0
- package/dist/esm/Accordion.js +18 -0
- package/dist/esm/components/CollapseBlock/CollapseBlock.d.ts +45 -0
- package/dist/esm/components/CollapseBlock/CollapseBlock.js +40 -0
- package/dist/esm/components/CollapseBlock/hooks.d.ts +12 -0
- package/dist/esm/components/CollapseBlock/hooks.js +40 -0
- package/dist/esm/components/CollapseBlock/index.d.ts +1 -0
- package/dist/esm/components/CollapseBlock/index.js +1 -0
- package/dist/esm/components/CollapseBlock/styles.module.css +480 -0
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.js +1 -0
- package/dist/esm/constants.d.ts +22 -0
- package/dist/esm/constants.js +22 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/style.css +480 -0
- package/dist/esm/types.d.ts +5 -0
- package/dist/esm/types.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +49 -0
- package/src/Accordion.tsx +51 -0
- package/src/components/CollapseBlock/CollapseBlock.tsx +194 -0
- package/src/components/CollapseBlock/hooks.ts +49 -0
- package/src/components/CollapseBlock/index.ts +1 -0
- package/src/components/CollapseBlock/styles.module.scss +207 -0
- package/src/components/index.ts +1 -0
- package/src/constants.ts +26 -0
- package/src/index.ts +4 -0
- package/src/types.ts +9 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Accordion = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const toggles_1 = require("@cloud-ru/ds-toggles");
|
|
6
|
+
const CollapseBlock_1 = require("./components/CollapseBlock");
|
|
7
|
+
function AccordionBase({ selectionMode = toggles_1.SELECTION_MODE.Single, onExpandedChange, expandedDefault, expanded, children, }) {
|
|
8
|
+
const toggleGroupProps = {
|
|
9
|
+
selectionMode,
|
|
10
|
+
defaultValue: expandedDefault,
|
|
11
|
+
value: expanded,
|
|
12
|
+
onChange: onExpandedChange,
|
|
13
|
+
children,
|
|
14
|
+
};
|
|
15
|
+
return (0, jsx_runtime_1.jsx)(toggles_1.ToggleGroup, { ...toggleGroupProps });
|
|
16
|
+
}
|
|
17
|
+
exports.Accordion = Object.assign(AccordionBase, {
|
|
18
|
+
CollapseBlockPrimary: CollapseBlock_1.CollapseBlockPrimary,
|
|
19
|
+
CollapseBlockSecondary: CollapseBlock_1.CollapseBlockSecondary,
|
|
20
|
+
CollapseBlockTertiary: CollapseBlock_1.CollapseBlockTertiary,
|
|
21
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type BackgroundPredefinedFill } from '@cloud-ru/ds-materials';
|
|
2
|
+
import { WithSupportProps } from '@cloud-ru/ds-utils';
|
|
3
|
+
import { PropsWithChildren, ReactNode } from 'react';
|
|
4
|
+
import { ChevronPosition, View } from '../../types';
|
|
5
|
+
type Component = 'accordionPrimary' | 'accordionSecondary' | 'accordionTertiary';
|
|
6
|
+
export type CollapseBlockProps = PropsWithChildren<WithSupportProps<{
|
|
7
|
+
/** Уникальный идентификатор блока в группе переключателей */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Начальное состояние раскрытия (uncontrolled) */
|
|
10
|
+
title?: string;
|
|
11
|
+
/** Контент справа от заголовка */
|
|
12
|
+
afterTitle?: ReactNode;
|
|
13
|
+
/** Подзаголовок под строкой заголовка */
|
|
14
|
+
subTitle?: ReactNode;
|
|
15
|
+
/** Дополнительный класс корневого элемента */
|
|
16
|
+
className?: string;
|
|
17
|
+
/** Визуальный вариант обложки (`simple`, `outline`, `elevated`) */
|
|
18
|
+
view?: View;
|
|
19
|
+
/** Положение шеврона-раскрытия относительно текста (`before` | `after`) */
|
|
20
|
+
chevronPosition?: ChevronPosition;
|
|
21
|
+
/** Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию `true`) */
|
|
22
|
+
showChevron?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Слой backgroundPredefined + acrylic (см. `BACKGROUND_PREDEFINED_FILL` в `@cloud-ru/ds-materials`).
|
|
25
|
+
* По умолчанию `material/neutralBackground1Level`.
|
|
26
|
+
*/
|
|
27
|
+
backgroundPredefined?: BackgroundPredefinedFill;
|
|
28
|
+
/** Уровень аккордеона: размер типографики и отступы */
|
|
29
|
+
component: Component;
|
|
30
|
+
/** Оставлять ли контент в DOM при сворачивании */
|
|
31
|
+
keepMounted?: boolean;
|
|
32
|
+
}>>;
|
|
33
|
+
/**
|
|
34
|
+
* Элемент аккордеона: заголовок, шеврон и раскрываемая область с контентом.
|
|
35
|
+
*/
|
|
36
|
+
export declare function CollapseBlock({ id, title, afterTitle, subTitle, children, className, view, chevronPosition, backgroundPredefined, keepMounted, component, showChevron, 'data-test-id': dataTestId, ...rest }: CollapseBlockProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export type CollapseBlockComponent = CollapseBlockProps['component'];
|
|
38
|
+
type CollapseBlockPropsWithoutComponent = Omit<CollapseBlockProps, 'component'>;
|
|
39
|
+
export type CollapseBlockPrimaryProps = CollapseBlockPropsWithoutComponent;
|
|
40
|
+
export declare const CollapseBlockPrimary: (props: CollapseBlockPropsWithoutComponent) => import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
export type CollapseBlockSecondaryProps = CollapseBlockPropsWithoutComponent;
|
|
42
|
+
export declare const CollapseBlockSecondary: (props: CollapseBlockPropsWithoutComponent) => import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
export type CollapseBlockTertiaryProps = Omit<CollapseBlockPropsWithoutComponent, 'view' | 'backgroundPredefined'>;
|
|
44
|
+
export declare const CollapseBlockTertiary: (props: CollapseBlockTertiaryProps) => import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CollapseBlockTertiary = exports.CollapseBlockSecondary = exports.CollapseBlockPrimary = void 0;
|
|
7
|
+
exports.CollapseBlock = CollapseBlock;
|
|
8
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
9
|
+
const button_1 = require("@cloud-ru/ds-button");
|
|
10
|
+
const system_1 = require("@cloud-ru/ds-icons/interface/system");
|
|
11
|
+
const materials_1 = require("@cloud-ru/ds-materials");
|
|
12
|
+
const theme_1 = require("@cloud-ru/ds-theme");
|
|
13
|
+
const truncate_string_1 = require("@cloud-ru/ds-truncate-string");
|
|
14
|
+
const typography_1 = require("@cloud-ru/ds-typography");
|
|
15
|
+
const utils_1 = require("@cloud-ru/ds-utils");
|
|
16
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
17
|
+
const constants_1 = require("../../constants");
|
|
18
|
+
const hooks_1 = require("./hooks");
|
|
19
|
+
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
20
|
+
const MAP_COMPONENT_TO_TILE_SIZE = {
|
|
21
|
+
accordionPrimary: 'l',
|
|
22
|
+
accordionSecondary: 'm',
|
|
23
|
+
accordionTertiary: 's',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Элемент аккордеона: заголовок, шеврон и раскрываемая область с контентом.
|
|
27
|
+
*/
|
|
28
|
+
function CollapseBlock({ id, title, afterTitle, subTitle, children, className, view = constants_1.VIEW.Simple, chevronPosition = constants_1.CHEVRON_POSITION.After, backgroundPredefined = materials_1.BACKGROUND_PREDEFINED_FILL.NeutralBackground1Level, keepMounted = false, component, showChevron = true, 'data-test-id': dataTestId, ...rest }) {
|
|
29
|
+
const { isOpen, isMounted, toggleOpen, isCompletelyOpen, isCompletelyClose } = (0, hooks_1.useCollapseState)({
|
|
30
|
+
id,
|
|
31
|
+
keepMounted,
|
|
32
|
+
});
|
|
33
|
+
const { appearance, level } = (0, materials_1.backgroundPredefinedFillToAcrylic)(backgroundPredefined);
|
|
34
|
+
// Фиксируем density, остальные оси (colorScheme/brand/…) наследуем из контекста темы.
|
|
35
|
+
const themeClassName = (0, theme_1.useThemeClassnames)({ density: 'compact' });
|
|
36
|
+
return ((0, jsx_runtime_1.jsxs)("div", { ...(0, utils_1.extractSupportProps)(rest), className: (0, classnames_1.default)(styles_module_scss_1.default.wrapper, className), "data-acrylic-appearance": appearance, "data-acrylic-level": level, "data-expanded": isOpen, "data-completely-open": isCompletelyOpen || undefined, "data-view": view, "data-component": component, "data-test-id": dataTestId ?? constants_1.TEST_IDS.collapseBlock, style: {
|
|
37
|
+
'--sn-collapse-block-animation-duration': `${constants_1.ANIMATION_DURATION}ms`,
|
|
38
|
+
}, children: [component !== 'accordionTertiary' && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.acrylic }), view === constants_1.VIEW.Outline && (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.stateLayer, "data-state": 'borderOnBackground' })] })), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.titleContent, "data-expanded": isOpen || undefined, "data-completely-close": isCompletelyClose || undefined, "data-chevron-position": chevronPosition, onClick: toggleOpen, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.titleWrapper, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.titleLine, children: [title && ((0, jsx_runtime_1.jsx)(typography_1.Typography, { size: MAP_COMPONENT_TO_TILE_SIZE[component], variant: 'title', className: styles_module_scss_1.default.title, "data-test-id": constants_1.TEST_IDS.title, children: (0, jsx_runtime_1.jsx)(truncate_string_1.TruncateString, { text: title, variant: 'end' }) })), afterTitle && ((0, jsx_runtime_1.jsx)("div", { "data-test-id": constants_1.TEST_IDS.afterTitle, className: styles_module_scss_1.default.afterTitle, children: afterTitle }))] }), subTitle && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.subTitle, "data-test-id": constants_1.TEST_IDS.subTitle, children: subTitle }))] }), showChevron && ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.chevronWrapper, themeClassName), children: (0, jsx_runtime_1.jsx)(button_1.Button, { view: 'function', size: 'm', icon: isOpen ? (0, jsx_runtime_1.jsx)(system_1.ChevronUpSVG, {}) : (0, jsx_runtime_1.jsx)(system_1.ChevronDownSVG, {}), "data-test-id": constants_1.TEST_IDS.chevron, appearance: 'neutral' }) }))] }), (0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.collapse, "data-expanded": isOpen || undefined, "aria-hidden": !isOpen, children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.container, isCompletelyOpen && styles_module_scss_1.default.containerCompletelyOpen), "data-completely-close": isCompletelyClose || undefined, "data-expanded": isOpen || undefined, children: [(0, jsx_runtime_1.jsx)("div", {}), isMounted ? ((0, jsx_runtime_1.jsx)("div", { "data-test-id": constants_1.TEST_IDS.content, className: styles_module_scss_1.default.content, children: children })) : null] }) })] }));
|
|
39
|
+
}
|
|
40
|
+
function getCollapseBlock(component) {
|
|
41
|
+
return function CollapseBlockWithComponent(props) {
|
|
42
|
+
return (0, jsx_runtime_1.jsx)(CollapseBlock, { ...props, component: component });
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
exports.CollapseBlockPrimary = getCollapseBlock('accordionPrimary');
|
|
46
|
+
exports.CollapseBlockSecondary = getCollapseBlock('accordionSecondary');
|
|
47
|
+
exports.CollapseBlockTertiary = getCollapseBlock('accordionTertiary');
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type UseCollapseStateProps = {
|
|
2
|
+
id: string;
|
|
3
|
+
keepMounted?: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare function useCollapseState({ id, keepMounted }: UseCollapseStateProps): {
|
|
6
|
+
isOpen: boolean;
|
|
7
|
+
isMounted: boolean;
|
|
8
|
+
toggleOpen: () => void;
|
|
9
|
+
isCompletelyOpen: boolean;
|
|
10
|
+
isCompletelyClose: boolean;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useCollapseState = useCollapseState;
|
|
4
|
+
const toggles_1 = require("@cloud-ru/ds-toggles");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
function useCollapseState({ id, keepMounted = false }) {
|
|
8
|
+
const { isChecked: isOpen, handleClick: toggleOpen } = (0, toggles_1.useToggleGroup)({ value: id });
|
|
9
|
+
// Контент доживает до конца закрывающей анимации, но при открытии появляется синхронно с
|
|
10
|
+
// `isOpen` — если монтировать его эффектом, первый кадр раскрытия считается по пустому телу
|
|
11
|
+
// и высота стартует рывком.
|
|
12
|
+
const [keepMountedWhileClosing, setKeepMountedWhileClosing] = (0, react_1.useState)(false);
|
|
13
|
+
const isMounted = isOpen || keepMounted || keepMountedWhileClosing;
|
|
14
|
+
const [isCompletelyOpen, setIsCompletelyOpen] = (0, react_1.useState)(isOpen);
|
|
15
|
+
const [isCompletelyClose, setIsCompletelyClose] = (0, react_1.useState)(!isOpen);
|
|
16
|
+
const timeoutRef = (0, react_1.useRef)(null);
|
|
17
|
+
(0, react_1.useEffect)(() => {
|
|
18
|
+
if (isOpen) {
|
|
19
|
+
setKeepMountedWhileClosing(true);
|
|
20
|
+
setIsCompletelyClose(false);
|
|
21
|
+
timeoutRef.current = setTimeout(() => {
|
|
22
|
+
setIsCompletelyOpen(true);
|
|
23
|
+
}, constants_1.ANIMATION_DURATION);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
setIsCompletelyOpen(false);
|
|
27
|
+
timeoutRef.current = setTimeout(() => {
|
|
28
|
+
setIsCompletelyClose(true);
|
|
29
|
+
setKeepMountedWhileClosing(false);
|
|
30
|
+
}, constants_1.ANIMATION_DURATION);
|
|
31
|
+
}
|
|
32
|
+
return () => {
|
|
33
|
+
timeoutRef.current && clearTimeout(timeoutRef.current);
|
|
34
|
+
};
|
|
35
|
+
}, [isOpen, keepMounted]);
|
|
36
|
+
return {
|
|
37
|
+
isOpen,
|
|
38
|
+
isMounted,
|
|
39
|
+
toggleOpen,
|
|
40
|
+
isCompletelyOpen,
|
|
41
|
+
isCompletelyClose,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './CollapseBlock';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./CollapseBlock"), exports);
|