react-science 17.0.0 → 18.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 (30) hide show
  1. package/lib/components/accordion/accordion.d.ts +12 -1
  2. package/lib/components/accordion/accordion.d.ts.map +1 -1
  3. package/lib/components/accordion/accordion.js +12 -8
  4. package/lib/components/accordion/accordion.js.map +1 -1
  5. package/lib/components/accordion/accordion_context.d.ts +7 -13
  6. package/lib/components/accordion/accordion_context.d.ts.map +1 -1
  7. package/lib/components/accordion/accordion_context.js +4 -2
  8. package/lib/components/accordion/accordion_context.js.map +1 -1
  9. package/lib/components/accordion/accordion_context_provider.js.map +1 -1
  10. package/lib/components/accordion/accordion_context_utils.d.ts +7 -4
  11. package/lib/components/accordion/accordion_context_utils.d.ts.map +1 -1
  12. package/lib/components/accordion/accordion_context_utils.js.map +1 -1
  13. package/lib/components/accordion/index.d.ts +1 -0
  14. package/lib/components/accordion/index.d.ts.map +1 -1
  15. package/lib/components/fullscreen/fullscreen_context.provider.d.ts +10 -5
  16. package/lib/components/fullscreen/fullscreen_context.provider.d.ts.map +1 -1
  17. package/lib/components/fullscreen/fullscreen_context.provider.js +20 -52
  18. package/lib/components/fullscreen/fullscreen_context.provider.js.map +1 -1
  19. package/lib/components/root-layout/root_layout.d.ts +3 -1
  20. package/lib/components/root-layout/root_layout.d.ts.map +1 -1
  21. package/lib/components/root-layout/root_layout.js +2 -2
  22. package/lib/components/root-layout/root_layout.js.map +1 -1
  23. package/package.json +2 -1
  24. package/src/components/accordion/accordion.tsx +33 -9
  25. package/src/components/accordion/accordion_context.ts +13 -10
  26. package/src/components/accordion/accordion_context_provider.tsx +3 -3
  27. package/src/components/accordion/accordion_context_utils.ts +7 -4
  28. package/src/components/accordion/index.ts +3 -0
  29. package/src/components/fullscreen/fullscreen_context.provider.tsx +35 -72
  30. package/src/components/root-layout/root_layout.tsx +7 -4
@@ -1,7 +1,13 @@
1
1
  import type { ReactElement, ReactNode } from 'react';
2
+ import type { AccordionItemControls } from './accordion_context_utils.js';
2
3
  export interface AccordionProps<T extends string = string> {
3
4
  children?: Array<ReactElement<AccordionItemProps<T>>> | ReactElement<AccordionItemProps<T>> | boolean | null;
4
5
  }
6
+ export interface AccordionRenderToolbarProps<T extends string = string> {
7
+ id: T;
8
+ isOpen: boolean;
9
+ controls: AccordionItemControls;
10
+ }
5
11
  export interface AccordionItemProps<T extends string = string> {
6
12
  /**
7
13
  * A value uniquely identifying the accordion item.
@@ -33,7 +39,12 @@ export interface AccordionItemProps<T extends string = string> {
33
39
  * When not set or set to false, the item's children will be rendered but hidden when the item is closed.
34
40
  */
35
41
  unmountChildren?: boolean;
36
- renderToolbar?: (isOpen: boolean) => ReactNode;
42
+ /**
43
+ * A custom render function to display in the toolbar on the right of the accordion item.
44
+ * Click events will not be propagated down to the accordion item to prevent it from opening/closing.
45
+ * @param data
46
+ */
47
+ renderToolbar?: (renderProps: AccordionRenderToolbarProps<T>) => ReactNode;
37
48
  }
38
49
  export declare function Accordion<T extends string = string>(props: AccordionProps<T>): import("react/jsx-runtime").JSX.Element;
39
50
  export declare namespace Accordion {
@@ -1 +1 @@
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
+ {"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;AAIf,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,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,2BAA2B,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACpE,EAAE,EAAE,CAAC,CAAC;IACN,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,qBAAqB,CAAC;CACjC;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;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;CAC5E;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"}
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Colors } from '@blueprintjs/core';
3
3
  import styled from '@emotion/styled';
4
4
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
5
- import { useCallback } from 'react';
6
- import { useAccordionContext } from './accordion_context.js';
5
+ import { useCallback, useRef } from 'react';
6
+ import { useAccordionItemContext } from './accordion_context.js';
7
7
  const AccordionItemHeader = styled.div `
8
8
  cursor: pointer;
9
9
  display: flex;
@@ -44,26 +44,27 @@ Accordion.Item = function AccordionItem(props) {
44
44
  defaultProp: defaultOpen,
45
45
  onChange: onOpenChange,
46
46
  });
47
- const { utils, unmountChildren } = useAccordionContext(id, setIsOpen);
47
+ const { controls, unmountChildren } = useAccordionItemContext(id, setIsOpen);
48
+ const headerRef = useRef(null);
48
49
  const shouldUnmountChildren = props.unmountChildren === undefined
49
50
  ? unmountChildren
50
51
  : props.unmountChildren;
51
52
  const onClickHandle = useCallback((event) => {
52
53
  if (event.shiftKey) {
53
- utils.closeOthers();
54
+ controls.closeOthers();
54
55
  }
55
56
  else {
56
- utils.toggle();
57
+ controls.toggle();
57
58
  }
58
- }, [utils]);
59
+ }, [controls]);
59
60
  return (_jsxs("div", { style: {
60
61
  flex: isOpen ? '1 1 1px' : 'none',
61
62
  display: 'flex',
62
63
  flexDirection: 'column',
63
64
  isolation: 'isolate',
64
- }, children: [_jsxs(AccordionItemHeader, { onClick: onClickHandle, role: "button", children: [_jsx("div", { style: {
65
+ }, children: [_jsxs(AccordionItemHeader, { onClick: onClickHandle, role: "button", ref: headerRef, children: [_jsx("div", { style: {
65
66
  padding: '5px 0px',
66
- }, children: title }), renderToolbar?.(isOpen ?? false)] }), !isOpen && shouldUnmountChildren ? null : (_jsx("div", { style: {
67
+ }, children: title }), _jsx(ToolbarContainer, { onClick: (event) => event.stopPropagation(), children: renderToolbar?.({ id, isOpen: isOpen ?? false, controls }) })] }), !isOpen && shouldUnmountChildren ? null : (_jsx("div", { style: {
67
68
  display: isOpen ? 'flex' : 'none',
68
69
  flex: isOpen ? '1 1 1px' : 'none',
69
70
  backgroundColor: 'white',
@@ -77,4 +78,7 @@ Accordion.Item = function AccordionItem(props) {
77
78
  flexDirection: 'column',
78
79
  }, children: children }) }))] }));
79
80
  };
81
+ const ToolbarContainer = styled.div `
82
+ display: flex;
83
+ `;
80
84
  //# sourceMappingURL=accordion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import type { AccordionItemSetIsOpen, AccordionState } from './accordion_context_utils.js';
2
- export type ContextType = [
3
- AccordionContext,
1
+ import type { AccordionItemContextValue, AccordionItemSetIsOpen } from './accordion_context_utils.js';
2
+ export type AccordionContextValue = [
3
+ {
4
+ unmountChildren: boolean;
5
+ },
4
6
  {
5
7
  closeAllExcept: (except: string) => void;
6
8
  toggle: (id: string) => void;
@@ -9,14 +11,6 @@ export type ContextType = [
9
11
  change: (id: string, isOpen: boolean) => void;
10
12
  }
11
13
  ];
12
- type AccordionContext = AccordionState;
13
- export declare const accordionContext: import("react").Context<ContextType | null>;
14
- export declare function useAccordionContext(id: string, setIsOpen: AccordionItemSetIsOpen): {
15
- unmountChildren: boolean;
16
- utils: {
17
- closeOthers: () => void;
18
- toggle: () => void;
19
- };
20
- };
21
- export {};
14
+ export declare const accordionContext: import("react").Context<AccordionContextValue | null>;
15
+ export declare function useAccordionItemContext(id: string, setIsOpen: AccordionItemSetIsOpen): AccordionItemContextValue;
22
16
  //# sourceMappingURL=accordion_context.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"accordion_context.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,qBAAqB,GAAG;IAClC;QACE,eAAe,EAAE,OAAO,CAAC;KAC1B;IACD;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;AACF,eAAO,MAAM,gBAAgB,uDAE5B,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,sBAAsB,GAChC,yBAAyB,CA0B3B"}
@@ -1,6 +1,6 @@
1
1
  import { createContext, useContext, useEffect, useMemo } from 'react';
2
2
  export const accordionContext = createContext(null);
3
- export function useAccordionContext(id, setIsOpen) {
3
+ export function useAccordionItemContext(id, setIsOpen) {
4
4
  const context = useContext(accordionContext);
5
5
  if (!context) {
6
6
  throw new Error('AccordionContext was not found');
@@ -12,9 +12,11 @@ export function useAccordionContext(id, setIsOpen) {
12
12
  }, [id, utils, setIsOpen]);
13
13
  return useMemo(() => ({
14
14
  unmountChildren: state.unmountChildren,
15
- utils: {
15
+ controls: {
16
16
  closeOthers: () => utils.closeAllExcept(id),
17
17
  toggle: () => utils.toggle(id),
18
+ open: () => utils.change(id, true),
19
+ close: () => utils.change(id, false),
18
20
  },
19
21
  }), [id, utils, state.unmountChildren]);
20
22
  }
@@ -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;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"}
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;AAmBtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAC3C,IAAI,CACL,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,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,QAAQ,EAAE;YACR,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC;YAClC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;SACrC;KACF,CAAC,EACF,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,CACnC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"accordion_context_provider.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context_provider.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAOpE,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,OAAO,CAAiB,GAAG,EAAE;QACzC,OAAO;YACL,MAAM,EAAE,CAAC,EAAU,EAAE,MAAe,EAAE,EAAE;gBACtC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,cAAc,EAAE,CAAC,EAAU,EAAE,EAAE;gBAC7B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBACxD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;wBACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACvB,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,EAAE,CAAC,EAAU,EAAE,EAAE;gBACrB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE;gBACzB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;YACD,QAAQ,EAAE,CAAC,EAAU,EAAE,SAAiC,EAAE,EAAE;gBAC1D,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACb,8BAA8B,EAAE,4EAA4E,CAC7G,CAAC;gBACJ,CAAC;gBACD,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;oBAC1B,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,YAAY,GAAG,OAAO,CAAc,GAAG,EAAE;QAC7C,OAAO;YACL;gBACE,eAAe;aAChB;YACD,KAAK;SACN,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;IAE7B,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YAC3C,QAAQ,GACiB,CAC7B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"accordion_context_provider.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context_provider.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAOpE,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,MAAM,EAAE,eAAe,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,OAAO,CAA2B,GAAG,EAAE;QACnD,OAAO;YACL,MAAM,EAAE,CAAC,EAAU,EAAE,MAAe,EAAE,EAAE;gBACtC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,cAAc,EAAE,CAAC,EAAU,EAAE,EAAE;gBAC7B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBACxD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;wBACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACvB,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,EAAE,CAAC,EAAU,EAAE,EAAE;gBACrB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE;gBACzB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;YACD,QAAQ,EAAE,CAAC,EAAU,EAAE,SAAiC,EAAE,EAAE;gBAC1D,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACb,8BAA8B,EAAE,4EAA4E,CAC7G,CAAC;gBACJ,CAAC;gBACD,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;oBAC1B,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,YAAY,GAAG,OAAO,CAAwB,GAAG,EAAE;QACvD,OAAO;YACL;gBACE,eAAe;aAChB;YACD,KAAK;SACN,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;IAE7B,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YAC3C,QAAQ,GACiB,CAC7B,CAAC;AACJ,CAAC"}
@@ -1,10 +1,13 @@
1
1
  import type { Dispatch, SetStateAction } from 'react';
2
- export interface AccordionItemState {
3
- title: string;
4
- onChange: AccordionItemSetIsOpen;
2
+ export interface AccordionItemControls {
3
+ closeOthers: () => void;
4
+ toggle: () => void;
5
+ open: () => void;
6
+ close: () => void;
5
7
  }
6
- export interface AccordionState {
8
+ export interface AccordionItemContextValue {
7
9
  unmountChildren: boolean;
10
+ controls: AccordionItemControls;
8
11
  }
9
12
  export type AccordionItemSetIsOpen = Dispatch<SetStateAction<boolean | undefined>>;
10
13
  interface AccordionRegisteredItem {
@@ -1 +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"}
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,qBAAqB;IACpC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,qBAAqB,CAAC;CACjC;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"}
@@ -1 +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"}
1
+ {"version":3,"file":"accordion_context_utils.js","sourceRoot":"","sources":["../../../src/components/accordion/accordion_context_utils.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,GAAG,EAAmC,CAAC;AACpD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './accordion.js';
2
2
  export * from './accordion_context_provider.js';
3
3
  export * from './accordion_hooks.js';
4
+ export type { AccordionItemControls } from './accordion_context_utils.js';
4
5
  //# 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,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,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;AAGrC,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -1,11 +1,16 @@
1
- import type { ReactNode, RefObject } from 'react';
2
- interface FullscreenProps {
1
+ import type { MutableRefObject, ReactNode } from 'react';
2
+ export interface FullscreenProviderProps {
3
3
  /**
4
4
  * Callback providing the ref which should be passed to the element that can be displayed fullscreen.
5
5
  * @param ref
6
6
  */
7
- children: (ref: RefObject<HTMLDivElement>) => ReactNode;
7
+ children: (ref: MutableRefObject<HTMLDivElement | null>) => ReactNode;
8
+ /**
9
+ * Callback which will be called in case toggling results in an error.
10
+ * @param error - The error that happened. Value is not necessarily an instance of `Error` and may even be `undefined`.
11
+ * @param step - Indicates if the error happened when entering or exiting the full screen.
12
+ */
13
+ onToggleError?: (error: unknown, step: 'enter' | 'exit') => void;
8
14
  }
9
- export declare function FullScreenProvider(props: FullscreenProps): import("react/jsx-runtime").JSX.Element;
10
- export {};
15
+ export declare function FullScreenProvider(props: FullscreenProviderProps): import("react/jsx-runtime").JSX.Element;
11
16
  //# sourceMappingURL=fullscreen_context.provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fullscreen_context.provider.d.ts","sourceRoot":"","sources":["../../../src/components/fullscreen/fullscreen_context.provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAalD,UAAU,eAAe;IACvB;;;OAGG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,cAAc,CAAC,KAAK,SAAS,CAAC;CACzD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,2CAYxD"}
1
+ {"version":3,"file":"fullscreen_context.provider.d.ts","sourceRoot":"","sources":["../../../src/components/fullscreen/fullscreen_context.provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMzD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,SAAS,CAAC;IACtE;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CA4BhE"}
@@ -1,60 +1,28 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useReducer, useRef } from 'react';
3
- import { fullscreenContext, useFullscreen } from './fullscreen_context.js';
2
+ import { useMemo } from 'react';
3
+ import { useFullScreenHandle } from 'react-full-screen';
4
+ import { fullscreenContext } from './fullscreen_context.js';
4
5
  export function FullScreenProvider(props) {
5
- const [isFullScreen, toggle] = useReducer((value) => !value, false);
6
- const value = useMemo(() => ({ isFullScreen, toggle }), [isFullScreen, toggle]);
7
- return (_jsx(fullscreenContext.Provider, { value: value, children: _jsx(FullscreenInner, { ...props }) }));
8
- }
9
- function FullscreenInner(props) {
10
- const { children } = props;
11
- const { isFullScreen, toggle } = useFullscreen();
12
- const ref = useRef(null);
13
- useEffect(() => {
14
- function onFullscreenChange() {
15
- const document = window.document;
16
- const value = Boolean(document.fullscreenElement || document.webkitFullscreenElement);
17
- if (!value && isFullScreen)
18
- toggle();
19
- }
20
- const div = ref.current;
21
- if (!div) {
22
- return;
23
- }
24
- div.addEventListener('fullscreenchange', onFullscreenChange);
25
- div.addEventListener('webkitfullscreenchange', onFullscreenChange);
26
- return () => {
27
- div.removeEventListener('fullscreenchange', onFullscreenChange);
28
- div.removeEventListener('webkitfullscreenchange', onFullscreenChange);
29
- };
30
- }, [isFullScreen, toggle]);
31
- useEffect(() => {
32
- if (isFullScreen && ref.current) {
33
- if (ref.current.requestFullscreen) {
34
- ref.current.requestFullscreen().catch(() => {
35
- window.alert('Fullscreen is not supported');
36
- });
6
+ const { children, onToggleError } = props;
7
+ const handle = useFullScreenHandle();
8
+ const value = useMemo(() => {
9
+ function toggle() {
10
+ const handleToggle = handle.active ? handle.exit : handle.enter;
11
+ function handleError(error) {
12
+ onToggleError?.(error, handle.active ? 'exit' : 'enter');
37
13
  }
38
- else if (ref.current.webkitRequestFullscreen) {
39
- ref.current.webkitRequestFullscreen()?.catch(() => {
40
- window.alert('Fullscreen is not supported');
41
- });
14
+ try {
15
+ handleToggle().catch(handleError);
42
16
  }
43
- }
44
- const document = window.document;
45
- if (!isFullScreen && document.fullscreenElement) {
46
- if (document.exitFullscreen) {
47
- document.exitFullscreen().catch(() => {
48
- window.alert("Can't exit fullscreen");
49
- });
50
- }
51
- else if (document.webkitExitFullscreen) {
52
- document.webkitExitFullscreen().catch(() => {
53
- window.alert("Can't exit fullscreen");
54
- });
17
+ catch (error) {
18
+ handleError(error);
55
19
  }
56
20
  }
57
- }, [isFullScreen]);
58
- return children(ref);
21
+ return {
22
+ isFullScreen: handle.active,
23
+ toggle,
24
+ };
25
+ }, [handle, onToggleError]);
26
+ return (_jsx(fullscreenContext.Provider, { value: value, children: children(handle.node) }));
59
27
  }
60
28
  //# sourceMappingURL=fullscreen_context.provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fullscreen_context.provider.js","sourceRoot":"","sources":["../../../src/components/fullscreen/fullscreen_context.provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fullscreen_context.provider.js","sourceRoot":"","sources":["../../../src/components/fullscreen/fullscreen_context.provider.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAgB5D,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IAE1C,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,SAAS,MAAM;YACb,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAChE,SAAS,WAAW,CAAC,KAAc;gBACjC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC;gBACH,YAAY,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,MAAM;SACP,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACrC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GACK,CAC9B,CAAC;AACJ,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import type { CSSProperties, ReactNode } from 'react';
2
+ import type { FullscreenProviderProps } from '../fullscreen/index.js';
2
3
  interface RootLayoutProps {
3
- style?: CSSProperties;
4
4
  children: ReactNode;
5
+ style?: CSSProperties;
6
+ onFullscreenToggleError?: FullscreenProviderProps['onToggleError'];
5
7
  }
6
8
  export declare function RootLayout(props: RootLayoutProps): import("react/jsx-runtime").JSX.Element;
7
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"root_layout.d.ts","sourceRoot":"","sources":["../../../src/components/root-layout/root_layout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAoB,SAAS,EAAE,MAAM,OAAO,CAAC;AAWxE,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAUD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAwChD"}
1
+ {"version":3,"file":"root_layout.d.ts","sourceRoot":"","sources":["../../../src/components/root-layout/root_layout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAoB,SAAS,EAAE,MAAM,OAAO,CAAC;AAIxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAQtE,UAAU,eAAe;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uBAAuB,CAAC,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAC;CACpE;AAUD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAyChD"}
@@ -20,9 +20,9 @@ export function RootLayout(props) {
20
20
  setRootRef(node);
21
21
  }
22
22
  }, []);
23
- return (_jsx(FullScreenProvider, { children: (ref) => (_jsx(CustomDivPreflight, { id: "root-layout", ref: (node) => {
23
+ return (_jsx(FullScreenProvider, { onToggleError: props.onFullscreenToggleError, children: (fullscreenRef) => (_jsx(CustomDivPreflight, { id: "root-layout", ref: (node) => {
24
24
  if (node) {
25
- const mutableRef = ref;
25
+ const mutableRef = fullscreenRef;
26
26
  mutableRef.current = node;
27
27
  refCallback(node);
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"root_layout.js","sourceRoot":"","sources":["../../../src/components/root-layout/root_layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;AAOxC,MAAM,KAAK,GAAkB;IAC3B,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;CACxB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CACvD,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,IAAoB,EAAE,EAAE;QACvD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,KAAC,kBAAkB,cAChB,CAAC,GAAG,EAAE,EAAE,CAAC,CACR,KAAC,kBAAkB,IACjB,EAAE,EAAC,aAAa,EAChB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,UAAU,GAAG,GAAuC,CAAC;oBAC3D,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC1B,WAAW,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC,EACD,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,GAAG,KAAK,CAAC,KAAK;aACf,EACD,SAAS,EAAC,IAAI,YAEd,KAAC,iBAAiB,OACZ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,YAExD,KAAC,kBAAkB,IAAC,QAAQ,EAAE,OAAO,YACnC,KAAC,iBAAiB,cAAE,KAAK,CAAC,QAAQ,GAAqB,GACpC,GACH,GACD,CACtB,GACkB,CACtB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"root_layout.js","sourceRoot":"","sources":["../../../src/components/root-layout/root_layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;AAQxC,MAAM,KAAK,GAAkB;IAC3B,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;CACxB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CACvD,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,IAAoB,EAAE,EAAE;QACvD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,KAAC,kBAAkB,IAAC,aAAa,EAAE,KAAK,CAAC,uBAAuB,YAC7D,CAAC,aAAa,EAAE,EAAE,CAAC,CAClB,KAAC,kBAAkB,IACjB,EAAE,EAAC,aAAa,EAChB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,UAAU,GACd,aAAiD,CAAC;oBACpD,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC1B,WAAW,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC,EACD,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,GAAG,KAAK,CAAC,KAAK;aACf,EACD,SAAS,EAAC,IAAI,YAEd,KAAC,iBAAiB,OACZ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,YAExD,KAAC,kBAAkB,IAAC,QAAQ,EAAE,OAAO,YACnC,KAAC,iBAAiB,cAAE,KAAK,CAAC,QAAQ,GAAqB,GACpC,GACH,GACD,CACtB,GACkB,CACtB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-science",
3
- "version": "17.0.0",
3
+ "version": "18.0.0",
4
4
  "description": "React components to build scientific applications UI",
5
5
  "type": "module",
6
6
  "exports": {
@@ -65,6 +65,7 @@
65
65
  "@tanstack/react-virtual": "^3.13.2",
66
66
  "d3-scale-chromatic": "^3.1.0",
67
67
  "react-dropzone": "^14.3.8",
68
+ "react-full-screen": "^1.1.1",
68
69
  "react-icons": "^5.5.0",
69
70
  "react-inspector": "^6.0.2",
70
71
  "tinycolor2": "^1.6.0",
@@ -6,9 +6,10 @@ import type {
6
6
  ReactElement,
7
7
  ReactNode,
8
8
  } from 'react';
9
- import { useCallback } from 'react';
9
+ import { useCallback, useRef } from 'react';
10
10
 
11
- import { useAccordionContext } from './accordion_context.js';
11
+ import { useAccordionItemContext } from './accordion_context.js';
12
+ import type { AccordionItemControls } from './accordion_context_utils.js';
12
13
 
13
14
  export interface AccordionProps<T extends string = string> {
14
15
  children?:
@@ -18,6 +19,12 @@ export interface AccordionProps<T extends string = string> {
18
19
  | null;
19
20
  }
20
21
 
22
+ export interface AccordionRenderToolbarProps<T extends string = string> {
23
+ id: T;
24
+ isOpen: boolean;
25
+ controls: AccordionItemControls;
26
+ }
27
+
21
28
  export interface AccordionItemProps<T extends string = string> {
22
29
  /**
23
30
  * A value uniquely identifying the accordion item.
@@ -49,7 +56,12 @@ export interface AccordionItemProps<T extends string = string> {
49
56
  * When not set or set to false, the item's children will be rendered but hidden when the item is closed.
50
57
  */
51
58
  unmountChildren?: boolean;
52
- renderToolbar?: (isOpen: boolean) => ReactNode;
59
+ /**
60
+ * A custom render function to display in the toolbar on the right of the accordion item.
61
+ * Click events will not be propagated down to the accordion item to prevent it from opening/closing.
62
+ * @param data
63
+ */
64
+ renderToolbar?: (renderProps: AccordionRenderToolbarProps<T>) => ReactNode;
53
65
  }
54
66
 
55
67
  const AccordionItemHeader = styled.div`
@@ -106,7 +118,9 @@ Accordion.Item = function AccordionItem<T extends string = string>(
106
118
  defaultProp: defaultOpen,
107
119
  onChange: onOpenChange,
108
120
  });
109
- const { utils, unmountChildren } = useAccordionContext(id, setIsOpen);
121
+ const { controls, unmountChildren } = useAccordionItemContext(id, setIsOpen);
122
+
123
+ const headerRef = useRef<HTMLDivElement>(null);
110
124
 
111
125
  const shouldUnmountChildren =
112
126
  props.unmountChildren === undefined
@@ -116,12 +130,12 @@ Accordion.Item = function AccordionItem<T extends string = string>(
116
130
  const onClickHandle = useCallback(
117
131
  (event: ReactMouseEvent<HTMLDivElement>) => {
118
132
  if (event.shiftKey) {
119
- utils.closeOthers();
133
+ controls.closeOthers();
120
134
  } else {
121
- utils.toggle();
135
+ controls.toggle();
122
136
  }
123
137
  },
124
- [utils],
138
+ [controls],
125
139
  );
126
140
 
127
141
  return (
@@ -133,7 +147,11 @@ Accordion.Item = function AccordionItem<T extends string = string>(
133
147
  isolation: 'isolate',
134
148
  }}
135
149
  >
136
- <AccordionItemHeader onClick={onClickHandle} role="button">
150
+ <AccordionItemHeader
151
+ onClick={onClickHandle}
152
+ role="button"
153
+ ref={headerRef}
154
+ >
137
155
  <div
138
156
  style={{
139
157
  padding: '5px 0px',
@@ -141,7 +159,9 @@ Accordion.Item = function AccordionItem<T extends string = string>(
141
159
  >
142
160
  {title}
143
161
  </div>
144
- {renderToolbar?.(isOpen ?? false)}
162
+ <ToolbarContainer onClick={(event) => event.stopPropagation()}>
163
+ {renderToolbar?.({ id, isOpen: isOpen ?? false, controls })}
164
+ </ToolbarContainer>
145
165
  </AccordionItemHeader>
146
166
  {!isOpen && shouldUnmountChildren ? null : (
147
167
  <div
@@ -169,3 +189,7 @@ Accordion.Item = function AccordionItem<T extends string = string>(
169
189
  </div>
170
190
  );
171
191
  };
192
+
193
+ const ToolbarContainer = styled.div`
194
+ display: flex;
195
+ `;
@@ -1,12 +1,14 @@
1
1
  import { createContext, useContext, useEffect, useMemo } from 'react';
2
2
 
3
3
  import type {
4
+ AccordionItemContextValue,
4
5
  AccordionItemSetIsOpen,
5
- AccordionState,
6
6
  } from './accordion_context_utils.js';
7
7
 
8
- export type ContextType = [
9
- AccordionContext,
8
+ export type AccordionContextValue = [
9
+ {
10
+ unmountChildren: boolean;
11
+ },
10
12
  {
11
13
  closeAllExcept: (except: string) => void;
12
14
  toggle: (id: string) => void;
@@ -15,15 +17,14 @@ export type ContextType = [
15
17
  change: (id: string, isOpen: boolean) => void;
16
18
  },
17
19
  ];
20
+ export const accordionContext = createContext<AccordionContextValue | null>(
21
+ null,
22
+ );
18
23
 
19
- type AccordionContext = AccordionState;
20
-
21
- export const accordionContext = createContext<ContextType | null>(null);
22
-
23
- export function useAccordionContext(
24
+ export function useAccordionItemContext(
24
25
  id: string,
25
26
  setIsOpen: AccordionItemSetIsOpen,
26
- ) {
27
+ ): AccordionItemContextValue {
27
28
  const context = useContext(accordionContext);
28
29
 
29
30
  if (!context) {
@@ -40,9 +41,11 @@ export function useAccordionContext(
40
41
  return useMemo(
41
42
  () => ({
42
43
  unmountChildren: state.unmountChildren,
43
- utils: {
44
+ controls: {
44
45
  closeOthers: () => utils.closeAllExcept(id),
45
46
  toggle: () => utils.toggle(id),
47
+ open: () => utils.change(id, true),
48
+ close: () => utils.change(id, false),
46
49
  },
47
50
  }),
48
51
  [id, utils, state.unmountChildren],
@@ -3,7 +3,7 @@ import { useMemo, useRef } from 'react';
3
3
 
4
4
  import { assert } from '../utils/index.js';
5
5
 
6
- import type { ContextType } from './accordion_context.js';
6
+ import type { AccordionContextValue } from './accordion_context.js';
7
7
  import { accordionContext } from './accordion_context.js';
8
8
  import type { AccordionItemSetIsOpen } from './accordion_context_utils.js';
9
9
  import { getAccordionRegister } from './accordion_context_utils.js';
@@ -17,7 +17,7 @@ export function AccordionProvider(props: AccordionProviderProps) {
17
17
  const { unmountChildren = false, children } = props;
18
18
  const registerRef = useRef(getAccordionRegister());
19
19
 
20
- const utils = useMemo<ContextType[1]>(() => {
20
+ const utils = useMemo<AccordionContextValue[1]>(() => {
21
21
  return {
22
22
  change: (id: string, isOpen: boolean) => {
23
23
  assert(registerRef.current);
@@ -62,7 +62,7 @@ export function AccordionProvider(props: AccordionProviderProps) {
62
62
  };
63
63
  }, [registerRef]);
64
64
 
65
- const contextValue = useMemo<ContextType>(() => {
65
+ const contextValue = useMemo<AccordionContextValue>(() => {
66
66
  return [
67
67
  {
68
68
  unmountChildren,
@@ -1,12 +1,15 @@
1
1
  import type { Dispatch, SetStateAction } from 'react';
2
2
 
3
- export interface AccordionItemState {
4
- title: string;
5
- onChange: AccordionItemSetIsOpen;
3
+ export interface AccordionItemControls {
4
+ closeOthers: () => void;
5
+ toggle: () => void;
6
+ open: () => void;
7
+ close: () => void;
6
8
  }
7
9
 
8
- export interface AccordionState {
10
+ export interface AccordionItemContextValue {
9
11
  unmountChildren: boolean;
12
+ controls: AccordionItemControls;
10
13
  }
11
14
 
12
15
  export type AccordionItemSetIsOpen = Dispatch<
@@ -1,3 +1,6 @@
1
1
  export * from './accordion.js';
2
2
  export * from './accordion_context_provider.js';
3
3
  export * from './accordion_hooks.js';
4
+
5
+ // Exported because part of AccordionRenderToolbarProps, which is also exported.
6
+ export type { AccordionItemControls } from './accordion_context_utils.js';
@@ -1,86 +1,49 @@
1
- /* eslint-disable no-alert */
2
- import type { ReactNode, RefObject } from 'react';
3
- import { useEffect, useMemo, useReducer, useRef } from 'react';
1
+ import type { MutableRefObject, ReactNode } from 'react';
2
+ import { useMemo } from 'react';
3
+ import { useFullScreenHandle } from 'react-full-screen';
4
4
 
5
- import { fullscreenContext, useFullscreen } from './fullscreen_context.js';
5
+ import { fullscreenContext } from './fullscreen_context.js';
6
6
 
7
- type ElementType = HTMLDivElement & {
8
- webkitRequestFullscreen(): Promise<void>;
9
- };
10
-
11
- type DocumentType = Document & {
12
- webkitExitFullscreen(): Promise<void>;
13
- webkitFullscreenElement: Element | null;
14
- };
15
- interface FullscreenProps {
7
+ export interface FullscreenProviderProps {
16
8
  /**
17
9
  * Callback providing the ref which should be passed to the element that can be displayed fullscreen.
18
10
  * @param ref
19
11
  */
20
- children: (ref: RefObject<HTMLDivElement>) => ReactNode;
12
+ children: (ref: MutableRefObject<HTMLDivElement | null>) => ReactNode;
13
+ /**
14
+ * Callback which will be called in case toggling results in an error.
15
+ * @param error - The error that happened. Value is not necessarily an instance of `Error` and may even be `undefined`.
16
+ * @param step - Indicates if the error happened when entering or exiting the full screen.
17
+ */
18
+ onToggleError?: (error: unknown, step: 'enter' | 'exit') => void;
21
19
  }
22
20
 
23
- export function FullScreenProvider(props: FullscreenProps) {
24
- const [isFullScreen, toggle] = useReducer((value: boolean) => !value, false);
21
+ export function FullScreenProvider(props: FullscreenProviderProps) {
22
+ const { children, onToggleError } = props;
25
23
 
26
- const value = useMemo(
27
- () => ({ isFullScreen, toggle }),
28
- [isFullScreen, toggle],
29
- );
30
- return (
31
- <fullscreenContext.Provider value={value}>
32
- <FullscreenInner {...props} />
33
- </fullscreenContext.Provider>
34
- );
35
- }
36
- function FullscreenInner(props: FullscreenProps) {
37
- const { children } = props;
38
- const { isFullScreen, toggle } = useFullscreen();
39
- const ref = useRef<ElementType>(null);
40
- useEffect(() => {
41
- function onFullscreenChange() {
42
- const document = window.document as DocumentType;
43
- const value = Boolean(
44
- document.fullscreenElement || document.webkitFullscreenElement,
45
- );
46
- if (!value && isFullScreen) toggle();
47
- }
48
- const div = ref.current;
49
- if (!div) {
50
- return;
51
- }
52
- div.addEventListener('fullscreenchange', onFullscreenChange);
53
- div.addEventListener('webkitfullscreenchange', onFullscreenChange);
24
+ const handle = useFullScreenHandle();
54
25
 
55
- return () => {
56
- div.removeEventListener('fullscreenchange', onFullscreenChange);
57
- div.removeEventListener('webkitfullscreenchange', onFullscreenChange);
58
- };
59
- }, [isFullScreen, toggle]);
60
- useEffect(() => {
61
- if (isFullScreen && ref.current) {
62
- if (ref.current.requestFullscreen) {
63
- ref.current.requestFullscreen().catch(() => {
64
- window.alert('Fullscreen is not supported');
65
- });
66
- } else if (ref.current.webkitRequestFullscreen) {
67
- ref.current.webkitRequestFullscreen()?.catch(() => {
68
- window.alert('Fullscreen is not supported');
69
- });
26
+ const value = useMemo(() => {
27
+ function toggle() {
28
+ const handleToggle = handle.active ? handle.exit : handle.enter;
29
+ function handleError(error: unknown) {
30
+ onToggleError?.(error, handle.active ? 'exit' : 'enter');
70
31
  }
71
- }
72
- const document = window.document as DocumentType;
73
- if (!isFullScreen && document.fullscreenElement) {
74
- if (document.exitFullscreen) {
75
- document.exitFullscreen().catch(() => {
76
- window.alert("Can't exit fullscreen");
77
- });
78
- } else if (document.webkitExitFullscreen) {
79
- document.webkitExitFullscreen().catch(() => {
80
- window.alert("Can't exit fullscreen");
81
- });
32
+ try {
33
+ handleToggle().catch(handleError);
34
+ } catch (error) {
35
+ handleError(error);
82
36
  }
83
37
  }
84
- }, [isFullScreen]);
85
- return children(ref);
38
+ return {
39
+ isFullScreen: handle.active,
40
+ toggle,
41
+ };
42
+ }, [handle, onToggleError]);
43
+
44
+ return (
45
+ <fullscreenContext.Provider value={value}>
46
+ {children(handle.node)}
47
+ </fullscreenContext.Provider>
48
+ );
86
49
  }
@@ -3,6 +3,7 @@ import type { CSSProperties, MutableRefObject, ReactNode } from 'react';
3
3
  import { useCallback, useState } from 'react';
4
4
 
5
5
  import { AccordionProvider } from '../accordion/index.js';
6
+ import type { FullscreenProviderProps } from '../fullscreen/index.js';
6
7
  import { FullScreenProvider } from '../fullscreen/index.js';
7
8
 
8
9
  import { CustomDivPreflight } from './css-reset/customPreflight.js';
@@ -11,8 +12,9 @@ import { RootLayoutProvider } from './root_layout_context.provider.js';
11
12
  FocusStyleManager.onlyShowFocusOnTabs();
12
13
 
13
14
  interface RootLayoutProps {
14
- style?: CSSProperties;
15
15
  children: ReactNode;
16
+ style?: CSSProperties;
17
+ onFullscreenToggleError?: FullscreenProviderProps['onToggleError'];
16
18
  }
17
19
 
18
20
  const style: CSSProperties = {
@@ -35,13 +37,14 @@ export function RootLayout(props: RootLayoutProps) {
35
37
  }, []);
36
38
 
37
39
  return (
38
- <FullScreenProvider>
39
- {(ref) => (
40
+ <FullScreenProvider onToggleError={props.onFullscreenToggleError}>
41
+ {(fullscreenRef) => (
40
42
  <CustomDivPreflight
41
43
  id="root-layout"
42
44
  ref={(node) => {
43
45
  if (node) {
44
- const mutableRef = ref as MutableRefObject<HTMLDivElement>;
46
+ const mutableRef =
47
+ fullscreenRef as MutableRefObject<HTMLDivElement>;
45
48
  mutableRef.current = node;
46
49
  refCallback(node);
47
50
  }