@drawnagency/primitives 0.1.57 → 0.1.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"Navigation.d.ts","sourceRoot":"","sources":["../../../src/components/shared/Navigation.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAW,MAAM,eAAe,CAAC;AAOtD,UAAU,KAAK;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACxC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,KAAK,2CAsO/G"}
1
+ {"version":3,"file":"Navigation.d.ts","sourceRoot":"","sources":["../../../src/components/shared/Navigation.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAW,MAAM,eAAe,CAAC;AAOtD,UAAU,KAAK;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACxC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,KAAK,2CAwO/G"}
@@ -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;AAqEjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,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;CACjE;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,GACZ,EAAE,KAAK,2CAg6BP"}
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;AAqEjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,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;CACjE;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,GACZ,EAAE,KAAK,2CAo6BP"}
package/dist/index.js CHANGED
@@ -29,13 +29,15 @@ import {
29
29
  import {
30
30
  AudienceColorSchema,
31
31
  AudienceNameSchema,
32
+ MediaGridOptionsSchema,
33
+ slugifyAudienceName
34
+ } from "./chunk-V7JN2DDU.js";
35
+ import {
32
36
  DEFAULT_LINK,
33
37
  LinkTargetSchema,
34
38
  LinkValueSchema,
35
- MediaGridOptionsSchema,
36
- isSafeHref,
37
- slugifyAudienceName
38
- } from "./chunk-PYWS3MOJ.js";
39
+ isSafeHref
40
+ } from "./chunk-ZU2MKPTG.js";
39
41
  import {
40
42
  AudienceSchema,
41
43
  RoleSchema,
@@ -44,26 +46,28 @@ import {
44
46
  } from "./chunk-LZKVV4K2.js";
45
47
  import {
46
48
  buildGoogleFontsUrl,
47
- cn,
48
49
  createEvent,
49
- curatedIcons,
50
50
  darkModeEvent,
51
51
  deriveContrast,
52
52
  editModeEvent,
53
- ensureSanitizer,
54
53
  formatTimestamp,
55
- generateNavLinks,
56
- getIcon,
57
54
  gridColsClass,
58
55
  loadSiteContent,
59
56
  loadStaticSiteContent,
60
57
  mergeSiteContent,
61
58
  navChangeEvent,
62
- safeRedirect,
59
+ safeRedirect
60
+ } from "./chunk-NTGSA3TI.js";
61
+ import "./chunk-TG43X7JO.js";
62
+ import {
63
+ cn,
64
+ curatedIcons,
65
+ ensureSanitizer,
66
+ generateNavLinks,
67
+ getIcon,
63
68
  sanitizeHtml,
64
69
  toSectionId
65
- } from "./chunk-PRKUXM7E.js";
66
- import "./chunk-TG43X7JO.js";
70
+ } from "./chunk-RFZNNCAS.js";
67
71
  import {
68
72
  isSameOriginRequest,
69
73
  requireSessionSecret,
@@ -108,6 +112,7 @@ import {
108
112
  registerSchema,
109
113
  registerSection
110
114
  } from "./chunk-VKAGMEKE.js";
115
+ import "./chunk-JSBRDJBE.js";
111
116
 
112
117
  // src/storage/types.ts
113
118
  var StorageConflictError = class extends Error {
package/dist/lib/dexie.js CHANGED
@@ -1,3 +1,5 @@
1
+ import "../chunk-JSBRDJBE.js";
2
+
1
3
  // src/lib/dexie.ts
2
4
  import Dexie from "dexie";
3
5
  var EditorDatabase = class extends Dexie {
package/dist/lib/env.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  env
3
3
  } from "../chunk-WKZ7OENC.js";
4
+ import "../chunk-JSBRDJBE.js";
4
5
  export {
5
6
  env
6
7
  };
@@ -9,6 +9,7 @@ export declare const editModeEvent: TypedEvent<{
9
9
  }>;
10
10
  export declare const navChangeEvent: TypedEvent<NavItem[]>;
11
11
  export declare const darkModeEvent: TypedEvent<string>;
12
+ export declare const siteNameChangeEvent: TypedEvent<string>;
12
13
  export declare const historySelectEvent: TypedEvent<{
13
14
  sha: string;
14
15
  date: string;
@@ -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,kBAAkB;SAAsB,MAAM;UAAQ,MAAM;EAAqB,CAAC;AAC/F,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,eAAO,MAAM,kBAAkB,qBAA2C,CAAC;AAC3E,eAAO,MAAM,eAAe,oBAAoC,CAAC"}
package/dist/lib/index.js CHANGED
@@ -1,25 +1,27 @@
1
1
  import {
2
2
  buildGoogleFontsUrl,
3
- cn,
4
3
  createEvent,
5
- curatedIcons,
6
4
  darkModeEvent,
7
5
  deriveContrast,
8
6
  editModeEvent,
9
- ensureSanitizer,
10
7
  formatTimestamp,
11
- generateNavLinks,
12
- getIcon,
13
8
  gridColsClass,
14
9
  loadSiteContent,
15
10
  loadStaticSiteContent,
16
11
  mergeSiteContent,
17
12
  navChangeEvent,
18
- safeRedirect,
13
+ safeRedirect
14
+ } from "../chunk-NTGSA3TI.js";
15
+ import "../chunk-TG43X7JO.js";
16
+ import {
17
+ cn,
18
+ curatedIcons,
19
+ ensureSanitizer,
20
+ generateNavLinks,
21
+ getIcon,
19
22
  sanitizeHtml,
20
23
  toSectionId
21
- } from "../chunk-PRKUXM7E.js";
22
- import "../chunk-TG43X7JO.js";
24
+ } from "../chunk-RFZNNCAS.js";
23
25
  import "../chunk-S2L3BPLS.js";
24
26
  import "../chunk-ICLXLWQ5.js";
25
27
  import "../chunk-DKOUFIP6.js";
@@ -38,6 +40,7 @@ import {
38
40
  registerSchema,
39
41
  registerSection
40
42
  } from "../chunk-VKAGMEKE.js";
43
+ import "../chunk-JSBRDJBE.js";
41
44
  export {
42
45
  buildGoogleFontsUrl,
43
46
  clearRegistry,
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  upgradeLegacySection
3
3
  } from "../chunk-TG43X7JO.js";
4
+ import "../chunk-JSBRDJBE.js";
4
5
  export {
5
6
  upgradeLegacySection
6
7
  };
@@ -11,6 +11,7 @@ import {
11
11
  registerSchema,
12
12
  registerSection
13
13
  } from "../chunk-VKAGMEKE.js";
14
+ import "../chunk-JSBRDJBE.js";
14
15
  export {
15
16
  clearRegistry,
16
17
  createRegistry,
@@ -20,6 +20,7 @@ import {
20
20
  MediaItemSchema,
21
21
  VariantSchema
22
22
  } from "../chunk-DKOUFIP6.js";
23
+ import "../chunk-JSBRDJBE.js";
23
24
  export {
24
25
  EXT_TO_MIME,
25
26
  ImageManifestSchema,
@@ -4,6 +4,7 @@ import {
4
4
  SessionSchema,
5
5
  SiteUserSchema
6
6
  } from "../chunk-LZKVV4K2.js";
7
+ import "../chunk-JSBRDJBE.js";
7
8
  export {
8
9
  AudienceSchema,
9
10
  RoleSchema,
@@ -5,6 +5,7 @@ import {
5
5
  blockDepth,
6
6
  getBlockChildren
7
7
  } from "../chunk-NSCT3AMV.js";
8
+ import "../chunk-JSBRDJBE.js";
8
9
  export {
9
10
  LayoutEnvelopeSchema,
10
11
  MAX_BLOCK_DEPTH,
@@ -1,13 +1,15 @@
1
1
  import {
2
2
  AudienceColorSchema,
3
3
  AudienceNameSchema,
4
+ MediaGridOptionsSchema,
5
+ slugifyAudienceName
6
+ } from "../chunk-V7JN2DDU.js";
7
+ import {
4
8
  DEFAULT_LINK,
5
9
  LinkTargetSchema,
6
10
  LinkValueSchema,
7
- MediaGridOptionsSchema,
8
- isSafeHref,
9
- slugifyAudienceName
10
- } from "../chunk-PYWS3MOJ.js";
11
+ isSafeHref
12
+ } from "../chunk-ZU2MKPTG.js";
11
13
  import {
12
14
  AudienceSchema,
13
15
  RoleSchema,
@@ -40,6 +42,7 @@ import {
40
42
  } from "../chunk-DKOUFIP6.js";
41
43
  import "../chunk-NSCT3AMV.js";
42
44
  import "../chunk-VKAGMEKE.js";
45
+ import "../chunk-JSBRDJBE.js";
43
46
  export {
44
47
  AudienceColorSchema,
45
48
  AudienceNameSchema,
@@ -1,3 +1,5 @@
1
+ import "../chunk-JSBRDJBE.js";
2
+
1
3
  // src/types/database.ts
2
4
  var Constants = {
3
5
  graphql_public: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drawnagency/primitives",
3
- "version": "0.1.57",
3
+ "version": "0.1.59",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./package.json": "./package.json",
@@ -44,6 +44,10 @@
44
44
  "types": "./dist/lib/migrate-sections-transform.d.ts",
45
45
  "default": "./dist/lib/migrate-sections-transform.js"
46
46
  },
47
+ "./components/sections/register-schemas": {
48
+ "types": "./dist/components/sections/register-schemas.d.ts",
49
+ "default": "./dist/components/sections/register-schemas.js"
50
+ },
47
51
  "./auth": {
48
52
  "types": "./dist/auth/index.d.ts",
49
53
  "default": "./dist/auth/index.js"
@@ -3,7 +3,7 @@ import { ChevronRight } from "lucide-react";
3
3
  import { cn } from "../../lib/cn";
4
4
  import { Toggle } from "./Toggle";
5
5
  import type { SiteNav, NavItem } from "../../lib/nav";
6
- import { editModeEvent, siteNavChangeEvent, pageSelectEvent, darkModeEvent, historySelectEvent } from "../../lib/events";
6
+ import { editModeEvent, siteNavChangeEvent, pageSelectEvent, darkModeEvent, siteNameChangeEvent, historySelectEvent } from "../../lib/events";
7
7
  import { useActiveHeadings } from "../../hooks/useActiveHeadings";
8
8
  import { formatDate } from "../../lib/timestamp";
9
9
  import { Popover } from "./Popover";
@@ -23,6 +23,7 @@ export default function Navigation({ siteNav: initialNav, siteName, darkMode, la
23
23
  const [isOpen, setIsOpen] = useState(false);
24
24
  const [isEditMode, setIsEditMode] = useState(false);
25
25
  const [currentDarkMode, setCurrentDarkMode] = useState(darkMode);
26
+ const [currentSiteName, setCurrentSiteName] = useState(siteName);
26
27
  const [isDark, setIsDark] = useState(false);
27
28
  const [siteNav, setSiteNav] = useState<SiteNav>(initialNav);
28
29
  const [showHistory, setShowHistory] = useState(false);
@@ -34,7 +35,8 @@ export default function Navigation({ siteNav: initialNav, siteName, darkMode, la
34
35
  const unlistenEdit = editModeEvent.listen(({ isEditMode }) => setIsEditMode(isEditMode));
35
36
  const unlistenNav = siteNavChangeEvent.listen((n) => setSiteNav(n));
36
37
  const unlistenDark = darkModeEvent.listen((mode) => setCurrentDarkMode(mode as typeof darkMode));
37
- return () => { unlistenEdit(); unlistenNav(); unlistenDark(); };
38
+ const unlistenName = siteNameChangeEvent.listen((name) => setCurrentSiteName(name));
39
+ return () => { unlistenEdit(); unlistenNav(); unlistenDark(); unlistenName(); };
38
40
  }, []);
39
41
 
40
42
  useEffect(() => {
@@ -191,7 +193,7 @@ export default function Navigation({ siteNav: initialNav, siteName, darkMode, la
191
193
  <>
192
194
  <header className="fixed top-0 left-0 right-0 z-50 bg-base lg:hidden">
193
195
  <div className="mx-auto max-w-screen-xl flex h-16 items-center justify-between px-4">
194
- <span className="text-lg font-bold text-primary">{siteName}</span>
196
+ <span className="text-lg font-bold text-primary">{currentSiteName}</span>
195
197
  <button onClick={() => setIsOpen(!isOpen)} className="cursor-pointer p-2 text-base-contrast" aria-label="Toggle navigation">
196
198
  <svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
197
199
  {isOpen
@@ -207,7 +209,7 @@ export default function Navigation({ siteNav: initialNav, siteName, darkMode, la
207
209
  <nav className={cn("fixed top-0 left-0 lg:left-auto z-40 h-full w-64 flex flex-col overflow-y-auto border-r border-base-200 bg-base pt-16 transition-transform lg:translate-x-0 nav-sidebar",
208
210
  isOpen ? "translate-x-0" : "-translate-x-full")}>
209
211
  <div className="hidden px-4 py-4 lg:block">
210
- <span className="text-lg font-bold text-primary">{siteName}</span>
212
+ <span className="text-lg font-bold text-primary">{currentSiteName}</span>
211
213
  </div>
212
214
 
213
215
  <ul className="space-y-1 px-4 py-2">
@@ -54,7 +54,7 @@ import { useBuildStatus } from "../../hooks/useBuildStatus";
54
54
  import { useMediaPipeline } from "../../hooks/useMediaPipeline";
55
55
  import { formatTimestamp } from "../../lib/timestamp";
56
56
  import { generateSiteNav } from "../../lib/nav";
57
- import { siteNavChangeEvent, pageSelectEvent, darkModeEvent, historySelectEvent } from "../../lib/events";
57
+ import { siteNavChangeEvent, pageSelectEvent, darkModeEvent, siteNameChangeEvent, historySelectEvent } from "../../lib/events";
58
58
  import {
59
59
  homePage, pageById, pageBySlug, pageDisplayTitle, addSectionToPage, removeSectionFromPages,
60
60
  reorderSectionInPage,
@@ -356,6 +356,10 @@ export default function EditorShell({
356
356
  localStorage.setItem("portal-primary-color", config.primaryColor);
357
357
  localStorage.setItem("portal-primary-contrast", config.primaryContrast);
358
358
  darkModeEvent.dispatch(config.darkMode);
359
+ // The nav title lives in a separate island that mounts with a build-time
360
+ // siteName prop. Push the live (possibly draft) name so editing it in Site
361
+ // Settings updates the nav without a reload.
362
+ siteNameChangeEvent.dispatch(config.siteName);
359
363
  }, []);
360
364
 
361
365
  // --- Content loading ---
package/src/lib/events.ts CHANGED
@@ -21,6 +21,7 @@ export function createEvent<T>(name: string): TypedEvent<T> {
21
21
  export const editModeEvent = createEvent<{ isEditMode: boolean }>("editmodechange");
22
22
  export const navChangeEvent = createEvent<NavItem[]>("sitenavchange");
23
23
  export const darkModeEvent = createEvent<string>("sitedarkmode");
24
+ export const siteNameChangeEvent = createEvent<string>("sitenamechange");
24
25
  export const historySelectEvent = createEvent<{ sha: string; date: string }>("history-select");
25
26
  export const siteNavChangeEvent = createEvent<SiteNav>("sitenavchange-v2");
26
27
  export const pageSelectEvent = createEvent<string>("pageselect");
@@ -1,57 +0,0 @@
1
- import {
2
- HexColorSchema
3
- } from "./chunk-ICLXLWQ5.js";
4
-
5
- // src/schemas/audience.ts
6
- import { z } from "zod";
7
- var AudienceNameSchema = z.string().min(1).max(32).regex(
8
- /^[a-z0-9]([a-z0-9_-]*[a-z0-9])?$/,
9
- "lowercase alphanumeric, dashes and underscores allowed"
10
- );
11
- var AudienceColorSchema = HexColorSchema.nullable();
12
- function slugifyAudienceName(input) {
13
- return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
14
- }
15
-
16
- // src/schemas/media-grid-options.ts
17
- import { z as z2 } from "zod";
18
- var MediaGridOptionsSchema = z2.object({
19
- square: z2.boolean().optional(),
20
- border: z2.boolean().optional(),
21
- crop: z2.boolean().optional(),
22
- showCaptions: z2.boolean().optional()
23
- }).default({});
24
-
25
- // src/schemas/link.ts
26
- import { z as z3 } from "zod";
27
- var LinkTargetSchema = z3.enum(["_self", "_blank"]);
28
- function isSafeHref(href) {
29
- const normalized = href.replace(/[\t\r\n]/g, "").trimStart();
30
- if (normalized === "") return true;
31
- if (normalized.startsWith("//")) return false;
32
- const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(normalized);
33
- if (!scheme) return true;
34
- const s = scheme[1].toLowerCase();
35
- return s === "http" || s === "https" || s === "mailto";
36
- }
37
- var LinkValueSchema = z3.discriminatedUnion("kind", [
38
- z3.object({ kind: z3.literal("external"), href: z3.string().refine(isSafeHref, "Unsafe href scheme"), target: LinkTargetSchema }),
39
- z3.object({
40
- kind: z3.literal("internal"),
41
- pageId: z3.string(),
42
- anchorSectionId: z3.string().nullable().optional(),
43
- target: LinkTargetSchema
44
- })
45
- ]);
46
- var DEFAULT_LINK = { kind: "external", href: "", target: "_self" };
47
-
48
- export {
49
- AudienceNameSchema,
50
- AudienceColorSchema,
51
- slugifyAudienceName,
52
- MediaGridOptionsSchema,
53
- LinkTargetSchema,
54
- isSafeHref,
55
- LinkValueSchema,
56
- DEFAULT_LINK
57
- };