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.
Files changed (41) hide show
  1. package/lib/components/accordion/accordion.d.ts +29 -7
  2. package/lib/components/accordion/accordion.d.ts.map +1 -1
  3. package/lib/components/accordion/accordion.js +24 -9
  4. package/lib/components/accordion/accordion.js.map +1 -1
  5. package/lib/components/accordion/accordion_context.d.ts +8 -15
  6. package/lib/components/accordion/accordion_context.d.ts.map +1 -1
  7. package/lib/components/accordion/accordion_context.js +7 -25
  8. package/lib/components/accordion/accordion_context.js.map +1 -1
  9. package/lib/components/accordion/accordion_context_provider.d.ts +7 -0
  10. package/lib/components/accordion/accordion_context_provider.d.ts.map +1 -0
  11. package/lib/components/accordion/accordion_context_provider.js +62 -0
  12. package/lib/components/accordion/accordion_context_provider.js.map +1 -0
  13. package/lib/components/accordion/accordion_context_utils.d.ts +15 -0
  14. package/lib/components/accordion/accordion_context_utils.d.ts.map +1 -0
  15. package/lib/components/accordion/accordion_context_utils.js +4 -0
  16. package/lib/components/accordion/accordion_context_utils.js.map +1 -0
  17. package/lib/components/accordion/accordion_hooks.d.ts +8 -0
  18. package/lib/components/accordion/accordion_hooks.d.ts.map +1 -0
  19. package/lib/components/accordion/accordion_hooks.js +16 -0
  20. package/lib/components/accordion/accordion_hooks.js.map +1 -0
  21. package/lib/components/accordion/index.d.ts +2 -3
  22. package/lib/components/accordion/index.d.ts.map +1 -1
  23. package/lib/components/accordion/index.js +2 -3
  24. package/lib/components/accordion/index.js.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/accordion/accordion.tsx +65 -20
  27. package/src/components/accordion/accordion_context.ts +17 -37
  28. package/src/components/accordion/accordion_context_provider.tsx +79 -0
  29. package/src/components/accordion/accordion_context_utils.ts +22 -0
  30. package/src/components/accordion/accordion_hooks.ts +32 -0
  31. package/src/components/accordion/index.ts +2 -6
  32. package/lib/components/accordion/accordion_context.provider.d.ts +0 -13
  33. package/lib/components/accordion/accordion_context.provider.d.ts.map +0 -1
  34. package/lib/components/accordion/accordion_context.provider.js +0 -55
  35. package/lib/components/accordion/accordion_context.provider.js.map +0 -1
  36. package/lib/components/accordion/accordion_context.utils.d.ts +0 -23
  37. package/lib/components/accordion/accordion_context.utils.d.ts.map +0 -1
  38. package/lib/components/accordion/accordion_context.utils.js +0 -40
  39. package/lib/components/accordion/accordion_context.utils.js.map +0 -1
  40. package/src/components/accordion/accordion_context.provider.tsx +0 -91
  41. 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>> | ReactElement<AccordionItemProps> | boolean | null;
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
- defaultOpened?: boolean;
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
- toolbar?: ReactNode;
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":"AACA,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAKf,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EACL,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,GACvC,YAAY,CAAC,kBAAkB,CAAC,GAChC,OAAO,GACP,IAAI,CAAC;CACV;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AA0BD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAE9C;yBAFe,SAAS;sBAIsB,kBAAkB"}
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 linear-gradient(#f0f0f0 5%, #e1e1e1 100%) repeat scroll 0 0;
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: 0 12px;
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, defaultOpened, toolbar } = props;
32
- const { item, utils, unmountChildren } = useAccordionContext(title, defaultOpened);
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.clear();
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: item?.isOpen ? '1 1 1px' : 'none',
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 }), toolbar] }), !item?.isOpen && shouldUnmountChildren ? null : (_jsx("div", { style: {
52
- display: item?.isOpen ? 'flex' : 'none',
53
- flex: item?.isOpen ? '1 1 1px' : 'none',
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;AAMrC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAsB7D,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;CAerC,CAAC;AAEF,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;CAKpC,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,OAAO,KAAC,kBAAkB,cAAE,KAAK,CAAC,QAAQ,GAAsB,CAAC;AACnE,CAAC;AAED,SAAS,CAAC,IAAI,GAAG,SAAS,aAAa,CAAC,KAAyB;IAC/D,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,mBAAmB,CAC1D,KAAK,EACL,aAAa,CACd,CAAC;IAEF,MAAM,qBAAqB,GACzB,KAAK,CAAC,eAAe,KAAK,SAAS;QACjC,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;IAE5B,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,KAAsC,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,CACL,eACE,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACvC,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,SAAS;SACrB,aAED,MAAC,mBAAmB,IAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAC,QAAQ,aACxD,cACE,KAAK,EAAE;4BACL,OAAO,EAAE,SAAS;yBACnB,YAEA,KAAK,GACF,EACL,OAAO,IACY,EACrB,CAAC,IAAI,EAAE,MAAM,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/C,cACE,KAAK,EAAE;oBACL,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBACvC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;oBACvC,eAAe,EAAE,OAAO;oBACxB,SAAS,EAAE,MAAM;oBACjB,QAAQ,EAAE,QAAQ;iBACnB,YAED,cACE,KAAK,EAAE;wBACL,MAAM,EAAE,MAAM;wBACd,KAAK,EAAE,MAAM;wBACb,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,MAAM;wBACf,aAAa,EAAE,QAAQ;qBACxB,YAEA,QAAQ,GACL,GACF,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAM9E,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA4C7D,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;sBAWhB,MAAM,CAAC,WAAW,QAAQ,MAAM,CAAC,WAAW;;;;;;;;;wBAS1C,MAAM,CAAC,WAAW,QAAQ,MAAM,CAAC,WAAW;;;CAGnE,CAAC;AAEF,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;CAKpC,CAAC;AAEF,MAAM,UAAU,SAAS,CAA4B,KAAwB;IAC3E,OAAO,KAAC,kBAAkB,cAAE,KAAK,CAAC,QAAQ,GAAsB,CAAC;AACnE,CAAC;AAED,SAAS,CAAC,IAAI,GAAG,SAAS,aAAa,CACrC,KAA4B;IAE5B,MAAM,EACJ,EAAE,EACF,KAAK,EACL,QAAQ,EACR,WAAW,GAAG,KAAK,EACnB,IAAI,EACJ,aAAa,EACb,YAAY,GACb,GAAG,KAAK,CAAC;IAEV,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,oBAAoB,CAAC;QAC/C,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,WAAW;QACxB,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAEtE,MAAM,qBAAqB,GACzB,KAAK,CAAC,eAAe,KAAK,SAAS;QACjC,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;IAE5B,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,KAAsC,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,CACL,eACE,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACjC,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,SAAS;SACrB,aAED,MAAC,mBAAmB,IAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAC,QAAQ,aACxD,cACE,KAAK,EAAE;4BACL,OAAO,EAAE,SAAS;yBACnB,YAEA,KAAK,GACF,EACL,aAAa,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,IACb,EACrB,CAAC,MAAM,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACzC,cACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBACjC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;oBACjC,eAAe,EAAE,OAAO;oBACxB,SAAS,EAAE,MAAM;oBACjB,QAAQ,EAAE,QAAQ;iBACnB,YAED,cACE,KAAK,EAAE;wBACL,MAAM,EAAE,MAAM;wBACd,KAAK,EAAE,MAAM;wBACb,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,MAAM;wBACf,aAAa,EAAE,QAAQ;qBACxB,YAEA,QAAQ,GACL,GACF,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -1,28 +1,21 @@
1
- import type { AccordionItemState, AccordionState } from './accordion_context.utils.js';
1
+ import type { AccordionItemSetIsOpen, AccordionState } from './accordion_context_utils.js';
2
2
  export type ContextType = [
3
3
  AccordionContext,
4
4
  {
5
- clear: (except: string) => void;
6
- toggle: (title: string) => void;
7
- remove: (title: string) => void;
8
- create: (title: string, defaultOpened?: boolean) => AccordionItemState;
9
- change: (title: string, isOpen: boolean) => void;
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 useToggleAccordion(): {
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
- clear: () => void;
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,kBAAkB,EAClB,cAAc,EACf,MAAM,8BAA8B,CAAC;AAGtC,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB;IAChB;QACE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,KAAK,kBAAkB,CAAC;QACvE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KAClD;CACF,CAAC;AAEF,KAAK,gBAAgB,GAAG,cAAc,CAAC;AAEvC,eAAO,MAAM,gBAAgB,6CAA0C,CAAC;AAExE,wBAAgB,kBAAkB;kBAWd,MAAM;mBACL,MAAM;EAG1B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO;;;;;;;iCAwBzC,OAAO;;EAKvC"}
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 useToggleAccordion() {
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.create(title, defaultOpened);
25
- return () => utils.remove(title);
26
- }, [defaultOpened, title, utils]);
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
- clear: () => utils.clear(title),
33
- toggle: () => utils.toggle(title),
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
- }), [item, title, utils, state.unmountChildren]);
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;AAMtE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAevD,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAqB,IAAI,CAAC,CAAC;AAExE,MAAM,UAAU,kBAAkB;IAChC,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,CAAC,GAAG,EAAE;QAClB,OAAO;YACL,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;YAClD,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;SACrD,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,aAAuB;IACxE,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,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAElC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzC,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,IAAI;QACJ,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,KAAK,EAAE;YACL,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YACjC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YACjC,MAAM,EAAE,CAAC,aAAuB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC;SACxE;KACF,CAAC,EACF,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,CAC5C,CAAC;AACJ,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,4 @@
1
+ export function getAccordionRegister() {
2
+ return new Map();
3
+ }
4
+ //# sourceMappingURL=accordion_context_utils.js.map
@@ -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 { type AccordionState } from './accordion_context.utils.js';
3
- export { useToggleAccordion, useAccordionContext, } from './accordion_context.js';
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,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC"}
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 {} from './accordion_context.utils.js';
3
- export { useToggleAccordion, useAccordionContext, } from './accordion_context.js';
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,OAAO,EAAuB,MAAM,8BAA8B,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "react-science",
3
- "version": "15.0.0",
3
+ "version": "16.0.0",
4
4
  "description": "React components to build scientific applications UI",
5
5
  "type": "module",
6
6
  "exports": {
@@ -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
- defaultOpened?: boolean;
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
- toolbar?: ReactNode;
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 linear-gradient(#f0f0f0 5%, #e1e1e1 100%) repeat scroll 0 0;
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: 0 12px;
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(props: AccordionItemProps) {
60
- const { title, children, defaultOpened, toolbar } = props;
61
- const { item, utils, unmountChildren } = useAccordionContext(
91
+ Accordion.Item = function AccordionItem<T extends string = string>(
92
+ props: AccordionItemProps<T>,
93
+ ) {
94
+ const {
95
+ id,
62
96
  title,
63
- defaultOpened,
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.clear();
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: item?.isOpen ? '1 1 1px' : 'none',
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
- {toolbar}
144
+ {renderToolbar?.(isOpen ?? false)}
100
145
  </AccordionItemHeader>
101
- {!item?.isOpen && shouldUnmountChildren ? null : (
146
+ {!isOpen && shouldUnmountChildren ? null : (
102
147
  <div
103
148
  style={{
104
- display: item?.isOpen ? 'flex' : 'none',
105
- flex: item?.isOpen ? '1 1 1px' : 'none',
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
- AccordionItemState,
4
+ AccordionItemSetIsOpen,
5
5
  AccordionState,
6
- } from './accordion_context.utils.js';
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
- clear: (except: string) => void;
13
- toggle: (title: string) => void;
14
- remove: (title: string) => void;
15
- create: (title: string, defaultOpened?: boolean) => AccordionItemState;
16
- change: (title: string, isOpen: boolean) => void;
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 useToggleAccordion() {
25
- const context = useContext(accordionContext);
26
-
27
- if (!context) {
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.create(title, defaultOpened);
52
- return () => utils.remove(title);
53
- }, [defaultOpened, title, utils]);
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
- clear: () => utils.clear(title),
63
- toggle: () => utils.toggle(title),
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
- [item, title, utils, state.unmountChildren],
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 { type AccordionState } from './accordion_context.utils.js';
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
- }