@aglyn/shared-ui-jsx 1.0.0-beta.143
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/LICENSE +201 -0
- package/README.md +7 -0
- package/package.json +63 -0
- package/src/index.d.ts +48 -0
- package/src/index.js +179 -0
- package/src/index.js.map +1 -0
- package/src/lib/components/aglyn-text.d.ts +86 -0
- package/src/lib/components/aglyn-text.js +44 -0
- package/src/lib/components/aglyn-text.js.map +1 -0
- package/src/lib/components/app-link.d.ts +74 -0
- package/src/lib/components/app-link.js +139 -0
- package/src/lib/components/app-link.js.map +1 -0
- package/src/lib/components/aspect-ratio.d.ts +59 -0
- package/src/lib/components/aspect-ratio.js +153 -0
- package/src/lib/components/aspect-ratio.js.map +1 -0
- package/src/lib/components/background-image.component.d.ts +30 -0
- package/src/lib/components/background-image.component.js +42 -0
- package/src/lib/components/background-image.component.js.map +1 -0
- package/src/lib/components/card-columns.d.ts +86 -0
- package/src/lib/components/card-columns.js +148 -0
- package/src/lib/components/card-columns.js.map +1 -0
- package/src/lib/components/card-display.d.ts +36 -0
- package/src/lib/components/card-display.js +158 -0
- package/src/lib/components/card-display.js.map +1 -0
- package/src/lib/components/card-list-item.d.ts +35 -0
- package/src/lib/components/card-list-item.js +137 -0
- package/src/lib/components/card-list-item.js.map +1 -0
- package/src/lib/components/children-function-prop.d.ts +25 -0
- package/src/lib/components/children-function-prop.js +29 -0
- package/src/lib/components/children-function-prop.js.map +1 -0
- package/src/lib/components/confirmation-provider.component.d.ts +19 -0
- package/src/lib/components/confirmation-provider.component.js +83 -0
- package/src/lib/components/confirmation-provider.component.js.map +1 -0
- package/src/lib/components/container.d.ts +25 -0
- package/src/lib/components/container.js +62 -0
- package/src/lib/components/container.js.map +1 -0
- package/src/lib/components/data-table.component.d.ts +54 -0
- package/src/lib/components/data-table.component.js +211 -0
- package/src/lib/components/data-table.component.js.map +1 -0
- package/src/lib/components/dialog-confirm.d.ts +36 -0
- package/src/lib/components/dialog-confirm.js +74 -0
- package/src/lib/components/dialog-confirm.js.map +1 -0
- package/src/lib/components/ellipsis-pulse.component.d.ts +22 -0
- package/src/lib/components/ellipsis-pulse.component.js +51 -0
- package/src/lib/components/ellipsis-pulse.component.js.map +1 -0
- package/src/lib/components/emotion-cache-provider.d.ts +31 -0
- package/src/lib/components/emotion-cache-provider.js +40 -0
- package/src/lib/components/emotion-cache-provider.js.map +1 -0
- package/src/lib/components/empty-state.component.d.ts +63 -0
- package/src/lib/components/empty-state.component.js +214 -0
- package/src/lib/components/empty-state.component.js.map +1 -0
- package/src/lib/components/error-boundary.component.d.ts +28 -0
- package/src/lib/components/error-boundary.component.js +86 -0
- package/src/lib/components/error-boundary.component.js.map +1 -0
- package/src/lib/components/grid-buttons.d.ts +26 -0
- package/src/lib/components/grid-buttons.js +45 -0
- package/src/lib/components/grid-buttons.js.map +1 -0
- package/src/lib/components/grid-items.d.ts +103 -0
- package/src/lib/components/grid-items.js +336 -0
- package/src/lib/components/grid-items.js.map +1 -0
- package/src/lib/components/grid-list.d.ts +37 -0
- package/src/lib/components/grid-list.js +156 -0
- package/src/lib/components/grid-list.js.map +1 -0
- package/src/lib/components/help-tip.component.d.ts +30 -0
- package/src/lib/components/help-tip.component.js +139 -0
- package/src/lib/components/help-tip.component.js.map +1 -0
- package/src/lib/components/link-navigation-reporter.d.ts +24 -0
- package/src/lib/components/link-navigation-reporter.js +64 -0
- package/src/lib/components/link-navigation-reporter.js.map +1 -0
- package/src/lib/components/list-pagination.component.d.ts +57 -0
- package/src/lib/components/list-pagination.component.js +90 -0
- package/src/lib/components/list-pagination.component.js.map +1 -0
- package/src/lib/components/list-table.component.d.ts +155 -0
- package/src/lib/components/list-table.component.js +369 -0
- package/src/lib/components/list-table.component.js.map +1 -0
- package/src/lib/components/loading-layout-app.component.d.ts +35 -0
- package/src/lib/components/loading-layout-app.component.js +42 -0
- package/src/lib/components/loading-layout-app.component.js.map +1 -0
- package/src/lib/components/loading-modal-overlay.d.ts +30 -0
- package/src/lib/components/loading-modal-overlay.js +156 -0
- package/src/lib/components/loading-modal-overlay.js.map +1 -0
- package/src/lib/components/loading-modal.d.ts +19 -0
- package/src/lib/components/loading-modal.js +113 -0
- package/src/lib/components/loading-modal.js.map +1 -0
- package/src/lib/components/loading-text.component.d.ts +21 -0
- package/src/lib/components/loading-text.component.js +40 -0
- package/src/lib/components/loading-text.component.js.map +1 -0
- package/src/lib/components/mdi-icon/index.d.ts +2 -0
- package/src/lib/components/mdi-icon/index.js +4 -0
- package/src/lib/components/mdi-icon/index.js.map +1 -0
- package/src/lib/components/mdi-icon/md-icon-stack.d.ts +31 -0
- package/src/lib/components/mdi-icon/md-icon-stack.js +101 -0
- package/src/lib/components/mdi-icon/md-icon-stack.js.map +1 -0
- package/src/lib/components/mdi-icon/md-icon.d.ts +32 -0
- package/src/lib/components/mdi-icon/md-icon.js +147 -0
- package/src/lib/components/mdi-icon/md-icon.js.map +1 -0
- package/src/lib/components/mdi-icon/mdi-icon-from-id.d.ts +23 -0
- package/src/lib/components/mdi-icon/mdi-icon-from-id.js +35 -0
- package/src/lib/components/mdi-icon/mdi-icon-from-id.js.map +1 -0
- package/src/lib/components/mdi-icon/mdi-icon.d.ts +24 -0
- package/src/lib/components/mdi-icon/mdi-icon.js +46 -0
- package/src/lib/components/mdi-icon/mdi-icon.js.map +1 -0
- package/src/lib/components/measured-figures.component.d.ts +64 -0
- package/src/lib/components/measured-figures.component.js +161 -0
- package/src/lib/components/measured-figures.component.js.map +1 -0
- package/src/lib/components/menu.d.ts +45 -0
- package/src/lib/components/menu.js +229 -0
- package/src/lib/components/menu.js.map +1 -0
- package/src/lib/components/mui-shadow-dom.d.ts +38 -0
- package/src/lib/components/mui-shadow-dom.js +161 -0
- package/src/lib/components/mui-shadow-dom.js.map +1 -0
- package/src/lib/components/navigation-drawer.component.d.ts +31 -0
- package/src/lib/components/navigation-drawer.component.js +76 -0
- package/src/lib/components/navigation-drawer.component.js.map +1 -0
- package/src/lib/components/navigation-intent.d.ts +18 -0
- package/src/lib/components/navigation-intent.js +56 -0
- package/src/lib/components/navigation-intent.js.map +1 -0
- package/src/lib/components/navigation-view/index.d.ts +18 -0
- package/src/lib/components/navigation-view/index.js +19 -0
- package/src/lib/components/navigation-view/index.js.map +1 -0
- package/src/lib/components/navigation-view/navigation-view.d.ts +35 -0
- package/src/lib/components/navigation-view/navigation-view.js +175 -0
- package/src/lib/components/navigation-view/navigation-view.js.map +1 -0
- package/src/lib/components/next-link.d.ts +27 -0
- package/src/lib/components/next-link.js +88 -0
- package/src/lib/components/next-link.js.map +1 -0
- package/src/lib/components/popper-styled.component.d.ts +25 -0
- package/src/lib/components/popper-styled.component.js +129 -0
- package/src/lib/components/popper-styled.component.js.map +1 -0
- package/src/lib/components/quota-readout.component.d.ts +69 -0
- package/src/lib/components/quota-readout.component.js +52 -0
- package/src/lib/components/quota-readout.component.js.map +1 -0
- package/src/lib/components/resizeable-stack.d.ts +4 -0
- package/src/lib/components/resizeable-stack.js +23 -0
- package/src/lib/components/resizeable-stack.js.map +1 -0
- package/src/lib/components/row-actions-menu.component.d.ts +53 -0
- package/src/lib/components/row-actions-menu.component.js +132 -0
- package/src/lib/components/row-actions-menu.component.js.map +1 -0
- package/src/lib/components/ruler-guides.component.d.ts +35 -0
- package/src/lib/components/ruler-guides.component.js +166 -0
- package/src/lib/components/ruler-guides.component.js.map +1 -0
- package/src/lib/components/sandbox-frame.d.ts +42 -0
- package/src/lib/components/sandbox-frame.js +122 -0
- package/src/lib/components/sandbox-frame.js.map +1 -0
- package/src/lib/components/scroll-reaction.d.ts +59 -0
- package/src/lib/components/scroll-reaction.js +43 -0
- package/src/lib/components/scroll-reaction.js.map +1 -0
- package/src/lib/components/scroll-table.component.d.ts +124 -0
- package/src/lib/components/scroll-table.component.js +103 -0
- package/src/lib/components/scroll-table.component.js.map +1 -0
- package/src/lib/components/shadow-dom/index.d.ts +18 -0
- package/src/lib/components/shadow-dom/index.js +19 -0
- package/src/lib/components/shadow-dom/index.js.map +1 -0
- package/src/lib/components/shadow-dom/shadow-dom.d.ts +42 -0
- package/src/lib/components/shadow-dom/shadow-dom.js +123 -0
- package/src/lib/components/shadow-dom/shadow-dom.js.map +1 -0
- package/src/lib/components/splash-screen.d.ts +33 -0
- package/src/lib/components/splash-screen.js +105 -0
- package/src/lib/components/splash-screen.js.map +1 -0
- package/src/lib/components/sr-only.d.ts +20 -0
- package/src/lib/components/sr-only.js +25 -0
- package/src/lib/components/sr-only.js.map +1 -0
- package/src/lib/components/status-screen-plain.component.d.ts +27 -0
- package/src/lib/components/status-screen-plain.component.js +178 -0
- package/src/lib/components/status-screen-plain.component.js.map +1 -0
- package/src/lib/components/usage-meter.component.d.ts +30 -0
- package/src/lib/components/usage-meter.component.js +92 -0
- package/src/lib/components/usage-meter.component.js.map +1 -0
- package/src/lib/components/variable-text-field.component.d.ts +50 -0
- package/src/lib/components/variable-text-field.component.js +188 -0
- package/src/lib/components/variable-text-field.component.js.map +1 -0
- package/src/lib/components/zoomable-panning-component/index.d.ts +1 -0
- package/src/lib/components/zoomable-panning-component/index.js +3 -0
- package/src/lib/components/zoomable-panning-component/index.js.map +1 -0
- package/src/lib/components/zoomable-panning-component/util.d.ts +58 -0
- package/src/lib/components/zoomable-panning-component/util.js +114 -0
- package/src/lib/components/zoomable-panning-component/util.js.map +1 -0
- package/src/lib/components/zoomable-panning-component/zoomable-panning-component.d.ts +132 -0
- package/src/lib/components/zoomable-panning-component/zoomable-panning-component.js +728 -0
- package/src/lib/components/zoomable-panning-component/zoomable-panning-component.js.map +1 -0
- package/src/lib/const/aglyn-besigner-logo-full.d.ts +39 -0
- package/src/lib/const/aglyn-besigner-logo-full.js +146 -0
- package/src/lib/const/aglyn-besigner-logo-full.js.map +1 -0
- package/src/lib/const/aglyn-console-logo-full.d.ts +34 -0
- package/src/lib/const/aglyn-console-logo-full.js +142 -0
- package/src/lib/const/aglyn-console-logo-full.js.map +1 -0
- package/src/lib/const/aglyn-logo-class-keys.d.ts +30 -0
- package/src/lib/const/aglyn-logo-class-keys.js +32 -0
- package/src/lib/const/aglyn-logo-class-keys.js.map +1 -0
- package/src/lib/const/aglyn-logo-full.d.ts +29 -0
- package/src/lib/const/aglyn-logo-full.js +111 -0
- package/src/lib/const/aglyn-logo-full.js.map +1 -0
- package/src/lib/const/list-filter.d.ts +260 -0
- package/src/lib/const/list-filter.js +409 -0
- package/src/lib/const/list-filter.js.map +1 -0
- package/src/lib/const/prebuilt-components.d.ts +17 -0
- package/src/lib/const/prebuilt-components.js +22 -0
- package/src/lib/const/prebuilt-components.js.map +1 -0
- package/src/lib/const/svg-icons.d.ts +75 -0
- package/src/lib/const/svg-icons.js +313 -0
- package/src/lib/const/svg-icons.js.map +1 -0
- package/src/lib/const/table-pagination.d.ts +106 -0
- package/src/lib/const/table-pagination.js +106 -0
- package/src/lib/const/table-pagination.js.map +1 -0
- package/src/lib/contexts/confirmation.context.d.ts +996 -0
- package/src/lib/contexts/confirmation.context.js +49 -0
- package/src/lib/contexts/confirmation.context.js.map +1 -0
- package/src/lib/contexts/loading.context.d.ts +93 -0
- package/src/lib/contexts/loading.context.js +126 -0
- package/src/lib/contexts/loading.context.js.map +1 -0
- package/src/lib/hocs/create-hoc-with-context-consumer.d.ts +36 -0
- package/src/lib/hocs/create-hoc-with-context-consumer.js +44 -0
- package/src/lib/hocs/create-hoc-with-context-consumer.js.map +1 -0
- package/src/lib/hocs/with-hoc.d.ts +32 -0
- package/src/lib/hocs/with-hoc.js +37 -0
- package/src/lib/hocs/with-hoc.js.map +1 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icon.d.ts +20 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icon.js +48 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icon.js.map +1 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icons-fuzzy.d.ts +26 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icons-fuzzy.js +73 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icons-fuzzy.js.map +1 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icons.d.ts +19 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icons.js +49 -0
- package/src/lib/hooks/mdi-icon/use-mdi-icons.js.map +1 -0
- package/src/lib/hooks/router-events.d.ts +56 -0
- package/src/lib/hooks/router-events.js +88 -0
- package/src/lib/hooks/router-events.js.map +1 -0
- package/src/lib/hooks/use-async-effect.d.ts +24 -0
- package/src/lib/hooks/use-async-effect.js +44 -0
- package/src/lib/hooks/use-async-effect.js.map +1 -0
- package/src/lib/hooks/use-callback-param-ref.d.ts +19 -0
- package/src/lib/hooks/use-callback-param-ref.js +29 -0
- package/src/lib/hooks/use-callback-param-ref.js.map +1 -0
- package/src/lib/hooks/use-id.d.ts +21 -0
- package/src/lib/hooks/use-id.js +28 -0
- package/src/lib/hooks/use-id.js.map +1 -0
- package/src/lib/hooks/use-isomorphic-layout-effect.d.ts +19 -0
- package/src/lib/hooks/use-isomorphic-layout-effect.js +20 -0
- package/src/lib/hooks/use-isomorphic-layout-effect.js.map +1 -0
- package/src/lib/hooks/use-merge-refs.d.ts +38 -0
- package/src/lib/hooks/use-merge-refs.js +52 -0
- package/src/lib/hooks/use-merge-refs.js.map +1 -0
- package/src/lib/hooks/use-subscribable.d.ts +29 -0
- package/src/lib/hooks/use-subscribable.js +50 -0
- package/src/lib/hooks/use-subscribable.js.map +1 -0
- package/src/lib/types.d.ts +18 -0
- package/src/lib/types.js +18 -0
- package/src/lib/types.js.map +1 -0
- package/src/lib/utils/make-link-elements.d.ts +24 -0
- package/src/lib/utils/make-link-elements.js +32 -0
- package/src/lib/utils/make-link-elements.js.map +1 -0
- package/src/lib/utils/make-meta-elements.d.ts +24 -0
- package/src/lib/utils/make-meta-elements.js +32 -0
- package/src/lib/utils/make-meta-elements.js.map +1 -0
- package/src/lib/utils/scroll-overflow.d.ts +120 -0
- package/src/lib/utils/scroll-overflow.js +115 -0
- package/src/lib/utils/scroll-overflow.js.map +1 -0
- package/src/lib/utils/vendor.d.ts +17 -0
- package/src/lib/utils/vendor.js +18 -0
- package/src/lib/utils/vendor.js.map +1 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2023 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ import { _isFnT } from "@aglyn/shared-util-tools";
|
|
18
|
+
import { useScrollTrigger } from "@mui/material";
|
|
19
|
+
import { cloneElement } from "react";
|
|
20
|
+
export function ScrollReaction(props) {
|
|
21
|
+
const { children, renderProps, threshold, target, withHysteresis, withoutHysteresis } = props;
|
|
22
|
+
const activeWithoutHysteresis = useScrollTrigger(_extends({
|
|
23
|
+
disableHysteresis: true,
|
|
24
|
+
threshold,
|
|
25
|
+
target: target != null ? target : undefined
|
|
26
|
+
}, withoutHysteresis));
|
|
27
|
+
const activeWithHysteresis = useScrollTrigger(_extends({
|
|
28
|
+
disableHysteresis: false,
|
|
29
|
+
threshold,
|
|
30
|
+
target: target != null ? target : undefined
|
|
31
|
+
}, withHysteresis));
|
|
32
|
+
const activity = {
|
|
33
|
+
activeWithHysteresis,
|
|
34
|
+
activeWithoutHysteresis
|
|
35
|
+
};
|
|
36
|
+
if (_isFnT(children)) return children(activity);
|
|
37
|
+
return /*#__PURE__*/ cloneElement(children, _isFnT(renderProps) ? renderProps(activity) : renderProps);
|
|
38
|
+
}
|
|
39
|
+
ScrollReaction.displayName = 'ScrollReaction';
|
|
40
|
+
ScrollReaction.aglyn = true;
|
|
41
|
+
export default ScrollReaction;
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=scroll-reaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../libs/shared/ui/jsx/src/lib/components/scroll-reaction.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2023 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _isFnT } from '@aglyn/shared-util-tools'\nimport { useScrollTrigger } from '@mui/material'\nimport { cloneElement, type ReactElement } from 'react'\n\ntype UseScrollTriggerOptions = Parameters<typeof useScrollTrigger>[0]\n\nexport type ElevatedRenderProps = {\n activeWithHysteresis: boolean\n activeWithoutHysteresis: boolean\n}\n\nexport type ScrollTriggerOptions = Omit<\n UseScrollTriggerOptions,\n 'disableHysteresis'\n>\n\nexport interface ScrollReactionProps<P = any> extends ScrollTriggerOptions {\n /**\n * If children is a render function then passes local state to parameter.\n * Otherwise will clone child element, passing or calling renderProps\n */\n children: ReactElement<P> | ((state: ElevatedRenderProps) => ReactElement<P>)\n /**\n * Optionally, provide a render props function to contextually change passed\n * props based on the local state provided through the\n */\n renderProps?: Partial<P> | ((state: ElevatedRenderProps) => Partial<P>)\n\n /**\n * Optionally provided to override the options passed to useScrollTrigger for\n * the hook responding to triggers *WITH* hysteresis.\n *\n * __Meaning of Hysteresis__\n * > The meaning of hysteresis is \"lagging.\" Hysteresis is characterized as a\n * > lag of magnetic flux density (B) behind the magnetic field strength (H).\n */\n withHysteresis?: ScrollTriggerOptions\n /**\n * Optionally provided to override the options passed to\n * the`useScrollTrigger` for the hook responding to triggers *WITHOUT*\n * hysteresis.\n *\n * @see {@link withHysteresis} for Hysteresis meaning\n */\n withoutHysteresis?: ScrollTriggerOptions\n}\n\nexport function ScrollReaction<P>(\n props: ScrollReactionProps<P>,\n): ReactElement<P> {\n const {\n children,\n renderProps,\n threshold,\n target,\n withHysteresis,\n withoutHysteresis,\n } = props\n\n const activeWithoutHysteresis = useScrollTrigger({\n disableHysteresis: true,\n threshold,\n target: target ?? undefined,\n ...withoutHysteresis,\n })\n const activeWithHysteresis = useScrollTrigger({\n disableHysteresis: false,\n threshold,\n target: target ?? undefined,\n ...withHysteresis,\n })\n const activity = { activeWithHysteresis, activeWithoutHysteresis }\n\n if (_isFnT(children))\n return (children as (state: ElevatedRenderProps) => ReactElement<P>)(\n activity,\n )\n\n return cloneElement(\n children as ReactElement<P>,\n (_isFnT(renderProps) ? renderProps(activity) : renderProps) as Partial<P>,\n )\n}\n\nScrollReaction.displayName = 'ScrollReaction'\nScrollReaction.aglyn = true\n\nexport default ScrollReaction\n"],"names":["_isFnT","useScrollTrigger","cloneElement","ScrollReaction","props","children","renderProps","threshold","target","withHysteresis","withoutHysteresis","activeWithoutHysteresis","disableHysteresis","undefined","activeWithHysteresis","activity","displayName","aglyn"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,MAAM,QAAQ,2BAA0B;AACjD,SAASC,gBAAgB,QAAQ,gBAAe;AAChD,SAASC,YAAY,QAA2B,QAAO;AA6CvD,OAAO,SAASC,eACdC,KAA6B;IAE7B,MAAM,EACJC,QAAQ,EACRC,WAAW,EACXC,SAAS,EACTC,MAAM,EACNC,cAAc,EACdC,iBAAiB,EAClB,GAAGN;IAEJ,MAAMO,0BAA0BV,iBAAiB;QAC/CW,mBAAmB;QACnBL;QACAC,MAAM,EAAEA,iBAAAA,SAAUK;OACfH;IAEL,MAAMI,uBAAuBb,iBAAiB;QAC5CW,mBAAmB;QACnBL;QACAC,MAAM,EAAEA,iBAAAA,SAAUK;OACfJ;IAEL,MAAMM,WAAW;QAAED;QAAsBH;IAAwB;IAEjE,IAAIX,OAAOK,WACT,OAAO,AAACA,SACNU;IAGJ,qBAAOb,aACLG,UACCL,OAAOM,eAAeA,YAAYS,YAAYT;AAEnD;AAEAH,eAAea,WAAW,GAAG;AAC7Bb,eAAec,KAAK,GAAG;AAEvB,eAAed,eAAc"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { type TableContainerProps, type TableProps } from '@mui/material';
|
|
18
|
+
export type ScrollTableProps = TableProps & ({
|
|
19
|
+
/**
|
|
20
|
+
* The scroll box around the table. Its `sx` is merged AFTER the box's
|
|
21
|
+
* own, so a caller can bound the box's height or space it out without
|
|
22
|
+
* taking the scroll away. `role`, `aria-label` and `tabIndex` belong
|
|
23
|
+
* here when a surface has to name the box (the customer-page Table
|
|
24
|
+
* element does).
|
|
25
|
+
*/
|
|
26
|
+
ContainerProps?: TableContainerProps & {
|
|
27
|
+
[attribute: `data-${string}`]: unknown;
|
|
28
|
+
};
|
|
29
|
+
nested?: false;
|
|
30
|
+
} | {
|
|
31
|
+
ContainerProps?: never;
|
|
32
|
+
/**
|
|
33
|
+
* The table sits in a cell of another `ScrollTable`, whose box
|
|
34
|
+
* already scrolls it: it is drawn with no box of its own.
|
|
35
|
+
*/
|
|
36
|
+
nested: true;
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* EVERY TABLE THAT IS NOT A RECORD LIST (AGL-3045).
|
|
40
|
+
*
|
|
41
|
+
* ## Why a table needs a box of its own
|
|
42
|
+
*
|
|
43
|
+
* A MUI `Card` clips what leaves it (`overflow: hidden`), and a `Table` is at
|
|
44
|
+
* least as wide as its widest unbreakable content — an id, a date, a figure.
|
|
45
|
+
* A bare table whose content outgrows its card is cut off at the card's edge,
|
|
46
|
+
* and nothing on the page can reach the columns past it.
|
|
47
|
+
*
|
|
48
|
+
* `DataTableComponent` and `ListTable` scroll their own columns, so a record
|
|
49
|
+
* list — rows of jobs, people, orders, anything paged or sorted — belongs
|
|
50
|
+
* there. What is left is drawn here: a breakdown by kind, month or
|
|
51
|
+
* jurisdiction, a key/value readout, a preview inside a dialog, a row of
|
|
52
|
+
* inputs.
|
|
53
|
+
*
|
|
54
|
+
* ## What it does
|
|
55
|
+
*
|
|
56
|
+
* The table sits in MUI's `TableContainer` (`width: 100%`, `overflow-x:
|
|
57
|
+
* auto`), so content wider than the card scrolls inside the card instead of
|
|
58
|
+
* being cut by it. The box carries the house overflow fade from
|
|
59
|
+
* `scroll-overflow`, which is how an overlay-scrollbar platform — macOS, by
|
|
60
|
+
* default — admits the table continues: a scroll-driven animation that is
|
|
61
|
+
* inactive, and paints nothing, while there is nothing to scroll.
|
|
62
|
+
*
|
|
63
|
+
* ## Why the table keeps `width: 100%` here
|
|
64
|
+
*
|
|
65
|
+
* The customer-page Table element sizes its table to `max-content`, capped at
|
|
66
|
+
* 560px, so a comparison matrix of prose cells scrolls rather than wrapping
|
|
67
|
+
* each cell into six lines (AGL-2568). That cap is safe on a full-width page
|
|
68
|
+
* section, which is never narrower than 560px from a tablet up. A console card
|
|
69
|
+
* is: two-column card flows put cards well under 560px at tablet and laptop
|
|
70
|
+
* widths, so the same sizing would put a scrollbar on tables that fit today.
|
|
71
|
+
* The console's defect is the unbreakable cell, and a `width: 100%` table
|
|
72
|
+
* overflows on exactly that — so the table fills its card, wraps what can
|
|
73
|
+
* wrap, and scrolls when what cannot wrap does not fit. A surface that wants
|
|
74
|
+
* the prose sizing passes it as the table's `sx`, as the Table element does.
|
|
75
|
+
*
|
|
76
|
+
* ## Keyboard
|
|
77
|
+
*
|
|
78
|
+
* Chromium (130+) and Firefox make a scroll box with no focusable content
|
|
79
|
+
* keyboard-reachable on their own, and a table of links or buttons scrolls to
|
|
80
|
+
* whichever one takes focus. A surface that must also NAME the box — a region
|
|
81
|
+
* a screen reader announces — passes `role`, `aria-label` and `tabIndex`
|
|
82
|
+
* through `ContainerProps` (see `scrollRegionProps`).
|
|
83
|
+
*
|
|
84
|
+
* ## A table inside a table
|
|
85
|
+
*
|
|
86
|
+
* A tree draws a parent's children as a table nested in a full-width cell of
|
|
87
|
+
* the parent's table. That table is already inside the outer box, which
|
|
88
|
+
* scrolls the whole tree as one piece; a box of its own would make every
|
|
89
|
+
* subtree a scroll region and a clip of its own, for content that is exactly
|
|
90
|
+
* as wide as the table around it. `nested` draws it bare.
|
|
91
|
+
*
|
|
92
|
+
* ## Shape
|
|
93
|
+
*
|
|
94
|
+
* Every `Table` prop goes to the table; `ContainerProps` go to the box; `ref`
|
|
95
|
+
* is the box, the element that holds the table's place on the page, so a
|
|
96
|
+
* `nested` table, which has no box, takes no ref.
|
|
97
|
+
* `aglyn/no-raw-mui-table` refuses a MUI `Table` or `TableContainer` anywhere
|
|
98
|
+
* but this file.
|
|
99
|
+
*/
|
|
100
|
+
export declare const ScrollTable: import("react").ForwardRefExoticComponent<(Omit<import("@mui/material").TableOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<import("react").DetailedHTMLProps<import("react").TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, "children" | "style" | "className" | "padding" | "classes" | "sx" | "size" | "stickyHeader"> & {
|
|
101
|
+
component?: React.ElementType | undefined;
|
|
102
|
+
} & {
|
|
103
|
+
/**
|
|
104
|
+
* The scroll box around the table. Its `sx` is merged AFTER the box's
|
|
105
|
+
* own, so a caller can bound the box's height or space it out without
|
|
106
|
+
* taking the scroll away. `role`, `aria-label` and `tabIndex` belong
|
|
107
|
+
* here when a surface has to name the box (the customer-page Table
|
|
108
|
+
* element does).
|
|
109
|
+
*/
|
|
110
|
+
ContainerProps?: TableContainerProps & {
|
|
111
|
+
[attribute: `data-${string}`]: unknown;
|
|
112
|
+
};
|
|
113
|
+
nested?: false;
|
|
114
|
+
}, "ref"> | Omit<import("@mui/material").TableOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<import("react").DetailedHTMLProps<import("react").TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, "children" | "style" | "className" | "padding" | "classes" | "sx" | "size" | "stickyHeader"> & {
|
|
115
|
+
component?: React.ElementType | undefined;
|
|
116
|
+
} & {
|
|
117
|
+
ContainerProps?: never;
|
|
118
|
+
/**
|
|
119
|
+
* The table sits in a cell of another `ScrollTable`, whose box
|
|
120
|
+
* already scrolls it: it is drawn with no box of its own.
|
|
121
|
+
*/
|
|
122
|
+
nested: true;
|
|
123
|
+
}, "ref">) & import("react").RefAttributes<HTMLDivElement>>;
|
|
124
|
+
export default ScrollTable;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
|
|
3
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
|
+
/**
|
|
5
|
+
* @license
|
|
6
|
+
* Copyright 2026 Aglyn LLC
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
* you may not use this file except in compliance with the License.
|
|
10
|
+
* You may obtain a copy of the License at
|
|
11
|
+
*
|
|
12
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
*
|
|
14
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/ import { mergeSxProps } from "@aglyn/shared-ui-theme";
|
|
20
|
+
import { Table, TableContainer } from "@mui/material";
|
|
21
|
+
import { forwardRef } from "react";
|
|
22
|
+
import { scrollableTableWrapperSx } from "../utils/scroll-overflow.js";
|
|
23
|
+
/**
|
|
24
|
+
* EVERY TABLE THAT IS NOT A RECORD LIST (AGL-3045).
|
|
25
|
+
*
|
|
26
|
+
* ## Why a table needs a box of its own
|
|
27
|
+
*
|
|
28
|
+
* A MUI `Card` clips what leaves it (`overflow: hidden`), and a `Table` is at
|
|
29
|
+
* least as wide as its widest unbreakable content — an id, a date, a figure.
|
|
30
|
+
* A bare table whose content outgrows its card is cut off at the card's edge,
|
|
31
|
+
* and nothing on the page can reach the columns past it.
|
|
32
|
+
*
|
|
33
|
+
* `DataTableComponent` and `ListTable` scroll their own columns, so a record
|
|
34
|
+
* list — rows of jobs, people, orders, anything paged or sorted — belongs
|
|
35
|
+
* there. What is left is drawn here: a breakdown by kind, month or
|
|
36
|
+
* jurisdiction, a key/value readout, a preview inside a dialog, a row of
|
|
37
|
+
* inputs.
|
|
38
|
+
*
|
|
39
|
+
* ## What it does
|
|
40
|
+
*
|
|
41
|
+
* The table sits in MUI's `TableContainer` (`width: 100%`, `overflow-x:
|
|
42
|
+
* auto`), so content wider than the card scrolls inside the card instead of
|
|
43
|
+
* being cut by it. The box carries the house overflow fade from
|
|
44
|
+
* `scroll-overflow`, which is how an overlay-scrollbar platform — macOS, by
|
|
45
|
+
* default — admits the table continues: a scroll-driven animation that is
|
|
46
|
+
* inactive, and paints nothing, while there is nothing to scroll.
|
|
47
|
+
*
|
|
48
|
+
* ## Why the table keeps `width: 100%` here
|
|
49
|
+
*
|
|
50
|
+
* The customer-page Table element sizes its table to `max-content`, capped at
|
|
51
|
+
* 560px, so a comparison matrix of prose cells scrolls rather than wrapping
|
|
52
|
+
* each cell into six lines (AGL-2568). That cap is safe on a full-width page
|
|
53
|
+
* section, which is never narrower than 560px from a tablet up. A console card
|
|
54
|
+
* is: two-column card flows put cards well under 560px at tablet and laptop
|
|
55
|
+
* widths, so the same sizing would put a scrollbar on tables that fit today.
|
|
56
|
+
* The console's defect is the unbreakable cell, and a `width: 100%` table
|
|
57
|
+
* overflows on exactly that — so the table fills its card, wraps what can
|
|
58
|
+
* wrap, and scrolls when what cannot wrap does not fit. A surface that wants
|
|
59
|
+
* the prose sizing passes it as the table's `sx`, as the Table element does.
|
|
60
|
+
*
|
|
61
|
+
* ## Keyboard
|
|
62
|
+
*
|
|
63
|
+
* Chromium (130+) and Firefox make a scroll box with no focusable content
|
|
64
|
+
* keyboard-reachable on their own, and a table of links or buttons scrolls to
|
|
65
|
+
* whichever one takes focus. A surface that must also NAME the box — a region
|
|
66
|
+
* a screen reader announces — passes `role`, `aria-label` and `tabIndex`
|
|
67
|
+
* through `ContainerProps` (see `scrollRegionProps`).
|
|
68
|
+
*
|
|
69
|
+
* ## A table inside a table
|
|
70
|
+
*
|
|
71
|
+
* A tree draws a parent's children as a table nested in a full-width cell of
|
|
72
|
+
* the parent's table. That table is already inside the outer box, which
|
|
73
|
+
* scrolls the whole tree as one piece; a box of its own would make every
|
|
74
|
+
* subtree a scroll region and a clip of its own, for content that is exactly
|
|
75
|
+
* as wide as the table around it. `nested` draws it bare.
|
|
76
|
+
*
|
|
77
|
+
* ## Shape
|
|
78
|
+
*
|
|
79
|
+
* Every `Table` prop goes to the table; `ContainerProps` go to the box; `ref`
|
|
80
|
+
* is the box, the element that holds the table's place on the page, so a
|
|
81
|
+
* `nested` table, which has no box, takes no ref.
|
|
82
|
+
* `aglyn/no-raw-mui-table` refuses a MUI `Table` or `TableContainer` anywhere
|
|
83
|
+
* but this file.
|
|
84
|
+
*/ export const ScrollTable = /*#__PURE__*/ forwardRef(function ScrollTable(props, ref) {
|
|
85
|
+
const { ContainerProps, nested } = props, tableProps = _object_without_properties_loose(props, [
|
|
86
|
+
"ContainerProps",
|
|
87
|
+
"nested"
|
|
88
|
+
]);
|
|
89
|
+
if (nested) return /*#__PURE__*/ _jsx(Table, _extends({}, tableProps));
|
|
90
|
+
const _ref = ContainerProps != null ? ContainerProps : {}, { sx: containerSx } = _ref, container = _object_without_properties_loose(_ref, [
|
|
91
|
+
"sx"
|
|
92
|
+
]);
|
|
93
|
+
return /*#__PURE__*/ _jsx(TableContainer, _extends({
|
|
94
|
+
ref: ref
|
|
95
|
+
}, container, {
|
|
96
|
+
sx: mergeSxProps(scrollableTableWrapperSx, containerSx),
|
|
97
|
+
children: /*#__PURE__*/ _jsx(Table, _extends({}, tableProps))
|
|
98
|
+
}));
|
|
99
|
+
});
|
|
100
|
+
ScrollTable.displayName = 'ScrollTable';
|
|
101
|
+
export default ScrollTable;
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=scroll-table.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../libs/shared/ui/jsx/src/lib/components/scroll-table.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { mergeSxProps } from '@aglyn/shared-ui-theme'\nimport {\n Table,\n TableContainer,\n type TableContainerProps,\n type TableProps,\n} from '@mui/material'\nimport { forwardRef } from 'react'\nimport { scrollableTableWrapperSx } from '../utils/scroll-overflow'\n\nexport type ScrollTableProps = TableProps &\n (\n | {\n /**\n * The scroll box around the table. Its `sx` is merged AFTER the box's\n * own, so a caller can bound the box's height or space it out without\n * taking the scroll away. `role`, `aria-label` and `tabIndex` belong\n * here when a surface has to name the box (the customer-page Table\n * element does).\n */\n ContainerProps?: TableContainerProps & {\n [attribute: `data-${string}`]: unknown\n }\n nested?: false\n }\n | {\n ContainerProps?: never\n /**\n * The table sits in a cell of another `ScrollTable`, whose box\n * already scrolls it: it is drawn with no box of its own.\n */\n nested: true\n }\n )\n\n/**\n * EVERY TABLE THAT IS NOT A RECORD LIST (AGL-3045).\n *\n * ## Why a table needs a box of its own\n *\n * A MUI `Card` clips what leaves it (`overflow: hidden`), and a `Table` is at\n * least as wide as its widest unbreakable content — an id, a date, a figure.\n * A bare table whose content outgrows its card is cut off at the card's edge,\n * and nothing on the page can reach the columns past it.\n *\n * `DataTableComponent` and `ListTable` scroll their own columns, so a record\n * list — rows of jobs, people, orders, anything paged or sorted — belongs\n * there. What is left is drawn here: a breakdown by kind, month or\n * jurisdiction, a key/value readout, a preview inside a dialog, a row of\n * inputs.\n *\n * ## What it does\n *\n * The table sits in MUI's `TableContainer` (`width: 100%`, `overflow-x:\n * auto`), so content wider than the card scrolls inside the card instead of\n * being cut by it. The box carries the house overflow fade from\n * `scroll-overflow`, which is how an overlay-scrollbar platform — macOS, by\n * default — admits the table continues: a scroll-driven animation that is\n * inactive, and paints nothing, while there is nothing to scroll.\n *\n * ## Why the table keeps `width: 100%` here\n *\n * The customer-page Table element sizes its table to `max-content`, capped at\n * 560px, so a comparison matrix of prose cells scrolls rather than wrapping\n * each cell into six lines (AGL-2568). That cap is safe on a full-width page\n * section, which is never narrower than 560px from a tablet up. A console card\n * is: two-column card flows put cards well under 560px at tablet and laptop\n * widths, so the same sizing would put a scrollbar on tables that fit today.\n * The console's defect is the unbreakable cell, and a `width: 100%` table\n * overflows on exactly that — so the table fills its card, wraps what can\n * wrap, and scrolls when what cannot wrap does not fit. A surface that wants\n * the prose sizing passes it as the table's `sx`, as the Table element does.\n *\n * ## Keyboard\n *\n * Chromium (130+) and Firefox make a scroll box with no focusable content\n * keyboard-reachable on their own, and a table of links or buttons scrolls to\n * whichever one takes focus. A surface that must also NAME the box — a region\n * a screen reader announces — passes `role`, `aria-label` and `tabIndex`\n * through `ContainerProps` (see `scrollRegionProps`).\n *\n * ## A table inside a table\n *\n * A tree draws a parent's children as a table nested in a full-width cell of\n * the parent's table. That table is already inside the outer box, which\n * scrolls the whole tree as one piece; a box of its own would make every\n * subtree a scroll region and a clip of its own, for content that is exactly\n * as wide as the table around it. `nested` draws it bare.\n *\n * ## Shape\n *\n * Every `Table` prop goes to the table; `ContainerProps` go to the box; `ref`\n * is the box, the element that holds the table's place on the page, so a\n * `nested` table, which has no box, takes no ref.\n * `aglyn/no-raw-mui-table` refuses a MUI `Table` or `TableContainer` anywhere\n * but this file.\n */\nexport const ScrollTable = forwardRef<HTMLDivElement, ScrollTableProps>(\n function ScrollTable(props, ref) {\n const { ContainerProps, nested, ...tableProps } = props\n if (nested) return <Table {...tableProps} />\n const { sx: containerSx, ...container } = ContainerProps ?? {}\n return (\n <TableContainer\n ref={ref}\n {...container}\n sx={mergeSxProps(scrollableTableWrapperSx, containerSx)}\n >\n <Table {...tableProps} />\n </TableContainer>\n )\n },\n)\nScrollTable.displayName = 'ScrollTable'\n\nexport default ScrollTable\n"],"names":["mergeSxProps","Table","TableContainer","forwardRef","scrollableTableWrapperSx","ScrollTable","props","ref","ContainerProps","nested","tableProps","sx","containerSx","container","displayName"],"mappings":";;;AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,YAAY,QAAQ,yBAAwB;AACrD,SACEC,KAAK,EACLC,cAAc,QAGT,gBAAe;AACtB,SAASC,UAAU,QAAQ,QAAO;AAClC,SAASC,wBAAwB,QAAQ,8BAA0B;AA2BnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DC,GACD,OAAO,MAAMC,4BAAcF,WACzB,SAASE,YAAYC,KAAK,EAAEC,GAAG;IAC7B,MAAM,EAAEC,cAAc,EAAEC,MAAM,EAAiB,GAAGH,OAAfI,8CAAeJ;;;;IAClD,IAAIG,QAAQ,qBAAO,KAACR,oBAAUS;IAC9B,aAA0CF,yBAAAA,iBAAkB,CAAC,GAAvD,EAAEG,IAAIC,WAAW,EAAgB,SAAXC;;;IAC5B,qBACE,KAACX;QACCK,KAAKA;OACDM;QACJF,IAAIX,aAAaI,0BAA0BQ;kBAE3C,cAAA,KAACX,oBAAUS;;AAGjB,GACD;AACDL,YAAYS,WAAW,GAAG;AAE1B,eAAeT,YAAW"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
export * from './shadow-dom';
|
|
18
|
+
export { default } from './shadow-dom';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ export * from "./shadow-dom.js";
|
|
17
|
+
export { default } from "./shadow-dom.js";
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/shared/ui/jsx/src/lib/components/shadow-dom/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2023 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './shadow-dom'\nexport { default } from './shadow-dom'\n"],"names":["default"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,cAAc,kBAAc;AAC5B,SAASA,OAAO,QAAQ,kBAAc"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
export declare const ShadowDomContext: import("react").Context<any>;
|
|
18
|
+
export declare function useShadowDomContext(): any;
|
|
19
|
+
export interface ShadowContentPortalProps {
|
|
20
|
+
root: ShadowRoot;
|
|
21
|
+
children?: JSX.Children;
|
|
22
|
+
}
|
|
23
|
+
export interface BaseProps {
|
|
24
|
+
mode?: 'open' | 'closed';
|
|
25
|
+
delegatesFocus?: boolean;
|
|
26
|
+
styleSheets?: globalThis.CSSStyleSheet[];
|
|
27
|
+
ssr?: boolean;
|
|
28
|
+
children?: JSX.Children;
|
|
29
|
+
}
|
|
30
|
+
export type RenderProp = (props: {
|
|
31
|
+
root: ShadowRoot;
|
|
32
|
+
ssr?: boolean;
|
|
33
|
+
children?: JSX.Children;
|
|
34
|
+
}) => JSX.Children;
|
|
35
|
+
export type FactoryOptions<P = any> = {
|
|
36
|
+
tag: string;
|
|
37
|
+
render: RenderProp;
|
|
38
|
+
};
|
|
39
|
+
export declare function shadowDomRootFactory<P = any>(options: FactoryOptions<P>): import("react").ForwardRefExoticComponent<import("react").PropsWithoutRef<P & BaseProps> & import("react").RefAttributes<any>>;
|
|
40
|
+
export declare function createShadowDomProxy(target?: Record<string, ReturnType<typeof shadowDomRootFactory>>, id?: string, render?: RenderProp): Record<string, import("react").ForwardRefExoticComponent<BaseProps & import("react").RefAttributes<any>>>;
|
|
41
|
+
export declare const ShadowDom: Record<string, import("react").ForwardRefExoticComponent<BaseProps & import("react").RefAttributes<any>>>;
|
|
42
|
+
export default ShadowDom;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
|
|
3
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
4
|
+
/**
|
|
5
|
+
* @license
|
|
6
|
+
* Copyright 2023 Aglyn LLC
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
* you may not use this file except in compliance with the License.
|
|
10
|
+
* You may obtain a copy of the License at
|
|
11
|
+
*
|
|
12
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
*
|
|
14
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/ import { paramCase } from "@aglyn/shared-util-vendor";
|
|
20
|
+
import { createContext, forwardRef, useContext, useState } from "react";
|
|
21
|
+
import { createPortal } from "react-dom";
|
|
22
|
+
import { useEnsuredForwardedRef, useIsomorphicLayoutEffect } from "react-use";
|
|
23
|
+
export const ShadowDomContext = /*#__PURE__*/ createContext(null);
|
|
24
|
+
export function useShadowDomContext() {
|
|
25
|
+
return useContext(ShadowDomContext);
|
|
26
|
+
}
|
|
27
|
+
function ShadowDomContentPortal(props) {
|
|
28
|
+
const { root, children = null } = props;
|
|
29
|
+
return /*#__PURE__*/ createPortal(children, root);
|
|
30
|
+
}
|
|
31
|
+
export function shadowDomRootFactory(options) {
|
|
32
|
+
const ShadowDomRoot = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
33
|
+
const { mode = 'open', delegatesFocus = false, styleSheets = [], ssr = false, children = null } = props, rest = _object_without_properties_loose(props, [
|
|
34
|
+
"mode",
|
|
35
|
+
"delegatesFocus",
|
|
36
|
+
"styleSheets",
|
|
37
|
+
"ssr",
|
|
38
|
+
"children"
|
|
39
|
+
]);
|
|
40
|
+
const node = useEnsuredForwardedRef(ref);
|
|
41
|
+
const [root, setRoot] = useState(null);
|
|
42
|
+
const key = `node_${mode}${delegatesFocus}`;
|
|
43
|
+
const Tag = options.tag;
|
|
44
|
+
useIsomorphicLayoutEffect(()=>{
|
|
45
|
+
if (!node.current) return;
|
|
46
|
+
try {
|
|
47
|
+
typeof ref === 'function' && ref(node.current);
|
|
48
|
+
if (ssr) return setRoot(node.current.shadowRoot);
|
|
49
|
+
const root = node.current.attachShadow({
|
|
50
|
+
mode,
|
|
51
|
+
delegatesFocus
|
|
52
|
+
});
|
|
53
|
+
styleSheets.length > 0 && (root.adoptedStyleSheets = styleSheets);
|
|
54
|
+
setRoot(root);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
if ((error == null ? void 0 : error.name) !== 'NotSupportedError') throw error;
|
|
57
|
+
// A shadow root already exists on the host (remount of the same
|
|
58
|
+
// element, e.g. StrictMode double-effects) — adopt it.
|
|
59
|
+
const existing = node.current.shadowRoot;
|
|
60
|
+
if (existing) {
|
|
61
|
+
styleSheets.length > 0 && (existing.adoptedStyleSheets = styleSheets);
|
|
62
|
+
setRoot(existing);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}, [
|
|
66
|
+
styleSheets,
|
|
67
|
+
delegatesFocus,
|
|
68
|
+
mode,
|
|
69
|
+
ssr
|
|
70
|
+
]);
|
|
71
|
+
return /*#__PURE__*/ _jsx(_Fragment, {
|
|
72
|
+
children: /*#__PURE__*/ _jsx(Tag, _extends({
|
|
73
|
+
ref: node
|
|
74
|
+
}, rest, {
|
|
75
|
+
children: root ? /*#__PURE__*/ _jsx(ShadowDomContext.Provider, {
|
|
76
|
+
value: root,
|
|
77
|
+
children: /*#__PURE__*/ _jsx(ShadowDomContentPortal, {
|
|
78
|
+
root: root,
|
|
79
|
+
children: options.render == null ? void 0 : options.render.call(options, {
|
|
80
|
+
root,
|
|
81
|
+
ssr,
|
|
82
|
+
children
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
}) : // No shadow root yet: on the server and during the first client
|
|
86
|
+
// (hydration) render the content renders as light DOM, so the
|
|
87
|
+
// SSR payload carries real text for SEO/crawlers. Once the
|
|
88
|
+
// shadow root attaches (layout effect, before paint) the light
|
|
89
|
+
// DOM stops displaying — a shadow host without slots never shows
|
|
90
|
+
// it — and the portal branch takes over. Hydration stays
|
|
91
|
+
// consistent because server and first client render both take
|
|
92
|
+
// this branch.
|
|
93
|
+
options.render == null ? void 0 : options.render.call(options, {
|
|
94
|
+
root,
|
|
95
|
+
ssr,
|
|
96
|
+
children
|
|
97
|
+
})
|
|
98
|
+
}), key)
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
ShadowDomRoot.displayName = 'ShadowDomRoot';
|
|
102
|
+
return ShadowDomRoot;
|
|
103
|
+
}
|
|
104
|
+
const tags = new Map();
|
|
105
|
+
export function createShadowDomProxy(target = {}, id = 'sdp-', render = ({ children })=>children) {
|
|
106
|
+
return new Proxy(target, {
|
|
107
|
+
get: function get(_, name) {
|
|
108
|
+
const tag = paramCase(name);
|
|
109
|
+
const key = `${id}${tag}`;
|
|
110
|
+
if (!tags.has(key)) {
|
|
111
|
+
tags.set(key, shadowDomRootFactory({
|
|
112
|
+
tag,
|
|
113
|
+
render
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
return tags.get(key);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
export const ShadowDom = createShadowDomProxy();
|
|
121
|
+
export default ShadowDom;
|
|
122
|
+
|
|
123
|
+
//# sourceMappingURL=shadow-dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../libs/shared/ui/jsx/src/lib/components/shadow-dom/shadow-dom.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2023 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { paramCase } from '@aglyn/shared-util-vendor'\nimport { createContext, forwardRef, useContext, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useEnsuredForwardedRef, useIsomorphicLayoutEffect } from 'react-use'\n\nexport const ShadowDomContext = createContext(null)\n\nexport function useShadowDomContext() {\n return useContext(ShadowDomContext)\n}\n\nexport interface ShadowContentPortalProps {\n root: ShadowRoot\n children?: JSX.Children\n}\n\nfunction ShadowDomContentPortal(props: ShadowContentPortalProps) {\n const { root, children = null } = props\n return createPortal(children, root)\n}\n\nexport interface BaseProps {\n mode?: 'open' | 'closed'\n delegatesFocus?: boolean\n styleSheets?: globalThis.CSSStyleSheet[]\n ssr?: boolean\n children?: JSX.Children\n}\n\nexport type RenderProp = (props: {\n root: ShadowRoot\n ssr?: boolean\n children?: JSX.Children\n}) => JSX.Children\n\nexport type FactoryOptions<P = any> = {\n tag: string\n render: RenderProp\n}\n\nexport function shadowDomRootFactory<P = any>(options: FactoryOptions<P>) {\n const ShadowDomRoot = forwardRef<any, P & BaseProps>((props, ref) => {\n const {\n mode = 'open',\n delegatesFocus = false,\n styleSheets = [],\n ssr = false,\n children = null,\n ...rest\n } = props\n const node = useEnsuredForwardedRef<HTMLElement>(ref as any)\n const [root, setRoot] = useState<ShadowRoot | null>(null)\n const key = `node_${mode}${delegatesFocus}`\n const Tag = options.tag\n\n useIsomorphicLayoutEffect(() => {\n if (!node.current) return\n\n try {\n typeof ref === 'function' && ref(node.current)\n\n if (ssr) return setRoot(node.current.shadowRoot)\n\n const root = node.current.attachShadow({\n mode,\n delegatesFocus,\n })\n styleSheets.length > 0 && (root.adoptedStyleSheets = styleSheets)\n setRoot(root)\n } catch (error) {\n if ((error as Error)?.name !== 'NotSupportedError') throw error\n // A shadow root already exists on the host (remount of the same\n // element, e.g. StrictMode double-effects) — adopt it.\n const existing = node.current.shadowRoot\n if (existing) {\n styleSheets.length > 0 && (existing.adoptedStyleSheets = styleSheets)\n setRoot(existing)\n }\n }\n }, [styleSheets, delegatesFocus, mode, ssr])\n\n return (\n <>\n <Tag key={key} ref={node} {...rest}>\n {root ? (\n <ShadowDomContext.Provider value={root}>\n <ShadowDomContentPortal root={root}>\n {options.render?.({ root, ssr, children })}\n </ShadowDomContentPortal>\n </ShadowDomContext.Provider>\n ) : (\n // No shadow root yet: on the server and during the first client\n // (hydration) render the content renders as light DOM, so the\n // SSR payload carries real text for SEO/crawlers. Once the\n // shadow root attaches (layout effect, before paint) the light\n // DOM stops displaying — a shadow host without slots never shows\n // it — and the portal branch takes over. Hydration stays\n // consistent because server and first client render both take\n // this branch.\n options.render?.({ root, ssr, children })\n )}\n </Tag>\n </>\n );\n })\n ShadowDomRoot.displayName = 'ShadowDomRoot'\n\n return ShadowDomRoot\n}\n\nconst tags = new Map()\n\nexport function createShadowDomProxy(\n target: Record<string, ReturnType<typeof shadowDomRootFactory>> = {},\n id = 'sdp-',\n render: RenderProp = ({ children }) => children,\n) {\n return new Proxy(target, {\n get: function get(_, name) {\n const tag = paramCase(name as string)\n const key = `${id}${tag}`\n\n if (!tags.has(key)) {\n tags.set(key, shadowDomRootFactory({ tag, render }))\n }\n\n return tags.get(key)\n },\n })\n}\n\nexport const ShadowDom = createShadowDomProxy()\n\nexport default ShadowDom\n"],"names":["paramCase","createContext","forwardRef","useContext","useState","createPortal","useEnsuredForwardedRef","useIsomorphicLayoutEffect","ShadowDomContext","useShadowDomContext","ShadowDomContentPortal","props","root","children","shadowDomRootFactory","options","ShadowDomRoot","ref","mode","delegatesFocus","styleSheets","ssr","rest","node","setRoot","key","Tag","tag","current","shadowRoot","attachShadow","length","adoptedStyleSheets","error","name","existing","Provider","value","render","displayName","tags","Map","createShadowDomProxy","target","id","Proxy","get","_","has","set","ShadowDom"],"mappings":";;;AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,SAAS,QAAQ,4BAA2B;AACrD,SAASC,aAAa,EAAEC,UAAU,EAAEC,UAAU,EAAEC,QAAQ,QAAQ,QAAO;AACvE,SAASC,YAAY,QAAQ,YAAW;AACxC,SAASC,sBAAsB,EAAEC,yBAAyB,QAAQ,YAAW;AAE7E,OAAO,MAAMC,iCAAmBP,cAAc,MAAK;AAEnD,OAAO,SAASQ;IACd,OAAON,WAAWK;AACpB;AAOA,SAASE,uBAAuBC,KAA+B;IAC7D,MAAM,EAAEC,IAAI,EAAEC,WAAW,IAAI,EAAE,GAAGF;IAClC,qBAAON,aAAaQ,UAAUD;AAChC;AAqBA,OAAO,SAASE,qBAA8BC,OAA0B;IACtE,MAAMC,8BAAgBd,WAA+B,CAACS,OAAOM;QAC3D,MAAM,EACJC,OAAO,MAAM,EACbC,iBAAiB,KAAK,EACtBC,cAAc,EAAE,EAChBC,MAAM,KAAK,EACXR,WAAW,IAAI,EAEhB,GAAGF,OADCW,wCACDX;;;;;;;QACJ,MAAMY,OAAOjB,uBAAoCW;QACjD,MAAM,CAACL,MAAMY,QAAQ,GAAGpB,SAA4B;QACpD,MAAMqB,MAAM,CAAC,KAAK,EAAEP,OAAOC,gBAAgB;QAC3C,MAAMO,MAAMX,QAAQY,GAAG;QAEvBpB,0BAA0B;YACxB,IAAI,CAACgB,KAAKK,OAAO,EAAE;YAEnB,IAAI;gBACF,OAAOX,QAAQ,cAAcA,IAAIM,KAAKK,OAAO;gBAE7C,IAAIP,KAAK,OAAOG,QAAQD,KAAKK,OAAO,CAACC,UAAU;gBAE/C,MAAMjB,OAAOW,KAAKK,OAAO,CAACE,YAAY,CAAC;oBACrCZ;oBACAC;gBACF;gBACAC,YAAYW,MAAM,GAAG,KAAMnB,CAAAA,KAAKoB,kBAAkB,GAAGZ,WAAU;gBAC/DI,QAAQZ;YACV,EAAE,OAAOqB,OAAO;gBACd,IAAI,CAACA,yBAAD,AAACA,MAAiBC,IAAI,MAAK,qBAAqB,MAAMD;gBAC1D,gEAAgE;gBAChE,uDAAuD;gBACvD,MAAME,WAAWZ,KAAKK,OAAO,CAACC,UAAU;gBACxC,IAAIM,UAAU;oBACZf,YAAYW,MAAM,GAAG,KAAMI,CAAAA,SAASH,kBAAkB,GAAGZ,WAAU;oBACnEI,QAAQW;gBACV;YACF;QACF,GAAG;YAACf;YAAaD;YAAgBD;YAAMG;SAAI;QAE3C,qBACE;sBACE,cAAA,KAACK;gBAAcT,KAAKM;eAAUD;0BAC3BV,qBACC,KAACJ,iBAAiB4B,QAAQ;oBAACC,OAAOzB;8BAChC,cAAA,KAACF;wBAAuBE,MAAMA;kCAC3BG,QAAQuB,MAAM,oBAAdvB,QAAQuB,MAAM,MAAdvB,SAAiB;4BAAEH;4BAAMS;4BAAKR;wBAAS;;qBAI5C,gEAAgE;gBAChE,8DAA8D;gBAC9D,2DAA2D;gBAC3D,+DAA+D;gBAC/D,iEAAiE;gBACjE,yDAAyD;gBACzD,8DAA8D;gBAC9D,eAAe;gBACfE,QAAQuB,MAAM,oBAAdvB,QAAQuB,MAAM,MAAdvB,SAAiB;oBAAEH;oBAAMS;oBAAKR;gBAAS;gBAhBjCY;;IAqBhB;IACAT,cAAcuB,WAAW,GAAG;IAE5B,OAAOvB;AACT;AAEA,MAAMwB,OAAO,IAAIC;AAEjB,OAAO,SAASC,qBACdC,SAAkE,CAAC,CAAC,EACpEC,KAAK,MAAM,EACXN,SAAqB,CAAC,EAAEzB,QAAQ,EAAE,GAAKA,QAAQ;IAE/C,OAAO,IAAIgC,MAAMF,QAAQ;QACvBG,KAAK,SAASA,IAAIC,CAAC,EAAEb,IAAI;YACvB,MAAMP,MAAM3B,UAAUkC;YACtB,MAAMT,MAAM,GAAGmB,KAAKjB,KAAK;YAEzB,IAAI,CAACa,KAAKQ,GAAG,CAACvB,MAAM;gBAClBe,KAAKS,GAAG,CAACxB,KAAKX,qBAAqB;oBAAEa;oBAAKW;gBAAO;YACnD;YAEA,OAAOE,KAAKM,GAAG,CAACrB;QAClB;IACF;AACF;AAEA,OAAO,MAAMyB,YAAYR,uBAAsB;AAE/C,eAAeQ,UAAS"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { type BoxProps, type ModalProps as MuiModalProps } from '@mui/material';
|
|
18
|
+
export interface SplashScreenProps extends Partial<MuiModalProps<any, any>> {
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The splash artwork on its own, with no Modal around it.
|
|
22
|
+
*
|
|
23
|
+
* `SplashScreen` below puts this in a `Modal`, which is a portal — and a
|
|
24
|
+
* portal renders NOTHING on the server and nothing on the first client
|
|
25
|
+
* render either. That is fine for a splash shown over an already-painted
|
|
26
|
+
* app, but useless as a boot-time fallback: a caller that needs markup in
|
|
27
|
+
* the SSR HTML (see the console's `NoSsr` fallback) has to render this
|
|
28
|
+
* directly inside its own positioned container.
|
|
29
|
+
*/
|
|
30
|
+
export declare const SplashScreenContent: import("react").ForwardRefExoticComponent<Omit<BoxProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
31
|
+
declare const SplashScreen: import("react").ForwardRefExoticComponent<Omit<SplashScreenProps, "ref"> & import("react").RefAttributes<any>>;
|
|
32
|
+
export { SplashScreen };
|
|
33
|
+
export default SplashScreen;
|