@cellarnode/ui 0.199.1 → 0.200.0

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 (58) hide show
  1. package/dist/portfolio/include-in-matching-toggle.d.ts +30 -0
  2. package/dist/portfolio/include-in-matching-toggle.d.ts.map +1 -0
  3. package/dist/portfolio/include-in-matching-toggle.js +39 -0
  4. package/dist/portfolio/include-in-matching-toggle.js.map +1 -0
  5. package/dist/portfolio/index.d.ts +4 -0
  6. package/dist/portfolio/index.d.ts.map +1 -1
  7. package/dist/portfolio/index.js +2 -0
  8. package/dist/portfolio/index.js.map +1 -1
  9. package/dist/portfolio/not-matching-badge.d.ts +15 -0
  10. package/dist/portfolio/not-matching-badge.d.ts.map +1 -0
  11. package/dist/portfolio/not-matching-badge.js +13 -0
  12. package/dist/portfolio/not-matching-badge.js.map +1 -0
  13. package/dist/portfolio/product-grid-section.d.ts.map +1 -1
  14. package/dist/portfolio/product-grid-section.js +6 -4
  15. package/dist/portfolio/product-grid-section.js.map +1 -1
  16. package/dist/portfolio/product-list-section.d.ts.map +1 -1
  17. package/dist/portfolio/product-list-section.js +11 -5
  18. package/dist/portfolio/product-list-section.js.map +1 -1
  19. package/dist/portfolio/types.d.ts +6 -0
  20. package/dist/portfolio/types.d.ts.map +1 -1
  21. package/dist/product-editor/tabs/product-status-tab.d.ts.map +1 -1
  22. package/dist/product-editor/tabs/product-status-tab.js +22 -9
  23. package/dist/product-editor/tabs/product-status-tab.js.map +1 -1
  24. package/dist/product-editor/types.d.ts +14 -0
  25. package/dist/product-editor/types.d.ts.map +1 -1
  26. package/dist/upload-link/client.d.ts +21 -0
  27. package/dist/upload-link/client.d.ts.map +1 -0
  28. package/dist/upload-link/client.js +141 -0
  29. package/dist/upload-link/client.js.map +1 -0
  30. package/dist/upload-link/copy.d.ts +83 -0
  31. package/dist/upload-link/copy.d.ts.map +1 -0
  32. package/dist/upload-link/copy.js +132 -0
  33. package/dist/upload-link/copy.js.map +1 -0
  34. package/dist/upload-link/fixtures.d.ts +17 -0
  35. package/dist/upload-link/fixtures.d.ts.map +1 -0
  36. package/dist/upload-link/fixtures.js +63 -0
  37. package/dist/upload-link/fixtures.js.map +1 -0
  38. package/dist/upload-link/flow.d.ts +79 -0
  39. package/dist/upload-link/flow.d.ts.map +1 -0
  40. package/dist/upload-link/flow.js +107 -0
  41. package/dist/upload-link/flow.js.map +1 -0
  42. package/dist/upload-link/index.d.ts +10 -0
  43. package/dist/upload-link/index.d.ts.map +1 -0
  44. package/dist/upload-link/index.js +10 -0
  45. package/dist/upload-link/index.js.map +1 -0
  46. package/dist/upload-link/types.d.ts +58 -0
  47. package/dist/upload-link/types.d.ts.map +1 -0
  48. package/dist/upload-link/types.js +17 -0
  49. package/dist/upload-link/types.js.map +1 -0
  50. package/dist/upload-link/upload-link-page.d.ts +41 -0
  51. package/dist/upload-link/upload-link-page.d.ts.map +1 -0
  52. package/dist/upload-link/upload-link-page.js +184 -0
  53. package/dist/upload-link/upload-link-page.js.map +1 -0
  54. package/dist/upload-link/use-upload-link.d.ts +28 -0
  55. package/dist/upload-link/use-upload-link.d.ts.map +1 -0
  56. package/dist/upload-link/use-upload-link.js +155 -0
  57. package/dist/upload-link/use-upload-link.js.map +1 -0
  58. package/package.json +5 -1
@@ -0,0 +1,107 @@
1
+ export const initialPhase = { kind: "loading" };
2
+ const linkOf = (p) => ("link" in p ? p.link : null);
3
+ /** The phase a freshly read status puts the page in. */
4
+ export function phaseForStatus(link, current) {
5
+ switch (link.status) {
6
+ case "open":
7
+ // Keep an in-flight upload on screen; the status read must not bounce it back to the picker.
8
+ if (current.kind === "uploading")
9
+ return current;
10
+ return { kind: "ready", link, error: current.kind === "ready" ? current.error : null };
11
+ case "redeemed":
12
+ case "processing":
13
+ return { kind: "processing", link };
14
+ case "done":
15
+ return { kind: "done", link };
16
+ case "failed":
17
+ return { kind: "failed", link, code: link.failureCode };
18
+ case "expired":
19
+ case "cancelled":
20
+ return { kind: "closed", reason: "expired" };
21
+ }
22
+ }
23
+ export function reduce(phase, event) {
24
+ switch (event.type) {
25
+ case "auth":
26
+ if (event.auth === "signed-out")
27
+ return { kind: "sign-in" };
28
+ if (event.auth === "checking")
29
+ return phase.kind === "sign-in" || phase.kind === "loading" ? { kind: "loading" } : phase;
30
+ return phase.kind === "sign-in" ? { kind: "loading" } : phase;
31
+ case "status":
32
+ return phaseForStatus(event.link, phase);
33
+ case "status-error": {
34
+ const { status, code } = event.error;
35
+ if (status === 0)
36
+ return { kind: "unavailable", reason: "network" };
37
+ if (code === "UPLOAD_LINKS_DISABLED")
38
+ return { kind: "unavailable", reason: "disabled" };
39
+ if (status === 401)
40
+ return { kind: "sign-in" };
41
+ if (status === 403 && code === "UPLOAD_LINK_WRONG_ACCOUNT")
42
+ return { kind: "wrong-account" };
43
+ if (status === 404)
44
+ return { kind: "unavailable", reason: "not-found" };
45
+ return { kind: "unavailable", reason: "network" };
46
+ }
47
+ case "file-invalid":
48
+ return phase.kind === "ready" ? { ...phase, error: event.message } : phase;
49
+ case "upload-start":
50
+ return phase.kind === "ready"
51
+ ? {
52
+ kind: "uploading",
53
+ link: phase.link,
54
+ fileName: event.fileName,
55
+ stage: "preparing",
56
+ progress: 0,
57
+ }
58
+ : phase;
59
+ case "upload-progress":
60
+ return phase.kind === "uploading"
61
+ ? { ...phase, stage: "sending", progress: Math.min(1, Math.max(0, event.progress)) }
62
+ : phase;
63
+ case "redeem-error": {
64
+ const { status, code } = event.error;
65
+ const link = linkOf(phase);
66
+ if (status === 403 && code === "UPLOAD_LINK_WRONG_ACCOUNT")
67
+ return { kind: "wrong-account" };
68
+ if (code === "UPLOAD_LINKS_DISABLED")
69
+ return { kind: "unavailable", reason: "disabled" };
70
+ if (status === 410)
71
+ return { kind: "closed", reason: "expired" };
72
+ if (status === 409)
73
+ return { kind: "closed", reason: "used" };
74
+ if (status === 401)
75
+ return { kind: "sign-in" };
76
+ if (status === 0)
77
+ return { kind: "unavailable", reason: "network" };
78
+ // The declaration was refused BEFORE the link was spent (type, size, entitlement, target): the person can pick again.
79
+ if (link && phase.kind === "uploading")
80
+ return { kind: "ready", link, error: event.message };
81
+ return phase;
82
+ }
83
+ case "upload-error":
84
+ // The bytes were refused after the link was spent (decode gate, size mismatch): the link is used up.
85
+ return { kind: "failed", link: linkOf(phase), code: event.code };
86
+ case "uploaded":
87
+ return phase.kind === "uploading"
88
+ ? { kind: "processing", link: { ...phase.link, status: "processing", step: "checking" } }
89
+ : phase;
90
+ case "reset":
91
+ return initialPhase;
92
+ }
93
+ }
94
+ /** The four named steps of the processing view, in order. */
95
+ export const STEP_ORDER = ["received", "checking", "saving", "done"];
96
+ /** Which step is current for a status, so the list can mark earlier ones complete and later ones waiting. */
97
+ export function currentStep(link) {
98
+ if (link.status === "done")
99
+ return "done";
100
+ if (link.step === "saving")
101
+ return "saving";
102
+ if (link.step === "checking")
103
+ return "checking";
104
+ return "received";
105
+ }
106
+ export const isTerminal = (p) => p.kind === "done" || p.kind === "failed" || p.kind === "closed";
107
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/upload-link/flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `@cellarnode/ui/upload-link`: the page behind an assistant's upload link (CEL-2435). See `UploadLinkPage`.
3
+ */
4
+ export { createUploadLinkClient, type CreateUploadLinkClientOptions } from "./client.js";
5
+ export { DEFAULT_CONSTRAINTS, DEFAULT_COPY, type UploadLinkCopy } from "./copy.js";
6
+ export { currentStep, type Phase, reduce as reduceUploadLinkPhase } from "./flow.js";
7
+ export { UploadLinkPage, type UploadLinkPageProps } from "./upload-link-page.js";
8
+ export { type UploadHandle, UploadLinkApiError, type UploadLinkAuthState, type UploadLinkClient, type UploadLinkPurpose, type UploadLinkStatus, type UploadLinkStatusName, } from "./types.js";
9
+ export { useUploadLink } from "./use-upload-link.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upload-link/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,KAAK,6BAA6B,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,IAAI,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EACL,KAAK,YAAY,EACjB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `@cellarnode/ui/upload-link`: the page behind an assistant's upload link (CEL-2435). See `UploadLinkPage`.
3
+ */
4
+ export { createUploadLinkClient } from "./client.js";
5
+ export { DEFAULT_CONSTRAINTS, DEFAULT_COPY } from "./copy.js";
6
+ export { currentStep, reduce as reduceUploadLinkPhase } from "./flow.js";
7
+ export { UploadLinkPage } from "./upload-link-page.js";
8
+ export { UploadLinkApiError, } from "./types.js";
9
+ export { useUploadLink } from "./use-upload-link.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/upload-link/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAsC,MAAM,UAAU,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAuB,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,WAAW,EAAc,MAAM,IAAI,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAClF,OAAO,EAAE,cAAc,EAA4B,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAEL,kBAAkB,GAMnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Upload links (CEL-2435): the contract between the upload page and the backend's `/upload-links` routes. The page never
3
+ * sees an agent: a person opens the link from their assistant, signs in, and sends one file. These types mirror the routes;
4
+ * `createUploadLinkClient` implements them over HTTP, and Storybook / tests implement them in memory.
5
+ */
6
+ export type UploadLinkPurpose = "offer_attachment" | "lab_report" | "brand_asset" | "org_document" | "label_reference_image";
7
+ export type UploadLinkStatusName = "open" | "redeemed" | "processing" | "done" | "failed" | "expired" | "cancelled";
8
+ /** `GET /upload-links/:id` (owner only). Metadata: never the file name or content. */
9
+ export interface UploadLinkStatus {
10
+ linkId: string;
11
+ status: UploadLinkStatusName;
12
+ /** "checking" or "saving" while processing. */
13
+ step: string | null;
14
+ purpose: UploadLinkPurpose;
15
+ target: {
16
+ type: string;
17
+ id: string;
18
+ };
19
+ sizeBytes: number | null;
20
+ mimeType: string | null;
21
+ /** Ids only (attachmentId, labReportId, assetId, documentId). */
22
+ result: Record<string, unknown> | null;
23
+ failureCode: string | null;
24
+ expiresAt: string;
25
+ }
26
+ /** What `POST /upload-links/:id/redeem` answers: where to PUT the bytes and the ONE-TIME credential for that PUT. */
27
+ export interface UploadHandle {
28
+ sessionId: string;
29
+ uploadUrl: string;
30
+ /** The one-time upload credential. It goes to `uploadUrl` and nowhere else; the page never stores or logs it. */
31
+ headers: {
32
+ Authorization: string;
33
+ };
34
+ maxBytes: number;
35
+ allowedTypes: string[];
36
+ }
37
+ export interface UploadLinkClient {
38
+ getStatus(linkId: string, signal?: AbortSignal): Promise<UploadLinkStatus>;
39
+ /** Claim the link for this file (the declaration is checked before the link is spent). */
40
+ redeem(linkId: string, file: {
41
+ fileName: string;
42
+ mimeType: string;
43
+ sizeBytes: number;
44
+ }, signal?: AbortSignal): Promise<UploadHandle>;
45
+ /** Send the bytes with progress (0 to 1). Resolves when the backend has received and checked them. */
46
+ upload(handle: UploadHandle, file: File, onProgress: (fraction: number) => void, signal?: AbortSignal): Promise<void>;
47
+ /** Tell the backend the bytes are in: it starts checking and saving. Answers the current status. */
48
+ start(linkId: string): Promise<UploadLinkStatus>;
49
+ }
50
+ /** A typed failure from the backend: HTTP status plus its machine `code` (`UPLOAD_LINK_WRONG_ACCOUNT`, ...). */
51
+ export declare class UploadLinkApiError extends Error {
52
+ readonly status: number;
53
+ readonly code: string | null;
54
+ constructor(status: number, code: string | null, message: string);
55
+ }
56
+ /** The signed-in state of the host app. The host owns sign-in (each dashboard has its own origin and login). */
57
+ export type UploadLinkAuthState = "checking" | "signed-out" | "signed-in";
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/upload-link/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,cAAc,GACd,uBAAuB,CAAC;AAE5B,MAAM,MAAM,oBAAoB,GAC5B,MAAM,GACN,UAAU,GACV,YAAY,GACZ,MAAM,GACN,QAAQ,GACR,SAAS,GACT,WAAW,CAAC;AAEhB,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;IAC7B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qHAAqH;AACrH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iHAAiH;IACjH,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3E,0FAA0F;IAC1F,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC/D,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,sGAAsG;IACtG,MAAM,CACJ,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACtC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,oGAAoG;IACpG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAClD;AAED,gHAAgH;AAChH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;gBACjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM;CAMjE;AAED,gHAAgH;AAChH,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Upload links (CEL-2435): the contract between the upload page and the backend's `/upload-links` routes. The page never
3
+ * sees an agent: a person opens the link from their assistant, signs in, and sends one file. These types mirror the routes;
4
+ * `createUploadLinkClient` implements them over HTTP, and Storybook / tests implement them in memory.
5
+ */
6
+ /** A typed failure from the backend: HTTP status plus its machine `code` (`UPLOAD_LINK_WRONG_ACCOUNT`, ...). */
7
+ export class UploadLinkApiError extends Error {
8
+ status;
9
+ code;
10
+ constructor(status, code, message) {
11
+ super(message);
12
+ this.name = "UploadLinkApiError";
13
+ this.status = status;
14
+ this.code = code;
15
+ }
16
+ }
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/upload-link/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+DH,gHAAgH;AAChH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,MAAM,CAAS;IACf,IAAI,CAAgB;IAC7B,YAAY,MAAc,EAAE,IAAmB,EAAE,OAAe;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ import * as React from "react";
2
+ import { type UploadLinkCopy } from "./copy.js";
3
+ import { type Phase } from "./flow.js";
4
+ import type { UploadLinkAuthState, UploadLinkClient, UploadLinkPurpose, UploadLinkStatus } from "./types.js";
5
+ export interface UploadLinkPageProps {
6
+ /** The link id from the URL (`/upload/$linkId`). It is not a secret: it only works for the account that made it. */
7
+ linkId: string;
8
+ /** The backend client. Use `createUploadLinkClient({ baseUrl, fetch })` in the app. */
9
+ client: UploadLinkClient;
10
+ /** Whether the person is signed in. The host app owns sign-in; this page only asks for it. */
11
+ auth: UploadLinkAuthState;
12
+ /** Called when the person presses Sign in. The host should return here after login (the same URL). */
13
+ onSignIn: () => void;
14
+ /** Override any string (every visible word is here, for translation). */
15
+ copy?: Partial<UploadLinkCopy>;
16
+ /** Override the pre-checks per purpose. The backend stays the authority. */
17
+ constraints?: Partial<Record<UploadLinkPurpose, {
18
+ allowedTypes: string[];
19
+ maxBytes: number;
20
+ }>>;
21
+ /** Name what the file is for ("Offer Barolo 2019 for Nordic Wines"). Without it the page shows a generic line. */
22
+ describeTarget?: (link: UploadLinkStatus) => React.ReactNode;
23
+ /** Where to see the saved result, if the host can build it from the ids. Return null for none. */
24
+ resultHref?: (link: UploadLinkStatus) => string | null;
25
+ /** Poll interval of the processing view, ms. Default 2000. */
26
+ pollIntervalMs?: number;
27
+ className?: string;
28
+ }
29
+ /** The announcement for a phase. Upload progress changes the text only at 25% steps so a screen reader is not flooded. */
30
+ export declare function statusLine(phase: Phase, copy: UploadLinkCopy): string;
31
+ /**
32
+ * The page a person lands on from an assistant's upload link (CEL-2435). One file goes straight to CellarNode and is checked,
33
+ * saved and applied by the backend; it never passes through the assistant. The page owns no sign-in: pass `auth` and `onSignIn`
34
+ * from the host app. States: checking, sign in, wrong account, unavailable, expired or used, ready (drop zone), uploading
35
+ * (progress), processing (named steps, polled), done, failed.
36
+ *
37
+ * Mount it under `/upload/$linkId` in each dashboard inside the host's `<main>`:
38
+ * `<UploadLinkPage linkId={linkId} client={client} auth={auth} onSignIn={goToLogin} />`.
39
+ */
40
+ export declare function UploadLinkPage({ linkId, client, auth, onSignIn, copy: copyOverride, constraints, describeTarget, resultHref, pollIntervalMs, className, }: UploadLinkPageProps): import("react/jsx-runtime").JSX.Element;
41
+ //# sourceMappingURL=upload-link-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-link-page.d.ts","sourceRoot":"","sources":["../../src/upload-link/upload-link-page.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,OAAO,EAA8C,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AACzF,OAAO,EAAe,KAAK,KAAK,EAA6B,MAAM,QAAQ,CAAC;AAC5E,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,mBAAmB;IAClC,oHAAoH;IACpH,MAAM,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,MAAM,EAAE,gBAAgB,CAAC;IACzB,8FAA8F;IAC9F,IAAI,EAAE,mBAAmB,CAAC;IAC1B,sGAAsG;IACtG,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,yEAAyE;IACzE,IAAI,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC/F,kHAAkH;IAClH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7D,kGAAkG;IAClG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,GAAG,IAAI,CAAC;IACvD,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuMD,0HAA0H;AAC1H,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAqCrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,IAAI,EAAE,YAAY,EAClB,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,SAAS,GACV,EAAE,mBAAmB,2CAoOrB"}
@@ -0,0 +1,184 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { AlertTriangle, CheckCircle2, CircleDashed, Clock, FileUp, Loader2, LogIn, PlugZap, ShieldAlert, UserX, } from "lucide-react";
4
+ import { cn } from "../lib/utils.js";
5
+ import { DEFAULT_COPY, fmt, formatBytes, TYPE_NAMES } from "./copy.js";
6
+ import { currentStep, STEP_ORDER } from "./flow.js";
7
+ import { useUploadLink } from "./use-upload-link.js";
8
+ const focusRing = "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring";
9
+ const button = "inline-flex min-h-10 items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm/5 font-medium text-primary-foreground transition-colors duration-[var(--duration-micro)] hover:bg-primary/90 disabled:opacity-50";
10
+ const quietButton = "inline-flex min-h-10 items-center justify-center gap-2 rounded-lg bg-muted px-4 py-2 text-sm/5 font-medium text-foreground transition-colors duration-[var(--duration-micro)] hover:bg-muted/70";
11
+ const halo = {
12
+ brand: "bg-[var(--tone-brand-soft)] text-[var(--tone-brand-fg)]",
13
+ success: "bg-[var(--tone-success-soft)] text-[var(--tone-success-fg)]",
14
+ warning: "bg-[var(--tone-warning-soft)] text-[var(--tone-warning-fg)]",
15
+ danger: "bg-[var(--tone-danger-soft)] text-[var(--tone-danger-fg)]",
16
+ info: "bg-[var(--tone-info-soft)] text-[var(--tone-info-fg)]",
17
+ neutral: "bg-[var(--tone-neutral-soft)] text-[var(--tone-neutral-fg)]",
18
+ };
19
+ function Message({ tone, icon, title, children, actions, }) {
20
+ return (_jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [_jsx("span", { className: cn("flex size-12 items-center justify-center rounded-full", halo[tone]), "aria-hidden": true, children: icon }), _jsx("h2", { tabIndex: -1, "data-focus-target": true, className: "text-lg/7 font-semibold text-foreground outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", children: title }), children ? _jsx("p", { className: "max-w-prose text-sm/6 text-muted-foreground", children: children }) : null, actions ? _jsx("div", { className: "mt-1 flex flex-wrap justify-center gap-2", children: actions }) : null] }));
21
+ }
22
+ function DropZone({ link, copy, error, limits, onFile, }) {
23
+ const inputId = React.useId();
24
+ const hintId = React.useId();
25
+ const errorId = React.useId();
26
+ const [dragging, setDragging] = React.useState(false);
27
+ const types = limits.allowedTypes.map((t) => TYPE_NAMES[t] ?? t).join(", ");
28
+ const accept = limits.allowedTypes.join(",");
29
+ const take = (files) => {
30
+ const file = files?.[0];
31
+ if (file)
32
+ onFile(file);
33
+ };
34
+ return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("label", { htmlFor: inputId, onDragEnter: (e) => {
35
+ e.preventDefault();
36
+ setDragging(true);
37
+ }, onDragOver: (e) => e.preventDefault(), onDragLeave: (e) => {
38
+ if (!e.currentTarget.contains(e.relatedTarget))
39
+ setDragging(false);
40
+ }, onDrop: (e) => {
41
+ e.preventDefault();
42
+ setDragging(false);
43
+ take(e.dataTransfer.files);
44
+ }, className: cn("flex min-h-48 cursor-pointer flex-col items-center justify-center gap-2 rounded-2xl border-2 px-4 py-8 text-center transition-colors duration-[var(--duration-micro)]", "has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-ring", dragging
45
+ ? "border-solid border-primary bg-[var(--tone-brand-soft)]"
46
+ : "border-dashed border-border bg-muted/30 hover:bg-muted/50"), children: [_jsx(FileUp, { "aria-hidden": true, className: "size-8 text-muted-foreground" }), _jsx("span", { className: "text-base/6 font-medium text-foreground", children: dragging ? copy.dropActive : copy.dropTitle }), _jsx("span", { className: "text-sm/6 text-muted-foreground", children: _jsx("span", { className: "font-medium text-foreground underline underline-offset-2", children: copy.dropOrBrowse }) }), _jsx("input", { id: inputId, type: "file", className: "sr-only", accept: accept, "aria-describedby": cn(hintId, error ? errorId : ""), "aria-invalid": error ? true : undefined, "data-testid": "upload-link-input", onChange: (e) => {
47
+ take(e.currentTarget.files);
48
+ e.currentTarget.value = "";
49
+ } })] }), _jsxs("p", { id: hintId, className: "text-xs/5 text-muted-foreground", children: [_jsxs("span", { className: "font-medium", children: [copy.typesLabel, ":"] }), " ", types, ".", " ", fmt(copy.sizeLabel, { size: formatBytes(limits.maxBytes) }), ". ", copy.neverNote] }), error ? (_jsxs("p", { id: errorId, role: "alert", className: "flex items-start gap-2 rounded-lg bg-[var(--tone-danger-soft)] px-3 py-2 text-sm/5 text-[var(--tone-danger-fg)]", children: [_jsx(AlertTriangle, { "aria-hidden": true, className: "mt-0.5 size-4 shrink-0" }), _jsxs("span", { children: [_jsxs("span", { className: "sr-only", children: [copy.errorsLabel, ": "] }), error] })] })) : null, _jsx("span", { className: "sr-only", children: link.linkId })] }));
50
+ }
51
+ function Steps({ link, copy }) {
52
+ const names = {
53
+ received: copy.stepWaiting,
54
+ checking: copy.stepChecking,
55
+ saving: copy.stepSaving,
56
+ done: copy.stepDone,
57
+ };
58
+ const now = STEP_ORDER.indexOf(currentStep(link));
59
+ return (_jsx("ol", { "aria-label": copy.stepsLabel, className: "flex flex-col gap-2", children: STEP_ORDER.map((step, i) => {
60
+ const state = i < now ? "complete" : i === now ? "current" : "pending";
61
+ return (_jsxs("li", { "aria-current": state === "current" ? "step" : undefined, className: "flex items-center gap-3 text-sm/6", children: [state === "complete" ? (_jsx(CheckCircle2, { "aria-hidden": true, className: "size-5 shrink-0 text-[var(--tone-success-fg)]" })) : state === "current" ? (_jsx(Loader2, { "aria-hidden": true, className: "size-5 shrink-0 animate-spin text-[var(--tone-brand-fg)] motion-reduce:animate-none" })) : (_jsx(CircleDashed, { "aria-hidden": true, className: "size-5 shrink-0 text-muted-foreground" })), _jsxs("span", { className: cn(state === "pending" ? "text-muted-foreground" : "text-foreground", state === "current" && "font-medium"), children: [names[step], _jsxs("span", { className: "sr-only", children: [" ", "(", state === "complete"
62
+ ? copy.stepComplete
63
+ : state === "current"
64
+ ? copy.stepCurrent
65
+ : copy.stepPending, ")"] })] })] }, step));
66
+ }) }));
67
+ }
68
+ /** The announcement for a phase. Upload progress changes the text only at 25% steps so a screen reader is not flooded. */
69
+ export function statusLine(phase, copy) {
70
+ switch (phase.kind) {
71
+ case "loading":
72
+ return copy.checking;
73
+ case "uploading": {
74
+ if (phase.stage === "preparing")
75
+ return copy.preparing;
76
+ const percent = Math.min(100, Math.floor(phase.progress * 4) * 25);
77
+ return fmt(copy.statusPercent, { name: phase.fileName, percent });
78
+ }
79
+ case "processing":
80
+ return `${copy.processingTitle}: ${{
81
+ received: copy.stepWaiting,
82
+ checking: copy.stepChecking,
83
+ saving: copy.stepSaving,
84
+ done: copy.stepDone,
85
+ }[currentStep(phase.link)]}`;
86
+ case "done":
87
+ return copy.doneTitle;
88
+ case "failed":
89
+ return copy.failedTitle;
90
+ case "closed":
91
+ return phase.reason === "used" ? copy.usedTitle : copy.expiredTitle;
92
+ case "sign-in":
93
+ return copy.signInTitle;
94
+ case "wrong-account":
95
+ return copy.wrongAccountTitle;
96
+ case "unavailable":
97
+ return phase.reason === "disabled"
98
+ ? copy.disabledTitle
99
+ : phase.reason === "network"
100
+ ? copy.networkTitle
101
+ : copy.unavailableTitle;
102
+ case "ready":
103
+ return "";
104
+ }
105
+ }
106
+ /**
107
+ * The page a person lands on from an assistant's upload link (CEL-2435). One file goes straight to CellarNode and is checked,
108
+ * saved and applied by the backend; it never passes through the assistant. The page owns no sign-in: pass `auth` and `onSignIn`
109
+ * from the host app. States: checking, sign in, wrong account, unavailable, expired or used, ready (drop zone), uploading
110
+ * (progress), processing (named steps, polled), done, failed.
111
+ *
112
+ * Mount it under `/upload/$linkId` in each dashboard inside the host's `<main>`:
113
+ * `<UploadLinkPage linkId={linkId} client={client} auth={auth} onSignIn={goToLogin} />`.
114
+ */
115
+ export function UploadLinkPage({ linkId, client, auth, onSignIn, copy: copyOverride, constraints, describeTarget, resultHref, pollIntervalMs, className, }) {
116
+ const copy = React.useMemo(() => ({
117
+ ...DEFAULT_COPY,
118
+ ...copyOverride,
119
+ purposes: { ...DEFAULT_COPY.purposes, ...copyOverride?.purposes },
120
+ targets: { ...DEFAULT_COPY.targets, ...copyOverride?.targets },
121
+ failures: { ...DEFAULT_COPY.failures, ...copyOverride?.failures },
122
+ }), [copyOverride]);
123
+ const titleId = React.useId();
124
+ const { phase, chooseFile, cancel, retry, limitsFor } = useUploadLink({
125
+ linkId,
126
+ client,
127
+ auth,
128
+ copy,
129
+ ...(pollIntervalMs ? { pollIntervalMs } : {}),
130
+ ...(constraints ? { constraints } : {}),
131
+ });
132
+ const link = "link" in phase ? phase.link : null;
133
+ const failureText = (code) => copy.failures[code ?? "default"] ?? copy.failures.default;
134
+ const forWhat = link ? (describeTarget?.(link) ?? copy.targets[link.target.type] ?? null) : null;
135
+ const statusText = statusLine(phase, copy);
136
+ // Move focus to the new state's heading on every transition, so keyboard and screen reader users land on it.
137
+ const bodyRef = React.useRef(null);
138
+ const previousKind = React.useRef(null);
139
+ React.useEffect(() => {
140
+ const before = previousKind.current;
141
+ previousKind.current = phase.kind;
142
+ if (before === null || before === phase.kind)
143
+ return;
144
+ bodyRef.current?.querySelector("[data-focus-target]")?.focus();
145
+ }, [phase.kind]);
146
+ const body = ((p) => {
147
+ switch (p.kind) {
148
+ case "loading":
149
+ return (_jsx(Message, { tone: "neutral", icon: _jsx(Loader2, { className: "size-5 animate-spin motion-reduce:animate-none" }), title: copy.checking }));
150
+ case "sign-in":
151
+ return (_jsx(Message, { tone: "brand", icon: _jsx(LogIn, { className: "size-5" }), title: copy.signInTitle, actions: _jsx("button", { type: "button", onClick: onSignIn, className: cn(button, focusRing), children: copy.signInAction }), children: copy.signInBody }));
152
+ case "wrong-account":
153
+ return (_jsx(Message, { tone: "warning", icon: _jsx(UserX, { className: "size-5" }), title: copy.wrongAccountTitle, children: copy.wrongAccountBody }));
154
+ case "unavailable": {
155
+ const [title, text, icon] = p.reason === "disabled"
156
+ ? [copy.disabledTitle, copy.disabledBody, _jsx(ShieldAlert, { className: "size-5" }, "i")]
157
+ : p.reason === "network"
158
+ ? [copy.networkTitle, copy.networkBody, _jsx(PlugZap, { className: "size-5" }, "i")]
159
+ : [
160
+ copy.unavailableTitle,
161
+ copy.unavailableBody,
162
+ _jsx(AlertTriangle, { className: "size-5" }, "i"),
163
+ ];
164
+ return (_jsx(Message, { tone: p.reason === "disabled" ? "info" : "warning", icon: icon, title: title, actions: p.reason === "network" ? (_jsx("button", { type: "button", onClick: retry, className: cn(quietButton, focusRing), children: copy.retry })) : undefined, children: text }));
165
+ }
166
+ case "closed":
167
+ return (_jsx(Message, { tone: "neutral", icon: _jsx(Clock, { className: "size-5" }), title: p.reason === "used" ? copy.usedTitle : copy.expiredTitle, children: p.reason === "used" ? copy.usedBody : copy.expiredBody }));
168
+ case "ready":
169
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx("h2", { tabIndex: -1, "data-focus-target": true, className: "text-lg/7 font-semibold text-foreground outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", children: copy.readyTitle }), _jsx("p", { className: "text-sm/6 text-muted-foreground", children: copy.readyIntro }), _jsx(DropZone, { link: p.link, copy: copy, error: p.error, limits: limitsFor(p.link.purpose), onFile: (f) => void chooseFile(f) })] }));
170
+ case "uploading":
171
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx("h2", { tabIndex: -1, "data-focus-target": true, className: "text-lg/7 font-semibold text-foreground outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", children: copy.uploadingTitle }), _jsx("p", { className: "text-sm/6 text-muted-foreground", children: p.stage === "preparing" ? copy.preparing : fmt(copy.sending, { name: p.fileName }) }), _jsx("progress", { className: "h-2 w-full overflow-hidden rounded-full [&::-moz-progress-bar]:bg-primary [&::-webkit-progress-bar]:bg-muted [&::-webkit-progress-value]:bg-primary", max: 100, value: Math.round(p.progress * 100), "aria-label": copy.progressLabel }), _jsx("div", { children: _jsx("button", { type: "button", onClick: cancel, className: cn(quietButton, focusRing), children: copy.cancel }) })] }));
172
+ case "processing":
173
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx("h2", { tabIndex: -1, "data-focus-target": true, className: "text-lg/7 font-semibold text-foreground outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", children: copy.processingTitle }), _jsx(Steps, { link: p.link, copy: copy })] }));
174
+ case "done": {
175
+ const href = resultHref?.(p.link) ?? null;
176
+ return (_jsxs(Message, { tone: "success", icon: _jsx(CheckCircle2, { className: "size-5" }), title: copy.doneTitle, actions: href ? (_jsx("a", { href: href, className: cn(button, focusRing), children: copy.viewResult })) : undefined, children: [copy.doneBody, " ", copy.backToAssistant] }));
177
+ }
178
+ case "failed":
179
+ return (_jsxs(Message, { tone: "danger", icon: _jsx(AlertTriangle, { className: "size-5" }), title: copy.failedTitle, children: [failureText(p.code), " ", copy.failedNewLink] }));
180
+ }
181
+ })(phase);
182
+ return (_jsxs("section", { "aria-labelledby": titleId, className: cn("mx-auto flex w-full max-w-lg flex-col gap-6 px-4 py-10", className), children: [_jsxs("header", { className: "flex flex-col gap-1", children: [_jsx("h1", { id: titleId, className: "text-2xl/8 font-semibold text-foreground", children: copy.title }), link ? (_jsxs("p", { className: "text-sm/6 text-muted-foreground", children: [copy.purposes[link.purpose], forWhat ? _jsxs(_Fragment, { children: [" \u00B7 ", forWhat] }) : null] })) : null] }), _jsx("p", { role: "status", "aria-live": "polite", className: "sr-only", children: statusText }), _jsx("div", { ref: bodyRef, className: "rounded-2xl bg-card p-6 shadow-[var(--shadow-soft)] ring-1 ring-border/60", children: body })] }));
183
+ }
184
+ //# sourceMappingURL=upload-link-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-link-page.js","sourceRoot":"","sources":["../../src/upload-link/upload-link-page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { UploadLinkCopy } from "./copy.js";
2
+ import { type UploadLinkAuthState, type UploadLinkClient, type UploadLinkPurpose } from "./types.js";
3
+ export interface UseUploadLinkOptions {
4
+ linkId: string;
5
+ client: UploadLinkClient;
6
+ auth: UploadLinkAuthState;
7
+ copy: UploadLinkCopy;
8
+ /** How often the processing view re-reads the status. Default 2000 ms. */
9
+ pollIntervalMs?: number;
10
+ /** Per-purpose limits shown and pre-checked. The backend re-checks everything. */
11
+ constraints?: Partial<Record<UploadLinkPurpose, {
12
+ allowedTypes: string[];
13
+ maxBytes: number;
14
+ }>>;
15
+ }
16
+ /** Network and flow wiring for the upload page. Returns the current phase and the actions the person can take. */
17
+ export declare function useUploadLink({ linkId, client, auth, copy, pollIntervalMs, constraints, }: UseUploadLinkOptions): {
18
+ phase: import("./flow.js").Phase;
19
+ terminal: boolean;
20
+ chooseFile: (file: File) => Promise<void>;
21
+ cancel: () => void | undefined;
22
+ retry: () => void;
23
+ limitsFor: (purpose: UploadLinkPurpose) => {
24
+ allowedTypes: string[];
25
+ maxBytes: number;
26
+ };
27
+ };
28
+ //# sourceMappingURL=use-upload-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-upload-link.d.ts","sourceRoot":"","sources":["../../src/upload-link/use-upload-link.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG7C,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAChG;AAOD,kHAAkH;AAClH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,cAAqB,EACrB,WAAW,GACZ,EAAE,oBAAoB;;;uBAyHN,IAAI;;;yBAlEP,iBAAiB;;;;EAqG9B"}