@drawnagency/primitives 0.1.96 → 0.1.97

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 (73) hide show
  1. package/dist/{chunk-IFCQWC3G.js → chunk-5BFPJWIO.js} +2 -2
  2. package/dist/{chunk-CI624HRS.js → chunk-F2337B35.js} +1 -1
  3. package/dist/{chunk-CSVGCAIH.js → chunk-FOEZNEF5.js} +6 -6
  4. package/dist/chunk-HJSE6SK5.js +27 -0
  5. package/dist/{chunk-YUUUCDXN.js → chunk-II3X7GLJ.js} +1 -1
  6. package/dist/{chunk-DJAJRBPD.js → chunk-KPP2CFW6.js} +2 -2
  7. package/dist/{chunk-CS2ECR3U.js → chunk-QEHPGA5N.js} +23 -5
  8. package/dist/{chunk-SOILPZ7U.js → chunk-S4L3ZFKM.js} +1 -1
  9. package/dist/{chunk-RQPHPAT2.js → chunk-YDXBJR74.js} +2 -2
  10. package/dist/chunk-ZD6XGRQM.js +85 -0
  11. package/dist/collab/rebase.d.ts +20 -0
  12. package/dist/collab/rebase.d.ts.map +1 -1
  13. package/dist/collab/rebase.js +17 -0
  14. package/dist/components/editor/DropEdgeIndicator.d.ts +6 -1
  15. package/dist/components/editor/DropEdgeIndicator.d.ts.map +1 -1
  16. package/dist/components/editor/NavGroupRow.d.ts +21 -0
  17. package/dist/components/editor/NavGroupRow.d.ts.map +1 -0
  18. package/dist/components/editor/PagesModal.d.ts +7 -1
  19. package/dist/components/editor/PagesModal.d.ts.map +1 -1
  20. package/dist/components/editor/index.js +4 -4
  21. package/dist/components/primitives/index.js +6 -6
  22. package/dist/components/sections/brand-guide.js +5 -5
  23. package/dist/components/sections/register-schemas.js +9 -9
  24. package/dist/components/sections/register.js +9 -9
  25. package/dist/components/shared/Navigation.d.ts.map +1 -1
  26. package/dist/components/shell/EditorShell.d.ts.map +1 -1
  27. package/dist/hooks/useSortableNavRow.d.ts +27 -0
  28. package/dist/hooks/useSortableNavRow.d.ts.map +1 -0
  29. package/dist/index.js +22 -6
  30. package/dist/lib/dexie.d.ts.map +1 -1
  31. package/dist/lib/dexie.js +3 -1
  32. package/dist/lib/index.d.ts +1 -0
  33. package/dist/lib/index.d.ts.map +1 -1
  34. package/dist/lib/index.js +15 -4
  35. package/dist/lib/loader.d.ts +2 -2
  36. package/dist/lib/loader.d.ts.map +1 -1
  37. package/dist/lib/nav-tree.d.ts +63 -0
  38. package/dist/lib/nav-tree.d.ts.map +1 -0
  39. package/dist/lib/nav.d.ts +13 -2
  40. package/dist/lib/nav.d.ts.map +1 -1
  41. package/dist/lib/pages.d.ts +0 -1
  42. package/dist/lib/pages.d.ts.map +1 -1
  43. package/dist/lib/reorder.d.ts +24 -0
  44. package/dist/lib/reorder.d.ts.map +1 -1
  45. package/dist/media/index.js +2 -2
  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 +7 -1
  49. package/dist/schemas/nav.d.ts +40 -0
  50. package/dist/schemas/nav.d.ts.map +1 -0
  51. package/dist/schemas/site-config.d.ts +11 -1
  52. package/dist/schemas/site-config.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/src/collab/rebase.ts +35 -0
  55. package/src/components/editor/DropEdgeIndicator.tsx +15 -8
  56. package/src/components/editor/NavGroupRow.tsx +126 -0
  57. package/src/components/editor/PagesModal.tsx +150 -29
  58. package/src/components/shared/Navigation.tsx +51 -13
  59. package/src/components/shell/EditorShell.tsx +40 -10
  60. package/src/hooks/useSortableNavRow.ts +139 -0
  61. package/src/lib/dexie.ts +6 -1
  62. package/src/lib/index.ts +1 -0
  63. package/src/lib/loader.ts +31 -4
  64. package/src/lib/nav-tree.ts +192 -0
  65. package/src/lib/nav.ts +43 -10
  66. package/src/lib/pages.ts +14 -11
  67. package/src/lib/reorder.ts +56 -0
  68. package/src/schemas/index.ts +1 -0
  69. package/src/schemas/nav.ts +36 -0
  70. package/src/schemas/site-config.ts +9 -1
  71. package/dist/chunk-YBVK254P.js +0 -14
  72. /package/dist/{chunk-53DKVAB6.js → chunk-72CG6AA2.js} +0 -0
  73. /package/dist/{chunk-3HJDMFTB.js → chunk-XYCCXKVC.js} +0 -0
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ import {
29
29
  resolveMedia,
30
30
  sanitizeMediaName,
31
31
  setMediaProvider
32
- } from "./chunk-SOILPZ7U.js";
32
+ } from "./chunk-S4L3ZFKM.js";
33
33
  import {
34
34
  AUDIENCE_COOKIE,
35
35
  AUDIENCE_MAX_AGE_SECONDS,
@@ -58,7 +58,7 @@ import {
58
58
  AudienceNameSchema,
59
59
  MediaGridOptionsSchema,
60
60
  slugifyAudienceName
61
- } from "./chunk-3HJDMFTB.js";
61
+ } from "./chunk-XYCCXKVC.js";
62
62
  import {
63
63
  AudienceSchema,
64
64
  RoleSchema,
@@ -91,7 +91,7 @@ import {
91
91
  safeRedirect,
92
92
  suggestAccessibleOn,
93
93
  wcagLevel
94
- } from "./chunk-CS2ECR3U.js";
94
+ } from "./chunk-QEHPGA5N.js";
95
95
  import {
96
96
  curatedIcons,
97
97
  getIcon
@@ -107,19 +107,28 @@ import {
107
107
  generateNavLinks,
108
108
  sanitizeHtml,
109
109
  toSectionId
110
- } from "./chunk-53DKVAB6.js";
110
+ } from "./chunk-72CG6AA2.js";
111
111
  import {
112
112
  cn
113
113
  } from "./chunk-7EOSDFS3.js";
114
114
  import {
115
- audiencePasses
116
- } from "./chunk-YBVK254P.js";
115
+ audiencePasses,
116
+ groupDisplayLabel,
117
+ groupOfPage,
118
+ navEntries,
119
+ pagesInNavOrder,
120
+ reconcileNav
121
+ } from "./chunk-ZD6XGRQM.js";
117
122
  import {
118
123
  isSameOriginRequest,
119
124
  requireSessionSecret,
120
125
  safeNextPath
121
126
  } from "./chunk-S2L3BPLS.js";
122
127
  import "./chunk-5BM2Y3NJ.js";
128
+ import {
129
+ NavEntrySchema,
130
+ NavFileSchema
131
+ } from "./chunk-HJSE6SK5.js";
123
132
  import {
124
133
  getSectionContentSchema,
125
134
  getSectionSchema
@@ -195,6 +204,8 @@ export {
195
204
  MediaGridOptionsSchema,
196
205
  MediaItemSchema,
197
206
  MediaReferenceSchema,
207
+ NavEntrySchema,
208
+ NavFileSchema,
198
209
  PageSchema,
199
210
  PageStatusSchema,
200
211
  ProcessingQueue,
@@ -250,6 +261,8 @@ export {
250
261
  getSectionContentSchema,
251
262
  getSectionSchema,
252
263
  gridColsClass,
264
+ groupDisplayLabel,
265
+ groupOfPage,
253
266
  hashFileBuffer,
254
267
  isSafeHref,
255
268
  isSameOriginRequest,
@@ -258,10 +271,13 @@ export {
258
271
  mergeSiteContent,
259
272
  mimeToExt,
260
273
  navChangeEvent,
274
+ navEntries,
261
275
  normalizeSiteIndex,
262
276
  onPrimaryVarValue,
277
+ pagesInNavOrder,
263
278
  primaryVarValue,
264
279
  rebindImageRef,
280
+ reconcileNav,
265
281
  registerSchema,
266
282
  registerSection,
267
283
  relativeLuminance,
@@ -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
@@ -137,7 +137,7 @@ async function restoreLocalChanges() {
137
137
  const siteId = metaRow?.siteId ?? "";
138
138
  return {
139
139
  sections,
140
- siteIndex: { siteId, pages: indexRow.pages, sections: indexRow.sections },
140
+ siteIndex: { siteId, pages: indexRow.pages, sections: indexRow.sections, nav: indexRow.nav },
141
141
  siteConfig: configRow?.config,
142
142
  deletedSections: indexRow.deletedSections ?? []
143
143
  };
@@ -163,6 +163,7 @@ async function persistSiteIndex(index, deletedSections = []) {
163
163
  key: "current",
164
164
  pages: index.pages,
165
165
  sections: index.sections,
166
+ nav: index.nav,
166
167
  deletedSections,
167
168
  updatedAt: now
168
169
  });
@@ -249,6 +250,7 @@ async function persistAll(sections, siteIndex, deletedSectionIds, siteConfig) {
249
250
  key: "current",
250
251
  pages: siteIndex.pages,
251
252
  sections: siteIndex.sections,
253
+ nav: siteIndex.nav,
252
254
  deletedSections: [],
253
255
  updatedAt: now
254
256
  });
@@ -3,6 +3,7 @@ export { cn } from "./cn";
3
3
  export { audiencePasses } from "./pages";
4
4
  export { resolveChatbotName, resolveThinkingPhrases, DEFAULT_CHATBOT_NAME } from "./chatbot";
5
5
  export { generateNavLinks, toSectionId, type NavItem } from "./nav";
6
+ export { navEntries, pagesInNavOrder, groupOfPage, groupDisplayLabel, reconcileNav } from "./nav-tree";
6
7
  export { deriveContrast, contrastColor, relativeLuminance, contrastRatio, wcagLevel, suggestAccessibleOn, type WcagLevel, } from "./contrast";
7
8
  export { primaryVarValue, accentVarValue, onPrimaryVarValue } from "./theme-vars";
8
9
  export { sanitizeHtml, ensureSanitizer } from "./sanitize";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EACL,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACtG,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvG,OAAO,EACL,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,mBAAmB,EACnB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACtG,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC"}
package/dist/lib/index.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  safeRedirect,
19
19
  suggestAccessibleOn,
20
20
  wcagLevel
21
- } from "../chunk-CS2ECR3U.js";
21
+ } from "../chunk-QEHPGA5N.js";
22
22
  import {
23
23
  curatedIcons,
24
24
  getIcon
@@ -34,15 +34,21 @@ import {
34
34
  generateNavLinks,
35
35
  sanitizeHtml,
36
36
  toSectionId
37
- } from "../chunk-53DKVAB6.js";
37
+ } from "../chunk-72CG6AA2.js";
38
38
  import {
39
39
  cn
40
40
  } from "../chunk-7EOSDFS3.js";
41
41
  import {
42
- audiencePasses
43
- } from "../chunk-YBVK254P.js";
42
+ audiencePasses,
43
+ groupDisplayLabel,
44
+ groupOfPage,
45
+ navEntries,
46
+ pagesInNavOrder,
47
+ reconcileNav
48
+ } from "../chunk-ZD6XGRQM.js";
44
49
  import "../chunk-S2L3BPLS.js";
45
50
  import "../chunk-5BM2Y3NJ.js";
51
+ import "../chunk-HJSE6SK5.js";
46
52
  import "../chunk-TZQPOR5A.js";
47
53
  import {
48
54
  clearRegistry,
@@ -88,12 +94,17 @@ export {
88
94
  getSchema,
89
95
  getSection,
90
96
  gridColsClass,
97
+ groupDisplayLabel,
98
+ groupOfPage,
91
99
  loadSiteContent,
92
100
  loadStaticSiteContent,
93
101
  mergeSiteContent,
94
102
  navChangeEvent,
103
+ navEntries,
95
104
  onPrimaryVarValue,
105
+ pagesInNavOrder,
96
106
  primaryVarValue,
107
+ reconcileNav,
97
108
  registerSchema,
98
109
  registerSection,
99
110
  relativeLuminance,
@@ -13,13 +13,13 @@ export interface SiteContent {
13
13
  * Validates each section file against its Zod schema.
14
14
  * Returns sections in the concatenated order of every page's order.
15
15
  */
16
- export declare function mergeSiteContent(index: SiteIndex, sectionFiles: Record<string, unknown>): SiteContent;
16
+ export declare function mergeSiteContent(index: SiteIndex, sectionFiles: Record<string, unknown>, navFile?: unknown): SiteContent;
17
17
  /**
18
18
  * Build a SiteContent from a Vite `import.meta.glob` result.
19
19
  * Callers glob the section JSON files at build time, pass the parsed index, and
20
20
  * receive sections merged across every page's order.
21
21
  */
22
- export declare function loadStaticSiteContent(index: SiteIndex, sectionGlob: Record<string, unknown>): SiteContent;
22
+ export declare function loadStaticSiteContent(index: SiteIndex, sectionGlob: Record<string, unknown>, navFile?: unknown): SiteContent;
23
23
  /**
24
24
  * Load site content from the filesystem.
25
25
  * For use in scripts and tests — Astro pages should use import.meta.glob instead.
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/lib/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAe,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAKvF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,WAAW,CA6Cb;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,WAAW,CAQb;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAe9E"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/lib/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAe,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAMvF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;CAClB;AAiBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,CAAC,EAAE,OAAO,GAChB,WAAW,CA6Cb;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE,OAAO,GAChB,WAAW,CAQb;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwB9E"}
@@ -0,0 +1,63 @@
1
+ import type { NavEntry, NavGroupEntry } from "../schemas/nav";
2
+ import type { Page, SiteIndex } from "../schemas/site-config";
3
+ /**
4
+ * Repair an authored nav against the current page set.
5
+ *
6
+ * Total, pure, and idempotent: every possible input maps to a valid nav in
7
+ * which each page appears exactly once. This is what lets the sidecar tolerate
8
+ * an older writer editing index.json without knowing about nav.json — the worst
9
+ * case is a page drifting to the bottom of the nav, never a hard failure. It is
10
+ * deliberately NOT a schema refinement: parse-rejecting content leaves viewer
11
+ * and editor both refusing to load, with no in-product repair path.
12
+ *
13
+ * "Total" is meant literally, so the shape guards below are load-bearing rather
14
+ * than paranoia: callers include agent-authored JSON and live editor state, and
15
+ * `pages` is not id-unique (IndexSchema checks slug uniqueness, not page ids).
16
+ * Every entry is cloned on the way out — the editor holds this in React state,
17
+ * where a returned-by-reference entry would let a later mutation silently edit
18
+ * prior state and defeat identity-based re-render checks.
19
+ */
20
+ export declare function reconcileNav(entries: NavEntry[], pages: Page[]): NavEntry[];
21
+ /**
22
+ * The ONLY sanctioned way to read the nav. Always reconciles, so callers never
23
+ * have to reason about whether index.nav is present, stale, or authored by an
24
+ * older writer. Cheap and idempotent — call it freely.
25
+ */
26
+ export declare function navEntries(index: SiteIndex): NavEntry[];
27
+ /** Pages in authored nav order. Use this anywhere user-visible sequence matters. */
28
+ export declare function pagesInNavOrder(index: SiteIndex): Page[];
29
+ export declare function groupOfPage(index: SiteIndex, pageId: string): NavGroupEntry | null;
30
+ /** Display fallback for blank group labels — mirrors pageDisplayTitle in lib/pages.ts. */
31
+ export declare function groupDisplayLabel(label: string): string;
32
+ /** A position in the nav: inside a group, or at the top level when groupId is null. */
33
+ export interface NavLocation {
34
+ groupId: string | null;
35
+ index: number;
36
+ }
37
+ export type NavRow = {
38
+ kind: "page";
39
+ pageId: string;
40
+ groupId: string | null;
41
+ index: number;
42
+ } | {
43
+ kind: "group";
44
+ groupId: string;
45
+ index: number;
46
+ } | {
47
+ kind: "empty-group";
48
+ groupId: string;
49
+ } | {
50
+ kind: "tail";
51
+ };
52
+ export declare function addGroup(index: SiteIndex, groupId: string): SiteIndex;
53
+ export declare function renameGroup(index: SiteIndex, groupId: string, label: string): SiteIndex;
54
+ export declare function setGroupStartCollapsed(index: SiteIndex, groupId: string, startCollapsed: boolean): SiteIndex;
55
+ /** Removes the group; its members become top-level entries at the group's slot. */
56
+ export declare function deleteGroup(index: SiteIndex, groupId: string): SiteIndex;
57
+ /**
58
+ * The single reorder+reparent primitive. `from` and `to` are both NavLocations,
59
+ * so moving within a container, between containers, and promoting/demoting a
60
+ * page are all the same operation.
61
+ */
62
+ export declare function moveNavEntry(index: SiteIndex, from: NavLocation, to: NavLocation): SiteIndex;
63
+ //# sourceMappingURL=nav-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-tree.d.ts","sourceRoot":"","sources":["../../src/lib/nav-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CA0C3E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,CAEvD;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,CAexD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAKlF;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAIxC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAMrB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAKrE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAIvF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,SAAS,CAI5G;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAUxE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,GAAG,SAAS,CAgC5F"}
package/dist/lib/nav.d.ts CHANGED
@@ -17,9 +17,20 @@ export interface PageNavItem {
17
17
  isActive: boolean;
18
18
  headings: NavItem[];
19
19
  }
20
- export interface SiteNav {
20
+ export interface GroupNavItem {
21
+ kind: "group";
22
+ id: string;
23
+ label: string;
24
+ startCollapsed: boolean;
21
25
  pages: PageNavItem[];
22
- /** Live pages with showInNav off — editor-only group, like the archive. */
26
+ }
27
+ export type SiteNavEntry = ({
28
+ kind: "page";
29
+ } & PageNavItem) | GroupNavItem;
30
+ export interface SiteNav {
31
+ /** The authored tree: loose pages and groups, in nav order. */
32
+ entries: SiteNavEntry[];
33
+ /** Live pages with showInNav off — editor-only flat bucket, like the archive. */
23
34
  hidden: PageNavItem[];
24
35
  archive: PageNavItem[];
25
36
  }
@@ -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;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,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,OAAO;IACtB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,2EAA2E;IAC3E,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;CAC5B,GAAG,OAAO,CA4BV"}
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;AAExD,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,MAAM,MAAM,YAAY,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC,GAAG,YAAY,CAAC;AAE3E,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;CAC5B,GAAG,OAAO,CAiDV"}
@@ -13,7 +13,6 @@ export declare function homePage(index: SiteIndex): Page;
13
13
  export declare function pageBySlug(index: SiteIndex, slug: string): Page | undefined;
14
14
  export declare function audiencePasses(access: string[], audience: string | null): boolean;
15
15
  export declare function addPage(index: SiteIndex, id: string): SiteIndex;
16
- export declare function reorderPages(index: SiteIndex, fromIndex: number, toIndex: number): SiteIndex;
17
16
  export declare function setHomePage(index: SiteIndex, pageId: string): SiteIndex;
18
17
  export declare function setPageArchived(index: SiteIndex, pageId: string, archived: boolean): SiteIndex;
19
18
  export declare function setPageFields(index: SiteIndex, pageId: string, patch: Partial<Pick<Page, "title" | "slug" | "showInNav">>): SiteIndex;
@@ -1 +1 @@
1
- {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/lib/pages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK3E,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE1F;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAQvE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEvE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAE/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAI3E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAIjF;AAMD,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAQ/D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAO5F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAWvE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,CAM9F;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,GACzD,SAAS,CAEX;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAgB5G;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,GACf;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAkBjD;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAUnD;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,GAClB,SAAS,CAQX;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAOrF;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,SAAS,CAWX;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GACzB,SAAS,CAuBX"}
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/lib/pages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK3E,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG1F;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAQvE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEvE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAE/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAI3E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAIjF;AAMD,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAY/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAWvE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,CAM9F;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,GACzD,SAAS,CAEX;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAgB5G;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,GACf;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAkBjD;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBnD;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,GAClB,SAAS,CAQX;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAOrF;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,SAAS,CAWX;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GACzB,SAAS,CAuBX"}
@@ -1,3 +1,4 @@
1
+ import type { NavLocation, NavRow } from "./nav-tree";
1
2
  /**
2
3
  * Compute the destination index for a closest-edge drag-to-reorder drop.
3
4
  *
@@ -9,4 +10,27 @@
9
10
  * Returns the target index, or `null` when the drop would not move the row.
10
11
  */
11
12
  export declare function computeReorderTarget(fromIndex: number, overIndex: number, edge: "top" | "bottom" | null): number | null;
13
+ /**
14
+ * Resolve a closest-edge drop over a nav row into a destination NavLocation.
15
+ *
16
+ * With one level of nesting a target's own identity determines its container,
17
+ * so page drags need no depth inference. Group drags DO need remapping: a group
18
+ * can only live at the top level, so hovering a member row is reinterpreted as
19
+ * "next to that member's group" rather than rejected — otherwise every member
20
+ * row of every expanded group is an inert dead zone during a group drag.
21
+ *
22
+ * `overEntryIndex` is the row's index in the TOP-LEVEL entry list: its own index
23
+ * for a top-level page or group row, its enclosing group's index for a member
24
+ * row, and the total entry count for the tail row. Group-drag remapping targets
25
+ * it directly.
26
+ *
27
+ * Returns null when the drop would not move anything, or is not permitted.
28
+ */
29
+ export declare function computeNavDropTarget(args: {
30
+ from: NavLocation;
31
+ fromKind: "page" | "group";
32
+ over: NavRow;
33
+ overEntryIndex: number;
34
+ edge: "top" | "bottom" | null;
35
+ }): NavLocation | null;
12
36
  //# sourceMappingURL=reorder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reorder.d.ts","sourceRoot":"","sources":["../../src/lib/reorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,IAAI,GAC5B,MAAM,GAAG,IAAI,CAKf"}
1
+ {"version":3,"file":"reorder.d.ts","sourceRoot":"","sources":["../../src/lib/reorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,IAAI,GAC5B,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC/B,GAAG,WAAW,GAAG,IAAI,CA8BrB"}
@@ -18,8 +18,8 @@ import {
18
18
  resolveMedia,
19
19
  sanitizeMediaName,
20
20
  setMediaProvider
21
- } from "../chunk-SOILPZ7U.js";
22
- import "../chunk-YBVK254P.js";
21
+ } from "../chunk-S4L3ZFKM.js";
22
+ import "../chunk-ZD6XGRQM.js";
23
23
  import {
24
24
  ImageManifestSchema,
25
25
  MediaConfigSchema,
@@ -1,6 +1,7 @@
1
1
  export * from "./shared";
2
2
  export * from "./sections";
3
3
  export * from "./site-config";
4
+ export * from "./nav";
4
5
  export * from "./media";
5
6
  export * from "./audience";
6
7
  export * from "./media-grid-options";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
@@ -3,7 +3,7 @@ import {
3
3
  AudienceNameSchema,
4
4
  MediaGridOptionsSchema,
5
5
  slugifyAudienceName
6
- } from "../chunk-3HJDMFTB.js";
6
+ } from "../chunk-XYCCXKVC.js";
7
7
  import {
8
8
  AudienceSchema,
9
9
  RoleSchema,
@@ -16,6 +16,10 @@ import {
16
16
  LinkValueSchema,
17
17
  isSafeHref
18
18
  } from "../chunk-PZJL2S3Z.js";
19
+ import {
20
+ NavEntrySchema,
21
+ NavFileSchema
22
+ } from "../chunk-HJSE6SK5.js";
19
23
  import {
20
24
  getSectionContentSchema,
21
25
  getSectionSchema
@@ -64,6 +68,8 @@ export {
64
68
  MediaGridOptionsSchema,
65
69
  MediaItemSchema,
66
70
  MediaReferenceSchema,
71
+ NavEntrySchema,
72
+ NavFileSchema,
67
73
  PageSchema,
68
74
  PageStatusSchema,
69
75
  RESERVED_SLUGS,
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The site's authored navigation tree, persisted to `src/content/nav.json`.
4
+ *
5
+ * Deliberately NOT a key on index.json: `applyContentWrite` re-serializes the
6
+ * Zod-parsed index, so any writer running a package version that predates a new
7
+ * index key silently deletes it from disk. A sidecar is absent from an old
8
+ * writer's file list and survives untouched.
9
+ */
10
+ export declare const NavEntrySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
11
+ kind: z.ZodLiteral<"page">;
12
+ pageId: z.ZodString;
13
+ }, z.core.$strip>, z.ZodObject<{
14
+ kind: z.ZodLiteral<"group">;
15
+ id: z.ZodString;
16
+ label: z.ZodDefault<z.ZodString>;
17
+ startCollapsed: z.ZodDefault<z.ZodBoolean>;
18
+ pageIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
19
+ }, z.core.$strip>], "kind">;
20
+ export declare const NavFileSchema: z.ZodObject<{
21
+ entries: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
22
+ kind: z.ZodLiteral<"page">;
23
+ pageId: z.ZodString;
24
+ }, z.core.$strip>, z.ZodObject<{
25
+ kind: z.ZodLiteral<"group">;
26
+ id: z.ZodString;
27
+ label: z.ZodDefault<z.ZodString>;
28
+ startCollapsed: z.ZodDefault<z.ZodBoolean>;
29
+ pageIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
30
+ }, z.core.$strip>], "kind">>;
31
+ }, z.core.$strip>;
32
+ export type NavEntry = z.infer<typeof NavEntrySchema>;
33
+ export type NavPageEntry = Extract<NavEntry, {
34
+ kind: "page";
35
+ }>;
36
+ export type NavGroupEntry = Extract<NavEntry, {
37
+ kind: "group";
38
+ }>;
39
+ export type NavFile = z.infer<typeof NavFileSchema>;
40
+ //# sourceMappingURL=nav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../../src/schemas/nav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;;;;;;;;;2BAgBzB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;iBAExB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AACjE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import type { NavEntry } from "./nav";
2
3
  export declare const StatusSchema: z.ZodPipe<z.ZodEnum<{
3
4
  draft: "draft";
4
5
  live: "live";
@@ -417,7 +418,16 @@ export declare const IndexSchema: z.ZodPipe<z.ZodPipe<z.ZodObject<{
417
418
  }, z.core.$strip>>;
418
419
  lastModified: z.ZodOptional<z.ZodNullable<z.ZodString>>;
419
420
  }, z.core.$strip>>;
420
- export type SiteIndex = z.infer<typeof CanonicalIndexSchema>;
421
+ /**
422
+ * `nav` is a RUNTIME field only: it is loaded from the src/content/nav.json
423
+ * sidecar and attached by the loader, never parsed from or written to
424
+ * index.json. It is optional because most SiteIndex values (tests, legacy
425
+ * content, partial writes) have no nav — reads go through navEntries(), which
426
+ * reconciles a missing nav into a flat one.
427
+ */
428
+ export type SiteIndex = z.infer<typeof CanonicalIndexSchema> & {
429
+ nav?: NavEntry[];
430
+ };
421
431
  /** Parse + normalize any raw index (legacy or canonical) to the canonical shape. */
422
432
  export declare function normalizeSiteIndex(raw: unknown): SiteIndex;
423
433
  export declare const ChatbotTaskSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"site-config.d.ts","sourceRoot":"","sources":["../../src/schemas/site-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,YAAY;;;;;+FAExB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;iBAI5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAQ5D,eAAO,MAAM,cAAc,8EAA+E,CAAC;AAW3G,eAAO,MAAM,gBAAgB;;;EAA+B,CAAC;AAE7D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AA0C9C,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuEtB,CAAC;AAEL,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAyE,CAAC;AAElG,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE7D,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAE1D;AAMD,eAAO,MAAM,iBAAiB;;;;;iBAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;iBAiC5B,CAAC;AACL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmE3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"site-config.d.ts","sourceRoot":"","sources":["../../src/schemas/site-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,eAAO,MAAM,YAAY;;;;;+FAExB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;iBAI5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAQ5D,eAAO,MAAM,cAAc,8EAA+E,CAAC;AAW3G,eAAO,MAAM,gBAAgB;;;EAA+B,CAAC;AAE7D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAUrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AA0C9C,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuEtB,CAAC;AAEL,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAyE,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC;AAEpF,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAE1D;AAMD,eAAO,MAAM,iBAAiB;;;;;iBAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;iBAiC5B,CAAC;AACL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmE3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drawnagency/primitives",
3
- "version": "0.1.96",
3
+ "version": "0.1.97",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./package.json": "./package.json",
@@ -3,6 +3,8 @@
3
3
  // path and the live save-sync path (both in core); no I/O here.
4
4
  import type { LoadedSection } from "../lib/loader";
5
5
  import type { SiteIndex } from "../schemas/site-config";
6
+ import { IndexSchema } from "../schemas/site-config";
7
+ import { NavFileSchema } from "../schemas/nav";
6
8
 
7
9
  export interface RebaseArgs {
8
10
  localSections: LoadedSection[];
@@ -79,6 +81,39 @@ export function reconcileRemoteIndex(remoteIndex: SiteIndex, localIndex: SiteInd
79
81
  };
80
82
  }
81
83
 
84
+ /** Parse a peer's raw live-index broadcast and fold it under ours — the whole
85
+ * `onRemoteIndexUpdate` transform, kept here rather than in the handler so the
86
+ * nav-preservation step below cannot be lost to a future refactor of the shell.
87
+ * Returns null when the payload is not a valid index (caller ignores the
88
+ * message).
89
+ *
90
+ * The `nav` lift is load-bearing and mirrors content-ops' write path.
91
+ * `IndexSchema` STRIPS unknown keys — that strip is what guarantees nav never
92
+ * reaches index.json — so parsing a peer's index without lifting nav off first
93
+ * yields a nav-less index. Installing that flattens the local sidebar, and
94
+ * since every structural mutation materializes a full nav from `navEntries()`,
95
+ * the next local page/group edit would save a flat nav.json and delete every
96
+ * group on the site. Silent, and reachable from an ordinary two-editor session.
97
+ *
98
+ * Nav entries address PAGES, which `reconcileRemoteIndex`'s section-id prune
99
+ * never touches, so the peer's nav transfers whole; readers go through
100
+ * `navEntries()` → `reconcileNav`, which repairs any drift against the
101
+ * resulting page set. A peer that sends no nav (an older client) leaves ours
102
+ * intact rather than flattening it. */
103
+ export function applyRemoteIndexUpdate(rawRemoteIndex: unknown, localIndex: SiteIndex): SiteIndex | null {
104
+ const rawNav = (rawRemoteIndex as { nav?: unknown } | null | undefined)?.nav;
105
+ const parsed = IndexSchema.safeParse(rawRemoteIndex);
106
+ if (!parsed.success) return null;
107
+
108
+ // safeParse, not parse: this arrives off the network, and a throw inside a
109
+ // collab callback would take down the session rather than one bad message.
110
+ const parsedNav = rawNav === undefined ? null : NavFileSchema.safeParse({ entries: rawNav });
111
+ const nav = parsedNav?.success ? parsedNav.data.entries : localIndex.nav;
112
+
113
+ const reconciled = reconcileRemoteIndex(parsed.data, localIndex);
114
+ return nav !== undefined ? { ...reconciled, nav } : reconciled;
115
+ }
116
+
82
117
  export function rebaseContent(args: RebaseArgs): RebaseResult {
83
118
  const localById = new Map(args.localSections.map((s) => [s.section.id, s]));
84
119
  const remoteIds = new Set(args.remoteSections.map((s) => s.section.id));
@@ -1,13 +1,20 @@
1
1
  /**
2
2
  * The horizontal insertion line shown at the top or bottom edge of a row during
3
3
  * a closest-edge drag-to-reorder, paired with `useSortableRow`'s `closestEdge`.
4
+ *
5
+ * `inset` starts the line at the nested-row indent, which is the ONLY thing
6
+ * distinguishing "drop inside this group" from "drop before this group" — and
7
+ * a group's last member slot from the top-level slot that follows it.
4
8
  */
5
- export function DropEdgeIndicator({ edge }: { edge: "top" | "bottom" | null }) {
6
- if (edge === "top") {
7
- return <div className="absolute top-0 right-0 left-0 z-10 h-0.5 -translate-y-1/2 bg-primary" />;
8
- }
9
- if (edge === "bottom") {
10
- return <div className="absolute right-0 bottom-0 left-0 z-10 h-0.5 translate-y-1/2 bg-primary" />;
11
- }
12
- return null;
9
+ export function DropEdgeIndicator({ edge, inset = false }: { edge: "top" | "bottom" | null; inset?: boolean }) {
10
+ if (!edge) return null;
11
+ return (
12
+ <div
13
+ className={[
14
+ "absolute right-0 z-10 h-0.5 bg-primary",
15
+ inset ? "left-6" : "left-0",
16
+ edge === "top" ? "top-0 -translate-y-1/2" : "bottom-0 translate-y-1/2",
17
+ ].join(" ")}
18
+ />
19
+ );
13
20
  }