@connextar/house 0.15.2 → 0.16.1

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 (47) hide show
  1. package/README.md +64 -0
  2. package/dist/changelog/changelog.d.ts +10 -1
  3. package/dist/changelog/changelog.d.ts.map +1 -1
  4. package/dist/changelog/changelog.js +15 -5
  5. package/dist/changelog/changelog.js.map +1 -1
  6. package/dist/guides/guide-article.d.ts +27 -0
  7. package/dist/guides/guide-article.d.ts.map +1 -0
  8. package/dist/guides/guide-article.js +19 -0
  9. package/dist/guides/guide-article.js.map +1 -0
  10. package/dist/guides/guide-toc.d.ts +22 -0
  11. package/dist/guides/guide-toc.d.ts.map +1 -0
  12. package/dist/guides/guide-toc.js +66 -0
  13. package/dist/guides/guide-toc.js.map +1 -0
  14. package/dist/guides/guides-landing.d.ts +14 -0
  15. package/dist/guides/guides-landing.d.ts.map +1 -0
  16. package/dist/guides/guides-landing.js +12 -0
  17. package/dist/guides/guides-landing.js.map +1 -0
  18. package/dist/guides/guides-search.d.ts +13 -0
  19. package/dist/guides/guides-search.d.ts.map +1 -0
  20. package/dist/guides/guides-search.js +68 -0
  21. package/dist/guides/guides-search.js.map +1 -0
  22. package/dist/guides/guides-shell.d.ts +15 -0
  23. package/dist/guides/guides-shell.d.ts.map +1 -0
  24. package/dist/guides/guides-shell.js +19 -0
  25. package/dist/guides/guides-shell.js.map +1 -0
  26. package/dist/guides/guides-sidebar.d.ts +10 -0
  27. package/dist/guides/guides-sidebar.d.ts.map +1 -0
  28. package/dist/guides/guides-sidebar.js +29 -0
  29. package/dist/guides/guides-sidebar.js.map +1 -0
  30. package/dist/guides/index.d.ts +8 -0
  31. package/dist/guides/index.d.ts.map +1 -0
  32. package/dist/guides/index.js +8 -0
  33. package/dist/guides/index.js.map +1 -0
  34. package/dist/guides/library.d.ts +85 -0
  35. package/dist/guides/library.d.ts.map +1 -0
  36. package/dist/guides/library.js +63 -0
  37. package/dist/guides/library.js.map +1 -0
  38. package/dist/release/changelog.d.ts +84 -0
  39. package/dist/release/changelog.d.ts.map +1 -1
  40. package/dist/release/changelog.js +117 -0
  41. package/dist/release/changelog.js.map +1 -1
  42. package/dist/release/index.d.ts +1 -1
  43. package/dist/release/index.d.ts.map +1 -1
  44. package/dist/release/index.js +1 -1
  45. package/dist/release/index.js.map +1 -1
  46. package/docs/ReleaseProcess.md +27 -4
  47. package/package.json +6 -1
package/README.md CHANGED
@@ -579,6 +579,16 @@ skips a step, dates out of order, a release with no title. An app's
579
579
  `lib/release.test.ts` asserts it is empty. `nextVersion(current, kind)` applies
580
580
  the 0.x rule (a MAJOR-class change bumps the minor before 1.0.0).
581
581
 
582
+ The changelog has two readers. The team reads every change in its own words;
583
+ the public reads `publicChangelog(CHANGELOG)` — the newest five reviewed
584
+ releases, with `audience: "internal"` changes and sections left out (operations,
585
+ infrastructure, limits, security mechanics), `public: { … }` wording in place
586
+ of the team's where that says too much, and one generic "Behind the scenes" line
587
+ wherever something was left out. A release reaches the public only once it has
588
+ its `public` review (even `public: {}`), so a forgotten review hides a release
589
+ rather than leaking it, and `publicChangelogProblems(CHANGELOG)` — asserted
590
+ empty beside `releaseHistoryProblems` — fails until the newest five have one.
591
+
582
592
  The process itself — how to classify a change, how to write the notes, the
583
593
  runbook — is [`docs/ReleaseProcess.md`](docs/ReleaseProcess.md), shipped in the
584
594
  package. Each app's own `docs/operations/ReleaseProcess.md` links to it and adds
@@ -611,6 +621,20 @@ version range. `changelogPageCount` sizes the app's static pages, and
611
621
  the page it moved to. (AltEd's single page had reached 1.8 MB of HTML at 108
612
622
  releases.)
613
623
 
624
+ One URL serves both readers: the page passes `publicChangelog(CHANGELOG)` to
625
+ everyone, and the whole `CHANGELOG` with `showAudience` to the people allowed
626
+ the team's view (each app decides who — PharmaLineAI's platform admins).
627
+ `showAudience` marks internal changes, releases not yet public, and the public
628
+ wording under each change that has one, so the team can see exactly what the
629
+ public reads.
630
+
631
+ Each release the public list shows carries `previousVersion`, the release it
632
+ really followed in the whole history, and `<Changelog>` labels it major, minor
633
+ or patch from that. Without it the oldest of the five had nothing under it and
634
+ showed no kind (0.16.0), and a release shown above a hidden, unreviewed one was
635
+ measured against the wrong version. An app that worked out the kind itself can
636
+ drop that and pass `publicChangelog(CHANGELOG)` straight in.
637
+
614
638
  ### `@connextar/house/markdown`
615
639
 
616
640
  The help-centre guide renderer, and the GitHub-flavoured table parser under it.
@@ -642,6 +666,46 @@ export function Markdown({ content }: { content: string }) {
642
666
 
643
667
  `classNames` replaces the look of any element for an app without theme tokens.
644
668
 
669
+ ### `@connextar/house/guides`
670
+
671
+ The frame a help centre's pages sit in, so every app's guides read and are found
672
+ the same way — quickie had one, PharmaLineAI copied it, and the public and
673
+ signed-in guide pages within one app had already drifted apart. Each app keeps
674
+ its Markdown, its registry of who may read what, and its page chrome; this is the
675
+ part between them:
676
+
677
+ - `GuidesShell` — a sticky left rail with `GuidesSearch` (a dialog over guide
678
+ titles, summaries and section headings; ⌘K / Ctrl+K and `/` open it, arrow keys
679
+ and Enter choose) and `GuidesSidebar` (the guides grouped by category, with a
680
+ filter), behind a menu button on a phone, beside the page.
681
+ - `GuidesLanding` — each category's guides as cards that open them; `icon`
682
+ gives a card the app's own icon.
683
+ - `GuideArticle` — one guide: a way back, its category, title and lede, the body
684
+ drawn by `GuideMarkdown`, and `GuideToc` — an "On this page" rail that
685
+ highlights the section being read as you scroll (a collapsible list on narrow
686
+ screens). `useActiveHeading` is the scroll tracking on its own.
687
+
688
+ They all draw from a `GuideLibrary` — `{ nav, search }`, plain data — that the
689
+ app builds on the server **for one reader**, so a guide that reader can't open is
690
+ never sent to the browser. `meaningfulSections(extractHeadings(body))` makes a
691
+ guide's search sections without the headings every guide has; `searchGuides` is
692
+ the search on its own; `labels` changes any word.
693
+
694
+ ```tsx
695
+ import { GuideArticle, GuidesShell } from "@connextar/house/guides";
696
+
697
+ const library = await getGuideLibrary("public"); // the app's: categories × the guides this reader may open
698
+
699
+ export default async function GuidePage({ params }) {
700
+ const guide = await getPublicGuide((await params).slug);
701
+ return (
702
+ <GuidesShell library={library}>
703
+ <GuideArticle guide={guide} guidesPath="/guides" category={categoryOf(library, guide.slug)?.title} />
704
+ </GuidesShell>
705
+ );
706
+ }
707
+ ```
708
+
645
709
  ### `@connextar/house/trail`
646
710
 
647
711
  Where you came from, rather than where the URL says you are. A breadcrumb built
@@ -23,6 +23,11 @@ import { type ReleaseKind } from "../release/version.js";
23
23
  * Tag colours default to tokens every house app has (`primary`, `accent`,
24
24
  * `muted`, `border`). An app with `success` and `warning` tokens can pass
25
25
  * `tagClassNames` for the fuller palette.
26
+ *
27
+ * The public sees `publicChangelog(CHANGELOG)`; the team sees the whole
28
+ * history. `showAudience` is for the team's view: it marks what the public
29
+ * doesn't see — internal sections and changes, a release not yet reviewed —
30
+ * and shows the public wording under any change that has one.
26
31
  */
27
32
  export declare const DEFAULT_TAG_CLASS_NAMES: Record<ChangeType, string>;
28
33
  export declare const TAG_LABELS: Record<ChangeType, string>;
@@ -54,6 +59,10 @@ export interface ChangelogProps {
54
59
  stickyTop?: string;
55
60
  /** Show one page of the history rather than all of it (pages count from 1). */
56
61
  paging?: ChangelogPaging;
62
+ /** Mark internal changes, unreviewed releases and public rewording — for the team's view only. */
63
+ showAudience?: boolean;
64
+ /** The "Internal" and "Not public yet" pills' colours. */
65
+ audienceClassName?: string;
57
66
  className?: string;
58
67
  }
59
68
  export interface ChangelogPaging {
@@ -70,7 +79,7 @@ export declare function changelogPageCount(releases: readonly ChangelogRelease[]
70
79
  export declare function changelogPageOf(releases: readonly ChangelogRelease[], version: string, pageSize: number): number | null;
71
80
  /** `**label**` → <strong>label</strong>; nothing else is interpreted. */
72
81
  export declare function renderReleaseText(text: string): ReactNode;
73
- export declare function Changelog({ releases, tagClassNames, releaseTitleClassName, eyebrowClassName, summaryClassName, latestClassName, sectionHeadingClassName, sectionCountClassName, renderText, locale, stickyTop, paging, className, }: ChangelogProps): import("react").JSX.Element;
82
+ export declare function Changelog({ releases, tagClassNames, releaseTitleClassName, eyebrowClassName, summaryClassName, latestClassName, sectionHeadingClassName, sectionCountClassName, renderText, locale, stickyTop, paging, showAudience, audienceClassName, className, }: ChangelogProps): import("react").JSX.Element;
74
83
  /** Figures for a page hero: the latest version, how many releases, how many changes. */
75
84
  export declare function changelogStats(releases: readonly ChangelogRelease[]): {
76
85
  latest: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../src/changelog/changelog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAK9D,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKjD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAInD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,6DAA6D;IAC7D,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IACzC,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,4GAA4G;IAC5G,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElG;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAGf;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAWzD;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,aAAa,EACb,qBAAwF,EACxF,gBAA4F,EAC5F,gBAAgF,EAChF,eAAqE,EACrE,uBAAyF,EACzF,qBAAmG,EACnG,UAA8B,EAC9B,MAAgB,EAChB,SAAkB,EAClB,MAAM,EACN,SAAS,GACV,EAAE,cAAc,+BA8GhB;AA4DD,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,GAAG;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAMA"}
1
+ {"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../src/changelog/changelog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAK9D,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKjD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAInD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,6DAA6D;IAC7D,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IACzC,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,kGAAkG;IAClG,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,4GAA4G;IAC5G,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElG;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAGf;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAWzD;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,aAAa,EACb,qBAAwF,EACxF,gBAA4F,EAC5F,gBAAgF,EAChF,eAAqE,EACrE,uBAAyF,EACzF,qBAAmG,EACnG,UAA8B,EAC9B,MAAgB,EAChB,SAAkB,EAClB,MAAM,EACN,YAAoB,EACpB,iBAA4F,EAC5F,SAAS,GACV,EAAE,cAAc,+BAiJhB;AA4DD,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,GAAG;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAMA"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cx } from "../internal/cx.js";
3
- import { countChanges, formatReleaseDate, releaseAnchor, } from "../release/changelog.js";
3
+ import { countChanges, formatReleaseDate, isInternalChange, releaseAnchor, } from "../release/changelog.js";
4
4
  import { releaseKind } from "../release/version.js";
5
5
  /**
6
6
  * The body of a /changelog page: an index of releases beside the releases
@@ -24,6 +24,11 @@ import { releaseKind } from "../release/version.js";
24
24
  * Tag colours default to tokens every house app has (`primary`, `accent`,
25
25
  * `muted`, `border`). An app with `success` and `warning` tokens can pass
26
26
  * `tagClassNames` for the fuller palette.
27
+ *
28
+ * The public sees `publicChangelog(CHANGELOG)`; the team sees the whole
29
+ * history. `showAudience` is for the team's view: it marks what the public
30
+ * doesn't see — internal sections and changes, a release not yet reviewed —
31
+ * and shows the public wording under any change that has one.
27
32
  */
28
33
  export const DEFAULT_TAG_CLASS_NAMES = {
29
34
  new: "border-primary/40 bg-primary/10 text-primary",
@@ -56,16 +61,21 @@ export function renderReleaseText(text) {
56
61
  const parts = text.split(/(\*\*[^*\n]+\*\*)/g);
57
62
  return parts.map((part, i) => part.startsWith("**") && part.endsWith("**") && part.length > 4 ? (_jsx("strong", { className: "font-semibold text-foreground", children: part.slice(2, -2) }, i)) : (part));
58
63
  }
59
- export function Changelog({ releases, tagClassNames, releaseTitleClassName = "text-2xl font-semibold tracking-tight text-balance sm:text-3xl", eyebrowClassName = "text-xs font-semibold tracking-[0.14em] text-muted-foreground uppercase", summaryClassName = "max-w-prose text-base leading-relaxed text-muted-foreground", latestClassName = "border-primary bg-primary text-primary-foreground", sectionHeadingClassName = "text-xs font-bold tracking-[0.14em] text-foreground uppercase", sectionCountClassName = "text-[11px] font-medium tracking-normal text-muted-foreground normal-case", renderText = renderReleaseText, locale = "en-GB", stickyTop = "7rem", paging, className, }) {
64
+ export function Changelog({ releases, tagClassNames, releaseTitleClassName = "text-2xl font-semibold tracking-tight text-balance sm:text-3xl", eyebrowClassName = "text-xs font-semibold tracking-[0.14em] text-muted-foreground uppercase", summaryClassName = "max-w-prose text-base leading-relaxed text-muted-foreground", latestClassName = "border-primary bg-primary text-primary-foreground", sectionHeadingClassName = "text-xs font-bold tracking-[0.14em] text-foreground uppercase", sectionCountClassName = "text-[11px] font-medium tracking-normal text-muted-foreground normal-case", renderText = renderReleaseText, locale = "en-GB", stickyTop = "7rem", paging, showAudience = false, audienceClassName = "border-dashed border-foreground/40 bg-background text-muted-foreground", className, }) {
65
+ const audiencePill = (label) => (_jsx("span", { className: cx("inline-flex h-fit w-fit items-center rounded-full border px-2 py-0.5 text-[11px] font-semibold tracking-normal normal-case", audienceClassName), children: label }));
60
66
  const tags = { ...DEFAULT_TAG_CLASS_NAMES, ...tagClassNames };
61
67
  const pageSize = paging ? Math.max(1, paging.pageSize) : releases.length;
62
68
  const start = paging ? (paging.page - 1) * pageSize : 0;
63
69
  const shown = releases.slice(start, start + pageSize);
64
70
  return (_jsxs("div", { className: cx("mx-auto grid max-w-6xl gap-10 px-4 py-12 lg:grid-cols-[14rem_minmax(0,1fr)] lg:gap-16", className), children: [_jsx("nav", { "aria-label": "Releases", className: "min-w-0", children: _jsxs("div", { className: "lg:sticky", style: { top: stickyTop }, children: [_jsx("p", { className: eyebrowClassName, children: "Releases" }), _jsx("ol", { className: "-mx-4 mt-4 flex gap-2 overflow-x-auto px-4 pb-2 lg:mx-0 lg:block lg:max-h-[calc(100vh-10rem)] lg:space-y-0.5 lg:overflow-y-auto lg:border-l lg:border-border lg:px-0 lg:pb-0", children: shown.map((release) => (_jsx("li", { className: "shrink-0", children: _jsxs("a", { href: `#${releaseAnchor(release.version)}`, className: "block rounded-full border border-border px-3 py-1.5 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-foreground lg:-ml-px lg:rounded-none lg:border-0 lg:border-l-2 lg:border-transparent lg:py-1.5 lg:pr-2 lg:pl-4", children: [_jsxs("span", { className: "font-mono text-xs font-semibold text-foreground", children: ["v", release.version] }), _jsx("span", { className: "hidden truncate lg:block", children: release.title })] }) }, release.version))) })] }) }), _jsxs("div", { className: "min-w-0 space-y-20", children: [shown.map((release, i) => {
65
71
  const anchor = releaseAnchor(release.version);
66
- const previous = releases[start + i + 1];
67
- const kind = previous ? releaseKind(previous.version, release.version) : null;
68
- return (_jsxs("article", { id: anchor, "aria-labelledby": `${anchor}-title`, style: { scrollMarginTop: stickyTop }, children: [_jsxs("header", { className: "border-b border-border pb-7", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-2", children: [_jsxs("span", { className: "rounded-full border border-primary/40 bg-primary/10 px-2.5 py-0.5 font-mono text-xs font-semibold text-primary", children: ["v", release.version] }), start + i === 0 ? (_jsx("span", { className: cx("rounded-full border px-2.5 py-0.5 text-[11px] font-semibold", latestClassName), children: "Latest" })) : null, kind ? _jsx("span", { className: "text-xs text-muted-foreground", children: KIND_LABELS[kind] }) : null, _jsx("span", { className: "text-xs text-muted-foreground", "aria-hidden": "true", children: "\u00B7" }), _jsx("time", { dateTime: release.date, className: "text-xs text-muted-foreground", children: formatReleaseDate(release.date, locale) })] }), _jsx("h2", { id: `${anchor}-title`, className: cx("mt-4", releaseTitleClassName), children: release.title }), _jsx("p", { className: cx("mt-3", summaryClassName), children: release.summary })] }), _jsx("div", { className: "mt-9 space-y-10", children: release.sections.map((section) => (_jsxs("section", { "aria-label": `${section.heading} — v${release.version}`, children: [_jsxs("h3", { className: cx("flex items-baseline gap-2", sectionHeadingClassName), children: [section.heading, _jsxs("span", { className: sectionCountClassName, children: [section.changes.length, " ", section.changes.length === 1 ? "change" : "changes"] })] }), _jsx("ul", { className: "mt-4 divide-y divide-border overflow-hidden rounded-2xl border border-border bg-card", children: section.changes.map((change) => (_jsxs("li", { className: "grid gap-2.5 p-5 sm:grid-cols-[5.5rem_minmax(0,1fr)] sm:gap-5", children: [_jsx("span", { className: cx("inline-flex h-fit w-fit items-center rounded-full border px-2 py-0.5 text-[11px] font-semibold", tags[change.type]), children: TAG_LABELS[change.type] }), _jsxs("div", { children: [_jsx("p", { className: "leading-snug font-semibold text-card-foreground", children: change.title }), _jsx("p", { className: "mt-1.5 text-sm leading-relaxed text-muted-foreground", children: renderText(change.text) })] })] }, change.title))) })] }, section.heading))) })] }, release.version));
72
+ // A public list carries each release's real predecessor; the team's whole
73
+ // history has it next in the list.
74
+ const previousVersion = release.previousVersion ?? releases[start + i + 1]?.version;
75
+ const kind = previousVersion ? releaseKind(previousVersion, release.version) : null;
76
+ return (_jsxs("article", { id: anchor, "aria-labelledby": `${anchor}-title`, style: { scrollMarginTop: stickyTop }, children: [_jsxs("header", { className: "border-b border-border pb-7", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-2", children: [_jsxs("span", { className: "rounded-full border border-primary/40 bg-primary/10 px-2.5 py-0.5 font-mono text-xs font-semibold text-primary", children: ["v", release.version] }), start + i === 0 ? (_jsx("span", { className: cx("rounded-full border px-2.5 py-0.5 text-[11px] font-semibold", latestClassName), children: "Latest" })) : null, kind ? _jsx("span", { className: "text-xs text-muted-foreground", children: KIND_LABELS[kind] }) : null, showAudience && !release.public ? audiencePill("Not public yet") : null, _jsx("span", { className: "text-xs text-muted-foreground", "aria-hidden": "true", children: "\u00B7" }), _jsx("time", { dateTime: release.date, className: "text-xs text-muted-foreground", children: formatReleaseDate(release.date, locale) })] }), _jsx("h2", { id: `${anchor}-title`, className: cx("mt-4", releaseTitleClassName), children: release.title }), _jsx("p", { className: cx("mt-3", summaryClassName), children: release.summary }), showAudience && (release.public?.title || release.public?.summary) ? (_jsxs("p", { className: "mt-3 text-sm text-muted-foreground", children: [_jsx("span", { className: "font-semibold text-foreground", children: "Public: " }), [release.public.title, release.public.summary].filter(Boolean).join(" — ")] })) : null] }), _jsx("div", { className: "mt-9 space-y-10", children: release.sections.map((section) => (_jsxs("section", { "aria-label": `${section.heading} — v${release.version}`, children: [_jsxs("h3", { className: cx("flex items-baseline gap-2", sectionHeadingClassName), children: [section.heading, _jsxs("span", { className: sectionCountClassName, children: [section.changes.length, " ", section.changes.length === 1 ? "change" : "changes"] }), showAudience && section.audience === "internal" ? audiencePill("Internal") : null, showAudience && section.public?.heading ? (_jsxs("span", { className: sectionCountClassName, children: ["public: ", section.public.heading] })) : null] }), _jsx("ul", { className: "mt-4 divide-y divide-border overflow-hidden rounded-2xl border border-border bg-card", children: section.changes.map((change) => (_jsxs("li", { className: "grid gap-2.5 p-5 sm:grid-cols-[5.5rem_minmax(0,1fr)] sm:gap-5", children: [_jsx("span", { className: cx("inline-flex h-fit w-fit items-center rounded-full border px-2 py-0.5 text-[11px] font-semibold", tags[change.type]), children: TAG_LABELS[change.type] }), _jsxs("div", { children: [_jsxs("p", { className: "flex flex-wrap items-center gap-2 leading-snug font-semibold text-card-foreground", children: [change.title, showAudience && change.audience === "internal" && section.audience !== "internal"
77
+ ? audiencePill("Internal")
78
+ : null] }), _jsx("p", { className: "mt-1.5 text-sm leading-relaxed text-muted-foreground", children: renderText(change.text) }), showAudience && change.public && !isInternalChange(change, section) ? (_jsxs("p", { className: "mt-2 border-l-2 border-border pl-3 text-sm leading-relaxed text-muted-foreground", children: [_jsx("span", { className: "font-semibold text-foreground", children: "Public: " }), change.public.title ? _jsxs("strong", { children: [change.public.title, ". "] }) : null, renderText(change.public.text ?? change.text)] })) : null] })] }, change.title))) })] }, section.heading))) })] }, release.version));
69
79
  }), paging ? _jsx(Pager, { releases: releases, paging: paging, pageSize: pageSize }) : null] })] }));
70
80
  }
71
81
  const PAGE_LINK = "rounded-full border border-border px-3 py-1.5 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-foreground";
@@ -1 +1 @@
1
- {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/changelog/changelog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/changelog/changelog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type GuideClassNames } from "../markdown/guide.js";
2
+ import { type GuidesLabels } from "./library.js";
3
+ export interface GuideArticleProps {
4
+ /** The guide as `parseGuideFrontmatter` splits it. */
5
+ guide: {
6
+ title: string;
7
+ lede?: string;
8
+ body: string;
9
+ };
10
+ /** Where "All guides" goes, and where relative links (`settings.md`) resolve. */
11
+ guidesPath: string;
12
+ /** The file name (without `.md`) of the guide index, which links to `guidesPath` itself. */
13
+ indexSlug?: string;
14
+ /** The category, shown above the title. */
15
+ category?: string;
16
+ labels?: Partial<GuidesLabels>;
17
+ classNames?: Partial<GuideClassNames>;
18
+ }
19
+ /**
20
+ * One guide, laid out for reading inside `GuidesShell`: a way back to all guides, the category,
21
+ * the title and lede, the article drawn by `GuideMarkdown`, and "On this page" — a rail that
22
+ * follows the reader on wide screens, a collapsible list above the article on narrow ones. The
23
+ * contents use the same heading ids the renderer gives, so `#<heading id>` links land.
24
+ * Server-safe; the contents are the only client part.
25
+ */
26
+ export declare function GuideArticle({ guide, guidesPath, indexSlug, category, labels, classNames }: GuideArticleProps): import("react").JSX.Element;
27
+ //# sourceMappingURL=guide-article.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-article.d.ts","sourceRoot":"","sources":["../../src/guides/guide-article.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5F,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,iBAAiB,+BA0B7G"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChevronLeft } from "lucide-react";
3
+ import { Link } from "../internal/next-link.js";
4
+ import { extractHeadings, GuideMarkdown } from "../markdown/guide.js";
5
+ import { GuideToc } from "./guide-toc.js";
6
+ import { GUIDES_LABELS } from "./library.js";
7
+ /**
8
+ * One guide, laid out for reading inside `GuidesShell`: a way back to all guides, the category,
9
+ * the title and lede, the article drawn by `GuideMarkdown`, and "On this page" — a rail that
10
+ * follows the reader on wide screens, a collapsible list above the article on narrow ones. The
11
+ * contents use the same heading ids the renderer gives, so `#<heading id>` links land.
12
+ * Server-safe; the contents are the only client part.
13
+ */
14
+ export function GuideArticle({ guide, guidesPath, indexSlug, category, labels, classNames }) {
15
+ const text = { ...GUIDES_LABELS, ...labels };
16
+ const headings = extractHeadings(guide.body);
17
+ return (_jsxs("div", { className: "xl:grid xl:grid-cols-[minmax(0,1fr)_13rem] xl:gap-12", children: [_jsxs("article", { className: "max-w-3xl min-w-0", children: [_jsxs(Link, { href: guidesPath, className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground", children: [_jsx(ChevronLeft, { className: "size-4", "aria-hidden": true }), " ", text.allGuides] }), category ? (_jsx("p", { className: "mt-5 text-xs font-bold tracking-[0.14em] text-primary uppercase", children: category })) : null, _jsx("h1", { className: "mt-2 text-3xl font-bold tracking-tight text-foreground sm:text-4xl", children: guide.title }), guide.lede ? _jsx("p", { className: "mt-3 text-lg text-muted-foreground", children: guide.lede }) : null, _jsx("div", { className: "mt-8", children: _jsx(GuideToc, { headings: headings, variant: "inline", labels: labels }) }), _jsx(GuideMarkdown, { content: guide.body, guidesPath: guidesPath, indexSlug: indexSlug, classNames: classNames })] }), _jsx(GuideToc, { headings: headings, variant: "rail", labels: labels })] }));
18
+ }
19
+ //# sourceMappingURL=guide-article.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-article.js","sourceRoot":"","sources":["../../src/guides/guide-article.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAqB,MAAM,cAAc,CAAC;AAehE;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAqB;IAC5G,MAAM,IAAI,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,CACL,eAAK,SAAS,EAAC,sDAAsD,aACnE,mBAAS,SAAS,EAAC,mBAAmB,aACpC,MAAC,IAAI,IACH,IAAI,EAAE,UAAU,EAChB,SAAS,EAAC,oFAAoF,aAE9F,KAAC,WAAW,IAAC,SAAS,EAAC,QAAQ,wBAAe,OAAE,IAAI,CAAC,SAAS,IACzD,EACN,QAAQ,CAAC,CAAC,CAAC,CACV,YAAG,SAAS,EAAC,iEAAiE,YAAE,QAAQ,GAAK,CAC9F,CAAC,CAAC,CAAC,IAAI,EACR,aAAI,SAAS,EAAC,oEAAoE,YAAE,KAAK,CAAC,KAAK,GAAM,EACpG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,oCAAoC,YAAE,KAAK,CAAC,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,EACvF,cAAK,SAAS,EAAC,MAAM,YACnB,KAAC,QAAQ,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,GAAI,GAC7D,EACN,KAAC,aAAa,IAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,GAAI,IACpG,EACV,KAAC,QAAQ,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,MAAM,EAAC,MAAM,EAAE,MAAM,GAAI,IAC3D,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { GuideHeading } from "../markdown/guide.js";
2
+ import { type GuidesLabels } from "./library.js";
3
+ export interface GuideTocProps {
4
+ headings: readonly GuideHeading[];
5
+ /** `rail`: the sticky right column on wide screens. `inline`: a collapsible list above the article on narrow ones. */
6
+ variant: "rail" | "inline";
7
+ labels?: Partial<GuidesLabels>;
8
+ /** How far below the top of the window a heading counts as the one being read, in pixels. */
9
+ readingLine?: number;
10
+ }
11
+ /**
12
+ * "On this page" for a guide, following the reader down it: the section being read is
13
+ * highlighted as they scroll (and the last one once they reach the bottom). Render both
14
+ * variants and each shows where it belongs.
15
+ */
16
+ export declare function GuideToc({ headings, variant, labels, readingLine }: GuideTocProps): import("react").JSX.Element | null;
17
+ /**
18
+ * The id of the heading being read: the last one above the reading line, or the last heading
19
+ * once the page is scrolled to the bottom. Updates at most once a frame while scrolling.
20
+ */
21
+ export declare function useActiveHeading(headings: readonly GuideHeading[], readingLine?: number): string | null;
22
+ //# sourceMappingURL=guide-toc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-toc.d.ts","sourceRoot":"","sources":["../../src/guides/guide-toc.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,sHAAsH;IACtH,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAiB,EAAE,EAAE,aAAa,sCAuCvF;AAmCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,WAAW,SAAM,GAAG,MAAM,GAAG,IAAI,CA+BpG"}
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ChevronDown, List } from "lucide-react";
4
+ import { useEffect, useState } from "react";
5
+ import { cx } from "../internal/cx.js";
6
+ import { GUIDES_LABELS } from "./library.js";
7
+ /**
8
+ * "On this page" for a guide, following the reader down it: the section being read is
9
+ * highlighted as they scroll (and the last one once they reach the bottom). Render both
10
+ * variants and each shows where it belongs.
11
+ */
12
+ export function GuideToc({ headings, variant, labels, readingLine = 140 }) {
13
+ const text = { ...GUIDES_LABELS, ...labels };
14
+ const [open, setOpen] = useState(false);
15
+ const active = useActiveHeading(headings, readingLine);
16
+ if (headings.length < 2)
17
+ return null;
18
+ if (variant === "rail") {
19
+ return (_jsx("nav", { "aria-label": text.onThisPage, className: "hidden xl:block", children: _jsxs("div", { className: "sticky top-24 max-h-[calc(100vh-7rem)] overflow-y-auto pb-6", children: [_jsx("p", { className: "mb-3 text-[11px] font-bold tracking-[0.14em] text-muted-foreground uppercase", children: text.onThisPage }), _jsx(TocList, { headings: headings, active: active })] }) }));
20
+ }
21
+ return (_jsxs("nav", { "aria-label": text.onThisPage, className: "mb-8 xl:hidden", children: [_jsxs("button", { type: "button", "aria-expanded": open, onClick: () => setOpen((current) => !current), className: "flex w-full items-center justify-between rounded-xl border border-border bg-card px-4 py-3 text-sm font-medium", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx(List, { className: "size-4 text-primary", "aria-hidden": true }), " ", text.onThisPage] }), _jsx(ChevronDown, { className: cx("size-4 transition-transform", open && "rotate-180"), "aria-hidden": true })] }), open ? (_jsx("div", { className: "mt-3", children: _jsx(TocList, { headings: headings, active: active, onNavigate: () => setOpen(false) }) })) : null] }));
22
+ }
23
+ function TocList({ headings, active, onNavigate, }) {
24
+ return (_jsx("ul", { className: "border-l border-border", children: headings.map((heading) => (_jsx("li", { children: _jsx("a", { href: `#${heading.id}`, onClick: onNavigate, "aria-current": active === heading.id ? "location" : undefined, className: cx("-ml-px block border-l-2 py-1 text-sm leading-snug transition-colors", heading.level === 3 ? "pl-6 text-[13px]" : "pl-3.5", active === heading.id
25
+ ? "border-primary font-medium text-primary"
26
+ : "border-transparent text-muted-foreground hover:text-foreground"), children: heading.text }) }, heading.id))) }));
27
+ }
28
+ /**
29
+ * The id of the heading being read: the last one above the reading line, or the last heading
30
+ * once the page is scrolled to the bottom. Updates at most once a frame while scrolling.
31
+ */
32
+ export function useActiveHeading(headings, readingLine = 140) {
33
+ const [active, setActive] = useState(headings[0]?.id ?? null);
34
+ useEffect(() => {
35
+ const first = headings[0];
36
+ if (!first)
37
+ return;
38
+ let frame = 0;
39
+ const update = () => {
40
+ frame = 0;
41
+ let current = first.id;
42
+ for (const heading of headings) {
43
+ const element = document.getElementById(heading.id);
44
+ if (element && element.getBoundingClientRect().top <= readingLine)
45
+ current = heading.id;
46
+ }
47
+ const atBottom = window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 8;
48
+ setActive(atBottom ? (headings.at(-1)?.id ?? current) : current);
49
+ };
50
+ const schedule = () => {
51
+ if (!frame)
52
+ frame = requestAnimationFrame(update);
53
+ };
54
+ update();
55
+ window.addEventListener("scroll", schedule, { passive: true });
56
+ window.addEventListener("resize", schedule);
57
+ return () => {
58
+ if (frame)
59
+ cancelAnimationFrame(frame);
60
+ window.removeEventListener("scroll", schedule);
61
+ window.removeEventListener("resize", schedule);
62
+ };
63
+ }, [headings, readingLine]);
64
+ return active;
65
+ }
66
+ //# sourceMappingURL=guide-toc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-toc.js","sourceRoot":"","sources":["../../src/guides/guide-toc.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ import type { GuideNavCategory, GuideNavItem } from "./library.js";
3
+ export interface GuidesLandingProps {
4
+ nav: readonly GuideNavCategory[];
5
+ /** The icon on a guide's card. Defaults to a book. */
6
+ icon?: (item: GuideNavItem) => ReactNode;
7
+ }
8
+ /**
9
+ * The guides, grouped by category, as cards that open each guide — the body of a help centre's
10
+ * landing page, so the public and signed-in landing pages look and group the same.
11
+ * Server-safe, no hooks.
12
+ */
13
+ export declare function GuidesLanding({ nav, icon }: GuidesLandingProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=guides-landing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides-landing.d.ts","sourceRoot":"","sources":["../../src/guides/guides-landing.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACjC,sDAAsD;IACtD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,SAAS,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,kBAAkB,+BAuC9D"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BookOpen, ChevronRight } from "lucide-react";
3
+ import { Link } from "../internal/next-link.js";
4
+ /**
5
+ * The guides, grouped by category, as cards that open each guide — the body of a help centre's
6
+ * landing page, so the public and signed-in landing pages look and group the same.
7
+ * Server-safe, no hooks.
8
+ */
9
+ export function GuidesLanding({ nav, icon }) {
10
+ return (_jsx("div", { className: "space-y-12", children: nav.map((category) => (_jsxs("section", { id: category.id, "aria-labelledby": `${category.id}-title`, className: "scroll-mt-24", children: [_jsxs("div", { className: "mb-4", children: [_jsx("h2", { id: `${category.id}-title`, className: "text-xl font-bold tracking-tight text-foreground", children: category.title }), category.summary ? _jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: category.summary }) : null] }), _jsx("ul", { className: "grid gap-4 sm:grid-cols-2", children: category.items.map((item) => (_jsx("li", { children: _jsxs(Link, { href: item.href, className: "group flex h-full flex-col rounded-xl border border-border bg-card p-5 shadow-sm transition hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-md focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:translate-y-0", children: [_jsxs("span", { className: "flex items-start justify-between gap-4", children: [_jsx("span", { className: "grid size-10 place-items-center rounded-lg bg-primary/10 text-primary [&_svg]:size-5", children: icon ? icon(item) : _jsx(BookOpen, { "aria-hidden": true }) }), _jsx(ChevronRight, { className: "size-5 text-muted-foreground transition-transform group-hover:translate-x-0.5 group-hover:text-primary motion-reduce:transition-none", "aria-hidden": true })] }), _jsx("span", { className: "mt-4 font-semibold text-card-foreground", children: item.title }), item.summary ? (_jsx("span", { className: "mt-1.5 text-sm leading-relaxed text-muted-foreground", children: item.summary })) : null] }) }, item.href))) })] }, category.id))) }));
11
+ }
12
+ //# sourceMappingURL=guides-landing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides-landing.js","sourceRoot":"","sources":["../../src/guides/guides-landing.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGtD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAShD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,EAAsB;IAC7D,OAAO,CACL,cAAK,SAAS,EAAC,YAAY,YACxB,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACrB,mBAA2B,EAAE,EAAE,QAAQ,CAAC,EAAE,qBAAmB,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAC,cAAc,aAC3G,eAAK,SAAS,EAAC,MAAM,aACnB,aAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAC,kDAAkD,YACzF,QAAQ,CAAC,KAAK,GACZ,EACJ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,oCAAoC,YAAE,QAAQ,CAAC,OAAO,GAAK,CAAC,CAAC,CAAC,IAAI,IAC/F,EACN,aAAI,SAAS,EAAC,2BAA2B,YACtC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC5B,uBACE,MAAC,IAAI,IACH,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,SAAS,EAAC,0SAA0S,aAEpT,gBAAM,SAAS,EAAC,wCAAwC,aACtD,eAAM,SAAS,EAAC,sFAAsF,YACnG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAC,QAAQ,0BAAe,GACxC,EACP,KAAC,YAAY,IACX,SAAS,EAAC,sIAAsI,wBAEhJ,IACG,EACP,eAAM,SAAS,EAAC,yCAAyC,YAAE,IAAI,CAAC,KAAK,GAAQ,EAC5E,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CACd,eAAM,SAAS,EAAC,sDAAsD,YAAE,IAAI,CAAC,OAAO,GAAQ,CAC7F,CAAC,CAAC,CAAC,IAAI,IACH,IAlBA,IAAI,CAAC,IAAI,CAmBb,CACN,CAAC,GACC,KA9BO,QAAQ,CAAC,EAAE,CA+Bf,CACX,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type GuideSearchEntry, type GuidesLabels } from "./library.js";
2
+ export interface GuidesSearchProps {
3
+ index: readonly GuideSearchEntry[];
4
+ labels?: Partial<GuidesLabels>;
5
+ /** Open on ⌘K / Ctrl+K and on `/` when nobody is typing. Turn off when two searches share a page. */
6
+ shortcuts?: boolean;
7
+ }
8
+ /**
9
+ * Search across the guides a reader may open: titles, summaries and section headings. Opens
10
+ * from its button, ⌘K / Ctrl+K, or `/` when you're not typing; arrow keys move, Enter opens.
11
+ */
12
+ export declare function GuidesSearch({ index, labels, shortcuts }: GuidesSearchProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=guides-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides-search.d.ts","sourceRoot":"","sources":["../../src/guides/guides-search.tsx"],"names":[],"mappings":"AAQA,OAAO,EAA0C,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,qGAAqG;IACrG,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAgB,EAAE,EAAE,iBAAiB,+BA0IlF"}
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
4
+ import { CornerDownLeft, FileText, Hash, Search } from "lucide-react";
5
+ import { useRouter } from "next/navigation.js";
6
+ import { useEffect, useMemo, useState } from "react";
7
+ import { cx } from "../internal/cx.js";
8
+ import { GUIDES_LABELS, searchGuides, withQuery } from "./library.js";
9
+ /**
10
+ * Search across the guides a reader may open: titles, summaries and section headings. Opens
11
+ * from its button, ⌘K / Ctrl+K, or `/` when you're not typing; arrow keys move, Enter opens.
12
+ */
13
+ export function GuidesSearch({ index, labels, shortcuts = true }) {
14
+ const text = { ...GUIDES_LABELS, ...labels };
15
+ const [open, setOpen] = useState(false);
16
+ const [query, setQuery] = useState("");
17
+ const [highlight, setHighlight] = useState(0);
18
+ const router = useRouter();
19
+ const results = useMemo(() => searchGuides(index, query), [index, query]);
20
+ const active = Math.min(highlight, Math.max(results.length - 1, 0));
21
+ useEffect(() => {
22
+ if (!shortcuts)
23
+ return;
24
+ const onKeyDown = (event) => {
25
+ const target = event.target;
26
+ const typing = target?.tagName === "INPUT" || target?.tagName === "TEXTAREA" || target?.isContentEditable;
27
+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") {
28
+ event.preventDefault();
29
+ setOpen((current) => !current);
30
+ }
31
+ else if (event.key === "/" && !typing && !event.metaKey && !event.ctrlKey) {
32
+ event.preventDefault();
33
+ setOpen(true);
34
+ }
35
+ };
36
+ document.addEventListener("keydown", onKeyDown);
37
+ return () => document.removeEventListener("keydown", onKeyDown);
38
+ }, [shortcuts]);
39
+ const change = (next) => {
40
+ setOpen(next);
41
+ if (!next) {
42
+ setQuery("");
43
+ setHighlight(0);
44
+ }
45
+ };
46
+ const go = (href) => {
47
+ change(false);
48
+ router.push(href);
49
+ };
50
+ return (_jsxs(DialogPrimitive.Root, { open: open, onOpenChange: change, children: [_jsx(DialogPrimitive.Trigger, { asChild: true, children: _jsxs("button", { type: "button", className: "flex w-full items-center gap-3 rounded-xl border border-border bg-card px-3.5 py-2.5 text-left text-sm text-muted-foreground shadow-sm transition hover:border-primary/50 hover:text-foreground focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:outline-none", children: [_jsx(Search, { className: "size-4 text-primary", "aria-hidden": true }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: text.searchTrigger }), shortcuts ? (_jsx("kbd", { className: "hidden rounded border border-border bg-muted px-1.5 py-0.5 font-sans text-[11px] sm:inline", children: "\u2318K" })) : null] }) }), _jsxs(DialogPrimitive.Portal, { children: [_jsx(DialogPrimitive.Overlay, { className: "fixed inset-0 z-50 bg-black/50 backdrop-blur-sm" }), _jsxs(DialogPrimitive.Content, { className: "fixed top-[12vh] left-1/2 z-50 w-[calc(100%-2rem)] max-w-xl -translate-x-1/2 overflow-hidden rounded-xl border border-border bg-card text-card-foreground shadow-2xl", "aria-describedby": undefined, children: [_jsx(DialogPrimitive.Title, { className: "sr-only", children: text.searchTitle }), _jsxs("div", { className: "flex items-center gap-3 border-b border-border px-4", children: [_jsx(Search, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }), _jsx("input", { autoFocus: true, value: query, onChange: (event) => {
51
+ setQuery(event.target.value);
52
+ setHighlight(0);
53
+ }, onKeyDown: (event) => {
54
+ if (event.key === "ArrowDown") {
55
+ event.preventDefault();
56
+ setHighlight(Math.min(active + 1, results.length - 1));
57
+ }
58
+ else if (event.key === "ArrowUp") {
59
+ event.preventDefault();
60
+ setHighlight(Math.max(active - 1, 0));
61
+ }
62
+ else if (event.key === "Enter" && results[active]) {
63
+ event.preventDefault();
64
+ go(results[active].href);
65
+ }
66
+ }, placeholder: text.searchPlaceholder, "aria-label": text.searchTitle, role: "combobox", "aria-expanded": "true", "aria-controls": "house-guides-search-results", "aria-activedescendant": results[active] ? `house-guides-search-${active}` : undefined, className: "h-12 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground" })] }), _jsx("div", { className: "max-h-[60vh] overflow-y-auto p-2", children: results.length === 0 ? (_jsx("p", { className: "px-3 py-8 text-center text-sm text-muted-foreground", children: withQuery(text.searchEmpty, query) })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "px-3 pt-1 pb-2 text-xs font-medium text-muted-foreground", children: query.trim() ? text.searchMatches : text.searchAll }), _jsx("ul", { id: "house-guides-search-results", role: "listbox", "aria-label": text.menu, children: results.map((result, i) => (_jsxs("li", { id: `house-guides-search-${i}`, role: "option", "aria-selected": i === active, onMouseMove: () => setHighlight(i), onClick: () => go(result.href), className: cx("flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm", i === active ? "bg-accent text-accent-foreground" : "text-foreground"), children: [result.section ? (_jsx(Hash, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true })) : (_jsx(FileText, { className: "size-4 shrink-0 text-primary", "aria-hidden": true })), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium", children: result.title }), _jsx("span", { className: "block truncate text-xs text-muted-foreground", children: result.detail })] }), i === active ? (_jsx(CornerDownLeft, { className: "size-3.5 shrink-0 text-muted-foreground", "aria-hidden": true })) : null] }, result.href))) })] })) })] })] })] }));
67
+ }
68
+ //# sourceMappingURL=guides-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides-search.js","sourceRoot":"","sources":["../../src/guides/guides-search.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ReactNode } from "react";
2
+ import { type GuideLibrary, type GuidesLabels } from "./library.js";
3
+ export interface GuidesShellProps {
4
+ library: GuideLibrary;
5
+ children: ReactNode;
6
+ labels?: Partial<GuidesLabels>;
7
+ className?: string;
8
+ }
9
+ /**
10
+ * The frame every guide page sits in, public and signed in alike: search and the grouped,
11
+ * filterable list of guides in a sticky left rail on wide screens, behind a menu button on
12
+ * narrow ones, beside the page itself. The page's header, hero and footer are the app's.
13
+ */
14
+ export declare function GuidesShell({ library, children, labels, className }: GuidesShellProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=guides-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides-shell.d.ts","sourceRoot":"","sources":["../../src/guides/guides-shell.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKjD,OAAO,EAAiB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,+BAqCrF"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { PanelLeft } from "lucide-react";
4
+ import { useState } from "react";
5
+ import { cx } from "../internal/cx.js";
6
+ import { GuidesSearch } from "./guides-search.js";
7
+ import { GuidesSidebar } from "./guides-sidebar.js";
8
+ import { GUIDES_LABELS } from "./library.js";
9
+ /**
10
+ * The frame every guide page sits in, public and signed in alike: search and the grouped,
11
+ * filterable list of guides in a sticky left rail on wide screens, behind a menu button on
12
+ * narrow ones, beside the page itself. The page's header, hero and footer are the app's.
13
+ */
14
+ export function GuidesShell({ library, children, labels, className }) {
15
+ const text = { ...GUIDES_LABELS, ...labels };
16
+ const [menuOpen, setMenuOpen] = useState(false);
17
+ return (_jsxs("div", { className: cx("lg:grid lg:grid-cols-[16rem_minmax(0,1fr)] lg:gap-10 xl:gap-12", className), children: [_jsxs("div", { className: "mb-8 lg:hidden", children: [_jsxs("div", { className: "flex gap-3", children: [_jsxs("button", { type: "button", "aria-expanded": menuOpen, "aria-controls": "house-guides-menu", onClick: () => setMenuOpen((current) => !current), className: "inline-flex shrink-0 items-center gap-2 rounded-xl border border-border bg-card px-3 text-sm font-medium", children: [_jsx(PanelLeft, { className: "size-4 text-primary", "aria-hidden": true }), " ", text.menu] }), _jsx(GuidesSearch, { index: library.search, labels: labels, shortcuts: false })] }), menuOpen ? (_jsx("div", { id: "house-guides-menu", className: "mt-4 rounded-xl border border-border bg-card p-4", children: _jsx(GuidesSidebar, { nav: library.nav, labels: labels, onNavigate: () => setMenuOpen(false) }) })) : null] }), _jsx("aside", { className: "hidden lg:block", "aria-label": text.menu, children: _jsxs("div", { className: "sticky top-24 max-h-[calc(100vh-7rem)] overflow-y-auto pr-1 pb-6", children: [_jsx(GuidesSearch, { index: library.search, labels: labels }), _jsx("div", { className: "mt-5", children: _jsx(GuidesSidebar, { nav: library.nav, labels: labels }) })] }) }), _jsx("div", { className: "min-w-0", children: children })] }));
18
+ }
19
+ //# sourceMappingURL=guides-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guides-shell.js","sourceRoot":"","sources":["../../src/guides/guides-shell.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAwC,MAAM,cAAc,CAAC;AASnF;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAoB;IACpF,MAAM,IAAI,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,gEAAgE,EAAE,SAAS,CAAC,aAC7F,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,YAAY,aACzB,kBACE,IAAI,EAAC,QAAQ,mBACE,QAAQ,mBACT,mBAAmB,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EACjD,SAAS,EAAC,0GAA0G,aAEpH,KAAC,SAAS,IAAC,SAAS,EAAC,qBAAqB,wBAAe,OAAE,IAAI,CAAC,IAAI,IAC7D,EAET,KAAC,YAAY,IAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAI,IACrE,EACL,QAAQ,CAAC,CAAC,CAAC,CACV,cAAK,EAAE,EAAC,mBAAmB,EAAC,SAAS,EAAC,kDAAkD,YACtF,KAAC,aAAa,IAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,GAAI,GACrF,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,gBAAO,SAAS,EAAC,iBAAiB,gBAAa,IAAI,CAAC,IAAI,YACtD,eAAK,SAAS,EAAC,kEAAkE,aAC/E,KAAC,YAAY,IAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAI,EACvD,cAAK,SAAS,EAAC,MAAM,YACnB,KAAC,aAAa,IAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAI,GAC/C,IACF,GACA,EACR,cAAK,SAAS,EAAC,SAAS,YAAE,QAAQ,GAAO,IACrC,CACP,CAAC;AACJ,CAAC"}