@treasuryspatial/viewer-ui-kit 0.1.35 → 0.1.37

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.
@@ -1,150 +1,132 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useShellPanelToggle } from '@treasuryspatial/viewer-react';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
4
+ import Link from 'next/link';
5
+ import { usePathname, useRouter, useSearchParams } from 'next/navigation';
6
+ import { buildLoginHref, useClientHydrated, useComposerAuthState, useSessionLogout, useShellPanelToggle, useSurfaceComposerData, } from '@treasuryspatial/viewer-react';
4
7
  import styled from 'styled-components';
5
8
  import TopBar from './TopBar.js';
6
- const Brand = styled.div `
9
+ const BrandLink = styled(Link) `
7
10
  display: flex;
8
11
  align-items: center;
9
- gap: ${(props) => (props.$variant === 'landing' ? '12px' : '8px')};
10
- `;
11
- const BrandCopy = styled.div `
12
- display: flex;
13
- flex-direction: column;
12
+ gap: 14px;
13
+ text-decoration: none;
14
+ color: inherit;
14
15
  min-width: 0;
15
- gap: 2px;
16
+
17
+ &:hover {
18
+ opacity: 0.75;
19
+ }
16
20
  `;
17
21
  const BrandLogo = styled.img `
18
- width: ${(props) => (props.$variant === 'landing' ? 'clamp(32px, 3.5vw + 12px, 64px)' : '32px')};
19
- height: ${(props) => (props.$variant === 'landing' ? 'clamp(32px, 3.5vw + 12px, 64px)' : '32px')};
22
+ width: ${(props) => (props.$variant === 'landing' ? 'clamp(32px, 4vw + 8px, 64px)' : '32px')};
23
+ height: ${(props) => (props.$variant === 'landing' ? 'clamp(32px, 4vw + 8px, 64px)' : '32px')};
20
24
  object-fit: contain;
25
+ flex-shrink: 0;
21
26
  `;
22
27
  const BrandTitle = styled.div `
23
28
  display: flex;
24
29
  align-items: baseline;
25
- flex-wrap: wrap;
26
30
  gap: ${(props) => (props.$variant === 'landing' ? '8px' : '6px')};
27
- font-size: ${(props) => (props.$variant === 'landing' ? '18px' : '18px')};
28
- font-weight: 400;
29
-
30
- @media (min-width: 640px) {
31
- font-size: ${(props) => (props.$variant === 'landing' ? '20px' : '18px')};
32
- }
33
-
34
- @media (min-width: 768px) {
35
- font-size: ${(props) => (props.$variant === 'landing' ? '24px' : '20px')};
36
- }
37
-
38
- @media (min-width: 1024px) {
39
- font-size: ${(props) => (props.$variant === 'landing' ? '30px' : '22px')};
40
- }
41
-
42
- @media (min-width: 1280px) {
43
- font-size: ${(props) => (props.$variant === 'landing' ? '36px' : '24px')};
44
- }
45
-
46
- @media (min-width: 1536px) {
47
- font-size: ${(props) => (props.$variant === 'landing' ? '48px' : '28px')};
48
- }
31
+ font-family: var(--ui-font-family, system-ui);
32
+ font-size: ${(props) => (props.$variant === 'landing' ? 'clamp(18px, 2vw + 10px, 48px)' : '18px')};
33
+ line-height: 1;
34
+ white-space: nowrap;
49
35
  `;
50
36
  const BrandTenant = styled.span `
37
+ color: var(--brand-text-primary);
51
38
  font-weight: 400;
52
- color: var(--brand-primary);
53
- white-space: nowrap;
54
39
  `;
55
- const BrandProduct = styled.span `
40
+ const BrandSurface = styled.span `
41
+ color: var(--brand-primary);
56
42
  font-weight: 400;
57
- color: var(--brand-text-primary);
58
- white-space: nowrap;
59
- `;
60
- const BrandSubtitle = styled.div `
61
- font-size: 11px;
62
- color: var(--brand-text-secondary);
63
- line-height: 1.2;
64
- white-space: nowrap;
65
- overflow: hidden;
66
- text-overflow: ellipsis;
67
43
  `;
68
- const BrandPartnerLogos = styled.div `
44
+ const Actions = styled.div `
69
45
  display: flex;
70
46
  align-items: center;
71
- gap: 8px;
72
- `;
73
- const PartnerLogo = styled.img `
74
- width: 28px;
75
- height: 28px;
76
- object-fit: contain;
77
- `;
78
- const Links = styled.nav `
79
- display: flex;
80
- gap: 18px;
81
- align-items: center;
82
- font-size: 13px;
47
+ gap: ${(props) => (props.$variant === 'landing' ? '22px' : '16px')};
48
+ font-size: ${(props) => (props.$variant === 'landing' ? '14px' : '13px')};
49
+ min-width: 0;
83
50
  `;
84
- const LinkItem = styled.a `
85
- color: var(--brand-text-secondary);
51
+ const NavLink = styled(Link) `
52
+ color: ${(props) => (props.$active ? 'var(--brand-primary)' : 'var(--brand-text-primary)')};
86
53
  text-decoration: none;
87
54
  font-weight: 400;
55
+ white-space: nowrap;
88
56
 
89
57
  &:hover {
90
- color: var(--brand-text-primary);
58
+ color: var(--brand-primary);
91
59
  }
92
60
  `;
93
- const LogoutButton = styled.button `
61
+ const AuthButton = styled.button `
94
62
  border: none;
95
63
  background: transparent;
96
- color: var(--brand-text-secondary);
64
+ color: var(--brand-text-primary);
97
65
  font-weight: 400;
98
- font-size: 13px;
66
+ font-size: inherit;
99
67
  cursor: pointer;
100
68
  padding: 0;
69
+ white-space: nowrap;
101
70
 
102
71
  &:hover {
103
- color: var(--brand-text-primary);
72
+ color: var(--brand-primary);
104
73
  }
105
74
  `;
106
- const PoweredBy = styled.a `
107
- display: none;
108
- align-items: center;
109
- gap: 8px;
110
- padding: 6px 10px;
111
- border-radius: 999px;
112
- border: 1px solid var(--brand-panel-border);
113
- background: color-mix(in srgb, var(--brand-panel) 90%, transparent);
114
- box-shadow: 0 1px 6px rgba(15, 23, 42, 0.08);
115
- opacity: 0.6;
116
- transition: opacity 0.2s ease;
117
- color: inherit;
75
+ const AuthLink = styled(Link) `
76
+ color: var(--brand-text-primary);
118
77
  text-decoration: none;
78
+ font-weight: 400;
79
+ white-space: nowrap;
119
80
 
120
81
  &:hover {
121
- opacity: 1;
122
- }
123
-
124
- @media (min-width: 1024px) {
125
- display: flex;
82
+ color: var(--brand-primary);
126
83
  }
127
84
  `;
128
- const PoweredByLogo = styled.img `
129
- width: 16px;
130
- height: 16px;
131
- object-fit: contain;
85
+ const SearchWrap = styled.div `
86
+ display: flex;
87
+ align-items: center;
132
88
  `;
133
- const PoweredByLabel = styled.div `
134
- font-size: 9px;
135
- text-transform: uppercase;
136
- letter-spacing: 0.12em;
137
- color: var(--brand-text-secondary);
138
- line-height: 1;
89
+ const SearchControl = styled.div `
90
+ transition: all 0.2s ease-in-out;
91
+ cursor: pointer;
92
+ width: ${(props) => (props.$expanded ? '220px' : '35px')};
93
+ height: 35px;
94
+ border: 3px solid ${(props) => (props.$expanded ? 'var(--brand-text-secondary)' : 'var(--brand-text-primary)')};
95
+ border-radius: ${(props) => (props.$expanded ? '18px' : '999px')};
96
+ background: var(--brand-background);
97
+ display: flex;
98
+ align-items: center;
99
+ position: relative;
100
+ overflow: hidden;
139
101
  `;
140
- const PoweredByTitle = styled.div `
141
- font-size: 11px;
102
+ const SearchInput = styled.input `
103
+ flex: 1;
104
+ min-width: 0;
105
+ padding: 0 14px;
106
+ border: none;
107
+ outline: none;
108
+ background: transparent;
142
109
  color: var(--brand-text-primary);
143
- line-height: 1.2;
110
+ font-family: var(--ui-font-family, system-ui);
111
+ font-size: 13px;
112
+
113
+ &::placeholder {
114
+ color: var(--brand-text-secondary);
115
+ }
144
116
  `;
145
- const PoweredByAccent = styled.span `
146
- font-weight: 600;
147
- color: var(--brand-text-primary);
117
+ const SearchReset = styled.button `
118
+ display: inline-flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ width: 28px;
122
+ height: 28px;
123
+ margin-right: 4px;
124
+ border: none;
125
+ background: transparent;
126
+ color: var(--brand-text-secondary);
127
+ cursor: pointer;
128
+ font-size: 18px;
129
+ line-height: 1;
148
130
  `;
149
131
  const PanelToggleCluster = styled.div `
150
132
  display: flex;
@@ -166,33 +148,82 @@ const PanelToggleText = styled.button `
166
148
  color: var(--brand-text-primary);
167
149
  }
168
150
  `;
169
- const resolvePoweredByConfig = (manifest) => {
170
- const poweredBy = manifest.branding?.poweredBy;
171
- return {
172
- enabled: poweredBy?.enabled ??
173
- (manifest.branding?.profile ? manifest.branding.profile !== 'treasury-native' : true),
174
- href: poweredBy?.href ?? 'https://treasury.space',
175
- logo: poweredBy?.logo ?? null,
176
- kicker: poweredBy?.kicker ?? 'Powered by',
177
- labelPrefix: poweredBy?.labelPrefix ?? 'Treasury',
178
- labelAccent: poweredBy?.labelAccent ?? manifest.topbar.productLabel ?? 'Composer',
179
- };
151
+ const formatDisplayName = (value) => {
152
+ const trimmed = value?.trim();
153
+ if (!trimmed)
154
+ return 'user';
155
+ return trimmed.split('@')[0];
180
156
  };
181
- const clearCookie = (name) => {
182
- document.cookie = `${name}=; max-age=0; path=/; samesite=strict`;
157
+ const isRouteActive = (pathname, href) => {
158
+ const routePath = href.split('?')[0] || href;
159
+ if (routePath === '/')
160
+ return pathname === '/';
161
+ return pathname === routePath || pathname.startsWith(`${routePath}/`);
183
162
  };
184
- export default function ManifestTopBar({ manifest, variant = 'canvas', showPoweredBy = true, showLogout = false, showPanelToggle = false, showSubtitle = false, logoutCookieNames = ['treasury_auth_token'], logoutEndpoint = '/api/auth/logout', logoutHref = '/login', }) {
163
+ export default function ManifestTopBar({ manifest, variant = 'canvas', showPoweredBy = false, showLogout = false, showPanelToggle = false, showSubtitle = false, logoutCookieNames, logoutEndpoint = '/api/auth/logout', logoutHref = '/login', }) {
164
+ const pathname = usePathname();
165
+ const router = useRouter();
166
+ const searchParams = useSearchParams();
167
+ const hydrated = useClientHydrated();
168
+ const composerData = useSurfaceComposerData();
169
+ const { auth } = useComposerAuthState();
185
170
  const { collapsed, toggle } = useShellPanelToggle();
186
- const poweredBy = resolvePoweredByConfig(manifest);
187
- const brandLogo = manifest.topbar.logo ?? null;
188
- const brand = (_jsxs(Brand, { "$variant": variant, children: [brandLogo ? (_jsx(BrandLogo, { "$variant": variant, src: brandLogo.src, alt: brandLogo.alt })) : null, _jsxs(BrandCopy, { children: [_jsxs(BrandTitle, { "$variant": variant, children: [_jsx(BrandTenant, { children: manifest.topbar.title }), manifest.topbar.productLabel ? (_jsx(BrandProduct, { children: manifest.topbar.productLabel })) : null] }), showSubtitle && manifest.topbar.subtitle ? (_jsx(BrandSubtitle, { children: manifest.topbar.subtitle })) : null] }), manifest.topbar.subtenantLogo || manifest.topbar.secondaryLogo ? (_jsxs(BrandPartnerLogos, { children: [manifest.topbar.subtenantLogo ? (_jsx(PartnerLogo, { src: manifest.topbar.subtenantLogo.src, alt: manifest.topbar.subtenantLogo.alt })) : null, manifest.topbar.secondaryLogo ? (_jsx(PartnerLogo, { src: manifest.topbar.secondaryLogo.src, alt: manifest.topbar.secondaryLogo.alt })) : null] })) : null] }));
189
- const center = showPoweredBy && poweredBy.enabled ? (_jsxs(PoweredBy, { href: poweredBy.href, target: "_blank", rel: "noreferrer", children: [poweredBy.logo ? (_jsx(PoweredByLogo, { src: poweredBy.logo.src, alt: poweredBy.logo.alt })) : null, _jsxs("div", { children: [_jsx(PoweredByLabel, { children: poweredBy.kicker }), _jsxs(PoweredByTitle, { children: [poweredBy.labelPrefix, " ", _jsx(PoweredByAccent, { children: poweredBy.labelAccent })] })] })] })) : null;
190
- const actions = (_jsxs(Links, { children: [showPanelToggle ? (_jsxs(PanelToggleCluster, { children: [_jsx("button", { "aria-label": collapsed ? 'Show navigation' : 'Hide navigation', className: "collapse-toggle collapse-toggle--edge-top", onClick: toggle, type: "button", children: collapsed ? (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.24 4.24a.75.75 0 01-1.06 0L5.25 8.27a.75.75 0 01-.02-1.06z", clipRule: "evenodd" }) })) : (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M5.23 12.79a.75.75 0 001.06-.02L10 9.06l3.71 3.71a.75.75 0 001.06-1.06L10.53 7.47a.75.75 0 00-1.06 0L4.23 11.75a.75.75 0 001 1.04z", clipRule: "evenodd" }) })) }), _jsx(PanelToggleText, { type: "button", onClick: toggle, "aria-label": collapsed ? 'Show panels' : 'Toggle panels', children: collapsed ? 'show panels' : 'toggle panels' })] })) : null, manifest.topbar.links.map((link) => (_jsx(LinkItem, { href: link.href, target: link.target ?? '_self', rel: link.target === '_blank' ? 'noreferrer' : undefined, children: link.label }, link.label))), showLogout ? (_jsx(LogoutButton, { type: "button", onClick: () => {
191
- fetch(logoutEndpoint, { method: 'POST' }).catch(() => {
192
- // ignore logout sync failures
193
- });
194
- logoutCookieNames.forEach(clearCookie);
195
- window.location.href = logoutHref;
196
- }, children: "logout" })) : null] }));
197
- return _jsx(TopBar, { hidden: collapsed, brand: brand, center: center, actions: actions });
171
+ const [searchOpen, setSearchOpen] = useState(false);
172
+ const [searchQuery, setSearchQuery] = useState('');
173
+ const searchRef = useRef(null);
174
+ const inputRef = useRef(null);
175
+ const navigation = composerData.navigation;
176
+ const introHref = navigation?.introHref || '/';
177
+ const composeHref = navigation?.composeHref || composerData.routePolicy?.homeRoute || '/compose';
178
+ const surfaceTitle = navigation?.surfaceTitle ||
179
+ composerData.title ||
180
+ manifest.surface?.label ||
181
+ manifest.topbar.productLabel ||
182
+ 'Composer';
183
+ const searchEnabled = navigation?.searchEnabled ?? true;
184
+ const brandLogo = manifest.topbar.logo;
185
+ const loginHref = hydrated
186
+ ? buildLoginHref({
187
+ pathname,
188
+ search: searchParams?.toString() ?? '',
189
+ })
190
+ : logoutHref;
191
+ const handleLogout = useSessionLogout({
192
+ logoutRoute: logoutEndpoint,
193
+ redirectPath: logoutHref,
194
+ onRedirect: (path) => router.push(path),
195
+ });
196
+ useEffect(() => {
197
+ if (!searchOpen)
198
+ return undefined;
199
+ const handleClickOutside = (event) => {
200
+ if (searchRef.current && !searchRef.current.contains(event.target)) {
201
+ setSearchOpen(false);
202
+ }
203
+ };
204
+ document.addEventListener('mousedown', handleClickOutside);
205
+ return () => document.removeEventListener('mousedown', handleClickOutside);
206
+ }, [searchOpen]);
207
+ useEffect(() => {
208
+ if (searchOpen) {
209
+ inputRef.current?.focus();
210
+ }
211
+ }, [searchOpen]);
212
+ const authControl = useMemo(() => {
213
+ if (!showLogout)
214
+ return null;
215
+ if (hydrated && auth.isAuthenticated) {
216
+ return (_jsx(AuthButton, { type: "button", onClick: handleLogout, children: formatDisplayName(auth.name || auth.user) }));
217
+ }
218
+ if (pathname === logoutHref)
219
+ return null;
220
+ return _jsx(AuthLink, { href: loginHref, children: "Login" });
221
+ }, [auth.isAuthenticated, auth.name, auth.user, handleLogout, hydrated, loginHref, logoutHref, pathname, showLogout]);
222
+ const actions = (_jsxs(Actions, { "$variant": variant, children: [_jsx(NavLink, { href: introHref, "$active": isRouteActive(pathname, introHref), children: "Introduction" }), _jsx(NavLink, { href: composeHref, "$active": isRouteActive(pathname, composeHref), children: "Compose" }), authControl, searchEnabled ? (_jsx(SearchWrap, { ref: searchRef, children: _jsx(SearchControl, { "$expanded": searchOpen, onClick: !searchOpen ? () => setSearchOpen(true) : undefined, children: searchOpen ? (_jsxs(_Fragment, { children: [_jsx(SearchInput, { ref: inputRef, type: "text", placeholder: "Search...", value: searchQuery, onChange: (event) => setSearchQuery(event.target.value), onClick: (event) => event.stopPropagation(), onKeyDown: (event) => {
223
+ if (event.key === 'Escape') {
224
+ setSearchOpen(false);
225
+ setSearchQuery('');
226
+ }
227
+ } }), searchQuery ? _jsx(SearchReset, { onClick: () => setSearchQuery(''), children: "\u00D7" }) : null] })) : null }) })) : null, showPanelToggle ? (_jsxs(PanelToggleCluster, { children: [_jsx("button", { "aria-label": collapsed ? 'Show navigation panels' : 'Hide navigation panels', className: "collapse-toggle collapse-toggle--edge-top", onClick: toggle, type: "button", children: collapsed ? (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.24 4.24a.75.75 0 01-1.06 0L5.25 8.27a.75.75 0 01-.02-1.06z", clipRule: "evenodd" }) })) : (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M5.23 12.79a.75.75 0 001.06-.02L10 9.06l3.71 3.71a.75.75 0 001.06-1.06L10.53 7.47a.75.75 0 00-1.06 0L4.23 11.75a.75.75 0 001 1.04z", clipRule: "evenodd" }) })) }), _jsx(PanelToggleText, { type: "button", onClick: toggle, children: collapsed ? 'show panels' : 'toggle panels' })] })) : null] }));
228
+ return (_jsx(TopBar, { compact: variant === 'canvas', hidden: false, brand: _jsxs(BrandLink, { href: introHref, children: [brandLogo?.src ? _jsx(BrandLogo, { "$variant": variant, src: brandLogo.src, alt: brandLogo.alt }) : null, _jsxs("div", { children: [_jsxs(BrandTitle, { "$variant": variant, children: [_jsx(BrandTenant, { children: manifest.topbar.title }), _jsx(BrandSurface, { children: surfaceTitle })] }), showSubtitle && manifest.topbar.subtitle ? _jsx("div", { children: manifest.topbar.subtitle }) : null] })] }), center: showPoweredBy ? null : null, actions: actions }));
198
229
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TopBar.d.ts","sourceRoot":"","sources":["../src/TopBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAsDvC,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,OAAe,EACf,MAAc,EACd,KAAK,EACL,MAAM,EACN,OAAO,EACP,SAAS,GACV,EAAE,WAAW,2CAUb"}
1
+ {"version":3,"file":"TopBar.d.ts","sourceRoot":"","sources":["../src/TopBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAkDvC,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,OAAe,EACf,MAAc,EACd,KAAK,EACL,MAAM,EACN,OAAO,EACP,SAAS,GACV,EAAE,WAAW,2CAUb"}
package/dist/TopBar.js CHANGED
@@ -7,7 +7,7 @@ const Root = styled.nav `
7
7
  left: 0;
8
8
  right: 0;
9
9
  z-index: 50;
10
- height: ${(props) => (props.$compact ? '50px' : '84px')};
10
+ height: ${(props) => (props.$compact ? '50px' : '72px')};
11
11
  background: var(--viewer-ui-color-bg-base, var(--brand-panel, #f6f3eb));
12
12
  border-bottom: 1px solid var(--viewer-ui-color-panel-border, var(--brand-panel-border, rgba(47, 74, 60, 0.35)));
13
13
  color: var(--viewer-ui-color-text-strong, var(--brand-text-primary, #1f2937));
@@ -17,7 +17,7 @@ const Root = styled.nav `
17
17
  const Inner = styled.div `
18
18
  height: 100%;
19
19
  display: grid;
20
- grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
20
+ grid-template-columns: minmax(0, 1fr) auto;
21
21
  align-items: center;
22
22
  gap: 16px;
23
23
  padding: 0 16px;
@@ -36,10 +36,6 @@ const CenterSlot = styled.div `
36
36
  justify-content: center;
37
37
  align-items: center;
38
38
  min-width: 0;
39
-
40
- @media (min-width: 1024px) {
41
- display: flex;
42
- }
43
39
  `;
44
40
  const ActionsSlot = styled.div `
45
41
  min-width: 0;
package/dist/index.d.ts CHANGED
@@ -23,6 +23,8 @@ export { default as ManifestTopBar } from './ManifestTopBar.js';
23
23
  export type { ManifestTopBarProps } from './ManifestTopBar.js';
24
24
  export { default as LoginShell } from './LoginShell.js';
25
25
  export type { LoginShellProps } from './LoginShell.js';
26
+ export { default as LoginForm } from './LoginForm.js';
27
+ export type { LoginFormProps } from './LoginForm.js';
26
28
  export { default as LandingShell } from './LandingShell.js';
27
29
  export type { LandingShellProps } from './LandingShell.js';
28
30
  export { default as CustomModeSurface } from './CustomModeSurface.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAChF,YAAY,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAChF,YAAY,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ export { default as KitPill } from './KitPill.js';
14
14
  export { default as TopBar } from './TopBar.js';
15
15
  export { default as ManifestTopBar } from './ManifestTopBar.js';
16
16
  export { default as LoginShell } from './LoginShell.js';
17
+ export { default as LoginForm } from './LoginForm.js';
17
18
  export { default as LandingShell } from './LandingShell.js';
18
19
  export { default as CustomModeSurface } from './CustomModeSurface.js';
19
20
  export { default as ModeBar, MODE_BAR_HEIGHT_PX } from './ModeBar.js';