@drawnagency/primitives 0.1.49 → 0.1.51

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 (80) hide show
  1. package/dist/{chunk-BJ6FYGYP.js → chunk-24SUF2BC.js} +98 -9
  2. package/dist/{chunk-P3HO76OS.js → chunk-KDGYHU36.js} +6 -3
  3. package/dist/{chunk-5XYUO4HP.js → chunk-PUNXQK4M.js} +19 -2
  4. package/dist/components/editor/MoveSectionModal.d.ts +12 -0
  5. package/dist/components/editor/MoveSectionModal.d.ts.map +1 -0
  6. package/dist/components/editor/PagesModal.d.ts +18 -0
  7. package/dist/components/editor/PagesModal.d.ts.map +1 -0
  8. package/dist/components/editor/SectionWrapper.d.ts +1 -1
  9. package/dist/components/editor/SectionWrapper.d.ts.map +1 -1
  10. package/dist/components/editor/SettingsForm.d.ts.map +1 -1
  11. package/dist/components/primitives/LinkPopover.d.ts.map +1 -1
  12. package/dist/components/primitives/tiptap-presets.d.ts.map +1 -1
  13. package/dist/components/sections/Button/CTAButton.d.ts +3 -3
  14. package/dist/components/sections/Button/CTAButton.d.ts.map +1 -1
  15. package/dist/components/sections/Button/index.d.ts +10 -2
  16. package/dist/components/sections/Button/index.d.ts.map +1 -1
  17. package/dist/components/shared/Input.d.ts +1 -0
  18. package/dist/components/shared/Input.d.ts.map +1 -1
  19. package/dist/components/shared/LinkField.d.ts +9 -0
  20. package/dist/components/shared/LinkField.d.ts.map +1 -0
  21. package/dist/components/shared/Navigation.d.ts +4 -3
  22. package/dist/components/shared/Navigation.d.ts.map +1 -1
  23. package/dist/components/shared/PagesContext.d.ts +13 -0
  24. package/dist/components/shared/PagesContext.d.ts.map +1 -0
  25. package/dist/components/shared/RadioGroup.d.ts +15 -0
  26. package/dist/components/shared/RadioGroup.d.ts.map +1 -0
  27. package/dist/components/shell/EditorShell.d.ts.map +1 -1
  28. package/dist/components/shell/SiteSettingsDisplay.d.ts.map +1 -1
  29. package/dist/hooks/useBuildStatus.d.ts.map +1 -1
  30. package/dist/index.js +17 -3
  31. package/dist/lib/dexie.d.ts.map +1 -1
  32. package/dist/lib/dexie.js +16 -3
  33. package/dist/lib/events.d.ts +3 -1
  34. package/dist/lib/events.d.ts.map +1 -1
  35. package/dist/lib/index.js +2 -2
  36. package/dist/lib/links.d.ts +25 -0
  37. package/dist/lib/links.d.ts.map +1 -0
  38. package/dist/lib/loader.d.ts +2 -2
  39. package/dist/lib/loader.d.ts.map +1 -1
  40. package/dist/lib/nav.d.ts +23 -0
  41. package/dist/lib/nav.d.ts.map +1 -1
  42. package/dist/lib/pages.d.ts +31 -0
  43. package/dist/lib/pages.d.ts.map +1 -0
  44. package/dist/lib/registry.d.ts +7 -0
  45. package/dist/lib/registry.d.ts.map +1 -1
  46. package/dist/schemas/index.d.ts +1 -0
  47. package/dist/schemas/index.d.ts.map +1 -1
  48. package/dist/schemas/index.js +17 -3
  49. package/dist/schemas/link.d.ts +24 -0
  50. package/dist/schemas/link.d.ts.map +1 -0
  51. package/dist/schemas/site-config.d.ts +129 -3
  52. package/dist/schemas/site-config.d.ts.map +1 -1
  53. package/package.json +5 -1
  54. package/src/components/editor/MoveSectionModal.tsx +36 -0
  55. package/src/components/editor/PagesModal.tsx +400 -0
  56. package/src/components/editor/SectionWrapper.tsx +13 -0
  57. package/src/components/editor/SettingsForm.tsx +12 -0
  58. package/src/components/primitives/LinkPopover.tsx +99 -27
  59. package/src/components/primitives/tiptap-presets.ts +3 -1
  60. package/src/components/sections/Button/CTAButton.tsx +10 -11
  61. package/src/components/sections/Button/index.tsx +4 -9
  62. package/src/components/shared/Input.tsx +14 -3
  63. package/src/components/shared/LinkField.tsx +90 -0
  64. package/src/components/shared/Navigation.tsx +147 -137
  65. package/src/components/shared/PagesContext.tsx +12 -0
  66. package/src/components/shared/RadioGroup.tsx +71 -0
  67. package/src/components/shell/EditorShell.tsx +273 -78
  68. package/src/components/shell/SiteSettingsDisplay.tsx +65 -0
  69. package/src/hooks/useBuildStatus.ts +19 -4
  70. package/src/hooks/useEditorPublish.ts +1 -1
  71. package/src/lib/dexie.ts +18 -5
  72. package/src/lib/events.ts +3 -1
  73. package/src/lib/links.ts +108 -0
  74. package/src/lib/loader.ts +5 -4
  75. package/src/lib/nav.ts +59 -0
  76. package/src/lib/pages.ts +209 -0
  77. package/src/lib/registry.ts +8 -0
  78. package/src/schemas/index.ts +1 -0
  79. package/src/schemas/link.ts +17 -0
  80. package/src/schemas/site-config.ts +119 -11
@@ -161,18 +161,100 @@ var SectionMetaSchema = z3.object({
161
161
  status: StatusSchema,
162
162
  access: z3.array(z3.string())
163
163
  });
164
- var IndexSchema = z3.object({
164
+ var RESERVED_SLUGS = ["edit", "api", "login", "set-password", "404"];
165
+ var PageStatusSchema = z3.enum(["live", "archived"]);
166
+ var PageSchema = z3.object({
167
+ id: z3.string().min(1),
168
+ title: z3.string(),
169
+ slug: z3.string(),
170
+ isHome: z3.boolean(),
171
+ showInNav: z3.boolean(),
172
+ status: PageStatusSchema,
173
+ access: z3.array(z3.string()),
174
+ order: z3.array(z3.string())
175
+ });
176
+ var SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
177
+ var RawIndexSchema = z3.object({
165
178
  siteId: z3.string(),
166
- order: z3.array(z3.string()),
179
+ order: z3.array(z3.string()).optional(),
180
+ pages: z3.array(PageSchema).optional(),
167
181
  sections: z3.record(z3.string(), SectionMetaSchema),
168
182
  lastModified: z3.string().nullable().optional()
169
- }).refine(
170
- (data) => {
171
- const orderSet = new Set(data.order);
172
- return data.order.every((id) => id in data.sections) && Object.keys(data.sections).every((key) => orderSet.has(key));
173
- },
174
- { message: "Every id in order must have a sections entry and vice versa" }
175
- );
183
+ });
184
+ function normalizeRawIndex(data) {
185
+ if (data.pages && data.pages.length > 0) {
186
+ return {
187
+ siteId: data.siteId,
188
+ pages: data.pages,
189
+ sections: data.sections,
190
+ lastModified: data.lastModified ?? null
191
+ };
192
+ }
193
+ const order = data.order ?? Object.keys(data.sections);
194
+ return {
195
+ siteId: data.siteId,
196
+ pages: [
197
+ {
198
+ id: "home",
199
+ title: "Home",
200
+ slug: "",
201
+ isHome: true,
202
+ showInNav: true,
203
+ status: "live",
204
+ access: [],
205
+ order
206
+ }
207
+ ],
208
+ sections: data.sections,
209
+ lastModified: data.lastModified ?? null
210
+ };
211
+ }
212
+ var CanonicalIndexSchema = z3.object({
213
+ siteId: z3.string(),
214
+ pages: z3.array(PageSchema),
215
+ sections: z3.record(z3.string(), SectionMetaSchema),
216
+ lastModified: z3.string().nullable().optional()
217
+ }).superRefine((data, ctx) => {
218
+ const homes = data.pages.filter((p) => p.isHome);
219
+ if (homes.length !== 1) {
220
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: "Exactly one page must be the home page" });
221
+ }
222
+ if (homes[0]?.status === "archived") {
223
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: "The home page cannot be archived" });
224
+ }
225
+ if (homes[0] && homes[0].slug !== "") {
226
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: "The home page slug must be empty" });
227
+ }
228
+ const seenSlugs = /* @__PURE__ */ new Set();
229
+ for (const p of data.pages) {
230
+ if (!p.isHome) {
231
+ if (!SLUG_RE.test(p.slug)) {
232
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: `Invalid slug "${p.slug}"` });
233
+ }
234
+ if (RESERVED_SLUGS.includes(p.slug)) {
235
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: `Slug "${p.slug}" is reserved` });
236
+ }
237
+ }
238
+ if (seenSlugs.has(p.slug)) {
239
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: `Duplicate slug "${p.slug}"` });
240
+ }
241
+ seenSlugs.add(p.slug);
242
+ }
243
+ const fromPages = [];
244
+ for (const p of data.pages) fromPages.push(...p.order);
245
+ const fromPagesSet = new Set(fromPages);
246
+ if (fromPages.length !== fromPagesSet.size) {
247
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: "A section id appears in more than one page" });
248
+ }
249
+ const sectionKeys = Object.keys(data.sections);
250
+ if (fromPagesSet.size !== sectionKeys.length || !sectionKeys.every((k) => fromPagesSet.has(k))) {
251
+ ctx.addIssue({ code: z3.ZodIssueCode.custom, message: "Page section orders must partition sections{} exactly" });
252
+ }
253
+ });
254
+ var IndexSchema = RawIndexSchema.transform(normalizeRawIndex).pipe(CanonicalIndexSchema);
255
+ function normalizeSiteIndex(raw) {
256
+ return IndexSchema.parse(raw);
257
+ }
176
258
  var SiteConfigSchema = z3.object({
177
259
  siteName: z3.string().default("Brand Portal"),
178
260
  primaryColor: HexColorSchema.default("#009ca6"),
@@ -184,6 +266,9 @@ var SiteConfigSchema = z3.object({
184
266
  uppercaseSubheadings: z3.boolean().default(true),
185
267
  uppercaseNavHeadings: z3.boolean().default(true),
186
268
  googleFontsUrl: z3.string().refine((url) => url.startsWith("https://fonts.googleapis.com/"), "Must be a Google Fonts URL").nullable().default(null),
269
+ // Favicon stored as a data URL (SVG/PNG, small) so it travels with
270
+ // site-config.json — no media manifest or CDN round-trip needed.
271
+ favicon: z3.string().refine((v) => v.startsWith("data:image/"), "Favicon must be an image data URL").nullable().default(null),
187
272
  media: MediaConfigSchema.default(MediaConfigSchema.parse({}))
188
273
  });
189
274
 
@@ -205,6 +290,10 @@ export {
205
290
  getSectionContentSchema,
206
291
  getSectionSchema,
207
292
  SectionMetaSchema,
293
+ RESERVED_SLUGS,
294
+ PageStatusSchema,
295
+ PageSchema,
208
296
  IndexSchema,
297
+ normalizeSiteIndex,
209
298
  SiteConfigSchema
210
299
  };
@@ -3,7 +3,7 @@ import {
3
3
  getAllSchemas,
4
4
  getSection,
5
5
  getSectionSchema
6
- } from "./chunk-BJ6FYGYP.js";
6
+ } from "./chunk-24SUF2BC.js";
7
7
  import {
8
8
  safeNextPath
9
9
  } from "./chunk-S2L3BPLS.js";
@@ -224,13 +224,16 @@ var editModeEvent = createEvent("editmodechange");
224
224
  var navChangeEvent = createEvent("sitenavchange");
225
225
  var darkModeEvent = createEvent("sitedarkmode");
226
226
  var historySelectEvent = createEvent("history-select");
227
+ var siteNavChangeEvent = createEvent("sitenavchange-v2");
228
+ var pageSelectEvent = createEvent("pageselect");
227
229
 
228
230
  // src/lib/loader.ts
229
231
  function mergeSiteContent(index, sectionFiles) {
230
232
  const sections = [];
231
233
  const canValidate = getAllSchemas().length >= 2;
232
234
  const schema = canValidate ? getSectionSchema() : null;
233
- for (const id of index.order) {
235
+ const orderedIds = index.pages.flatMap((p) => p.order);
236
+ for (const id of orderedIds) {
234
237
  const raw = sectionFiles[id];
235
238
  if (!raw) {
236
239
  console.warn(`Section file missing for id: ${id}, skipping`);
@@ -268,7 +271,7 @@ async function loadSiteContent(contentDir) {
268
271
  const indexRaw = JSON.parse(await fs.readFile(indexPath, "utf-8"));
269
272
  const index = IndexSchema.parse(indexRaw);
270
273
  const sectionFiles = {};
271
- for (const id of index.order) {
274
+ for (const id of index.pages.flatMap((p) => p.order)) {
272
275
  const sectionPath = path.join(contentDir, "sections", `${id}.json`);
273
276
  sectionFiles[id] = JSON.parse(await fs.readFile(sectionPath, "utf-8"));
274
277
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HexColorSchema
3
- } from "./chunk-BJ6FYGYP.js";
3
+ } from "./chunk-24SUF2BC.js";
4
4
 
5
5
  // src/schemas/audience.ts
6
6
  import { z } from "zod";
@@ -22,9 +22,26 @@ var MediaGridOptionsSchema = z2.object({
22
22
  showCaptions: z2.boolean().optional()
23
23
  }).default({});
24
24
 
25
+ // src/schemas/link.ts
26
+ import { z as z3 } from "zod";
27
+ var LinkTargetSchema = z3.enum(["_self", "_blank"]);
28
+ var LinkValueSchema = z3.discriminatedUnion("kind", [
29
+ z3.object({ kind: z3.literal("external"), href: z3.string(), target: LinkTargetSchema }),
30
+ z3.object({
31
+ kind: z3.literal("internal"),
32
+ pageId: z3.string(),
33
+ anchorSectionId: z3.string().nullable().optional(),
34
+ target: LinkTargetSchema
35
+ })
36
+ ]);
37
+ var DEFAULT_LINK = { kind: "external", href: "", target: "_self" };
38
+
25
39
  export {
26
40
  AudienceNameSchema,
27
41
  AudienceColorSchema,
28
42
  slugifyAudienceName,
29
- MediaGridOptionsSchema
43
+ MediaGridOptionsSchema,
44
+ LinkTargetSchema,
45
+ LinkValueSchema,
46
+ DEFAULT_LINK
30
47
  };
@@ -0,0 +1,12 @@
1
+ interface Props {
2
+ pages: {
3
+ id: string;
4
+ title: string;
5
+ }[];
6
+ currentPageId: string;
7
+ onMove: (destPageId: string, position: "top" | "bottom") => void;
8
+ onCancel: () => void;
9
+ }
10
+ export declare function MoveSectionModal({ pages, currentPageId, onMove, onCancel }: Props): import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=MoveSectionModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoveSectionModal.d.ts","sourceRoot":"","sources":["../../../src/components/editor/MoveSectionModal.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;IACjE,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAuBjF"}
@@ -0,0 +1,18 @@
1
+ import type { SiteIndex, Page } from "../../schemas/site-config";
2
+ import type { Audience } from "../../auth/types";
3
+ export interface PagesModalProps {
4
+ index: SiteIndex;
5
+ audiences: Audience[];
6
+ onReorder: (fromIndex: number, toIndex: number) => void;
7
+ /** Creates the page and returns its id so the modal can expand the new row. */
8
+ onAddPage: () => string;
9
+ onSetHome: (pageId: string) => void;
10
+ onSetArchived: (pageId: string, archived: boolean) => void;
11
+ onSetFields: (pageId: string, patch: Partial<Pick<Page, "title" | "slug" | "showInNav">>) => void;
12
+ onSetAudience: (pageId: string, access: string[]) => void;
13
+ onConfirmDelete: (pageId: string) => void;
14
+ /** Navigate the editor to this page (the shell also closes the modal). */
15
+ onNavigate: (pageId: string) => void;
16
+ }
17
+ export declare function PagesModal(props: PagesModalProps): import("react/jsx-runtime").JSX.Element;
18
+ //# sourceMappingURL=PagesModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesModal.d.ts","sourceRoot":"","sources":["../../../src/components/editor/PagesModal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAUjD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,+EAA+E;IAC/E,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;IAClG,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC1D,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,0EAA0E;IAC1E,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CA4EhD"}
@@ -1,3 +1,3 @@
1
1
  import type { WrapperProps } from "../../lib/registry";
2
- export declare function SectionWrapper({ sectionId, sectionType, status, dirty, index, isLast, definition, options, audiences, access, onAccessChange, onStatusChange, onSectionChange, onReorder, onRequestInsert, onDelete, mainStatus, contentDiffersFromMain, isLocalOnly, children, }: WrapperProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function SectionWrapper({ sectionId, sectionType, status, dirty, index, isLast, definition, options, audiences, access, onAccessChange, onStatusChange, onSectionChange, onReorder, onRequestInsert, onDelete, onMoveSection, mainStatus, contentDiffersFromMain, isLocalOnly, children, }: WrapperProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=SectionWrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SectionWrapper.d.ts","sourceRoot":"","sources":["../../../src/components/editor/SectionWrapper.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,WAAW,EACX,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAU,EACV,OAAO,EACP,SAAS,EACT,MAAM,EACN,cAAc,EACd,cAAc,EACd,eAAe,EACf,SAAS,EACT,eAAe,EACf,QAAQ,EACR,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,QAAQ,GACT,EAAE,YAAY,2CAiRd"}
1
+ {"version":3,"file":"SectionWrapper.d.ts","sourceRoot":"","sources":["../../../src/components/editor/SectionWrapper.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,WAAW,EACX,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAU,EACV,OAAO,EACP,SAAS,EACT,MAAM,EACN,cAAc,EACd,cAAc,EACd,eAAe,EACf,SAAS,EACT,eAAe,EACf,QAAQ,EACR,aAAa,EACb,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,QAAQ,GACT,EAAE,YAAY,2CA4Rd"}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsForm.d.ts","sourceRoot":"","sources":["../../../src/components/editor/SettingsForm.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,oBAAoB,CAAC;AAO3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAChD;AAmED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CA0E3E"}
1
+ {"version":3,"file":"SettingsForm.d.ts","sourceRoot":"","sources":["../../../src/components/editor/SettingsForm.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,oBAAoB,CAAC;AAS3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAChD;AAmED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAoF3E"}
@@ -1 +1 @@
1
- {"version":3,"file":"LinkPopover.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/LinkPopover.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAmGhE"}
1
+ {"version":3,"file":"LinkPopover.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/LinkPopover.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAM3C,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAKD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAqKhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"tiptap-presets.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/tiptap-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA+C/C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAmB,CAAC"}
1
+ {"version":3,"file":"tiptap-presets.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/tiptap-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAiD/C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAmB,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import type { SectionContent } from "../../../schemas/sections";
2
+ import type { LinkValue } from "../../../schemas/link";
2
3
  interface Props {
3
4
  text: string;
4
- href?: string;
5
- target?: string;
5
+ link?: LinkValue;
6
6
  download?: boolean;
7
7
  onChange?: (content: SectionContent) => void;
8
8
  }
9
- export default function Button({ text, href, target, download, onChange }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export default function Button({ text, link, download, onChange }: Props): import("react/jsx-runtime").JSX.Element;
10
10
  export {};
11
11
  //# sourceMappingURL=CTAButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CTAButton.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/Button/CTAButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAoC/E"}
1
+ {"version":3,"file":"CTAButton.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/Button/CTAButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAmCvE"}
@@ -2,8 +2,16 @@ declare const _default: import("../../..").SectionDefinition<{
2
2
  type: "button";
3
3
  content: {
4
4
  text: string;
5
- href?: string | undefined;
6
- target?: string | undefined;
5
+ link?: {
6
+ kind: "external";
7
+ href: string;
8
+ target: "_self" | "_blank";
9
+ } | {
10
+ kind: "internal";
11
+ pageId: string;
12
+ target: "_self" | "_blank";
13
+ anchorSectionId?: string | null | undefined;
14
+ } | undefined;
7
15
  download?: boolean | undefined;
8
16
  };
9
17
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/Button/index.tsx"],"names":[],"mappings":";;;;;;;;;AAeA,wBAwBG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/Button/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAeA,wBAmBG"}
@@ -2,6 +2,7 @@ import { type InputHTMLAttributes } from "react";
2
2
  interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "onChange"> {
3
3
  label: string;
4
4
  onChange: (value: string) => void;
5
+ error?: string;
5
6
  }
6
7
  export declare const Input: import("react").ForwardRefExoticComponent<InputProps & import("react").RefAttributes<HTMLInputElement>>;
7
8
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/shared/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAIpE,UAAU,UAAW,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,KAAK,yGAwBhB,CAAC"}
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/shared/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAIpE,UAAU,UAAW,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,KAAK,yGAkChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { LinkValue } from "../../schemas/link";
2
+ interface Props {
3
+ label: string;
4
+ value: LinkValue;
5
+ onChange: (value: LinkValue) => void;
6
+ }
7
+ export declare function LinkField({ label, value, onChange }: Props): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=LinkField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkField.d.ts","sourceRoot":"","sources":["../../../src/components/shared/LinkField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAOD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAuE1D"}
@@ -1,10 +1,11 @@
1
- import type { NavItem } from "../../lib/nav";
1
+ import type { SiteNav } from "../../lib/nav";
2
2
  interface Props {
3
- navLinks: NavItem[];
3
+ siteNav: SiteNav;
4
4
  siteName: string;
5
5
  darkMode: "light" | "dark" | "optional";
6
6
  lastUpdated: string | null;
7
+ onPageSelect?: (pageId: string) => void;
7
8
  }
8
- export default function Navigation({ navLinks: initialNavLinks, siteName, darkMode, lastUpdated }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export default function Navigation({ siteNav: initialNav, siteName, darkMode, lastUpdated, onPageSelect }: Props): import("react/jsx-runtime").JSX.Element;
9
10
  export {};
10
11
  //# sourceMappingURL=Navigation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Navigation.d.ts","sourceRoot":"","sources":["../../../src/components/shared/Navigation.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAO7C,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACxC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,2CAgOvG"}
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"}
@@ -0,0 +1,13 @@
1
+ export interface PagesContextValue {
2
+ pages: {
3
+ id: string;
4
+ title: string;
5
+ }[];
6
+ getPageHeadings: (pageId: string) => {
7
+ id: string;
8
+ label: string;
9
+ }[];
10
+ }
11
+ export declare const PagesContext: import("react").Context<PagesContextValue>;
12
+ export declare function usePages(): PagesContextValue;
13
+ //# sourceMappingURL=PagesContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesContext.d.ts","sourceRoot":"","sources":["../../../src/components/shared/PagesContext.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtE;AAED,eAAO,MAAM,YAAY,4CAA6E,CAAC;AAEvG,wBAAgB,QAAQ,IAAI,iBAAiB,CAE5C"}
@@ -0,0 +1,15 @@
1
+ export interface RadioGroupOption<T extends string = string> {
2
+ label: string;
3
+ value: T;
4
+ }
5
+ interface RadioGroupProps<T extends string = string> {
6
+ label: string;
7
+ options: RadioGroupOption<T>[];
8
+ value: T;
9
+ onChange: (value: T) => void;
10
+ disabled?: boolean;
11
+ className?: string;
12
+ }
13
+ export declare function RadioGroup<T extends string = string>({ label, options, value, onChange, disabled, className, }: RadioGroupProps<T>): import("react/jsx-runtime").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=RadioGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../../../src/components/shared/RadioGroup.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;CACV;AAED,UAAU,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EACpD,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,2CA6CpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuDjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,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,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,GACZ,EAAE,KAAK,2CAstBP"}
1
+ {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAgEjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,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,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,GACZ,EAAE,KAAK,2CA+2BP"}
@@ -1 +1 @@
1
- {"version":3,"file":"SiteSettingsDisplay.d.ts","sourceRoot":"","sources":["../../../src/components/shell/SiteSettingsDisplay.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,UAAU,KAAK;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAQD,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,2CA2ElE"}
1
+ {"version":3,"file":"SiteSettingsDisplay.d.ts","sourceRoot":"","sources":["../../../src/components/shell/SiteSettingsDisplay.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,UAAU,KAAK;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAWD,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAuIlE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuildStatus.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AASrE,UAAU,iBAAiB;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAMD,wBAAgB,cAAc,IAAI,iBAAiB,CAgIlD"}
1
+ {"version":3,"file":"useBuildStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useBuildStatus.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AASrE,UAAU,iBAAiB;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAUD,wBAAgB,cAAc,IAAI,iBAAiB,CA2IlD"}
package/dist/index.js CHANGED
@@ -1,9 +1,12 @@
1
1
  import {
2
2
  AudienceColorSchema,
3
3
  AudienceNameSchema,
4
+ DEFAULT_LINK,
5
+ LinkTargetSchema,
6
+ LinkValueSchema,
4
7
  MediaGridOptionsSchema,
5
8
  slugifyAudienceName
6
- } from "./chunk-5XYUO4HP.js";
9
+ } from "./chunk-PUNXQK4M.js";
7
10
  import {
8
11
  AudienceSchema,
9
12
  RoleSchema,
@@ -30,13 +33,16 @@ import {
30
33
  safeRedirect,
31
34
  sanitizeHtml,
32
35
  toSectionId
33
- } from "./chunk-P3HO76OS.js";
36
+ } from "./chunk-KDGYHU36.js";
34
37
  import {
35
38
  ColorItemSchema,
36
39
  ColorSpaceSchema,
37
40
  HexColorSchema,
38
41
  IndexSchema,
39
42
  MediaReferenceSchema,
43
+ PageSchema,
44
+ PageStatusSchema,
45
+ RESERVED_SLUGS,
40
46
  SectionMetaSchema,
41
47
  SiteConfigSchema,
42
48
  TextLineSchema,
@@ -49,9 +55,10 @@ import {
49
55
  getSection,
50
56
  getSectionContentSchema,
51
57
  getSectionSchema,
58
+ normalizeSiteIndex,
52
59
  registerSchema,
53
60
  registerSection
54
- } from "./chunk-BJ6FYGYP.js";
61
+ } from "./chunk-24SUF2BC.js";
55
62
  import {
56
63
  AUDIENCE_COOKIE,
57
64
  LastOwnerError,
@@ -98,17 +105,23 @@ export {
98
105
  AudienceSchema,
99
106
  ColorItemSchema,
100
107
  ColorSpaceSchema,
108
+ DEFAULT_LINK,
101
109
  EXT_TO_MIME,
102
110
  HexColorSchema,
103
111
  ImageManifestSchema,
104
112
  IndexSchema,
105
113
  LastOwnerError,
114
+ LinkTargetSchema,
115
+ LinkValueSchema,
106
116
  MIME_TO_EXT,
107
117
  MediaConfigSchema,
108
118
  MediaGridOptionsSchema,
109
119
  MediaItemSchema,
110
120
  MediaReferenceSchema,
121
+ PageSchema,
122
+ PageStatusSchema,
111
123
  ProcessingQueue,
124
+ RESERVED_SLUGS,
112
125
  RoleSchema,
113
126
  SESSION_COOKIE,
114
127
  SESSION_MAX_AGE_SECONDS,
@@ -152,6 +165,7 @@ export {
152
165
  mergeSiteContent,
153
166
  mimeToExt,
154
167
  navChangeEvent,
168
+ normalizeSiteIndex,
155
169
  registerSchema,
156
170
  registerSection,
157
171
  requireSessionSecret,
@@ -1 +1 @@
1
- {"version":3,"file":"dexie.d.ts","sourceRoot":"","sources":["../../src/lib/dexie.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dexie.d.ts","sourceRoot":"","sources":["../../src/lib/dexie.ts"],"names":[],"mappings":"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"}
package/dist/lib/dexie.js CHANGED
@@ -61,6 +61,19 @@ var EditorDatabase = class extends Dexie {
61
61
  }).upgrade((tx) => {
62
62
  return tx.table("pendingMedia").clear();
63
63
  });
64
+ this.version(7).stores({
65
+ sections: "sectionId",
66
+ siteIndex: "key",
67
+ meta: "key",
68
+ siteConfig: "key",
69
+ contentCache: "key",
70
+ mediaManifest: "key",
71
+ pendingMedia: "id",
72
+ pendingMediaDeletions: "id"
73
+ }).upgrade(async (tx) => {
74
+ await tx.table("siteIndex").clear();
75
+ await tx.table("contentCache").clear();
76
+ });
64
77
  }
65
78
  };
66
79
  var db = null;
@@ -97,7 +110,7 @@ async function restoreLocalChanges() {
97
110
  const siteId = metaRow?.siteId ?? "";
98
111
  return {
99
112
  sections,
100
- siteIndex: { siteId, order: indexRow.order, sections: indexRow.sections },
113
+ siteIndex: { siteId, pages: indexRow.pages, sections: indexRow.sections },
101
114
  siteConfig: configRow?.config,
102
115
  deletedSections: indexRow.deletedSections ?? []
103
116
  };
@@ -121,7 +134,7 @@ async function persistSiteIndex(index, deletedSections = []) {
121
134
  await database.transaction("rw", [database.siteIndex, database.meta], async () => {
122
135
  await database.siteIndex.put({
123
136
  key: "current",
124
- order: index.order,
137
+ pages: index.pages,
125
138
  sections: index.sections,
126
139
  deletedSections,
127
140
  updatedAt: now
@@ -207,7 +220,7 @@ async function persistAll(sections, siteIndex, deletedSectionIds, siteConfig) {
207
220
  if (siteIndex) {
208
221
  await database.siteIndex.put({
209
222
  key: "current",
210
- order: siteIndex.order,
223
+ pages: siteIndex.pages,
211
224
  sections: siteIndex.sections,
212
225
  deletedSections: [],
213
226
  updatedAt: now
@@ -1,4 +1,4 @@
1
- import type { NavItem } from "./nav";
1
+ import type { NavItem, SiteNav } from "./nav";
2
2
  export interface TypedEvent<T> {
3
3
  dispatch(detail: T): void;
4
4
  listen(callback: (detail: T) => void): () => void;
@@ -13,4 +13,6 @@ export declare const historySelectEvent: TypedEvent<{
13
13
  sha: string;
14
14
  date: string;
15
15
  }>;
16
+ export declare const siteNavChangeEvent: TypedEvent<SiteNav>;
17
+ export declare const pageSelectEvent: TypedEvent<string>;
16
18
  //# 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,MAAM,OAAO,CAAC;AAErC,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"}
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"}
package/dist/lib/index.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  safeRedirect,
19
19
  sanitizeHtml,
20
20
  toSectionId
21
- } from "../chunk-P3HO76OS.js";
21
+ } from "../chunk-KDGYHU36.js";
22
22
  import {
23
23
  clearRegistry,
24
24
  createRegistry,
@@ -29,7 +29,7 @@ import {
29
29
  getSection,
30
30
  registerSchema,
31
31
  registerSection
32
- } from "../chunk-BJ6FYGYP.js";
32
+ } from "../chunk-24SUF2BC.js";
33
33
  import "../chunk-S2L3BPLS.js";
34
34
  import {
35
35
  env
@@ -0,0 +1,25 @@
1
+ import type { SiteIndex } from "../schemas/site-config";
2
+ import type { Section } from "../schemas/sections";
3
+ import type { LinkValue } from "../schemas/link";
4
+ export declare function resolveLinkHref(link: LinkValue, index: SiteIndex, headingById: Record<string, string | undefined>): {
5
+ href: string;
6
+ target: string;
7
+ };
8
+ /**
9
+ * Stable internal-link href stored inside rich text (TipTap link marks):
10
+ * `page://{pageId}` or `page://{pageId}#{anchorSectionId}`. Page ids survive
11
+ * slug renames; the SSR pass rewrites these to real routes for the viewer.
12
+ */
13
+ export declare function internalHref(pageId: string, anchorSectionId?: string | null): string;
14
+ export declare function parseInternalHref(href: string): {
15
+ pageId: string;
16
+ anchorSectionId: string | null;
17
+ } | null;
18
+ /**
19
+ * Rewrite any internal link embedded in a section's content into a resolved
20
+ * plain href so the zero-JS viewer renders a normal <a>. Covers structured
21
+ * LinkValue fields (button) and `page://` hrefs inside rich text HTML (prose,
22
+ * list items — any string field).
23
+ */
24
+ export declare function resolveInternalLinks(section: Section, index: SiteIndex, headingById: Record<string, string | undefined>): Section;
25
+ //# sourceMappingURL=links.d.ts.map