@vertesia/ui 1.6.0-dev.20260918.090710Z → 1.6.0-dev.20260923.085325Z
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/boot/branding.d.ts +13 -0
- package/lib/boot/branding.d.ts.map +1 -1
- package/lib/boot/branding.js +7 -0
- package/lib/boot/branding.js.map +1 -1
- package/lib/boot/index.d.ts +1 -1
- package/lib/boot/index.d.ts.map +1 -1
- package/lib/boot/index.js +5 -23
- package/lib/boot/index.js.map +1 -1
- package/lib/boot/loading.d.ts +4 -0
- package/lib/boot/loading.d.ts.map +1 -0
- package/lib/boot/loading.js +28 -0
- package/lib/boot/loading.js.map +1 -0
- package/lib/core/components/SelectList.d.ts.map +1 -1
- package/lib/core/components/SelectList.js +3 -3
- package/lib/core/components/SelectList.js.map +1 -1
- package/lib/core/components/SidePanel.d.ts.map +1 -1
- package/lib/core/components/SidePanel.js +2 -1
- package/lib/core/components/SidePanel.js.map +1 -1
- package/lib/core/components/shadcn/theme/ThemeProvider.d.ts.map +1 -1
- package/lib/core/components/shadcn/theme/ThemeProvider.js +21 -5
- package/lib/core/components/shadcn/theme/ThemeProvider.js.map +1 -1
- package/lib/env/index.d.ts +11 -0
- package/lib/env/index.d.ts.map +1 -1
- package/lib/env/index.js +16 -3
- package/lib/env/index.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +4 -1
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +5 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +9 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
- package/lib/features/magic-pdf/GroundedExtractionView.js +3 -3
- package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -1
- package/lib/features/media-viewer/AudioPanel.d.ts +10 -2
- package/lib/features/media-viewer/AudioPanel.d.ts.map +1 -1
- package/lib/features/media-viewer/AudioPanel.js +78 -13
- package/lib/features/media-viewer/AudioPanel.js.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.d.ts +2 -2
- package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.js +9 -7
- package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
- package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -1
- package/lib/features/oauth/McpConnectionsDialog.js +7 -3
- package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
- package/lib/features/oauth/useMcpConnections.d.ts +4 -2
- package/lib/features/oauth/useMcpConnections.d.ts.map +1 -1
- package/lib/features/oauth/useMcpConnections.js +15 -9
- package/lib/features/oauth/useMcpConnections.js.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionContext.js +2 -0
- package/lib/features/store/objects/selection/ObjectsActionContext.js.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.d.ts +4 -2
- package/lib/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.js +6 -3
- package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
- package/lib/features/store/objects/selection/actions/StartWorkflowAction.d.ts +4 -0
- package/lib/features/store/objects/selection/actions/StartWorkflowAction.d.ts.map +1 -0
- package/lib/features/store/objects/selection/actions/StartWorkflowAction.js +81 -0
- package/lib/features/store/objects/selection/actions/StartWorkflowAction.js.map +1 -0
- package/lib/features/store/objects/selection/actions/index.d.ts +1 -0
- package/lib/features/store/objects/selection/actions/index.d.ts.map +1 -1
- package/lib/features/store/objects/selection/actions/index.js +1 -0
- package/lib/features/store/objects/selection/actions/index.js.map +1 -1
- package/lib/features/store/types/TypeRegistry.d.ts +345 -155
- package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +345 -155
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
- package/lib/i18n/locales/ar.json +10 -2
- package/lib/i18n/locales/de.json +6 -2
- package/lib/i18n/locales/en.json +6 -2
- package/lib/i18n/locales/es.json +6 -2
- package/lib/i18n/locales/fr.json +7 -2
- package/lib/i18n/locales/it.json +6 -2
- package/lib/i18n/locales/ja.json +6 -2
- package/lib/i18n/locales/ko.json +6 -2
- package/lib/i18n/locales/pt.json +6 -2
- package/lib/i18n/locales/ru.json +8 -2
- package/lib/i18n/locales/tr.json +6 -2
- package/lib/i18n/locales/zh-TW.json +6 -2
- package/lib/i18n/locales/zh.json +6 -2
- package/lib/session/UserSession.d.ts +3 -0
- package/lib/session/UserSession.d.ts.map +1 -1
- package/lib/session/UserSession.js +18 -8
- package/lib/session/UserSession.js.map +1 -1
- package/lib/session/UserSessionProvider.d.ts.map +1 -1
- package/lib/session/UserSessionProvider.js +34 -24
- package/lib/session/UserSessionProvider.js.map +1 -1
- package/lib/session/auth/authRoundTrip.d.ts +8 -0
- package/lib/session/auth/authRoundTrip.d.ts.map +1 -0
- package/lib/session/auth/authRoundTrip.js +22 -0
- package/lib/session/auth/authRoundTrip.js.map +1 -0
- package/lib/session/auth/composable.d.ts.map +1 -1
- package/lib/session/auth/composable.js +9 -7
- package/lib/session/auth/composable.js.map +1 -1
- package/lib/session/auth/domainRouting.d.ts +13 -6
- package/lib/session/auth/domainRouting.d.ts.map +1 -1
- package/lib/session/auth/domainRouting.js +2 -21
- package/lib/session/auth/domainRouting.js.map +1 -1
- package/lib/session/auth/oauth.d.ts +6 -1
- package/lib/session/auth/oauth.d.ts.map +1 -1
- package/lib/session/auth/oauth.js +145 -8
- package/lib/session/auth/oauth.js.map +1 -1
- package/lib/session/auth/tokenIssuer.d.ts +3 -0
- package/lib/session/auth/tokenIssuer.d.ts.map +1 -0
- package/lib/session/auth/tokenIssuer.js +27 -0
- package/lib/session/auth/tokenIssuer.js.map +1 -0
- package/lib/session/auth/vertesiaHosts.d.ts +47 -0
- package/lib/session/auth/vertesiaHosts.d.ts.map +1 -0
- package/lib/session/auth/vertesiaHosts.js +79 -0
- package/lib/session/auth/vertesiaHosts.js.map +1 -0
- package/lib/session/index.d.ts +1 -0
- package/lib/session/index.d.ts.map +1 -1
- package/lib/session/index.js +1 -0
- package/lib/session/index.js.map +1 -1
- package/lib/shell/AuthScreenPreview.d.ts +1 -1
- package/lib/shell/AuthScreenPreview.d.ts.map +1 -1
- package/lib/shell/AuthScreenPreview.js +2 -5
- package/lib/shell/AuthScreenPreview.js.map +1 -1
- package/lib/shell/BrandedAuthScreens.d.ts +1 -4
- package/lib/shell/BrandedAuthScreens.d.ts.map +1 -1
- package/lib/shell/BrandedAuthScreens.js +5 -26
- package/lib/shell/BrandedAuthScreens.js.map +1 -1
- package/lib/shell/BrandedLoadingIndicator.d.ts +11 -0
- package/lib/shell/BrandedLoadingIndicator.d.ts.map +1 -0
- package/lib/shell/BrandedLoadingIndicator.js +27 -0
- package/lib/shell/BrandedLoadingIndicator.js.map +1 -0
- package/lib/shell/SplashScreen.d.ts.map +1 -1
- package/lib/shell/SplashScreen.js +2 -1
- package/lib/shell/SplashScreen.js.map +1 -1
- package/lib/shell/apps/AppInstallationProvider.d.ts +16 -4
- package/lib/shell/apps/AppInstallationProvider.d.ts.map +1 -1
- package/lib/shell/apps/iframe-auth.d.ts +2 -0
- package/lib/shell/apps/iframe-auth.d.ts.map +1 -1
- package/lib/shell/apps/iframe-auth.js +6 -2
- package/lib/shell/apps/iframe-auth.js.map +1 -1
- package/lib/shell/index.d.ts +1 -0
- package/lib/shell/index.d.ts.map +1 -1
- package/lib/shell/index.js +1 -0
- package/lib/shell/index.js.map +1 -1
- package/lib/shell/login/SignInAuthPending.js +2 -2
- package/lib/shell/login/SignInAuthPending.js.map +1 -1
- package/lib/shell/login/SignInEmailStep.d.ts.map +1 -1
- package/lib/shell/login/SignInEmailStep.js +2 -2
- package/lib/shell/login/SignInEmailStep.js.map +1 -1
- package/lib/shell/login/TerminalLogin.d.ts.map +1 -1
- package/lib/shell/login/TerminalLogin.js +28 -21
- package/lib/shell/login/TerminalLogin.js.map +1 -1
- package/lib/vertesia-ui-boot.js +33 -29
- package/lib/vertesia-ui-boot.js.map +1 -1
- package/lib/vertesia-ui-core.js +34 -34
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-env.js +1 -1
- package/lib/vertesia-ui-env.js.map +1 -1
- package/lib/vertesia-ui-features.js +163 -163
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.Bl8KeZUK.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.Bl8KeZUK.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.BmT06XFI.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BmT06XFI.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.Ch-Jjj0L.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.Ch-Jjj0L.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.CjhloW9s.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.CjhloW9s.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.CkfHdQzY.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.CkfHdQzY.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DFuKfTe1.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DFuKfTe1.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DHqNVekZ.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DHqNVekZ.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DOaKbmaj.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DOaKbmaj.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.Dge3Gl-h.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.Dge3Gl-h.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.GLt-10Lx.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.GLt-10Lx.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.T-XtAGbw.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.T-XtAGbw.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.VOJyTpMM.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.VOJyTpMM.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.js +3 -3
- package/lib/vertesia-ui-i18n.js.map +1 -1
- package/lib/vertesia-ui-layout.js +15 -15
- package/lib/vertesia-ui-layout.js.map +1 -1
- package/lib/vertesia-ui-rich-text.js +44 -44
- package/lib/vertesia-ui-rich-text.js.map +1 -1
- package/lib/vertesia-ui-session.js +1 -1
- package/lib/vertesia-ui-session.js.map +1 -1
- package/lib/vertesia-ui-shell.js +72 -48
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +51 -51
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/package.json +19 -19
- package/src/boot/branding.ts +8 -0
- package/src/boot/index.ts +6 -23
- package/src/boot/loading.ts +27 -0
- package/src/core/components/SelectList.tsx +5 -2
- package/src/core/components/SidePanel.tsx +65 -60
- package/src/core/components/shadcn/theme/ThemeProvider.test.tsx +101 -0
- package/src/core/components/shadcn/theme/ThemeProvider.tsx +21 -9
- package/src/env/index.test.ts +21 -0
- package/src/env/index.ts +33 -2
- package/src/features/agent/chat/ModernAgentConversation.test.tsx +81 -0
- package/src/features/agent/chat/ModernAgentConversation.tsx +5 -0
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +17 -1
- package/src/features/magic-pdf/GroundedExtractionView.tsx +3 -3
- package/src/features/media-viewer/AudioPanel.test.ts +84 -0
- package/src/features/media-viewer/AudioPanel.tsx +97 -14
- package/src/features/oauth/McpConnectionsButton.test.tsx +56 -0
- package/src/features/oauth/McpConnectionsButton.tsx +9 -6
- package/src/features/oauth/McpConnectionsDialog.tsx +14 -5
- package/src/features/oauth/useMcpConnections.test.ts +10 -0
- package/src/features/oauth/useMcpConnections.ts +18 -10
- package/src/features/store/objects/selection/ObjectsActionContext.tsx +2 -0
- package/src/features/store/objects/selection/SelectionActions.tsx +13 -6
- package/src/features/store/objects/selection/actions/StartWorkflowAction.tsx +162 -0
- package/src/features/store/objects/selection/actions/index.ts +1 -0
- package/src/i18n/locales/ar.json +10 -2
- package/src/i18n/locales/de.json +6 -2
- package/src/i18n/locales/en.json +6 -2
- package/src/i18n/locales/es.json +6 -2
- package/src/i18n/locales/fr.json +7 -2
- package/src/i18n/locales/it.json +6 -2
- package/src/i18n/locales/ja.json +6 -2
- package/src/i18n/locales/ko.json +6 -2
- package/src/i18n/locales/pt.json +6 -2
- package/src/i18n/locales/ru.json +8 -2
- package/src/i18n/locales/tr.json +6 -2
- package/src/i18n/locales/zh-TW.json +6 -2
- package/src/i18n/locales/zh.json +6 -2
- package/src/session/UserSession.test.ts +48 -3
- package/src/session/UserSession.ts +20 -8
- package/src/session/UserSessionProvider.handoff.test.tsx +103 -0
- package/src/session/UserSessionProvider.iframe.test.tsx +178 -0
- package/src/session/UserSessionProvider.state-mismatch.test.tsx +43 -0
- package/src/session/UserSessionProvider.tsx +35 -23
- package/src/session/auth/auth-flow.md +18 -5
- package/src/session/auth/authRoundTrip.ts +24 -0
- package/src/session/auth/composable.test.ts +23 -1
- package/src/session/auth/composable.ts +10 -8
- package/src/session/auth/domainRouting.ts +4 -25
- package/src/session/auth/oauth.test.ts +121 -4
- package/src/session/auth/oauth.ts +172 -11
- package/src/session/auth/tokenIssuer.test.ts +25 -0
- package/src/session/auth/tokenIssuer.ts +25 -0
- package/src/session/auth/vertesiaHosts.test.ts +26 -0
- package/src/session/auth/vertesiaHosts.ts +85 -0
- package/src/session/index.ts +1 -0
- package/src/shell/AuthScreenPreview.tsx +2 -6
- package/src/shell/BrandedAuthScreens.test.tsx +26 -0
- package/src/shell/BrandedAuthScreens.tsx +4 -40
- package/src/shell/BrandedLoadingIndicator.tsx +42 -0
- package/src/shell/SplashScreen.tsx +4 -4
- package/src/shell/apps/iframe-auth.test.ts +8 -11
- package/src/shell/apps/iframe-auth.ts +10 -1
- package/src/shell/index.tsx +1 -0
- package/src/shell/login/SignInAuthPending.tsx +2 -2
- package/src/shell/login/SignInEmailStep.tsx +4 -2
- package/src/shell/login/TerminalLogin.test.tsx +111 -0
- package/src/shell/login/TerminalLogin.tsx +61 -37
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.d.ts +0 -7
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.d.ts.map +0 -1
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.js +0 -51
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.js.map +0 -1
- package/lib/vertesia-ui-i18n.B3NFclwl.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.B3NFclwl.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.BWSrNIxc.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BWSrNIxc.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.BWvWeB1p.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BWvWeB1p.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.BZCXvTC1.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BZCXvTC1.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.BbJMvFZW.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BbJMvFZW.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.CE5ldwpt.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.CE5ldwpt.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.CMC0IShY.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.CMC0IShY.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.CkcRqBKU.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.CkcRqBKU.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.D-Mq1sw_.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.D-Mq1sw_.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.DkK68-A-.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.DkK68-A-.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.XE_dcCg6.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.XE_dcCg6.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.qgNqMPvK.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.qgNqMPvK.chunk.js.map +0 -1
- package/src/features/store/objects/selection/actions/StartWorkflowButton.tsx +0 -104
package/lib/vertesia-ui-boot.js
CHANGED
|
@@ -6,7 +6,32 @@ ${t} { ${o}${r(e.colors?.light)}${s?`font-family:${n(s.family)};`:``} }
|
|
|
6
6
|
`}function a(e){return{iconSrc:e.loadingIcon?.light,darkIconSrc:e.loadingIcon?.dark,loadingLabel:e.copy?.loading,slowLoadingLabel:e.copy?.slowLoading,reloadLabel:e.copy?.reload,html:e.boot?.html,styles:`${i(e,`#loading-indicator`)}
|
|
7
7
|
${e.colors?.light?.background?`:root{--vertesia-boot-background:${e.colors.light.background}}`:``}
|
|
8
8
|
${e.colors?.dark?.background?`:root.dark{--vertesia-boot-background:${e.colors.dark.background}}`:``}
|
|
9
|
-
${e.boot?.styles??``}`}}const o=`
|
|
9
|
+
${e.boot?.styles??``}`}}const o={name:`Vertesia`,logo:{light:`/logo-light.png`,dark:`/logo-dark.png`,alt:`Vertesia`},loadingIcon:{light:`/icon.svg`},favicon:`/icon.svg`},s=o.loadingIcon.light,c=`
|
|
10
|
+
|
|
11
|
+
@keyframes vertesia-loading-spin {
|
|
12
|
+
from { transform: rotate(0deg); }
|
|
13
|
+
to { transform: rotate(360deg); }
|
|
14
|
+
}
|
|
15
|
+
.vertesia-loading-motion {
|
|
16
|
+
animation: var(--vertesia-loading-animation, vertesia-loading-spin 2s linear infinite);
|
|
17
|
+
}
|
|
18
|
+
.vertesia-loading-icon {
|
|
19
|
+
width: 40px !important;
|
|
20
|
+
min-width: 40px !important;
|
|
21
|
+
max-width: 40px !important;
|
|
22
|
+
height: 40px !important;
|
|
23
|
+
min-height: 40px !important;
|
|
24
|
+
max-height: 40px !important;
|
|
25
|
+
margin: 0;
|
|
26
|
+
padding: 0;
|
|
27
|
+
object-fit: contain;
|
|
28
|
+
flex: none;
|
|
29
|
+
border-radius: 100% !important;
|
|
30
|
+
}
|
|
31
|
+
@media (prefers-reduced-motion: reduce) {
|
|
32
|
+
.vertesia-loading-motion { animation: none !important; }
|
|
33
|
+
}
|
|
34
|
+
|
|
10
35
|
.vboot {
|
|
11
36
|
--vb-bg: #ffffff;
|
|
12
37
|
--vb-fg: #0a0a0a;
|
|
@@ -29,10 +54,6 @@ ${e.boot?.styles??``}`}}const o=`
|
|
|
29
54
|
--vb-primary-fg: #fafafa;
|
|
30
55
|
--vb-glow: rgba(79, 70, 229, 0.2);
|
|
31
56
|
}
|
|
32
|
-
@keyframes vboot-spin {
|
|
33
|
-
from { transform: rotate(0deg); }
|
|
34
|
-
to { transform: rotate(360deg); }
|
|
35
|
-
}
|
|
36
57
|
.vboot-overlay {
|
|
37
58
|
position: absolute !important;
|
|
38
59
|
inset: 0 !important;
|
|
@@ -60,20 +81,6 @@ ${e.boot?.styles??``}`}}const o=`
|
|
|
60
81
|
padding: 0 !important;
|
|
61
82
|
transform: none !important;
|
|
62
83
|
}
|
|
63
|
-
.vboot-spinner {
|
|
64
|
-
width: 2.5rem !important;
|
|
65
|
-
min-width: 2.5rem !important;
|
|
66
|
-
max-width: 2.5rem !important;
|
|
67
|
-
height: 2.5rem !important;
|
|
68
|
-
min-height: 2.5rem !important;
|
|
69
|
-
max-height: 2.5rem !important;
|
|
70
|
-
margin: 0 !important;
|
|
71
|
-
padding: 0 !important;
|
|
72
|
-
object-fit: contain !important;
|
|
73
|
-
flex: none !important;
|
|
74
|
-
border-radius: 100% !important;
|
|
75
|
-
animation: var(--vertesia-loading-animation, vboot-spin 2s linear infinite) !important;
|
|
76
|
-
}
|
|
77
84
|
.vboot-icon-dark { display: none; }
|
|
78
85
|
.vboot-dark .vboot-icon-light { display: none; }
|
|
79
86
|
.vboot-dark .vboot-icon-dark { display: block; }
|
|
@@ -100,16 +107,13 @@ ${e.boot?.styles??``}`}}const o=`
|
|
|
100
107
|
.vboot-btn:hover {
|
|
101
108
|
opacity: 0.9;
|
|
102
109
|
}
|
|
103
|
-
|
|
104
|
-
.vboot-spinner { animation: none !important; }
|
|
105
|
-
}
|
|
106
|
-
`;function s(e){return JSON.stringify(e).replaceAll(`<`,`\\u003c`)}function c(e){return{storageKey:e.storageKey??`vite-ui-theme`,iconSrc:e.iconSrc??`/icon.svg`,loadingLabel:e.loadingLabel??`Loading`,autoStart:e.autoStart??!0,html:e.html,styles:e.styles}}function l(e={}){let t=e=>e.replace(/[&<>"']/g,e=>({"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`})[e]??e),{iconSrc:n,loadingLabel:r}=c(e),i=(e,n=``)=>`<img class="vboot-spinner ${n}" width="40" height="40" src="${t(e)}" alt="${t(r)}" />`;return`<div class="vboot-overlay" role="status" aria-live="polite">${e.darkIconSrc?i(n,`vboot-icon-light`)+i(e.darkIconSrc,`vboot-icon-dark`):i(n)}
|
|
110
|
+
`;function l(e){return JSON.stringify(e).replaceAll(`<`,`\\u003c`)}function u(e){return{storageKey:e.storageKey??`vite-ui-theme`,iconSrc:e.iconSrc??s,loadingLabel:e.loadingLabel??`Loading`,autoStart:e.autoStart??!0,html:e.html,styles:e.styles}}function d(e={}){let t=e=>e.replace(/[&<>"']/g,e=>({"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`})[e]??e),{iconSrc:n,loadingLabel:r}=u(e),i=(e,n=``)=>`<img class="vboot-spinner vertesia-loading-icon vertesia-loading-motion ${n}" width="40" height="40" src="${t(e)}" alt="${t(r)}" />`;return`<div class="vboot-overlay" role="status" aria-live="polite">${e.darkIconSrc?i(n,`vboot-icon-light`)+i(e.darkIconSrc,`vboot-icon-dark`):i(n)}
|
|
107
111
|
<div id="loading-slow-notice" class="vboot-slow" style="display: none;">
|
|
108
112
|
<p>${t(e.slowLoadingLabel??`Still loading — this is taking longer than usual.`)}</p>
|
|
109
|
-
<div id="loading-slow-reload" style="display: none;"><button type="button" class="vboot-btn" data-boot-reload>${t(e.reloadLabel??`Reload page`)}</button></div></div></div>`}function
|
|
110
|
-
const storageKey = ${
|
|
113
|
+
<div id="loading-slow-reload" style="display: none;"><button type="button" class="vboot-btn" data-boot-reload>${t(e.reloadLabel??`Reload page`)}</button></div></div></div>`}function f(e={}){let{storageKey:t,html:n}=u(e),r=d(e);return`(() => {
|
|
114
|
+
const storageKey = ${l(t)};
|
|
111
115
|
|
|
112
|
-
const customHtml = ${n===void 0?`undefined`:
|
|
116
|
+
const customHtml = ${n===void 0?`undefined`:l(n)};
|
|
113
117
|
let slowNoticeTimer;
|
|
114
118
|
let slowReloadTimer;
|
|
115
119
|
const previewTheme = (() => {
|
|
@@ -165,7 +169,7 @@ ${e.boot?.styles??``}`}}const o=`
|
|
|
165
169
|
const loading = document.createElement('div');
|
|
166
170
|
loading.id = 'loading-indicator';
|
|
167
171
|
loading.className = bootThemeClass();
|
|
168
|
-
loading.innerHTML = customHtml ?? ${
|
|
172
|
+
loading.innerHTML = customHtml ?? ${l(r)};
|
|
169
173
|
loading.querySelectorAll('[data-boot-title]').forEach((heading) => {
|
|
170
174
|
if (document.title) heading.textContent = document.title;
|
|
171
175
|
});
|
|
@@ -232,6 +236,6 @@ ${e.boot?.styles??``}`}}const o=`
|
|
|
232
236
|
restoreDocumentBackground,
|
|
233
237
|
};
|
|
234
238
|
paintDocumentBackground();
|
|
235
|
-
})();`}function
|
|
236
|
-
`||e===`\r`||e===`\f`}function
|
|
239
|
+
})();`}function p(e={}){return`<style id="vertesia-boot-styles">${c}\n${e.styles??``}</style>\n<script>${f(e)}<\/script>`}function m(){return`<script>window.__vertesiaBoot.ensureLoadingIndicator(); window.__vertesiaBoot.hideLoadingIndicatorOnFirstRender(); window.__vertesiaBoot.scheduleSlowLoadingNotice();<\/script>`}function h(e){return e===` `||e===` `||e===`
|
|
240
|
+
`||e===`\r`||e===`\f`}function g(e,t){let n=e.toLowerCase(),r=0;for(;r<n.length;){let e=n.indexOf(t,r);if(e===-1)return!1;let i=n[e-1],a=e+t.length;for(;h(n[a]);)a+=1;if(h(i)&&n[a]===`=`)return!0;r=e+t.length}return!1}function _(e,t,n){let r=e.toLowerCase(),i=`<${t}`,a=0;for(;a<r.length;){let e=r.indexOf(i,a);if(e===-1)return;let t=r[e+i.length];if(t===`>`||h(t)){let t=r.indexOf(`>`,e+i.length);if(t===-1)return;if(!n||g(r.slice(e,t+1),n))return t+1;a=t+1}else a=e+i.length}}function v(e,t,n){return`${e.slice(0,t)}${n}${e.slice(t)}`}function y(e,t={}){let n=u(t),r=p(n),i=_(e,`meta`,`charset`)??_(e,`head`),a=i===void 0?e:v(e,i,`\n${r}`);if(!n.autoStart)return a;let o=a.toLowerCase().indexOf(`</body>`);return o===-1?a:v(a,o,`${m()}\n`)}function b(e={}){return{name:`vertesia-boot-screen`,transformIndexHtml:t=>y(t,e)}}export{c as BOOT_SCREEN_STYLES,a as brandedBootOptions,b as createBootScreenVitePlugin,e as defineAppBranding,t as escapeBrandHtml,y as injectBootScreenHtml,p as renderBootScreenHead,m as renderBootScreenInitializer,f as renderBootScreenRuntime,i as renderBrandStyles,d as renderDefaultBootContent,o as vertesiaBranding};
|
|
237
241
|
//# sourceMappingURL=vertesia-ui-boot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertesia-ui-boot.js","names":[],"sources":["boot/branding.js","boot/index.js"],"sourcesContent":["export function defineAppBranding(branding) {\n return branding;\n}\nexport function escapeBrandHtml(value) {\n return value.replace(/[&<>\"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[char] ?? char);\n}\nfunction cssString(value) {\n return JSON.stringify(value).replace(/</g, '\\\\3c ');\n}\nfunction colorDeclarations(colors) {\n const variables = {\n background: ['--background', '--color-background', '--vb-bg'],\n foreground: ['--foreground', '--color-foreground', '--vb-fg'],\n accent: ['--info', '--info-foreground', '--color-info', '--color-info-foreground'],\n button: ['--primary', '--color-primary', '--vb-primary', '--auth-button'],\n buttonText: ['--primary-foreground', '--color-primary-foreground', '--vb-primary-fg', '--auth-button-text'],\n };\n return Object.entries(colors ?? {})\n .map(([key, value]) => {\n if (!Object.hasOwn(variables, key) || /[;{}<>]/.test(value))\n throw new Error(`Invalid branding color: ${key}`);\n return variables[key].map((name) => `${name}:${value};`).join('');\n })\n .join('');\n}\n/** Theme tokens only: branding must never replace the shared page layout. */\nexport function renderBrandStyles(brand, selector = '.vbrand') {\n const animation = brand.loadingIcon?.animation;\n const keyframes = brand.loadingIcon?.keyframes ?? '';\n if (animation !== undefined && /[;{}<>]/.test(animation))\n throw new Error('Invalid loading icon animation');\n if (/[<>]/.test(keyframes))\n throw new Error('Invalid loading icon keyframes');\n const motion = animation === undefined\n ? ''\n : `--vertesia-loading-animation:${animation};--vertesia-loading-pulse-animation:none;`;\n const font = brand.font;\n const faces = font\n ? `@font-face { font-family:${cssString(font.family)};src:url(${cssString(font.regular)});font-weight:400;font-display:swap; }\n${font.bold ? `@font-face { font-family:${cssString(font.family)};src:url(${cssString(font.bold)});font-weight:700;font-display:swap; }` : ''}`\n : '';\n return `${faces}\n${keyframes}\n${selector} { ${motion}${colorDeclarations(brand.colors?.light)}${font ? `font-family:${cssString(font.family)};` : ''} }\n.dark ${selector},${selector}.vboot-dark { ${colorDeclarations(brand.colors?.dark)} }\n`;\n}\nexport function brandedBootOptions(brand) {\n return {\n iconSrc: brand.loadingIcon?.light,\n darkIconSrc: brand.loadingIcon?.dark,\n loadingLabel: brand.copy?.loading,\n slowLoadingLabel: brand.copy?.slowLoading,\n reloadLabel: brand.copy?.reload,\n html: brand.boot?.html,\n styles: `${renderBrandStyles(brand, '#loading-indicator')}\n${brand.colors?.light?.background ? `:root{--vertesia-boot-background:${brand.colors.light.background}}` : ''}\n${brand.colors?.dark?.background ? `:root.dark{--vertesia-boot-background:${brand.colors.dark.background}}` : ''}\n${brand.boot?.styles ?? ''}`,\n };\n}\n//# sourceMappingURL=branding.js.map","const DEFAULT_STORAGE_KEY = 'vite-ui-theme';\nconst DEFAULT_ICON_SRC = '/icon.svg';\nconst DEFAULT_LOADING_LABEL = 'Loading';\nexport const BOOT_SCREEN_STYLES = `\n .vboot {\n --vb-bg: #ffffff;\n --vb-fg: #0a0a0a;\n --vb-muted: #636363;\n --vb-muted-bg: #f5f5f5;\n --vb-border: #e5e5e5;\n --vb-primary: #0048bd;\n --vb-primary-fg: #ffffff;\n --vb-glow: rgba(50, 49, 189, 0.12);\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;\n color: var(--vb-fg);\n }\n .vboot.vboot-dark {\n --vb-bg: #0a0a0a;\n --vb-fg: #fafafa;\n --vb-muted: #a1a1a1;\n --vb-muted-bg: #262626;\n --vb-border: rgba(255, 255, 255, 0.1);\n --vb-primary: #2b69d1;\n --vb-primary-fg: #fafafa;\n --vb-glow: rgba(79, 70, 229, 0.2);\n }\n @keyframes vboot-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n .vboot-overlay {\n position: absolute !important;\n inset: 0 !important;\n box-sizing: border-box !important;\n width: 100% !important;\n height: 100% !important;\n margin: 0 !important;\n padding: 0 !important;\n display: flex !important;\n flex-direction: column !important;\n align-items: center !important;\n justify-content: center !important;\n gap: 1.5rem !important;\n transform: none !important;\n background: var(--vb-bg) !important;\n }\n #loading-indicator {\n position: fixed !important;\n inset: 0 !important;\n z-index: 2147483647 !important;\n box-sizing: border-box !important;\n width: 100vw !important;\n height: 100vh !important;\n margin: 0 !important;\n padding: 0 !important;\n transform: none !important;\n }\n .vboot-spinner {\n width: 2.5rem !important;\n min-width: 2.5rem !important;\n max-width: 2.5rem !important;\n height: 2.5rem !important;\n min-height: 2.5rem !important;\n max-height: 2.5rem !important;\n margin: 0 !important;\n padding: 0 !important;\n object-fit: contain !important;\n flex: none !important;\n border-radius: 100% !important;\n animation: var(--vertesia-loading-animation, vboot-spin 2s linear infinite) !important;\n }\n .vboot-icon-dark { display: none; }\n .vboot-dark .vboot-icon-light { display: none; }\n .vboot-dark .vboot-icon-dark { display: block; }\n .vboot-slow {\n text-align: center;\n }\n .vboot-slow p {\n color: var(--vb-muted);\n font-size: 0.875rem;\n margin: 0 0 0.75rem;\n }\n .vboot-btn {\n display: inline-block;\n padding: 0.5rem 1rem;\n background: var(--vb-primary);\n color: var(--vb-primary-fg);\n border: none;\n border-radius: 0.375rem;\n font: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n }\n .vboot-btn:hover {\n opacity: 0.9;\n }\n @media (prefers-reduced-motion: reduce) {\n .vboot-spinner { animation: none !important; }\n }\n`;\nfunction inlineJson(value) {\n return JSON.stringify(value).replaceAll('<', '\\\\u003c');\n}\nfunction normalizedOptions(options) {\n return {\n storageKey: options.storageKey ?? DEFAULT_STORAGE_KEY,\n iconSrc: options.iconSrc ?? DEFAULT_ICON_SRC,\n loadingLabel: options.loadingLabel ?? DEFAULT_LOADING_LABEL,\n autoStart: options.autoStart ?? true,\n html: options.html,\n styles: options.styles,\n };\n}\n/** Default markup shared by Studio and configurable applications. */\nexport function renderDefaultBootContent(options = {}) {\n const escapeMarkup = (value) => value.replace(/[&<>\"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[char] ?? char);\n const { iconSrc, loadingLabel } = normalizedOptions(options);\n const icon = (src, className = '') => `<img class=\"vboot-spinner ${className}\" width=\"40\" height=\"40\" src=\"${escapeMarkup(src)}\" alt=\"${escapeMarkup(loadingLabel)}\" />`;\n return `<div class=\"vboot-overlay\" role=\"status\" aria-live=\"polite\">${options.darkIconSrc ? icon(iconSrc, 'vboot-icon-light') + icon(options.darkIconSrc, 'vboot-icon-dark') : icon(iconSrc)}\n<div id=\"loading-slow-notice\" class=\"vboot-slow\" style=\"display: none;\">\n<p>${escapeMarkup(options.slowLoadingLabel ?? 'Still loading — this is taking longer than usual.')}</p>\n<div id=\"loading-slow-reload\" style=\"display: none;\"><button type=\"button\" class=\"vboot-btn\" data-boot-reload>${escapeMarkup(options.reloadLabel ?? 'Reload page')}</button></div></div></div>`;\n}\nexport function renderBootScreenRuntime(options = {}) {\n const { storageKey, html } = normalizedOptions(options);\n const defaultHtml = renderDefaultBootContent(options);\n return `(() => {\n const storageKey = ${inlineJson(storageKey)};\n\n const customHtml = ${html === undefined ? 'undefined' : inlineJson(html)};\n let slowNoticeTimer;\n let slowReloadTimer;\n const previewTheme = (() => {\n try {\n const value = new URL(window.location.href).searchParams.get('__vertesia_boot_theme');\n return value === 'dark' || value === 'light' ? value : null;\n } catch (_error) {\n return null;\n }\n })();\n const prefersDarkTheme = () => {\n if (previewTheme) return previewTheme === 'dark';\n try {\n const stored = window.localStorage.getItem(storageKey);\n if (stored === 'dark') return true;\n if (stored === 'light') return false;\n } catch (_error) {\n // Storage can be unavailable in private or restricted browsing contexts.\n }\n try {\n return typeof window.matchMedia === 'function' && window.matchMedia('(prefers-color-scheme: dark)').matches;\n } catch (_error) {\n return false;\n }\n };\n const applyTheme = () => {\n const dark = prefersDarkTheme();\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n root.classList.add(dark ? 'dark' : 'light');\n return dark;\n };\n const paintDocumentBackground = () => {\n const dark = applyTheme();\n const root = document.documentElement;\n const background = window.getComputedStyle(root).getPropertyValue('--vertesia-boot-background').trim()\n || (dark ? '#0a0a0a' : '#ffffff');\n root.style.backgroundColor = background;\n root.style.colorScheme = dark ? 'dark' : 'light';\n if (document.body) document.body.style.backgroundColor = background;\n };\n const restoreDocumentBackground = () => {\n applyTheme();\n const root = document.documentElement;\n root.style.removeProperty('background-color');\n root.style.removeProperty('color-scheme');\n if (document.body) document.body.style.removeProperty('background-color');\n };\n const bootThemeClass = () => prefersDarkTheme() ? 'vboot vboot-dark' : 'vboot';\n const ensureLoadingIndicator = () => {\n if (document.getElementById('loading-indicator') || !document.body) return;\n paintDocumentBackground();\n const loading = document.createElement('div');\n loading.id = 'loading-indicator';\n loading.className = bootThemeClass();\n loading.innerHTML = customHtml ?? ${inlineJson(defaultHtml)};\n loading.querySelectorAll('[data-boot-title]').forEach((heading) => {\n if (document.title) heading.textContent = document.title;\n });\n loading.querySelectorAll('[data-boot-reload]').forEach((button) => {\n button.addEventListener('click', () => window.location.reload());\n });\n // Custom landmarks and controls must stay in body to enter the accessibility tree.\n const loadingParent = customHtml === undefined && typeof document.documentElement.appendChild === 'function'\n ? document.documentElement\n : document.body;\n loadingParent.appendChild(loading);\n };\n const hideLoadingIndicator = () => {\n clearTimeout(slowNoticeTimer);\n clearTimeout(slowReloadTimer);\n const loading = document.getElementById('loading-indicator');\n if (loading) loading.style.display = 'none';\n };\n const hasAppRendered = (rootId = 'root') => {\n const root = document.getElementById(rootId);\n return Boolean(root && root.innerHTML && root.innerHTML.trim() !== '');\n };\n const hideLoadingIndicatorOnFirstRender = (rootId = 'root') => {\n if (typeof MutationObserver !== 'function') return;\n const root = document.getElementById(rootId);\n if (!root) return;\n if (hasAppRendered(rootId)) {\n hideLoadingIndicator();\n restoreDocumentBackground();\n return;\n }\n const observer = new MutationObserver(() => {\n if (!hasAppRendered(rootId)) return;\n hideLoadingIndicator();\n restoreDocumentBackground();\n observer.disconnect();\n });\n observer.observe(root, { childList: true });\n };\n // Used by standalone apps. Hosts with their own error handler keep autoStart disabled.\n const scheduleSlowLoadingNotice = () => {\n clearTimeout(slowNoticeTimer);\n clearTimeout(slowReloadTimer);\n if (hasAppRendered()) return;\n slowNoticeTimer = setTimeout(() => {\n const notice = document.getElementById('loading-slow-notice');\n if (notice) notice.style.display = '';\n }, 10000);\n slowReloadTimer = setTimeout(() => {\n const reload = document.getElementById('loading-slow-reload');\n if (reload) reload.style.display = '';\n }, 30000);\n };\n window.__vertesiaBoot = {\n scheduleSlowLoadingNotice,\n applyTheme,\n bootThemeClass,\n ensureLoadingIndicator,\n hasAppRendered,\n hideLoadingIndicator,\n hideLoadingIndicatorOnFirstRender,\n paintDocumentBackground,\n prefersDarkTheme,\n restoreDocumentBackground,\n };\n paintDocumentBackground();\n})();`;\n}\nexport function renderBootScreenHead(options = {}) {\n return `<style id=\"vertesia-boot-styles\">${BOOT_SCREEN_STYLES}\\n${options.styles ?? ''}</style>\\n<script>${renderBootScreenRuntime(options)}</script>`;\n}\nexport function renderBootScreenInitializer() {\n return `<script>window.__vertesiaBoot.ensureLoadingIndicator(); window.__vertesiaBoot.hideLoadingIndicatorOnFirstRender(); window.__vertesiaBoot.scheduleSlowLoadingNotice();</script>`;\n}\nfunction isHtmlWhitespace(character) {\n return character === ' ' || character === '\\t' || character === '\\n' || character === '\\r' || character === '\\f';\n}\nfunction hasAttribute(openingTag, attributeName) {\n const lowerTag = openingTag.toLowerCase();\n let searchFrom = 0;\n while (searchFrom < lowerTag.length) {\n const attributeIndex = lowerTag.indexOf(attributeName, searchFrom);\n if (attributeIndex === -1)\n return false;\n const before = lowerTag[attributeIndex - 1];\n let afterIndex = attributeIndex + attributeName.length;\n while (isHtmlWhitespace(lowerTag[afterIndex]))\n afterIndex += 1;\n if (isHtmlWhitespace(before) && lowerTag[afterIndex] === '=')\n return true;\n searchFrom = attributeIndex + attributeName.length;\n }\n return false;\n}\nfunction findOpeningTagEnd(html, tagName, attributeName) {\n const lowerHtml = html.toLowerCase();\n const tagStart = `<${tagName}`;\n let searchFrom = 0;\n while (searchFrom < lowerHtml.length) {\n const start = lowerHtml.indexOf(tagStart, searchFrom);\n if (start === -1)\n return undefined;\n const boundary = lowerHtml[start + tagStart.length];\n if (boundary === '>' || isHtmlWhitespace(boundary)) {\n const end = lowerHtml.indexOf('>', start + tagStart.length);\n if (end === -1)\n return undefined;\n if (!attributeName || hasAttribute(lowerHtml.slice(start, end + 1), attributeName))\n return end + 1;\n searchFrom = end + 1;\n }\n else {\n searchFrom = start + tagStart.length;\n }\n }\n return undefined;\n}\nfunction insertAt(html, index, content) {\n return `${html.slice(0, index)}${content}${html.slice(index)}`;\n}\nexport function injectBootScreenHtml(html, options = {}) {\n const normalized = normalizedOptions(options);\n const head = renderBootScreenHead(normalized);\n const insertionPoint = findOpeningTagEnd(html, 'meta', 'charset') ?? findOpeningTagEnd(html, 'head');\n const withHead = insertionPoint === undefined ? html : insertAt(html, insertionPoint, `\\n${head}`);\n if (!normalized.autoStart)\n return withHead;\n const bodyEnd = withHead.toLowerCase().indexOf('</body>');\n return bodyEnd === -1 ? withHead : insertAt(withHead, bodyEnd, `${renderBootScreenInitializer()}\\n`);\n}\nexport function createBootScreenVitePlugin(options = {}) {\n return {\n name: 'vertesia-boot-screen',\n transformIndexHtml: (html) => injectBootScreenHtml(html, options),\n };\n}\nexport * from './branding.js';\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vertesia-ui-boot.js","names":[],"sources":["boot/branding.js","boot/loading.js","boot/index.js"],"sourcesContent":["export function defineAppBranding(branding) {\n return branding;\n}\nexport function escapeBrandHtml(value) {\n return value.replace(/[&<>\"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[char] ?? char);\n}\nfunction cssString(value) {\n return JSON.stringify(value).replace(/</g, '\\\\3c ');\n}\nfunction colorDeclarations(colors) {\n const variables = {\n background: ['--background', '--color-background', '--vb-bg'],\n foreground: ['--foreground', '--color-foreground', '--vb-fg'],\n accent: ['--info', '--info-foreground', '--color-info', '--color-info-foreground'],\n button: ['--primary', '--color-primary', '--vb-primary', '--auth-button'],\n buttonText: ['--primary-foreground', '--color-primary-foreground', '--vb-primary-fg', '--auth-button-text'],\n };\n return Object.entries(colors ?? {})\n .map(([key, value]) => {\n if (!Object.hasOwn(variables, key) || /[;{}<>]/.test(value))\n throw new Error(`Invalid branding color: ${key}`);\n return variables[key].map((name) => `${name}:${value};`).join('');\n })\n .join('');\n}\n/** Theme tokens only: branding must never replace the shared page layout. */\nexport function renderBrandStyles(brand, selector = '.vbrand') {\n const animation = brand.loadingIcon?.animation;\n const keyframes = brand.loadingIcon?.keyframes ?? '';\n if (animation !== undefined && /[;{}<>]/.test(animation))\n throw new Error('Invalid loading icon animation');\n if (/[<>]/.test(keyframes))\n throw new Error('Invalid loading icon keyframes');\n const motion = animation === undefined\n ? ''\n : `--vertesia-loading-animation:${animation};--vertesia-loading-pulse-animation:none;`;\n const font = brand.font;\n const faces = font\n ? `@font-face { font-family:${cssString(font.family)};src:url(${cssString(font.regular)});font-weight:400;font-display:swap; }\n${font.bold ? `@font-face { font-family:${cssString(font.family)};src:url(${cssString(font.bold)});font-weight:700;font-display:swap; }` : ''}`\n : '';\n return `${faces}\n${keyframes}\n${selector} { ${motion}${colorDeclarations(brand.colors?.light)}${font ? `font-family:${cssString(font.family)};` : ''} }\n.dark ${selector},${selector}.vboot-dark { ${colorDeclarations(brand.colors?.dark)} }\n`;\n}\nexport function brandedBootOptions(brand) {\n return {\n iconSrc: brand.loadingIcon?.light,\n darkIconSrc: brand.loadingIcon?.dark,\n loadingLabel: brand.copy?.loading,\n slowLoadingLabel: brand.copy?.slowLoading,\n reloadLabel: brand.copy?.reload,\n html: brand.boot?.html,\n styles: `${renderBrandStyles(brand, '#loading-indicator')}\n${brand.colors?.light?.background ? `:root{--vertesia-boot-background:${brand.colors.light.background}}` : ''}\n${brand.colors?.dark?.background ? `:root.dark{--vertesia-boot-background:${brand.colors.dark.background}}` : ''}\n${brand.boot?.styles ?? ''}`,\n };\n}\n/** Platform defaults shared by boot markup and Firebase/OAuth React screens. */\nexport const vertesiaBranding = {\n name: 'Vertesia',\n logo: { light: '/logo-light.png', dark: '/logo-dark.png', alt: 'Vertesia' },\n loadingIcon: { light: '/icon.svg' },\n favicon: '/icon.svg',\n};\n//# sourceMappingURL=branding.js.map","/** Shared by server-rendered boot markup and React auth loaders. No React dependency. */\nexport const LOADING_ICON_SIZE = 40;\nexport const LOADING_INDICATOR_STYLES = `\n@keyframes vertesia-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n.vertesia-loading-motion {\n animation: var(--vertesia-loading-animation, vertesia-loading-spin 2s linear infinite);\n}\n.vertesia-loading-icon {\n width: ${LOADING_ICON_SIZE}px !important;\n min-width: ${LOADING_ICON_SIZE}px !important;\n max-width: ${LOADING_ICON_SIZE}px !important;\n height: ${LOADING_ICON_SIZE}px !important;\n min-height: ${LOADING_ICON_SIZE}px !important;\n max-height: ${LOADING_ICON_SIZE}px !important;\n margin: 0;\n padding: 0;\n object-fit: contain;\n flex: none;\n border-radius: 100% !important;\n}\n@media (prefers-reduced-motion: reduce) {\n .vertesia-loading-motion { animation: none !important; }\n}\n`;\n//# sourceMappingURL=loading.js.map","import { vertesiaBranding } from './branding.js';\nimport { LOADING_ICON_SIZE, LOADING_INDICATOR_STYLES } from './loading.js';\nconst DEFAULT_STORAGE_KEY = 'vite-ui-theme';\nconst DEFAULT_ICON_SRC = vertesiaBranding.loadingIcon.light;\nconst DEFAULT_LOADING_LABEL = 'Loading';\nexport const BOOT_SCREEN_STYLES = `\n${LOADING_INDICATOR_STYLES}\n .vboot {\n --vb-bg: #ffffff;\n --vb-fg: #0a0a0a;\n --vb-muted: #636363;\n --vb-muted-bg: #f5f5f5;\n --vb-border: #e5e5e5;\n --vb-primary: #0048bd;\n --vb-primary-fg: #ffffff;\n --vb-glow: rgba(50, 49, 189, 0.12);\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;\n color: var(--vb-fg);\n }\n .vboot.vboot-dark {\n --vb-bg: #0a0a0a;\n --vb-fg: #fafafa;\n --vb-muted: #a1a1a1;\n --vb-muted-bg: #262626;\n --vb-border: rgba(255, 255, 255, 0.1);\n --vb-primary: #2b69d1;\n --vb-primary-fg: #fafafa;\n --vb-glow: rgba(79, 70, 229, 0.2);\n }\n .vboot-overlay {\n position: absolute !important;\n inset: 0 !important;\n box-sizing: border-box !important;\n width: 100% !important;\n height: 100% !important;\n margin: 0 !important;\n padding: 0 !important;\n display: flex !important;\n flex-direction: column !important;\n align-items: center !important;\n justify-content: center !important;\n gap: 1.5rem !important;\n transform: none !important;\n background: var(--vb-bg) !important;\n }\n #loading-indicator {\n position: fixed !important;\n inset: 0 !important;\n z-index: 2147483647 !important;\n box-sizing: border-box !important;\n width: 100vw !important;\n height: 100vh !important;\n margin: 0 !important;\n padding: 0 !important;\n transform: none !important;\n }\n .vboot-icon-dark { display: none; }\n .vboot-dark .vboot-icon-light { display: none; }\n .vboot-dark .vboot-icon-dark { display: block; }\n .vboot-slow {\n text-align: center;\n }\n .vboot-slow p {\n color: var(--vb-muted);\n font-size: 0.875rem;\n margin: 0 0 0.75rem;\n }\n .vboot-btn {\n display: inline-block;\n padding: 0.5rem 1rem;\n background: var(--vb-primary);\n color: var(--vb-primary-fg);\n border: none;\n border-radius: 0.375rem;\n font: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n }\n .vboot-btn:hover {\n opacity: 0.9;\n }\n`;\nfunction inlineJson(value) {\n return JSON.stringify(value).replaceAll('<', '\\\\u003c');\n}\nfunction normalizedOptions(options) {\n return {\n storageKey: options.storageKey ?? DEFAULT_STORAGE_KEY,\n iconSrc: options.iconSrc ?? DEFAULT_ICON_SRC,\n loadingLabel: options.loadingLabel ?? DEFAULT_LOADING_LABEL,\n autoStart: options.autoStart ?? true,\n html: options.html,\n styles: options.styles,\n };\n}\n/** Default markup shared by Studio and configurable applications. */\nexport function renderDefaultBootContent(options = {}) {\n const escapeMarkup = (value) => value.replace(/[&<>\"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[char] ?? char);\n const { iconSrc, loadingLabel } = normalizedOptions(options);\n const icon = (src, className = '') => `<img class=\"vboot-spinner vertesia-loading-icon vertesia-loading-motion ${className}\" width=\"${LOADING_ICON_SIZE}\" height=\"${LOADING_ICON_SIZE}\" src=\"${escapeMarkup(src)}\" alt=\"${escapeMarkup(loadingLabel)}\" />`;\n return `<div class=\"vboot-overlay\" role=\"status\" aria-live=\"polite\">${options.darkIconSrc ? icon(iconSrc, 'vboot-icon-light') + icon(options.darkIconSrc, 'vboot-icon-dark') : icon(iconSrc)}\n<div id=\"loading-slow-notice\" class=\"vboot-slow\" style=\"display: none;\">\n<p>${escapeMarkup(options.slowLoadingLabel ?? 'Still loading — this is taking longer than usual.')}</p>\n<div id=\"loading-slow-reload\" style=\"display: none;\"><button type=\"button\" class=\"vboot-btn\" data-boot-reload>${escapeMarkup(options.reloadLabel ?? 'Reload page')}</button></div></div></div>`;\n}\nexport function renderBootScreenRuntime(options = {}) {\n const { storageKey, html } = normalizedOptions(options);\n const defaultHtml = renderDefaultBootContent(options);\n return `(() => {\n const storageKey = ${inlineJson(storageKey)};\n\n const customHtml = ${html === undefined ? 'undefined' : inlineJson(html)};\n let slowNoticeTimer;\n let slowReloadTimer;\n const previewTheme = (() => {\n try {\n const value = new URL(window.location.href).searchParams.get('__vertesia_boot_theme');\n return value === 'dark' || value === 'light' ? value : null;\n } catch (_error) {\n return null;\n }\n })();\n const prefersDarkTheme = () => {\n if (previewTheme) return previewTheme === 'dark';\n try {\n const stored = window.localStorage.getItem(storageKey);\n if (stored === 'dark') return true;\n if (stored === 'light') return false;\n } catch (_error) {\n // Storage can be unavailable in private or restricted browsing contexts.\n }\n try {\n return typeof window.matchMedia === 'function' && window.matchMedia('(prefers-color-scheme: dark)').matches;\n } catch (_error) {\n return false;\n }\n };\n const applyTheme = () => {\n const dark = prefersDarkTheme();\n const root = document.documentElement;\n root.classList.remove('light', 'dark');\n root.classList.add(dark ? 'dark' : 'light');\n return dark;\n };\n const paintDocumentBackground = () => {\n const dark = applyTheme();\n const root = document.documentElement;\n const background = window.getComputedStyle(root).getPropertyValue('--vertesia-boot-background').trim()\n || (dark ? '#0a0a0a' : '#ffffff');\n root.style.backgroundColor = background;\n root.style.colorScheme = dark ? 'dark' : 'light';\n if (document.body) document.body.style.backgroundColor = background;\n };\n const restoreDocumentBackground = () => {\n applyTheme();\n const root = document.documentElement;\n root.style.removeProperty('background-color');\n root.style.removeProperty('color-scheme');\n if (document.body) document.body.style.removeProperty('background-color');\n };\n const bootThemeClass = () => prefersDarkTheme() ? 'vboot vboot-dark' : 'vboot';\n const ensureLoadingIndicator = () => {\n if (document.getElementById('loading-indicator') || !document.body) return;\n paintDocumentBackground();\n const loading = document.createElement('div');\n loading.id = 'loading-indicator';\n loading.className = bootThemeClass();\n loading.innerHTML = customHtml ?? ${inlineJson(defaultHtml)};\n loading.querySelectorAll('[data-boot-title]').forEach((heading) => {\n if (document.title) heading.textContent = document.title;\n });\n loading.querySelectorAll('[data-boot-reload]').forEach((button) => {\n button.addEventListener('click', () => window.location.reload());\n });\n // Custom landmarks and controls must stay in body to enter the accessibility tree.\n const loadingParent = customHtml === undefined && typeof document.documentElement.appendChild === 'function'\n ? document.documentElement\n : document.body;\n loadingParent.appendChild(loading);\n };\n const hideLoadingIndicator = () => {\n clearTimeout(slowNoticeTimer);\n clearTimeout(slowReloadTimer);\n const loading = document.getElementById('loading-indicator');\n if (loading) loading.style.display = 'none';\n };\n const hasAppRendered = (rootId = 'root') => {\n const root = document.getElementById(rootId);\n return Boolean(root && root.innerHTML && root.innerHTML.trim() !== '');\n };\n const hideLoadingIndicatorOnFirstRender = (rootId = 'root') => {\n if (typeof MutationObserver !== 'function') return;\n const root = document.getElementById(rootId);\n if (!root) return;\n if (hasAppRendered(rootId)) {\n hideLoadingIndicator();\n restoreDocumentBackground();\n return;\n }\n const observer = new MutationObserver(() => {\n if (!hasAppRendered(rootId)) return;\n hideLoadingIndicator();\n restoreDocumentBackground();\n observer.disconnect();\n });\n observer.observe(root, { childList: true });\n };\n // Used by standalone apps. Hosts with their own error handler keep autoStart disabled.\n const scheduleSlowLoadingNotice = () => {\n clearTimeout(slowNoticeTimer);\n clearTimeout(slowReloadTimer);\n if (hasAppRendered()) return;\n slowNoticeTimer = setTimeout(() => {\n const notice = document.getElementById('loading-slow-notice');\n if (notice) notice.style.display = '';\n }, 10000);\n slowReloadTimer = setTimeout(() => {\n const reload = document.getElementById('loading-slow-reload');\n if (reload) reload.style.display = '';\n }, 30000);\n };\n window.__vertesiaBoot = {\n scheduleSlowLoadingNotice,\n applyTheme,\n bootThemeClass,\n ensureLoadingIndicator,\n hasAppRendered,\n hideLoadingIndicator,\n hideLoadingIndicatorOnFirstRender,\n paintDocumentBackground,\n prefersDarkTheme,\n restoreDocumentBackground,\n };\n paintDocumentBackground();\n})();`;\n}\nexport function renderBootScreenHead(options = {}) {\n return `<style id=\"vertesia-boot-styles\">${BOOT_SCREEN_STYLES}\\n${options.styles ?? ''}</style>\\n<script>${renderBootScreenRuntime(options)}</script>`;\n}\nexport function renderBootScreenInitializer() {\n return `<script>window.__vertesiaBoot.ensureLoadingIndicator(); window.__vertesiaBoot.hideLoadingIndicatorOnFirstRender(); window.__vertesiaBoot.scheduleSlowLoadingNotice();</script>`;\n}\nfunction isHtmlWhitespace(character) {\n return character === ' ' || character === '\\t' || character === '\\n' || character === '\\r' || character === '\\f';\n}\nfunction hasAttribute(openingTag, attributeName) {\n const lowerTag = openingTag.toLowerCase();\n let searchFrom = 0;\n while (searchFrom < lowerTag.length) {\n const attributeIndex = lowerTag.indexOf(attributeName, searchFrom);\n if (attributeIndex === -1)\n return false;\n const before = lowerTag[attributeIndex - 1];\n let afterIndex = attributeIndex + attributeName.length;\n while (isHtmlWhitespace(lowerTag[afterIndex]))\n afterIndex += 1;\n if (isHtmlWhitespace(before) && lowerTag[afterIndex] === '=')\n return true;\n searchFrom = attributeIndex + attributeName.length;\n }\n return false;\n}\nfunction findOpeningTagEnd(html, tagName, attributeName) {\n const lowerHtml = html.toLowerCase();\n const tagStart = `<${tagName}`;\n let searchFrom = 0;\n while (searchFrom < lowerHtml.length) {\n const start = lowerHtml.indexOf(tagStart, searchFrom);\n if (start === -1)\n return undefined;\n const boundary = lowerHtml[start + tagStart.length];\n if (boundary === '>' || isHtmlWhitespace(boundary)) {\n const end = lowerHtml.indexOf('>', start + tagStart.length);\n if (end === -1)\n return undefined;\n if (!attributeName || hasAttribute(lowerHtml.slice(start, end + 1), attributeName))\n return end + 1;\n searchFrom = end + 1;\n }\n else {\n searchFrom = start + tagStart.length;\n }\n }\n return undefined;\n}\nfunction insertAt(html, index, content) {\n return `${html.slice(0, index)}${content}${html.slice(index)}`;\n}\nexport function injectBootScreenHtml(html, options = {}) {\n const normalized = normalizedOptions(options);\n const head = renderBootScreenHead(normalized);\n const insertionPoint = findOpeningTagEnd(html, 'meta', 'charset') ?? findOpeningTagEnd(html, 'head');\n const withHead = insertionPoint === undefined ? html : insertAt(html, insertionPoint, `\\n${head}`);\n if (!normalized.autoStart)\n return withHead;\n const bodyEnd = withHead.toLowerCase().indexOf('</body>');\n return bodyEnd === -1 ? withHead : insertAt(withHead, bodyEnd, `${renderBootScreenInitializer()}\\n`);\n}\nexport function createBootScreenVitePlugin(options = {}) {\n return {\n name: 'vertesia-boot-screen',\n transformIndexHtml: (html) => injectBootScreenHtml(html, options),\n };\n}\nexport * from './branding.js';\n//# sourceMappingURL=index.js.map"],"mappings":"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"}
|