react-science 0.32.2 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
- package/lib/app/about/AboutDialogToolbarButton.js +2 -9
- package/lib/app/about/AboutDialogToolbarButton.js.map +1 -1
- package/lib/app/kinds/ir/IrPeaksPanel.js +1 -1
- package/lib/app/kinds/ir/IrPeaksPanel.js.map +1 -1
- package/lib/app/panels/SignalProcessingPanel.js +1 -1
- package/lib/app/panels/SignalProcessingPanel.js.map +1 -1
- package/lib/app/panels/measurements/MeasurementsPanel.d.ts +1 -1
- package/lib/app/panels/measurements/MeasurementsPanel.d.ts.map +1 -1
- package/lib/app/panels/measurements/MeasurementsPanel.js +20 -12
- package/lib/app/panels/measurements/MeasurementsPanel.js.map +1 -1
- package/lib/app/panels/measurements/MeasurementsTable.d.ts +1 -1
- package/lib/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
- package/lib/app/panels/measurements/MeasurementsTable.js +15 -12
- package/lib/app/panels/measurements/MeasurementsTable.js.map +1 -1
- package/lib/components/color-picker/color-picker-dropdown/ColorPickerDropdown.d.ts +4 -1
- package/lib/components/color-picker/color-picker-dropdown/ColorPickerDropdown.d.ts.map +1 -1
- package/lib/components/color-picker/color-picker-dropdown/ColorPickerDropdown.js +3 -17
- package/lib/components/color-picker/color-picker-dropdown/ColorPickerDropdown.js.map +1 -1
- package/lib/components/dialog/ConfirmDialog.d.ts +12 -0
- package/lib/components/dialog/ConfirmDialog.d.ts.map +1 -0
- package/lib/components/dialog/ConfirmDialog.js +22 -0
- package/lib/components/dialog/ConfirmDialog.js.map +1 -0
- package/lib/components/dialog/index.d.ts +2 -0
- package/lib/components/dialog/index.d.ts.map +1 -0
- package/lib/components/{tabs → dialog}/index.js +1 -1
- package/lib/components/dialog/index.js.map +1 -0
- package/lib/components/index.d.ts +1 -2
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/index.js +1 -2
- package/lib/components/index.js.map +1 -1
- package/lib/components/info-panel/InfoPanel.d.ts +0 -1
- package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
- package/lib/components/info-panel/InfoPanel.js +2 -8
- package/lib/components/info-panel/InfoPanel.js.map +1 -1
- package/lib/components/layout-manager/LayoutManager.d.ts.map +1 -1
- package/lib/components/layout-manager/LayoutManager.js +0 -2
- package/lib/components/layout-manager/LayoutManager.js.map +1 -1
- package/lib/components/root-layout/RootLayout.js +1 -1
- package/lib/components/root-layout/RootLayout.js.map +1 -1
- package/lib/components/table/Table.d.ts +8 -3
- package/lib/components/table/Table.d.ts.map +1 -1
- package/lib/components/table/Table.js +14 -65
- package/lib/components/table/Table.js.map +1 -1
- package/lib/components/table/TableHeader.d.ts +3 -0
- package/lib/components/table/TableHeader.d.ts.map +1 -0
- package/lib/components/table/TableHeader.js +10 -0
- package/lib/components/table/TableHeader.js.map +1 -0
- package/lib/components/table/TableRow.d.ts +3 -0
- package/lib/components/table/TableRow.d.ts.map +1 -0
- package/lib/components/table/TableRow.js +57 -0
- package/lib/components/table/TableRow.js.map +1 -0
- package/lib/components/table/tableContext.d.ts +10 -0
- package/lib/components/table/tableContext.d.ts.map +1 -0
- package/lib/components/table/tableContext.js +11 -0
- package/lib/components/table/tableContext.js.map +1 -0
- package/lib/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
- package/lib/components/toolbar/PanelPreferencesToolbar.js +2 -2
- package/lib/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
- package/lib/components/toolbar/Toolbar.d.ts +8 -5
- package/lib/components/toolbar/Toolbar.d.ts.map +1 -1
- package/lib/components/toolbar/Toolbar.js +12 -9
- package/lib/components/toolbar/Toolbar.js.map +1 -1
- package/lib-esm/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
- package/lib-esm/app/about/AboutDialogToolbarButton.js +4 -8
- package/lib-esm/app/about/AboutDialogToolbarButton.js.map +1 -1
- package/lib-esm/app/kinds/ir/IrPeaksPanel.js +1 -1
- package/lib-esm/app/kinds/ir/IrPeaksPanel.js.map +1 -1
- package/lib-esm/app/panels/SignalProcessingPanel.js +1 -1
- package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsPanel.d.ts +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsPanel.d.ts.map +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsPanel.js +16 -8
- package/lib-esm/app/panels/measurements/MeasurementsPanel.js.map +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsTable.d.ts +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsTable.js +11 -8
- package/lib-esm/app/panels/measurements/MeasurementsTable.js.map +1 -1
- package/lib-esm/components/color-picker/color-picker-dropdown/ColorPickerDropdown.d.ts +4 -1
- package/lib-esm/components/color-picker/color-picker-dropdown/ColorPickerDropdown.d.ts.map +1 -1
- package/lib-esm/components/color-picker/color-picker-dropdown/ColorPickerDropdown.js +4 -18
- package/lib-esm/components/color-picker/color-picker-dropdown/ColorPickerDropdown.js.map +1 -1
- package/lib-esm/components/dialog/ConfirmDialog.d.ts +12 -0
- package/lib-esm/components/dialog/ConfirmDialog.d.ts.map +1 -0
- package/lib-esm/components/dialog/ConfirmDialog.js +18 -0
- package/lib-esm/components/dialog/ConfirmDialog.js.map +1 -0
- package/lib-esm/components/dialog/index.d.ts +2 -0
- package/lib-esm/components/dialog/index.d.ts.map +1 -0
- package/lib-esm/components/dialog/index.js +2 -0
- package/lib-esm/components/dialog/index.js.map +1 -0
- package/lib-esm/components/index.d.ts +1 -2
- package/lib-esm/components/index.d.ts.map +1 -1
- package/lib-esm/components/index.js +1 -2
- package/lib-esm/components/index.js.map +1 -1
- package/lib-esm/components/info-panel/InfoPanel.d.ts +0 -1
- package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
- package/lib-esm/components/info-panel/InfoPanel.js +2 -8
- package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
- package/lib-esm/components/layout-manager/LayoutManager.d.ts.map +1 -1
- package/lib-esm/components/layout-manager/LayoutManager.js +0 -2
- package/lib-esm/components/layout-manager/LayoutManager.js.map +1 -1
- package/lib-esm/components/root-layout/RootLayout.js +1 -1
- package/lib-esm/components/root-layout/RootLayout.js.map +1 -1
- package/lib-esm/components/table/Table.d.ts +8 -3
- package/lib-esm/components/table/Table.d.ts.map +1 -1
- package/lib-esm/components/table/Table.js +12 -63
- package/lib-esm/components/table/Table.js.map +1 -1
- package/lib-esm/components/table/TableHeader.d.ts +3 -0
- package/lib-esm/components/table/TableHeader.d.ts.map +1 -0
- package/lib-esm/components/table/TableHeader.js +6 -0
- package/lib-esm/components/table/TableHeader.js.map +1 -0
- package/lib-esm/components/table/TableRow.d.ts +3 -0
- package/lib-esm/components/table/TableRow.d.ts.map +1 -0
- package/lib-esm/components/table/TableRow.js +53 -0
- package/lib-esm/components/table/TableRow.js.map +1 -0
- package/lib-esm/components/table/tableContext.d.ts +10 -0
- package/lib-esm/components/table/tableContext.d.ts.map +1 -0
- package/lib-esm/components/table/tableContext.js +7 -0
- package/lib-esm/components/table/tableContext.js.map +1 -0
- package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
- package/lib-esm/components/toolbar/PanelPreferencesToolbar.js +2 -2
- package/lib-esm/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
- package/lib-esm/components/toolbar/Toolbar.d.ts +8 -5
- package/lib-esm/components/toolbar/Toolbar.d.ts.map +1 -1
- package/lib-esm/components/toolbar/Toolbar.js +12 -9
- package/lib-esm/components/toolbar/Toolbar.js.map +1 -1
- package/package.json +30 -30
- package/src/app/about/AboutDialogToolbarButton.tsx +10 -14
- package/src/app/kinds/ir/IrPeaksPanel.tsx +1 -1
- package/src/app/panels/SignalProcessingPanel.tsx +5 -5
- package/src/app/panels/measurements/MeasurementsPanel.tsx +33 -15
- package/src/app/panels/measurements/MeasurementsTable.tsx +33 -26
- package/src/components/color-picker/color-picker-dropdown/ColorPickerDropdown.tsx +17 -37
- package/src/components/dialog/ConfirmDialog.tsx +65 -0
- package/src/components/dialog/index.ts +1 -0
- package/src/components/index.ts +1 -2
- package/src/components/info-panel/InfoPanel.tsx +4 -17
- package/src/components/layout-manager/LayoutManager.tsx +0 -2
- package/src/components/root-layout/RootLayout.tsx +1 -1
- package/src/components/table/Table.tsx +37 -96
- package/src/components/table/TableHeader.tsx +12 -0
- package/src/components/table/TableRow.tsx +89 -0
- package/src/components/table/tableContext.ts +7 -0
- package/src/components/toolbar/PanelPreferencesToolbar.tsx +17 -3
- package/src/components/toolbar/Toolbar.tsx +22 -13
- package/lib/components/modal/ConfirmModal.d.ts +0 -17
- package/lib/components/modal/ConfirmModal.d.ts.map +0 -1
- package/lib/components/modal/ConfirmModal.js +0 -71
- package/lib/components/modal/ConfirmModal.js.map +0 -1
- package/lib/components/modal/Modal.d.ts +0 -25
- package/lib/components/modal/Modal.d.ts.map +0 -1
- package/lib/components/modal/Modal.js +0 -85
- package/lib/components/modal/Modal.js.map +0 -1
- package/lib/components/modal/index.d.ts +0 -3
- package/lib/components/modal/index.d.ts.map +0 -1
- package/lib/components/modal/index.js +0 -19
- package/lib/components/modal/index.js.map +0 -1
- package/lib/components/modal/useDialog.d.ts +0 -19
- package/lib/components/modal/useDialog.d.ts.map +0 -1
- package/lib/components/modal/useDialog.js +0 -51
- package/lib/components/modal/useDialog.js.map +0 -1
- package/lib/components/tabs/Tabs.d.ts +0 -16
- package/lib/components/tabs/Tabs.d.ts.map +0 -1
- package/lib/components/tabs/Tabs.js +0 -99
- package/lib/components/tabs/Tabs.js.map +0 -1
- package/lib/components/tabs/TabsContext.d.ts +0 -8
- package/lib/components/tabs/TabsContext.d.ts.map +0 -1
- package/lib/components/tabs/TabsContext.js +0 -20
- package/lib/components/tabs/TabsContext.js.map +0 -1
- package/lib/components/tabs/index.d.ts +0 -2
- package/lib/components/tabs/index.d.ts.map +0 -1
- package/lib/components/tabs/index.js.map +0 -1
- package/lib-esm/components/modal/ConfirmModal.d.ts +0 -17
- package/lib-esm/components/modal/ConfirmModal.d.ts.map +0 -1
- package/lib-esm/components/modal/ConfirmModal.js +0 -64
- package/lib-esm/components/modal/ConfirmModal.js.map +0 -1
- package/lib-esm/components/modal/Modal.d.ts +0 -25
- package/lib-esm/components/modal/Modal.d.ts.map +0 -1
- package/lib-esm/components/modal/Modal.js +0 -78
- package/lib-esm/components/modal/Modal.js.map +0 -1
- package/lib-esm/components/modal/index.d.ts +0 -3
- package/lib-esm/components/modal/index.d.ts.map +0 -1
- package/lib-esm/components/modal/index.js +0 -3
- package/lib-esm/components/modal/index.js.map +0 -1
- package/lib-esm/components/modal/useDialog.d.ts +0 -19
- package/lib-esm/components/modal/useDialog.d.ts.map +0 -1
- package/lib-esm/components/modal/useDialog.js +0 -47
- package/lib-esm/components/modal/useDialog.js.map +0 -1
- package/lib-esm/components/tabs/Tabs.d.ts +0 -16
- package/lib-esm/components/tabs/Tabs.d.ts.map +0 -1
- package/lib-esm/components/tabs/Tabs.js +0 -95
- package/lib-esm/components/tabs/Tabs.js.map +0 -1
- package/lib-esm/components/tabs/TabsContext.d.ts +0 -8
- package/lib-esm/components/tabs/TabsContext.d.ts.map +0 -1
- package/lib-esm/components/tabs/TabsContext.js +0 -15
- package/lib-esm/components/tabs/TabsContext.js.map +0 -1
- package/lib-esm/components/tabs/index.d.ts +0 -2
- package/lib-esm/components/tabs/index.d.ts.map +0 -1
- package/lib-esm/components/tabs/index.js +0 -2
- package/lib-esm/components/tabs/index.js.map +0 -1
- package/src/components/modal/ConfirmModal.tsx +0 -134
- package/src/components/modal/Modal.tsx +0 -143
- package/src/components/modal/index.ts +0 -2
- package/src/components/modal/useDialog.ts +0 -95
- package/src/components/tabs/Tabs.tsx +0 -189
- package/src/components/tabs/TabsContext.tsx +0 -22
- package/src/components/tabs/index.ts +0 -1
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useMemo, } from 'react';
|
|
2
|
-
import { useKbsDisableGlobal } from 'react-kbs';
|
|
3
|
-
import { useOnOff } from '../hooks/useOnOff';
|
|
4
|
-
export function useDialog({ dialogRef, isOpen, requestCloseOnEsc, requestCloseOnBackdrop, onRequestClose, }) {
|
|
5
|
-
useKbsDisableGlobal(isOpen);
|
|
6
|
-
const [isModalShown, showModal, hideModal] = useOnOff(false);
|
|
7
|
-
useEffect(() => {
|
|
8
|
-
const dialog = dialogRef.current;
|
|
9
|
-
if (dialog && isOpen) {
|
|
10
|
-
showModal();
|
|
11
|
-
dialog.showModal();
|
|
12
|
-
return () => {
|
|
13
|
-
hideModal();
|
|
14
|
-
dialog.close();
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
}, [dialogRef, isOpen, showModal, hideModal]);
|
|
18
|
-
const onCancel = useCallback((event) => {
|
|
19
|
-
if (!requestCloseOnEsc) {
|
|
20
|
-
event.preventDefault();
|
|
21
|
-
}
|
|
22
|
-
}, [requestCloseOnEsc]);
|
|
23
|
-
const onClick = useCallback((event) => {
|
|
24
|
-
const dialog = dialogRef.current;
|
|
25
|
-
if (!dialog) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
// Ref: https://stackoverflow.com/questions/25864259/how-to-close-the-new-html-dialog-tag-by-clicking-on-its-backdrop
|
|
29
|
-
const rect = dialog.getBoundingClientRect();
|
|
30
|
-
const isInDialog = rect.top <= event.clientY &&
|
|
31
|
-
event.clientY <= rect.top + rect.height &&
|
|
32
|
-
rect.left <= event.clientX &&
|
|
33
|
-
event.clientX <= rect.left + rect.width;
|
|
34
|
-
event.stopPropagation();
|
|
35
|
-
// Since the dialog has no size of itself, this condition is only
|
|
36
|
-
// `true` when we click on the backdrop.
|
|
37
|
-
if (!isInDialog && requestCloseOnBackdrop) {
|
|
38
|
-
onRequestClose();
|
|
39
|
-
}
|
|
40
|
-
}, [requestCloseOnBackdrop, onRequestClose, dialogRef]);
|
|
41
|
-
const dialogProps = useMemo(() => ({ onClick, onCancel, onClose: onRequestClose }), [onClick, onCancel, onRequestClose]);
|
|
42
|
-
return {
|
|
43
|
-
dialogProps,
|
|
44
|
-
isModalShown,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=useDialog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDialog.js","sourceRoot":"","sources":["../../../src/components/modal/useDialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,EACX,SAAS,EACT,OAAO,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAmB7C,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,EACT,MAAM,EACN,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACG;IACjB,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE7D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YACrB,SAAS,EAAE,CAAC;YACZ,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,GAAG,EAAE;gBACV,SAAS,EAAE,CAAC;gBACZ,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;IACH,CAAC,EACD,CAAC,iBAAiB,CAAC,CACpB,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,qHAAqH;QACrH,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAC5C,MAAM,UAAU,GACd,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO;YACzB,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM;YACvC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO;YAC1B,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QAE1C,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,iEAAiE;QACjE,wCAAwC;QACxC,IAAI,CAAC,UAAU,IAAI,sBAAsB,EAAE,CAAC;YAC1C,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,EACD,CAAC,sBAAsB,EAAE,cAAc,EAAE,SAAS,CAAC,CACpD,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,EACtD,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CACpC,CAAC;IAEF,OAAO;QACL,WAAW;QACX,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
type TabsOrientation = 'vertical' | 'horizontal';
|
|
3
|
-
export interface TabItem<T extends string = string> {
|
|
4
|
-
id: T;
|
|
5
|
-
title: ReactNode;
|
|
6
|
-
content: ReactNode;
|
|
7
|
-
}
|
|
8
|
-
interface TabsProps<T extends string = string> {
|
|
9
|
-
opened?: T;
|
|
10
|
-
orientation?: TabsOrientation;
|
|
11
|
-
items: Array<TabItem<T>>;
|
|
12
|
-
onClick?: (id: T) => void;
|
|
13
|
-
}
|
|
14
|
-
export declare function Tabs<T extends string = string>(props: TabsProps<T>): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=Tabs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AAI3C,KAAK,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;AAEjD,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAChD,EAAE,EAAE,CAAC,CAAC;IACN,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;CACpB;AAQD,UAAU,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3C,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;CAC3B;AA4CD,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,oDAmBlE"}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
-
/** @jsxImportSource @emotion/react */
|
|
3
|
-
import { css } from '@emotion/react';
|
|
4
|
-
import { useMemo } from 'react';
|
|
5
|
-
import { TabsProvider, useTabsContext } from './TabsContext';
|
|
6
|
-
const styles = {
|
|
7
|
-
scroll: css({
|
|
8
|
-
'&::-webkit-scrollbar': {
|
|
9
|
-
height: '7px',
|
|
10
|
-
width: '7px',
|
|
11
|
-
},
|
|
12
|
-
'&::-webkit-scrollbar-track': {
|
|
13
|
-
backgroundColor: 'rgba(0,0,0,.05)',
|
|
14
|
-
},
|
|
15
|
-
'&::-webkit-scrollbar-thumb': {
|
|
16
|
-
backgroundColor: 'rgba(0,0,0,.2)',
|
|
17
|
-
},
|
|
18
|
-
}),
|
|
19
|
-
item: (isSelected, orientation) => {
|
|
20
|
-
return css([
|
|
21
|
-
{
|
|
22
|
-
padding: '0.25em 1em',
|
|
23
|
-
border: '1px solid hsl(0deg, 0%, 80%)',
|
|
24
|
-
fontSize: '1.125em',
|
|
25
|
-
':hover': {
|
|
26
|
-
backgroundColor: 'hsl(0deg, 0%, 90%)',
|
|
27
|
-
},
|
|
28
|
-
whiteSpace: 'nowrap',
|
|
29
|
-
},
|
|
30
|
-
isSelected && {
|
|
31
|
-
backgroundColor: 'hsl(0deg, 0%, 95%)',
|
|
32
|
-
':hover': {
|
|
33
|
-
backgroundColor: 'hsl(0deg, 0%, 90%)',
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
orientation === 'horizontal' && {
|
|
37
|
-
margin: '0px 2px 0px 2px',
|
|
38
|
-
borderBottom: 'none',
|
|
39
|
-
},
|
|
40
|
-
orientation === 'vertical' && {
|
|
41
|
-
margin: '2px 0px 2px 0px',
|
|
42
|
-
borderRight: 'none',
|
|
43
|
-
},
|
|
44
|
-
]);
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
export function Tabs(props) {
|
|
48
|
-
const { orientation = 'horizontal', items, onClick, opened } = props;
|
|
49
|
-
const item = useMemo(() => items.find(({ id: itemId }) => itemId === opened), [items, opened]);
|
|
50
|
-
if (orientation === 'horizontal') {
|
|
51
|
-
return (_jsx(TabsProvider, { opened: item, children: _jsx(TabsHorizontal, { items: items, onClick: onClick }) }));
|
|
52
|
-
}
|
|
53
|
-
return (_jsx(TabsProvider, { opened: item, children: _jsx(TabsVertical, { items: items, onClick: onClick }) }));
|
|
54
|
-
}
|
|
55
|
-
function TabsItem(props) {
|
|
56
|
-
const item = useTabsContext();
|
|
57
|
-
return (_jsx("button", { type: "button", onClick: props.onClick, css: styles.item(item?.id === props.id, props.orientation), children: props.title }));
|
|
58
|
-
}
|
|
59
|
-
function TabsVertical(props) {
|
|
60
|
-
const { items, onClick } = props;
|
|
61
|
-
const item = useTabsContext();
|
|
62
|
-
return (_jsxs("div", { style: {
|
|
63
|
-
display: 'flex',
|
|
64
|
-
flexDirection: 'row',
|
|
65
|
-
flex: '1 1 0%',
|
|
66
|
-
overflowY: 'hidden',
|
|
67
|
-
height: '100%',
|
|
68
|
-
}, children: [_jsx("div", { style: {
|
|
69
|
-
display: 'flex',
|
|
70
|
-
flexDirection: 'column',
|
|
71
|
-
borderRight: '1px solid hsl(0deg, 0%, 80%)',
|
|
72
|
-
overflowY: 'auto',
|
|
73
|
-
}, css: styles.scroll, children: items.map((item) => (_jsx(TabsItem, { orientation: "vertical", title: item.title, id: item.id, onClick: () => {
|
|
74
|
-
onClick?.(item.id);
|
|
75
|
-
} }, item.id))) }), item && (_jsx("div", { style: { flex: '1 1 0%', overflowX: 'auto' }, children: item.content }))] }));
|
|
76
|
-
}
|
|
77
|
-
function TabsHorizontal(props) {
|
|
78
|
-
const { items, onClick } = props;
|
|
79
|
-
const item = useTabsContext();
|
|
80
|
-
return (_jsxs("div", { style: {
|
|
81
|
-
display: 'flex',
|
|
82
|
-
flexDirection: 'column',
|
|
83
|
-
overflowX: 'hidden',
|
|
84
|
-
height: '100%',
|
|
85
|
-
}, children: [_jsx("div", { style: {
|
|
86
|
-
display: 'flex',
|
|
87
|
-
flexDirection: 'row',
|
|
88
|
-
borderBottom: '1px solid hsl(0deg, 0%, 80%)',
|
|
89
|
-
overflowX: 'auto',
|
|
90
|
-
overflowY: 'hidden',
|
|
91
|
-
}, css: styles.scroll, children: items.map((item) => (_jsx(TabsItem, { orientation: "horizontal", id: item.id, title: item.title, onClick: () => {
|
|
92
|
-
onClick?.(item.id);
|
|
93
|
-
} }, item.id))) }), item && (_jsx("div", { style: { flex: '1 1 0%', overflowX: 'auto' }, children: item.content }))] }));
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=Tabs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
import type { TabItem } from './Tabs';
|
|
3
|
-
export declare function useTabsContext(): TabItem<string> | undefined;
|
|
4
|
-
export declare function TabsProvider<T extends string = string>(props: {
|
|
5
|
-
children: ReactNode;
|
|
6
|
-
opened?: TabItem<T>;
|
|
7
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
//# sourceMappingURL=TabsContext.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TabsContext.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/TabsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAc,MAAM,OAAO,CAAC;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,wBAAgB,cAAc,gCAO7B;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE;IAC7D,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACrB,2CAGA"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext } from 'react';
|
|
3
|
-
const tabsContext = createContext(null);
|
|
4
|
-
export function useTabsContext() {
|
|
5
|
-
const context = useContext(tabsContext);
|
|
6
|
-
if (context === null) {
|
|
7
|
-
throw new Error('TabsContext was not found');
|
|
8
|
-
}
|
|
9
|
-
return context;
|
|
10
|
-
}
|
|
11
|
-
export function TabsProvider(props) {
|
|
12
|
-
const { children, opened } = props;
|
|
13
|
-
return _jsx(tabsContext.Provider, { value: opened, children: children });
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=TabsContext.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TabsContext.js","sourceRoot":"","sources":["../../../src/components/tabs/TabsContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAa,UAAU,EAAE,MAAM,OAAO,CAAC;AAI7D,MAAM,WAAW,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAEpE,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAA4B,KAGvD;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACnC,OAAO,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAAG,QAAQ,GAAwB,CAAC;AAChF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/tabs/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/tabs/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import styled from '@emotion/styled';
|
|
2
|
-
import type { ReactNode } from 'react';
|
|
3
|
-
import { useCallback, useImperativeHandle, useRef, useState } from 'react';
|
|
4
|
-
|
|
5
|
-
import { Button } from '..';
|
|
6
|
-
import { Portal } from '../root-layout/Portal';
|
|
7
|
-
import { RootLayoutProvider } from '../root-layout/RootLayoutContext';
|
|
8
|
-
|
|
9
|
-
import { useDialog } from './useDialog';
|
|
10
|
-
|
|
11
|
-
interface ConfirmModalProps {
|
|
12
|
-
children: ReactNode;
|
|
13
|
-
isOpen: boolean;
|
|
14
|
-
requestCloseOnEsc?: boolean;
|
|
15
|
-
requestCloseOnBackdrop?: boolean;
|
|
16
|
-
onConfirm: () => void;
|
|
17
|
-
onCancel?: () => void;
|
|
18
|
-
onRequestClose: () => void;
|
|
19
|
-
saveText?: string;
|
|
20
|
-
cancelText?: string;
|
|
21
|
-
headerColor: string;
|
|
22
|
-
maxWidth?: number;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const ConfirmModalDialog = styled.dialog`
|
|
26
|
-
background-color: transparent;
|
|
27
|
-
:focus {
|
|
28
|
-
outline: none;
|
|
29
|
-
}
|
|
30
|
-
::backdrop {
|
|
31
|
-
background-color: rgba(113, 113, 122, 0.75);
|
|
32
|
-
}
|
|
33
|
-
`;
|
|
34
|
-
|
|
35
|
-
const ConfirmModalContents = styled.div<{
|
|
36
|
-
headerColor: string;
|
|
37
|
-
}>`
|
|
38
|
-
position: relative;
|
|
39
|
-
display: flex;
|
|
40
|
-
flex-direction: column;
|
|
41
|
-
background-color: white;
|
|
42
|
-
width: 100%;
|
|
43
|
-
border-radius: 0.5rem;
|
|
44
|
-
box-shadow:
|
|
45
|
-
0 0 0 0,
|
|
46
|
-
0 0px 16px rgba(0, 0, 0, 0.3);
|
|
47
|
-
border-top: 10px solid ${({ headerColor }) => headerColor};
|
|
48
|
-
`;
|
|
49
|
-
|
|
50
|
-
const ConfirmModalChildrenRoot = styled.div<{ headerColor: string }>`
|
|
51
|
-
color: ${({ headerColor }) => headerColor};
|
|
52
|
-
display: flex;
|
|
53
|
-
flex: 1 1 0%;
|
|
54
|
-
font-weight: bold;
|
|
55
|
-
padding: 20px;
|
|
56
|
-
font-size: 14px;
|
|
57
|
-
`;
|
|
58
|
-
|
|
59
|
-
const ConfirmModalFooter = styled.div`
|
|
60
|
-
border-top: 2px solid rgb(247, 247, 247);
|
|
61
|
-
padding: 10px 20px 10px 20px;
|
|
62
|
-
display: flex;
|
|
63
|
-
flex-direction: row-reverse;
|
|
64
|
-
gap: 10px;
|
|
65
|
-
`;
|
|
66
|
-
|
|
67
|
-
type MaybeHTMLDialogElement = HTMLDialogElement | null;
|
|
68
|
-
|
|
69
|
-
export function ConfirmModal(props: ConfirmModalProps) {
|
|
70
|
-
const {
|
|
71
|
-
isOpen,
|
|
72
|
-
saveText = 'Save',
|
|
73
|
-
cancelText = 'Cancel',
|
|
74
|
-
headerColor,
|
|
75
|
-
maxWidth,
|
|
76
|
-
onRequestClose,
|
|
77
|
-
onCancel = onRequestClose,
|
|
78
|
-
onConfirm,
|
|
79
|
-
requestCloseOnBackdrop = true,
|
|
80
|
-
requestCloseOnEsc = true,
|
|
81
|
-
children,
|
|
82
|
-
} = props;
|
|
83
|
-
|
|
84
|
-
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
85
|
-
const { dialogProps, isModalShown } = useDialog({
|
|
86
|
-
dialogRef,
|
|
87
|
-
isOpen,
|
|
88
|
-
requestCloseOnEsc,
|
|
89
|
-
requestCloseOnBackdrop,
|
|
90
|
-
onRequestClose,
|
|
91
|
-
});
|
|
92
|
-
const [portalDomNode, setPortalDomNode] =
|
|
93
|
-
useState<MaybeHTMLDialogElement>(null);
|
|
94
|
-
const dialogCallbackRef = useCallback((node: MaybeHTMLDialogElement) => {
|
|
95
|
-
setPortalDomNode(node);
|
|
96
|
-
}, []);
|
|
97
|
-
|
|
98
|
-
useImperativeHandle<MaybeHTMLDialogElement, MaybeHTMLDialogElement>(
|
|
99
|
-
dialogCallbackRef,
|
|
100
|
-
() => dialogRef.current,
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
if (!isOpen) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return (
|
|
108
|
-
<Portal>
|
|
109
|
-
<ConfirmModalDialog {...dialogProps} ref={dialogRef}>
|
|
110
|
-
{isModalShown && (
|
|
111
|
-
<RootLayoutProvider innerRef={portalDomNode}>
|
|
112
|
-
<ConfirmModalContents
|
|
113
|
-
headerColor={headerColor}
|
|
114
|
-
style={{ maxWidth }}
|
|
115
|
-
>
|
|
116
|
-
<ConfirmModalChildrenRoot headerColor={headerColor}>
|
|
117
|
-
{children}
|
|
118
|
-
</ConfirmModalChildrenRoot>
|
|
119
|
-
|
|
120
|
-
<ConfirmModalFooter>
|
|
121
|
-
<Button intent="primary" onClick={onConfirm}>
|
|
122
|
-
{saveText}
|
|
123
|
-
</Button>
|
|
124
|
-
<Button intent="danger" onClick={onCancel}>
|
|
125
|
-
{cancelText}
|
|
126
|
-
</Button>
|
|
127
|
-
</ConfirmModalFooter>
|
|
128
|
-
</ConfirmModalContents>
|
|
129
|
-
</RootLayoutProvider>
|
|
130
|
-
)}
|
|
131
|
-
</ConfirmModalDialog>
|
|
132
|
-
</Portal>
|
|
133
|
-
);
|
|
134
|
-
}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import styled from '@emotion/styled';
|
|
2
|
-
import type { ReactElement, ReactNode } from 'react';
|
|
3
|
-
import { useCallback, useImperativeHandle, useRef, useState } from 'react';
|
|
4
|
-
|
|
5
|
-
import { Button } from '../index';
|
|
6
|
-
import { Portal } from '../root-layout/Portal';
|
|
7
|
-
import { RootLayoutProvider } from '../root-layout/RootLayoutContext';
|
|
8
|
-
|
|
9
|
-
import { useDialog } from './useDialog';
|
|
10
|
-
|
|
11
|
-
export interface ModalProps {
|
|
12
|
-
children: ReactElement | ReactElement[];
|
|
13
|
-
isOpen: boolean;
|
|
14
|
-
requestCloseOnEsc?: boolean;
|
|
15
|
-
hasCloseButton?: boolean;
|
|
16
|
-
requestCloseOnBackdrop?: boolean;
|
|
17
|
-
onRequestClose: () => void;
|
|
18
|
-
maxWidth?: number;
|
|
19
|
-
width?: number;
|
|
20
|
-
height?: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const DialogRoot = styled.dialog`
|
|
24
|
-
background-color: transparent;
|
|
25
|
-
:focus {
|
|
26
|
-
outline: none;
|
|
27
|
-
}
|
|
28
|
-
::backdrop {
|
|
29
|
-
background-color: rgba(113, 113, 122, 0.75);
|
|
30
|
-
}
|
|
31
|
-
`;
|
|
32
|
-
|
|
33
|
-
const DialogContents = styled.div`
|
|
34
|
-
position: relative;
|
|
35
|
-
display: flex;
|
|
36
|
-
flex-direction: column;
|
|
37
|
-
background-color: white;
|
|
38
|
-
border-width: 1px;
|
|
39
|
-
border-color: transparent;
|
|
40
|
-
border-radius: 0.5rem;
|
|
41
|
-
box-shadow:
|
|
42
|
-
0 0 0 0,
|
|
43
|
-
0 0px 16px rgba(0, 0, 0, 0.3);
|
|
44
|
-
`;
|
|
45
|
-
|
|
46
|
-
const ModalHeaderStyled = styled.div`
|
|
47
|
-
display: flex;
|
|
48
|
-
align-items: center;
|
|
49
|
-
justify-content: space-between;
|
|
50
|
-
padding: 10px 20px 10px 20px;
|
|
51
|
-
border-bottom: 2px solid rgb(247, 247, 247);
|
|
52
|
-
`;
|
|
53
|
-
|
|
54
|
-
const ModalBodyStyled = styled.div`
|
|
55
|
-
display: flex;
|
|
56
|
-
flex: 1 1 0%;
|
|
57
|
-
overflow-y: auto;
|
|
58
|
-
`;
|
|
59
|
-
|
|
60
|
-
const ModalFooterStyled = styled.div`
|
|
61
|
-
border-top: 2px solid rgb(247, 247, 247);
|
|
62
|
-
padding: 10px 20px 10px 20px;
|
|
63
|
-
`;
|
|
64
|
-
|
|
65
|
-
type MaybeHTMLDialogElement = HTMLDialogElement | null;
|
|
66
|
-
|
|
67
|
-
export function Modal(props: ModalProps) {
|
|
68
|
-
const {
|
|
69
|
-
isOpen,
|
|
70
|
-
onRequestClose,
|
|
71
|
-
hasCloseButton = true,
|
|
72
|
-
requestCloseOnBackdrop = true,
|
|
73
|
-
requestCloseOnEsc = true,
|
|
74
|
-
children,
|
|
75
|
-
width,
|
|
76
|
-
maxWidth,
|
|
77
|
-
height,
|
|
78
|
-
} = props;
|
|
79
|
-
|
|
80
|
-
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
81
|
-
const { dialogProps, isModalShown } = useDialog({
|
|
82
|
-
dialogRef,
|
|
83
|
-
isOpen,
|
|
84
|
-
requestCloseOnEsc,
|
|
85
|
-
requestCloseOnBackdrop,
|
|
86
|
-
onRequestClose,
|
|
87
|
-
});
|
|
88
|
-
const [portalDomNode, setPortalDomNode] =
|
|
89
|
-
useState<MaybeHTMLDialogElement>(null);
|
|
90
|
-
const dialogCallbackRef = useCallback((node: MaybeHTMLDialogElement) => {
|
|
91
|
-
setPortalDomNode(node);
|
|
92
|
-
}, []);
|
|
93
|
-
|
|
94
|
-
useImperativeHandle<MaybeHTMLDialogElement, MaybeHTMLDialogElement>(
|
|
95
|
-
dialogCallbackRef,
|
|
96
|
-
() => dialogRef.current,
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
if (!isOpen) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return (
|
|
104
|
-
<Portal>
|
|
105
|
-
<DialogRoot {...dialogProps} ref={dialogRef}>
|
|
106
|
-
{isModalShown && (
|
|
107
|
-
<RootLayoutProvider innerRef={portalDomNode}>
|
|
108
|
-
<DialogContents
|
|
109
|
-
style={{
|
|
110
|
-
maxWidth,
|
|
111
|
-
height: height || 'max-content',
|
|
112
|
-
width: width || '100%',
|
|
113
|
-
}}
|
|
114
|
-
>
|
|
115
|
-
{children}
|
|
116
|
-
{hasCloseButton && (
|
|
117
|
-
<Button
|
|
118
|
-
style={{ position: 'absolute', top: 4, right: 4 }}
|
|
119
|
-
onClick={onRequestClose}
|
|
120
|
-
intent="danger"
|
|
121
|
-
minimal
|
|
122
|
-
icon="cross"
|
|
123
|
-
/>
|
|
124
|
-
)}
|
|
125
|
-
</DialogContents>
|
|
126
|
-
</RootLayoutProvider>
|
|
127
|
-
)}
|
|
128
|
-
</DialogRoot>
|
|
129
|
-
</Portal>
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
Modal.Header = function ModalHeader(props: { children: ReactNode }) {
|
|
134
|
-
return <ModalHeaderStyled>{props.children}</ModalHeaderStyled>;
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
Modal.Body = function ModalBody(props: { children: ReactNode }) {
|
|
138
|
-
return <ModalBodyStyled>{props.children}</ModalBodyStyled>;
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
Modal.Footer = function ModalFooter(props: { children: ReactNode }) {
|
|
142
|
-
return <ModalFooterStyled>{props.children}</ModalFooterStyled>;
|
|
143
|
-
};
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
MouseEventHandler,
|
|
3
|
-
ReactEventHandler,
|
|
4
|
-
RefObject,
|
|
5
|
-
useCallback,
|
|
6
|
-
useEffect,
|
|
7
|
-
useMemo,
|
|
8
|
-
} from 'react';
|
|
9
|
-
import { useKbsDisableGlobal } from 'react-kbs';
|
|
10
|
-
|
|
11
|
-
import { useOnOff } from '../hooks/useOnOff';
|
|
12
|
-
|
|
13
|
-
interface UseDialogOptions {
|
|
14
|
-
dialogRef: RefObject<HTMLDialogElement>;
|
|
15
|
-
isOpen: boolean;
|
|
16
|
-
requestCloseOnEsc: boolean;
|
|
17
|
-
requestCloseOnBackdrop: boolean;
|
|
18
|
-
onRequestClose: () => void;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface UseDialogReturn {
|
|
22
|
-
dialogProps: {
|
|
23
|
-
onClick: MouseEventHandler<HTMLDialogElement>;
|
|
24
|
-
onCancel: ReactEventHandler<HTMLDialogElement>;
|
|
25
|
-
onClose: UseDialogOptions['onRequestClose'];
|
|
26
|
-
};
|
|
27
|
-
isModalShown: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function useDialog({
|
|
31
|
-
dialogRef,
|
|
32
|
-
isOpen,
|
|
33
|
-
requestCloseOnEsc,
|
|
34
|
-
requestCloseOnBackdrop,
|
|
35
|
-
onRequestClose,
|
|
36
|
-
}: UseDialogOptions): UseDialogReturn {
|
|
37
|
-
useKbsDisableGlobal(isOpen);
|
|
38
|
-
const [isModalShown, showModal, hideModal] = useOnOff(false);
|
|
39
|
-
|
|
40
|
-
useEffect(() => {
|
|
41
|
-
const dialog = dialogRef.current;
|
|
42
|
-
if (dialog && isOpen) {
|
|
43
|
-
showModal();
|
|
44
|
-
dialog.showModal();
|
|
45
|
-
return () => {
|
|
46
|
-
hideModal();
|
|
47
|
-
dialog.close();
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
}, [dialogRef, isOpen, showModal, hideModal]);
|
|
51
|
-
|
|
52
|
-
const onCancel = useCallback<ReactEventHandler<HTMLDialogElement>>(
|
|
53
|
-
(event) => {
|
|
54
|
-
if (!requestCloseOnEsc) {
|
|
55
|
-
event.preventDefault();
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
[requestCloseOnEsc],
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
const onClick = useCallback<MouseEventHandler<HTMLDialogElement>>(
|
|
62
|
-
(event) => {
|
|
63
|
-
const dialog = dialogRef.current;
|
|
64
|
-
if (!dialog) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Ref: https://stackoverflow.com/questions/25864259/how-to-close-the-new-html-dialog-tag-by-clicking-on-its-backdrop
|
|
69
|
-
const rect = dialog.getBoundingClientRect();
|
|
70
|
-
const isInDialog =
|
|
71
|
-
rect.top <= event.clientY &&
|
|
72
|
-
event.clientY <= rect.top + rect.height &&
|
|
73
|
-
rect.left <= event.clientX &&
|
|
74
|
-
event.clientX <= rect.left + rect.width;
|
|
75
|
-
|
|
76
|
-
event.stopPropagation();
|
|
77
|
-
// Since the dialog has no size of itself, this condition is only
|
|
78
|
-
// `true` when we click on the backdrop.
|
|
79
|
-
if (!isInDialog && requestCloseOnBackdrop) {
|
|
80
|
-
onRequestClose();
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
[requestCloseOnBackdrop, onRequestClose, dialogRef],
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
const dialogProps = useMemo<UseDialogReturn['dialogProps']>(
|
|
87
|
-
() => ({ onClick, onCancel, onClose: onRequestClose }),
|
|
88
|
-
[onClick, onCancel, onRequestClose],
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
return {
|
|
92
|
-
dialogProps,
|
|
93
|
-
isModalShown,
|
|
94
|
-
};
|
|
95
|
-
}
|