@treasuryspatial/viewer-ui-kit 0.1.42 → 0.1.56

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 (89) hide show
  1. package/dist/AdminLayout.js +1 -1
  2. package/dist/AdminShell.d.ts +6 -1
  3. package/dist/AdminShell.d.ts.map +1 -1
  4. package/dist/AdminShell.js +45 -3
  5. package/dist/ChooserActionCard.d.ts +10 -0
  6. package/dist/ChooserActionCard.d.ts.map +1 -0
  7. package/dist/ChooserActionCard.js +39 -0
  8. package/dist/ComposerRightRail.d.ts +3 -1
  9. package/dist/ComposerRightRail.d.ts.map +1 -1
  10. package/dist/ComposerRightRail.js +11 -43
  11. package/dist/ConfiguratorShell.js +1 -1
  12. package/dist/LandingShell.d.ts +2 -1
  13. package/dist/LandingShell.d.ts.map +1 -1
  14. package/dist/LandingShell.js +133 -33
  15. package/dist/LoginShell.d.ts +2 -1
  16. package/dist/LoginShell.d.ts.map +1 -1
  17. package/dist/LoginShell.js +26 -3
  18. package/dist/ManifestTopBar.d.ts +7 -1
  19. package/dist/ManifestTopBar.d.ts.map +1 -1
  20. package/dist/ManifestTopBar.js +249 -38
  21. package/dist/MetricsPanel.d.ts +1 -1
  22. package/dist/MetricsPanel.d.ts.map +1 -1
  23. package/dist/MetricsPanel.js +19 -29
  24. package/dist/MetricsPanelContent.d.ts +38 -17
  25. package/dist/MetricsPanelContent.d.ts.map +1 -1
  26. package/dist/MetricsPanelContent.js +84 -90
  27. package/dist/ModeBar.d.ts +6 -2
  28. package/dist/ModeBar.d.ts.map +1 -1
  29. package/dist/ModeBar.js +49 -82
  30. package/dist/ModuleSelectorPanel.d.ts +2 -1
  31. package/dist/ModuleSelectorPanel.d.ts.map +1 -1
  32. package/dist/ModuleSelectorPanel.js +47 -49
  33. package/dist/PanelSkin.d.ts.map +1 -1
  34. package/dist/PanelSkin.js +1598 -312
  35. package/dist/PanelSystem.d.ts +45 -0
  36. package/dist/PanelSystem.d.ts.map +1 -0
  37. package/dist/PanelSystem.js +450 -0
  38. package/dist/PanelTabs.d.ts.map +1 -1
  39. package/dist/PanelTabs.js +8 -34
  40. package/dist/PanelToggleDock.d.ts +10 -0
  41. package/dist/PanelToggleDock.d.ts.map +1 -0
  42. package/dist/PanelToggleDock.js +40 -0
  43. package/dist/PromptPackChooserPanel.d.ts +12 -11
  44. package/dist/PromptPackChooserPanel.d.ts.map +1 -1
  45. package/dist/PromptPackChooserPanel.js +103 -63
  46. package/dist/SceneInspectorPanel.d.ts +42 -0
  47. package/dist/SceneInspectorPanel.d.ts.map +1 -0
  48. package/dist/SceneInspectorPanel.js +135 -0
  49. package/dist/ScienceDataPanelContent.d.ts +16 -0
  50. package/dist/ScienceDataPanelContent.d.ts.map +1 -0
  51. package/dist/ScienceDataPanelContent.js +31 -0
  52. package/dist/ScienceMetricsPanelContent.d.ts +53 -0
  53. package/dist/ScienceMetricsPanelContent.d.ts.map +1 -0
  54. package/dist/ScienceMetricsPanelContent.js +415 -0
  55. package/dist/SpatialHud.d.ts +18 -0
  56. package/dist/SpatialHud.d.ts.map +1 -0
  57. package/dist/SpatialHud.js +120 -0
  58. package/dist/StreetviewModeSurface.d.ts +40 -0
  59. package/dist/StreetviewModeSurface.d.ts.map +1 -0
  60. package/dist/StreetviewModeSurface.js +358 -0
  61. package/dist/SurfaceSwitcher.d.ts +11 -0
  62. package/dist/SurfaceSwitcher.d.ts.map +1 -0
  63. package/dist/SurfaceSwitcher.js +46 -0
  64. package/dist/TopBar.d.ts +2 -0
  65. package/dist/TopBar.d.ts.map +1 -1
  66. package/dist/TopBar.js +3 -1
  67. package/dist/UnknownModeSurface.d.ts +6 -0
  68. package/dist/UnknownModeSurface.d.ts.map +1 -0
  69. package/dist/UnknownModeSurface.js +41 -0
  70. package/dist/index.d.ts +19 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +12 -0
  73. package/dist/landingTokens.d.ts +7 -0
  74. package/dist/landingTokens.d.ts.map +1 -0
  75. package/dist/landingTokens.js +6 -0
  76. package/dist/layout.d.ts +27 -27
  77. package/dist/layout.d.ts.map +1 -1
  78. package/dist/layout.js +33 -27
  79. package/dist/mapMetrics.d.ts +88 -0
  80. package/dist/mapMetrics.d.ts.map +1 -0
  81. package/dist/mapMetrics.js +1 -0
  82. package/dist/panelPrimitives.d.ts +11 -0
  83. package/dist/panelPrimitives.d.ts.map +1 -0
  84. package/dist/panelPrimitives.js +41 -0
  85. package/dist/topbarLogoPolicy.d.ts +14 -0
  86. package/dist/topbarLogoPolicy.d.ts.map +1 -0
  87. package/dist/topbarLogoPolicy.js +41 -0
  88. package/dist/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +18 -5
@@ -14,7 +14,7 @@ export const AdminSection = styled.section `
14
14
  `;
15
15
  export const AdminSectionTitle = styled.div `
16
16
  font-size: 11px;
17
- text-transform: uppercase;
17
+ text-transform: var(--viewer-ui-eyebrow-text-case, lowercase);
18
18
  letter-spacing: 0.2em;
19
19
  color: var(--viewer-ui-color-text-subtle, rgba(148, 163, 184, 0.8));
20
20
  margin-bottom: 16px;
@@ -5,10 +5,15 @@ export type AdminTab = {
5
5
  href: string;
6
6
  };
7
7
  type AdminShellProps = {
8
+ title?: string;
9
+ tabs?: AdminTab[];
10
+ activeTab?: string;
11
+ onSelectTab?: (id: string) => void;
8
12
  nav?: ReactNode;
13
+ actions?: ReactNode;
9
14
  modeBar?: ReactNode;
10
15
  children: ReactNode;
11
16
  };
12
- export default function AdminShell({ nav, modeBar, children }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
17
+ export default function AdminShell({ title, tabs, activeTab, onSelectTab, nav, actions, modeBar, children, }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
13
18
  export {};
14
19
  //# sourceMappingURL=AdminShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../src/AdminShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,KAAK,eAAe,GAAG;IACrB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAQ7E"}
1
+ {"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../src/AdminShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,MAAM,MAAM,QAAQ,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AA+CF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,KAAwB,EACxB,IAAS,EACT,SAAS,EACT,WAAW,EACX,GAAG,EACH,OAAO,EACP,OAAO,EACP,QAAQ,GACT,EAAE,eAAe,2CAsBjB"}
@@ -1,5 +1,47 @@
1
1
  "use client";
2
- import { Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- export default function AdminShell({ nav, modeBar, children }) {
4
- return (_jsxs(_Fragment, { children: [nav, modeBar, children] }));
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import styled from "styled-components";
4
+ import ModeBar, { MODE_BAR_HEIGHT_PX } from "./ModeBar.js";
5
+ import { TOP_BAR_COMPACT_HEIGHT_PX } from "./TopBar.js";
6
+ const MAX_WIDTH_PX = 1600;
7
+ const Root = styled.div `
8
+ min-height: 100vh;
9
+ background: var(--viewer-ui-color-background, var(--brand-background));
10
+ color: var(--viewer-ui-color-text, var(--brand-text-primary));
11
+ `;
12
+ const TopBar = styled.div `
13
+ position: fixed;
14
+ inset: 0 0 auto;
15
+ height: ${TOP_BAR_COMPACT_HEIGHT_PX}px;
16
+ z-index: 70;
17
+ border-bottom: 1px solid var(--viewer-ui-color-panel-border, var(--brand-panel-border));
18
+ background: var(--viewer-ui-color-bg-base, var(--brand-panel));
19
+ `;
20
+ const TopBarInner = styled.div `
21
+ width: min(100%, ${MAX_WIDTH_PX}px);
22
+ height: 100%;
23
+ margin: 0 auto;
24
+ padding: 0 24px;
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: space-between;
28
+ `;
29
+ const TopBarTitle = styled.div `
30
+ font-size: 10px;
31
+ letter-spacing: 0.18em;
32
+ text-transform: var(--viewer-ui-eyebrow-text-case, lowercase);
33
+ color: var(--viewer-ui-color-text-subtle, var(--brand-text-secondary));
34
+ `;
35
+ const TopBarActions = styled.div `
36
+ display: flex;
37
+ align-items: center;
38
+ gap: 14px;
39
+ flex-wrap: wrap;
40
+ `;
41
+ const Body = styled.div `
42
+ min-height: 100vh;
43
+ padding-top: ${TOP_BAR_COMPACT_HEIGHT_PX + MODE_BAR_HEIGHT_PX}px;
44
+ `;
45
+ export default function AdminShell({ title = "composer admin", tabs = [], activeTab, onSelectTab, nav, actions, modeBar, children, }) {
46
+ return (_jsxs(Root, { children: [nav ?? (_jsx(TopBar, { children: _jsxs(TopBarInner, { children: [_jsx(TopBarTitle, { children: title }), actions ? _jsx(TopBarActions, { children: actions }) : null] }) })), modeBar ?? (_jsx(ModeBar, { active: activeTab || '', tabs: tabs, topOffsetPx: TOP_BAR_COMPACT_HEIGHT_PX, onSelect: onSelectTab })), _jsx(Body, { children: children })] }));
5
47
  }
@@ -0,0 +1,10 @@
1
+ type ChooserActionCardProps = {
2
+ title: string;
3
+ description: string;
4
+ href?: string;
5
+ onClick?: () => void;
6
+ actionLabel?: string;
7
+ };
8
+ export default function ChooserActionCard({ title, description, href, onClick, actionLabel, }: ChooserActionCardProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=ChooserActionCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChooserActionCard.d.ts","sourceRoot":"","sources":["../src/ChooserActionCard.tsx"],"names":[],"mappings":"AAYA,KAAK,sBAAsB,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAqCF,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,EACP,WAAoB,GACrB,EAAE,sBAAsB,2CAaxB"}
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Link from 'next/link';
4
+ import styled from 'styled-components';
5
+ import { panelSystemActionCardCss, panelSystemBodyTextCss, panelSystemLabelCss, panelSystemSubheadingCss, } from './PanelSystem.js';
6
+ const Card = styled.a `
7
+ ${panelSystemActionCardCss}
8
+ min-height: 0;
9
+ align-items: stretch;
10
+ flex-direction: column;
11
+ padding: 16px 18px;
12
+ display: flex;
13
+ text-decoration: none;
14
+ color: inherit;
15
+ transition: border-color 0.16s ease, background 0.16s ease;
16
+ cursor: pointer;
17
+ text-align: left;
18
+
19
+ &:hover {
20
+ border-color: var(--viewer-ui-shell-pill-active-border, var(--viewer-ui-color-button-primary));
21
+ background: color-mix(in srgb, var(--viewer-ui-color-surface) 84%, var(--viewer-ui-color-control-hover) 16%);
22
+ }
23
+ `;
24
+ const Title = styled.div `
25
+ ${panelSystemSubheadingCss}
26
+ font-weight: 400;
27
+ color: var(--viewer-ui-color-text-strong);
28
+ `;
29
+ const Description = styled.div `
30
+ ${panelSystemBodyTextCss}
31
+ color: var(--viewer-ui-color-text-muted);
32
+ `;
33
+ const ActionLabel = styled.div `
34
+ ${panelSystemLabelCss}
35
+ color: var(--viewer-ui-color-text-strong);
36
+ `;
37
+ export default function ChooserActionCard({ title, description, href, onClick, actionLabel = 'open', }) {
38
+ return (_jsxs(Card, { as: href ? Link : 'button', href: href, type: href ? undefined : 'button', onClick: href ? undefined : onClick, children: [_jsx(Title, { children: title }), _jsx(Description, { children: description }), _jsx(ActionLabel, { children: actionLabel })] }));
39
+ }
@@ -7,6 +7,8 @@ export type ComposerRightRailTab = {
7
7
  type ComposerRightRailProps = {
8
8
  isVisible: boolean;
9
9
  onToggle: () => void;
10
+ shellCollapsed?: boolean;
11
+ onRestoreShell?: () => void;
10
12
  activeTab: string;
11
13
  onTabChange: (id: string) => void;
12
14
  tabs: ComposerRightRailTab[];
@@ -15,6 +17,6 @@ type ComposerRightRailProps = {
15
17
  showEdgeToggle?: boolean;
16
18
  topOffsetPx?: number;
17
19
  };
18
- export default function ComposerRightRail({ isVisible, onToggle, activeTab, onTabChange, tabs, title, statusLabel, showEdgeToggle, topOffsetPx, }: ComposerRightRailProps): import("react/jsx-runtime").JSX.Element;
20
+ export default function ComposerRightRail({ isVisible, onToggle, shellCollapsed, onRestoreShell, activeTab, onTabChange, tabs, title, statusLabel, showEdgeToggle, topOffsetPx, }: ComposerRightRailProps): import("react/jsx-runtime").JSX.Element;
19
21
  export {};
20
22
  //# sourceMappingURL=ComposerRightRail.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerRightRail.d.ts","sourceRoot":"","sources":["../src/ComposerRightRail.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAwDF,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,IAAI,EACJ,KAAsB,EACtB,WAAoB,EACpB,cAAsB,EACtB,WAAe,GAChB,EAAE,sBAAsB,2CAiExB"}
1
+ {"version":3,"file":"ComposerRightRail.d.ts","sourceRoot":"","sources":["../src/ComposerRightRail.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAavC,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAkBF,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,SAAS,EACT,QAAQ,EACR,cAAsB,EACtB,cAAc,EACd,SAAS,EACT,WAAW,EACX,IAAI,EACJ,KAAsB,EACtB,WAAoB,EACpB,cAAsB,EACtB,WAAe,GAChB,EAAE,sBAAsB,2CAwExB"}
@@ -1,58 +1,26 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import styled from 'styled-components';
4
- import { RightPanel, RightPanelCollapseToggle, RightPanelShowToggle, } from './layout.js';
5
- const RailHeader = styled.div `
6
- border-bottom: 1px solid var(--brand-panel-border);
7
- padding: 16px 18px 14px;
8
- background: var(--brand-panel);
9
- `;
4
+ import { panelEyebrowCss, panelPillButtonCss, panelPillRowCss } from './panelPrimitives.js';
5
+ import { PanelBody, PanelHeader, PanelHeaderContent, RightPanel, RightPanelCollapseToggle, RightPanelShowToggle, } from './layout.js';
10
6
  const RailEyebrow = styled.div `
11
7
  display: flex;
12
8
  align-items: center;
13
9
  gap: 6px;
14
- font-size: 10px;
15
- text-transform: uppercase;
16
- letter-spacing: 0.14em;
17
- color: var(--brand-text-secondary);
10
+ ${panelEyebrowCss}
18
11
  `;
19
12
  const RailTabs = styled.div `
20
- display: flex;
21
- gap: 8px;
22
- margin-top: 12px;
23
- overflow-x: auto;
24
- padding-bottom: 2px;
25
-
26
- &::-webkit-scrollbar {
27
- display: none;
28
- }
13
+ ${panelPillRowCss}
14
+ margin-top: 8px;
29
15
  `;
30
16
  const RailTab = styled.button `
31
- border-radius: 999px;
32
- min-height: 42px;
33
- padding: 0 20px;
34
- border: 1px solid ${(props) => (props.$active ? 'var(--brand-text-primary)' : 'var(--brand-panel-border)')};
35
- background: ${(props) => (props.$active ? 'var(--brand-text-primary)' : 'var(--brand-background)')};
36
- color: ${(props) => (props.$active ? 'var(--brand-background)' : 'var(--brand-text-secondary)')};
37
- font-size: 13px;
38
- font-weight: 600;
39
- letter-spacing: 0.01em;
40
- text-transform: lowercase;
41
- white-space: nowrap;
42
- transition: background-color 0.16s ease, color 0.16s ease, border-color 0.16s ease;
43
-
44
- &:hover {
45
- color: ${(props) => (props.$active ? 'var(--brand-background)' : 'var(--brand-text-primary)')};
46
- }
47
- `;
48
- const RailBody = styled.div `
49
- flex: 1;
50
- min-height: 0;
51
- overflow-y: auto;
52
- padding: 18px;
17
+ ${panelPillButtonCss}
53
18
  `;
54
- export default function ComposerRightRail({ isVisible, onToggle, activeTab, onTabChange, tabs, title = 'image system', statusLabel = 'live', showEdgeToggle = false, topOffsetPx = 0, }) {
19
+ export default function ComposerRightRail({ isVisible, onToggle, shellCollapsed = false, onRestoreShell, activeTab, onTabChange, tabs, title = 'image system', statusLabel = 'live', showEdgeToggle = false, topOffsetPx = 0, }) {
55
20
  const active = tabs.find((tab) => tab.id === activeTab) ?? tabs[0] ?? null;
56
21
  const hasStatus = Boolean(statusLabel && statusLabel.trim().length > 0);
57
- return (_jsxs(_Fragment, { children: [isVisible ? (_jsxs(RightPanel, { "$open": isVisible, "$topOffset": topOffsetPx, children: [showEdgeToggle ? (_jsx(RightPanelCollapseToggle, { type: "button", onClick: onToggle, "aria-label": "Hide right panel", title: "Hide right panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", clipRule: "evenodd" }) }) })) : null, _jsxs(RailHeader, { children: [_jsxs(RailEyebrow, { children: [_jsx("span", { children: title }), hasStatus ? _jsx("span", { "aria-hidden": "true", children: "/" }) : null, hasStatus ? _jsx("span", { children: statusLabel }) : null] }), _jsx(RailTabs, { children: tabs.map((tab) => (_jsx(RailTab, { type: "button", onClick: () => onTabChange(tab.id), "$active": active?.id === tab.id, children: tab.label }, tab.id))) })] }), _jsx(RailBody, { children: active?.content ?? null })] })) : null, !isVisible && showEdgeToggle ? (_jsx(RightPanelShowToggle, { type: "button", onClick: onToggle, "aria-label": "Show right panel", title: "Show right panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M12.707 14.707a1 1 0 010-1.414L9.414 10l3.293-3.293a1 1 0 00-1.414-1.414l-4 4a1 1 0 000 1.414l4 4a1 1 0 001.414 0z", clipRule: "evenodd" }) }) })) : null] }));
22
+ const handleShow = shellCollapsed && onRestoreShell ? onRestoreShell : onToggle;
23
+ const showTitle = shellCollapsed ? 'Restore shell' : 'Show right panel';
24
+ const showLabel = shellCollapsed ? 'Restore shell' : 'Show right panel';
25
+ return (_jsxs(_Fragment, { children: [isVisible ? (_jsxs(RightPanel, { "$open": isVisible, "$topOffset": topOffsetPx, children: [showEdgeToggle ? (_jsx(RightPanelCollapseToggle, { type: "button", onClick: onToggle, "aria-label": "Hide right panel", title: "Hide right panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", clipRule: "evenodd" }) }) })) : null, _jsx(PanelHeader, { children: _jsxs(PanelHeaderContent, { children: [_jsxs(RailEyebrow, { children: [_jsx("span", { children: title }), hasStatus ? _jsx("span", { "aria-hidden": "true", children: "/" }) : null, hasStatus ? _jsx("span", { children: statusLabel }) : null] }), _jsx(RailTabs, { children: tabs.map((tab) => (_jsx(RailTab, { type: "button", onClick: () => onTabChange(tab.id), "$active": active?.id === tab.id, children: tab.label }, tab.id))) })] }) }), _jsx(PanelBody, { className: "viewer-ui-shell-right-body viewer-ui-panel-renderer viewer-ui-panel-renderer--sectioned", children: active?.content ?? null })] })) : null, !isVisible && showEdgeToggle ? (_jsx(RightPanelShowToggle, { type: "button", onClick: handleShow, "aria-label": showLabel, title: showTitle, children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M12.707 14.707a1 1 0 010-1.414L9.414 10l3.293-3.293a1 1 0 00-1.414-1.414l-4 4a1 1 0 000 1.414l4 4a1 1 0 001.414 0z", clipRule: "evenodd" }) }) })) : null] }));
58
26
  }
@@ -6,5 +6,5 @@ export default function ConfiguratorShell({ navOffsetPx = 0, className, leftOpen
6
6
  ['--ui-left-offset']: leftOpen ? 'var(--ui-panel-width)' : '0px',
7
7
  ['--ui-right-offset']: rightOpen ? 'var(--ui-metrics-width)' : '0px',
8
8
  };
9
- return (_jsxs(ShellLayout, { className: className, "$topOffset": navOffsetPx, style: shellStyle, children: [_jsxs(ControlPanel, { "$open": leftOpen, children: [showLeftToggle && (_jsx(PanelCollapseToggle, { type: "button", onClick: () => onLeftToggle(false), "aria-label": "Hide control panel", title: "Hide control panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M12.707 14.707a1 1 0 010-1.414L9.414 10l3.293-3.293a1 1 0 00-1.414-1.414l-4 4a1 1 0 000 1.414l4 4a1 1 0 001.414 0z", clipRule: "evenodd" }) }) })), _jsx(PanelHeader, { children: leftHeader }), _jsx(PanelBody, { children: leftBody }), leftFooter ? _jsx(PanelFooter, { children: leftFooter }) : null] }), showLeftToggle && !leftOpen && (_jsx(PanelShowToggle, { type: "button", onClick: () => onLeftToggle(true), "aria-label": "Show control panel", title: "Show control panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", clipRule: "evenodd" }) }) })), viewer, rightOpen && onRightToggle ? (_jsxs(RightPanel, { "$open": rightOpen, children: [_jsx(RightPanelCollapseToggle, { type: "button", onClick: () => onRightToggle(false), "aria-label": "Hide right panel", title: "Hide right panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", clipRule: "evenodd" }) }) }), rightHeader, _jsx("div", { className: "viewer-ui-shell-right-body", children: rightBody })] })) : null, showRightToggle && onRightToggle && !rightOpen && (_jsx(RightPanelShowToggle, { type: "button", onClick: () => onRightToggle(true), "aria-label": "Show right panel", title: "Show right panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M12.707 14.707a1 1 0 010-1.414L9.414 10l3.293-3.293a1 1 0 00-1.414-1.414l-4 4a1 1 0 000 1.414l4 4a1 1 0 001.414 0z", clipRule: "evenodd" }) }) }))] }));
9
+ return (_jsxs(ShellLayout, { className: className, "$topOffset": navOffsetPx, style: shellStyle, children: [_jsxs(ControlPanel, { "$open": leftOpen, children: [showLeftToggle && (_jsx(PanelCollapseToggle, { type: "button", onClick: () => onLeftToggle(false), "aria-label": "Hide control panel", title: "Hide control panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M12.707 14.707a1 1 0 010-1.414L9.414 10l3.293-3.293a1 1 0 00-1.414-1.414l-4 4a1 1 0 000 1.414l4 4a1 1 0 001.414 0z", clipRule: "evenodd" }) }) })), _jsx(PanelHeader, { children: leftHeader }), _jsx(PanelBody, { children: leftBody }), leftFooter ? _jsx(PanelFooter, { children: leftFooter }) : null] }), showLeftToggle && !leftOpen && (_jsx(PanelShowToggle, { type: "button", onClick: () => onLeftToggle(true), "aria-label": "Show control panel", title: "Show control panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", clipRule: "evenodd" }) }) })), viewer, rightOpen && onRightToggle ? (_jsxs(RightPanel, { "$open": rightOpen, children: [_jsx(RightPanelCollapseToggle, { type: "button", onClick: () => onRightToggle(false), "aria-label": "Hide right panel", title: "Hide right panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", clipRule: "evenodd" }) }) }), rightHeader, _jsx(PanelBody, { className: "viewer-ui-shell-right-body", children: rightBody })] })) : null, showRightToggle && onRightToggle && !rightOpen && (_jsx(RightPanelShowToggle, { type: "button", onClick: () => onRightToggle(true), "aria-label": "Show right panel", title: "Show right panel", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M12.707 14.707a1 1 0 010-1.414L9.414 10l3.293-3.293a1 1 0 00-1.414-1.414l-4 4a1 1 0 000 1.414l4 4a1 1 0 001.414 0z", clipRule: "evenodd" }) }) }))] }));
10
10
  }
@@ -3,9 +3,10 @@ import type { SurfaceLandingContent } from '@treasuryspatial/surface-kit';
3
3
  export type LandingShellProps = {
4
4
  manifest: UiManifest;
5
5
  content: SurfaceLandingContent;
6
+ subtitle?: string | null;
6
7
  showPoweredBy?: boolean;
7
8
  showLogout?: boolean;
8
9
  className?: string;
9
10
  };
10
- export default function LandingShell({ manifest, content, showPoweredBy, showLogout, className, }: LandingShellProps): import("react/jsx-runtime").JSX.Element;
11
+ export default function LandingShell({ manifest, content, subtitle, showPoweredBy, showLogout, className, }: LandingShellProps): import("react/jsx-runtime").JSX.Element;
11
12
  //# sourceMappingURL=LandingShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LandingShell.d.ts","sourceRoot":"","sources":["../src/LandingShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAoI1E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,OAAO,EACP,aAAqB,EACrB,UAAkB,EAClB,SAAS,GACV,EAAE,iBAAiB,2CAuBnB"}
1
+ {"version":3,"file":"LandingShell.d.ts","sourceRoot":"","sources":["../src/LandingShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AA4P1E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,aAAqB,EACrB,UAAkB,EAClB,SAAS,GACV,EAAE,iBAAiB,2CAyDnB"}
@@ -1,7 +1,8 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import styled from 'styled-components';
4
4
  import ManifestTopBar from './ManifestTopBar.js';
5
+ import { LANDING_BODY_FONT_SIZE, LANDING_BODY_MAX_WIDTH, LANDING_SECTION_STRAP_SIZE, LANDING_SECTION_TITLE_SIZE, } from './landingTokens.js';
5
6
  const Root = styled.main `
6
7
  min-height: 100vh;
7
8
  background: var(--brand-background);
@@ -24,30 +25,57 @@ const Row = styled.div `
24
25
  flex-direction: column;
25
26
 
26
27
  @media (min-width: 1024px) {
27
- flex-direction: row;
28
+ display: grid;
29
+ grid-template-columns: minmax(0, 60%) minmax(0, 40%);
30
+ gap: 0;
28
31
  position: relative;
32
+ min-height: calc(100vh - var(--ui-nav-height) - 225px);
33
+ align-items: stretch;
29
34
  }
30
35
  `;
31
36
  const LeftColumn = styled.div `
32
37
  flex: 0 0 auto;
33
38
 
34
39
  @media (min-width: 1024px) {
35
- width: 50%;
40
+ width: 100%;
36
41
  position: relative;
37
42
  z-index: 1;
43
+ overflow: visible;
38
44
  }
39
45
  `;
40
46
  const RightColumn = styled.div `
41
47
  flex: 1 1 auto;
42
48
 
43
49
  @media (min-width: 1024px) {
44
- width: 50%;
50
+ display: flex;
51
+ flex-direction: column;
52
+ width: 100%;
53
+ }
54
+ `;
55
+ const RightColumnContent = styled.div `
56
+ box-sizing: border-box;
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: 46px;
60
+ padding: 32px 24px 0;
61
+
62
+ @media (min-width: 768px) {
63
+ padding-left: 48px;
64
+ padding-right: 48px;
65
+ }
66
+
67
+ @media (min-width: 1024px) {
68
+ width: 100%;
69
+ max-width: calc(${LANDING_BODY_MAX_WIDTH} + 84px);
70
+ margin-top: clamp(48px, 7vh, 82px);
71
+ align-self: flex-end;
72
+ padding: 0 84px 0 0;
45
73
  }
46
74
  `;
47
75
  const Header = styled.div `
48
- max-width: min(65vw, 720px);
76
+ max-width: min(92vw, 980px);
49
77
  padding: 108px 24px 0 24px;
50
- font-family: var(--ui-font-family, system-ui);
78
+ font-family: var(--viewer-ui-font-display, var(--ui-font-family, system-ui));
51
79
  font-weight: 400;
52
80
 
53
81
  @media (min-width: 768px) {
@@ -56,13 +84,17 @@ const Header = styled.div `
56
84
 
57
85
  @media (min-width: 1024px) {
58
86
  padding: 0 0 0 84px;
87
+ width: calc(100vw - 168px);
88
+ max-width: calc(100vw - 168px);
59
89
  }
60
90
  `;
61
91
  const HeaderTitle = styled.div `
62
- color: var(--brand-primary);
92
+ color: var(--brand-text-primary);
63
93
  font-size: 32px;
64
- line-height: 1.02;
94
+ line-height: 1;
65
95
  letter-spacing: -0.03em;
96
+ max-width: 18ch;
97
+ text-wrap: pretty;
66
98
 
67
99
  @media (min-width: 768px) {
68
100
  font-size: 36px;
@@ -70,56 +102,124 @@ const HeaderTitle = styled.div `
70
102
 
71
103
  @media (min-width: 1024px) {
72
104
  font-size: 42px;
105
+ max-width: 24ch;
73
106
  }
74
107
 
75
108
  @media (min-width: 1440px) {
76
- font-size: 61px;
109
+ font-size: ${LANDING_SECTION_TITLE_SIZE};
77
110
  }
78
111
  `;
112
+ const HeaderTitleAccent = styled.span `
113
+ color: var(--brand-primary);
114
+ `;
79
115
  const HeaderStrap = styled.div `
80
- margin-top: 20px;
81
- color: var(--brand-text-secondary);
82
- font-size: 25px;
83
- line-height: 1.1;
84
- letter-spacing: -0.02em;
116
+ margin-top: 28px;
117
+ color: var(--brand-text-primary);
118
+ font-family: var(--viewer-ui-font-body, var(--ui-font-family, system-ui));
119
+ font-size: 16px;
120
+ line-height: 1.5;
121
+ letter-spacing: -0.01em;
122
+ font-weight: 400;
123
+ max-width: 36ch;
124
+ text-wrap: pretty;
125
+
126
+ @media (min-width: 768px) {
127
+ font-size: 16px;
128
+ }
85
129
 
86
130
  @media (min-width: 1024px) {
87
- font-size: 35px;
131
+ font-size: 18px;
88
132
  }
89
133
 
90
134
  @media (min-width: 1440px) {
91
- font-size: 40px;
135
+ font-size: ${LANDING_SECTION_STRAP_SIZE};
92
136
  }
93
137
  `;
94
138
  const Body = styled.div `
95
- padding: 32px 24px 0;
96
139
  color: var(--brand-text-primary);
97
- font-family: var(--ui-font-family, system-ui);
98
- font-size: 16px;
99
- line-height: 1.45;
140
+ font-family: var(--viewer-ui-font-body, var(--ui-font-family, system-ui));
141
+ font-size: ${LANDING_BODY_FONT_SIZE};
142
+ line-height: 1.5;
143
+ letter-spacing: -0.01em;
144
+ font-weight: 400;
145
+ max-width: ${LANDING_BODY_MAX_WIDTH};
146
+ text-wrap: pretty;
100
147
 
101
148
  p {
102
- margin: 0 0 32px;
149
+ margin: 0;
103
150
  }
104
151
 
105
- p:last-child {
106
- margin-bottom: 0;
152
+ p + p {
153
+ margin-top: 30px;
107
154
  }
108
155
 
109
- @media (min-width: 768px) {
110
- padding-left: 48px;
111
- padding-right: 48px;
112
- }
113
-
114
- @media (min-width: 1024px) {
115
- padding: 260px 84px 0 0;
116
- max-width: 960px;
156
+ @media (min-width: 1440px) {
157
+ font-size: 20px;
117
158
  }
159
+ `;
160
+ const LandingSections = styled.div `
161
+ display: flex;
162
+ flex-direction: column;
163
+ gap: 32px;
164
+ color: var(--brand-text-primary);
165
+ font-family: var(--viewer-ui-font-body, var(--ui-font-family, system-ui));
166
+ font-size: ${LANDING_BODY_FONT_SIZE};
167
+ line-height: 1.5;
168
+ letter-spacing: -0.01em;
169
+ font-weight: 400;
170
+ max-width: ${LANDING_BODY_MAX_WIDTH};
171
+ text-wrap: pretty;
118
172
 
119
173
  @media (min-width: 1440px) {
120
174
  font-size: 20px;
121
175
  }
122
176
  `;
123
- export default function LandingShell({ manifest, content, showPoweredBy = false, showLogout = false, className, }) {
124
- return (_jsxs(Root, { className: className, children: [_jsx(ManifestTopBar, { manifest: manifest, variant: "landing", showPoweredBy: showPoweredBy, showLogout: showLogout }), _jsx(Section, { children: _jsxs(Row, { children: [_jsx(LeftColumn, { children: _jsxs(Header, { children: [_jsx(HeaderTitle, { children: content.header }), _jsx(HeaderStrap, { children: content.strap })] }) }), _jsx(RightColumn, { children: _jsx(Body, { children: content.bodyParagraphs.map((paragraph, index) => (_jsx("p", { children: paragraph }, `${index}-${paragraph.slice(0, 16)}`))) }) })] }) })] }));
177
+ const LandingSection = styled.section `
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: 14px;
181
+ `;
182
+ const LandingSectionTitle = styled.h3 `
183
+ margin: 0;
184
+ color: var(--brand-primary);
185
+ font-family: var(--viewer-ui-font-body, var(--ui-font-family, system-ui));
186
+ font-size: 1em;
187
+ line-height: 1.5;
188
+ letter-spacing: 0;
189
+ font-weight: 700;
190
+ `;
191
+ const LandingSectionParagraph = styled.p `
192
+ margin: 0;
193
+ `;
194
+ const LandingSectionBullets = styled.ul `
195
+ margin: 0;
196
+ padding-left: 1.2em;
197
+ display: flex;
198
+ flex-direction: column;
199
+ gap: 10px;
200
+ `;
201
+ const LandingSectionBullet = styled.li `
202
+ margin: 0;
203
+ `;
204
+ function renderHeaderTitle(header, accentLabel) {
205
+ const title = header.trim();
206
+ const accent = accentLabel?.trim();
207
+ if (!title || !accent)
208
+ return title;
209
+ const titleLower = title.toLowerCase();
210
+ const accentLower = accent.toLowerCase();
211
+ if (titleLower === accentLower || !titleLower.endsWith(accentLower)) {
212
+ return title;
213
+ }
214
+ const accentStart = title.length - accent.length;
215
+ const prefix = title.slice(0, accentStart).trimEnd();
216
+ if (!prefix)
217
+ return title;
218
+ const separator = title.slice(prefix.length, accentStart) || ' ';
219
+ return (_jsxs(_Fragment, { children: [prefix, separator, _jsx(HeaderTitleAccent, { children: title.slice(accentStart) })] }));
220
+ }
221
+ export default function LandingShell({ manifest, content, subtitle, showPoweredBy = false, showLogout = false, className, }) {
222
+ const headerAccentLabel = manifest.topbar.productLabel || null;
223
+ const displaySubtitle = subtitle || content.strap;
224
+ return (_jsxs(Root, { className: className, children: [_jsx(ManifestTopBar, { manifest: manifest, variant: "landing", topbarContext: "landing", showPoweredBy: showPoweredBy, showLogout: showLogout }), _jsx(Section, { children: _jsxs(Row, { children: [_jsx(LeftColumn, { children: _jsxs(Header, { children: [_jsx(HeaderTitle, { children: renderHeaderTitle(content.header, headerAccentLabel) }), _jsx(HeaderStrap, { children: displaySubtitle })] }) }), _jsx(RightColumn, { children: _jsxs(RightColumnContent, { children: [_jsx(Body, { children: content.bodyParagraphs.map((paragraph, index) => (_jsx("p", { children: paragraph }, `${index}-${paragraph.slice(0, 16)}`))) }), content.sections?.length ? (_jsx(LandingSections, { children: content.sections.map((section, index) => (_jsxs(LandingSection, { children: [section.title ? _jsx(LandingSectionTitle, { children: section.title }) : null, section.paragraphs?.map((paragraph, paragraphIndex) => (_jsx(LandingSectionParagraph, { children: paragraph }, `${index}-${paragraphIndex}-${paragraph.slice(0, 16)}`))), section.bullets?.length ? (_jsx(LandingSectionBullets, { children: section.bullets.map((bullet, bulletIndex) => (_jsx(LandingSectionBullet, { children: bullet }, `${index}-${bulletIndex}-${bullet.slice(0, 16)}`))) })) : null] }, `${index}-${section.title ?? 'section'}`))) })) : null] }) })] }) })] }));
125
225
  }
@@ -4,10 +4,11 @@ import type { SurfaceLoginContent } from '@treasuryspatial/surface-kit';
4
4
  export type LoginShellProps = {
5
5
  manifest: UiManifest;
6
6
  content?: SurfaceLoginContent | null;
7
+ subtitle?: string | null;
7
8
  children: ReactNode;
8
9
  showLogout?: boolean;
9
10
  showPoweredBy?: boolean;
10
11
  className?: string;
11
12
  };
12
- export default function LoginShell({ manifest, content, children, showLogout, showPoweredBy, className, }: LoginShellProps): import("react/jsx-runtime").JSX.Element;
13
+ export default function LoginShell({ manifest, content, subtitle, children, showLogout, showPoweredBy, className, }: LoginShellProps): import("react/jsx-runtime").JSX.Element;
13
14
  //# sourceMappingURL=LoginShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginShell.d.ts","sourceRoot":"","sources":["../src/LoginShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAkExE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,UAAkB,EAClB,aAAqB,EACrB,SAAS,GACV,EAAE,eAAe,2CAwBjB"}
1
+ {"version":3,"file":"LoginShell.d.ts","sourceRoot":"","sources":["../src/LoginShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAgGxE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,UAAkB,EAClB,aAAqB,EACrB,SAAS,GACV,EAAE,eAAe,2CA4BjB"}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import styled from 'styled-components';
4
4
  import ManifestTopBar from './ManifestTopBar.js';
5
5
  const Root = styled.main `
@@ -34,6 +34,9 @@ const Title = styled.h1 `
34
34
  font-weight: 400;
35
35
  color: var(--brand-text-primary);
36
36
  `;
37
+ const TitleAccent = styled.span `
38
+ color: var(--brand-primary);
39
+ `;
37
40
  const Strap = styled.p `
38
41
  margin: 16px 0 0;
39
42
  max-width: 672px;
@@ -41,6 +44,23 @@ const Strap = styled.p `
41
44
  line-height: 1.6;
42
45
  color: var(--brand-text-secondary);
43
46
  `;
47
+ function renderTitle(title, accentLabel) {
48
+ const normalizedTitle = title.trim();
49
+ const accent = accentLabel?.trim();
50
+ if (!normalizedTitle || !accent)
51
+ return normalizedTitle;
52
+ const titleLower = normalizedTitle.toLowerCase();
53
+ const accentLower = accent.toLowerCase();
54
+ if (titleLower === accentLower || !titleLower.endsWith(accentLower)) {
55
+ return normalizedTitle;
56
+ }
57
+ const accentStart = normalizedTitle.length - accent.length;
58
+ const prefix = normalizedTitle.slice(0, accentStart).trimEnd();
59
+ if (!prefix)
60
+ return normalizedTitle;
61
+ const separator = normalizedTitle.slice(prefix.length, accentStart) || ' ';
62
+ return (_jsxs(_Fragment, { children: [prefix, separator, _jsx(TitleAccent, { children: normalizedTitle.slice(accentStart) })] }));
63
+ }
44
64
  const Body = styled.p `
45
65
  margin: 20px 0 0;
46
66
  max-width: 720px;
@@ -55,7 +75,10 @@ const Disclaimer = styled.p `
55
75
  line-height: 1.7;
56
76
  color: var(--brand-text-secondary);
57
77
  `;
58
- export default function LoginShell({ manifest, content, children, showLogout = false, showPoweredBy = false, className, }) {
78
+ export default function LoginShell({ manifest, content, subtitle, children, showLogout = false, showPoweredBy = false, className, }) {
59
79
  const fallbackHeading = `${manifest.topbar.title} ${manifest.surface?.label || manifest.topbar.productLabel}`.trim();
60
- return (_jsxs(Root, { className: className, children: [_jsx(ManifestTopBar, { manifest: manifest, variant: "landing", showPoweredBy: showPoweredBy, showLogout: showLogout }), _jsx(Shell, { children: _jsxs(Inner, { children: [_jsxs(Header, { children: [_jsx(Title, { children: content?.heading || fallbackHeading }), content?.strap ? _jsx(Strap, { children: content.strap }) : null, content?.body ? _jsx(Body, { children: content.body }) : null] }), children, content?.disclaimer ? _jsx(Disclaimer, { children: content.disclaimer }) : null] }) })] }));
80
+ const heading = content?.heading || fallbackHeading;
81
+ const displaySubtitle = subtitle || content?.strap;
82
+ const accentLabel = manifest.topbar.productLabel || null;
83
+ return (_jsxs(Root, { className: className, children: [_jsx(ManifestTopBar, { manifest: manifest, variant: "landing", topbarContext: "login", showPoweredBy: showPoweredBy, showLogout: showLogout }), _jsx(Shell, { children: _jsxs(Inner, { children: [_jsxs(Header, { children: [_jsx(Title, { children: renderTitle(heading, accentLabel) }), displaySubtitle ? _jsx(Strap, { children: displaySubtitle }) : null, content?.body ? _jsx(Body, { children: content.body }) : null] }), children, content?.disclaimer ? _jsx(Disclaimer, { children: content.disclaimer }) : null] }) })] }));
61
84
  }
@@ -1,13 +1,19 @@
1
+ import { type ReactNode } from 'react';
1
2
  import type { UiManifest } from '@treasuryspatial/ui-manifest';
3
+ export type ManifestTopBarContext = 'landing' | 'login' | 'composer' | 'admin';
2
4
  export type ManifestTopBarProps = {
3
5
  manifest: UiManifest;
4
6
  variant?: 'landing' | 'canvas';
7
+ topbarContext?: ManifestTopBarContext;
5
8
  showPoweredBy?: boolean;
6
9
  showLogout?: boolean;
7
10
  showSubtitle?: boolean;
11
+ hidden?: boolean;
12
+ center?: ReactNode;
13
+ bottomOverlay?: ReactNode;
8
14
  logoutCookieNames?: string[];
9
15
  logoutEndpoint?: string;
10
16
  logoutHref?: string;
11
17
  };
12
- export default function ManifestTopBar({ manifest, variant, showPoweredBy, showLogout, showSubtitle, logoutCookieNames, logoutEndpoint, logoutHref, }: ManifestTopBarProps): import("react/jsx-runtime").JSX.Element;
18
+ export default function ManifestTopBar({ manifest, variant, topbarContext, showPoweredBy, showLogout, showSubtitle, hidden, center, bottomOverlay, logoutCookieNames, logoutEndpoint, logoutHref, }: ManifestTopBarProps): import("react/jsx-runtime").JSX.Element;
13
19
  //# sourceMappingURL=ManifestTopBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ManifestTopBar.d.ts","sourceRoot":"","sources":["../src/ManifestTopBar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAY/D,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA+KF,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,QAAQ,EACR,OAAkB,EAClB,aAAqB,EACrB,UAAkB,EAClB,YAAoB,EACpB,iBAAiB,EACjB,cAAmC,EACnC,UAAqB,GACtB,EAAE,mBAAmB,2CA+HrB"}
1
+ {"version":3,"file":"ManifestTopBar.d.ts","sourceRoot":"","sources":["../src/ManifestTopBar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAuB/D,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAE/E,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA6UF,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,QAAQ,EACR,OAAkB,EAClB,aAAa,EACb,aAAqB,EACrB,UAAkB,EAClB,YAAoB,EACpB,MAAc,EACd,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,cAAmC,EACnC,UAAqB,GACtB,EAAE,mBAAmB,2CAiPrB"}