@kirill.konshin/utils 0.0.18 → 0.0.19
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/.turbo/turbo-build.log +39 -39
- package/.turbo/turbo-test.log +36 -36
- package/CHANGELOG.md +6 -0
- package/dist/bootstrap/adaptiveContainer.d.ts +2 -1
- package/dist/bootstrap/adaptiveContainer.d.ts.map +1 -1
- package/dist/bootstrap/adaptiveContainer.js +2 -2
- package/dist/bootstrap/adaptiveContainer.js.map +1 -1
- package/dist/bootstrap/controls.d.ts +6 -6
- package/dist/bootstrap/controls.d.ts.map +1 -1
- package/dist/bootstrap/controls.js.map +1 -1
- package/dist/bootstrap/error.d.ts +4 -2
- package/dist/bootstrap/error.d.ts.map +1 -1
- package/dist/bootstrap/error.js +2 -7
- package/dist/bootstrap/error.js.map +1 -1
- package/dist/bootstrap/field.d.ts +4 -2
- package/dist/bootstrap/field.d.ts.map +1 -1
- package/dist/bootstrap/field.js +2 -2
- package/dist/bootstrap/field.js.map +1 -1
- package/dist/bootstrap/footer.d.ts +5 -5
- package/dist/bootstrap/footer.d.ts.map +1 -1
- package/dist/bootstrap/footer.js +9 -4
- package/dist/bootstrap/footer.js.map +1 -1
- package/dist/bootstrap/globalLoading.d.ts +4 -2
- package/dist/bootstrap/globalLoading.d.ts.map +1 -1
- package/dist/bootstrap/globalLoading.js +2 -2
- package/dist/bootstrap/globalLoading.js.map +1 -1
- package/dist/bootstrap/loading.d.ts +4 -2
- package/dist/bootstrap/loading.d.ts.map +1 -1
- package/dist/bootstrap/loading.js +3 -2
- package/dist/bootstrap/loading.js.map +1 -1
- package/dist/bootstrap/responsiveHelper.d.ts +2 -1
- package/dist/bootstrap/responsiveHelper.d.ts.map +1 -1
- package/dist/bootstrap/responsiveHelper.js +5 -5
- package/dist/bootstrap/responsiveHelper.js.map +1 -1
- package/dist/bootstrap/screen.d.ts +4 -2
- package/dist/bootstrap/screen.d.ts.map +1 -1
- package/dist/bootstrap/screen.js +3 -2
- package/dist/bootstrap/screen.js.map +1 -1
- package/dist/bootstrap/toaster.d.ts +4 -2
- package/dist/bootstrap/toaster.d.ts.map +1 -1
- package/dist/bootstrap/toaster.js +2 -5
- package/dist/bootstrap/toaster.js.map +1 -1
- package/dist/bootstrap/useModal.d.ts +2 -1
- package/dist/bootstrap/useModal.d.ts.map +1 -1
- package/dist/bootstrap/useModal.js +3 -3
- package/dist/bootstrap/useModal.js.map +1 -1
- package/dist/bootstrap/useWrappedForm.d.ts +1 -1
- package/dist/bootstrap/useWrappedForm.d.ts.map +1 -1
- package/dist/bootstrap/useWrappedForm.js.map +1 -1
- package/dist/core/cache.d.ts +2 -2
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js.map +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/files.d.ts +2 -1
- package/dist/core/files.d.ts.map +1 -1
- package/dist/core/files.js +6 -2
- package/dist/core/files.js.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/ls.d.ts +1 -1
- package/dist/core/ls.d.ts.map +1 -1
- package/dist/core/ls.js.map +1 -1
- package/dist/core/measure.d.ts +4 -4
- package/dist/core/measure.d.ts.map +1 -1
- package/dist/core/measure.js +5 -1
- package/dist/core/measure.js.map +1 -1
- package/dist/core/worker.d.ts +3 -3
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js.map +1 -1
- package/dist/core/wrpc.d.ts +4 -4
- package/dist/core/wrpc.d.ts.map +1 -1
- package/dist/core/wrpc.fixture.d.ts +1 -4
- package/dist/core/wrpc.fixture.d.ts.map +1 -1
- package/dist/core/wrpc.js.map +1 -1
- package/dist/electron/createWindow.d.ts.map +1 -1
- package/dist/electron/createWindow.js.map +1 -1
- package/dist/electron/updater.d.ts +1 -1
- package/dist/electron/updater.d.ts.map +1 -1
- package/dist/electron/updater.js +1 -1
- package/dist/electron/updater.js.map +1 -1
- package/dist/electron-builder/images.d.ts.map +1 -1
- package/dist/electron-builder/images.js.map +1 -1
- package/dist/mui/formControlFieldset.d.ts +2 -2
- package/dist/mui/formControlFieldset.d.ts.map +1 -1
- package/dist/mui/formControlFieldset.js.map +1 -1
- package/dist/mui/formLabelLegend.d.ts +2 -2
- package/dist/mui/formLabelLegend.d.ts.map +1 -1
- package/dist/mui/formLabelLegend.js.map +1 -1
- package/dist/mui/genericControl.d.ts +2 -2
- package/dist/mui/genericControl.d.ts.map +1 -1
- package/dist/mui/genericControl.js.map +1 -1
- package/dist/mui/readOnly.d.ts +2 -2
- package/dist/mui/readOnly.d.ts.map +1 -1
- package/dist/mui/readOnly.js.map +1 -1
- package/dist/next/measure.d.ts.map +1 -1
- package/dist/next/measure.js.map +1 -1
- package/dist/next/noSSR.d.ts +27 -3
- package/dist/next/noSSR.d.ts.map +1 -1
- package/dist/next/noSSR.js +2 -4
- package/dist/next/noSSR.js.map +1 -1
- package/dist/react/form/client.d.ts.map +1 -1
- package/dist/react/form/client.js.map +1 -1
- package/dist/react/form/form.d.ts +22 -8
- package/dist/react/form/form.d.ts.map +1 -1
- package/dist/react/form/form.js +27 -7
- package/dist/react/form/form.js.map +1 -1
- package/dist/react/index.js +2 -1
- package/dist/react/keyboard.d.ts +5 -6
- package/dist/react/keyboard.d.ts.map +1 -1
- package/dist/react/keyboard.js.map +1 -1
- package/dist/react/useFetcher.d.ts.map +1 -1
- package/dist/react/useFetcher.js.map +1 -1
- package/dist/react-native/share.d.ts +1 -1
- package/dist/react-native/share.d.ts.map +1 -1
- package/dist/react-native/share.js.map +1 -1
- package/dist/react-native/update.d.ts +2 -3
- package/dist/react-native/update.d.ts.map +1 -1
- package/dist/react-native/update.js +2 -2
- package/dist/react-native/update.js.map +1 -1
- package/dist/react-native/useAppState.d.ts +1 -1
- package/dist/react-native/useAppState.d.ts.map +1 -1
- package/dist/react-native/useAppState.js.map +1 -1
- package/dist/tailwind/fullpage.d.ts +2 -6
- package/dist/tailwind/fullpage.d.ts.map +1 -1
- package/dist/tailwind/fullpage.js.map +1 -1
- package/dist/tailwind/responsiveHelper.d.ts +2 -1
- package/dist/tailwind/responsiveHelper.d.ts.map +1 -1
- package/dist/tailwind/responsiveHelper.js +2 -2
- package/dist/tailwind/responsiveHelper.js.map +1 -1
- package/package.json +1 -1
- package/src/bootstrap/adaptiveContainer.tsx +3 -3
- package/src/bootstrap/controls.stories.tsx +1 -1
- package/src/bootstrap/controls.tsx +12 -12
- package/src/bootstrap/error.tsx +7 -10
- package/src/bootstrap/field.tsx +11 -9
- package/src/bootstrap/footer.tsx +17 -5
- package/src/bootstrap/globalLoading.tsx +5 -3
- package/src/bootstrap/loading.tsx +10 -8
- package/src/bootstrap/responsiveHelper.tsx +11 -6
- package/src/bootstrap/screen.tsx +24 -22
- package/src/bootstrap/toaster.tsx +8 -6
- package/src/bootstrap/useModal.tsx +12 -7
- package/src/bootstrap/useWrappedForm.ts +9 -7
- package/src/core/cache.ts +15 -8
- package/src/core/errors.ts +4 -1
- package/src/core/files.ts +6 -2
- package/src/core/ls.ts +8 -4
- package/src/core/measure.ts +55 -7
- package/src/core/worker.ts +18 -11
- package/src/core/wrpc.fixture.ts +40 -6
- package/src/core/wrpc.ts +23 -5
- package/src/electron/createWindow.ts +3 -3
- package/src/electron/updater.ts +1 -1
- package/src/electron-builder/images.ts +1 -1
- package/src/mui/formControlFieldset.tsx +2 -2
- package/src/mui/formLabelLegend.tsx +2 -2
- package/src/mui/genericControl.tsx +2 -2
- package/src/mui/readOnly.tsx +2 -2
- package/src/next/measure.ts +19 -2
- package/src/next/noSSR.tsx +26 -7
- package/src/react/form/client.tsx +13 -2
- package/src/react/form/form.tsx +67 -18
- package/src/react/keyboard.tsx +9 -4
- package/src/react/useFetcher.ts +8 -3
- package/src/react-native/share.ts +1 -1
- package/src/react-native/update.tsx +3 -3
- package/src/react-native/useAppState.ts +1 -1
- package/src/tailwind/fullpage.tsx +2 -2
- package/src/tailwind/responsiveHelper.tsx +3 -3
- package/tsconfig.json +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalLoading.js","sources":["../../src/bootstrap/globalLoading.tsx"],"sourcesContent":["import React from 'react';\n// import { useLoading, useLoadingTimeout } from '../redux/loadingSlice';\nimport { Loading } from './loading';\n\nexport
|
|
1
|
+
{"version":3,"file":"globalLoading.js","sources":["../../src/bootstrap/globalLoading.tsx"],"sourcesContent":["import React, { FC } from 'react';\n// import { useLoading, useLoadingTimeout } from '../redux/loadingSlice';\nimport { Loading } from './loading';\n\nexport type GlobalLoadingProps = { loading: boolean };\n\nexport const GlobalLoading: FC<GlobalLoadingProps> = function GlobalLoading({ loading }) {\n // const { loading } = useLoading();\n\n // useLoadingTimeout(15000); // escape latch if something is stuck\n\n if (!loading) return null;\n\n return (\n <div className=\"bg-white position-absolute top-0 start-0 w-100 h-100 z-3 d-flex align-items-center justify-content-center\">\n <Loading />\n </div>\n );\n};\n"],"names":["GlobalLoading"],"mappings":";;AAMO,MAAM,gBAAwC,SAASA,eAAc,EAAE,WAAW;AAKjF,MAAA,CAAC,QAAgB,QAAA;AAErB,6BACK,OAAI,EAAA,WAAU,6GACX,UAAA,oBAAC,UAAQ,CAAA,GACb;AAER;"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { SpinnerProps } from 'react-bootstrap';
|
|
2
|
-
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
export type LoadingProps = {
|
|
3
4
|
children?: any;
|
|
4
5
|
show?: boolean;
|
|
5
6
|
className?: string;
|
|
6
7
|
size?: SpinnerProps['size'];
|
|
7
|
-
}
|
|
8
|
+
};
|
|
9
|
+
export declare const Loading: FC<LoadingProps>;
|
|
8
10
|
//# sourceMappingURL=loading.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../src/bootstrap/loading.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,YAAY,EAAS,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../src/bootstrap/loading.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,YAAY,EAAS,MAAM,iBAAiB,CAAC;AAC/D,OAAc,EAAE,EAAE,EAAQ,MAAM,OAAO,CAAC;AAExC,MAAM,MAAM,YAAY,GAAG;IACvB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CAanC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Stack, Spinner } from "react-bootstrap";
|
|
3
|
-
|
|
3
|
+
import { memo } from "react";
|
|
4
|
+
const Loading = memo(function Loading2({
|
|
4
5
|
children = "Loading...",
|
|
5
6
|
show = true,
|
|
6
7
|
className = "",
|
|
@@ -11,7 +12,7 @@ function Loading({
|
|
|
11
12
|
/* @__PURE__ */ jsx(Spinner, { animation: "border", role: "status", size }),
|
|
12
13
|
/* @__PURE__ */ jsx("span", { children })
|
|
13
14
|
] });
|
|
14
|
-
}
|
|
15
|
+
});
|
|
15
16
|
export {
|
|
16
17
|
Loading
|
|
17
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading.js","sources":["../../src/bootstrap/loading.tsx"],"sourcesContent":["import { Spinner, SpinnerProps, Stack } from 'react-bootstrap';\nimport React from 'react';\n\nexport function Loading({\n children = 'Loading...' as any,\n show = true,\n className = '',\n size,\n}
|
|
1
|
+
{"version":3,"file":"loading.js","sources":["../../src/bootstrap/loading.tsx"],"sourcesContent":["import { Spinner, SpinnerProps, Stack } from 'react-bootstrap';\nimport React, { FC, memo } from 'react';\n\nexport type LoadingProps = {\n children?: any;\n show?: boolean;\n className?: string;\n size?: SpinnerProps['size'];\n};\n\nexport const Loading: FC<LoadingProps> = memo(function Loading({\n children = 'Loading...' as any,\n show = true,\n className = '',\n size,\n}) {\n if (!show) return null;\n return (\n <Stack direction=\"horizontal\" gap={3} className={`align-self-auto ${className}`}>\n <Spinner animation=\"border\" role=\"status\" size={size as any} />\n <span>{children}</span>\n </Stack>\n );\n});\n"],"names":["Loading"],"mappings":";;;AAUa,MAAA,UAA4B,KAAK,SAASA,SAAQ;AAAA,EAC3D,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AACJ,GAAG;AACK,MAAA,CAAC,KAAa,QAAA;AAEd,SAAA,qBAAC,SAAM,WAAU,cAAa,KAAK,GAAG,WAAW,mBAAmB,SAAS,IACzE,UAAA;AAAA,IAAA,oBAAC,SAAQ,EAAA,WAAU,UAAS,MAAK,UAAS,MAAmB;AAAA,IAC7D,oBAAC,UAAM,SAAS,CAAA;AAAA,EAAA,GACpB;AAER,CAAC;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
1
2
|
export declare function useBreakpoint(): {
|
|
2
3
|
breakpoint: string;
|
|
3
4
|
isMobile: boolean;
|
|
4
5
|
isDesktop: boolean;
|
|
5
6
|
};
|
|
6
|
-
export declare
|
|
7
|
+
export declare const ResponsiveHelperBS: FC;
|
|
7
8
|
//# sourceMappingURL=responsiveHelper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responsiveHelper.d.ts","sourceRoot":"","sources":["../../src/bootstrap/responsiveHelper.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"responsiveHelper.d.ts","sourceRoot":"","sources":["../../src/bootstrap/responsiveHelper.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,EAAE,EAAuB,MAAM,OAAO,CAAC;AAEvD,wBAAgB,aAAa,IAAI;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACtB,CAiCA;AAED,eAAO,MAAM,kBAAkB,EAAE,EAWhC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
-
import
|
|
3
|
+
import { useState, useEffect } from "react";
|
|
4
4
|
function useBreakpoint() {
|
|
5
|
-
const [breakpoint, setBreakpoint] =
|
|
6
|
-
|
|
5
|
+
const [breakpoint, setBreakpoint] = useState("xs");
|
|
6
|
+
useEffect(() => {
|
|
7
7
|
const updateBreakpoint = () => {
|
|
8
8
|
const width = window.innerWidth;
|
|
9
9
|
if (width < 576) {
|
|
@@ -29,7 +29,7 @@ function useBreakpoint() {
|
|
|
29
29
|
const isMobile = ["xs", "sm", "md"].includes(breakpoint);
|
|
30
30
|
return { breakpoint, isMobile, isDesktop: !isMobile };
|
|
31
31
|
}
|
|
32
|
-
function
|
|
32
|
+
const ResponsiveHelperBS = function ResponsiveHelperBS2() {
|
|
33
33
|
return /* @__PURE__ */ jsxs("span", { className: "small position-fixed bottom-0 z-3", style: { fontSize: "9px", right: 1, lineHeight: 1 }, children: [
|
|
34
34
|
/* @__PURE__ */ jsx("small", { className: "d-block d-sm-none", children: "XS" }),
|
|
35
35
|
/* @__PURE__ */ jsx("small", { className: "d-none d-sm-block d-md-none", children: "SM" }),
|
|
@@ -38,7 +38,7 @@ function ResponsiveHelperBS() {
|
|
|
38
38
|
/* @__PURE__ */ jsx("small", { className: "d-none d-xl-block d-xxl-none", children: "XL" }),
|
|
39
39
|
/* @__PURE__ */ jsx("small", { className: "d-none d-xxl-block", children: "XXL" })
|
|
40
40
|
] });
|
|
41
|
-
}
|
|
41
|
+
};
|
|
42
42
|
export {
|
|
43
43
|
ResponsiveHelperBS,
|
|
44
44
|
useBreakpoint
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responsiveHelper.js","sources":["../../src/bootstrap/responsiveHelper.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nexport function useBreakpoint() {\n const [breakpoint, setBreakpoint] =
|
|
1
|
+
{"version":3,"file":"responsiveHelper.js","sources":["../../src/bootstrap/responsiveHelper.tsx"],"sourcesContent":["'use client';\n\nimport React, { FC, useEffect, useState } from 'react';\n\nexport function useBreakpoint(): {\n breakpoint: string;\n isMobile: boolean;\n isDesktop: boolean;\n} {\n const [breakpoint, setBreakpoint] = useState('xs');\n\n useEffect(() => {\n const updateBreakpoint = () => {\n const width = window.innerWidth;\n if (width < 576) {\n setBreakpoint('xs');\n } else if (width < 768) {\n setBreakpoint('sm');\n } else if (width < 992) {\n setBreakpoint('md');\n } else if (width < 1200) {\n setBreakpoint('lg');\n } else if (width < 1400) {\n setBreakpoint('xl');\n } else {\n setBreakpoint('xxl');\n }\n };\n\n updateBreakpoint();\n\n window.addEventListener('resize', updateBreakpoint);\n\n return () => {\n window.removeEventListener('resize', updateBreakpoint);\n };\n }, []);\n\n const isMobile = ['xs', 'sm', 'md'].includes(breakpoint);\n\n return { breakpoint, isMobile, isDesktop: !isMobile };\n}\n\nexport const ResponsiveHelperBS: FC = function ResponsiveHelperBS() {\n return (\n <span className=\"small position-fixed bottom-0 z-3\" style={{ fontSize: '9px', right: 1, lineHeight: 1 }}>\n <small className=\"d-block d-sm-none\">XS</small>\n <small className=\"d-none d-sm-block d-md-none\">SM</small>\n <small className=\"d-none d-md-block d-lg-none\">MD</small>\n <small className=\"d-none d-lg-block d-xl-none\">LG</small>\n <small className=\"d-none d-xl-block d-xxl-none\">XL</small>\n <small className=\"d-none d-xxl-block\">XXL</small>\n </span>\n );\n};\n"],"names":["ResponsiveHelperBS"],"mappings":";;;AAIO,SAAS,gBAId;AACE,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AAEjD,YAAU,MAAM;AACZ,UAAM,mBAAmB,MAAM;AAC3B,YAAM,QAAQ,OAAO;AACrB,UAAI,QAAQ,KAAK;AACb,sBAAc,IAAI;AAAA,MAAA,WACX,QAAQ,KAAK;AACpB,sBAAc,IAAI;AAAA,MAAA,WACX,QAAQ,KAAK;AACpB,sBAAc,IAAI;AAAA,MAAA,WACX,QAAQ,MAAM;AACrB,sBAAc,IAAI;AAAA,MAAA,WACX,QAAQ,MAAM;AACrB,sBAAc,IAAI;AAAA,MAAA,OACf;AACH,sBAAc,KAAK;AAAA,MAAA;AAAA,IAE3B;AAEiB,qBAAA;AAEV,WAAA,iBAAiB,UAAU,gBAAgB;AAElD,WAAO,MAAM;AACF,aAAA,oBAAoB,UAAU,gBAAgB;AAAA,IACzD;AAAA,EACJ,GAAG,EAAE;AAEL,QAAM,WAAW,CAAC,MAAM,MAAM,IAAI,EAAE,SAAS,UAAU;AAEvD,SAAO,EAAE,YAAY,UAAU,WAAW,CAAC,SAAS;AACxD;AAEa,MAAA,qBAAyB,SAASA,sBAAqB;AAChE,SACK,qBAAA,QAAA,EAAK,WAAU,qCAAoC,OAAO,EAAE,UAAU,OAAO,OAAO,GAAG,YAAY,EAAA,GAChG,UAAA;AAAA,IAAC,oBAAA,SAAA,EAAM,WAAU,qBAAoB,UAAE,MAAA;AAAA,IACtC,oBAAA,SAAA,EAAM,WAAU,+BAA8B,UAAE,MAAA;AAAA,IAChD,oBAAA,SAAA,EAAM,WAAU,+BAA8B,UAAE,MAAA;AAAA,IAChD,oBAAA,SAAA,EAAM,WAAU,+BAA8B,UAAE,MAAA;AAAA,IAChD,oBAAA,SAAA,EAAM,WAAU,gCAA+B,UAAE,MAAA;AAAA,IACjD,oBAAA,SAAA,EAAM,WAAU,sBAAqB,UAAG,MAAA,CAAA;AAAA,EAAA,GAC7C;AAER;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
export type ScreenProps = {
|
|
2
3
|
backBtn?: any;
|
|
3
4
|
backCb?: any;
|
|
4
5
|
backIcon?: any;
|
|
@@ -16,5 +17,6 @@ export declare function Screen({ backBtn, backCb, backIcon, forwardBtn, forwardI
|
|
|
16
17
|
noHeader?: boolean;
|
|
17
18
|
noFooter?: boolean;
|
|
18
19
|
noMenu?: boolean;
|
|
19
|
-
}
|
|
20
|
+
};
|
|
21
|
+
export declare const Screen: FC<ScreenProps>;
|
|
20
22
|
//# sourceMappingURL=screen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/bootstrap/screen.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/bootstrap/screen.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,EAAE,EAAQ,MAAM,OAAO,CAAC;AAKxC,MAAM,MAAM,WAAW,GAAG;IACtB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAEpB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAsHjC,CAAC"}
|
package/dist/bootstrap/screen.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { memo } from "react";
|
|
2
3
|
import { Navbar, Nav, Stack, Button } from "react-bootstrap";
|
|
3
4
|
import { useBreakpoint } from "./responsiveHelper.js";
|
|
4
5
|
import { AdaptiveContainer } from "./adaptiveContainer.js";
|
|
5
|
-
|
|
6
|
+
const Screen = memo(function Screen2({
|
|
6
7
|
backBtn,
|
|
7
8
|
backCb,
|
|
8
9
|
backIcon,
|
|
@@ -72,7 +73,7 @@ function Screen({
|
|
|
72
73
|
!noMenu && menu
|
|
73
74
|
] })
|
|
74
75
|
] });
|
|
75
|
-
}
|
|
76
|
+
});
|
|
76
77
|
export {
|
|
77
78
|
Screen
|
|
78
79
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.js","sources":["../../src/bootstrap/screen.tsx"],"sourcesContent":["import React from 'react';\nimport { Button, Navbar, Nav, Stack } from 'react-bootstrap';\nimport { useBreakpoint } from './responsiveHelper';\nimport { AdaptiveContainer } from './adaptiveContainer';\n\
|
|
1
|
+
{"version":3,"file":"screen.js","sources":["../../src/bootstrap/screen.tsx"],"sourcesContent":["import React, { FC, memo } from 'react';\nimport { Button, Navbar, Nav, Stack } from 'react-bootstrap';\nimport { useBreakpoint } from './responsiveHelper';\nimport { AdaptiveContainer } from './adaptiveContainer';\n\nexport type ScreenProps = {\n backBtn?: any;\n backCb?: any;\n backIcon?: any;\n forwardBtn?: any;\n forwardIcon?: any;\n forwardCb?: any;\n children: any;\n contentClassName?: string;\n noContentPadding?: boolean;\n header?: any; // resides on top panel in mobile, does not scroll, before content on desktop\n footer?: any; // resides on bottom menu panel in mobile, does not scroll, or after content on desktop\n menu?: any;\n title?: any;\n centerContent?: boolean;\n noHeader?: boolean;\n noFooter?: boolean;\n noMenu?: boolean;\n // noFolders?: boolean;\n};\n\n//TODO Footer -> menu\nexport const Screen: FC<ScreenProps> = memo(function Screen({\n backBtn,\n backCb,\n backIcon,\n forwardBtn,\n forwardIcon,\n forwardCb,\n footer,\n menu,\n header,\n children,\n noContentPadding = false,\n contentClassName = '',\n title = '',\n centerContent = false,\n noHeader = false,\n noFooter = false,\n noMenu = false,\n // noFolders = false,\n}) {\n // const router = useRouter();\n\n backBtn =\n backBtn ||\n (backCb ? (\n // backCb === true ? () => router.back() : backCb\n <Button onClick={backCb} variant=\"nav\">\n {\n <>\n <span className={backIcon || 'bi-chevron-left icon-thick'} />\n <span className=\"d-none d-lg-inline ms-2\">Back</span>\n </>\n }\n </Button>\n ) : null);\n\n forwardBtn =\n forwardBtn ||\n (forwardCb ? (\n <Button onClick={forwardCb}>{forwardIcon ? <span className={forwardIcon}></span> : 'Next'}</Button>\n ) : null);\n\n const { isMobile, isDesktop } = useBreakpoint();\n\n // useLoadingTimeout(1000); // less jerky UI\n\n return (\n <div className={`d-flex flex-column flex-grow-1 flex-lg-grow-0 ${isMobile ? 'vh-100' : ''}`} data-id=\"screen\">\n {/* HEADER */}\n\n {/* FIXME postition fixed does not assign z-index automatically https://getbootstrap.com/docs/4.0/layout/overview/#z-index*/}\n {!noHeader && (\n <header className={isDesktop ? '' : 'shadow-sm border-bottom'} data-id=\"header\">\n {/* {!noFolders && <FolderBar />} */}\n\n {/* {isDesktop && !noFooter && <Footer />} */}\n {isDesktop && !noMenu && menu}\n\n {title && (\n // (isDesktop ? 'border-bottom' : '')\n <Navbar expand className=\"main-nav\">\n <AdaptiveContainer className=\"gap-2\">\n {backBtn && <Nav className=\"hstack gap-3\">{backBtn}</Nav>}\n <Navbar.Brand className=\"me-auto\">{title}</Navbar.Brand>\n {forwardBtn && <Nav className=\"hstack gap-3\">{forwardBtn}</Nav>}\n </AdaptiveContainer>\n </Navbar>\n )}\n\n {header}\n </header>\n )}\n\n {/* CONTENT */}\n\n <AdaptiveContainer\n as=\"main\"\n className={[\n isMobile ? 'overflow-y-auto overflow-x-hidden' : 'gap-3',\n `flex-grow-1 d-flex flex-column`,\n centerContent ? 'align-items-center justify-content-center' : 'justify-content-start',\n contentClassName,\n noContentPadding ? 'p-0' : 'py-3',\n ]\n .filter(Boolean)\n .join(' ')}\n data-id=\"content\"\n >\n {children}\n\n {/* Repeat screen buttons at the bottom on desktop */}\n {isDesktop && !noFooter && (\n <>\n {footer}\n\n {/* TODO Possibly introduce a prop desktopFooterBeforeButtons */}\n {(forwardBtn || backBtn) && (\n // Navbar screws up the popper\n <Stack gap={3} direction=\"horizontal\">\n {/* No container since already in container */}\n {backBtn && <Nav className=\"hstack gap-3\">{backBtn}</Nav>}\n {forwardBtn && <Nav className=\"hstack gap-3 flex-grow-1\">{forwardBtn}</Nav>}\n </Stack>\n )}\n </>\n )}\n </AdaptiveContainer>\n\n {/* FOOTER */}\n\n {!noMenu && !noFooter && (\n <footer className=\"shadow-lg border-top d-block d-lg-none\" data-id=\"footer\">\n {!noFooter && footer}\n {!noMenu && menu}\n </footer>\n )}\n </div>\n );\n});\n"],"names":["Screen"],"mappings":";;;;;AA2Ba,MAAA,SAA0B,KAAK,SAASA,QAAO;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA;AAEb,GAAG;AAGC,YACI,YACC;AAAA;AAAA,wBAEI,QAAO,EAAA,SAAS,QAAQ,SAAQ,OAEzB,UACI,qBAAA,UAAA,EAAA,UAAA;AAAA,MAAC,oBAAA,QAAA,EAAK,WAAW,YAAY,6BAA8B,CAAA;AAAA,MAC1D,oBAAA,QAAA,EAAK,WAAU,2BAA0B,UAAI,OAAA,CAAA;AAAA,IAAA,EAAA,CAClD,EAER,CAAA;AAAA,MACA;AAER,eACI,eACC,YACI,oBAAA,QAAA,EAAO,SAAS,WAAY,UAAc,cAAA,oBAAC,QAAK,EAAA,WAAW,YAAa,CAAA,IAAU,QAAO,IAC1F;AAER,QAAM,EAAE,UAAU,UAAU,IAAI,cAAc;AAK1C,SAAA,qBAAC,SAAI,WAAW,iDAAiD,WAAW,WAAW,EAAE,IAAI,WAAQ,UAIhG,UAAA;AAAA,IAAC,CAAA,iCACG,UAAO,EAAA,WAAW,YAAY,KAAK,2BAA2B,WAAQ,UAIlE,UAAA;AAAA,MAAA,aAAa,CAAC,UAAU;AAAA,MAExB;AAAA,MAEG,oBAAC,UAAO,QAAM,MAAC,WAAU,YACrB,UAAA,qBAAC,mBAAkB,EAAA,WAAU,SACxB,UAAA;AAAA,QAAA,WAAY,oBAAA,KAAA,EAAI,WAAU,gBAAgB,UAAQ,SAAA;AAAA,4BAClD,OAAO,OAAP,EAAa,WAAU,WAAW,UAAM,OAAA;AAAA,QACxC,cAAc,oBAAC,KAAI,EAAA,WAAU,gBAAgB,UAAW,WAAA,CAAA;AAAA,MAAA,EAAA,CAC7D,EACJ,CAAA;AAAA,MAGH;AAAA,IAAA,GACL;AAAA,IAKJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,WAAW;AAAA,UACP,WAAW,sCAAsC;AAAA,UACjD;AAAA,UACA,gBAAgB,8CAA8C;AAAA,UAC9D;AAAA,UACA,mBAAmB,QAAQ;AAAA,QAE1B,EAAA,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACb,WAAQ;AAAA,QAEP,UAAA;AAAA,UAAA;AAAA,UAGA,aAAa,CAAC,YAEN,qBAAA,UAAA,EAAA,UAAA;AAAA,YAAA;AAAA,aAGC,cAAc;AAAA,YAEX,qBAAA,OAAA,EAAM,KAAK,GAAG,WAAU,cAEpB,UAAA;AAAA,cAAA,WAAY,oBAAA,KAAA,EAAI,WAAU,gBAAgB,UAAQ,SAAA;AAAA,cAClD,cAAc,oBAAC,KAAI,EAAA,WAAU,4BAA4B,UAAW,WAAA,CAAA;AAAA,YAAA,EACzE,CAAA;AAAA,UAAA,EAER,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAER;AAAA,IAIC,CAAC,UAAU,CAAC,iCACR,UAAO,EAAA,WAAU,0CAAyC,WAAQ,UAC9D,UAAA;AAAA,MAAA,CAAC,YAAY;AAAA,MACb,CAAC,UAAU;AAAA,IAAA,EAChB,CAAA;AAAA,EAAA,GAER;AAER,CAAC;"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
1
2
|
import { ToastProps } from 'react-bootstrap';
|
|
2
|
-
export
|
|
3
|
+
export type ToasterProps = {
|
|
3
4
|
toast: string | {
|
|
4
5
|
message: string;
|
|
5
6
|
title?: string;
|
|
6
7
|
variant?: 'dark' | 'success' | 'danger';
|
|
7
8
|
};
|
|
8
|
-
} & ToastProps
|
|
9
|
+
} & ToastProps;
|
|
10
|
+
export declare const Toaster: FC<ToasterProps>;
|
|
9
11
|
//# sourceMappingURL=toaster.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toaster.d.ts","sourceRoot":"","sources":["../../src/bootstrap/toaster.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toaster.d.ts","sourceRoot":"","sources":["../../src/bootstrap/toaster.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAY,EAAE,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAS,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAA;KAAE,CAAC;CAChG,GAAG,UAAU,CAAC;AAEf,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CA6BpC,CAAC"}
|
|
@@ -2,12 +2,9 @@
|
|
|
2
2
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { Toast } from "react-bootstrap";
|
|
5
|
-
function
|
|
6
|
-
toast
|
|
7
|
-
}) {
|
|
5
|
+
const Toaster = function Toaster2({ toast }) {
|
|
8
6
|
const [dismissed, setDismissed] = useState(false);
|
|
9
7
|
const msg = typeof toast === "string" ? toast : toast == null ? void 0 : toast.message;
|
|
10
|
-
typeof toast === "string" ? "Notification" : toast == null ? void 0 : toast.title;
|
|
11
8
|
const variant = typeof toast === "string" ? "" : toast == null ? void 0 : toast.variant;
|
|
12
9
|
return /* @__PURE__ */ jsxs(
|
|
13
10
|
Toast,
|
|
@@ -30,7 +27,7 @@ function Toaster({
|
|
|
30
27
|
]
|
|
31
28
|
}
|
|
32
29
|
);
|
|
33
|
-
}
|
|
30
|
+
};
|
|
34
31
|
export {
|
|
35
32
|
Toaster
|
|
36
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toaster.js","sources":["../../src/bootstrap/toaster.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState } from 'react';\nimport { Toast, ToastProps } from 'react-bootstrap';\n// import { useToaster } from '../redux/toasterSlice';\n\nexport
|
|
1
|
+
{"version":3,"file":"toaster.js","sources":["../../src/bootstrap/toaster.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, FC } from 'react';\nimport { Toast, ToastProps } from 'react-bootstrap';\n// import { useToaster } from '../redux/toasterSlice';\n\nexport type ToasterProps = {\n toast: string | { message: string; title?: string; variant?: 'dark' | 'success' | 'danger' };\n} & ToastProps;\n\nexport const Toaster: FC<ToasterProps> = function Toaster({ toast }) {\n //const { toast, setToast } = useToaster();\n const [dismissed, setDismissed] = useState(false);\n\n const msg = typeof toast === 'string' ? toast : toast?.message;\n // const title = typeof toast === 'string' ? 'Notification' : toast?.title;\n const variant = typeof toast === 'string' ? '' : toast?.variant;\n\n return (\n <Toast\n onClose={() => setDismissed(true)}\n show={!dismissed}\n delay={10000}\n autohide\n bg={variant?.toLowerCase()}\n className=\"position-fixed top-50 right-50 min-w-200px z-3\"\n >\n <Toast.Header>\n <strong className=\"me-auto\">Notification</strong>\n </Toast.Header>\n <Toast.Body\n className={\n ['dark', 'success', 'danger'].includes((variant as string)?.toLowerCase()) ? 'text-white' : ''\n }\n >\n {msg}\n </Toast.Body>\n </Toast>\n );\n};\n"],"names":["Toaster"],"mappings":";;;;AAUO,MAAM,UAA4B,SAASA,SAAQ,EAAE,SAAS;AAEjE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,+BAAO;AAEvD,QAAM,UAAU,OAAO,UAAU,WAAW,KAAK,+BAAO;AAGpD,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,SAAS,MAAM,aAAa,IAAI;AAAA,MAChC,MAAM,CAAC;AAAA,MACP,OAAO;AAAA,MACP,UAAQ;AAAA,MACR,IAAI,mCAAS;AAAA,MACb,WAAU;AAAA,MAEV,UAAA;AAAA,QAAC,oBAAA,MAAM,QAAN,EACG,UAAA,oBAAC,YAAO,WAAU,WAAU,0BAAY,EAC5C,CAAA;AAAA,QACA;AAAA,UAAC,MAAM;AAAA,UAAN;AAAA,YACG,WACI,CAAC,QAAQ,WAAW,QAAQ,EAAE,SAAU,mCAAoB,aAAa,IAAI,eAAe;AAAA,YAG/F,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA;AAAA,EACJ;AAER;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
1
2
|
import { ModalProps, OffcanvasProps } from 'react-bootstrap';
|
|
2
3
|
export type UseModalArgs = {
|
|
3
4
|
onClose?: any;
|
|
@@ -17,6 +18,6 @@ export declare function useModal({ onClose, showOnMount }?: UseModalArgs): {
|
|
|
17
18
|
show: boolean | undefined;
|
|
18
19
|
close: () => void;
|
|
19
20
|
open: () => void;
|
|
20
|
-
ModalDialog:
|
|
21
|
+
ModalDialog: FC<ModalProps>;
|
|
21
22
|
};
|
|
22
23
|
//# sourceMappingURL=useModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModal.d.ts","sourceRoot":"","sources":["../../src/bootstrap/useModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useModal.d.ts","sourceRoot":"","sources":["../../src/bootstrap/useModal.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAuC,EAAE,EAAQ,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAiB,UAAU,EAAa,cAAc,EAAS,MAAM,iBAAiB,CAAC;AAE9F,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,CAAC,EAAE,GAAG,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACrB,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;CAChD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,GAAE,YAAiB,GAAG;IACnE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;CAC/B,CAuEA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useCallback, useMemo } from "react";
|
|
2
|
+
import { useState, useCallback, useMemo, memo } from "react";
|
|
3
3
|
import { Offcanvas, Modal, Stack, Button } from "react-bootstrap";
|
|
4
4
|
function useModal({ onClose, showOnMount } = {}) {
|
|
5
5
|
const [show, setShow] = useState(showOnMount);
|
|
@@ -16,7 +16,7 @@ function useModal({ onClose, showOnMount } = {}) {
|
|
|
16
16
|
[close]
|
|
17
17
|
);
|
|
18
18
|
const ModalDialog = useMemo(
|
|
19
|
-
() => function ModalDialog2({
|
|
19
|
+
() => memo(function ModalDialog2({
|
|
20
20
|
children,
|
|
21
21
|
show: show2,
|
|
22
22
|
onSubmit = defaultOnSubmit,
|
|
@@ -39,7 +39,7 @@ function useModal({ onClose, showOnMount } = {}) {
|
|
|
39
39
|
submitButton && /* @__PURE__ */ jsx(Button, { variant: "secondary", type: "submit", children: submitButton })
|
|
40
40
|
] })
|
|
41
41
|
] }) });
|
|
42
|
-
},
|
|
42
|
+
}),
|
|
43
43
|
[close, defaultOnSubmit]
|
|
44
44
|
);
|
|
45
45
|
return { show, close, open, ModalDialog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModal.js","sources":["../../src/bootstrap/useModal.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport { Button, Modal, ModalProps, Offcanvas, OffcanvasProps, Stack } from 'react-bootstrap';\n\nexport type UseModalArgs = { onClose?: any; showOnMount?: boolean };\n\nexport type UseModalProps = {\n children?: any;\n show?: boolean;\n onSubmit?: (e: any) => void;\n submitButton?: string | any;\n cancelButton?: string | any;\n offcanvas?: boolean;\n title?: string | any;\n containerProps?: ModalProps | OffcanvasProps;\n};\n\nexport function useModal({ onClose, showOnMount }: UseModalArgs = {}) {\n const [show, setShow] = useState(showOnMount);\n\n const close = useCallback(() => {\n setShow(false);\n onClose?.();\n }, [onClose]);\n\n const open = useCallback(() => setShow(true), []);\n\n const defaultOnSubmit = useCallback(\n (e) => {\n e.preventDefault();\n close();\n },\n [close],\n );\n\n const ModalDialog = useMemo(\n () =>\n function ModalDialog({\n children,\n show,\n onSubmit = defaultOnSubmit,\n submitButton = 'Done',\n cancelButton = 'Cancel',\n offcanvas = false,\n title = null as any,\n containerProps = {},\n }: ModalProps) {\n const Container = offcanvas ? Offcanvas : Modal;\n const containerDefaultProps = offcanvas ? { style: { maxWidth: '85%' } } : {};\n const Body = offcanvas ? Offcanvas.Body : Modal.Body;\n const Header = offcanvas ? Offcanvas.Header : Modal.Header;\n const Title = offcanvas ? Offcanvas.Title : Modal.Title;\n\n return (\n <Container {...{ ...containerDefaultProps, ...containerProps }} show={show} onHide={close}>\n <form onSubmit={onSubmit}>\n {title && (\n <Header closeButton>\n <Title>{title}</Title>\n </Header>\n )}\n\n <Body as={Stack} gap={3}>\n {show && children}\n </Body>\n\n {!offcanvas && (submitButton || cancelButton) && (\n <Modal.Footer>\n {cancelButton && (\n <Button variant=\"outline-secondary\" onClick={close}>\n {cancelButton}\n </Button>\n )}\n {submitButton && (\n <Button variant=\"secondary\" type=\"submit\">\n {submitButton}\n </Button>\n )}\n </Modal.Footer>\n )}\n </form>\n </Container>\n );\n },\n [close, defaultOnSubmit],\n );\n\n return { show, close, open, ModalDialog };\n}\n"],"names":["ModalDialog","show"],"mappings":";;;AAgBO,SAAS,SAAS,EAAE,SAAS,YAAY,IAAkB,CAAA,
|
|
1
|
+
{"version":3,"file":"useModal.js","sources":["../../src/bootstrap/useModal.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState, JSX, FC, memo } from 'react';\nimport { Button, Modal, ModalProps, Offcanvas, OffcanvasProps, Stack } from 'react-bootstrap';\n\nexport type UseModalArgs = { onClose?: any; showOnMount?: boolean };\n\nexport type UseModalProps = {\n children?: any;\n show?: boolean;\n onSubmit?: (e: any) => void;\n submitButton?: string | any;\n cancelButton?: string | any;\n offcanvas?: boolean;\n title?: string | any;\n containerProps?: ModalProps | OffcanvasProps;\n};\n\nexport function useModal({ onClose, showOnMount }: UseModalArgs = {}): {\n show: boolean | undefined;\n close: () => void;\n open: () => void;\n ModalDialog: FC<ModalProps>;\n} {\n const [show, setShow] = useState(showOnMount);\n\n const close = useCallback((): void => {\n setShow(false);\n onClose?.();\n }, [onClose]);\n\n const open = useCallback((): void => setShow(true), []);\n\n const defaultOnSubmit = useCallback(\n (e: any) => {\n e.preventDefault();\n close();\n },\n [close],\n );\n\n const ModalDialog = useMemo(\n () =>\n memo(function ModalDialog({\n children,\n show,\n onSubmit = defaultOnSubmit,\n submitButton = 'Done',\n cancelButton = 'Cancel',\n offcanvas = false,\n title = null as any,\n containerProps = {},\n }: ModalProps) {\n const Container = offcanvas ? Offcanvas : Modal;\n const containerDefaultProps = offcanvas ? { style: { maxWidth: '85%' } } : {};\n const Body = offcanvas ? Offcanvas.Body : Modal.Body;\n const Header = offcanvas ? Offcanvas.Header : Modal.Header;\n const Title = offcanvas ? Offcanvas.Title : Modal.Title;\n\n return (\n <Container {...{ ...containerDefaultProps, ...containerProps }} show={show} onHide={close}>\n <form onSubmit={onSubmit}>\n {title && (\n <Header closeButton>\n <Title>{title}</Title>\n </Header>\n )}\n\n <Body as={Stack} gap={3}>\n {show && children}\n </Body>\n\n {!offcanvas && (submitButton || cancelButton) && (\n <Modal.Footer>\n {cancelButton && (\n <Button variant=\"outline-secondary\" onClick={close}>\n {cancelButton}\n </Button>\n )}\n {submitButton && (\n <Button variant=\"secondary\" type=\"submit\">\n {submitButton}\n </Button>\n )}\n </Modal.Footer>\n )}\n </form>\n </Container>\n );\n }),\n [close, defaultOnSubmit],\n );\n\n return { show, close, open, ModalDialog };\n}\n"],"names":["ModalDialog","show"],"mappings":";;;AAgBO,SAAS,SAAS,EAAE,SAAS,YAAY,IAAkB,CAAA,GAKhE;AACE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,WAAW;AAEtC,QAAA,QAAQ,YAAY,MAAY;AAClC,YAAQ,KAAK;AACH;AAAA,EAAA,GACX,CAAC,OAAO,CAAC;AAEZ,QAAM,OAAO,YAAY,MAAY,QAAQ,IAAI,GAAG,CAAA,CAAE;AAEtD,QAAM,kBAAkB;AAAA,IACpB,CAAC,MAAW;AACR,QAAE,eAAe;AACX,YAAA;AAAA,IACV;AAAA,IACA,CAAC,KAAK;AAAA,EACV;AAEA,QAAM,cAAc;AAAA,IAChB,MACI,KAAK,SAASA,aAAY;AAAA,MACtB;AAAA,MACA,MAAAC;AAAAA,MACA,WAAW;AAAA,MACX,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,iBAAiB,CAAA;AAAA,IAAC,GACP;AACL,YAAA,YAAY,YAAY,YAAY;AACpC,YAAA,wBAAwB,YAAY,EAAE,OAAO,EAAE,UAAU,MAAQ,EAAA,IAAI,CAAC;AAC5E,YAAM,OAAO,YAAY,UAAU,OAAO,MAAM;AAChD,YAAM,SAAS,YAAY,UAAU,SAAS,MAAM;AACpD,YAAM,QAAQ,YAAY,UAAU,QAAQ,MAAM;AAElD,aACK,oBAAA,WAAA,EAAW,GAAG,EAAE,GAAG,uBAAuB,GAAG,kBAAkB,MAAMA,OAAM,QAAQ,OAChF,UAAA,qBAAC,UAAK,UACD,UAAA;AAAA,QAAA,6BACI,QAAO,EAAA,aAAW,MACf,UAAC,oBAAA,OAAA,EAAO,iBAAM,EAClB,CAAA;AAAA,QAGJ,oBAAC,QAAK,IAAI,OAAO,KAAK,GACjB,UAAAA,SAAQ,UACb;AAAA,QAEC,CAAC,cAAc,gBAAgB,iBAC3B,qBAAA,MAAM,QAAN,EACI,UAAA;AAAA,UAAA,oCACI,QAAO,EAAA,SAAQ,qBAAoB,SAAS,OACxC,UACL,cAAA;AAAA,UAEH,gBACI,oBAAA,QAAA,EAAO,SAAQ,aAAY,MAAK,UAC5B,UACL,aAAA,CAAA;AAAA,QAAA,EAER,CAAA;AAAA,MAAA,EAAA,CAER,EACJ,CAAA;AAAA,IAAA,CAEP;AAAA,IACL,CAAC,OAAO,eAAe;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,OAAO,MAAM,YAAY;AAC5C;"}
|
|
@@ -10,5 +10,5 @@ export declare const useWrappedForm: typeof useForm;
|
|
|
10
10
|
* https://codesandbox.io/s/react-hook-form-nested-portal-6x3fvy?file=/src/App.tsx:1905-2261
|
|
11
11
|
* https://github.com/react-hook-form/react-hook-form/issues/1005#issuecomment-988380981
|
|
12
12
|
*/
|
|
13
|
-
export declare const stopPropagation: (callback: any) => (e:
|
|
13
|
+
export declare const stopPropagation: (callback: any) => (e: Event) => void;
|
|
14
14
|
//# sourceMappingURL=useWrappedForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWrappedForm.d.ts","sourceRoot":"","sources":["../../src/bootstrap/useWrappedForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGrD,eAAO,MAAM,aAAa,cAAe,SAAS,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"useWrappedForm.d.ts","sourceRoot":"","sources":["../../src/bootstrap/useWrappedForm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGrD,eAAO,MAAM,aAAa,cAAe,SAAS,CAAC,GAAG,CAAC,KAAG,OAAwD,CAAC;AAEnH,eAAO,MAAM,cAAc,EAAE,OAAO,OAmBnC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,aACb,GAAG,SACV,KAAK,KAAG,IAIX,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWrappedForm.js","sources":["../../src/bootstrap/useWrappedForm.ts"],"sourcesContent":["import { useForm, FormState } from 'react-hook-form';\nimport { useCallback } from 'react';\n\nexport const isFormLoading = (formState: FormState<any>) => formState.isLoading || formState.isSubmitting;\n\nexport const useWrappedForm: typeof useForm = (options) => {\n const form = useForm(options);\n\n const handleSubmit: typeof form.handleSubmit = useCallback(\n (onSubmit, onError) => {\n const wrappedSubmit: typeof onSubmit = async (data) => {\n try {\n await onSubmit(data);\n } catch (e) {\n form.setError('root', { type: 'server', message: e.message });\n console.error('Error submitting form', e);\n }\n };\n return form.handleSubmit(wrappedSubmit, onError);\n },\n [form],\n );\n\n return { ...form, handleSubmit };\n};\n\n/**\n * Issue #3: Submit event still propagates to parent when using portal\n * https://reactjs.org/docs/portals.html#event-bubbling-through-portals\n * Event bubbling goes through React DOM instead of HTML DOM\n * Portals don't have an effect on this one, we need to stop event propagation\n * This should be our default form handling method\n * https://codesandbox.io/s/react-hook-form-nested-portal-6x3fvy?file=/src/App.tsx:1905-2261\n * https://github.com/react-hook-form/react-hook-form/issues/1005#issuecomment-988380981\n */\nexport const stopPropagation
|
|
1
|
+
{"version":3,"file":"useWrappedForm.js","sources":["../../src/bootstrap/useWrappedForm.ts"],"sourcesContent":["import { useForm, FormState } from 'react-hook-form';\nimport { useCallback } from 'react';\n\nexport const isFormLoading = (formState: FormState<any>): boolean => formState.isLoading || formState.isSubmitting;\n\nexport const useWrappedForm: typeof useForm = (options) => {\n const form = useForm(options);\n\n const handleSubmit: typeof form.handleSubmit = useCallback(\n (onSubmit, onError) => {\n const wrappedSubmit: typeof onSubmit = async (data) => {\n try {\n await onSubmit(data);\n } catch (e) {\n form.setError('root', { type: 'server', message: (e as Error).message });\n console.error('Error submitting form', e);\n }\n };\n return form.handleSubmit(wrappedSubmit, onError);\n },\n [form],\n );\n\n return { ...form, handleSubmit };\n};\n\n/**\n * Issue #3: Submit event still propagates to parent when using portal\n * https://reactjs.org/docs/portals.html#event-bubbling-through-portals\n * Event bubbling goes through React DOM instead of HTML DOM\n * Portals don't have an effect on this one, we need to stop event propagation\n * This should be our default form handling method\n * https://codesandbox.io/s/react-hook-form-nested-portal-6x3fvy?file=/src/App.tsx:1905-2261\n * https://github.com/react-hook-form/react-hook-form/issues/1005#issuecomment-988380981\n */\nexport const stopPropagation =\n (callback: any) =>\n (e: Event): void => {\n e.stopPropagation();\n e.preventDefault();\n callback(e);\n };\n"],"names":[],"mappings":";;AAGO,MAAM,gBAAgB,CAAC,cAAuC,UAAU,aAAa,UAAU;AAEzF,MAAA,iBAAiC,CAAC,YAAY;AACjD,QAAA,OAAO,QAAQ,OAAO;AAE5B,QAAM,eAAyC;AAAA,IAC3C,CAAC,UAAU,YAAY;AACb,YAAA,gBAAiC,OAAO,SAAS;AAC/C,YAAA;AACA,gBAAM,SAAS,IAAI;AAAA,iBACd,GAAG;AACH,eAAA,SAAS,QAAQ,EAAE,MAAM,UAAU,SAAU,EAAY,SAAS;AAC/D,kBAAA,MAAM,yBAAyB,CAAC;AAAA,QAAA;AAAA,MAEhD;AACO,aAAA,KAAK,aAAa,eAAe,OAAO;AAAA,IACnD;AAAA,IACA,CAAC,IAAI;AAAA,EACT;AAEO,SAAA,EAAE,GAAG,MAAM,aAAa;AACnC;AAWO,MAAM,kBACT,CAAC,aACD,CAAC,MAAmB;AAChB,IAAE,gBAAgB;AAClB,IAAE,eAAe;AACjB,WAAS,CAAC;AACd;"}
|
package/dist/core/cache.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export type MaybePromise<T> = T | Promise<T>;
|
|
|
2
2
|
export declare const shallowCompare: (prev: any, next: any) => boolean;
|
|
3
3
|
export declare const equal: (prev: any, next: any) => boolean;
|
|
4
4
|
export declare const ANY: unique symbol;
|
|
5
|
-
export declare function createTracker<Dep = any>(whenDifferent: (next: Dep, prev?: Dep) => any, shallow?: boolean): (dependency: Dep) =>
|
|
5
|
+
export declare function createTracker<Dep = any>(whenDifferent: (next: Dep, prev?: Dep) => any, shallow?: boolean): (dependency: Dep) => Dep | false;
|
|
6
6
|
/**
|
|
7
7
|
* https://github.com/futpib/deep-weak-map
|
|
8
8
|
* https://github.com/fregante/many-keys-map
|
|
@@ -26,7 +26,7 @@ export declare function memo<Key extends any[], Val, SerializedKey extends any[]
|
|
|
26
26
|
dispose?: (prev: Val, ...key: SerializedKey) => void;
|
|
27
27
|
}): {
|
|
28
28
|
(...args: Key): Promise<{
|
|
29
|
-
value
|
|
29
|
+
value?: Val;
|
|
30
30
|
hit: boolean;
|
|
31
31
|
}>;
|
|
32
32
|
clear: (...condition: Key | any[]) => void;
|
package/dist/core/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,eAAO,MAAM,cAAc,SAAU,GAAG,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,eAAO,MAAM,cAAc,SAAU,GAAG,QAAQ,GAAG,KAAG,OACuD,CAAC;AAE9G,eAAO,MAAM,KAAK,SAAU,GAAG,QAAQ,GAAG,KAAG,OAAwB,CAAC;AAGtE,eAAO,MAAM,GAAG,EAAE,OAAO,MAAoB,CAAC;AAE9C,wBAAgB,aAAa,CAAC,GAAG,GAAG,GAAG,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,EAAE,OAAO,UAAQ,gBAK/D,GAAG,KAAG,GAAG,GAAG,KAAK,CAgBxD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,aAAa,SAAS,GAAG,EAAE,GAAG,GAAG,EAC1E,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,EACvC,EACI,GAAgD,EAChD,UAAU,EACV,OAAO,GACV,GAAE;IACC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,aAAa,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CACnD,GACP;IACC,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,GAAG,CAAC;QACZ,GAAG,EAAE,OAAO,CAAC;KAChB,CAAC,CAAC;IACH,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,MAAM,CAAC;CACtB,CA+CA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,8BAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;IAC1D,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAK3C,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;IAI5E,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;IAI1D,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO;IAQzB;;;OAGG;IACH,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;IAE7C,KAAK,IAAI,IAAI;IAMb,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAIzB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAkBrD"}
|
package/dist/core/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sources":["../../src/core/cache.ts"],"sourcesContent":["import ManyKeysMap from 'many-keys-map';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport const shallowCompare = (prev: any, next: any) =>\n Array.from(new Set([...Object.keys(prev), ...Object.keys(next)])).every((key) => prev[key] === next[key]);\n\nexport const equal = (prev: any, next: any) => prev === next;\n\nconst UNUSED = Symbol('UNUSED');\nexport const ANY = Symbol('*');\n\nexport function createTracker<Dep = any>(whenDifferent: (next: Dep, prev?: Dep) => any, shallow = false) {\n let lastDependency: Dep = UNUSED as any;\n\n const comparator = shallow ? shallowCompare : equal;\n\n return function tracker(dependency: Dep) {\n // console.log('Tracker', lastDependency, dependency);\n\n if (lastDependency !== UNUSED && comparator(lastDependency, dependency)) {\n // console.log('RETAINED cache', { lastDependency, dependency });\n return false;\n }\n\n // console.log('INVALIDATED cache', {lastDependency, dependency});\n\n const res = whenDifferent(dependency, lastDependency === UNUSED ? undefined : lastDependency) || true;\n\n lastDependency = dependency;\n\n return res;\n };\n}\n\n/**\n * https://github.com/futpib/deep-weak-map\n * https://github.com/fregante/many-keys-map\n * https://github.com/fregante/many-keys-weakmap\n * https://github.com/sindresorhus/memoize?tab=readme-ov-file#example-multiple-non-serializable-arguments\n *\n * ```ts\n * const memoized = memo(\n * (file, options, ...args) => { ... },\n * {\n * key: (file, options, ...args) => [file, JSON.stringify(options), ...args],\n * invalidate: (bitmap) => !bitmap.width,\n * dispose: (bitmap) => bitmap.close(),\n * }\n * );\n * ```\n */\nexport function memo<Key extends any[], Val, SerializedKey extends any[] = Key>(\n fn: (...args: Key) => MaybePromise<Val>,\n {\n key = (...k: Key) => k as never as SerializedKey,\n invalidate,\n dispose,\n }: {\n key?: (...key: Key) => SerializedKey;\n invalidate?: (prev: Val, ...key: SerializedKey) => boolean;\n dispose?: (prev: Val, ...key: SerializedKey) => void;\n } = {},\n) {\n const map = new ManyKeysMap<SerializedKey, Val>();\n\n //TODO Extend ManyKeysMap\n const clear = (...condition: Key | any[]) => {\n if (!condition?.length) {\n map.forEach((value, serializedKey) => {\n dispose?.(value, ...serializedKey);\n });\n map.clear();\n return;\n }\n\n const keyToClear = key(...(condition as any));\n\n map.forEach((value, serializedKey) => {\n if (!serializedKey.every((kk, i) => keyToClear[i] === ANY || kk === keyToClear[i])) return;\n dispose?.(value, ...serializedKey);\n map.delete(serializedKey);\n });\n };\n\n const size = () => map.size;\n\n async function memoized(...args: Key) {\n const k = key(...args);\n\n const has = map.has(k);\n const old = map.get(k);\n\n if (has && !invalidate?.(old as never as Val, ...k)) {\n return { value: map.get(k), hit: true };\n }\n\n const value = await fn(...args);\n\n map.set(k, value);\n\n return { hit: false, value };\n }\n\n memoized.clear = clear;\n memoized.size = size;\n\n //TODO return mimic-function(memorized, fn);\n\n return memoized;\n}\n\n/**\n * Allows to memoize values by key and invalidate them based on the previous value.\n *\n * This makes possible to implement various one-off and subsequent transformations.\n *\n * 1. `write`: Transform value BEFORE writing to cache, called only once if cache IS NOT present or IS NOT valid\n * 2. `read`: Transform value AFTER it's read from cache, always called if cache IS valid, keep in mind this transform is applied on top of BEFORE\n *\n * Both should return same type or null.\n *\n * If `newValue` is null, old is returned, and no cache is set.\n *\n * ```ts\n * class InputCache extends TypedCache<string, ImageBitmap> {\n * dispose(bitmap: ImageBitmap, key: string) {\n * bitmap.close();\n * }\n * }\n *\n * const cache = new InputCache('input');\n *\n * // Cache provided OffscreenCanvas by name and create context once per canvas\n *\n * class CanvasCache extends TypedCache<string, OffscreenCanvas> {\n * protected write(key: string, canvas: OffscreenCanvas): OffscreenCanvas {\n * const canvas = newValue.getContext('2d');\n * canvas.ctx = canvas;\n * return canvas;\n * }\n * }\n *\n * // Transfer control to offscreen canvas and track removal of original\n * // When called again, always return null, because canvas is handed to worker, and never returned to main\n *\n * class CanvasCache extends TypedCache<HTMLCanvasElement, OffscreenCanvas> {\n *\n * protected write(canvas: HTMLCanvasElement): OffscreenCanvas {\n * let l;\n * canvas.addEventListener(\n * 'remove',\n * (l = () => {\n * console.log('Removing canvas from cache', key);\n * this.delete(canvas);\n * key.removeEventListener('remove', l);\n * }),\n * );\n * return canvas.transferControlToOffscreen();\n * }\n *\n * protected read() {\n * return null;\n * }\n * }\n *\n * // Create bitmap from file and check if was used, return null if used\n * // Since bitmaps are also cached in worker, used bitmaps are not sent\n *\n * class BitmapCache extends TypedCache<File, ImageBitmap, File> {\n * protected async write(file: File): Promise<ImageBitmap> {\n * return await createImageBitmap(file);\n * }\n *\n * protected read(bitmap: ImageBitmap): Promise<ImageBitmap> | ImageBitmap {\n * if (!bitmap.width) return null;\n * return bitmap;\n * }\n * }\n *\n * ```\n */\nexport abstract class TransformerMap<Key, Val = Key> extends Map<Key, Val> {\n constructor(protected readonly name: string) {\n // console.warn('CREATE cache', name);\n super();\n }\n\n protected write(key: Key, newValue?: Val, oldValue?: Val): MaybePromise<Val> {\n return newValue as Val;\n }\n\n protected read(oldValue: Val, key: Key): MaybePromise<Val> {\n return oldValue;\n }\n\n delete(key: Key) {\n const val = this.get(key);\n const has = typeof val !== 'undefined';\n if (has) this.dispose(val, key);\n super.delete(key);\n return has;\n }\n\n /**\n * Do something with the value and key before removing it from cache\n * For example, close a file or a bitmap\n */\n protected dispose(value: Val, key: Key) {}\n\n clear() {\n console.log('CLEAR cache', this.name);\n this.forEach(this.dispose);\n super.clear();\n }\n\n set(key: Key, value: Val): this {\n throw new Error('Use memo() method instead');\n }\n\n async memo(key: Key, newValue?: Val): Promise<Val> {\n const oldValue = this.get(key);\n\n if (!!oldValue && (!newValue || newValue === oldValue)) {\n // console.log('FROM cache', this.name, key, 'old value', oldValue);\n return this.read?.(oldValue, key);\n }\n\n if (this.has(key)) this.delete(key);\n\n const value = await this.write(key, newValue, oldValue);\n\n super.set(key, value);\n\n // console.log('INVALIDATED KEY cache', this.name, key, 'has', has, 'invalidate', invalidate, 'new value', value);\n\n return value;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache.js","sources":["../../src/core/cache.ts"],"sourcesContent":["import ManyKeysMap from 'many-keys-map';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport const shallowCompare = (prev: any, next: any): boolean =>\n Array.from(new Set([...Object.keys(prev), ...Object.keys(next)])).every((key) => prev[key] === next[key]);\n\nexport const equal = (prev: any, next: any): boolean => prev === next;\n\nconst UNUSED = Symbol('UNUSED');\nexport const ANY: unique symbol = Symbol('*');\n\nexport function createTracker<Dep = any>(whenDifferent: (next: Dep, prev?: Dep) => any, shallow = false) {\n let lastDependency: Dep = UNUSED as any;\n\n const comparator = shallow ? shallowCompare : equal;\n\n return function tracker(dependency: Dep): Dep | false {\n // console.log('Tracker', lastDependency, dependency);\n\n if (lastDependency !== UNUSED && comparator(lastDependency, dependency)) {\n // console.log('RETAINED cache', { lastDependency, dependency });\n return false;\n }\n\n // console.log('INVALIDATED cache', {lastDependency, dependency});\n\n const res = whenDifferent(dependency, lastDependency === UNUSED ? undefined : lastDependency) || true;\n\n lastDependency = dependency;\n\n return res;\n };\n}\n\n/**\n * https://github.com/futpib/deep-weak-map\n * https://github.com/fregante/many-keys-map\n * https://github.com/fregante/many-keys-weakmap\n * https://github.com/sindresorhus/memoize?tab=readme-ov-file#example-multiple-non-serializable-arguments\n *\n * ```ts\n * const memoized = memo(\n * (file, options, ...args) => { ... },\n * {\n * key: (file, options, ...args) => [file, JSON.stringify(options), ...args],\n * invalidate: (bitmap) => !bitmap.width,\n * dispose: (bitmap) => bitmap.close(),\n * }\n * );\n * ```\n */\nexport function memo<Key extends any[], Val, SerializedKey extends any[] = Key>(\n fn: (...args: Key) => MaybePromise<Val>,\n {\n key = (...k: Key) => k as never as SerializedKey,\n invalidate,\n dispose,\n }: {\n key?: (...key: Key) => SerializedKey;\n invalidate?: (prev: Val, ...key: SerializedKey) => boolean;\n dispose?: (prev: Val, ...key: SerializedKey) => void;\n } = {},\n): {\n (...args: Key): Promise<{\n value?: Val;\n hit: boolean;\n }>;\n clear: (...condition: Key | any[]) => void;\n size: () => number;\n} {\n const map = new ManyKeysMap<SerializedKey, Val>();\n\n //TODO Extend ManyKeysMap\n const clear = (...condition: Key | any[]) => {\n if (!condition?.length) {\n map.forEach((value, serializedKey) => {\n dispose?.(value, ...serializedKey);\n });\n map.clear();\n return;\n }\n\n const keyToClear = key(...(condition as any));\n\n map.forEach((value, serializedKey) => {\n if (!serializedKey.every((kk, i) => keyToClear[i] === ANY || kk === keyToClear[i])) return;\n dispose?.(value, ...serializedKey);\n map.delete(serializedKey);\n });\n };\n\n const size = () => map.size;\n\n async function memoized(...args: Key) {\n const k = key(...args);\n\n const has = map.has(k);\n const old = map.get(k);\n\n if (has && !invalidate?.(old as never as Val, ...k)) {\n return { value: map.get(k), hit: true };\n }\n\n const value = await fn(...args);\n\n map.set(k, value);\n\n return { hit: false, value };\n }\n\n memoized.clear = clear;\n memoized.size = size;\n\n //TODO return mimic-function(memorized, fn);\n\n return memoized;\n}\n\n/**\n * Allows to memoize values by key and invalidate them based on the previous value.\n *\n * This makes possible to implement various one-off and subsequent transformations.\n *\n * 1. `write`: Transform value BEFORE writing to cache, called only once if cache IS NOT present or IS NOT valid\n * 2. `read`: Transform value AFTER it's read from cache, always called if cache IS valid, keep in mind this transform is applied on top of BEFORE\n *\n * Both should return same type or null.\n *\n * If `newValue` is null, old is returned, and no cache is set.\n *\n * ```ts\n * class InputCache extends TypedCache<string, ImageBitmap> {\n * dispose(bitmap: ImageBitmap, key: string) {\n * bitmap.close();\n * }\n * }\n *\n * const cache = new InputCache('input');\n *\n * // Cache provided OffscreenCanvas by name and create context once per canvas\n *\n * class CanvasCache extends TypedCache<string, OffscreenCanvas> {\n * protected write(key: string, canvas: OffscreenCanvas): OffscreenCanvas {\n * const canvas = newValue.getContext('2d');\n * canvas.ctx = canvas;\n * return canvas;\n * }\n * }\n *\n * // Transfer control to offscreen canvas and track removal of original\n * // When called again, always return null, because canvas is handed to worker, and never returned to main\n *\n * class CanvasCache extends TypedCache<HTMLCanvasElement, OffscreenCanvas> {\n *\n * protected write(canvas: HTMLCanvasElement): OffscreenCanvas {\n * let l;\n * canvas.addEventListener(\n * 'remove',\n * (l = () => {\n * console.log('Removing canvas from cache', key);\n * this.delete(canvas);\n * key.removeEventListener('remove', l);\n * }),\n * );\n * return canvas.transferControlToOffscreen();\n * }\n *\n * protected read() {\n * return null;\n * }\n * }\n *\n * // Create bitmap from file and check if was used, return null if used\n * // Since bitmaps are also cached in worker, used bitmaps are not sent\n *\n * class BitmapCache extends TypedCache<File, ImageBitmap, File> {\n * protected async write(file: File): Promise<ImageBitmap> {\n * return await createImageBitmap(file);\n * }\n *\n * protected read(bitmap: ImageBitmap): Promise<ImageBitmap> | ImageBitmap {\n * if (!bitmap.width) return null;\n * return bitmap;\n * }\n * }\n *\n * ```\n */\nexport abstract class TransformerMap<Key, Val = Key> extends Map<Key, Val> {\n constructor(protected readonly name: string) {\n // console.warn('CREATE cache', name);\n super();\n }\n\n protected write(key: Key, newValue?: Val, oldValue?: Val): MaybePromise<Val> {\n return newValue as Val;\n }\n\n protected read(oldValue: Val, key: Key): MaybePromise<Val> {\n return oldValue;\n }\n\n delete(key: Key): boolean {\n const val = this.get(key);\n const has = typeof val !== 'undefined';\n if (has) this.dispose(val, key);\n super.delete(key);\n return has;\n }\n\n /**\n * Do something with the value and key before removing it from cache\n * For example, close a file or a bitmap\n */\n protected dispose(value: Val, key: Key): void {}\n\n clear(): void {\n console.log('CLEAR cache', this.name);\n this.forEach(this.dispose);\n super.clear();\n }\n\n set(key: Key, value: Val): this {\n throw new Error('Use memo() method instead');\n }\n\n async memo(key: Key, newValue?: Val): Promise<Val> {\n const oldValue = this.get(key);\n\n if (!!oldValue && (!newValue || newValue === oldValue)) {\n // console.log('FROM cache', this.name, key, 'old value', oldValue);\n return this.read?.(oldValue, key);\n }\n\n if (this.has(key)) this.delete(key);\n\n const value = await this.write(key, newValue, oldValue);\n\n super.set(key, value);\n\n // console.log('INVALIDATED KEY cache', this.name, key, 'has', has, 'invalidate', invalidate, 'new value', value);\n\n return value;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AACA,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AACA,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,EAClD,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,MAAM,CAAC,EAAE,CAAC,EAAE,GACb,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAYpC"}
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sources":["../../src/core/errors.ts"],"sourcesContent":["// @see https://www.youtube.com/watch?v=AdmGHwvgaVs\nexport function catchErrors<T, E extends Error = Error>(promise: Promise<T
|
|
1
|
+
{"version":3,"file":"errors.js","sources":["../../src/core/errors.ts"],"sourcesContent":["// @see https://www.youtube.com/watch?v=AdmGHwvgaVs\nexport function catchErrors<T, E extends Error = Error>(\n promise: Promise<T>,\n errors?: E[],\n): Promise<any[] | (T | undefined)[]> {\n return promise\n .then((data) => [undefined, data])\n .catch((error) => {\n if (!errors?.length) {\n return [error];\n }\n if (errors.some((e) => e instanceof error)) {\n return [error];\n }\n throw error;\n });\n}\n"],"names":[],"mappings":"AACgB,SAAA,YACZ,SACA,QACkC;AAC3B,SAAA,QACF,KAAK,CAAC,SAAS,CAAC,QAAW,IAAI,CAAC,EAChC,MAAM,CAAC,UAAU;AACV,QAAA,EAAC,iCAAQ,SAAQ;AACjB,aAAO,CAAC,KAAK;AAAA,IAAA;AAEjB,QAAI,OAAO,KAAK,CAAC,MAAM,aAAa,KAAK,GAAG;AACxC,aAAO,CAAC,KAAK;AAAA,IAAA;AAEX,UAAA;AAAA,EAAA,CACT;AACT;"}
|
package/dist/core/files.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export declare const downloadFile: (
|
|
1
|
+
export declare const downloadFile: (file: File) => Promise<void>;
|
|
2
|
+
export declare const createFile: (text: any, filename?: string, type?: string) => Promise<File>;
|
|
2
3
|
export declare const openFile: () => Promise<string>;
|
|
3
4
|
//# sourceMappingURL=files.d.ts.map
|
package/dist/core/files.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,SAAgB,IAAI,KAAG,OAAO,CAAC,IAAI,CAM3D,CAAC;AAEF,eAAO,MAAM,UAAU,SAAgB,GAAG,uCAAsD,OAAO,CAAC,IAAI,CAE3G,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAO,OAAO,CAAC,MAAM,CAgBpC,CAAC"}
|
package/dist/core/files.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
const downloadFile = async (
|
|
1
|
+
const downloadFile = async (file) => {
|
|
2
2
|
const { saveAs } = require("file-saver");
|
|
3
|
-
saveAs(
|
|
3
|
+
return saveAs(file, file.name);
|
|
4
|
+
};
|
|
5
|
+
const createFile = async (text, filename = "file.json", type = "application/json") => {
|
|
6
|
+
return new File([new Blob([text], { type })], filename);
|
|
4
7
|
};
|
|
5
8
|
const openFile = () => new Promise((res, rej) => {
|
|
6
9
|
const input = document.createElement("input");
|
|
@@ -21,6 +24,7 @@ const openFile = () => new Promise((res, rej) => {
|
|
|
21
24
|
input.click();
|
|
22
25
|
});
|
|
23
26
|
export {
|
|
27
|
+
createFile,
|
|
24
28
|
downloadFile,
|
|
25
29
|
openFile
|
|
26
30
|
};
|
package/dist/core/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sources":["../../src/core/files.ts"],"sourcesContent":["export const downloadFile = async (
|
|
1
|
+
{"version":3,"file":"files.js","sources":["../../src/core/files.ts"],"sourcesContent":["export const downloadFile = async (file: File): Promise<void> => {\n //FIXME https://github.com/eligrey/FileSaver.js/issues/471\n const { saveAs } = require('file-saver');\n\n //FIXME https://github.com/eligrey/FileSaver.js/issues/731\n return saveAs(file, file.name);\n};\n\nexport const createFile = async (text: any, filename = 'file.json', type = 'application/json'): Promise<File> => {\n return new File([new Blob([text], { type })], filename);\n};\n\nexport const openFile = (): Promise<string> =>\n new Promise((res, rej) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.addEventListener('change', function readFile(e) {\n input.removeEventListener('change', readFile);\n // @ts-expect-error file is always there\n const [file] = e.target.files;\n if (!file) return;\n const reader = new FileReader();\n reader.onload = (e) => res(e.target?.result as string);\n reader.onerror = rej;\n reader.onabort = rej;\n reader.readAsText(file);\n });\n input.click();\n });\n"],"names":["e"],"mappings":"AAAa,MAAA,eAAe,OAAO,SAA8B;AAE7D,QAAM,EAAE,OAAA,IAAW,QAAQ,YAAY;AAGhC,SAAA,OAAO,MAAM,KAAK,IAAI;AACjC;AAEO,MAAM,aAAa,OAAO,MAAW,WAAW,aAAa,OAAO,uBAAsC;AAC7G,SAAO,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAA,CAAM,CAAC,GAAG,QAAQ;AAC1D;AAEO,MAAM,WAAW,MACpB,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAChB,QAAA,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,OAAO;AACb,QAAM,iBAAiB,UAAU,SAAS,SAAS,GAAG;AAC5C,UAAA,oBAAoB,UAAU,QAAQ;AAE5C,UAAM,CAAC,IAAI,IAAI,EAAE,OAAO;AACxB,QAAI,CAAC,KAAM;AACL,UAAA,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,CAACA,OAAAA;AAtBhB;AAsBsB,kBAAIA,QAAE,WAAFA,mBAAU,MAAgB;AAAA;AACrD,WAAO,UAAU;AACjB,WAAO,UAAU;AACjB,WAAO,WAAW,IAAI;AAAA,EAAA,CACzB;AACD,QAAM,MAAM;AAChB,CAAC;"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ANY, TransformerMap, createTracker, equal, memo, shallowCompare } from "./cache.js";
|
|
2
2
|
import { catchErrors } from "./errors.js";
|
|
3
|
-
import { downloadFile, openFile } from "./files.js";
|
|
3
|
+
import { createFile, downloadFile, openFile } from "./files.js";
|
|
4
4
|
import { getStorage } from "./ls.js";
|
|
5
5
|
import { colored, createMeasurer, uncolored } from "./measure.js";
|
|
6
6
|
import { Mutex } from "./mutex.js";
|
|
@@ -16,6 +16,7 @@ export {
|
|
|
16
16
|
WorkerDialog,
|
|
17
17
|
catchErrors,
|
|
18
18
|
colored,
|
|
19
|
+
createFile,
|
|
19
20
|
createMeasurer,
|
|
20
21
|
createTracker,
|
|
21
22
|
deriveController,
|
package/dist/core/ls.d.ts
CHANGED
package/dist/core/ls.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/core/ls.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/core/ls.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IACtC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAUA"}
|
package/dist/core/ls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ls.js","sources":["../../src/core/ls.ts"],"sourcesContent":["export function getStorage(pref: string) {\n const prefix = (key) => `${pref}-${key}`;\n\n const ls = (typeof window !== 'undefined' ? localStorage : null) as Storage;\n\n const read = (key: string) => JSON.parse(ls?.getItem(prefix(key)) || 'null');\n const write = (key: string, value: any) => ls?.setItem(prefix(key), JSON.stringify(value));\n const remove = (key: string) => ls?.removeItem(prefix(key));\n\n return { read, write, remove };\n}\n"],"names":[],"mappings":"AAAO,SAAS,WAAW,
|
|
1
|
+
{"version":3,"file":"ls.js","sources":["../../src/core/ls.ts"],"sourcesContent":["export function getStorage(pref: string): {\n read: (key: string) => null | any;\n write: (key: string, value: any) => void;\n remove: (key: string) => void;\n} {\n const prefix = (key) => `${pref}-${key}`;\n\n const ls = (typeof window !== 'undefined' ? localStorage : null) as Storage;\n\n const read = (key: string): any => JSON.parse(ls?.getItem(prefix(key)) || 'null');\n const write = (key: string, value: any): void => ls?.setItem(prefix(key), JSON.stringify(value));\n const remove = (key: string): void => ls?.removeItem(prefix(key));\n\n return { read, write, remove };\n}\n"],"names":[],"mappings":"AAAO,SAAS,WAAW,MAIzB;AACE,QAAM,SAAS,CAAC,QAAQ,GAAG,IAAI,IAAI,GAAG;AAEtC,QAAM,KAAM,OAAO,WAAW,cAAc,eAAe;AAErD,QAAA,OAAO,CAAC,QAAqB,KAAK,OAAM,yBAAI,QAAQ,OAAO,GAAG,OAAM,MAAM;AAChF,QAAM,QAAQ,CAAC,KAAa,UAAqB,yBAAI,QAAQ,OAAO,GAAG,GAAG,KAAK,UAAU,KAAK;AAC9F,QAAM,SAAS,CAAC,QAAsB,yBAAI,WAAW,OAAO,GAAG;AAExD,SAAA,EAAE,MAAM,OAAO,OAAO;AACjC;"}
|
package/dist/core/measure.d.ts
CHANGED
|
@@ -15,10 +15,10 @@ export declare const uncolored: {
|
|
|
15
15
|
err: (str: any) => any;
|
|
16
16
|
ok: (str: any) => any;
|
|
17
17
|
};
|
|
18
|
-
export declare function createMeasurer({ colors, prepend, padding }: {
|
|
19
|
-
colors?: boolean
|
|
20
|
-
prepend?: string
|
|
21
|
-
padding?: number
|
|
18
|
+
export declare function createMeasurer({ colors, prepend, padding, }: {
|
|
19
|
+
colors?: boolean;
|
|
20
|
+
prepend?: string;
|
|
21
|
+
padding?: number;
|
|
22
22
|
}): {
|
|
23
23
|
measure: (what: string, step: string, supplemental?: string, ...args: any[]) => {
|
|
24
24
|
done: (result?: string, ...args2: any[]) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/core/measure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtE,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/core/measure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEtE,eAAO,MAAM,OAAO,EAAE;IAClB,SAAS,EAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,GAAG,EAAE,OAAO,IAAI,CAAC;IACjB,GAAG,EAAE,OAAO,MAAM,CAAC;IACnB,GAAG,EAAE,OAAO,GAAG,CAAC;IAChB,EAAE,EAAE,OAAO,KAAK,CAAC;CAQpB,CAAC;AAIF,eAAO,MAAM,SAAS,EAAE;IACpB,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACvB,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACvB,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACvB,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;CAQzB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC3B,MAAa,EACb,OAAe,EACf,OAAY,GACf,EAAE;IACC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG;IACA,OAAO,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,GAAG,IAAI,EAAE,GAAG,EAAE,KACb;QACD,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QACjD,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QACjD,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACvB,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACvB,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;IACtB,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;CAC1B,CA+CA"}
|