@drawnagency/primitives 0.1.104 → 0.1.106

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 (104) hide show
  1. package/dist/auth/cookies.d.ts +21 -1
  2. package/dist/auth/cookies.d.ts.map +1 -1
  3. package/dist/auth/index.d.ts +2 -1
  4. package/dist/auth/index.d.ts.map +1 -1
  5. package/dist/auth/index.js +3 -1
  6. package/dist/auth/types.d.ts +28 -0
  7. package/dist/auth/types.d.ts.map +1 -1
  8. package/dist/{chunk-PTOLUMGV.js → chunk-4RNF2DRG.js} +1 -0
  9. package/dist/{chunk-MUTHF2GT.js → chunk-5IZ2KTMU.js} +2 -2
  10. package/dist/{chunk-LZKVV4K2.js → chunk-6P4CJCXB.js} +7 -1
  11. package/dist/{chunk-CZLYECHC.js → chunk-AB3XVXI3.js} +4 -4
  12. package/dist/chunk-B7VBSE5X.js +12 -0
  13. package/dist/{chunk-BGHWUJFV.js → chunk-BOZUEKWL.js} +107 -171
  14. package/dist/{chunk-TGNS7D4F.js → chunk-CPTFFLK2.js} +1 -1
  15. package/dist/{chunk-26ALJO4K.js → chunk-D6TLUVOP.js} +1 -1
  16. package/dist/{chunk-EM5DFHDZ.js → chunk-GEENI3OC.js} +13 -4
  17. package/dist/chunk-GGXZZ77Z.js +70 -0
  18. package/dist/{chunk-EWNDBKYK.js → chunk-LUAI5DWR.js} +1 -1
  19. package/dist/chunk-NLQ5F3RQ.js +43 -0
  20. package/dist/{chunk-X4PRBGB3.js → chunk-QLBHERK6.js} +9 -9
  21. package/dist/{chunk-3COSXTOY.js → chunk-XBYJQ5RS.js} +1 -1
  22. package/dist/{chunk-CXQWLG6X.js → chunk-Z7VXESB6.js} +18 -18
  23. package/dist/{chunk-WA6QPDJI.js → chunk-ZHHJVKU7.js} +6 -6
  24. package/dist/collab/rebase.js +2 -1
  25. package/dist/components/chat/ChatPanel.d.ts.map +1 -1
  26. package/dist/components/chat/ChatWidget.d.ts.map +1 -1
  27. package/dist/components/docfile/DocFileOverlay.d.ts.map +1 -1
  28. package/dist/components/docfile/DocFilePane.d.ts +4 -3
  29. package/dist/components/docfile/DocFilePane.d.ts.map +1 -1
  30. package/dist/components/editor/SectionOrderingModal.d.ts.map +1 -1
  31. package/dist/components/editor/index.js +8 -7
  32. package/dist/components/primitives/index.js +7 -6
  33. package/dist/components/sections/brand-guide.js +8 -7
  34. package/dist/components/sections/register-schemas.js +13 -12
  35. package/dist/components/sections/register.js +13 -12
  36. package/dist/components/shared/Navigation.d.ts +16 -1
  37. package/dist/components/shared/Navigation.d.ts.map +1 -1
  38. package/dist/components/shared/SectionSummaryRow.d.ts +24 -0
  39. package/dist/components/shared/SectionSummaryRow.d.ts.map +1 -0
  40. package/dist/components/shell/AudienceAddForm.d.ts +4 -1
  41. package/dist/components/shell/AudienceAddForm.d.ts.map +1 -1
  42. package/dist/components/shell/AudienceDetailsPanel.d.ts +28 -0
  43. package/dist/components/shell/AudienceDetailsPanel.d.ts.map +1 -0
  44. package/dist/components/shell/AudienceRow.d.ts +15 -1
  45. package/dist/components/shell/AudienceRow.d.ts.map +1 -1
  46. package/dist/components/shell/CredentialList.d.ts +18 -0
  47. package/dist/components/shell/CredentialList.d.ts.map +1 -0
  48. package/dist/components/shell/EditorShell.d.ts.map +1 -1
  49. package/dist/components/shell/SiteSettingsViewerAccess.d.ts.map +1 -1
  50. package/dist/components/shell/ViewerLoginForm.d.ts +5 -1
  51. package/dist/components/shell/ViewerLoginForm.d.ts.map +1 -1
  52. package/dist/index.js +47 -29
  53. package/dist/lib/audience-overview.d.ts +53 -0
  54. package/dist/lib/audience-overview.d.ts.map +1 -0
  55. package/dist/lib/audience-secret.d.ts +11 -0
  56. package/dist/lib/audience-secret.d.ts.map +1 -0
  57. package/dist/lib/audience-secret.js +70 -0
  58. package/dist/lib/events.d.ts +3 -0
  59. package/dist/lib/events.d.ts.map +1 -1
  60. package/dist/lib/index-ops.js +3 -2
  61. package/dist/lib/index.js +13 -12
  62. package/dist/lib/nav.d.ts.map +1 -1
  63. package/dist/lib/thumb-views.d.ts +17 -0
  64. package/dist/lib/thumb-views.d.ts.map +1 -0
  65. package/dist/media/index.js +4 -3
  66. package/dist/schemas/audience.d.ts +29 -0
  67. package/dist/schemas/audience.d.ts.map +1 -1
  68. package/dist/schemas/audience.js +24 -0
  69. package/dist/schemas/auth.d.ts +1 -0
  70. package/dist/schemas/auth.d.ts.map +1 -1
  71. package/dist/schemas/auth.js +1 -1
  72. package/dist/schemas/index.js +28 -12
  73. package/dist/schemas/site-config.d.ts +1 -1
  74. package/dist/schemas/site-config.d.ts.map +1 -1
  75. package/dist/types/database.d.ts +59 -5
  76. package/dist/types/database.d.ts.map +1 -1
  77. package/package.json +9 -1
  78. package/src/auth/cookies.ts +37 -4
  79. package/src/auth/index.ts +2 -1
  80. package/src/auth/types.ts +32 -0
  81. package/src/components/chat/ChatPanel.tsx +4 -2
  82. package/src/components/chat/ChatWidget.tsx +4 -1
  83. package/src/components/docfile/DocFileOverlay.tsx +28 -2
  84. package/src/components/docfile/DocFilePane.tsx +4 -3
  85. package/src/components/editor/SectionOrderingModal.tsx +8 -73
  86. package/src/components/shared/Navigation.tsx +113 -7
  87. package/src/components/shared/SectionSummaryRow.tsx +73 -0
  88. package/src/components/shell/AudienceAddForm.tsx +18 -9
  89. package/src/components/shell/AudienceDetailsPanel.tsx +263 -0
  90. package/src/components/shell/AudienceRow.tsx +55 -13
  91. package/src/components/shell/CredentialList.tsx +285 -0
  92. package/src/components/shell/EditorShell.tsx +94 -4
  93. package/src/components/shell/SiteSettingsViewerAccess.tsx +57 -6
  94. package/src/components/shell/ViewerLoginForm.tsx +35 -15
  95. package/src/lib/audience-overview.ts +110 -0
  96. package/src/lib/audience-secret.ts +99 -0
  97. package/src/lib/events.ts +3 -0
  98. package/src/lib/nav.ts +6 -2
  99. package/src/lib/thumb-views.ts +28 -0
  100. package/src/schemas/audience.ts +52 -0
  101. package/src/schemas/auth.ts +6 -0
  102. package/src/schemas/site-config.ts +1 -1
  103. package/src/types/database.ts +59 -5
  104. package/dist/chunk-ZDQ3TT47.js +0 -30
@@ -5,7 +5,10 @@ interface Props {
5
5
  password: string;
6
6
  }) => Promise<void>;
7
7
  onCancel: () => void;
8
+ /** Credential mode: an audience has no password of its own — access comes from
9
+ * the named sign-ins added to it afterwards, so the field is hidden. */
10
+ requirePassword?: boolean;
8
11
  }
9
- export declare function AudienceAddForm({ onSubmit, onCancel }: Props): import("react/jsx-runtime").JSX.Element;
12
+ export declare function AudienceAddForm({ onSubmit, onCancel, requirePassword }: Props): import("react/jsx-runtime").JSX.Element;
10
13
  export {};
11
14
  //# sourceMappingURL=AudienceAddForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudienceAddForm.d.ts","sourceRoot":"","sources":["../../../src/components/shell/AudienceAddForm.tsx"],"names":[],"mappings":"AAOA,UAAU,KAAK;IACb,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnG,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAID,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,2CA+E5D"}
1
+ {"version":3,"file":"AudienceAddForm.d.ts","sourceRoot":"","sources":["../../../src/components/shell/AudienceAddForm.tsx"],"names":[],"mappings":"AAOA,UAAU,KAAK;IACb,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnG,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;6EACyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAID,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAsB,EAAE,EAAE,KAAK,2CAqFpF"}
@@ -0,0 +1,28 @@
1
+ import type { AudienceOverview } from "../../lib/audience-overview";
2
+ /** One audience plus its resolved availability. Built server-side. */
3
+ export interface AudienceDetail {
4
+ name: string;
5
+ displayName: string;
6
+ color: string | null;
7
+ isDefault: boolean;
8
+ hasPassword: boolean;
9
+ /** Named sign-ins that grant this audience. Empty in `.env`/audience mode. */
10
+ credentials: Array<{
11
+ username: string;
12
+ label: string | null;
13
+ }>;
14
+ overview: AudienceOverview;
15
+ }
16
+ interface Props {
17
+ audiences: AudienceDetail[];
18
+ /** False when the auth provider cannot store a reversible password at all. */
19
+ revealSupported: boolean;
20
+ }
21
+ /**
22
+ * The Audience Details page body: who can see what, and what password to share.
23
+ * Reachable by editors and the site's default audience (the client), so the
24
+ * client can hand a new partner access without going through us.
25
+ */
26
+ export declare function AudienceDetailsPanel({ audiences, revealSupported }: Props): import("react/jsx-runtime").JSX.Element;
27
+ export default AudienceDetailsPanel;
28
+ //# sourceMappingURL=AudienceDetailsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudienceDetailsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/shell/AudienceDetailsPanel.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,6BAA6B,CAAC;AAElF,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAC/D,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,UAAU,KAAK;IACb,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAwND;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,KAAK,2CAgBzE;AAED,eAAe,oBAAoB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Audience } from "../../auth/types";
2
+ import type { ViewerCredential } from "../../schemas/audience";
2
3
  interface Props {
3
4
  audience: Audience;
4
5
  isDefault: boolean;
@@ -9,7 +10,20 @@ interface Props {
9
10
  password?: string;
10
11
  }) => Promise<void>;
11
12
  onDelete: () => Promise<void>;
13
+ /** Named sign-ins for this audience. Undefined in `.env`/audience mode, where
14
+ * the row keeps its single audience-level password field. */
15
+ credentials?: ViewerCredential[];
16
+ credentialActions?: {
17
+ create: (data: {
18
+ username: string;
19
+ label: string | null;
20
+ password: string;
21
+ }) => Promise<void>;
22
+ setPassword: (username: string, password: string) => Promise<void>;
23
+ setLabel: (username: string, label: string | null) => Promise<void>;
24
+ delete: (username: string) => Promise<void>;
25
+ };
12
26
  }
13
- export declare function AudienceRow({ audience, isDefault, canMutate, onSave, onDelete, }: Props): import("react/jsx-runtime").JSX.Element;
27
+ export declare function AudienceRow({ audience, isDefault, canMutate, onSave, onDelete, credentials, credentialActions, }: Props): import("react/jsx-runtime").JSX.Element;
14
28
  export {};
15
29
  //# sourceMappingURL=AudienceRow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudienceRow.d.ts","sourceRoot":"","sources":["../../../src/components/shell/AudienceRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMjD,UAAU,KAAK;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAID,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,EACN,QAAQ,GACT,EAAE,KAAK,2CAmJP"}
1
+ {"version":3,"file":"AudienceRow.d.ts","sourceRoot":"","sources":["../../../src/components/shell/AudienceRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,UAAU,KAAK;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B;kEAC8D;IAC9D,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE;QAClB,MAAM,EAAE,CAAC,IAAI,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9F,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACnE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7C,CAAC;CACH;AAID,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,EACN,QAAQ,EACR,WAAW,EACX,iBAAiB,GAClB,EAAE,KAAK,2CAgLP"}
@@ -0,0 +1,18 @@
1
+ import type { ViewerCredential } from "../../schemas/audience";
2
+ interface Props {
3
+ audienceName: string;
4
+ credentials: ViewerCredential[];
5
+ canMutate: boolean;
6
+ onCreate: (data: {
7
+ username: string;
8
+ label: string | null;
9
+ password: string;
10
+ }) => Promise<void>;
11
+ onSetPassword: (username: string, password: string) => Promise<void>;
12
+ onSetLabel: (username: string, label: string | null) => Promise<void>;
13
+ onDelete: (username: string) => Promise<void>;
14
+ }
15
+ /** The named sign-ins for one audience, inside its Site Settings row. */
16
+ export declare function CredentialList({ audienceName, credentials, canMutate, onCreate, onSetPassword, onSetLabel, onDelete, }: Props): import("react/jsx-runtime").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=CredentialList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CredentialList.d.ts","sourceRoot":"","sources":["../../../src/components/shell/CredentialList.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAuOD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,EAC7B,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,GACpF,EAAE,KAAK,2CA6BP"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAejD,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyDtF,OAAO,KAAK,EAAE,eAAe,EAA2D,MAAM,oBAAoB,CAAC;AA2CnH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA2BxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAIhB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAIhE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAKjC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,EACX,sBAA8B,EAC9B,eAAe,GAChB,EAAE,KAAK,2CAg3DP;AAwED;6EAC6E;AAC7E,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,EACvC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,eAAe,EAAE,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK/B"}
1
+ {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAejD,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyDtF,OAAO,KAAK,EAAE,eAAe,EAA2D,MAAM,oBAAoB,CAAC;AA+CnH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA2BxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAIhB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAIhE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAKjC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,EACX,sBAA8B,EAC9B,eAAe,GAChB,EAAE,KAAK,2CAs8DP;AAwED;6EAC6E;AAC7E,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,EACvC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,eAAe,EAAE,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"SiteSettingsViewerAccess.d.ts","sourceRoot":"","sources":["../../../src/components/shell/SiteSettingsViewerAccess.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOjD,UAAU,KAAK;IACb,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,wBAAwB,CAAC,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,EAAE,KAAK,2CA4JxG"}
1
+ {"version":3,"file":"SiteSettingsViewerAccess.d.ts","sourceRoot":"","sources":["../../../src/components/shell/SiteSettingsViewerAccess.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQjD,UAAU,KAAK;IACb,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;CACpD;AAQD,wBAAgB,wBAAwB,CAAC,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,EAAE,KAAK,2CAwMxG"}
@@ -1,11 +1,15 @@
1
1
  interface Props {
2
+ /** Audience mode only. Empty (and unused) in credential mode — the page must
3
+ * not ship an audience list to a login form that doesn't offer the choice. */
2
4
  audiences: Array<{
3
5
  name: string;
4
6
  displayName: string;
5
7
  hasPassword?: boolean;
6
8
  }>;
9
+ /** Set by the page from the auth provider's capability, never by the client. */
10
+ mode?: "audience" | "credentials";
7
11
  next?: string | null;
8
12
  }
9
- export declare function ViewerLoginForm({ audiences, next }: Props): import("react/jsx-runtime").JSX.Element;
13
+ export declare function ViewerLoginForm({ audiences, mode, next }: Props): import("react/jsx-runtime").JSX.Element;
10
14
  export {};
11
15
  //# sourceMappingURL=ViewerLoginForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewerLoginForm.d.ts","sourceRoot":"","sources":["../../../src/components/shell/ViewerLoginForm.tsx"],"names":[],"mappings":"AAMA,UAAU,KAAK;IACb,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,2CAuFzD"}
1
+ {"version":3,"file":"ViewerLoginForm.d.ts","sourceRoot":"","sources":["../../../src/components/shell/ViewerLoginForm.tsx"],"names":[],"mappings":"AAOA,UAAU,KAAK;IACb;mFAC+E;IAC/E,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/E,gFAAgF;IAChF,IAAI,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,IAAiB,EAAE,IAAI,EAAE,EAAE,KAAK,2CAsG5E"}
package/dist/index.js CHANGED
@@ -9,9 +9,10 @@ import {
9
9
  setSessionCookie,
10
10
  signAudienceToken,
11
11
  signSessionToken,
12
+ verifyAudienceClaims,
12
13
  verifyAudienceToken,
13
14
  verifySessionToken
14
- } from "./chunk-EM5DFHDZ.js";
15
+ } from "./chunk-GEENI3OC.js";
15
16
  import {
16
17
  ASSET_CACHE_CONTROL,
17
18
  DOCUMENT_CACHE_CONTROL,
@@ -54,19 +55,27 @@ import {
54
55
  resolveMedia,
55
56
  sanitizeMediaName,
56
57
  setMediaProvider
57
- } from "./chunk-3COSXTOY.js";
58
+ } from "./chunk-XBYJQ5RS.js";
58
59
  import {
59
- AudienceColorSchema,
60
- AudienceNameSchema,
61
- MediaGridOptionsSchema,
62
- slugifyAudienceName
63
- } from "./chunk-ZDQ3TT47.js";
60
+ MediaGridOptionsSchema
61
+ } from "./chunk-B7VBSE5X.js";
64
62
  import {
65
63
  AudienceSchema,
66
64
  RoleSchema,
67
65
  SessionSchema,
68
66
  SiteUserSchema
69
- } from "./chunk-LZKVV4K2.js";
67
+ } from "./chunk-6P4CJCXB.js";
68
+ import {
69
+ AudienceColorSchema,
70
+ AudienceNameSchema,
71
+ NormalizedUsernameSchema,
72
+ VIEWER_PASSWORD_MIN_LENGTH,
73
+ ViewerCredentialSchema,
74
+ ViewerPasswordSchema,
75
+ ViewerUsernameSchema,
76
+ normalizeUsername,
77
+ slugifyAudienceName
78
+ } from "./chunk-NLQ5F3RQ.js";
70
79
  import {
71
80
  DEFAULT_LINK,
72
81
  LinkTargetSchema,
@@ -105,18 +114,8 @@ import {
105
114
  safeRedirect,
106
115
  suggestAccessibleOn,
107
116
  wcagLevel
108
- } from "./chunk-CZLYECHC.js";
109
- import {
110
- isSameOriginRequest,
111
- requireSessionSecret,
112
- safeNextPath
113
- } from "./chunk-S2L3BPLS.js";
114
- import {
115
- ensureSanitizer,
116
- generateNavLinks,
117
- sanitizeHtml,
118
- toSectionId
119
- } from "./chunk-72CG6AA2.js";
117
+ } from "./chunk-AB3XVXI3.js";
118
+ import "./chunk-5BM2Y3NJ.js";
120
119
  import {
121
120
  curatedIcons,
122
121
  getIcon
@@ -126,10 +125,21 @@ import {
126
125
  darkModeEvent,
127
126
  editModeEvent,
128
127
  navChangeEvent
129
- } from "./chunk-PTOLUMGV.js";
128
+ } from "./chunk-4RNF2DRG.js";
129
+ import {
130
+ ensureSanitizer,
131
+ generateNavLinks,
132
+ sanitizeHtml,
133
+ toSectionId
134
+ } from "./chunk-72CG6AA2.js";
130
135
  import {
131
136
  cn
132
137
  } from "./chunk-7EOSDFS3.js";
138
+ import {
139
+ isSameOriginRequest,
140
+ requireSessionSecret,
141
+ safeNextPath
142
+ } from "./chunk-S2L3BPLS.js";
133
143
  import {
134
144
  env
135
145
  } from "./chunk-WKZ7OENC.js";
@@ -140,8 +150,7 @@ import {
140
150
  navEntries,
141
151
  pagesInNavOrder,
142
152
  reconcileNav
143
- } from "./chunk-TGNS7D4F.js";
144
- import "./chunk-5BM2Y3NJ.js";
153
+ } from "./chunk-CPTFFLK2.js";
145
154
  import {
146
155
  NavEntrySchema,
147
156
  NavFileSchema
@@ -164,27 +173,29 @@ import {
164
173
  import {
165
174
  ChatbotConfigSchema,
166
175
  ChatbotTaskSchema,
167
- FontNameSchema,
168
- HexColorSchema,
169
176
  ImageManifestSchema,
170
177
  IndexSchema,
171
178
  MediaConfigSchema,
172
179
  MediaFolderSchema,
173
180
  MediaItemSchema,
174
- MediaReferenceSchema,
175
181
  PageSchema,
176
182
  PageStatusSchema,
177
183
  RESERVED_SLUGS,
178
184
  SLUG_RE,
179
185
  SectionMetaSchema,
180
- SingleMediaReferenceSchema,
181
186
  SiteConfigSchema,
182
187
  StatusSchema,
183
- TextLineSchema,
184
188
  VariantSchema,
185
189
  normalizeSiteIndex
186
- } from "./chunk-BGHWUJFV.js";
190
+ } from "./chunk-BOZUEKWL.js";
187
191
  import "./chunk-FM4M4Q2W.js";
192
+ import {
193
+ FontNameSchema,
194
+ HexColorSchema,
195
+ MediaReferenceSchema,
196
+ SingleMediaReferenceSchema,
197
+ TextLineSchema
198
+ } from "./chunk-GGXZZ77Z.js";
188
199
  import "./chunk-NSCT3AMV.js";
189
200
  import "./chunk-JSBRDJBE.js";
190
201
  export {
@@ -230,6 +241,7 @@ export {
230
241
  MediaReferenceSchema,
231
242
  NavEntrySchema,
232
243
  NavFileSchema,
244
+ NormalizedUsernameSchema,
233
245
  PageSchema,
234
246
  PageStatusSchema,
235
247
  ProcessingQueue,
@@ -250,7 +262,11 @@ export {
250
262
  StorageConflictError,
251
263
  TakeoverMessageSchema,
252
264
  TextLineSchema,
265
+ VIEWER_PASSWORD_MIN_LENGTH,
253
266
  VariantSchema,
267
+ ViewerCredentialSchema,
268
+ ViewerPasswordSchema,
269
+ ViewerUsernameSchema,
254
270
  accentVarValue,
255
271
  audiencePasses,
256
272
  buildGoogleFontsUrl,
@@ -301,6 +317,7 @@ export {
301
317
  navChangeEvent,
302
318
  navEntries,
303
319
  normalizeSiteIndex,
320
+ normalizeUsername,
304
321
  onPrimaryVarValue,
305
322
  pagesInNavOrder,
306
323
  primaryVarValue,
@@ -327,6 +344,7 @@ export {
327
344
  slugifyAudienceName,
328
345
  suggestAccessibleOn,
329
346
  toSectionId,
347
+ verifyAudienceClaims,
330
348
  verifyAudienceToken,
331
349
  verifySessionToken,
332
350
  wcagLevel,
@@ -0,0 +1,53 @@
1
+ /**
2
+ * What each audience can actually see. Powers the Audience Details page, which
3
+ * answers "if I give a partner this password, what do they get?".
4
+ *
5
+ * Pure and view-agnostic: section labels/thumbnails are resolved by the caller
6
+ * (they need the section registry and the media provider) and passed in, so this
7
+ * stays trivially testable and ships no registry into viewer JS.
8
+ */
9
+ import type { SiteIndex } from "../schemas/site-config";
10
+ import type { ThumbView } from "./thumb-views";
11
+ /** Caller-resolved presentation for one section. */
12
+ export interface SectionDisplay {
13
+ label: string;
14
+ typeLabel: string;
15
+ thumbnails: ThumbView[];
16
+ }
17
+ export interface OverviewSection extends SectionDisplay {
18
+ id: string;
19
+ available: boolean;
20
+ /** Live-but-draft sections are invisible to EVERY audience, not just this one. */
21
+ draft: boolean;
22
+ }
23
+ export interface OverviewPage {
24
+ id: string;
25
+ title: string;
26
+ slug: string;
27
+ href: string;
28
+ /** Live but off the sidebar — reachable by URL, so it counts as available. */
29
+ hiddenFromNav: boolean;
30
+ /** none = the page itself is gated away; partial = page in, some sections out. */
31
+ availability: "full" | "partial" | "none";
32
+ sections: OverviewSection[];
33
+ }
34
+ export interface AudienceOverview {
35
+ audience: string;
36
+ pages: OverviewPage[];
37
+ pagesAvailable: number;
38
+ pagesTotal: number;
39
+ sectionsAvailable: number;
40
+ sectionsTotal: number;
41
+ }
42
+ /**
43
+ * Availability for one audience across the whole site.
44
+ *
45
+ * Archived pages are excluded outright (nobody can reach them). Draft sections
46
+ * are listed as unavailable but flagged, so a page reading "3 of 8" is not
47
+ * mistaken for an access problem.
48
+ *
49
+ * The cascade matters: a section whose own access allows this audience is still
50
+ * unavailable inside a page that gates them out. Page access wins.
51
+ */
52
+ export declare function buildAudienceOverview(index: SiteIndex, display: (sectionId: string) => SectionDisplay, audience: string): AudienceOverview;
53
+ //# sourceMappingURL=audience-overview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience-overview.d.ts","sourceRoot":"","sources":["../../src/lib/audience-overview.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC;IACvB,kFAAkF;IAClF,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,cAAc,EAC9C,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAgDlB"}
@@ -0,0 +1,11 @@
1
+ /** Seal a plaintext password into `v1.<iv>.<ciphertext>` (base64url parts). */
2
+ export declare function sealAudiencePassword(password: string): Promise<string>;
3
+ /**
4
+ * Open a sealed password, or null when it cannot be trusted — unknown version,
5
+ * malformed parts, tampered ciphertext (GCM auth failure), or a rotated
6
+ * SESSION_SECRET. Callers treat null as "not revealable" and never as an error;
7
+ * they must ALSO verify the result against the bcrypt hash, since a valid seal
8
+ * can still be stale (a password changed by a writer that skipped the cipher).
9
+ */
10
+ export declare function openAudiencePassword(sealed: string | null | undefined): Promise<string | null>;
11
+ //# sourceMappingURL=audience-secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience-secret.d.ts","sourceRoot":"","sources":["../../src/lib/audience-secret.ts"],"names":[],"mappings":"AAgEA,+EAA+E;AAC/E,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5E;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBpG"}
@@ -0,0 +1,70 @@
1
+ import {
2
+ requireSessionSecret
3
+ } from "../chunk-S2L3BPLS.js";
4
+ import "../chunk-WKZ7OENC.js";
5
+ import "../chunk-JSBRDJBE.js";
6
+
7
+ // src/lib/audience-secret.ts
8
+ var INFO = "drawnagency:audience-password:v1";
9
+ var VERSION = "v1";
10
+ var IV_BYTES = 12;
11
+ var enc = new TextEncoder();
12
+ var dec = new TextDecoder();
13
+ function toBase64Url(bytes) {
14
+ let binary = "";
15
+ for (const b of bytes) binary += String.fromCharCode(b);
16
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
17
+ }
18
+ function fromBase64Url(value) {
19
+ const padded = value.replace(/-/g, "+").replace(/_/g, "/");
20
+ const binary = atob(padded + "=".repeat((4 - padded.length % 4) % 4));
21
+ const bytes = new Uint8Array(binary.length);
22
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
23
+ return bytes;
24
+ }
25
+ async function deriveKey() {
26
+ const base = await crypto.subtle.importKey(
27
+ "raw",
28
+ requireSessionSecret(),
29
+ "HKDF",
30
+ false,
31
+ ["deriveKey"]
32
+ );
33
+ return crypto.subtle.deriveKey(
34
+ { name: "HKDF", hash: "SHA-256", salt: new Uint8Array(0), info: enc.encode(INFO) },
35
+ base,
36
+ { name: "AES-GCM", length: 256 },
37
+ false,
38
+ ["encrypt", "decrypt"]
39
+ );
40
+ }
41
+ async function sealAudiencePassword(password) {
42
+ const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES));
43
+ const ciphertext = await crypto.subtle.encrypt(
44
+ { name: "AES-GCM", iv },
45
+ await deriveKey(),
46
+ enc.encode(password)
47
+ );
48
+ return `${VERSION}.${toBase64Url(iv)}.${toBase64Url(new Uint8Array(ciphertext))}`;
49
+ }
50
+ async function openAudiencePassword(sealed) {
51
+ if (!sealed) return null;
52
+ const parts = sealed.split(".");
53
+ if (parts.length !== 3 || parts[0] !== VERSION) return null;
54
+ try {
55
+ const iv = fromBase64Url(parts[1]);
56
+ if (iv.byteLength !== IV_BYTES) return null;
57
+ const plain = await crypto.subtle.decrypt(
58
+ { name: "AES-GCM", iv },
59
+ await deriveKey(),
60
+ fromBase64Url(parts[2])
61
+ );
62
+ return dec.decode(plain);
63
+ } catch {
64
+ return null;
65
+ }
66
+ }
67
+ export {
68
+ openAudiencePassword,
69
+ sealAudiencePassword
70
+ };
@@ -34,4 +34,7 @@ export declare const editorDirtyEvent: TypedEvent<{
34
34
  }>;
35
35
  export declare const siteNavChangeEvent: TypedEvent<SiteNav>;
36
36
  export declare const pageSelectEvent: TypedEvent<string>;
37
+ /** Nav → EditorShell: open the Audience Details surface inside the editor, so
38
+ * editors keep the toolbar instead of navigating out to the /audiences route. */
39
+ export declare const audienceDetailsEvent: TypedEvent<void>;
37
40
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/lib/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE9C,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACnD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAW1D;AAED,eAAO,MAAM,aAAa;gBAA6B,OAAO;EAAqB,CAAC;AACpF,eAAO,MAAM,cAAc,uBAA0C,CAAC;AACtE,eAAO,MAAM,aAAa,oBAAsC,CAAC;AACjE,eAAO,MAAM,mBAAmB,oBAAwC,CAAC;AACzE,eAAO,MAAM,kBAAkB;SAAsB,MAAM;UAAQ,MAAM;EAAqB,CAAC;AAC/F;;2EAE2E;AAC3E,eAAO,MAAM,mBAAmB;SAAsB,MAAM;UAAQ,MAAM;EAAsB,CAAC;AACjG;;4BAE4B;AAC5B,eAAO,MAAM,yBAAyB;aAA0B,MAAM;EAA6B,CAAC;AACpG;8EAC8E;AAC9E,eAAO,MAAM,gBAAgB;uBAAoC,OAAO;EAAmB,CAAC;AAC5F,eAAO,MAAM,kBAAkB,qBAA2C,CAAC;AAC3E,eAAO,MAAM,eAAe,oBAAoC,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/lib/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE9C,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACnD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAW1D;AAED,eAAO,MAAM,aAAa;gBAA6B,OAAO;EAAqB,CAAC;AACpF,eAAO,MAAM,cAAc,uBAA0C,CAAC;AACtE,eAAO,MAAM,aAAa,oBAAsC,CAAC;AACjE,eAAO,MAAM,mBAAmB,oBAAwC,CAAC;AACzE,eAAO,MAAM,kBAAkB;SAAsB,MAAM;UAAQ,MAAM;EAAqB,CAAC;AAC/F;;2EAE2E;AAC3E,eAAO,MAAM,mBAAmB;SAAsB,MAAM;UAAQ,MAAM;EAAsB,CAAC;AACjG;;4BAE4B;AAC5B,eAAO,MAAM,yBAAyB;aAA0B,MAAM;EAA6B,CAAC;AACpG;8EAC8E;AAC9E,eAAO,MAAM,gBAAgB;uBAAoC,OAAO;EAAmB,CAAC;AAC5F,eAAO,MAAM,kBAAkB,qBAA2C,CAAC;AAC3E,eAAO,MAAM,eAAe,oBAAoC,CAAC;AACjE;kFACkF;AAClF,eAAO,MAAM,oBAAoB,kBAA2C,CAAC"}
@@ -11,14 +11,15 @@ import {
11
11
  setGroupStartCollapsed,
12
12
  slugifyPageSlug,
13
13
  uniquePageSlug
14
- } from "../chunk-TGNS7D4F.js";
14
+ } from "../chunk-CPTFFLK2.js";
15
15
  import {
16
16
  IndexSchema,
17
17
  PageStatusSchema,
18
18
  RESERVED_SLUGS,
19
19
  SLUG_RE
20
- } from "../chunk-BGHWUJFV.js";
20
+ } from "../chunk-BOZUEKWL.js";
21
21
  import "../chunk-FM4M4Q2W.js";
22
+ import "../chunk-GGXZZ77Z.js";
22
23
  import "../chunk-JSBRDJBE.js";
23
24
 
24
25
  // src/lib/index-ops.ts
package/dist/lib/index.js CHANGED
@@ -18,14 +18,8 @@ import {
18
18
  safeRedirect,
19
19
  suggestAccessibleOn,
20
20
  wcagLevel
21
- } from "../chunk-CZLYECHC.js";
22
- import "../chunk-S2L3BPLS.js";
23
- import {
24
- ensureSanitizer,
25
- generateNavLinks,
26
- sanitizeHtml,
27
- toSectionId
28
- } from "../chunk-72CG6AA2.js";
21
+ } from "../chunk-AB3XVXI3.js";
22
+ import "../chunk-5BM2Y3NJ.js";
29
23
  import {
30
24
  curatedIcons,
31
25
  getIcon
@@ -35,10 +29,17 @@ import {
35
29
  darkModeEvent,
36
30
  editModeEvent,
37
31
  navChangeEvent
38
- } from "../chunk-PTOLUMGV.js";
32
+ } from "../chunk-4RNF2DRG.js";
33
+ import {
34
+ ensureSanitizer,
35
+ generateNavLinks,
36
+ sanitizeHtml,
37
+ toSectionId
38
+ } from "../chunk-72CG6AA2.js";
39
39
  import {
40
40
  cn
41
41
  } from "../chunk-7EOSDFS3.js";
42
+ import "../chunk-S2L3BPLS.js";
42
43
  import {
43
44
  env
44
45
  } from "../chunk-WKZ7OENC.js";
@@ -49,8 +50,7 @@ import {
49
50
  navEntries,
50
51
  pagesInNavOrder,
51
52
  reconcileNav
52
- } from "../chunk-TGNS7D4F.js";
53
- import "../chunk-5BM2Y3NJ.js";
53
+ } from "../chunk-CPTFFLK2.js";
54
54
  import "../chunk-REDDTTGJ.js";
55
55
  import "../chunk-TZQPOR5A.js";
56
56
  import {
@@ -64,8 +64,9 @@ import {
64
64
  registerSchema,
65
65
  registerSection
66
66
  } from "../chunk-VKAGMEKE.js";
67
- import "../chunk-BGHWUJFV.js";
67
+ import "../chunk-BOZUEKWL.js";
68
68
  import "../chunk-FM4M4Q2W.js";
69
+ import "../chunk-GGXZZ77Z.js";
69
70
  import "../chunk-NSCT3AMV.js";
70
71
  import "../chunk-JSBRDJBE.js";
71
72
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../../src/lib/nav.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAchD;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EAAE,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,EAAE,CAqDX;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED;;qBAEqB;AACrB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;iFACiF;AACjF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,EAAE,CAAC;CACpB;AAED;2CAC2C;AAC3C,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,MAAM,YAAY,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC,GAAG,YAAY,GAAG,eAAe,CAAC;AAE7F,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iFAAiF;IACjF,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;;2BAKuB;IACvB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B,GAAG,OAAO,CA8DV"}
1
+ {"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../../src/lib/nav.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAchD;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EAAE,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,EAAE,CAqDX;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED;;qBAEqB;AACrB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;iFACiF;AACjF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,EAAE,CAAC;CACpB;AAED;2CAC2C;AAC3C,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,MAAM,YAAY,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC,GAAG,YAAY,GAAG,eAAe,CAAC;AAE7F,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iFAAiF;IACjF,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;;2BAKuB;IACvB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B,GAAG,OAAO,CAkEV"}
@@ -0,0 +1,17 @@
1
+ import type { Thumbnail } from "./registry";
2
+ import type { MediaManifest } from "../media/types";
3
+ /**
4
+ * A section thumbnail with its media reference already resolved to a URL, so the
5
+ * component rendering it needs neither the registry nor the media provider. The
6
+ * Audience Details page resolves these server-side for exactly that reason.
7
+ */
8
+ export type ThumbView = {
9
+ kind: "color";
10
+ value: string;
11
+ } | {
12
+ kind: "image";
13
+ src: string | null;
14
+ alt: string;
15
+ };
16
+ export declare function toThumbViews(thumbnails: Thumbnail[], manifest: MediaManifest): ThumbView[];
17
+ //# sourceMappingURL=thumb-views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumb-views.d.ts","sourceRoot":"","sources":["../../src/lib/thumb-views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAUvD,wBAAgB,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,SAAS,EAAE,CAM1F"}
@@ -18,16 +18,17 @@ import {
18
18
  resolveMedia,
19
19
  sanitizeMediaName,
20
20
  setMediaProvider
21
- } from "../chunk-3COSXTOY.js";
22
- import "../chunk-TGNS7D4F.js";
21
+ } from "../chunk-XBYJQ5RS.js";
22
+ import "../chunk-CPTFFLK2.js";
23
23
  import {
24
24
  ImageManifestSchema,
25
25
  MediaConfigSchema,
26
26
  MediaFolderSchema,
27
27
  MediaItemSchema,
28
28
  VariantSchema
29
- } from "../chunk-BGHWUJFV.js";
29
+ } from "../chunk-BOZUEKWL.js";
30
30
  import "../chunk-FM4M4Q2W.js";
31
+ import "../chunk-GGXZZ77Z.js";
31
32
  import "../chunk-JSBRDJBE.js";
32
33
  export {
33
34
  BAKED_MEDIA_KEYS,
@@ -3,6 +3,35 @@ export declare const AudienceNameSchema: z.ZodString;
3
3
  export declare const AudienceColorSchema: z.ZodNullable<z.ZodString>;
4
4
  export type AudienceName = z.infer<typeof AudienceNameSchema>;
5
5
  export type AudienceColor = z.infer<typeof AudienceColorSchema>;
6
+ /**
7
+ * A viewer sign-in name. Looser than an audience slug — dots are allowed, so
8
+ * `agency.jane` works — but still constrained enough to be typed correctly over
9
+ * the phone. Always lowercased before storage and lookup, so `Agency2` and
10
+ * `agency2` are the same login.
11
+ */
12
+ export declare const ViewerUsernameSchema: z.ZodString;
13
+ /** Normalize a typed username for storage and lookup. */
14
+ export declare function normalizeUsername(input: string): string;
15
+ /**
16
+ * Wire-facing username: lowercased and trimmed BEFORE validation, so `Agency4`
17
+ * is accepted and stored as `agency4` rather than 400-ing on a case difference.
18
+ * Everything else the base schema rejects still fails.
19
+ */
20
+ export declare const NormalizedUsernameSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
21
+ /** Minimum for a NEW credential password. Deliberately stricter than the
22
+ * audience passwords it replaces (which allowed a single character). */
23
+ export declare const VIEWER_PASSWORD_MIN_LENGTH = 8;
24
+ export declare const ViewerPasswordSchema: z.ZodString;
25
+ /** A credential as it travels to the editor and the Audience Details page.
26
+ * Never carries the hash or the sealed copy. */
27
+ export declare const ViewerCredentialSchema: z.ZodObject<{
28
+ username: z.ZodString;
29
+ label: z.ZodNullable<z.ZodString>;
30
+ audienceName: z.ZodString;
31
+ createdAt: z.ZodString;
32
+ }, z.core.$strip>;
33
+ export type ViewerUsername = z.infer<typeof ViewerUsernameSchema>;
34
+ export type ViewerCredential = z.infer<typeof ViewerCredentialSchema>;
6
35
  /**
7
36
  * Convert a friendly display string into an audience slug.
8
37
  * Lowercases, replaces non-alphanumeric runs with single dashes,