@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.
Files changed (261) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +7 -0
  3. package/package.json +63 -0
  4. package/src/index.d.ts +48 -0
  5. package/src/index.js +179 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/components/aglyn-text.d.ts +86 -0
  8. package/src/lib/components/aglyn-text.js +44 -0
  9. package/src/lib/components/aglyn-text.js.map +1 -0
  10. package/src/lib/components/app-link.d.ts +74 -0
  11. package/src/lib/components/app-link.js +139 -0
  12. package/src/lib/components/app-link.js.map +1 -0
  13. package/src/lib/components/aspect-ratio.d.ts +59 -0
  14. package/src/lib/components/aspect-ratio.js +153 -0
  15. package/src/lib/components/aspect-ratio.js.map +1 -0
  16. package/src/lib/components/background-image.component.d.ts +30 -0
  17. package/src/lib/components/background-image.component.js +42 -0
  18. package/src/lib/components/background-image.component.js.map +1 -0
  19. package/src/lib/components/card-columns.d.ts +86 -0
  20. package/src/lib/components/card-columns.js +148 -0
  21. package/src/lib/components/card-columns.js.map +1 -0
  22. package/src/lib/components/card-display.d.ts +36 -0
  23. package/src/lib/components/card-display.js +158 -0
  24. package/src/lib/components/card-display.js.map +1 -0
  25. package/src/lib/components/card-list-item.d.ts +35 -0
  26. package/src/lib/components/card-list-item.js +137 -0
  27. package/src/lib/components/card-list-item.js.map +1 -0
  28. package/src/lib/components/children-function-prop.d.ts +25 -0
  29. package/src/lib/components/children-function-prop.js +29 -0
  30. package/src/lib/components/children-function-prop.js.map +1 -0
  31. package/src/lib/components/confirmation-provider.component.d.ts +19 -0
  32. package/src/lib/components/confirmation-provider.component.js +83 -0
  33. package/src/lib/components/confirmation-provider.component.js.map +1 -0
  34. package/src/lib/components/container.d.ts +25 -0
  35. package/src/lib/components/container.js +62 -0
  36. package/src/lib/components/container.js.map +1 -0
  37. package/src/lib/components/data-table.component.d.ts +54 -0
  38. package/src/lib/components/data-table.component.js +211 -0
  39. package/src/lib/components/data-table.component.js.map +1 -0
  40. package/src/lib/components/dialog-confirm.d.ts +36 -0
  41. package/src/lib/components/dialog-confirm.js +74 -0
  42. package/src/lib/components/dialog-confirm.js.map +1 -0
  43. package/src/lib/components/ellipsis-pulse.component.d.ts +22 -0
  44. package/src/lib/components/ellipsis-pulse.component.js +51 -0
  45. package/src/lib/components/ellipsis-pulse.component.js.map +1 -0
  46. package/src/lib/components/emotion-cache-provider.d.ts +31 -0
  47. package/src/lib/components/emotion-cache-provider.js +40 -0
  48. package/src/lib/components/emotion-cache-provider.js.map +1 -0
  49. package/src/lib/components/empty-state.component.d.ts +63 -0
  50. package/src/lib/components/empty-state.component.js +214 -0
  51. package/src/lib/components/empty-state.component.js.map +1 -0
  52. package/src/lib/components/error-boundary.component.d.ts +28 -0
  53. package/src/lib/components/error-boundary.component.js +86 -0
  54. package/src/lib/components/error-boundary.component.js.map +1 -0
  55. package/src/lib/components/grid-buttons.d.ts +26 -0
  56. package/src/lib/components/grid-buttons.js +45 -0
  57. package/src/lib/components/grid-buttons.js.map +1 -0
  58. package/src/lib/components/grid-items.d.ts +103 -0
  59. package/src/lib/components/grid-items.js +336 -0
  60. package/src/lib/components/grid-items.js.map +1 -0
  61. package/src/lib/components/grid-list.d.ts +37 -0
  62. package/src/lib/components/grid-list.js +156 -0
  63. package/src/lib/components/grid-list.js.map +1 -0
  64. package/src/lib/components/help-tip.component.d.ts +30 -0
  65. package/src/lib/components/help-tip.component.js +139 -0
  66. package/src/lib/components/help-tip.component.js.map +1 -0
  67. package/src/lib/components/link-navigation-reporter.d.ts +24 -0
  68. package/src/lib/components/link-navigation-reporter.js +64 -0
  69. package/src/lib/components/link-navigation-reporter.js.map +1 -0
  70. package/src/lib/components/list-pagination.component.d.ts +57 -0
  71. package/src/lib/components/list-pagination.component.js +90 -0
  72. package/src/lib/components/list-pagination.component.js.map +1 -0
  73. package/src/lib/components/list-table.component.d.ts +155 -0
  74. package/src/lib/components/list-table.component.js +369 -0
  75. package/src/lib/components/list-table.component.js.map +1 -0
  76. package/src/lib/components/loading-layout-app.component.d.ts +35 -0
  77. package/src/lib/components/loading-layout-app.component.js +42 -0
  78. package/src/lib/components/loading-layout-app.component.js.map +1 -0
  79. package/src/lib/components/loading-modal-overlay.d.ts +30 -0
  80. package/src/lib/components/loading-modal-overlay.js +156 -0
  81. package/src/lib/components/loading-modal-overlay.js.map +1 -0
  82. package/src/lib/components/loading-modal.d.ts +19 -0
  83. package/src/lib/components/loading-modal.js +113 -0
  84. package/src/lib/components/loading-modal.js.map +1 -0
  85. package/src/lib/components/loading-text.component.d.ts +21 -0
  86. package/src/lib/components/loading-text.component.js +40 -0
  87. package/src/lib/components/loading-text.component.js.map +1 -0
  88. package/src/lib/components/mdi-icon/index.d.ts +2 -0
  89. package/src/lib/components/mdi-icon/index.js +4 -0
  90. package/src/lib/components/mdi-icon/index.js.map +1 -0
  91. package/src/lib/components/mdi-icon/md-icon-stack.d.ts +31 -0
  92. package/src/lib/components/mdi-icon/md-icon-stack.js +101 -0
  93. package/src/lib/components/mdi-icon/md-icon-stack.js.map +1 -0
  94. package/src/lib/components/mdi-icon/md-icon.d.ts +32 -0
  95. package/src/lib/components/mdi-icon/md-icon.js +147 -0
  96. package/src/lib/components/mdi-icon/md-icon.js.map +1 -0
  97. package/src/lib/components/mdi-icon/mdi-icon-from-id.d.ts +23 -0
  98. package/src/lib/components/mdi-icon/mdi-icon-from-id.js +35 -0
  99. package/src/lib/components/mdi-icon/mdi-icon-from-id.js.map +1 -0
  100. package/src/lib/components/mdi-icon/mdi-icon.d.ts +24 -0
  101. package/src/lib/components/mdi-icon/mdi-icon.js +46 -0
  102. package/src/lib/components/mdi-icon/mdi-icon.js.map +1 -0
  103. package/src/lib/components/measured-figures.component.d.ts +64 -0
  104. package/src/lib/components/measured-figures.component.js +161 -0
  105. package/src/lib/components/measured-figures.component.js.map +1 -0
  106. package/src/lib/components/menu.d.ts +45 -0
  107. package/src/lib/components/menu.js +229 -0
  108. package/src/lib/components/menu.js.map +1 -0
  109. package/src/lib/components/mui-shadow-dom.d.ts +38 -0
  110. package/src/lib/components/mui-shadow-dom.js +161 -0
  111. package/src/lib/components/mui-shadow-dom.js.map +1 -0
  112. package/src/lib/components/navigation-drawer.component.d.ts +31 -0
  113. package/src/lib/components/navigation-drawer.component.js +76 -0
  114. package/src/lib/components/navigation-drawer.component.js.map +1 -0
  115. package/src/lib/components/navigation-intent.d.ts +18 -0
  116. package/src/lib/components/navigation-intent.js +56 -0
  117. package/src/lib/components/navigation-intent.js.map +1 -0
  118. package/src/lib/components/navigation-view/index.d.ts +18 -0
  119. package/src/lib/components/navigation-view/index.js +19 -0
  120. package/src/lib/components/navigation-view/index.js.map +1 -0
  121. package/src/lib/components/navigation-view/navigation-view.d.ts +35 -0
  122. package/src/lib/components/navigation-view/navigation-view.js +175 -0
  123. package/src/lib/components/navigation-view/navigation-view.js.map +1 -0
  124. package/src/lib/components/next-link.d.ts +27 -0
  125. package/src/lib/components/next-link.js +88 -0
  126. package/src/lib/components/next-link.js.map +1 -0
  127. package/src/lib/components/popper-styled.component.d.ts +25 -0
  128. package/src/lib/components/popper-styled.component.js +129 -0
  129. package/src/lib/components/popper-styled.component.js.map +1 -0
  130. package/src/lib/components/quota-readout.component.d.ts +69 -0
  131. package/src/lib/components/quota-readout.component.js +52 -0
  132. package/src/lib/components/quota-readout.component.js.map +1 -0
  133. package/src/lib/components/resizeable-stack.d.ts +4 -0
  134. package/src/lib/components/resizeable-stack.js +23 -0
  135. package/src/lib/components/resizeable-stack.js.map +1 -0
  136. package/src/lib/components/row-actions-menu.component.d.ts +53 -0
  137. package/src/lib/components/row-actions-menu.component.js +132 -0
  138. package/src/lib/components/row-actions-menu.component.js.map +1 -0
  139. package/src/lib/components/ruler-guides.component.d.ts +35 -0
  140. package/src/lib/components/ruler-guides.component.js +166 -0
  141. package/src/lib/components/ruler-guides.component.js.map +1 -0
  142. package/src/lib/components/sandbox-frame.d.ts +42 -0
  143. package/src/lib/components/sandbox-frame.js +122 -0
  144. package/src/lib/components/sandbox-frame.js.map +1 -0
  145. package/src/lib/components/scroll-reaction.d.ts +59 -0
  146. package/src/lib/components/scroll-reaction.js +43 -0
  147. package/src/lib/components/scroll-reaction.js.map +1 -0
  148. package/src/lib/components/scroll-table.component.d.ts +124 -0
  149. package/src/lib/components/scroll-table.component.js +103 -0
  150. package/src/lib/components/scroll-table.component.js.map +1 -0
  151. package/src/lib/components/shadow-dom/index.d.ts +18 -0
  152. package/src/lib/components/shadow-dom/index.js +19 -0
  153. package/src/lib/components/shadow-dom/index.js.map +1 -0
  154. package/src/lib/components/shadow-dom/shadow-dom.d.ts +42 -0
  155. package/src/lib/components/shadow-dom/shadow-dom.js +123 -0
  156. package/src/lib/components/shadow-dom/shadow-dom.js.map +1 -0
  157. package/src/lib/components/splash-screen.d.ts +33 -0
  158. package/src/lib/components/splash-screen.js +105 -0
  159. package/src/lib/components/splash-screen.js.map +1 -0
  160. package/src/lib/components/sr-only.d.ts +20 -0
  161. package/src/lib/components/sr-only.js +25 -0
  162. package/src/lib/components/sr-only.js.map +1 -0
  163. package/src/lib/components/status-screen-plain.component.d.ts +27 -0
  164. package/src/lib/components/status-screen-plain.component.js +178 -0
  165. package/src/lib/components/status-screen-plain.component.js.map +1 -0
  166. package/src/lib/components/usage-meter.component.d.ts +30 -0
  167. package/src/lib/components/usage-meter.component.js +92 -0
  168. package/src/lib/components/usage-meter.component.js.map +1 -0
  169. package/src/lib/components/variable-text-field.component.d.ts +50 -0
  170. package/src/lib/components/variable-text-field.component.js +188 -0
  171. package/src/lib/components/variable-text-field.component.js.map +1 -0
  172. package/src/lib/components/zoomable-panning-component/index.d.ts +1 -0
  173. package/src/lib/components/zoomable-panning-component/index.js +3 -0
  174. package/src/lib/components/zoomable-panning-component/index.js.map +1 -0
  175. package/src/lib/components/zoomable-panning-component/util.d.ts +58 -0
  176. package/src/lib/components/zoomable-panning-component/util.js +114 -0
  177. package/src/lib/components/zoomable-panning-component/util.js.map +1 -0
  178. package/src/lib/components/zoomable-panning-component/zoomable-panning-component.d.ts +132 -0
  179. package/src/lib/components/zoomable-panning-component/zoomable-panning-component.js +728 -0
  180. package/src/lib/components/zoomable-panning-component/zoomable-panning-component.js.map +1 -0
  181. package/src/lib/const/aglyn-besigner-logo-full.d.ts +39 -0
  182. package/src/lib/const/aglyn-besigner-logo-full.js +146 -0
  183. package/src/lib/const/aglyn-besigner-logo-full.js.map +1 -0
  184. package/src/lib/const/aglyn-console-logo-full.d.ts +34 -0
  185. package/src/lib/const/aglyn-console-logo-full.js +142 -0
  186. package/src/lib/const/aglyn-console-logo-full.js.map +1 -0
  187. package/src/lib/const/aglyn-logo-class-keys.d.ts +30 -0
  188. package/src/lib/const/aglyn-logo-class-keys.js +32 -0
  189. package/src/lib/const/aglyn-logo-class-keys.js.map +1 -0
  190. package/src/lib/const/aglyn-logo-full.d.ts +29 -0
  191. package/src/lib/const/aglyn-logo-full.js +111 -0
  192. package/src/lib/const/aglyn-logo-full.js.map +1 -0
  193. package/src/lib/const/list-filter.d.ts +260 -0
  194. package/src/lib/const/list-filter.js +409 -0
  195. package/src/lib/const/list-filter.js.map +1 -0
  196. package/src/lib/const/prebuilt-components.d.ts +17 -0
  197. package/src/lib/const/prebuilt-components.js +22 -0
  198. package/src/lib/const/prebuilt-components.js.map +1 -0
  199. package/src/lib/const/svg-icons.d.ts +75 -0
  200. package/src/lib/const/svg-icons.js +313 -0
  201. package/src/lib/const/svg-icons.js.map +1 -0
  202. package/src/lib/const/table-pagination.d.ts +106 -0
  203. package/src/lib/const/table-pagination.js +106 -0
  204. package/src/lib/const/table-pagination.js.map +1 -0
  205. package/src/lib/contexts/confirmation.context.d.ts +996 -0
  206. package/src/lib/contexts/confirmation.context.js +49 -0
  207. package/src/lib/contexts/confirmation.context.js.map +1 -0
  208. package/src/lib/contexts/loading.context.d.ts +93 -0
  209. package/src/lib/contexts/loading.context.js +126 -0
  210. package/src/lib/contexts/loading.context.js.map +1 -0
  211. package/src/lib/hocs/create-hoc-with-context-consumer.d.ts +36 -0
  212. package/src/lib/hocs/create-hoc-with-context-consumer.js +44 -0
  213. package/src/lib/hocs/create-hoc-with-context-consumer.js.map +1 -0
  214. package/src/lib/hocs/with-hoc.d.ts +32 -0
  215. package/src/lib/hocs/with-hoc.js +37 -0
  216. package/src/lib/hocs/with-hoc.js.map +1 -0
  217. package/src/lib/hooks/mdi-icon/use-mdi-icon.d.ts +20 -0
  218. package/src/lib/hooks/mdi-icon/use-mdi-icon.js +48 -0
  219. package/src/lib/hooks/mdi-icon/use-mdi-icon.js.map +1 -0
  220. package/src/lib/hooks/mdi-icon/use-mdi-icons-fuzzy.d.ts +26 -0
  221. package/src/lib/hooks/mdi-icon/use-mdi-icons-fuzzy.js +73 -0
  222. package/src/lib/hooks/mdi-icon/use-mdi-icons-fuzzy.js.map +1 -0
  223. package/src/lib/hooks/mdi-icon/use-mdi-icons.d.ts +19 -0
  224. package/src/lib/hooks/mdi-icon/use-mdi-icons.js +49 -0
  225. package/src/lib/hooks/mdi-icon/use-mdi-icons.js.map +1 -0
  226. package/src/lib/hooks/router-events.d.ts +56 -0
  227. package/src/lib/hooks/router-events.js +88 -0
  228. package/src/lib/hooks/router-events.js.map +1 -0
  229. package/src/lib/hooks/use-async-effect.d.ts +24 -0
  230. package/src/lib/hooks/use-async-effect.js +44 -0
  231. package/src/lib/hooks/use-async-effect.js.map +1 -0
  232. package/src/lib/hooks/use-callback-param-ref.d.ts +19 -0
  233. package/src/lib/hooks/use-callback-param-ref.js +29 -0
  234. package/src/lib/hooks/use-callback-param-ref.js.map +1 -0
  235. package/src/lib/hooks/use-id.d.ts +21 -0
  236. package/src/lib/hooks/use-id.js +28 -0
  237. package/src/lib/hooks/use-id.js.map +1 -0
  238. package/src/lib/hooks/use-isomorphic-layout-effect.d.ts +19 -0
  239. package/src/lib/hooks/use-isomorphic-layout-effect.js +20 -0
  240. package/src/lib/hooks/use-isomorphic-layout-effect.js.map +1 -0
  241. package/src/lib/hooks/use-merge-refs.d.ts +38 -0
  242. package/src/lib/hooks/use-merge-refs.js +52 -0
  243. package/src/lib/hooks/use-merge-refs.js.map +1 -0
  244. package/src/lib/hooks/use-subscribable.d.ts +29 -0
  245. package/src/lib/hooks/use-subscribable.js +50 -0
  246. package/src/lib/hooks/use-subscribable.js.map +1 -0
  247. package/src/lib/types.d.ts +18 -0
  248. package/src/lib/types.js +18 -0
  249. package/src/lib/types.js.map +1 -0
  250. package/src/lib/utils/make-link-elements.d.ts +24 -0
  251. package/src/lib/utils/make-link-elements.js +32 -0
  252. package/src/lib/utils/make-link-elements.js.map +1 -0
  253. package/src/lib/utils/make-meta-elements.d.ts +24 -0
  254. package/src/lib/utils/make-meta-elements.js +32 -0
  255. package/src/lib/utils/make-meta-elements.js.map +1 -0
  256. package/src/lib/utils/scroll-overflow.d.ts +120 -0
  257. package/src/lib/utils/scroll-overflow.js +115 -0
  258. package/src/lib/utils/scroll-overflow.js.map +1 -0
  259. package/src/lib/utils/vendor.d.ts +17 -0
  260. package/src/lib/utils/vendor.js +18 -0
  261. package/src/lib/utils/vendor.js.map +1 -0
@@ -0,0 +1,105 @@
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, jsxs as _jsxs } from "react/jsx-runtime";
4
+ /**
5
+ * @license
6
+ * Copyright 2022 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
+ */ // eslint-disable-next-line @nx/enforce-module-boundaries
20
+ import { mergeSxProps } from "@aglyn/shared-ui-theme";
21
+ import { Box, CircularProgress, Modal, Stack } from "@mui/material";
22
+ import { forwardRef } from "react";
23
+ import { AglynLogoFull } from "../const/aglyn-logo-full.js";
24
+ import LoadingTextComponent from "./loading-text.component.js";
25
+ /**
26
+ * The splash artwork on its own, with no Modal around it.
27
+ *
28
+ * `SplashScreen` below puts this in a `Modal`, which is a portal — and a
29
+ * portal renders NOTHING on the server and nothing on the first client
30
+ * render either. That is fine for a splash shown over an already-painted
31
+ * app, but useless as a boot-time fallback: a caller that needs markup in
32
+ * the SSR HTML (see the console's `NoSsr` fallback) has to render this
33
+ * directly inside its own positioned container.
34
+ */ export const SplashScreenContent = /*#__PURE__*/ forwardRef(// Props/ref pass through because `Modal` clones its child to attach the
35
+ // focus trap — the artwork has to keep accepting them.
36
+ (props, ref)=>/*#__PURE__*/ _jsx(Box, _extends({
37
+ ref: ref
38
+ }, props, {
39
+ sx: {
40
+ position: 'absolute',
41
+ top: 0,
42
+ right: 0,
43
+ bottom: 0,
44
+ left: 0,
45
+ flexDirection: 'column',
46
+ display: 'flex',
47
+ alignItems: 'center',
48
+ justifyContent: 'center'
49
+ },
50
+ children: /*#__PURE__*/ _jsxs(Stack, {
51
+ direction: "column",
52
+ spacing: 2,
53
+ sx: {
54
+ justifyContent: 'center',
55
+ alignItems: 'center'
56
+ },
57
+ children: [
58
+ /*#__PURE__*/ _jsx(AglynLogoFull, {
59
+ sx: {
60
+ fontSize: 175
61
+ }
62
+ }),
63
+ /*#__PURE__*/ _jsx(CircularProgress, {
64
+ color: "primary"
65
+ }),
66
+ /*#__PURE__*/ _jsx(LoadingTextComponent, {
67
+ variant: "overline",
68
+ sx: {
69
+ fontWeight: 'fontWeightBold'
70
+ },
71
+ children: 'One moment'
72
+ })
73
+ ]
74
+ })
75
+ })));
76
+ SplashScreenContent.displayName = 'SplashScreenContent';
77
+ const SplashScreen = /*#__PURE__*/ forwardRef((props, ref)=>{
78
+ const { sx } = props, rest = _object_without_properties_loose(props, [
79
+ "sx"
80
+ ]);
81
+ const _sx = mergeSxProps({
82
+ zIndex: 'max',
83
+ color: 'text.primary',
84
+ '& .MuiBackdrop-root': {
85
+ backgroundColor: (theme)=>{
86
+ var _ref;
87
+ var _theme_vars;
88
+ return (_ref = (_theme_vars = theme.vars) == null ? void 0 : _theme_vars.palette.background.paper) != null ? _ref : theme.palette.background.paper;
89
+ }
90
+ }
91
+ }, sx);
92
+ return /*#__PURE__*/ _jsx(Modal, _extends({
93
+ ref: ref,
94
+ sx: _sx,
95
+ open: true
96
+ }, rest, {
97
+ children: /*#__PURE__*/ _jsx(SplashScreenContent, {})
98
+ }));
99
+ });
100
+ SplashScreen.displayName = 'SplashScreen';
101
+ SplashScreen.aglyn = true;
102
+ export { SplashScreen };
103
+ export default SplashScreen;
104
+
105
+ //# sourceMappingURL=splash-screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/shared/ui/jsx/src/lib/components/splash-screen.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2022 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\n// eslint-disable-next-line @nx/enforce-module-boundaries\nimport { mergeSxProps } from '@aglyn/shared-ui-theme'\nimport {\n Box,\n type BoxProps,\n CircularProgress,\n Modal,\n type ModalProps as MuiModalProps,\n Stack,\n} from '@mui/material'\nimport { forwardRef } from 'react'\nimport { AglynLogoFull } from '../const/aglyn-logo-full'\nimport LoadingTextComponent from './loading-text.component'\n\nexport interface SplashScreenProps extends Partial<MuiModalProps<any, any>> {}\n\n/**\n * The splash artwork on its own, with no Modal around it.\n *\n * `SplashScreen` below puts this in a `Modal`, which is a portal — and a\n * portal renders NOTHING on the server and nothing on the first client\n * render either. That is fine for a splash shown over an already-painted\n * app, but useless as a boot-time fallback: a caller that needs markup in\n * the SSR HTML (see the console's `NoSsr` fallback) has to render this\n * directly inside its own positioned container.\n */\nexport const SplashScreenContent = forwardRef<HTMLDivElement, BoxProps>(\n // Props/ref pass through because `Modal` clones its child to attach the\n // focus trap — the artwork has to keep accepting them.\n (props, ref) => (\n <Box\n ref={ref}\n {...props}\n sx={{\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n flexDirection: 'column',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Stack\n direction=\"column\"\n spacing={2}\n sx={{\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <AglynLogoFull sx={{ fontSize: 175 }} />\n <CircularProgress color=\"primary\" />\n <LoadingTextComponent\n variant=\"overline\"\n sx={{ fontWeight: 'fontWeightBold' }}\n >\n {'One moment'}\n </LoadingTextComponent>\n </Stack>\n </Box>\n ),\n)\nSplashScreenContent.displayName = 'SplashScreenContent'\n\nconst SplashScreen = forwardRef<any, SplashScreenProps>((props, ref) => {\n const { sx, ...rest } = props\n const _sx = mergeSxProps(\n {\n zIndex: 'max',\n color: 'text.primary',\n\n '& .MuiBackdrop-root': {\n backgroundColor: (theme) => (theme as any).vars?.palette.background.paper ?? theme.palette.background.paper,\n },\n },\n sx,\n )\n return (\n <Modal ref={ref} sx={_sx} open {...rest}>\n <SplashScreenContent />\n </Modal>\n );\n})\nSplashScreen.displayName = 'SplashScreen'\nSplashScreen.aglyn = true\n\nexport { SplashScreen }\nexport default SplashScreen\n"],"names":["mergeSxProps","Box","CircularProgress","Modal","Stack","forwardRef","AglynLogoFull","LoadingTextComponent","SplashScreenContent","props","ref","sx","position","top","right","bottom","left","flexDirection","display","alignItems","justifyContent","direction","spacing","fontSize","color","variant","fontWeight","displayName","SplashScreen","rest","_sx","zIndex","backgroundColor","theme","vars","palette","background","paper","open","aglyn"],"mappings":";;;AAAA;;;;;;;;;;;;;;;CAeC,GAED,yDAAyD;AACzD,SAASA,YAAY,QAAQ,yBAAwB;AACrD,SACEC,GAAG,EAEHC,gBAAgB,EAChBC,KAAK,EAELC,KAAK,QACA,gBAAe;AACtB,SAASC,UAAU,QAAQ,QAAO;AAClC,SAASC,aAAa,QAAQ,8BAA0B;AACxD,OAAOC,0BAA0B,8BAA0B;AAI3D;;;;;;;;;CASC,GACD,OAAO,MAAMC,oCAAsBH,WACjC,wEAAwE;AACxE,uDAAuD;AACvD,CAACI,OAAOC,oBACN,KAACT;QACCS,KAAKA;OACDD;QACJE,IAAI;YACFC,UAAU;YACVC,KAAK;YACLC,OAAO;YACPC,QAAQ;YACRC,MAAM;YACNC,eAAe;YACfC,SAAS;YACTC,YAAY;YACZC,gBAAgB;QAClB;kBAEA,cAAA,MAAChB;YACCiB,WAAU;YACVC,SAAS;YACTX,IAAI;gBACFS,gBAAgB;gBAChBD,YAAY;YACd;;8BAEA,KAACb;oBAAcK,IAAI;wBAAEY,UAAU;oBAAI;;8BACnC,KAACrB;oBAAiBsB,OAAM;;8BACxB,KAACjB;oBACCkB,SAAQ;oBACRd,IAAI;wBAAEe,YAAY;oBAAiB;8BAElC;;;;SAKV;AACDlB,oBAAoBmB,WAAW,GAAG;AAElC,MAAMC,6BAAevB,WAAmC,CAACI,OAAOC;IAC9D,MAAM,EAAEC,EAAE,EAAW,GAAGF,OAAToB,wCAASpB;;;IACxB,MAAMqB,MAAM9B,aACV;QACE+B,QAAQ;QACRP,OAAO;QAEP,uBAAuB;YACrBQ,iBAAiB,CAACC;;oBAAU;gCAAA,cAAA,AAACA,MAAcC,IAAI,qBAAnB,YAAqBC,OAAO,CAACC,UAAU,CAACC,KAAK,mBAAIJ,MAAME,OAAO,CAACC,UAAU,CAACC,KAAK;;QAC7G;IACF,GACA1B;IAEF,qBACE,KAACR;QAAMO,KAAKA;QAAKC,IAAImB;QAAKQ,IAAI;OAAKT;kBACjC,cAAA,KAACrB;;AAGP;AACAoB,aAAaD,WAAW,GAAG;AAC3BC,aAAaW,KAAK,GAAG;AAErB,SAASX,YAAY,GAAE;AACvB,eAAeA,aAAY"}
@@ -0,0 +1,20 @@
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 { ComponentProps } from 'react';
18
+ export declare const SrOnly: import("@emotion/styled").StyledComponent<import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, keyof import("react").ClassAttributes<HTMLSpanElement> | keyof import("react").HTMLAttributes<HTMLSpanElement>>, {}>;
19
+ export type SrOnlyProps = ComponentProps<typeof SrOnly>;
20
+ export default SrOnly;
@@ -0,0 +1,25 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 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 { styled } from "@mui/material";
18
+ import { visuallyHidden } from "@mui/utils";
19
+ export const SrOnly = styled('span', {
20
+ name: 'SrOnly'
21
+ })(_extends({}, visuallyHidden));
22
+ SrOnly.displayName = 'SrOnly';
23
+ export default SrOnly;
24
+
25
+ //# sourceMappingURL=sr-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/shared/ui/jsx/src/lib/components/sr-only.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 { styled } from '@mui/material'\nimport { visuallyHidden } from '@mui/utils'\nimport type { ComponentProps } from 'react'\n\nexport const SrOnly = styled('span', { name: 'SrOnly' })({ ...visuallyHidden })\nSrOnly.displayName = 'SrOnly'\n\nexport type SrOnlyProps = ComponentProps<typeof SrOnly>\n\nexport default SrOnly\n"],"names":["styled","visuallyHidden","SrOnly","name","displayName"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,MAAM,QAAQ,gBAAe;AACtC,SAASC,cAAc,QAAQ,aAAY;AAG3C,OAAO,MAAMC,SAASF,OAAO,QAAQ;IAAEG,MAAM;AAAS,GAAG,aAAKF,iBAAiB;AAC/EC,OAAOE,WAAW,GAAG;AAIrB,eAAeF,OAAM"}
@@ -0,0 +1,27 @@
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 { ReactNode } from 'react';
18
+ export declare function StatusScreenPlain({ code, title, message, action, }: {
19
+ code: string;
20
+ title: string;
21
+ message: string;
22
+ action?: ReactNode;
23
+ }): import("react").JSX.Element;
24
+ export declare namespace StatusScreenPlain {
25
+ var displayName: string;
26
+ }
27
+ export default StatusScreenPlain;
@@ -0,0 +1,178 @@
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
+ */ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
+ /**
18
+ * The status page for App Router boundaries that render ABOVE every provider
19
+ * (AGL-2074) — the tenant's and the console's `app/error.tsx`,
20
+ * `app/global-error.tsx` and root `app/not-found.tsx`.
21
+ *
22
+ * Shared rather than duplicated per app, and deliberately NOT re-exported
23
+ * from the barrel: this lib's index warns that everything it re-exports ships
24
+ * eagerly on EVERY published customer page, and this component is on the cold
25
+ * path of both apps. Both callers deep-import it.
26
+ *
27
+ * ## Why it uses no MUI and no theme
28
+ *
29
+ * These three boundaries sit outside `[host]/[scheme]/layout`, so there is no
30
+ * `HostThemeProvider`, no resolved host, and — for `global-error`, which
31
+ * REPLACES the root layout — no emotion cache either. A component that
32
+ * reaches for `theme.palette` renders MUI's factory blue-and-white on a
33
+ * customer's site, and one that reaches for emotion in `global-error` renders
34
+ * unstyled. So this is plain elements and inline styles: the one thing every
35
+ * one of those boundaries can definitely paint.
36
+ *
37
+ * ## Dark mode needs a real stylesheet here
38
+ *
39
+ * The first cut set `color-scheme: light dark` on the wrapper and leaned on
40
+ * inherited colors. Measured in a dark-scheme browser: **black text on the
41
+ * browser's black canvas**, completely unreadable. `color-scheme` changes the
42
+ * UA's default colors for the ROOT element, and a `<div>` deep in the page
43
+ * cannot claim the canvas — meanwhile `color` stayed at its initial black. A
44
+ * status page that is invisible in dark mode is a worse failure than the
45
+ * framework page it replaces, and it is invisible to markup review.
46
+ *
47
+ * So the colors are declared, in an inline `<style>` with a
48
+ * `prefers-color-scheme` block, scoped to one class. A stylesheet rather than
49
+ * inline style attributes because a media query cannot live in `style=`, and
50
+ * an inline `<style>` rather than emotion because `global-error` runs with no
51
+ * emotion cache at all. No class toggling and no script, so nothing here can
52
+ * mismatch between server and client.
53
+ *
54
+ * ## Why it names no platform
55
+ *
56
+ * Same rule as `site-status-screen.component.tsx`, and it binds harder here:
57
+ * these boundaries fire precisely when host data is unavailable, so there is
58
+ * nothing to distinguish a white-label agency site from our own. Naming
59
+ * nobody is the only answer that is correct in every case. No Aglyn mark, no
60
+ * "powered by", no support address that would identify the operator to a
61
+ * visitor who was never told one exists.
62
+ *
63
+ * The copy is deliberately generic about the operator too ("this site"),
64
+ * because on `global-error` we genuinely do not know whose site it is.
65
+ */ /**
66
+ * Names nobody — including in the CLASS, which is the half the rule above
67
+ * missed (AGL-2350).
68
+ *
69
+ * This was `aglyn-status-screen`, three lines under a docblock promising "no
70
+ * support address that would identify the operator to a visitor who was never
71
+ * told one exists". The class ships to that visitor twice: on the root
72
+ * element, and four more times inside the `<style>` block below — on the 404
73
+ * and crash pages of a white-label customer's own domain.
74
+ *
75
+ * No string-scanning gate could see it. `check:brand-literals` looks for a
76
+ * CAPITALISED `Aglyn`, on the sound reasoning that a lowercase one is nearly
77
+ * always a hostname, package scope, cookie name or CSS class. That exclusion
78
+ * is what made this invisible: it is a CSS class, and it is also copy about
79
+ * who the operator is.
80
+ */ const ROOT_CLASS = 'status-screen-plain';
81
+ /**
82
+ * Light values on the bare class, dark values behind the media query — so a
83
+ * browser that never evaluates the query still gets a fully specified page,
84
+ * and one that does gets legible text on a dark ground.
85
+ */ const STYLES = `
86
+ .${ROOT_CLASS} { background: #ffffff; color: #101114; }
87
+ .${ROOT_CLASS} a, .${ROOT_CLASS} button { border-color: rgba(16, 17, 20, 0.32); }
88
+ @media (prefers-color-scheme: dark) {
89
+ .${ROOT_CLASS} { background: #101114; color: #f2f3f5; }
90
+ .${ROOT_CLASS} a, .${ROOT_CLASS} button { border-color: rgba(242, 243, 245, 0.36); }
91
+ }
92
+ `;
93
+ export function StatusScreenPlain({ code, title, message, action }) {
94
+ return(// The document's `main` landmark (AGL-2486). These screens ARE the whole
95
+ // document — they render in a root error/not-found boundary, never inside
96
+ // a composed page — so the landmark the tenant now places on the page's
97
+ // content region has to come from somewhere here, or the boundary screens
98
+ // would be the only documents on the platform with none.
99
+ /*#__PURE__*/ _jsxs("main", {
100
+ className: ROOT_CLASS,
101
+ style: {
102
+ colorScheme: 'light dark',
103
+ minHeight: '100dvh',
104
+ display: 'flex',
105
+ flexDirection: 'column',
106
+ alignItems: 'center',
107
+ justifyContent: 'center',
108
+ gap: '1rem',
109
+ padding: '2rem 1.25rem',
110
+ textAlign: 'center',
111
+ fontFamily: 'system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif'
112
+ },
113
+ children: [
114
+ /*#__PURE__*/ _jsx("style", {
115
+ dangerouslySetInnerHTML: {
116
+ __html: STYLES
117
+ }
118
+ }),
119
+ /*#__PURE__*/ _jsx("p", {
120
+ style: {
121
+ margin: 0,
122
+ fontSize: '0.75rem',
123
+ letterSpacing: '0.2em',
124
+ textTransform: 'uppercase',
125
+ opacity: 0.6
126
+ },
127
+ children: code
128
+ }),
129
+ /*#__PURE__*/ _jsx("h1", {
130
+ style: {
131
+ margin: 0,
132
+ fontSize: 'clamp(1.5rem, 4vw, 2rem)',
133
+ fontWeight: 600
134
+ },
135
+ children: title
136
+ }),
137
+ /*#__PURE__*/ _jsx("p", {
138
+ style: {
139
+ margin: 0,
140
+ maxWidth: '38ch',
141
+ lineHeight: 1.6,
142
+ opacity: 0.75
143
+ },
144
+ children: message
145
+ }),
146
+ /*#__PURE__*/ _jsxs("div", {
147
+ style: {
148
+ display: 'flex',
149
+ flexWrap: 'wrap',
150
+ gap: '0.75rem',
151
+ justifyContent: 'center',
152
+ marginTop: '0.5rem'
153
+ },
154
+ children: [
155
+ action,
156
+ /*#__PURE__*/ _jsx("a", {
157
+ href: "/",
158
+ style: {
159
+ display: 'inline-block',
160
+ padding: '0.6rem 1.1rem',
161
+ borderRadius: '0.5rem',
162
+ borderStyle: 'solid',
163
+ borderWidth: '1px',
164
+ textDecoration: 'none',
165
+ color: 'inherit',
166
+ fontWeight: 500
167
+ },
168
+ children: 'Go to the homepage'
169
+ })
170
+ ]
171
+ })
172
+ ]
173
+ }));
174
+ }
175
+ StatusScreenPlain.displayName = 'StatusScreenPlain';
176
+ export default StatusScreenPlain;
177
+
178
+ //# sourceMappingURL=status-screen-plain.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/shared/ui/jsx/src/lib/components/status-screen-plain.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 type { ReactNode } from 'react'\n\n/**\n * The status page for App Router boundaries that render ABOVE every provider\n * (AGL-2074) — the tenant's and the console's `app/error.tsx`,\n * `app/global-error.tsx` and root `app/not-found.tsx`.\n *\n * Shared rather than duplicated per app, and deliberately NOT re-exported\n * from the barrel: this lib's index warns that everything it re-exports ships\n * eagerly on EVERY published customer page, and this component is on the cold\n * path of both apps. Both callers deep-import it.\n *\n * ## Why it uses no MUI and no theme\n *\n * These three boundaries sit outside `[host]/[scheme]/layout`, so there is no\n * `HostThemeProvider`, no resolved host, and — for `global-error`, which\n * REPLACES the root layout — no emotion cache either. A component that\n * reaches for `theme.palette` renders MUI's factory blue-and-white on a\n * customer's site, and one that reaches for emotion in `global-error` renders\n * unstyled. So this is plain elements and inline styles: the one thing every\n * one of those boundaries can definitely paint.\n *\n * ## Dark mode needs a real stylesheet here\n *\n * The first cut set `color-scheme: light dark` on the wrapper and leaned on\n * inherited colors. Measured in a dark-scheme browser: **black text on the\n * browser's black canvas**, completely unreadable. `color-scheme` changes the\n * UA's default colors for the ROOT element, and a `<div>` deep in the page\n * cannot claim the canvas — meanwhile `color` stayed at its initial black. A\n * status page that is invisible in dark mode is a worse failure than the\n * framework page it replaces, and it is invisible to markup review.\n *\n * So the colors are declared, in an inline `<style>` with a\n * `prefers-color-scheme` block, scoped to one class. A stylesheet rather than\n * inline style attributes because a media query cannot live in `style=`, and\n * an inline `<style>` rather than emotion because `global-error` runs with no\n * emotion cache at all. No class toggling and no script, so nothing here can\n * mismatch between server and client.\n *\n * ## Why it names no platform\n *\n * Same rule as `site-status-screen.component.tsx`, and it binds harder here:\n * these boundaries fire precisely when host data is unavailable, so there is\n * nothing to distinguish a white-label agency site from our own. Naming\n * nobody is the only answer that is correct in every case. No Aglyn mark, no\n * \"powered by\", no support address that would identify the operator to a\n * visitor who was never told one exists.\n *\n * The copy is deliberately generic about the operator too (\"this site\"),\n * because on `global-error` we genuinely do not know whose site it is.\n */\n\n/**\n * Names nobody — including in the CLASS, which is the half the rule above\n * missed (AGL-2350).\n *\n * This was `aglyn-status-screen`, three lines under a docblock promising \"no\n * support address that would identify the operator to a visitor who was never\n * told one exists\". The class ships to that visitor twice: on the root\n * element, and four more times inside the `<style>` block below — on the 404\n * and crash pages of a white-label customer's own domain.\n *\n * No string-scanning gate could see it. `check:brand-literals` looks for a\n * CAPITALISED `Aglyn`, on the sound reasoning that a lowercase one is nearly\n * always a hostname, package scope, cookie name or CSS class. That exclusion\n * is what made this invisible: it is a CSS class, and it is also copy about\n * who the operator is.\n */\nconst ROOT_CLASS = 'status-screen-plain'\n\n/**\n * Light values on the bare class, dark values behind the media query — so a\n * browser that never evaluates the query still gets a fully specified page,\n * and one that does gets legible text on a dark ground.\n */\nconst STYLES = `\n.${ROOT_CLASS} { background: #ffffff; color: #101114; }\n.${ROOT_CLASS} a, .${ROOT_CLASS} button { border-color: rgba(16, 17, 20, 0.32); }\n@media (prefers-color-scheme: dark) {\n .${ROOT_CLASS} { background: #101114; color: #f2f3f5; }\n .${ROOT_CLASS} a, .${ROOT_CLASS} button { border-color: rgba(242, 243, 245, 0.36); }\n}\n`\n\nexport function StatusScreenPlain({\n code,\n title,\n message,\n action,\n}: {\n code: string\n title: string\n message: string\n action?: ReactNode\n}) {\n return (\n // The document's `main` landmark (AGL-2486). These screens ARE the whole\n // document — they render in a root error/not-found boundary, never inside\n // a composed page — so the landmark the tenant now places on the page's\n // content region has to come from somewhere here, or the boundary screens\n // would be the only documents on the platform with none.\n <main\n className={ROOT_CLASS}\n style={{\n colorScheme: 'light dark',\n minHeight: '100dvh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '1rem',\n padding: '2rem 1.25rem',\n textAlign: 'center',\n fontFamily:\n 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <style dangerouslySetInnerHTML={{ __html: STYLES }} />\n <p\n style={{\n margin: 0,\n fontSize: '0.75rem',\n letterSpacing: '0.2em',\n textTransform: 'uppercase',\n opacity: 0.6,\n }}\n >\n {code}\n </p>\n <h1\n style={{\n margin: 0,\n fontSize: 'clamp(1.5rem, 4vw, 2rem)',\n fontWeight: 600,\n }}\n >\n {title}\n </h1>\n <p style={{ margin: 0, maxWidth: '38ch', lineHeight: 1.6, opacity: 0.75 }}>\n {message}\n </p>\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '0.75rem',\n justifyContent: 'center',\n marginTop: '0.5rem',\n }}\n >\n {action}\n {/* A plain anchor, NOT `AppLink`/`next/link`. `global-error` replaces\n the root layout and can be reached with the router in an unusable\n state, and a client-side navigation that fails leaves the visitor\n on the same broken page with no feedback. A full document load\n always works. */}\n <a\n href=\"/\"\n style={{\n display: 'inline-block',\n padding: '0.6rem 1.1rem',\n borderRadius: '0.5rem',\n borderStyle: 'solid',\n borderWidth: '1px',\n textDecoration: 'none',\n color: 'inherit',\n fontWeight: 500,\n }}\n >\n {'Go to the homepage'}\n </a>\n </div>\n </main>\n )\n}\nStatusScreenPlain.displayName = 'StatusScreenPlain'\n\nexport default StatusScreenPlain\n"],"names":["ROOT_CLASS","STYLES","StatusScreenPlain","code","title","message","action","main","className","style","colorScheme","minHeight","display","flexDirection","alignItems","justifyContent","gap","padding","textAlign","fontFamily","dangerouslySetInnerHTML","__html","p","margin","fontSize","letterSpacing","textTransform","opacity","h1","fontWeight","maxWidth","lineHeight","div","flexWrap","marginTop","a","href","borderRadius","borderStyle","borderWidth","textDecoration","color","displayName"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDC,GAED;;;;;;;;;;;;;;;CAeC,GACD,MAAMA,aAAa;AAEnB;;;;CAIC,GACD,MAAMC,SAAS,CAAC;CACf,EAAED,WAAW;CACb,EAAEA,WAAW,KAAK,EAAEA,WAAW;;GAE7B,EAAEA,WAAW;GACb,EAAEA,WAAW,KAAK,EAAEA,WAAW;;AAElC,CAAC;AAED,OAAO,SAASE,kBAAkB,EAChCC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,MAAM,EAMP;IACC,OACE,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAC1E,yDAAyD;kBACzD,MAACC;QACCC,WAAWR;QACXS,OAAO;YACLC,aAAa;YACbC,WAAW;YACXC,SAAS;YACTC,eAAe;YACfC,YAAY;YACZC,gBAAgB;YAChBC,KAAK;YACLC,SAAS;YACTC,WAAW;YACXC,YACE;QACJ;;0BAEA,KAACV;gBAAMW,yBAAyB;oBAAEC,QAAQpB;gBAAO;;0BACjD,KAACqB;gBACCb,OAAO;oBACLc,QAAQ;oBACRC,UAAU;oBACVC,eAAe;oBACfC,eAAe;oBACfC,SAAS;gBACX;0BAECxB;;0BAEH,KAACyB;gBACCnB,OAAO;oBACLc,QAAQ;oBACRC,UAAU;oBACVK,YAAY;gBACd;0BAECzB;;0BAEH,KAACkB;gBAAEb,OAAO;oBAAEc,QAAQ;oBAAGO,UAAU;oBAAQC,YAAY;oBAAKJ,SAAS;gBAAK;0BACrEtB;;0BAEH,MAAC2B;gBACCvB,OAAO;oBACLG,SAAS;oBACTqB,UAAU;oBACVjB,KAAK;oBACLD,gBAAgB;oBAChBmB,WAAW;gBACb;;oBAEC5B;kCAMD,KAAC6B;wBACCC,MAAK;wBACL3B,OAAO;4BACLG,SAAS;4BACTK,SAAS;4BACToB,cAAc;4BACdC,aAAa;4BACbC,aAAa;4BACbC,gBAAgB;4BAChBC,OAAO;4BACPZ,YAAY;wBACd;kCAEC;;;;;;AAKX;AACA3B,kBAAkBwC,WAAW,GAAG;AAEhC,eAAexC,kBAAiB"}
@@ -0,0 +1,30 @@
1
+ import { type HelpTipContent } from './help-tip.component';
2
+ export interface UsageMeterProps {
3
+ label: string;
4
+ /** `null` while the usage source has not answered — "not yet metered". */
5
+ used: number | null;
6
+ limit: number;
7
+ unit?: string;
8
+ /** True when the plan caps nothing here; the bar is omitted and the limit reads "Unlimited". */
9
+ unlimited?: boolean;
10
+ /**
11
+ * Optional help affordance beside the label.
12
+ *
13
+ * A meter is a number against a limit and says nothing about what happens
14
+ * when the two meet — which for bandwidth is the whole question, and is
15
+ * different on Free (the site pauses) than on a paid plan (the extra bills).
16
+ */
17
+ help?: HelpTipContent;
18
+ /** Where "Upgrade" points once the meter warns; the plans anchor by default. */
19
+ upgradeHref?: string;
20
+ }
21
+ /**
22
+ * One quota meter: used/limit progress with warning at ≥80%, error at the
23
+ * cap, an "Upgrade" link once warning, "Unlimited" for uncapped plans, and
24
+ * a "not yet metered" state for usage sources that have not answered.
25
+ *
26
+ * Shared (AGL-2939) so a plugin's own meter — the AI credits band — draws
27
+ * beside the platform's on the same terms rather than as a lookalike.
28
+ */
29
+ export declare function UsageMeter(props: UsageMeterProps): import("react").JSX.Element;
30
+ export default UsageMeter;
@@ -0,0 +1,92 @@
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
+ */ 'use client';
17
+ import { _ as _extends } from "@swc/helpers/_/_extends";
18
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
19
+ import { LinearProgress, Link, Stack, Typography } from "@mui/material";
20
+ import { HelpTip } from "./help-tip.component.js";
21
+ function formatLimit(limit, unit, unlimited) {
22
+ if (unlimited) return 'Unlimited';
23
+ return unit ? `${limit} ${unit}` : String(limit);
24
+ }
25
+ /**
26
+ * One quota meter: used/limit progress with warning at ≥80%, error at the
27
+ * cap, an "Upgrade" link once warning, "Unlimited" for uncapped plans, and
28
+ * a "not yet metered" state for usage sources that have not answered.
29
+ *
30
+ * Shared (AGL-2939) so a plugin's own meter — the AI credits band — draws
31
+ * beside the platform's on the same terms rather than as a lookalike.
32
+ */ export function UsageMeter(props) {
33
+ const { label, used, limit, unit, help, upgradeHref = '#plans' } = props;
34
+ const unlimited = props.unlimited === true;
35
+ const unmetered = used == null;
36
+ const pct = unlimited || unmetered || limit <= 0 ? 0 : Math.min(100, used / limit * 100);
37
+ const warning = !unlimited && !unmetered && pct >= 80;
38
+ return /*#__PURE__*/ _jsxs(Stack, {
39
+ spacing: 0.5,
40
+ sx: {
41
+ mb: 2
42
+ },
43
+ children: [
44
+ /*#__PURE__*/ _jsxs(Stack, {
45
+ direction: "row",
46
+ sx: {
47
+ justifyContent: 'space-between'
48
+ },
49
+ children: [
50
+ /*#__PURE__*/ _jsxs(Typography, {
51
+ variant: "body2",
52
+ children: [
53
+ label,
54
+ help ? /*#__PURE__*/ _jsx(HelpTip, _extends({}, help, {
55
+ sx: {
56
+ ml: 0.5,
57
+ fontSize: '0.8em'
58
+ }
59
+ })) : null
60
+ ]
61
+ }),
62
+ /*#__PURE__*/ _jsxs(Typography, {
63
+ variant: "body2",
64
+ color: "text.secondary",
65
+ children: [
66
+ unmetered ? `not yet metered · limit ${formatLimit(limit, unit, unlimited)}` : `${used} / ${formatLimit(limit, unit, unlimited)}`,
67
+ warning ? /*#__PURE__*/ _jsxs(_Fragment, {
68
+ children: [
69
+ ' · ',
70
+ /*#__PURE__*/ _jsx(Link, {
71
+ href: upgradeHref,
72
+ color: "primary",
73
+ underline: "hover",
74
+ children: 'Upgrade'
75
+ })
76
+ ]
77
+ }) : null
78
+ ]
79
+ })
80
+ ]
81
+ }),
82
+ unlimited || unmetered ? null : /*#__PURE__*/ _jsx(LinearProgress, {
83
+ variant: "determinate",
84
+ value: pct,
85
+ color: pct >= 100 ? 'error' : warning ? 'warning' : 'primary'
86
+ })
87
+ ]
88
+ });
89
+ }
90
+ export default UsageMeter;
91
+
92
+ //# sourceMappingURL=usage-meter.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/shared/ui/jsx/src/lib/components/usage-meter.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'use client'\n\nimport { LinearProgress, Link, Stack, Typography } from '@mui/material'\nimport { HelpTip, type HelpTipContent } from './help-tip.component'\n\nexport interface UsageMeterProps {\n label: string\n /** `null` while the usage source has not answered — \"not yet metered\". */\n used: number | null\n limit: number\n unit?: string\n /** True when the plan caps nothing here; the bar is omitted and the limit reads \"Unlimited\". */\n unlimited?: boolean\n /**\n * Optional help affordance beside the label.\n *\n * A meter is a number against a limit and says nothing about what happens\n * when the two meet — which for bandwidth is the whole question, and is\n * different on Free (the site pauses) than on a paid plan (the extra bills).\n */\n help?: HelpTipContent\n /** Where \"Upgrade\" points once the meter warns; the plans anchor by default. */\n upgradeHref?: string\n}\n\nfunction formatLimit(limit: number, unit: string | undefined, unlimited: boolean): string {\n if (unlimited) return 'Unlimited'\n return unit ? `${limit} ${unit}` : String(limit)\n}\n\n/**\n * One quota meter: used/limit progress with warning at ≥80%, error at the\n * cap, an \"Upgrade\" link once warning, \"Unlimited\" for uncapped plans, and\n * a \"not yet metered\" state for usage sources that have not answered.\n *\n * Shared (AGL-2939) so a plugin's own meter — the AI credits band — draws\n * beside the platform's on the same terms rather than as a lookalike.\n */\nexport function UsageMeter(props: UsageMeterProps) {\n const { label, used, limit, unit, help, upgradeHref = '#plans' } = props\n const unlimited = props.unlimited === true\n const unmetered = used == null\n const pct =\n unlimited || unmetered || limit <= 0 ? 0 : Math.min(100, (used / limit) * 100)\n const warning = !unlimited && !unmetered && pct >= 80\n return (\n <Stack spacing={0.5} sx={{ mb: 2 }}>\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n {/*\n The tip renders INSIDE the label, not beside it in a wrapper: the\n console's meter specs find a meter by `getByText(label).parentElement`\n and read the row's text from it, and a wrapper would make that\n parent the wrapper, whose text is the label alone.\n */}\n <Typography variant=\"body2\">\n {label}\n {help ? <HelpTip {...help} sx={{ ml: 0.5, fontSize: '0.8em' }} /> : null}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {unmetered\n ? `not yet metered · limit ${formatLimit(limit, unit, unlimited)}`\n : `${used} / ${formatLimit(limit, unit, unlimited)}`}\n {warning ? (\n <>\n {' · '}\n <Link href={upgradeHref} color=\"primary\" underline=\"hover\">\n {'Upgrade'}\n </Link>\n </>\n ) : null}\n </Typography>\n </Stack>\n {unlimited || unmetered ? null : (\n <LinearProgress\n variant=\"determinate\"\n value={pct}\n color={pct >= 100 ? 'error' : warning ? 'warning' : 'primary'}\n />\n )}\n </Stack>\n )\n}\n\nexport default UsageMeter\n"],"names":["LinearProgress","Link","Stack","Typography","HelpTip","formatLimit","limit","unit","unlimited","String","UsageMeter","props","label","used","help","upgradeHref","unmetered","pct","Math","min","warning","spacing","sx","mb","direction","justifyContent","variant","ml","fontSize","color","href","underline","value"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;;AAEA,SAASA,cAAc,EAAEC,IAAI,EAAEC,KAAK,EAAEC,UAAU,QAAQ,gBAAe;AACvE,SAASC,OAAO,QAA6B,0BAAsB;AAsBnE,SAASC,YAAYC,KAAa,EAAEC,IAAwB,EAAEC,SAAkB;IAC9E,IAAIA,WAAW,OAAO;IACtB,OAAOD,OAAO,GAAGD,MAAM,CAAC,EAAEC,MAAM,GAAGE,OAAOH;AAC5C;AAEA;;;;;;;CAOC,GACD,OAAO,SAASI,WAAWC,KAAsB;IAC/C,MAAM,EAAEC,KAAK,EAAEC,IAAI,EAAEP,KAAK,EAAEC,IAAI,EAAEO,IAAI,EAAEC,cAAc,QAAQ,EAAE,GAAGJ;IACnE,MAAMH,YAAYG,MAAMH,SAAS,KAAK;IACtC,MAAMQ,YAAYH,QAAQ;IAC1B,MAAMI,MACJT,aAAaQ,aAAaV,SAAS,IAAI,IAAIY,KAAKC,GAAG,CAAC,KAAK,AAACN,OAAOP,QAAS;IAC5E,MAAMc,UAAU,CAACZ,aAAa,CAACQ,aAAaC,OAAO;IACnD,qBACE,MAACf;QAAMmB,SAAS;QAAKC,IAAI;YAAEC,IAAI;QAAE;;0BAC/B,MAACrB;gBAAMsB,WAAU;gBAAMF,IAAI;oBAAEG,gBAAgB;gBAAgB;;kCAO3D,MAACtB;wBAAWuB,SAAQ;;4BACjBd;4BACAE,qBAAO,KAACV,sBAAYU;gCAAMQ,IAAI;oCAAEK,IAAI;oCAAKC,UAAU;gCAAQ;kCAAQ;;;kCAEtE,MAACzB;wBAAWuB,SAAQ;wBAAQG,OAAM;;4BAC/Bb,YACG,CAAC,wBAAwB,EAAEX,YAAYC,OAAOC,MAAMC,YAAY,GAChE,GAAGK,KAAK,GAAG,EAAER,YAAYC,OAAOC,MAAMC,YAAY;4BACrDY,wBACC;;oCACG;kDACD,KAACnB;wCAAK6B,MAAMf;wCAAac,OAAM;wCAAUE,WAAU;kDAChD;;;iCAGH;;;;;YAGPvB,aAAaQ,YAAY,qBACxB,KAAChB;gBACC0B,SAAQ;gBACRM,OAAOf;gBACPY,OAAOZ,OAAO,MAAM,UAAUG,UAAU,YAAY;;;;AAK9D;AAEA,eAAeV,WAAU"}
@@ -0,0 +1,50 @@
1
+ import { type TextFieldProps } from '@mui/material';
2
+ /**
3
+ * A text field whose value may name VARIABLES, with the two ways of reaching
4
+ * them that the besigner's attribute fields already taught (AGL-3197).
5
+ *
6
+ * ## What it is, and what it deliberately is not
7
+ *
8
+ * It is a plain MUI `TextField`. The value in it is the value that is stored —
9
+ * `{{site.name}}` reads as `{{site.name}}`, and what makes that legible is the
10
+ * PREVIEW under the field, not a pill drawn over the text.
11
+ *
12
+ * The besigner's `TokenTextField` does draw pills, and this is not that on
13
+ * purpose. That field is a contentEditable surface with its own selection
14
+ * model, DOM/model sync contract, paste handling and undo trade-offs, wired to
15
+ * react-final-form and to the canvas's binding and media pickers. It earns all
16
+ * of that because a node attribute can hold a token referring to any record on
17
+ * the page. Here there are three variables, the field is 60 characters long,
18
+ * and the honest cost of a pill surface — an editor that fights the IME, an
19
+ * undo stack that truncates, a value the author cannot select and retype — is
20
+ * not worth paying for a title. A plain input, a menu and a live preview are.
21
+ *
22
+ * ## Two ways in, because people reach for different ones
23
+ *
24
+ * The `+` opens the list with a description under each name; typing `{{`
25
+ * offers the same list inline, filtered by whatever follows. Either way the
26
+ * insert lands at the caret, and the caret is left after it — not at the end
27
+ * of the value, which is where an insert that rebuilt the string would leave
28
+ * it, and which is wrong whenever somebody is editing the middle of a title.
29
+ */
30
+ export interface VariableOption {
31
+ /** Written between the braces. */
32
+ name: string;
33
+ /** What the menu calls it. */
34
+ label: string;
35
+ /** One line under the label. */
36
+ description?: string;
37
+ }
38
+ export interface VariableTextFieldProps extends Omit<TextFieldProps, 'onChange' | 'value'> {
39
+ value: string;
40
+ onChange: (value: string) => void;
41
+ /** Every variable this field offers. */
42
+ variables: readonly VariableOption[];
43
+ /** The tooltip on the insert control. */
44
+ insertLabel?: string;
45
+ }
46
+ export declare function VariableTextField(props: VariableTextFieldProps): import("react").JSX.Element;
47
+ export declare namespace VariableTextField {
48
+ var displayName: string;
49
+ }
50
+ export default VariableTextField;