@unisim/sdk 0.127.0 → 0.128.1

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/README.md CHANGED
@@ -55,6 +55,16 @@ function Header() {
55
55
  - `useOrg()` — active org + list of orgs the user belongs to
56
56
  - `signInWithPassword(supabase, email, password)`
57
57
  - `signOut(supabase)`
58
+ - `continueWithEmail(supabase, { email, password })` — **the unified form.** Signs
59
+ in, or creates the account if there isn't one, and reports which happened:
60
+ `signed-in` · `created` · `upgraded` · `unconfirmed` · `account-exists` ·
61
+ `trial-collision` · `error`. There is no "does this email exist?" probe — the
62
+ sign-in is attempted first, so an account's existence is only ever disclosed
63
+ to someone who already submitted a password for it.
64
+ - `abandonTrialAndSignInWithEmail(supabase, { email, password })` — the
65
+ `trial-collision` escape hatch: drop the anonymous session and sign in for
66
+ real, leaving the trial work behind. Only after the user has agreed to that.
67
+ - `<SignInDialog />` renders all of the above; apps rarely need the functions.
58
68
 
59
69
  ### Trial mode (anonymous-auth users)
60
70
  - `useTrialMode()` — `{ isTrial, hasSession, email }` for gating exports / multi-user
@@ -1,5 +1,65 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { type MenuTheme } from './menuTheme.js';
3
+ /** One open-source package this app is built on, as `gen-credits.mjs` emits it. */
4
+ export interface CreditsPackage {
5
+ /** The npm name — the identity. */
6
+ name: string;
7
+ /** How the project spells itself ("Tailwind CSS", not "tailwindcss"). Curated. */
8
+ title?: string;
9
+ version?: string;
10
+ licence?: string;
11
+ repo?: string;
12
+ /**
13
+ * The people, most significant first. Rendered as "A, B et al." — always
14
+ * "et al.", because at most two are named and every one of these projects
15
+ * has more contributors than that, so the qualifier is true in every case
16
+ * and its absence would be the lie. It is also Latin, and read as such in
17
+ * all eight of our languages, so it is deliberately not a translated string.
18
+ */
19
+ authors?: string[];
20
+ /** What it does FOR US, in the reader's words. Curated; not npm's blurb. */
21
+ description?: string;
22
+ }
23
+ /**
24
+ * An app's generated `credits.json`. Two tiers, and the split is not cosmetic:
25
+ * `ships` is what reaches the user's machine and therefore what carries the
26
+ * MIT/BSD/Apache obligation; `builds` never leaves our build server and is
27
+ * credited purely as courtesy. Collapsing them would either over-claim an
28
+ * obligation or bury the packages that actually have one.
29
+ */
30
+ export interface AppCredits {
31
+ ships?: CreditsPackage[];
32
+ builds?: CreditsPackage[];
33
+ /** How many packages the notices file covers — the direct deps plus their trees. */
34
+ noticesCount?: number;
35
+ }
36
+ /** One name in the "designed by" line, and where it points. */
37
+ export interface AuthorshipCredit {
38
+ href: string;
39
+ }
40
+ /**
41
+ * Who designed the app — the line at the foot of the dialog.
42
+ *
43
+ * Only the hrefs live here. The designer's NAME is a constant below and the
44
+ * team's reads out of the dictionary, because the two halves are different
45
+ * kinds of string: "James Markey MBE" is a person and a British honour, which
46
+ * is the same in all eight languages, whereas "the UNI·SIM team" is a common
47
+ * noun wrapped round a brand and is not ("l’équipe UNI·SIM", "UNI·SIM ekibi").
48
+ * Putting the team's label in the prop would have frozen it in English.
49
+ */
50
+ export interface AppAuthorship {
51
+ designer: AuthorshipCredit;
52
+ team: AuthorshipCredit;
53
+ }
54
+ /** The designer, spelled once. A proper noun: never translated. */
55
+ export declare const AUTHORSHIP_DESIGNER = "James Markey MBE";
56
+ /**
57
+ * Every app in the suite is designed by the same person and the same team, so
58
+ * this is a default rather than a prop each app passes — seventeen apps
59
+ * hand-typing one sentence is seventeen chances to spell it differently, and
60
+ * the sentence names a real person.
61
+ */
62
+ export declare const DEFAULT_AUTHORSHIP: AppAuthorship;
3
63
  export interface AboutAppDialogProps {
4
64
  open: boolean;
5
65
  onClose: () => void;
@@ -51,6 +111,38 @@ export interface AboutAppDialogProps {
51
111
  * whose whole point is a server.
52
112
  */
53
113
  privacy?: boolean;
114
+ /**
115
+ * The app's generated `credits.json` — the open-source projects it is built
116
+ * on. **Omitted, the whole section is omitted**, which is the point: this
117
+ * shipped to one app first and the other sixteen render exactly what they
118
+ * rendered before, with no per-app change and nothing to co-ordinate.
119
+ *
120
+ * ⚠️ Generate it, never hand-write it. `Universal_Apps/scripts/gen-credits.mjs`
121
+ * reads the installed tree; a typed list drifts from the lockfile the first
122
+ * time anyone upgrades anything, and a credits list that names a package we
123
+ * removed is worse than no list.
124
+ */
125
+ credits?: AppCredits;
126
+ /**
127
+ * The app's `THIRD-PARTY-NOTICES.md` — the full licence texts. This is the
128
+ * artefact that actually discharges the licences; the list above is the
129
+ * courtesy. Omitted, the link is hidden rather than pointing at nothing.
130
+ */
131
+ noticesHref?: string;
132
+ /**
133
+ * Who designed the app, as the quiet line at the foot of the dialog.
134
+ *
135
+ * Defaults to the suite credit, so it appears in every app that mounts this
136
+ * dialog with no per-app change — that is the point of it living here.
137
+ * Pass `null` for an app that is genuinely somebody else's work.
138
+ *
139
+ * ⚠️ **This is not, on its own, worth anything to a search engine.** The
140
+ * dialog is a portal that only enters the DOM once a user opens it, so a
141
+ * crawler never sees it. The machine-readable half of this credit is the
142
+ * `SoftwareApplication.author` JSON-LD on the product's marketing page in
143
+ * `UNI_SIM_Website`; this line is what a reader who opens the dialog sees.
144
+ */
145
+ authorship?: AppAuthorship | null;
54
146
  /** Defaults to MIT — every Universal App. */
55
147
  licence?: string;
56
148
  changelogHref?: string;
@@ -59,5 +151,5 @@ export interface AboutAppDialogProps {
59
151
  siteHref?: string;
60
152
  theme?: MenuTheme;
61
153
  }
62
- export declare function AboutAppDialog({ open, onClose, product, name, tagline, description, version, repo, proof, subject, plural, except, headline, privacy, licence, changelogHref, supportHref, siteHref, theme, }: AboutAppDialogProps): import("react").ReactPortal | null;
154
+ export declare function AboutAppDialog({ open, onClose, product, name, tagline, description, version, repo, proof, subject, plural, except, headline, privacy, credits, noticesHref, authorship, licence, changelogHref, supportHref, siteHref, theme, }: AboutAppDialogProps): import("react").ReactPortal | null;
63
155
  //# sourceMappingURL=AboutAppDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AboutAppDialog.d.ts","sourceRoot":"","sources":["../src/AboutAppDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIrE,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AA6CrD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAYD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,OAAO,EACP,IAAI,EACJ,OAAO,EACP,WAAW,EACX,OAAO,EACP,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,MAAa,EACb,QAAQ,EACR,OAAc,EACd,OAAe,EACf,aAAgD,EAChD,WAA6C,EAC7C,QAAQ,EACR,KAAe,GAChB,EAAE,mBAAmB,sCA2GrB"}
1
+ {"version":3,"file":"AboutAppDialog.d.ts","sourceRoot":"","sources":["../src/AboutAppDialog.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useEffect } from 'react';
3
+ import { Fragment, useEffect } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
5
  import { NAV_OVERLAY_Z_INDEX } from './DropdownSurface.js';
6
6
  import { t } from './i18n.js';
@@ -8,6 +8,18 @@ import { MENU } from './menuTheme.js';
8
8
  import { useLanguage, useUniversal } from './provider.js';
9
9
  import { PrivacyNote } from './PrivacyNote.js';
10
10
  import { DEFAULT_SUITE_PRODUCTS, DEFAULT_UNIVERSAL_APPS_PRODUCTS, } from './SuiteSwitcher.js';
11
+ /** The designer, spelled once. A proper noun: never translated. */
12
+ export const AUTHORSHIP_DESIGNER = 'James Markey MBE';
13
+ /**
14
+ * Every app in the suite is designed by the same person and the same team, so
15
+ * this is a default rather than a prop each app passes — seventeen apps
16
+ * hand-typing one sentence is seventeen chances to spell it differently, and
17
+ * the sentence names a real person.
18
+ */
19
+ export const DEFAULT_AUTHORSHIP = {
20
+ designer: { href: 'https://www.unisim.co.uk/about-james' },
21
+ team: { href: 'https://www.unisim.co.uk/blog/welcome-to-uni-sim' },
22
+ };
11
23
  const CATALOGUE = [
12
24
  ...DEFAULT_UNIVERSAL_APPS_PRODUCTS,
13
25
  ...DEFAULT_SUITE_PRODUCTS,
@@ -17,7 +29,7 @@ function lookup(product) {
17
29
  return undefined;
18
30
  return CATALOGUE.find((p) => p.id === product);
19
31
  }
20
- export function AboutAppDialog({ open, onClose, product, name, tagline, description, version, repo, proof, subject, plural, except = null, headline, privacy = true, licence = 'MIT', changelogHref = 'https://changelog.unisim.co.uk', supportHref = 'https://unisim.co.uk/#contact', siteHref, theme = 'light', }) {
32
+ export function AboutAppDialog({ open, onClose, product, name, tagline, description, version, repo, proof, subject, plural, except = null, headline, privacy = true, credits, noticesHref, authorship = DEFAULT_AUTHORSHIP, licence = 'MIT', changelogHref = 'https://changelog.unisim.co.uk', supportHref = 'https://unisim.co.uk/#contact', siteHref, theme = 'light', }) {
21
33
  const { language } = useLanguage();
22
34
  const { config } = useUniversal();
23
35
  const p = MENU[theme];
@@ -35,9 +47,50 @@ export function AboutAppDialog({ open, onClose, product, name, tagline, descript
35
47
  return null;
36
48
  const entry = lookup(product ?? config.product);
37
49
  const title = name ?? entry?.name ?? 'This app';
50
+ // An entry the generator could not resolve carries no version and no repo;
51
+ // printing its bare npm name would credit nobody and look like a bug, so it
52
+ // is dropped here rather than rendered half-empty.
53
+ const ships = (credits?.ships ?? []).filter((c) => c.name && (c.repo || c.authors?.length));
54
+ // Joined with commas only, never a localised "and": the eight languages
55
+ // disagree about the conjunction AND about the comma before it, and a list
56
+ // of three tool names does not need one.
57
+ const tools = (credits?.builds ?? []).map((c) => c.title ?? c.name).join(', ');
38
58
  const line = tagline ?? entry?.desc;
39
59
  const site = siteHref ?? entry?.href;
40
- return createPortal(_jsx("div", { style: overlayStyle, onClick: onClose, role: "presentation", children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": `${t(language, 'menu.about_app')} — ${title}`, style: cardStyle(p), onClick: (e) => e.stopPropagation(), children: [_jsx("button", { type: "button", onClick: onClose, "aria-label": t(language, 'nav.menu_close'), style: closeButtonStyle(p), onMouseEnter: (e) => { e.currentTarget.style.color = p.text; }, onMouseLeave: (e) => { e.currentTarget.style.color = p.muted; }, children: _jsx(IconClose, {}) }), _jsxs("div", { style: identityRowStyle, children: [entry?.glyph && _jsx("span", { style: markTileStyle(p), "aria-hidden": true, children: entry.glyph }), _jsxs("div", { style: { minWidth: 0 }, children: [_jsx("h2", { style: titleStyle(p), children: title }), site && _jsx("a", { href: site, target: "_blank", rel: "noopener noreferrer", style: siteLinkStyle(p), children: stripScheme(site) })] })] }), _jsxs("div", { style: { display: 'grid', gap: 14 }, children: [(description || line) && (_jsx(Section, { label: t(language, 'about.what_it_does'), palette: p, children: _jsx("p", { style: bodyStyle(p), children: description ?? line }) })), privacy && (_jsx(Section, { label: t(language, 'about.privacy'), palette: p, children: _jsx(PrivacyNote, { dismissible: false, theme: theme, repo: repo, proof: proof, subject: subject, plural: plural, except: except, headline: headline }) })), _jsxs(Section, { label: t(language, 'about.open_source'), palette: p, children: [_jsx("p", { style: bodyStyle(p), children: t(language, 'about.open_source_body').replace('{licence}', licence) }), _jsxs("div", { style: linkRowStyle, children: [_jsx(Link, { href: repo, palette: p, children: t(language, 'about.view_source') }), _jsx(Link, { href: `${repo.replace(/\/+$/, '')}/issues`, palette: p, children: t(language, 'about.report_problem') })] })] }), version && (_jsxs(Section, { label: t(language, 'about.version'), palette: p, children: [_jsx("p", { style: bodyStyle(p), children: _jsxs("span", { style: versionChipStyle(p), children: ["v", version] }) }), _jsx(Link, { href: changelogHref, palette: p, children: t(language, 'about.whats_new') })] })), _jsxs(Section, { label: t(language, 'about.support'), palette: p, children: [_jsx("p", { style: bodyStyle(p), children: t(language, 'about.support_body') }), _jsx(Link, { href: supportHref, palette: p, children: t(language, 'about.contact') })] })] })] }) }), document.body);
60
+ return createPortal(_jsx("div", { style: overlayStyle, onClick: onClose, role: "presentation", children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": `${t(language, 'menu.about_app')} — ${title}`, style: cardStyle(p), onClick: (e) => e.stopPropagation(), children: [_jsx("button", { type: "button", onClick: onClose, "aria-label": t(language, 'nav.menu_close'), style: closeButtonStyle(p), onMouseEnter: (e) => { e.currentTarget.style.color = p.text; }, onMouseLeave: (e) => { e.currentTarget.style.color = p.muted; }, children: _jsx(IconClose, {}) }), _jsxs("div", { style: identityRowStyle, children: [entry?.glyph && _jsx("span", { style: markTileStyle(p), "aria-hidden": true, children: entry.glyph }), _jsxs("div", { style: { minWidth: 0 }, children: [_jsx("h2", { style: titleStyle(p), children: title }), site && _jsx("a", { href: site, target: "_blank", rel: "noopener noreferrer", style: siteLinkStyle(p), children: stripScheme(site) })] })] }), _jsxs("div", { style: { display: 'grid', gap: 14 }, children: [(description || line) && (_jsx(Section, { label: t(language, 'about.what_it_does'), palette: p, children: _jsx("p", { style: bodyStyle(p), children: description ?? line }) })), privacy && (_jsx(Section, { label: t(language, 'about.privacy'), palette: p, children: _jsx(PrivacyNote, { dismissible: false, theme: theme, repo: repo, proof: proof, subject: subject, plural: plural, except: except, headline: headline }) })), _jsxs(Section, { label: t(language, 'about.open_source'), palette: p, children: [_jsx("p", { style: bodyStyle(p), children: t(language, 'about.open_source_body').replace('{licence}', licence) }), _jsxs("div", { style: linkRowStyle, children: [_jsx(Link, { href: repo, palette: p, children: t(language, 'about.view_source') }), _jsx(Link, { href: `${repo.replace(/\/+$/, '')}/issues`, palette: p, children: t(language, 'about.report_problem') })] })] }), ships.length > 0 && (_jsxs(Section, { label: t(language, 'about.built_with'), palette: p, children: [_jsx("p", { style: bodyStyle(p), children: t(language, 'about.built_with_body') }), _jsx("ul", { style: creditsListStyle, children: ships.map((c, i) => (_jsxs("li", { style: creditRowStyle(p, i === 0), children: [_jsxs("span", { style: creditHeadStyle, children: [c.repo
61
+ ? _jsx("a", { href: c.repo, target: "_blank", rel: "noopener noreferrer", style: creditNameStyle(p), children: c.title ?? c.name })
62
+ : _jsx("span", { style: { ...creditNameStyle(p), color: p.text }, children: c.title ?? c.name }), c.licence && _jsx("span", { style: creditLicenceStyle(p), children: c.licence })] }), byline(c) && _jsx("p", { style: creditByStyle(p), children: byline(c) })] }, c.name))) }), tools && (_jsx("p", { style: { ...bodyStyle(p), marginTop: 8, color: p.muted, fontSize: 11.5 }, children: t(language, 'about.built_with_tools').replace('{tools}', tools) })), noticesHref && (_jsx("div", { style: noticesRowStyle(p), children: _jsx(Link, { href: noticesHref, palette: p, children: t(language, 'about.all_packages').replace('{count}', String(credits?.noticesCount ?? ships.length)) }) }))] })), version && (_jsxs(Section, { label: t(language, 'about.version'), palette: p, children: [_jsx("p", { style: bodyStyle(p), children: _jsxs("span", { style: versionChipStyle(p), children: ["v", version] }) }), _jsx(Link, { href: changelogHref, palette: p, children: t(language, 'about.whats_new') })] })), _jsxs(Section, { label: t(language, 'about.support'), palette: p, children: [_jsx("p", { style: bodyStyle(p), children: t(language, 'about.support_body') }), _jsx(Link, { href: supportHref, palette: p, children: t(language, 'about.contact') })] })] }), authorship && (_jsx("footer", { style: colophonStyle(p), children: _jsx("p", { style: colophonTextStyle(p), children: interleave(t(language, 'about.designed_by'), {
63
+ designer: (_jsx("a", { href: authorship.designer.href, target: "_blank", rel: "noopener noreferrer", style: colophonLinkStyle(p), children: AUTHORSHIP_DESIGNER }, "designer")),
64
+ team: (_jsx("a", { href: authorship.team.href, target: "_blank", rel: "noopener noreferrer", style: colophonLinkStyle(p), children: t(language, 'about.the_team') }, "team")),
65
+ }) }) }))] }) }), document.body);
66
+ }
67
+ /**
68
+ * "Andrew Dillon et al. · reads and writes the PDF itself" — people first,
69
+ * because they are the point of the section, and the middot only when both
70
+ * halves exist. A package with neither renders no byline at all rather than a
71
+ * stray separator.
72
+ */
73
+ function byline(c) {
74
+ const who = c.authors?.length ? `${c.authors.join(', ')} et al.` : '';
75
+ return [who, c.description].filter(Boolean).join(' \u00b7 ');
76
+ }
77
+ /**
78
+ * Split a translated sentence on its `{placeholder}`s and drop the matching
79
+ * nodes in. `t()` returns a string, so a sentence with a link in the middle of
80
+ * it cannot be built any other way without either splitting the sentence into
81
+ * fragments a translator cannot see the shape of, or reaching for
82
+ * dangerouslySetInnerHTML on a string we would then have to trust.
83
+ *
84
+ * An unknown placeholder is left as written rather than dropped: a visible
85
+ * `{typo}` is a bug report, a silent gap is a sentence missing a word.
86
+ */
87
+ function interleave(template, values) {
88
+ return template.split(/(\{\w+\})/g).map((part, i) => {
89
+ const key = /^\{(\w+)\}$/.exec(part)?.[1];
90
+ return key && key in values
91
+ ? _jsx(Fragment, { children: values[key] }, i)
92
+ : _jsx(Fragment, { children: part }, i);
93
+ });
41
94
  }
42
95
  /** `https://opensource.unisim.co.uk/pdf` reads better as the host and path. */
43
96
  function stripScheme(url) {
@@ -167,4 +220,74 @@ const versionChipStyle = (p) => ({
167
220
  fontWeight: 700,
168
221
  fontVariantNumeric: 'tabular-nums',
169
222
  });
223
+ const creditsListStyle = {
224
+ listStyle: 'none',
225
+ margin: '6px 0 0',
226
+ padding: 0,
227
+ display: 'flex',
228
+ flexDirection: 'column',
229
+ };
230
+ // ⚠️ The rule goes BETWEEN rows, so the first one has none. Inline styles have
231
+ // no `:first-child`, which is why the index is threaded through rather than
232
+ // this being a stylesheet concern — a rule above the top row reads as a divider
233
+ // cutting the list off from the sentence that introduces it.
234
+ const creditRowStyle = (p, first) => ({
235
+ padding: first ? '0 0 6px' : '6px 0',
236
+ borderTop: first ? 0 : `1px solid ${p.divider}`,
237
+ });
238
+ const creditHeadStyle = {
239
+ display: 'flex',
240
+ alignItems: 'baseline',
241
+ justifyContent: 'space-between',
242
+ gap: 10,
243
+ };
244
+ const creditNameStyle = (p) => ({
245
+ fontSize: 12.5,
246
+ fontWeight: 600,
247
+ color: p.accentText,
248
+ textDecoration: 'none',
249
+ });
250
+ const creditLicenceStyle = (p) => ({
251
+ flexShrink: 0,
252
+ fontSize: 10.5,
253
+ fontWeight: 600,
254
+ color: p.chipText,
255
+ background: p.chipBg,
256
+ border: `1px solid ${p.chipBorder}`,
257
+ borderRadius: 999,
258
+ padding: '1px 7px',
259
+ whiteSpace: 'nowrap',
260
+ fontVariantNumeric: 'tabular-nums',
261
+ });
262
+ const creditByStyle = (p) => ({
263
+ margin: 0,
264
+ fontSize: 11.5,
265
+ lineHeight: 1.45,
266
+ color: p.muted,
267
+ });
268
+ const noticesRowStyle = (p) => ({
269
+ borderTop: `1px solid ${p.divider}`,
270
+ marginTop: 2,
271
+ paddingTop: 4,
272
+ });
273
+ const colophonStyle = (p) => ({
274
+ borderTop: `1px solid ${p.divider}`,
275
+ marginTop: 16,
276
+ paddingTop: 10,
277
+ });
278
+ const colophonTextStyle = (p) => ({
279
+ margin: 0,
280
+ fontSize: 11.5,
281
+ lineHeight: 1.5,
282
+ color: p.faint,
283
+ });
284
+ // Underlined rather than coloured: at this size the accent reads as a button
285
+ // row, and the line is meant to be found, not offered.
286
+ const colophonLinkStyle = (p) => ({
287
+ color: p.muted,
288
+ fontWeight: 600,
289
+ textDecoration: 'underline',
290
+ textDecorationColor: p.divider,
291
+ textUnderlineOffset: '2px',
292
+ });
170
293
  //# sourceMappingURL=AboutAppDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AboutAppDialog.js","sourceRoot":"","sources":["../src/AboutAppDialog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AboutAppDialog.js","sourceRoot":"","sources":["../src/AboutAppDialog.tsx"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Retained for callers pinned to older SDKs. `'signin'` and `'signup'` are now
3
+ * the same thing — the unified form — and only `'reset'` opens a different one.
4
+ */
1
5
  export type SignInDialogMode = 'signin' | 'signup' | 'reset';
2
6
  export interface SignInDialogProps {
3
7
  /** Whether the dialog is shown. */
@@ -11,7 +15,10 @@ export interface SignInDialogProps {
11
15
  * the footer "manage your account" link points at the origin.
12
16
  */
13
17
  hubLoginHref?: string;
14
- /** Which form to open on. Defaults to sign-in. */
18
+ /**
19
+ * Which form to open on. Only `'reset'` changes anything now: `'signin'` and
20
+ * `'signup'` both open the one unified email + password form.
21
+ */
15
22
  initialMode?: SignInDialogMode;
16
23
  }
17
24
  export declare function SignInDialog({ open, onClose, hubLoginHref, initialMode, }: SignInDialogProps): import("react").ReactPortal | null;
@@ -1 +1 @@
1
- {"version":3,"file":"SignInDialog.d.ts","sourceRoot":"","sources":["../src/SignInDialog.tsx"],"names":[],"mappings":"AA2CA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,qFAAqF;IACrF,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kDAAkD;IAClD,WAAW,CAAC,EAAE,gBAAgB,CAAA;CAC/B;AAgBD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,WAAsB,GACvB,EAAE,iBAAiB,sCAwSnB"}
1
+ {"version":3,"file":"SignInDialog.d.ts","sourceRoot":"","sources":["../src/SignInDialog.tsx"],"names":[],"mappings":"AAqDA;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,qFAAqF;IACrF,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAA;CAC/B;AAgBD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,WAAsB,GACvB,EAAE,iBAAiB,sCA6UnB"}
@@ -9,6 +9,7 @@ import { useLanguage, useUniversal } from './provider.js';
9
9
  import { useCanHover } from './hover.js';
10
10
  import { OAuthButtons } from './OAuthButtons.js';
11
11
  import { abandonTrialAndSignIn, clearOAuthError, isIdentityCollision, isManualLinkingDisabled, readOAuthError, startOAuthSignIn, } from './oauth.js';
12
+ import { continueWithEmail } from './emailAuth.js';
12
13
  // Reset links must land somewhere that can host the set-a-password step; the
13
14
  // hub's /login?finish=1 already does and is on Supabase's redirect allowlist,
14
15
  // unlike each app's own origin.
@@ -34,6 +35,10 @@ export function SignInDialog({ open, onClose, hubLoginHref, initialMode = 'signi
34
35
  const [error, setError] = useState(null);
35
36
  const [info, setInfo] = useState(null);
36
37
  const emailRef = useRef(null);
38
+ // The one outcome that needs a panel rather than a line of text, because it
39
+ // ends in a button — and the one the old two-form design could not say at
40
+ // all: the address is registered and this is not its password.
41
+ const [accountExists, setAccountExists] = useState(false);
37
42
  // Provider sign-in. `oauthBusy` names the provider whose redirect is in
38
43
  // flight; `oauthError` is either a failure to START one or — far more often —
39
44
  // one read back off the URL after a failed round trip.
@@ -50,6 +55,7 @@ export function SignInDialog({ open, onClose, hubLoginHref, initialMode = 'signi
50
55
  setPassword('');
51
56
  setError(null);
52
57
  setInfo(null);
58
+ setAccountExists(false);
53
59
  setOauthBusy(null);
54
60
  setOauthError(null);
55
61
  setCollisionProvider(null);
@@ -117,7 +123,31 @@ export function SignInDialog({ open, onClose, hubLoginHref, initialMode = 'signi
117
123
  setMode(m);
118
124
  setError(null);
119
125
  setInfo(null);
126
+ setAccountExists(false);
120
127
  };
128
+ function applyOutcome(outcome) {
129
+ switch (outcome.kind) {
130
+ case 'signed-in':
131
+ // The provider's onAuthStateChange updates the navbar; nothing to
132
+ // navigate to — the whole point is the user stays where they were.
133
+ onClose();
134
+ return;
135
+ case 'created':
136
+ setInfo(t(language, 'signin.info_created'));
137
+ return;
138
+ case 'upgraded':
139
+ setInfo(t(language, 'signin.info_signup'));
140
+ return;
141
+ case 'unconfirmed':
142
+ setInfo(t(language, 'signin.info_unconfirmed'));
143
+ return;
144
+ case 'account-exists':
145
+ setAccountExists(true);
146
+ return;
147
+ case 'error':
148
+ setError(outcome.message);
149
+ }
150
+ }
121
151
  async function submit(e) {
122
152
  e.preventDefault();
123
153
  const address = email.trim();
@@ -128,9 +158,11 @@ export function SignInDialog({ open, onClose, hubLoginHref, initialMode = 'signi
128
158
  setBusy(true);
129
159
  setError(null);
130
160
  setInfo(null);
161
+ setAccountExists(false);
131
162
  if (mode === 'reset') {
132
- // Same confirmation whether or not the address exists — don't leak
133
- // which emails are registered.
163
+ // Same confirmation whether or not the address exists. Unlike the form
164
+ // above this one takes no password, so it can prove nothing about who
165
+ // holds the account and must therefore say nothing.
134
166
  const { error: err } = await supabase.auth.resetPasswordForEmail(address, {
135
167
  redirectTo: `${hubOrigin(hubLoginHref)}/login?finish=1`,
136
168
  });
@@ -142,54 +174,36 @@ export function SignInDialog({ open, onClose, hubLoginHref, initialMode = 'signi
142
174
  setInfo(t(language, 'signin.info_reset'));
143
175
  return;
144
176
  }
145
- if (mode === 'signin') {
146
- const { error: err } = await supabase.auth.signInWithPassword({
147
- email: address,
148
- password,
149
- });
150
- setBusy(false);
151
- if (err) {
152
- setError(err.message);
153
- return;
154
- }
155
- // The provider's onAuthStateChange updates the navbar; nothing to
156
- // navigate to — the whole point is the user stays where they were.
157
- onClose();
158
- return;
159
- }
160
- // mode === 'signup'. No emailRedirectTo: app origins aren't on the
161
- // Supabase redirect allowlist, so the confirmation link lands on the
162
- // project Site URL (the hub) exactly as hub-side signups do today.
163
- const { error: err } = await supabase.auth.signUp({ email: address, password });
177
+ // Sign in, or create the account if there isn't one. No emailRedirectTo:
178
+ // app origins aren't on the Supabase redirect allowlist, so a confirmation
179
+ // link lands on the project Site URL (the hub), exactly as hub-side
180
+ // signups do today.
181
+ const outcome = await continueWithEmail(supabase, { email: address, password });
164
182
  setBusy(false);
165
- if (err) {
166
- setError(err.message);
167
- return;
168
- }
169
- setInfo(t(language, 'signin.info_signup'));
183
+ applyOutcome(outcome);
170
184
  }
171
185
  if (!open || typeof document === 'undefined')
172
186
  return null;
173
- const title = mode === 'signup' ? t(language, 'signin.title_signup')
174
- : mode === 'reset' ? t(language, 'signin.title_reset')
175
- : t(language, 'signin.title_signin');
187
+ const title = mode === 'reset' ? t(language, 'signin.title_reset') : t(language, 'signin.title_auth');
176
188
  const cta = busy
177
189
  ? '…'
178
- : mode === 'signup' ? t(language, 'signin.cta_signup')
179
- : mode === 'reset' ? t(language, 'signin.cta_reset')
180
- : t(language, 'signin.cta_signin');
190
+ : mode === 'reset' ? t(language, 'signin.cta_reset') : t(language, 'signin.cta_continue');
181
191
  const hub = hubOrigin(hubLoginHref);
182
192
  return createPortal(_jsx("div", { style: overlayStyle, onMouseDown: (e) => {
183
193
  if (e.target === e.currentTarget)
184
194
  onClose();
185
- }, children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": title, style: cardStyle, children: [_jsx("button", { type: "button", "aria-label": t(language, 'signin.close'), onClick: onClose, style: closeButtonStyle, children: _jsx(IconClose, {}) }), _jsx("p", { style: eyebrowStyle, children: "Universal ID" }), _jsx("h2", { style: titleStyle, children: title }), _jsx("p", { style: introStyle, children: t(language, 'signin.intro') }), mode !== 'reset' && (_jsxs("div", { style: { marginTop: 18 }, children: [_jsx(OAuthButtons, { onProvider: onProvider, busyProvider: oauthBusy, disabled: busy, labelFor: (p) => t(language, p === 'google' ? 'signin.continue_google' : 'signin.continue_microsoft'), dividerLabel: t(language, 'signin.or_email'), note: isAnonymous ? t(language, 'signin.trial_carries') : null }), oauthError && (_jsx("div", { style: oauthErrorStyle, children: collisionProvider ? (_jsxs(_Fragment, { children: [_jsx("p", { style: { margin: 0, fontWeight: 700 }, children: t(language, 'signin.collision_title') }), _jsx("p", { style: { margin: '4px 0 0', fontWeight: 400 }, children: t(language, 'signin.collision_body') }), _jsx("button", { type: "button", onClick: () => onAbandonTrial(collisionProvider), style: collisionButtonStyle, children: t(language, 'signin.collision_cta') })] })) : (_jsx("p", { style: { margin: 0 }, children: isManualLinkingDisabled(oauthError)
195
+ }, children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": title, style: cardStyle, children: [_jsx("button", { type: "button", "aria-label": t(language, 'signin.close'), onClick: onClose, style: closeButtonStyle, children: _jsx(IconClose, {}) }), _jsx("p", { style: eyebrowStyle, children: "Universal ID" }), _jsx("h2", { style: titleStyle, children: title }), _jsx("p", { style: introStyle, children: t(language, 'signin.intro') }), mode !== 'reset' && (_jsx("p", { style: unifiedNoteStyle, children: t(language, 'signin.unified_note') })), mode !== 'reset' && isAnonymous && (_jsx("p", { style: trialChoiceStyle, children: t(language, 'signin.trial_choice') })), mode !== 'reset' && (_jsxs("div", { style: { marginTop: 18 }, children: [_jsx(OAuthButtons, { onProvider: onProvider, busyProvider: oauthBusy, disabled: busy, labelFor: (p) => t(language, p === 'google' ? 'signin.continue_google' : 'signin.continue_microsoft'), dividerLabel: t(language, 'signin.or_email'), note: isAnonymous ? t(language, 'signin.trial_carries') : null }), oauthError && (_jsx("div", { style: oauthErrorStyle, children: collisionProvider ? (_jsxs(_Fragment, { children: [_jsx("p", { style: { margin: 0, fontWeight: 700 }, children: t(language, 'signin.collision_title') }), _jsx("p", { style: { margin: '4px 0 0', fontWeight: 400 }, children: t(language, 'signin.collision_body') }), _jsx("button", { type: "button", onClick: () => onAbandonTrial(collisionProvider), style: collisionButtonStyle, children: t(language, 'signin.collision_cta') })] })) : (_jsx("p", { style: { margin: 0 }, children: isManualLinkingDisabled(oauthError)
186
196
  ? t(language, 'signin.link_unavailable')
187
- : oauthError.message })) }))] })), _jsxs("form", { onSubmit: submit, style: { marginTop: 18 }, children: [_jsxs("label", { style: labelStyle, children: [t(language, 'signin.email'), _jsx("input", { ref: emailRef, type: "email", value: email, onChange: (e) => setEmail(e.target.value), autoComplete: "email", required: true, style: inputStyle(!canHover) })] }), mode !== 'reset' && (_jsxs("label", { style: { ...labelStyle, marginTop: 12 }, children: [t(language, 'signin.password'), _jsx("input", { type: "password", value: password, onChange: (e) => setPassword(e.target.value), autoComplete: mode === 'signin' ? 'current-password' : 'new-password', required: true, style: inputStyle(!canHover) })] })), error && _jsx("p", { style: errorStyle, children: error }), info && _jsx("p", { style: infoStyle, children: info }), _jsx("button", { type: "submit", disabled: busy || !email.trim() || (mode !== 'reset' && !password), style: {
197
+ : oauthError.message })) }))] })), _jsxs("form", { onSubmit: submit, style: { marginTop: 18 }, children: [_jsxs("label", { style: labelStyle, children: [t(language, 'signin.email'), _jsx("input", { ref: emailRef, type: "email", value: email, onChange: (e) => setEmail(e.target.value), autoComplete: "email", required: true, style: inputStyle(!canHover) })] }), mode !== 'reset' && (_jsxs("label", { style: { ...labelStyle, marginTop: 12 }, children: [t(language, 'signin.password'), _jsx("input", { type: "password", value: password, onChange: (e) => setPassword(e.target.value),
198
+ // One box for both, so this is a returning user's password far
199
+ // more often than a new one — and a manager that offers to fill
200
+ // it beats one that offers to generate a replacement.
201
+ autoComplete: "current-password", required: true, style: inputStyle(!canHover) })] })), error && _jsx("p", { style: errorStyle, children: error }), info && _jsx("p", { style: infoStyle, children: info }), accountExists && (_jsxs("div", { style: oauthErrorStyle, children: [_jsx("p", { style: { margin: 0, fontWeight: 700 }, children: t(language, 'signin.exists_title') }), _jsx("p", { style: { margin: '4px 0 0', fontWeight: 400 }, children: t(language, 'signin.exists_body') }), _jsx("button", { type: "button", onClick: () => switchMode('reset'), style: collisionButtonStyle, children: t(language, 'signin.exists_cta') })] })), _jsx("button", { type: "submit", disabled: busy || !email.trim() || (mode !== 'reset' && !password), style: {
188
202
  ...submitStyle,
189
203
  ...(busy || !email.trim() || (mode !== 'reset' && !password)
190
204
  ? { opacity: 0.6, cursor: 'default' }
191
205
  : null),
192
- }, children: cta })] }), _jsxs("div", { style: footerStyle, children: [mode === 'signin' && (_jsxs(_Fragment, { children: [_jsx(FooterRow, { prompt: t(language, 'signin.no_account'), action: t(language, 'signin.create_one'), onClick: () => switchMode('signup') }), _jsx(FooterRow, { prompt: "", action: t(language, 'signin.forgot'), onClick: () => switchMode('reset') })] })), mode !== 'signin' && (_jsx(FooterRow, { prompt: t(language, 'signin.have_account'), action: t(language, 'signin.cta_signin'), onClick: () => switchMode('signin') })), _jsxs("p", { style: manageStyle, children: [t(language, 'signin.manage'), ' ', _jsx("a", { href: hub, target: "_blank", rel: "noreferrer", style: manageLinkStyle, children: hub.replace(/^https?:\/\//, '') })] })] })] }) }), document.body);
206
+ }, children: cta })] }), _jsxs("div", { style: footerStyle, children: [mode !== 'reset' ? (_jsx(FooterRow, { prompt: "", action: t(language, 'signin.forgot'), onClick: () => switchMode('reset') })) : (_jsx(FooterRow, { prompt: t(language, 'signin.have_account'), action: t(language, 'signin.cta_signin'), onClick: () => switchMode('signin') })), _jsxs("p", { style: manageStyle, children: [t(language, 'signin.manage'), ' ', _jsx("a", { href: hub, target: "_blank", rel: "noreferrer", style: manageLinkStyle, children: hub.replace(/^https?:\/\//, '') })] })] })] }) }), document.body);
193
207
  }
194
208
  function FooterRow({ prompt, action, onClick, }) {
195
209
  return (_jsxs("div", { style: footerRowStyle, children: [_jsx("span", { children: prompt }), _jsx("button", { type: "button", onClick: onClick, style: footerLinkStyle, children: action })] }));
@@ -262,6 +276,25 @@ const introStyle = {
262
276
  color: '#475569',
263
277
  lineHeight: 1.5,
264
278
  };
279
+ const trialChoiceStyle = {
280
+ margin: '8px 0 0',
281
+ padding: '8px 10px',
282
+ borderRadius: 8,
283
+ border: '1px solid #fde68a',
284
+ background: '#fffbeb',
285
+ fontSize: 12,
286
+ lineHeight: 1.5,
287
+ color: '#78350f',
288
+ };
289
+ // The one line of copy that explains why there is no "create an account" tab.
290
+ // Deliberately quieter than the intro: it answers a question most people never
291
+ // think to ask, and only matters to the ones who go looking for the missing tab.
292
+ const unifiedNoteStyle = {
293
+ margin: '8px 0 0',
294
+ fontSize: 12,
295
+ color: '#64748b',
296
+ lineHeight: 1.5,
297
+ };
265
298
  const labelStyle = {
266
299
  display: 'block',
267
300
  fontSize: 11,