react-science 15.0.0 → 16.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/lib/components/accordion/accordion.d.ts +29 -7
- package/lib/components/accordion/accordion.d.ts.map +1 -1
- package/lib/components/accordion/accordion.js +24 -9
- package/lib/components/accordion/accordion.js.map +1 -1
- package/lib/components/accordion/accordion_context.d.ts +8 -15
- package/lib/components/accordion/accordion_context.d.ts.map +1 -1
- package/lib/components/accordion/accordion_context.js +7 -25
- package/lib/components/accordion/accordion_context.js.map +1 -1
- package/lib/components/accordion/accordion_context_provider.d.ts +7 -0
- package/lib/components/accordion/accordion_context_provider.d.ts.map +1 -0
- package/lib/components/accordion/accordion_context_provider.js +62 -0
- package/lib/components/accordion/accordion_context_provider.js.map +1 -0
- package/lib/components/accordion/accordion_context_utils.d.ts +15 -0
- package/lib/components/accordion/accordion_context_utils.d.ts.map +1 -0
- package/lib/components/accordion/accordion_context_utils.js +4 -0
- package/lib/components/accordion/accordion_context_utils.js.map +1 -0
- package/lib/components/accordion/accordion_hooks.d.ts +8 -0
- package/lib/components/accordion/accordion_hooks.d.ts.map +1 -0
- package/lib/components/accordion/accordion_hooks.js +16 -0
- package/lib/components/accordion/accordion_hooks.js.map +1 -0
- package/lib/components/accordion/index.d.ts +2 -3
- package/lib/components/accordion/index.d.ts.map +1 -1
- package/lib/components/accordion/index.js +2 -3
- package/lib/components/accordion/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/accordion/accordion.tsx +65 -20
- package/src/components/accordion/accordion_context.ts +17 -37
- package/src/components/accordion/accordion_context_provider.tsx +79 -0
- package/src/components/accordion/accordion_context_utils.ts +22 -0
- package/src/components/accordion/accordion_hooks.ts +32 -0
- package/src/components/accordion/index.ts +2 -6
- package/lib/components/accordion/accordion_context.provider.d.ts +0 -13
- package/lib/components/accordion/accordion_context.provider.d.ts.map +0 -1
- package/lib/components/accordion/accordion_context.provider.js +0 -55
- package/lib/components/accordion/accordion_context.provider.js.map +0 -1
- package/lib/components/accordion/accordion_context.utils.d.ts +0 -23
- package/lib/components/accordion/accordion_context.utils.d.ts.map +0 -1
- package/lib/components/accordion/accordion_context.utils.js +0 -40
- package/lib/components/accordion/accordion_context.utils.js.map +0 -1
- package/src/components/accordion/accordion_context.provider.tsx +0 -91
- package/src/components/accordion/accordion_context.utils.ts +0 -66
|
@@ -1,20 +1,42 @@
|
|
|
1
1
|
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
-
export interface AccordionProps {
|
|
3
|
-
children?: Array<ReactElement<AccordionItemProps
|
|
2
|
+
export interface AccordionProps<T extends string = string> {
|
|
3
|
+
children?: Array<ReactElement<AccordionItemProps<T>>> | ReactElement<AccordionItemProps<T>> | boolean | null;
|
|
4
4
|
}
|
|
5
|
-
export interface AccordionItemProps {
|
|
5
|
+
export interface AccordionItemProps<T extends string = string> {
|
|
6
|
+
/**
|
|
7
|
+
* A value uniquely identifying the accordion item.
|
|
8
|
+
*/
|
|
9
|
+
id: T;
|
|
10
|
+
/**
|
|
11
|
+
* The title of the accordion item.
|
|
12
|
+
*/
|
|
6
13
|
title: string;
|
|
7
14
|
children: ReactNode;
|
|
8
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Defines whether the accordion item is initially open.
|
|
17
|
+
* This prop has no effect if the `open` prop is used.
|
|
18
|
+
* A value of `true` means the accordion item is initially open.
|
|
19
|
+
* A value of `false` means the accordion item is initially closed.
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
defaultOpen?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Controls the open state of the accordion item.
|
|
25
|
+
*/
|
|
26
|
+
open?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Called whenever the open state of the pane changes.
|
|
29
|
+
*/
|
|
30
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
9
31
|
/**
|
|
10
32
|
* When set to true, the item's children will not be rendered if the item is closed.
|
|
11
33
|
* When not set or set to false, the item's children will be rendered but hidden when the item is closed.
|
|
12
34
|
*/
|
|
13
35
|
unmountChildren?: boolean;
|
|
14
|
-
|
|
36
|
+
renderToolbar?: (isOpen: boolean) => ReactNode;
|
|
15
37
|
}
|
|
16
|
-
export declare function Accordion(props: AccordionProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
export declare function Accordion<T extends string = string>(props: AccordionProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
17
39
|
export declare namespace Accordion {
|
|
18
|
-
var Item: (props: AccordionItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
var Item: <T extends string = string>(props: AccordionItemProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
19
41
|
}
|
|
20
42
|
//# sourceMappingURL=accordion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAKf,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACvD,QAAQ,CAAC,EACL,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,GAC1C,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GACnC,OAAO,GACP,IAAI,CAAC;CACV;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3D;;OAEG;IACH,EAAE,EAAE,CAAC,CAAC;IACN;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC;CAChD;AAkCD,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,2CAE5E;yBAFe,SAAS;eAIe,CAAC,SAAS,MAAM,kBAC/C,kBAAkB,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Colors } from '@blueprintjs/core';
|
|
2
3
|
import styled from '@emotion/styled';
|
|
4
|
+
import { useControllableState } from '@radix-ui/react-use-controllable-state';
|
|
3
5
|
import { useCallback } from 'react';
|
|
4
6
|
import { useAccordionContext } from './accordion_context.js';
|
|
5
7
|
const AccordionItemHeader = styled.div `
|
|
@@ -12,11 +14,19 @@ const AccordionItemHeader = styled.div `
|
|
|
12
14
|
font-weight: bold;
|
|
13
15
|
text-decoration: none;
|
|
14
16
|
text-shadow: white 0 1px 0;
|
|
15
|
-
background: white
|
|
17
|
+
background: white
|
|
18
|
+
linear-gradient(${Colors.LIGHT_GRAY5} 5%, ${Colors.LIGHT_GRAY3} 100%) repeat
|
|
19
|
+
scroll 0 0;
|
|
16
20
|
width: 100%;
|
|
17
21
|
user-select: none;
|
|
18
22
|
justify-content: space-between;
|
|
19
|
-
padding:
|
|
23
|
+
padding-left: 12px;
|
|
24
|
+
|
|
25
|
+
&:hover {
|
|
26
|
+
background: white
|
|
27
|
+
linear-gradient(${Colors.LIGHT_GRAY4} 5%, ${Colors.LIGHT_GRAY2} 100%)
|
|
28
|
+
repeat scroll 0 0;
|
|
29
|
+
}
|
|
20
30
|
`;
|
|
21
31
|
const AccordionContainer = styled.div `
|
|
22
32
|
display: flex;
|
|
@@ -28,29 +38,34 @@ export function Accordion(props) {
|
|
|
28
38
|
return _jsx(AccordionContainer, { children: props.children });
|
|
29
39
|
}
|
|
30
40
|
Accordion.Item = function AccordionItem(props) {
|
|
31
|
-
const { title, children,
|
|
32
|
-
const
|
|
41
|
+
const { id, title, children, defaultOpen = false, open, renderToolbar, onOpenChange, } = props;
|
|
42
|
+
const [isOpen, setIsOpen] = useControllableState({
|
|
43
|
+
prop: open,
|
|
44
|
+
defaultProp: defaultOpen,
|
|
45
|
+
onChange: onOpenChange,
|
|
46
|
+
});
|
|
47
|
+
const { utils, unmountChildren } = useAccordionContext(id, setIsOpen);
|
|
33
48
|
const shouldUnmountChildren = props.unmountChildren === undefined
|
|
34
49
|
? unmountChildren
|
|
35
50
|
: props.unmountChildren;
|
|
36
51
|
const onClickHandle = useCallback((event) => {
|
|
37
52
|
if (event.shiftKey) {
|
|
38
|
-
utils.
|
|
53
|
+
utils.closeOthers();
|
|
39
54
|
}
|
|
40
55
|
else {
|
|
41
56
|
utils.toggle();
|
|
42
57
|
}
|
|
43
58
|
}, [utils]);
|
|
44
59
|
return (_jsxs("div", { style: {
|
|
45
|
-
flex:
|
|
60
|
+
flex: isOpen ? '1 1 1px' : 'none',
|
|
46
61
|
display: 'flex',
|
|
47
62
|
flexDirection: 'column',
|
|
48
63
|
isolation: 'isolate',
|
|
49
64
|
}, children: [_jsxs(AccordionItemHeader, { onClick: onClickHandle, role: "button", children: [_jsx("div", { style: {
|
|
50
65
|
padding: '5px 0px',
|
|
51
|
-
}, children: title }),
|
|
52
|
-
display:
|
|
53
|
-
flex:
|
|
66
|
+
}, children: title }), renderToolbar?.(isOpen ?? false)] }), !isOpen && shouldUnmountChildren ? null : (_jsx("div", { style: {
|
|
67
|
+
display: isOpen ? 'flex' : 'none',
|
|
68
|
+
flex: isOpen ? '1 1 1px' : 'none',
|
|
54
69
|
backgroundColor: 'white',
|
|
55
70
|
maxHeight: '100%',
|
|
56
71
|
overflow: 'hidden',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,21 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AccordionItemSetIsOpen, AccordionState } from './accordion_context_utils.js';
|
|
2
2
|
export type ContextType = [
|
|
3
3
|
AccordionContext,
|
|
4
4
|
{
|
|
5
|
-
|
|
6
|
-
toggle: (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
change: (
|
|
5
|
+
closeAllExcept: (except: string) => void;
|
|
6
|
+
toggle: (id: string) => void;
|
|
7
|
+
unregister: (id: string) => void;
|
|
8
|
+
register: (id: string, setIsOpen: AccordionItemSetIsOpen) => void;
|
|
9
|
+
change: (id: string, isOpen: boolean) => void;
|
|
10
10
|
}
|
|
11
11
|
];
|
|
12
12
|
type AccordionContext = AccordionState;
|
|
13
13
|
export declare const accordionContext: import("react").Context<ContextType | null>;
|
|
14
|
-
export declare function
|
|
15
|
-
open: (title: string) => void;
|
|
16
|
-
close: (title: string) => void;
|
|
17
|
-
};
|
|
18
|
-
export declare function useAccordionContext(title: string, defaultOpened?: boolean): {
|
|
19
|
-
item: AccordionItemState | undefined;
|
|
14
|
+
export declare function useAccordionContext(id: string, setIsOpen: AccordionItemSetIsOpen): {
|
|
20
15
|
unmountChildren: boolean;
|
|
21
16
|
utils: {
|
|
22
|
-
|
|
17
|
+
closeOthers: () => void;
|
|
23
18
|
toggle: () => void;
|
|
24
|
-
remove: () => void;
|
|
25
|
-
create: (defaultOpened?: boolean) => AccordionItemState;
|
|
26
19
|
};
|
|
27
20
|
};
|
|
28
21
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion_context.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"accordion_context.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACf,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB;IAChB;QACE,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;QACzC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;QACjC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,KAAK,IAAI,CAAC;QAClE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KAC/C;CACF,CAAC;AAEF,KAAK,gBAAgB,GAAG,cAAc,CAAC;AAEvC,eAAO,MAAM,gBAAgB,6CAA0C,CAAC;AAExE,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,sBAAsB;;;;;;EAyBlC"}
|
|
@@ -1,39 +1,21 @@
|
|
|
1
1
|
import { createContext, useContext, useEffect, useMemo } from 'react';
|
|
2
|
-
import { getItem } from './accordion_context.utils.js';
|
|
3
2
|
export const accordionContext = createContext(null);
|
|
4
|
-
export function
|
|
5
|
-
const context = useContext(accordionContext);
|
|
6
|
-
if (!context) {
|
|
7
|
-
throw new Error('AccordionContext was not found');
|
|
8
|
-
}
|
|
9
|
-
const [, utils] = context;
|
|
10
|
-
return useMemo(() => {
|
|
11
|
-
return {
|
|
12
|
-
open: (title) => utils.change(title, true),
|
|
13
|
-
close: (title) => utils.change(title, false),
|
|
14
|
-
};
|
|
15
|
-
}, [utils]);
|
|
16
|
-
}
|
|
17
|
-
export function useAccordionContext(title, defaultOpened) {
|
|
3
|
+
export function useAccordionContext(id, setIsOpen) {
|
|
18
4
|
const context = useContext(accordionContext);
|
|
19
5
|
if (!context) {
|
|
20
6
|
throw new Error('AccordionContext was not found');
|
|
21
7
|
}
|
|
22
8
|
const [state, utils] = context;
|
|
23
9
|
useEffect(() => {
|
|
24
|
-
utils.
|
|
25
|
-
return () => utils.
|
|
26
|
-
}, [
|
|
27
|
-
const item = getItem(title, state.items);
|
|
10
|
+
utils.register(id, setIsOpen);
|
|
11
|
+
return () => utils.unregister(id);
|
|
12
|
+
}, [id, utils, setIsOpen]);
|
|
28
13
|
return useMemo(() => ({
|
|
29
|
-
item,
|
|
30
14
|
unmountChildren: state.unmountChildren,
|
|
31
15
|
utils: {
|
|
32
|
-
|
|
33
|
-
toggle: () => utils.toggle(
|
|
34
|
-
remove: () => utils.remove(title),
|
|
35
|
-
create: (defaultOpened) => utils.create(title, defaultOpened),
|
|
16
|
+
closeOthers: () => utils.closeAllExcept(id),
|
|
17
|
+
toggle: () => utils.toggle(id),
|
|
36
18
|
},
|
|
37
|
-
}), [
|
|
19
|
+
}), [id, utils, state.unmountChildren]);
|
|
38
20
|
}
|
|
39
21
|
//# sourceMappingURL=accordion_context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion_context.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"accordion_context.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAoBtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAqB,IAAI,CAAC,CAAC;AAExE,MAAM,UAAU,mBAAmB,CACjC,EAAU,EACV,SAAiC;IAEjC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAE3B,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,KAAK,EAAE;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;SAC/B;KACF,CAAC,EACF,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,CACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface AccordionProviderProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
unmountChildren?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function AccordionProvider(props: AccordionProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=accordion_context_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion_context_provider.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context_provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CA+D9D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useRef } from 'react';
|
|
3
|
+
import { assert } from '../utils/index.js';
|
|
4
|
+
import { accordionContext } from './accordion_context.js';
|
|
5
|
+
import { getAccordionRegister } from './accordion_context_utils.js';
|
|
6
|
+
export function AccordionProvider(props) {
|
|
7
|
+
const { unmountChildren = false, children } = props;
|
|
8
|
+
const registerRef = useRef(getAccordionRegister());
|
|
9
|
+
const utils = useMemo(() => {
|
|
10
|
+
return {
|
|
11
|
+
change: (id, isOpen) => {
|
|
12
|
+
assert(registerRef.current);
|
|
13
|
+
const item = registerRef.current.get(id);
|
|
14
|
+
if (item) {
|
|
15
|
+
item.setIsOpen(isOpen);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
closeAllExcept: (id) => {
|
|
19
|
+
assert(registerRef.current);
|
|
20
|
+
for (const [key, item] of registerRef.current.entries()) {
|
|
21
|
+
if (key === id) {
|
|
22
|
+
item.setIsOpen(true);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
item.setIsOpen(false);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
toggle: (id) => {
|
|
30
|
+
assert(registerRef.current);
|
|
31
|
+
const item = registerRef.current.get(id);
|
|
32
|
+
if (item) {
|
|
33
|
+
item.setIsOpen((prevState) => !prevState);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
unregister: (id) => {
|
|
37
|
+
assert(registerRef.current);
|
|
38
|
+
registerRef.current.delete(id);
|
|
39
|
+
},
|
|
40
|
+
register: (id, setIsOpen) => {
|
|
41
|
+
assert(registerRef.current);
|
|
42
|
+
const item = registerRef.current.get(id);
|
|
43
|
+
if (item !== undefined) {
|
|
44
|
+
throw new Error(`Accordion item with title "${id}" already exists. Using non-unique titles can lead to unexpected behavior.`);
|
|
45
|
+
}
|
|
46
|
+
registerRef.current.set(id, {
|
|
47
|
+
setIsOpen,
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}, [registerRef]);
|
|
52
|
+
const contextValue = useMemo(() => {
|
|
53
|
+
return [
|
|
54
|
+
{
|
|
55
|
+
unmountChildren,
|
|
56
|
+
},
|
|
57
|
+
utils,
|
|
58
|
+
];
|
|
59
|
+
}, [unmountChildren, utils]);
|
|
60
|
+
return (_jsx(accordionContext.Provider, { value: contextValue, children: children }));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=accordion_context_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion_context_provider.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context_provider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
export interface AccordionItemState {
|
|
3
|
+
title: string;
|
|
4
|
+
onChange: AccordionItemSetIsOpen;
|
|
5
|
+
}
|
|
6
|
+
export interface AccordionState {
|
|
7
|
+
unmountChildren: boolean;
|
|
8
|
+
}
|
|
9
|
+
export type AccordionItemSetIsOpen = Dispatch<SetStateAction<boolean | undefined>>;
|
|
10
|
+
interface AccordionRegisteredItem {
|
|
11
|
+
setIsOpen: AccordionItemSetIsOpen;
|
|
12
|
+
}
|
|
13
|
+
export declare function getAccordionRegister(): Map<string, AccordionRegisteredItem>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=accordion_context_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion_context_utils.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAC3C,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC,CACpC,CAAC;AAEF,UAAU,uBAAuB;IAC/B,SAAS,EAAE,sBAAsB,CAAC;CACnC;AAED,wBAAgB,oBAAoB,yCAEnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion_context_utils.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context_utils.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,GAAG,EAAmC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface AccordionControls<T extends string = string> {
|
|
2
|
+
open: (id: T) => void;
|
|
3
|
+
close: (id: T) => void;
|
|
4
|
+
toggle: (id: T) => void;
|
|
5
|
+
closeAllExcept: (except: T) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function useAccordionControls<T extends string = string>(): AccordionControls<T>;
|
|
8
|
+
//# sourceMappingURL=accordion_hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion_hooks.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_hooks.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC1D,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;IACtB,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;IACvB,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;IACxB,cAAc,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,oBAAoB,CAClC,CAAC,SAAS,MAAM,GAAG,MAAM,KACtB,iBAAiB,CAAC,CAAC,CAAC,CAkBxB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useContext, useMemo } from 'react';
|
|
2
|
+
import { accordionContext } from './accordion_context.js';
|
|
3
|
+
export function useAccordionControls() {
|
|
4
|
+
const context = useContext(accordionContext);
|
|
5
|
+
if (!context) {
|
|
6
|
+
throw new Error('AccordionContext was not found');
|
|
7
|
+
}
|
|
8
|
+
const [, utils] = context;
|
|
9
|
+
return useMemo(() => ({
|
|
10
|
+
open: (id) => utils.change(id, true),
|
|
11
|
+
close: (id) => utils.change(id, false),
|
|
12
|
+
toggle: (id) => utils.toggle(id),
|
|
13
|
+
closeAllExcept: (except) => utils.closeAllExcept(except),
|
|
14
|
+
}), [utils]);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=accordion_hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion_hooks.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,MAAM,UAAU,oBAAoB;IAGlC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;IAE1B,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,IAAI,EAAE,CAAC,EAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC;QACvC,KAAK,EAAE,CAAC,EAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;QACzC,MAAM,EAAE,CAAC,EAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,cAAc,EAAE,CAAC,MAAS,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;KAC5D,CAAC,EACF,CAAC,KAAK,CAAC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export * from './accordion.js';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export { AccordionProvider } from './accordion_context.provider.js';
|
|
2
|
+
export * from './accordion_context_provider.js';
|
|
3
|
+
export * from './accordion_hooks.js';
|
|
5
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export * from './accordion.js';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export { AccordionProvider } from './accordion_context.provider.js';
|
|
2
|
+
export * from './accordion_context_provider.js';
|
|
3
|
+
export * from './accordion_hooks.js';
|
|
5
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/accordion/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/accordion/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { Colors } from '@blueprintjs/core';
|
|
1
2
|
import styled from '@emotion/styled';
|
|
3
|
+
import { useControllableState } from '@radix-ui/react-use-controllable-state';
|
|
2
4
|
import type {
|
|
3
5
|
MouseEvent as ReactMouseEvent,
|
|
4
6
|
ReactElement,
|
|
@@ -8,24 +10,46 @@ import { useCallback } from 'react';
|
|
|
8
10
|
|
|
9
11
|
import { useAccordionContext } from './accordion_context.js';
|
|
10
12
|
|
|
11
|
-
export interface AccordionProps {
|
|
13
|
+
export interface AccordionProps<T extends string = string> {
|
|
12
14
|
children?:
|
|
13
|
-
| Array<ReactElement<AccordionItemProps
|
|
14
|
-
| ReactElement<AccordionItemProps
|
|
15
|
+
| Array<ReactElement<AccordionItemProps<T>>>
|
|
16
|
+
| ReactElement<AccordionItemProps<T>>
|
|
15
17
|
| boolean
|
|
16
18
|
| null;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
export interface AccordionItemProps {
|
|
21
|
+
export interface AccordionItemProps<T extends string = string> {
|
|
22
|
+
/**
|
|
23
|
+
* A value uniquely identifying the accordion item.
|
|
24
|
+
*/
|
|
25
|
+
id: T;
|
|
26
|
+
/**
|
|
27
|
+
* The title of the accordion item.
|
|
28
|
+
*/
|
|
20
29
|
title: string;
|
|
21
30
|
children: ReactNode;
|
|
22
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Defines whether the accordion item is initially open.
|
|
33
|
+
* This prop has no effect if the `open` prop is used.
|
|
34
|
+
* A value of `true` means the accordion item is initially open.
|
|
35
|
+
* A value of `false` means the accordion item is initially closed.
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
defaultOpen?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Controls the open state of the accordion item.
|
|
41
|
+
*/
|
|
42
|
+
open?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Called whenever the open state of the pane changes.
|
|
45
|
+
*/
|
|
46
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
23
47
|
/**
|
|
24
48
|
* When set to true, the item's children will not be rendered if the item is closed.
|
|
25
49
|
* When not set or set to false, the item's children will be rendered but hidden when the item is closed.
|
|
26
50
|
*/
|
|
27
51
|
unmountChildren?: boolean;
|
|
28
|
-
|
|
52
|
+
renderToolbar?: (isOpen: boolean) => ReactNode;
|
|
29
53
|
}
|
|
30
54
|
|
|
31
55
|
const AccordionItemHeader = styled.div`
|
|
@@ -38,11 +62,19 @@ const AccordionItemHeader = styled.div`
|
|
|
38
62
|
font-weight: bold;
|
|
39
63
|
text-decoration: none;
|
|
40
64
|
text-shadow: white 0 1px 0;
|
|
41
|
-
background: white
|
|
65
|
+
background: white
|
|
66
|
+
linear-gradient(${Colors.LIGHT_GRAY5} 5%, ${Colors.LIGHT_GRAY3} 100%) repeat
|
|
67
|
+
scroll 0 0;
|
|
42
68
|
width: 100%;
|
|
43
69
|
user-select: none;
|
|
44
70
|
justify-content: space-between;
|
|
45
|
-
padding:
|
|
71
|
+
padding-left: 12px;
|
|
72
|
+
|
|
73
|
+
&:hover {
|
|
74
|
+
background: white
|
|
75
|
+
linear-gradient(${Colors.LIGHT_GRAY4} 5%, ${Colors.LIGHT_GRAY2} 100%)
|
|
76
|
+
repeat scroll 0 0;
|
|
77
|
+
}
|
|
46
78
|
`;
|
|
47
79
|
|
|
48
80
|
const AccordionContainer = styled.div`
|
|
@@ -52,16 +84,29 @@ const AccordionContainer = styled.div`
|
|
|
52
84
|
width: 100%;
|
|
53
85
|
`;
|
|
54
86
|
|
|
55
|
-
export function Accordion(props: AccordionProps) {
|
|
87
|
+
export function Accordion<T extends string = string>(props: AccordionProps<T>) {
|
|
56
88
|
return <AccordionContainer>{props.children}</AccordionContainer>;
|
|
57
89
|
}
|
|
58
90
|
|
|
59
|
-
Accordion.Item = function AccordionItem
|
|
60
|
-
|
|
61
|
-
|
|
91
|
+
Accordion.Item = function AccordionItem<T extends string = string>(
|
|
92
|
+
props: AccordionItemProps<T>,
|
|
93
|
+
) {
|
|
94
|
+
const {
|
|
95
|
+
id,
|
|
62
96
|
title,
|
|
63
|
-
|
|
64
|
-
|
|
97
|
+
children,
|
|
98
|
+
defaultOpen = false,
|
|
99
|
+
open,
|
|
100
|
+
renderToolbar,
|
|
101
|
+
onOpenChange,
|
|
102
|
+
} = props;
|
|
103
|
+
|
|
104
|
+
const [isOpen, setIsOpen] = useControllableState({
|
|
105
|
+
prop: open,
|
|
106
|
+
defaultProp: defaultOpen,
|
|
107
|
+
onChange: onOpenChange,
|
|
108
|
+
});
|
|
109
|
+
const { utils, unmountChildren } = useAccordionContext(id, setIsOpen);
|
|
65
110
|
|
|
66
111
|
const shouldUnmountChildren =
|
|
67
112
|
props.unmountChildren === undefined
|
|
@@ -71,7 +116,7 @@ Accordion.Item = function AccordionItem(props: AccordionItemProps) {
|
|
|
71
116
|
const onClickHandle = useCallback(
|
|
72
117
|
(event: ReactMouseEvent<HTMLDivElement>) => {
|
|
73
118
|
if (event.shiftKey) {
|
|
74
|
-
utils.
|
|
119
|
+
utils.closeOthers();
|
|
75
120
|
} else {
|
|
76
121
|
utils.toggle();
|
|
77
122
|
}
|
|
@@ -82,7 +127,7 @@ Accordion.Item = function AccordionItem(props: AccordionItemProps) {
|
|
|
82
127
|
return (
|
|
83
128
|
<div
|
|
84
129
|
style={{
|
|
85
|
-
flex:
|
|
130
|
+
flex: isOpen ? '1 1 1px' : 'none',
|
|
86
131
|
display: 'flex',
|
|
87
132
|
flexDirection: 'column',
|
|
88
133
|
isolation: 'isolate',
|
|
@@ -96,13 +141,13 @@ Accordion.Item = function AccordionItem(props: AccordionItemProps) {
|
|
|
96
141
|
>
|
|
97
142
|
{title}
|
|
98
143
|
</div>
|
|
99
|
-
{
|
|
144
|
+
{renderToolbar?.(isOpen ?? false)}
|
|
100
145
|
</AccordionItemHeader>
|
|
101
|
-
{!
|
|
146
|
+
{!isOpen && shouldUnmountChildren ? null : (
|
|
102
147
|
<div
|
|
103
148
|
style={{
|
|
104
|
-
display:
|
|
105
|
-
flex:
|
|
149
|
+
display: isOpen ? 'flex' : 'none',
|
|
150
|
+
flex: isOpen ? '1 1 1px' : 'none',
|
|
106
151
|
backgroundColor: 'white',
|
|
107
152
|
maxHeight: '100%',
|
|
108
153
|
overflow: 'hidden',
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import { createContext, useContext, useEffect, useMemo } from 'react';
|
|
2
2
|
|
|
3
3
|
import type {
|
|
4
|
-
|
|
4
|
+
AccordionItemSetIsOpen,
|
|
5
5
|
AccordionState,
|
|
6
|
-
} from './
|
|
7
|
-
import { getItem } from './accordion_context.utils.js';
|
|
6
|
+
} from './accordion_context_utils.js';
|
|
8
7
|
|
|
9
8
|
export type ContextType = [
|
|
10
9
|
AccordionContext,
|
|
11
10
|
{
|
|
12
|
-
|
|
13
|
-
toggle: (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
change: (
|
|
11
|
+
closeAllExcept: (except: string) => void;
|
|
12
|
+
toggle: (id: string) => void;
|
|
13
|
+
unregister: (id: string) => void;
|
|
14
|
+
register: (id: string, setIsOpen: AccordionItemSetIsOpen) => void;
|
|
15
|
+
change: (id: string, isOpen: boolean) => void;
|
|
17
16
|
},
|
|
18
17
|
];
|
|
19
18
|
|
|
@@ -21,24 +20,10 @@ type AccordionContext = AccordionState;
|
|
|
21
20
|
|
|
22
21
|
export const accordionContext = createContext<ContextType | null>(null);
|
|
23
22
|
|
|
24
|
-
export function
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
throw new Error('AccordionContext was not found');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const [, utils] = context;
|
|
32
|
-
|
|
33
|
-
return useMemo(() => {
|
|
34
|
-
return {
|
|
35
|
-
open: (title: string) => utils.change(title, true),
|
|
36
|
-
close: (title: string) => utils.change(title, false),
|
|
37
|
-
};
|
|
38
|
-
}, [utils]);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function useAccordionContext(title: string, defaultOpened?: boolean) {
|
|
23
|
+
export function useAccordionContext(
|
|
24
|
+
id: string,
|
|
25
|
+
setIsOpen: AccordionItemSetIsOpen,
|
|
26
|
+
) {
|
|
42
27
|
const context = useContext(accordionContext);
|
|
43
28
|
|
|
44
29
|
if (!context) {
|
|
@@ -48,23 +33,18 @@ export function useAccordionContext(title: string, defaultOpened?: boolean) {
|
|
|
48
33
|
const [state, utils] = context;
|
|
49
34
|
|
|
50
35
|
useEffect(() => {
|
|
51
|
-
utils.
|
|
52
|
-
return () => utils.
|
|
53
|
-
}, [
|
|
54
|
-
|
|
55
|
-
const item = getItem(title, state.items);
|
|
36
|
+
utils.register(id, setIsOpen);
|
|
37
|
+
return () => utils.unregister(id);
|
|
38
|
+
}, [id, utils, setIsOpen]);
|
|
56
39
|
|
|
57
40
|
return useMemo(
|
|
58
41
|
() => ({
|
|
59
|
-
item,
|
|
60
42
|
unmountChildren: state.unmountChildren,
|
|
61
43
|
utils: {
|
|
62
|
-
|
|
63
|
-
toggle: () => utils.toggle(
|
|
64
|
-
remove: () => utils.remove(title),
|
|
65
|
-
create: (defaultOpened?: boolean) => utils.create(title, defaultOpened),
|
|
44
|
+
closeOthers: () => utils.closeAllExcept(id),
|
|
45
|
+
toggle: () => utils.toggle(id),
|
|
66
46
|
},
|
|
67
47
|
}),
|
|
68
|
-
[
|
|
48
|
+
[id, utils, state.unmountChildren],
|
|
69
49
|
);
|
|
70
50
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { useMemo, useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
import { assert } from '../utils/index.js';
|
|
5
|
+
|
|
6
|
+
import type { ContextType } from './accordion_context.js';
|
|
7
|
+
import { accordionContext } from './accordion_context.js';
|
|
8
|
+
import type { AccordionItemSetIsOpen } from './accordion_context_utils.js';
|
|
9
|
+
import { getAccordionRegister } from './accordion_context_utils.js';
|
|
10
|
+
|
|
11
|
+
export interface AccordionProviderProps {
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
unmountChildren?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function AccordionProvider(props: AccordionProviderProps) {
|
|
17
|
+
const { unmountChildren = false, children } = props;
|
|
18
|
+
const registerRef = useRef(getAccordionRegister());
|
|
19
|
+
|
|
20
|
+
const utils = useMemo<ContextType[1]>(() => {
|
|
21
|
+
return {
|
|
22
|
+
change: (id: string, isOpen: boolean) => {
|
|
23
|
+
assert(registerRef.current);
|
|
24
|
+
const item = registerRef.current.get(id);
|
|
25
|
+
if (item) {
|
|
26
|
+
item.setIsOpen(isOpen);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
closeAllExcept: (id: string) => {
|
|
30
|
+
assert(registerRef.current);
|
|
31
|
+
for (const [key, item] of registerRef.current.entries()) {
|
|
32
|
+
if (key === id) {
|
|
33
|
+
item.setIsOpen(true);
|
|
34
|
+
} else {
|
|
35
|
+
item.setIsOpen(false);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
toggle: (id: string) => {
|
|
40
|
+
assert(registerRef.current);
|
|
41
|
+
const item = registerRef.current.get(id);
|
|
42
|
+
if (item) {
|
|
43
|
+
item.setIsOpen((prevState) => !prevState);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
unregister: (id: string) => {
|
|
47
|
+
assert(registerRef.current);
|
|
48
|
+
registerRef.current.delete(id);
|
|
49
|
+
},
|
|
50
|
+
register: (id: string, setIsOpen: AccordionItemSetIsOpen) => {
|
|
51
|
+
assert(registerRef.current);
|
|
52
|
+
const item = registerRef.current.get(id);
|
|
53
|
+
if (item !== undefined) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`Accordion item with title "${id}" already exists. Using non-unique titles can lead to unexpected behavior.`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
registerRef.current.set(id, {
|
|
59
|
+
setIsOpen,
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}, [registerRef]);
|
|
64
|
+
|
|
65
|
+
const contextValue = useMemo<ContextType>(() => {
|
|
66
|
+
return [
|
|
67
|
+
{
|
|
68
|
+
unmountChildren,
|
|
69
|
+
},
|
|
70
|
+
utils,
|
|
71
|
+
];
|
|
72
|
+
}, [unmountChildren, utils]);
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<accordionContext.Provider value={contextValue}>
|
|
76
|
+
{children}
|
|
77
|
+
</accordionContext.Provider>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface AccordionItemState {
|
|
4
|
+
title: string;
|
|
5
|
+
onChange: AccordionItemSetIsOpen;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface AccordionState {
|
|
9
|
+
unmountChildren: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type AccordionItemSetIsOpen = Dispatch<
|
|
13
|
+
SetStateAction<boolean | undefined>
|
|
14
|
+
>;
|
|
15
|
+
|
|
16
|
+
interface AccordionRegisteredItem {
|
|
17
|
+
setIsOpen: AccordionItemSetIsOpen;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function getAccordionRegister() {
|
|
21
|
+
return new Map<string, AccordionRegisteredItem>();
|
|
22
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { useContext, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
import { accordionContext } from './accordion_context.js';
|
|
4
|
+
|
|
5
|
+
export interface AccordionControls<T extends string = string> {
|
|
6
|
+
open: (id: T) => void;
|
|
7
|
+
close: (id: T) => void;
|
|
8
|
+
toggle: (id: T) => void;
|
|
9
|
+
closeAllExcept: (except: T) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function useAccordionControls<
|
|
13
|
+
T extends string = string,
|
|
14
|
+
>(): AccordionControls<T> {
|
|
15
|
+
const context = useContext(accordionContext);
|
|
16
|
+
|
|
17
|
+
if (!context) {
|
|
18
|
+
throw new Error('AccordionContext was not found');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const [, utils] = context;
|
|
22
|
+
|
|
23
|
+
return useMemo(
|
|
24
|
+
() => ({
|
|
25
|
+
open: (id: T) => utils.change(id, true),
|
|
26
|
+
close: (id: T) => utils.change(id, false),
|
|
27
|
+
toggle: (id: T) => utils.toggle(id),
|
|
28
|
+
closeAllExcept: (except: T) => utils.closeAllExcept(except),
|
|
29
|
+
}),
|
|
30
|
+
[utils],
|
|
31
|
+
);
|
|
32
|
+
}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
1
|
export * from './accordion.js';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
useToggleAccordion,
|
|
5
|
-
useAccordionContext,
|
|
6
|
-
} from './accordion_context.js';
|
|
7
|
-
export { AccordionProvider } from './accordion_context.provider.js';
|
|
2
|
+
export * from './accordion_context_provider.js';
|
|
3
|
+
export * from './accordion_hooks.js';
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import type { AccordionItemState, ActionType } from './accordion_context.utils.js';
|
|
3
|
-
interface AccordionProviderProps {
|
|
4
|
-
children: ReactNode;
|
|
5
|
-
unmountChildren?: boolean;
|
|
6
|
-
}
|
|
7
|
-
export type AccordionActions = ActionType<'CHANGE', {
|
|
8
|
-
title: string;
|
|
9
|
-
isOpen: boolean;
|
|
10
|
-
}> | ActionType<'CLEAR', string> | ActionType<'TOGGLE', string> | ActionType<'REMOVE', string> | ActionType<'CREATE', AccordionItemState>;
|
|
11
|
-
export declare function AccordionProvider(props: AccordionProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=accordion_context.provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accordion_context.provider.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,8BAA8B,CAAC;AAQtC,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GACxB,UAAU,CAAC,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,GACxD,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,GAC3B,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC5B,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC5B,UAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAyB7C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CAsC9D"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, useReducer } from 'react';
|
|
3
|
-
import { match } from 'ts-pattern';
|
|
4
|
-
import { accordionContext } from './accordion_context.js';
|
|
5
|
-
import { changeItem, clearItem, removeItem, toggleItem, } from './accordion_context.utils.js';
|
|
6
|
-
function reducer(previous, action) {
|
|
7
|
-
return match(action)
|
|
8
|
-
.with({ type: 'CHANGE' }, ({ payload }) => {
|
|
9
|
-
return changeItem(previous, payload);
|
|
10
|
-
})
|
|
11
|
-
.with({ type: 'CLEAR' }, ({ payload }) => {
|
|
12
|
-
return clearItem(previous, payload);
|
|
13
|
-
})
|
|
14
|
-
.with({ type: 'TOGGLE' }, ({ payload }) => {
|
|
15
|
-
return toggleItem(previous, payload);
|
|
16
|
-
})
|
|
17
|
-
.with({ type: 'REMOVE' }, ({ payload }) => {
|
|
18
|
-
return removeItem(previous, payload);
|
|
19
|
-
})
|
|
20
|
-
.with({ type: 'CREATE' }, ({ payload }) => {
|
|
21
|
-
return [...previous, payload];
|
|
22
|
-
})
|
|
23
|
-
.exhaustive();
|
|
24
|
-
}
|
|
25
|
-
export function AccordionProvider(props) {
|
|
26
|
-
const { unmountChildren = false, children } = props;
|
|
27
|
-
const [items, dispatch] = useReducer(reducer, []);
|
|
28
|
-
const utils = useMemo(() => {
|
|
29
|
-
return {
|
|
30
|
-
change: (title, isOpen) => dispatch({ type: 'CHANGE', payload: { title, isOpen } }),
|
|
31
|
-
clear: (except) => dispatch({ type: 'CLEAR', payload: except }),
|
|
32
|
-
toggle: (title) => dispatch({ type: 'TOGGLE', payload: title }),
|
|
33
|
-
remove: (title) => dispatch({ type: 'REMOVE', payload: title }),
|
|
34
|
-
create: (title, defaultOpened) => {
|
|
35
|
-
const item = {
|
|
36
|
-
title,
|
|
37
|
-
isOpen: defaultOpened || false,
|
|
38
|
-
};
|
|
39
|
-
dispatch({ type: 'CREATE', payload: item });
|
|
40
|
-
return item;
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
}, []);
|
|
44
|
-
const contextValue = useMemo(() => {
|
|
45
|
-
return [
|
|
46
|
-
{
|
|
47
|
-
items,
|
|
48
|
-
unmountChildren,
|
|
49
|
-
},
|
|
50
|
-
utils,
|
|
51
|
-
];
|
|
52
|
-
}, [items, unmountChildren, utils]);
|
|
53
|
-
return (_jsx(accordionContext.Provider, { value: contextValue, children: children }));
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=accordion_context.provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accordion_context.provider.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.provider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface AccordionItemState {
|
|
2
|
-
title: string;
|
|
3
|
-
isOpen: boolean;
|
|
4
|
-
}
|
|
5
|
-
export interface AccordionState {
|
|
6
|
-
items: AccordionItemState[];
|
|
7
|
-
unmountChildren: boolean;
|
|
8
|
-
}
|
|
9
|
-
export declare function getItem(title: string, items: AccordionItemState[]): AccordionItemState | undefined;
|
|
10
|
-
export type ActionType<Action, Payload = void> = Payload extends void ? {
|
|
11
|
-
type: Action;
|
|
12
|
-
} : {
|
|
13
|
-
type: Action;
|
|
14
|
-
payload: Payload;
|
|
15
|
-
};
|
|
16
|
-
export declare function removeItem(array: AccordionItemState[], title: string): AccordionItemState[];
|
|
17
|
-
export declare function changeItem(array: AccordionItemState[], payload: {
|
|
18
|
-
title: string;
|
|
19
|
-
isOpen: boolean;
|
|
20
|
-
}): AccordionItemState[];
|
|
21
|
-
export declare function clearItem(array: AccordionItemState[], except: string): AccordionItemState[];
|
|
22
|
-
export declare function toggleItem(array: AccordionItemState[], title: string): AccordionItemState[];
|
|
23
|
-
//# sourceMappingURL=accordion_context.utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accordion_context.utils.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,kCAEjE;AAED,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,IAAI,OAAO,SAAS,IAAI,GACjE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvC,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,wBAEpE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,kBAAkB,EAAE,EAC3B,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,wBAU5C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,wBAapE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,wBAcpE"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export function getItem(title, items) {
|
|
2
|
-
return items.find((element) => element.title === title);
|
|
3
|
-
}
|
|
4
|
-
export function removeItem(array, title) {
|
|
5
|
-
return array.filter((element) => element.title !== title);
|
|
6
|
-
}
|
|
7
|
-
export function changeItem(array, payload) {
|
|
8
|
-
const { title, isOpen } = payload;
|
|
9
|
-
const item = getItem(title, array);
|
|
10
|
-
if (item) {
|
|
11
|
-
return [...removeItem(array, title), { ...item, isOpen }];
|
|
12
|
-
}
|
|
13
|
-
return array;
|
|
14
|
-
}
|
|
15
|
-
export function clearItem(array, except) {
|
|
16
|
-
const item = getItem(except, array);
|
|
17
|
-
if (!item) {
|
|
18
|
-
return [...array, { isOpen: true, title: except }];
|
|
19
|
-
}
|
|
20
|
-
return array.map((element) => {
|
|
21
|
-
return {
|
|
22
|
-
...element,
|
|
23
|
-
isOpen: element.title === item.title,
|
|
24
|
-
};
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
export function toggleItem(array, title) {
|
|
28
|
-
const item = getItem(title, array);
|
|
29
|
-
if (!item) {
|
|
30
|
-
return [...array, { title, isOpen: true }];
|
|
31
|
-
}
|
|
32
|
-
return [
|
|
33
|
-
...removeItem(array, title),
|
|
34
|
-
{
|
|
35
|
-
...item,
|
|
36
|
-
isOpen: !item.isOpen,
|
|
37
|
-
},
|
|
38
|
-
];
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=accordion_context.utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accordion_context.utils.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.utils.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,KAA2B;IAChE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAC1D,CAAC;AAMD,MAAM,UAAU,UAAU,CAAC,KAA2B,EAAE,KAAa;IACnE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAA2B,EAC3B,OAA2C;IAE3C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEnC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAA2B,EAAE,MAAc;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,OAAO;YACL,GAAG,OAAO;YACV,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;SACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA2B,EAAE,KAAa;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;QAC3B;YACE,GAAG,IAAI;YACP,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM;SACrB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import { useMemo, useReducer } from 'react';
|
|
3
|
-
import { match } from 'ts-pattern';
|
|
4
|
-
|
|
5
|
-
import type { ContextType } from './accordion_context.js';
|
|
6
|
-
import { accordionContext } from './accordion_context.js';
|
|
7
|
-
import type {
|
|
8
|
-
AccordionItemState,
|
|
9
|
-
ActionType,
|
|
10
|
-
} from './accordion_context.utils.js';
|
|
11
|
-
import {
|
|
12
|
-
changeItem,
|
|
13
|
-
clearItem,
|
|
14
|
-
removeItem,
|
|
15
|
-
toggleItem,
|
|
16
|
-
} from './accordion_context.utils.js';
|
|
17
|
-
|
|
18
|
-
interface AccordionProviderProps {
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
unmountChildren?: boolean;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type AccordionActions =
|
|
24
|
-
| ActionType<'CHANGE', { title: string; isOpen: boolean }>
|
|
25
|
-
| ActionType<'CLEAR', string>
|
|
26
|
-
| ActionType<'TOGGLE', string>
|
|
27
|
-
| ActionType<'REMOVE', string>
|
|
28
|
-
| ActionType<'CREATE', AccordionItemState>;
|
|
29
|
-
|
|
30
|
-
function reducer(
|
|
31
|
-
previous: AccordionItemState[],
|
|
32
|
-
action: AccordionActions,
|
|
33
|
-
): AccordionItemState[] {
|
|
34
|
-
return match(action)
|
|
35
|
-
.with({ type: 'CHANGE' }, ({ payload }) => {
|
|
36
|
-
return changeItem(previous, payload);
|
|
37
|
-
})
|
|
38
|
-
.with({ type: 'CLEAR' }, ({ payload }) => {
|
|
39
|
-
return clearItem(previous, payload);
|
|
40
|
-
})
|
|
41
|
-
.with({ type: 'TOGGLE' }, ({ payload }) => {
|
|
42
|
-
return toggleItem(previous, payload);
|
|
43
|
-
})
|
|
44
|
-
.with({ type: 'REMOVE' }, ({ payload }) => {
|
|
45
|
-
return removeItem(previous, payload);
|
|
46
|
-
})
|
|
47
|
-
.with({ type: 'CREATE' }, ({ payload }) => {
|
|
48
|
-
return [...previous, payload];
|
|
49
|
-
})
|
|
50
|
-
.exhaustive();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function AccordionProvider(props: AccordionProviderProps) {
|
|
54
|
-
const { unmountChildren = false, children } = props;
|
|
55
|
-
const [items, dispatch] = useReducer(reducer, []);
|
|
56
|
-
|
|
57
|
-
const utils = useMemo<ContextType[1]>(() => {
|
|
58
|
-
return {
|
|
59
|
-
change: (title: string, isOpen: boolean) =>
|
|
60
|
-
dispatch({ type: 'CHANGE', payload: { title, isOpen } }),
|
|
61
|
-
clear: (except: string) => dispatch({ type: 'CLEAR', payload: except }),
|
|
62
|
-
toggle: (title: string) => dispatch({ type: 'TOGGLE', payload: title }),
|
|
63
|
-
remove: (title: string) => dispatch({ type: 'REMOVE', payload: title }),
|
|
64
|
-
create: (title: string, defaultOpened?: boolean) => {
|
|
65
|
-
const item: AccordionItemState = {
|
|
66
|
-
title,
|
|
67
|
-
isOpen: defaultOpened || false,
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
dispatch({ type: 'CREATE', payload: item });
|
|
71
|
-
return item;
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
}, []);
|
|
75
|
-
|
|
76
|
-
const contextValue = useMemo<ContextType>(() => {
|
|
77
|
-
return [
|
|
78
|
-
{
|
|
79
|
-
items,
|
|
80
|
-
unmountChildren,
|
|
81
|
-
},
|
|
82
|
-
utils,
|
|
83
|
-
];
|
|
84
|
-
}, [items, unmountChildren, utils]);
|
|
85
|
-
|
|
86
|
-
return (
|
|
87
|
-
<accordionContext.Provider value={contextValue}>
|
|
88
|
-
{children}
|
|
89
|
-
</accordionContext.Provider>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
export interface AccordionItemState {
|
|
2
|
-
title: string;
|
|
3
|
-
isOpen: boolean;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export interface AccordionState {
|
|
7
|
-
items: AccordionItemState[];
|
|
8
|
-
unmountChildren: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function getItem(title: string, items: AccordionItemState[]) {
|
|
12
|
-
return items.find((element) => element.title === title);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export type ActionType<Action, Payload = void> = Payload extends void
|
|
16
|
-
? { type: Action }
|
|
17
|
-
: { type: Action; payload: Payload };
|
|
18
|
-
|
|
19
|
-
export function removeItem(array: AccordionItemState[], title: string) {
|
|
20
|
-
return array.filter((element) => element.title !== title);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function changeItem(
|
|
24
|
-
array: AccordionItemState[],
|
|
25
|
-
payload: { title: string; isOpen: boolean },
|
|
26
|
-
) {
|
|
27
|
-
const { title, isOpen } = payload;
|
|
28
|
-
const item = getItem(title, array);
|
|
29
|
-
|
|
30
|
-
if (item) {
|
|
31
|
-
return [...removeItem(array, title), { ...item, isOpen }];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return array;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function clearItem(array: AccordionItemState[], except: string) {
|
|
38
|
-
const item = getItem(except, array);
|
|
39
|
-
|
|
40
|
-
if (!item) {
|
|
41
|
-
return [...array, { isOpen: true, title: except }];
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return array.map((element) => {
|
|
45
|
-
return {
|
|
46
|
-
...element,
|
|
47
|
-
isOpen: element.title === item.title,
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function toggleItem(array: AccordionItemState[], title: string) {
|
|
53
|
-
const item = getItem(title, array);
|
|
54
|
-
|
|
55
|
-
if (!item) {
|
|
56
|
-
return [...array, { title, isOpen: true }];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return [
|
|
60
|
-
...removeItem(array, title),
|
|
61
|
-
{
|
|
62
|
-
...item,
|
|
63
|
-
isOpen: !item.isOpen,
|
|
64
|
-
},
|
|
65
|
-
];
|
|
66
|
-
}
|