@stack-spot/portal-layout 0.0.51 → 0.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/Layout.d.ts +2 -2
  2. package/dist/Layout.js +1 -1
  3. package/dist/LayoutOverlayManager.js +6 -6
  4. package/dist/components/Dialog.d.ts +1 -1
  5. package/dist/components/Dialog.js +1 -1
  6. package/dist/components/Header.d.ts +1 -1
  7. package/dist/components/Header.js +1 -1
  8. package/dist/components/OverlayContent.d.ts +1 -1
  9. package/dist/components/OverlayContent.js +20 -20
  10. package/dist/components/PortalSwitcher.d.ts +1 -1
  11. package/dist/components/PortalSwitcher.js +54 -54
  12. package/dist/components/SelectionList.d.ts +1 -1
  13. package/dist/components/SelectionList.js +54 -54
  14. package/dist/components/Toaster.d.ts +1 -1
  15. package/dist/components/Toaster.js +1 -1
  16. package/dist/components/UserMenu.d.ts +1 -1
  17. package/dist/components/UserMenu.js +41 -41
  18. package/dist/components/error/ErrorBoundary.d.ts +1 -1
  19. package/dist/components/error/ErrorBoundary.js +1 -1
  20. package/dist/components/error/ErrorFeedback.d.ts +1 -1
  21. package/dist/components/error/ErrorFeedback.js +1 -1
  22. package/dist/components/error/SilentErrorBoundary.d.ts +1 -1
  23. package/dist/components/error/SilentErrorBoundary.js +1 -1
  24. package/dist/components/menu/MenuContent.d.ts +12 -8
  25. package/dist/components/menu/MenuContent.d.ts.map +1 -1
  26. package/dist/components/menu/MenuContent.js +146 -146
  27. package/dist/components/menu/MenuSections.d.ts +1 -1
  28. package/dist/components/menu/MenuSections.js +1 -1
  29. package/dist/components/menu/PageSelector.d.ts +1 -1
  30. package/dist/components/menu/PageSelector.js +65 -65
  31. package/dist/layout-context.d.ts +1 -1
  32. package/dist/layout-context.js +1 -1
  33. package/dist/layout.css +466 -465
  34. package/dist/svg/AI.d.ts +1 -1
  35. package/dist/svg/AI.js +1 -1
  36. package/dist/svg/EDP.d.ts +1 -1
  37. package/dist/svg/EDP.js +1 -1
  38. package/dist/svg/Forbidden.d.ts +1 -1
  39. package/dist/svg/Forbidden.js +1 -1
  40. package/dist/svg/HUB.d.ts +1 -1
  41. package/dist/svg/HUB.js +1 -1
  42. package/dist/svg/Logo.d.ts +1 -1
  43. package/dist/svg/Logo.js +1 -1
  44. package/dist/svg/NotFound.d.ts +1 -1
  45. package/dist/svg/NotFound.js +1 -1
  46. package/dist/svg/ServerError.d.ts +1 -1
  47. package/dist/svg/ServerError.js +1 -1
  48. package/dist/svg/Unauthenticated.d.ts +1 -1
  49. package/dist/svg/Unauthenticated.js +1 -1
  50. package/dist/toaster.js +1 -1
  51. package/package.json +1 -1
  52. package/src/Layout.tsx +106 -106
  53. package/src/LayoutOverlayManager.tsx +273 -273
  54. package/src/components/Dialog.tsx +93 -93
  55. package/src/components/Header.tsx +34 -34
  56. package/src/components/OverlayContent.tsx +58 -58
  57. package/src/components/PortalSwitcher.tsx +147 -147
  58. package/src/components/SelectionList.tsx +272 -272
  59. package/src/components/Toaster.tsx +16 -16
  60. package/src/components/UserMenu.tsx +111 -111
  61. package/src/components/error/ErrorBoundary.tsx +38 -38
  62. package/src/components/error/ErrorFeedback.tsx +114 -114
  63. package/src/components/error/ErrorManager.ts +31 -31
  64. package/src/components/error/SilentErrorBoundary.tsx +54 -54
  65. package/src/components/menu/MenuContent.tsx +296 -296
  66. package/src/components/menu/MenuSections.tsx +270 -270
  67. package/src/components/menu/PageSelector.tsx +154 -154
  68. package/src/components/menu/constants.ts +2 -2
  69. package/src/components/menu/types.ts +112 -112
  70. package/src/components/menu/use-check-text-overflow.tsx +26 -26
  71. package/src/components/menu/use-keyboard-controls.tsx +70 -70
  72. package/src/components/types.ts +15 -15
  73. package/src/dictionary.ts +25 -25
  74. package/src/elements.ts +24 -24
  75. package/src/errors.ts +11 -11
  76. package/src/index.ts +17 -17
  77. package/src/layout-context.tsx +22 -22
  78. package/src/layout.css +466 -465
  79. package/src/svg/AI.tsx +37 -37
  80. package/src/svg/EDP.tsx +35 -35
  81. package/src/svg/Forbidden.tsx +22 -22
  82. package/src/svg/HUB.tsx +35 -35
  83. package/src/svg/Logo.tsx +35 -35
  84. package/src/svg/NotFound.tsx +16 -16
  85. package/src/svg/ServerError.tsx +33 -33
  86. package/src/svg/Unauthenticated.tsx +16 -16
  87. package/src/toaster.tsx +76 -76
  88. package/src/utils.ts +114 -114
  89. package/tsconfig.json +8 -8
  90. package/dist/components/error/ErrorDescriptor.d.ts +0 -12
  91. package/dist/components/error/ErrorDescriptor.d.ts.map +0 -1
  92. package/dist/components/error/ErrorDescriptor.js +0 -17
  93. package/dist/components/error/ErrorDescriptor.js.map +0 -1
  94. package/dist/components/menu/useCheckTextOverflow.d.ts +0 -6
  95. package/dist/components/menu/useCheckTextOverflow.d.ts.map +0 -1
  96. package/dist/components/menu/useCheckTextOverflow.js +0 -20
  97. package/dist/components/menu/useCheckTextOverflow.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MenuContent.d.ts","sourceRoot":"","sources":["../../../src/components/menu/MenuContent.tsx"],"names":[],"mappings":";;AAYA,OAAO,EAAa,UAAU,EAAY,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAY7E,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsIrB,CAAA;AAED,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIjB,CAAA;AAED,eAAO,MAAM,UAAU,4DAAsE,UAAU,4CAuBtG,CAAA;AAoED,eAAO,MAAM,WAAW,mFAAyF,kBAAkB,4CAsClI,CAAA"}
1
+ {"version":3,"file":"MenuContent.d.ts","sourceRoot":"","sources":["../../../src/components/menu/MenuContent.tsx"],"names":[],"mappings":";;AAYA,OAAO,EAAa,UAAU,EAAY,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAY7E,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsIrB,CAAA;AAED,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIjB,CAAA;AAED,eAAO,MAAM,UAAU,4DAAsE,UAAU,4CAuBtG,CAAA;AAoED,eAAO,MAAM,WAAW,mFAAyF,kBAAkB,4CAsClI,CAAA"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime.js";
2
2
  /* eslint-disable react-refresh/only-export-components */
3
3
  /* eslint-disable @typescript-eslint/no-unused-vars */
4
4
  import { Flex, IconBox, Text } from '@citric/core';
@@ -12,153 +12,153 @@ import { hideOverlayImmediately } from './MenuSections.js';
12
12
  import { PageSelector } from './PageSelector.js';
13
13
  import { MENU_CONTENT_ITEM_PADDING as ITEM_PADDING, MENU_CONTENT_PADDING as PADDING } from './constants.js';
14
14
  import { useCheckTextOverflow } from './use-check-text-overflow.js';
15
- const BackLink = styled.a `
16
- display: flex;
17
- flex-direction: row;
18
- align-items: center;
19
- margin: ${PADDING}px;
20
- margin-bottom: 16px;
21
- gap: 6px;
15
+ const BackLink = styled.a `
16
+ display: flex;
17
+ flex-direction: row;
18
+ align-items: center;
19
+ margin: ${PADDING}px;
20
+ margin-bottom: 16px;
21
+ gap: 6px;
22
22
  `;
23
- export const MenuGroup = styled.ul `
24
- padding: 0 0 0 16px;
25
- display: flex;
26
- flex-direction: column;
27
- visibility: hidden;
28
- transition: visibility 0s 0.3s;
29
-
30
- &.no-indentation {
31
- padding: 0;
32
- }
33
-
34
- .item-row-group > a {
35
- padding: 0 16px;
36
- margin: 0;
37
- border-radius: 0;
38
- }
39
-
40
- .item-row-group > a::before {
41
- content: '';
42
- position: absolute;
43
- top: 0;
44
- left: 0;
45
- right: 0;
46
- bottom: 0;
47
- background-color: var(--light-300);
48
- opacity: 0.24;
49
- border-radius: inherit;
50
- }
51
-
52
- .item-row {
53
- display: flex;
54
- flex-direction: row;
55
- gap: 8px;
56
- align-items: center;
57
-
58
- .label {
59
- flex: 1;
60
- &.hidden, &.ellipsis {
61
- white-space: nowrap;
62
- overflow: hidden;
63
- }
64
- &.ellipsis {
65
- text-overflow: ellipsis;
66
- }
67
- }
68
- }
69
-
70
- .item-row-group {
71
- margin-top: 16px;
72
- }
73
-
74
- li a {
75
- position: relative;
76
- height: 0;
77
- overflow: hidden;
78
- transition: height 0.3s, background-color 0.2s;
79
- margin-left: ${PADDING - ITEM_PADDING}px;
80
- padding-left: ${ITEM_PADDING}px;
81
-
82
- &:hover {
83
- background-color: ${theme.color.light['500']};
84
- }
85
-
86
- &.action {
87
- &:before {
88
- content: '';
89
- position: absolute;
90
- left: 2px;
91
- width: 2px;
92
- height: 0;
93
- background: inherit;
94
- transition: height 0.2s;
95
- }
96
-
97
- &.active {
98
-
99
- &:hover {
100
- background-color: transparent;
101
- }
102
-
103
- &:before {
104
- background: ${theme.color.primary['500']};
105
- height: 24px;
106
- }
107
- }
108
-
109
- &:not(.active):hover:before {
110
- background: ${theme.color.light.contrastText};
111
- height: 24px;
112
- }
113
- }
114
-
115
- .chevron {
116
- transition: transform 0.3s;
117
- &:not(.open) {
118
- transform: rotate(-90deg);
119
- }
120
- }
121
-
122
- .item-row-title {
123
- opacity: 0.7;
124
- }
125
- }
126
-
127
- &.open {
128
- visibility: visible;
129
- transition: unset;
130
- & > li > a, & > li > .item-row-group > a {
131
- height: 40px;
132
- }
133
- }
134
-
135
- &:not(.open) &.open > li > a {
136
- height: 0;
137
- }
138
-
139
- &.root {
140
- margin-bottom: ${PADDING}px;
141
-
142
- & > li {
143
- .group-title {
144
- margin-left: ${PADDING}px;
145
- margin-bottom: 5px;
146
- margin-top: 40px;
147
- display: block;
148
- }
149
-
150
- &:first-child {
151
- .group-title {
152
- margin-top: 0;
153
- }
154
- }
155
- }
156
- }
23
+ export const MenuGroup = styled.ul `
24
+ padding: 0 0 0 16px;
25
+ display: flex;
26
+ flex-direction: column;
27
+ visibility: hidden;
28
+ transition: visibility 0s 0.3s;
29
+
30
+ &.no-indentation {
31
+ padding: 0;
32
+ }
33
+
34
+ .item-row-group > a {
35
+ padding: 0 16px;
36
+ margin: 0;
37
+ border-radius: 0;
38
+ }
39
+
40
+ .item-row-group > a::before {
41
+ content: '';
42
+ position: absolute;
43
+ top: 0;
44
+ left: 0;
45
+ right: 0;
46
+ bottom: 0;
47
+ background-color: var(--light-300);
48
+ opacity: 0.24;
49
+ border-radius: inherit;
50
+ }
51
+
52
+ .item-row {
53
+ display: flex;
54
+ flex-direction: row;
55
+ gap: 8px;
56
+ align-items: center;
57
+
58
+ .label {
59
+ flex: 1;
60
+ &.hidden, &.ellipsis {
61
+ white-space: nowrap;
62
+ overflow: hidden;
63
+ }
64
+ &.ellipsis {
65
+ text-overflow: ellipsis;
66
+ }
67
+ }
68
+ }
69
+
70
+ .item-row-group {
71
+ margin-top: 16px;
72
+ }
73
+
74
+ li a {
75
+ position: relative;
76
+ height: 0;
77
+ overflow: hidden;
78
+ transition: height 0.3s, background-color 0.2s;
79
+ margin-left: ${PADDING - ITEM_PADDING}px;
80
+ padding-left: ${ITEM_PADDING}px;
81
+
82
+ &:hover {
83
+ background-color: ${theme.color.light['500']};
84
+ }
85
+
86
+ &.action {
87
+ &:before {
88
+ content: '';
89
+ position: absolute;
90
+ left: 2px;
91
+ width: 2px;
92
+ height: 0;
93
+ background: inherit;
94
+ transition: height 0.2s;
95
+ }
96
+
97
+ &.active {
98
+
99
+ &:hover {
100
+ background-color: transparent;
101
+ }
102
+
103
+ &:before {
104
+ background: ${theme.color.primary['500']};
105
+ height: 24px;
106
+ }
107
+ }
108
+
109
+ &:not(.active):hover:before {
110
+ background: ${theme.color.light.contrastText};
111
+ height: 24px;
112
+ }
113
+ }
114
+
115
+ .chevron {
116
+ transition: transform 0.3s;
117
+ &:not(.open) {
118
+ transform: rotate(-90deg);
119
+ }
120
+ }
121
+
122
+ .item-row-title {
123
+ opacity: 0.7;
124
+ }
125
+ }
126
+
127
+ &.open {
128
+ visibility: visible;
129
+ transition: unset;
130
+ & > li > a, & > li > .item-row-group > a {
131
+ height: 40px;
132
+ }
133
+ }
134
+
135
+ &:not(.open) &.open > li > a {
136
+ height: 0;
137
+ }
138
+
139
+ &.root {
140
+ margin-bottom: ${PADDING}px;
141
+
142
+ & > li {
143
+ .group-title {
144
+ margin-left: ${PADDING}px;
145
+ margin-bottom: 5px;
146
+ margin-top: 40px;
147
+ display: block;
148
+ }
149
+
150
+ &:first-child {
151
+ .group-title {
152
+ margin-top: 0;
153
+ }
154
+ }
155
+ }
156
+ }
157
157
  `;
158
- export const Title = styled.header `
159
- display: flex;
160
- flex-direction: column;
161
- margin: ${PADDING}px 0 24px ${PADDING}px;
158
+ export const Title = styled.header `
159
+ display: flex;
160
+ flex-direction: column;
161
+ margin: ${PADDING}px 0 24px ${PADDING}px;
162
162
  `;
163
163
  export const ActionItem = ({ label, onClick, href, active, icon, badge, overflow = 'wrap' }) => {
164
164
  const Link = useAnchorTag();
@@ -1,4 +1,4 @@
1
1
  import { MenuProps } from './types.js';
2
2
  export declare function hideOverlayImmediately(): void;
3
- export declare const MenuSections: ({ sections, ...props }: MenuProps) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const MenuSections: ({ sections, ...props }: MenuProps) => import("react/jsx-runtime.js").JSX.Element;
4
4
  //# sourceMappingURL=MenuSections.d.ts.map
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime.js";
2
2
  import { Flex, IconBox, Text } from '@citric/core';
3
3
  import { ChevronRight, Cog, Collapse, Expand } from '@citric/icons';
4
4
  import { interpolate, useTranslate } from '@stack-spot/portal-translate';
@@ -1,3 +1,3 @@
1
1
  import { Selector } from './types.js';
2
- export declare const PageSelector: ({ options, value, button, loading, title }: Selector) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const PageSelector: ({ options, value, button, loading, title }: Selector) => import("react/jsx-runtime.js").JSX.Element;
3
3
  //# sourceMappingURL=PageSelector.d.ts.map
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime.js";
2
2
  import { IconBox, Text } from '@citric/core';
3
3
  import { ArrowRight, Select } from '@citric/icons';
4
4
  import { LoadingCircular } from '@citric/ui';
@@ -10,70 +10,70 @@ import { useAnchorTag } from '../../layout-context.js';
10
10
  import { SelectionList } from '../SelectionList.js';
11
11
  import { MENU_CONTENT_PADDING as PADDING } from './constants.js';
12
12
  import { useCheckTextOverflow } from './use-check-text-overflow.js';
13
- const SelectorBox = styled.div `
14
- position: relative;
15
- margin: ${PADDING}px;
16
- margin-bottom: 28px;
17
-
18
- > a {
19
- display: flex;
20
- gap: 8px;
21
- align-items: center;
22
- border-radius: 0.25rem;
23
- border: 1px solid ${theme.color.light['500']};
24
- padding: 8px;
25
- transition: background-color 0.2s;
26
-
27
- &:hover {
28
- background-color: ${theme.color.light['500']};
29
- }
30
-
31
- .label {
32
- flex: 1;
33
- white-space: nowrap;
34
- overflow: hidden;
35
- text-overflow: ellipsis;
36
- }
37
- }
38
-
39
- .selection-list {
40
- position: absolute;
41
- top: 0;
42
- left: 0;
43
- right: 0;
44
- box-shadow: none;
45
- border-radius: 0.25rem;
46
-
47
- .selection-list-content {
48
- padding: 8px;
49
- border-radius: 0.25rem;
50
- border: none;
51
- ul {
52
- display: flex;
53
- flex-direction: column;
54
- gap: 8px;
55
- }
56
- }
57
-
58
- li > a {
59
- border: 1px solid ${theme.color.light['500']};
60
- background-color: ${theme.color.light['400']};
61
-
62
- &:hover {
63
- background-color: ${theme.color.light['500']};
64
- }
65
- }
66
-
67
- .view-all {
68
- background: ${theme.color.light['500']};
69
- border-radius: 0.25rem;
70
- height: 40px;
71
- display: flex;
72
- align-items: center;
73
- justify-content: center;
74
- margin-top: 8px;
75
- }
76
- }
13
+ const SelectorBox = styled.div `
14
+ position: relative;
15
+ margin: ${PADDING}px;
16
+ margin-bottom: 28px;
17
+
18
+ > a {
19
+ display: flex;
20
+ gap: 8px;
21
+ align-items: center;
22
+ border-radius: 0.25rem;
23
+ border: 1px solid ${theme.color.light['500']};
24
+ padding: 8px;
25
+ transition: background-color 0.2s;
26
+
27
+ &:hover {
28
+ background-color: ${theme.color.light['500']};
29
+ }
30
+
31
+ .label {
32
+ flex: 1;
33
+ white-space: nowrap;
34
+ overflow: hidden;
35
+ text-overflow: ellipsis;
36
+ }
37
+ }
38
+
39
+ .selection-list {
40
+ position: absolute;
41
+ top: 0;
42
+ left: 0;
43
+ right: 0;
44
+ box-shadow: none;
45
+ border-radius: 0.25rem;
46
+
47
+ .selection-list-content {
48
+ padding: 8px;
49
+ border-radius: 0.25rem;
50
+ border: none;
51
+ ul {
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: 8px;
55
+ }
56
+ }
57
+
58
+ li > a {
59
+ border: 1px solid ${theme.color.light['500']};
60
+ background-color: ${theme.color.light['400']};
61
+
62
+ &:hover {
63
+ background-color: ${theme.color.light['500']};
64
+ }
65
+ }
66
+
67
+ .view-all {
68
+ background: ${theme.color.light['500']};
69
+ border-radius: 0.25rem;
70
+ height: 40px;
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ margin-top: 8px;
75
+ }
76
+ }
77
77
  `;
78
78
  export const PageSelector = ({ options, value, button, loading, title }) => {
79
79
  const Link = useAnchorTag();
@@ -5,6 +5,6 @@ export interface LayoutContext {
5
5
  }
6
6
  export declare const LayoutProvider: ({ children, ...props }: LayoutContext & {
7
7
  children: React.ReactNode;
8
- }) => import("react/jsx-runtime").JSX.Element;
8
+ }) => import("react/jsx-runtime.js").JSX.Element;
9
9
  export declare function useAnchorTag(): AnchorComponent;
10
10
  //# sourceMappingURL=layout-context.d.ts.map
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime.js";
2
2
  /* eslint-disable react-refresh/only-export-components */
3
3
  import { createContext, useContext } from 'react';
4
4
  const context = createContext({});