@alfadocs/ui-kit-debug 0.16.0 → 0.17.0

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 (51) hide show
  1. package/dist/_chunks/benefit-card-DXmrAyfn.js +219 -0
  2. package/dist/_chunks/benefit-card-DXmrAyfn.js.map +1 -0
  3. package/dist/_chunks/copy-field-BCHAZ8QV.js +298 -0
  4. package/dist/_chunks/copy-field-BCHAZ8QV.js.map +1 -0
  5. package/dist/_chunks/{navigation-menu-Bav1d_wA.js → navigation-menu-DdufF-_4.js} +18 -18
  6. package/dist/_chunks/{navigation-menu-Bav1d_wA.js.map → navigation-menu-DdufF-_4.js.map} +1 -1
  7. package/dist/_chunks/{pagination-OQBlnb1H.js → pagination-F1ei4khE.js} +180 -158
  8. package/dist/_chunks/pagination-F1ei4khE.js.map +1 -0
  9. package/dist/_chunks/public-header.agent-sDi9N9su.js +562 -0
  10. package/dist/_chunks/public-header.agent-sDi9N9su.js.map +1 -0
  11. package/dist/agent-catalog.json +37 -1
  12. package/dist/components/benefit-card/benefit-card.d.ts.map +1 -1
  13. package/dist/components/benefit-card/index.js +1 -1
  14. package/dist/components/copy-field/copy-field.agent.d.ts +16 -0
  15. package/dist/components/copy-field/copy-field.agent.d.ts.map +1 -0
  16. package/dist/components/copy-field/copy-field.d.ts +50 -0
  17. package/dist/components/copy-field/copy-field.d.ts.map +1 -0
  18. package/dist/components/copy-field/index.d.ts +5 -0
  19. package/dist/components/copy-field/index.d.ts.map +1 -0
  20. package/dist/components/copy-field/index.js +6 -0
  21. package/dist/components/copy-field/index.js.map +1 -0
  22. package/dist/components/index.d.ts +1 -0
  23. package/dist/components/index.d.ts.map +1 -1
  24. package/dist/components/navigation-menu/index.js +1 -1
  25. package/dist/components/pagination/index.js +1 -1
  26. package/dist/components/pagination/pagination.d.ts.map +1 -1
  27. package/dist/components/public-header/index.d.ts +1 -1
  28. package/dist/components/public-header/index.d.ts.map +1 -1
  29. package/dist/components/public-header/index.js +1 -1
  30. package/dist/components/public-header/public-header.d.ts +36 -1
  31. package/dist/components/public-header/public-header.d.ts.map +1 -1
  32. package/dist/hooks/use-controllable-state.d.ts +10 -0
  33. package/dist/hooks/use-controllable-state.d.ts.map +1 -0
  34. package/dist/hooks/use-copy-to-clipboard.d.ts +45 -0
  35. package/dist/hooks/use-copy-to-clipboard.d.ts.map +1 -0
  36. package/dist/i18n/config.js +21 -0
  37. package/dist/i18n/config.js.map +1 -1
  38. package/dist/i18n/resources.d.ts +21 -0
  39. package/dist/i18n/resources.d.ts.map +1 -1
  40. package/dist/index.js +458 -455
  41. package/dist/index.js.map +1 -1
  42. package/dist/locales/de.json +7 -0
  43. package/dist/locales/en.json +7 -0
  44. package/dist/locales/it.json +7 -0
  45. package/dist/tokens.css +1 -1
  46. package/package.json +5 -1
  47. package/dist/_chunks/benefit-card-Czs0oXdi.js +0 -161
  48. package/dist/_chunks/benefit-card-Czs0oXdi.js.map +0 -1
  49. package/dist/_chunks/pagination-OQBlnb1H.js.map +0 -1
  50. package/dist/_chunks/public-header.agent-ZLBAQ30j.js +0 -242
  51. package/dist/_chunks/public-header.agent-ZLBAQ30j.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfadocs/ui-kit-debug",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "type": "module",
5
5
  "description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe. (debug build — identical runtime to @alfadocs/ui-kit, ships source maps for symbolication).",
6
6
  "license": "BUSL-1.1",
@@ -155,6 +155,10 @@
155
155
  "types": "./dist/components/contact-card/index.d.ts",
156
156
  "import": "./dist/components/contact-card/index.js"
157
157
  },
158
+ "./copy-field": {
159
+ "types": "./dist/components/copy-field/index.d.ts",
160
+ "import": "./dist/components/copy-field/index.js"
161
+ },
158
162
  "./data-table": {
159
163
  "types": "./dist/components/data-table/index.d.ts",
160
164
  "import": "./dist/components/data-table/index.js"
@@ -1,161 +0,0 @@
1
- import { jsx as r, jsxs as g } from "react/jsx-runtime";
2
- import { forwardRef as u, useContext as k, Children as y, createContext as w } from "react";
3
- import { c as l } from "./index-D2ZczOXr.js";
4
- const b = [
5
- "violet",
6
- "purple",
7
- "magenta",
8
- "blue",
9
- "green",
10
- "red"
11
- ], m = w(null), C = l("ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-lg)]", {
12
- variants: {
13
- columns: {
14
- 1: "ds:md:grid-cols-1",
15
- 2: "ds:md:grid-cols-2",
16
- 3: "ds:md:grid-cols-3",
17
- 4: "ds:md:grid-cols-4"
18
- }
19
- },
20
- defaultVariants: { columns: 3 }
21
- }), N = l(
22
- [
23
- "ds:relative ds:rounded-[var(--radius-lg)] ds:overflow-hidden",
24
- "ds:flex ds:flex-col ds:h-full",
25
- "ds:bg-[var(--card)] ds:text-[var(--card-foreground)]",
26
- // Hover lift — the transform is gated through `motion-safe:` so users
27
- // with `prefers-reduced-motion: reduce` see only the shadow change.
28
- // `--animation-duration` is pinned to 0ms in the accessible theme,
29
- // which collapses the transition without dropping the rule entirely.
30
- "ds:transition-[transform,box-shadow] ds:duration-[var(--animation-duration)]",
31
- "ds:motion-reduce:transition-none",
32
- "ds:hover:shadow-[var(--shadow-hover)]",
33
- "ds:motion-safe:hover:-translate-y-0.5"
34
- ].join(" "),
35
- {
36
- variants: {
37
- variant: {
38
- elevated: "ds:shadow-[var(--shadow-card)]",
39
- outlined: "ds:border ds:border-[color:var(--border)]"
40
- },
41
- // 4px accent strip via the logical `border-block-start` shorthand.
42
- // Tailwind v4 doesn't ship per-side logical-border utilities, so the
43
- // bracketed CSS shorthand is the kit's idiom (mirrors patterns at
44
- // `src/patterns/operator-profile/operator-profile.tsx`).
45
- accent: {
46
- primary: "ds:[border-block-start:4px_solid_var(--primary)]",
47
- accent: "ds:[border-block-start:4px_solid_var(--accent)]",
48
- info: "ds:[border-block-start:4px_solid_var(--info)]",
49
- success: "ds:[border-block-start:4px_solid_var(--success)]",
50
- warning: "ds:[border-block-start:4px_solid_var(--warning)]",
51
- violet: "ds:[border-block-start:4px_solid_var(--color-violet-500)]",
52
- purple: "ds:[border-block-start:4px_solid_var(--color-purple-500)]",
53
- magenta: "ds:[border-block-start:4px_solid_var(--color-magenta-500)]",
54
- blue: "ds:[border-block-start:4px_solid_var(--color-blue-500)]",
55
- green: "ds:[border-block-start:4px_solid_var(--color-green-500)]",
56
- red: "ds:[border-block-start:4px_solid_var(--color-red-500)]"
57
- }
58
- },
59
- defaultVariants: { variant: "elevated", accent: "primary" }
60
- }
61
- ), j = l(
62
- [
63
- "ds:inline-flex ds:items-center ds:justify-center",
64
- "ds:size-12 ds:rounded-[var(--radius-md)] ds:shrink-0",
65
- "ds:[&>svg]:size-6"
66
- ].join(" "),
67
- {
68
- variants: {
69
- accent: {
70
- primary: "ds:text-[color:var(--primary)] ds:bg-[color-mix(in_srgb,var(--primary)_12%,var(--background))]",
71
- accent: "ds:text-[color:var(--accent)] ds:bg-[color-mix(in_srgb,var(--accent)_12%,var(--background))]",
72
- info: "ds:text-[color:var(--info)] ds:bg-[color-mix(in_srgb,var(--info)_12%,var(--background))]",
73
- success: "ds:text-[color:var(--success)] ds:bg-[color-mix(in_srgb,var(--success)_12%,var(--background))]",
74
- warning: "ds:text-[color:var(--warning)] ds:bg-[color-mix(in_srgb,var(--warning)_12%,var(--background))]",
75
- violet: "ds:text-[color:var(--color-violet-500)] ds:bg-[color-mix(in_srgb,var(--color-violet-500)_12%,var(--background))]",
76
- purple: "ds:text-[color:var(--color-purple-500)] ds:bg-[color-mix(in_srgb,var(--color-purple-500)_12%,var(--background))]",
77
- magenta: "ds:text-[color:var(--color-magenta-500)] ds:bg-[color-mix(in_srgb,var(--color-magenta-500)_12%,var(--background))]",
78
- blue: "ds:text-[color:var(--color-blue-500)] ds:bg-[color-mix(in_srgb,var(--color-blue-500)_12%,var(--background))]",
79
- green: "ds:text-[color:var(--color-green-500)] ds:bg-[color-mix(in_srgb,var(--color-green-500)_12%,var(--background))]",
80
- red: "ds:text-[color:var(--color-red-500)] ds:bg-[color-mix(in_srgb,var(--color-red-500)_12%,var(--background))]"
81
- }
82
- },
83
- defaultVariants: { accent: "primary" }
84
- }
85
- );
86
- function B(o, a) {
87
- return o !== "auto" ? o : a ? b[a.index % b.length] : "primary";
88
- }
89
- const p = u(
90
- ({ columns: o = 3, children: a, className: t, ...s }, n) => {
91
- const c = y.toArray(a);
92
- return /* @__PURE__ */ r(
93
- "div",
94
- {
95
- ref: n,
96
- "data-component": "benefit-card-row",
97
- className: C({ columns: o, className: t }),
98
- ...s,
99
- children: c.map((e, d) => /* @__PURE__ */ r(m.Provider, { value: { index: d }, children: e }, d))
100
- }
101
- );
102
- }
103
- );
104
- p.displayName = "BenefitCard.Row";
105
- const x = u(
106
- ({
107
- step: o,
108
- icon: a,
109
- title: t,
110
- cta: s,
111
- variant: n = "elevated",
112
- accent: c = "auto",
113
- children: e,
114
- className: d,
115
- ..._
116
- }, f) => {
117
- const h = k(m), i = B(c, h), v = typeof o == "number";
118
- return /* @__PURE__ */ r(
119
- "article",
120
- {
121
- ref: f,
122
- "data-component": "benefit-card",
123
- "data-accent": i,
124
- className: N({ variant: n, accent: i, className: d }),
125
- ..._,
126
- children: /* @__PURE__ */ g("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-lg)] ds:flex-1", children: [
127
- (a || v) && /* @__PURE__ */ g("div", { className: "ds:flex ds:items-start ds:justify-between ds:gap-[var(--spacing-sm)]", children: [
128
- a ? /* @__PURE__ */ r(
129
- "span",
130
- {
131
- "aria-hidden": "true",
132
- className: j({ accent: i }),
133
- children: a
134
- }
135
- ) : /* @__PURE__ */ r("span", { "aria-hidden": "true" }),
136
- v ? /* @__PURE__ */ r(
137
- "span",
138
- {
139
- "aria-hidden": "true",
140
- "data-part": "step",
141
- className: "type-eyebrow ds:rounded-[var(--radius-full)] ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]",
142
- children: String(o).padStart(2, "0")
143
- }
144
- ) : null
145
- ] }),
146
- /* @__PURE__ */ r("h3", { className: "type-title-card ds:text-[var(--foreground)]", children: t }),
147
- e ? /* @__PURE__ */ r("div", { className: "type-body ds:text-[var(--muted-foreground)] ds:flex-1", children: e }) : null,
148
- s ? /* @__PURE__ */ r("div", { className: "ds:mt-[var(--spacing-xs)]", children: s }) : null
149
- ] })
150
- }
151
- );
152
- }
153
- );
154
- x.displayName = "BenefitCard";
155
- const E = Object.assign(x, {
156
- Row: p
157
- });
158
- export {
159
- E as B
160
- };
161
- //# sourceMappingURL=benefit-card-Czs0oXdi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"benefit-card-Czs0oXdi.js","sources":["../../src/components/benefit-card/benefit-card.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* BenefitCard — marketing-surface card for \"benefit row\" / \"how it */\n/* works\" / \"why choose us\" sections. */\n/* */\n/* Visually distinguished from <Card> by: */\n/* 1. A 4px accent strip across the top (logical block-start). */\n/* 2. A tinted icon chip inside the body using `color-mix(in srgb, */\n/* var(--accent-token) 12%, var(--background))`. */\n/* 3. An optional zero-padded step chip (\"01\", \"02\", ...) in the */\n/* top-end corner. */\n/* 4. A hover lift (translateY -2px + --shadow-hover), gated through */\n/* `--animation-duration` so the accessible theme freezes it. */\n/* */\n/* Compound API: */\n/* <BenefitCard.Row columns={3}> */\n/* <BenefitCard step={1} icon={…} title=\"…\">…</BenefitCard> */\n/* ... */\n/* </BenefitCard.Row> */\n/* */\n/* `accent=\"auto\"` rotates through the brand palette by row index */\n/* (violet → purple → magenta → blue → green → red, then wraps). */\n/* Outside a Row, `auto` falls back to `primary`. */\n/* ------------------------------------------------------------------ */\n\nimport {\n Children,\n createContext,\n forwardRef,\n useContext,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\n\n/* ------------------------------------------------------------------ */\n/* Accent wheel — used by `accent=\"auto\"` inside a Row. */\n/* ------------------------------------------------------------------ */\n\nconst ACCENT_WHEEL = [\n 'violet',\n 'purple',\n 'magenta',\n 'blue',\n 'green',\n 'red',\n] as const;\n\ntype WheelAccent = (typeof ACCENT_WHEEL)[number];\ntype SemanticAccent = 'primary' | 'accent' | 'info' | 'success' | 'warning';\ntype ResolvedAccent = SemanticAccent | WheelAccent;\ntype AccentProp = SemanticAccent | WheelAccent | 'auto';\n\n/* ------------------------------------------------------------------ */\n/* Row context */\n/* ------------------------------------------------------------------ */\n\ninterface RowContextValue {\n index: number;\n}\n\nconst RowContext = createContext<RowContextValue | null>(null);\n\n/* ------------------------------------------------------------------ */\n/* CVA — Row grid */\n/* ------------------------------------------------------------------ */\n\nconst rowVariants = cva('ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-lg)]', {\n variants: {\n columns: {\n 1: 'ds:md:grid-cols-1',\n 2: 'ds:md:grid-cols-2',\n 3: 'ds:md:grid-cols-3',\n 4: 'ds:md:grid-cols-4',\n },\n },\n defaultVariants: { columns: 3 },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — BenefitCard root */\n/* */\n/* The top 4px accent strip uses `border-block-start` (logical) so it */\n/* sits at the inline-start-block-start corner regardless of writing */\n/* direction. Border colour is set per-accent in the `accent` variant. */\n/* ------------------------------------------------------------------ */\n\nconst cardVariants = cva(\n [\n 'ds:relative ds:rounded-[var(--radius-lg)] ds:overflow-hidden',\n 'ds:flex ds:flex-col ds:h-full',\n 'ds:bg-[var(--card)] ds:text-[var(--card-foreground)]',\n // Hover lift — the transform is gated through `motion-safe:` so users\n // with `prefers-reduced-motion: reduce` see only the shadow change.\n // `--animation-duration` is pinned to 0ms in the accessible theme,\n // which collapses the transition without dropping the rule entirely.\n 'ds:transition-[transform,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:shadow-[var(--shadow-hover)]',\n 'ds:motion-safe:hover:-translate-y-0.5',\n ].join(' '),\n {\n variants: {\n variant: {\n elevated: 'ds:shadow-[var(--shadow-card)]',\n outlined: 'ds:border ds:border-[color:var(--border)]',\n },\n // 4px accent strip via the logical `border-block-start` shorthand.\n // Tailwind v4 doesn't ship per-side logical-border utilities, so the\n // bracketed CSS shorthand is the kit's idiom (mirrors patterns at\n // `src/patterns/operator-profile/operator-profile.tsx`).\n accent: {\n primary: 'ds:[border-block-start:4px_solid_var(--primary)]',\n accent: 'ds:[border-block-start:4px_solid_var(--accent)]',\n info: 'ds:[border-block-start:4px_solid_var(--info)]',\n success: 'ds:[border-block-start:4px_solid_var(--success)]',\n warning: 'ds:[border-block-start:4px_solid_var(--warning)]',\n violet: 'ds:[border-block-start:4px_solid_var(--color-violet-500)]',\n purple: 'ds:[border-block-start:4px_solid_var(--color-purple-500)]',\n magenta: 'ds:[border-block-start:4px_solid_var(--color-magenta-500)]',\n blue: 'ds:[border-block-start:4px_solid_var(--color-blue-500)]',\n green: 'ds:[border-block-start:4px_solid_var(--color-green-500)]',\n red: 'ds:[border-block-start:4px_solid_var(--color-red-500)]',\n },\n },\n defaultVariants: { variant: 'elevated', accent: 'primary' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — icon chip */\n/* */\n/* The chip background uses `color-mix(in srgb, <token> 12%, */\n/* var(--background))` so it stays legible across themes. The Tailwind */\n/* JIT requires underscores in arbitrary-value classes wherever */\n/* whitespace would otherwise terminate the class. */\n/* ------------------------------------------------------------------ */\n\nconst iconChipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:size-12 ds:rounded-[var(--radius-md)] ds:shrink-0',\n 'ds:[&>svg]:size-6',\n ].join(' '),\n {\n variants: {\n accent: {\n primary:\n 'ds:text-[color:var(--primary)] ds:bg-[color-mix(in_srgb,var(--primary)_12%,var(--background))]',\n accent:\n 'ds:text-[color:var(--accent)] ds:bg-[color-mix(in_srgb,var(--accent)_12%,var(--background))]',\n info: 'ds:text-[color:var(--info)] ds:bg-[color-mix(in_srgb,var(--info)_12%,var(--background))]',\n success:\n 'ds:text-[color:var(--success)] ds:bg-[color-mix(in_srgb,var(--success)_12%,var(--background))]',\n warning:\n 'ds:text-[color:var(--warning)] ds:bg-[color-mix(in_srgb,var(--warning)_12%,var(--background))]',\n violet:\n 'ds:text-[color:var(--color-violet-500)] ds:bg-[color-mix(in_srgb,var(--color-violet-500)_12%,var(--background))]',\n purple:\n 'ds:text-[color:var(--color-purple-500)] ds:bg-[color-mix(in_srgb,var(--color-purple-500)_12%,var(--background))]',\n magenta:\n 'ds:text-[color:var(--color-magenta-500)] ds:bg-[color-mix(in_srgb,var(--color-magenta-500)_12%,var(--background))]',\n blue: 'ds:text-[color:var(--color-blue-500)] ds:bg-[color-mix(in_srgb,var(--color-blue-500)_12%,var(--background))]',\n green:\n 'ds:text-[color:var(--color-green-500)] ds:bg-[color-mix(in_srgb,var(--color-green-500)_12%,var(--background))]',\n red: 'ds:text-[color:var(--color-red-500)] ds:bg-[color-mix(in_srgb,var(--color-red-500)_12%,var(--background))]',\n },\n },\n defaultVariants: { accent: 'primary' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface BenefitCardProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title'\n> {\n /** Step number; rendered as a zero-padded chip (\"01\", \"02\", …). Omit to hide. */\n step?: number;\n /** Icon node — usually an `<svg>` 24-32px. Rendered inside a tinted square chip. */\n icon?: ReactNode;\n /** Card heading. Always rendered inside an `<h3>` — pass only inline / phrasing content. */\n title: ReactNode;\n /** Optional CTA — usually a `<Button intent=\"link\">` or kit `<Link>`. Rendered at the block-end. */\n cta?: ReactNode;\n /** Surface treatment. */\n variant?: 'elevated' | 'outlined';\n /**\n * Accent colour. `auto` (default inside a `<BenefitCard.Row>`) rotates through the brand\n * palette by row index: violet → purple → magenta → blue → green → red, then wraps.\n * Outside a Row, `auto` falls back to `primary`.\n */\n accent?: AccentProp;\n /** Body content (description / list / inline copy). */\n children?: ReactNode;\n}\n\nexport interface BenefitCardRowProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /** Number of columns at md+; defaults to 3. Collapses to 1 at < md. */\n columns?: 1 | 2 | 3 | 4;\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Accent resolution */\n/* ------------------------------------------------------------------ */\n\nfunction resolveAccent(\n accent: AccentProp,\n rowCtx: RowContextValue | null,\n): ResolvedAccent {\n if (accent !== 'auto') return accent;\n if (rowCtx) return ACCENT_WHEEL[rowCtx.index % ACCENT_WHEEL.length];\n return 'primary';\n}\n\n/* ------------------------------------------------------------------ */\n/* Row */\n/* */\n/* Wraps every child in a `RowContext.Provider` so the child can look */\n/* up its index and pick a wheel colour when `accent=\"auto\"`. */\n/* ------------------------------------------------------------------ */\n\nconst BenefitCardRow = forwardRef<HTMLDivElement, BenefitCardRowProps>(\n ({ columns = 3, children, className, ...rest }, ref) => {\n const items = Children.toArray(children);\n return (\n <div\n ref={ref}\n data-component=\"benefit-card-row\"\n className={rowVariants({ columns, className })}\n {...rest}\n >\n {items.map((child, index) => (\n <RowContext.Provider key={index} value={{ index }}>\n {child}\n </RowContext.Provider>\n ))}\n </div>\n );\n },\n);\nBenefitCardRow.displayName = 'BenefitCard.Row';\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst BenefitCardRoot = forwardRef<HTMLElement, BenefitCardProps>(\n (\n {\n step,\n icon,\n title,\n cta,\n variant = 'elevated',\n accent = 'auto',\n children,\n className,\n ...rest\n },\n ref,\n ) => {\n const rowCtx = useContext(RowContext);\n const resolved = resolveAccent(accent, rowCtx);\n const hasStep = typeof step === 'number';\n\n return (\n <article\n ref={ref}\n data-component=\"benefit-card\"\n data-accent={resolved}\n className={cardVariants({ variant, accent: resolved, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-lg)] ds:flex-1\">\n {(icon || hasStep) && (\n <div className=\"ds:flex ds:items-start ds:justify-between ds:gap-[var(--spacing-sm)]\">\n {icon ? (\n <span\n aria-hidden=\"true\"\n className={iconChipVariants({ accent: resolved })}\n >\n {icon}\n </span>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n {hasStep ? (\n <span\n aria-hidden=\"true\"\n data-part=\"step\"\n className=\"type-eyebrow ds:rounded-[var(--radius-full)] ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]\"\n >\n {String(step).padStart(2, '0')}\n </span>\n ) : null}\n </div>\n )}\n <h3 className=\"type-title-card ds:text-[var(--foreground)]\">\n {title}\n </h3>\n {children ? (\n <div className=\"type-body ds:text-[var(--muted-foreground)] ds:flex-1\">\n {children}\n </div>\n ) : null}\n {cta ? <div className=\"ds:mt-[var(--spacing-xs)]\">{cta}</div> : null}\n </div>\n </article>\n );\n },\n);\nBenefitCardRoot.displayName = 'BenefitCard';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const BenefitCard = Object.assign(BenefitCardRoot, {\n Row: BenefitCardRow,\n});\n"],"names":["ACCENT_WHEEL","RowContext","createContext","rowVariants","cva","cardVariants","iconChipVariants","resolveAccent","accent","rowCtx","BenefitCardRow","forwardRef","columns","children","className","rest","ref","items","Children","jsx","child","index","BenefitCardRoot","step","icon","title","cta","variant","useContext","resolved","hasStep","jsxs","BenefitCard"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pagination-OQBlnb1H.js","sources":["../../src/components/pagination/pagination.agent.ts","../../src/components/pagination/pagination.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PaginationHandle } from './pagination';\n\nexport const paginationAgent: AgentAdapter<PaginationHandle> = {\n id: 'pagination',\n capabilities: ['paginate', 'range_navigate'],\n state: {\n currentPage: {\n type: 'number',\n description: 'Current page index (1-based).',\n read: (handle) => handle.getCurrentPage(),\n },\n totalPages: {\n type: 'number',\n description: 'Total number of pages.',\n read: (handle) => handle.getTotalPages(),\n },\n },\n actions: {\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n description: 'Navigate to a specific 1-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n next: {\n safety: 'read',\n description: 'Advance to the next page.',\n invoke: (handle) => {\n handle.next();\n },\n },\n previous: {\n safety: 'read',\n description: 'Step back to the previous page.',\n invoke: (handle) => {\n handle.previous();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'pagination' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { useAgentRegistration } from '../../agent';\nimport { paginationAgent } from './pagination.agent';\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n MoreHorizontal,\n Check,\n} from 'lucide-react';\n\n/* -------------------------------------------------------------------- */\n/* Sizes */\n/* -------------------------------------------------------------------- */\n\ntype PaginationSize = 'sm' | 'md' | 'lg';\n\nconst buttonBase = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-transparent',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:text-[var(--foreground)]',\n 'ds:select-none',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--muted)]/20',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50',\n].join(' ');\n\nconst paginationButtonVariants = cva(buttonBase, {\n variants: {\n size: {\n sm: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-sm)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n md: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n lg: 'ds:min-w-[3rem] ds:min-h-[3rem] ds:text-[length:var(--font-size-lg)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n },\n active: {\n true: 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:font-[var(--font-weight-bold)] ds:outline ds:outline-1 ds:outline-[var(--primary)] ds:hover:bg-[var(--primary-hover)]',\n false: '',\n },\n },\n defaultVariants: { size: 'md', active: false },\n});\n\n/* -------------------------------------------------------------------- */\n/* Range helper */\n/* -------------------------------------------------------------------- */\n\ntype PageToken = number | 'ellipsis-start' | 'ellipsis-end';\n\nfunction range(start: number, end: number): number[] {\n const out: number[] = [];\n for (let i = start; i <= end; i++) out.push(i);\n return out;\n}\n\nexport function buildPageRange(\n current: number,\n totalPages: number,\n siblingCount = 1,\n boundaryCount = 1,\n): PageToken[] {\n if (totalPages <= 0) return [];\n // Clamp to sensible minima so extreme consumer inputs don't surface\n // ranges like `[1, 3, 5]` with no ellipsis between boundaries.\n siblingCount = Math.max(0, siblingCount);\n boundaryCount = Math.max(1, boundaryCount);\n const totalNumbers = boundaryCount * 2 + siblingCount * 2 + 3;\n if (totalNumbers >= totalPages) return range(1, totalPages);\n\n const startPages = range(1, boundaryCount);\n const endPages = range(totalPages - boundaryCount + 1, totalPages);\n\n const siblingStart = Math.max(\n Math.min(\n current - siblingCount,\n totalPages - boundaryCount - siblingCount * 2 - 1,\n ),\n boundaryCount + 2,\n );\n const siblingEnd = Math.min(\n Math.max(current + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages[0] - 2,\n );\n\n const tokens: PageToken[] = [...startPages];\n\n if (siblingStart > boundaryCount + 2) tokens.push('ellipsis-start');\n else if (boundaryCount + 1 < totalPages - boundaryCount)\n tokens.push(boundaryCount + 1);\n\n tokens.push(...range(siblingStart, siblingEnd));\n\n if (siblingEnd < totalPages - boundaryCount - 1) tokens.push('ellipsis-end');\n else if (totalPages - boundaryCount > boundaryCount)\n tokens.push(totalPages - boundaryCount);\n\n tokens.push(...endPages);\n return tokens;\n}\n\n/* -------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------- */\n\n// Curated agent-readiness handle — see pagination.agent.ts.\nexport interface PaginationHandle {\n getCurrentPage: () => number;\n getTotalPages: () => number;\n goToPage: (page: number) => void;\n next: () => void;\n previous: () => void;\n}\n\nexport interface PaginationProps extends ComponentPropsWithoutRef<'nav'> {\n /** Total number of pages. */\n totalPages: number;\n /** Controlled current page (1-indexed). */\n page?: number;\n /** Default current page for uncontrolled use. */\n defaultPage?: number;\n /** Fires when the current page changes. */\n onPageChange?: (page: number) => void;\n /** Siblings shown on either side of the active page. @default 1 */\n siblingCount?: number;\n /** Boundary pages kept at each end. @default 1 */\n boundaryCount?: number;\n /** Visual size. @default 'md' */\n size?: PaginationSize;\n /** Show \"first\"/\"last\" chevrons alongside prev/next. @default false */\n showEndpoints?: boolean;\n /** Horizontal alignment of the pagination within its container. @default 'center' */\n align?: 'start' | 'center' | 'end';\n /** Optional page-size select config. */\n pageSize?: {\n value: number;\n options?: number[];\n onChange: (size: number) => void;\n };\n /** Use `Intl.NumberFormat` for page numbers (Arabic-Indic digits, etc.). */\n useLocaleDigits?: boolean;\n /** Locale override for digit formatting. */\n locale?: string;\n}\n\nconst Pagination = forwardRef<HTMLElement, PaginationProps>(\n (\n {\n totalPages,\n page: controlledPage,\n defaultPage = 1,\n onPageChange,\n siblingCount = 1,\n boundaryCount = 1,\n size = 'md',\n showEndpoints = false,\n align = 'center',\n pageSize,\n useLocaleDigits = false,\n locale,\n className,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const isControlled = controlledPage !== undefined;\n const [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);\n const currentPage = isControlled ? controlledPage! : uncontrolledPage;\n\n useEffect(() => {\n if (isControlled && defaultPage !== 1) {\n console.warn(\n '[Pagination] Both `page` and `defaultPage` were supplied. The `page` prop wins; remove `defaultPage` for controlled usage.',\n );\n }\n }, [isControlled, defaultPage]);\n\n const handleChange = useCallback(\n (next: number) => {\n const clamped = Math.min(Math.max(next, 1), Math.max(1, totalPages));\n if (!isControlled) setUncontrolledPage(clamped);\n onPageChange?.(clamped);\n },\n [isControlled, onPageChange, totalPages],\n );\n\n const formatNumber = useCallback(\n (n: number) => {\n if (!useLocaleDigits) return String(n);\n try {\n return new Intl.NumberFormat(locale ?? i18n.language).format(n);\n } catch {\n return String(n);\n }\n },\n [i18n.language, locale, useLocaleDigits],\n );\n\n const tokens = useMemo(\n () =>\n buildPageRange(currentPage, totalPages, siblingCount, boundaryCount),\n [currentPage, totalPages, siblingCount, boundaryCount],\n );\n\n const atFirst = currentPage <= 1;\n const atLast = currentPage >= totalPages;\n\n // Agent handle — refs for fresh reads.\n const pageRef = useRef(currentPage);\n useEffect(() => {\n pageRef.current = currentPage;\n }, [currentPage]);\n const totalRef = useRef(totalPages);\n useEffect(() => {\n totalRef.current = totalPages;\n }, [totalPages]);\n\n const agentHandle = useMemo<PaginationHandle>(\n () => ({\n getCurrentPage: () => pageRef.current,\n getTotalPages: () => totalRef.current,\n goToPage: (next) => handleChange(next),\n next: () => handleChange(pageRef.current + 1),\n previous: () => handleChange(pageRef.current - 1),\n }),\n [handleChange],\n );\n useAgentRegistration(paginationAgent, agentHandle, id);\n\n const justifyClass =\n align === 'start'\n ? 'ds:justify-start'\n : align === 'end'\n ? 'ds:justify-end'\n : 'ds:justify-center';\n\n return (\n <nav\n ref={ref}\n aria-label={t('navigation.pagination.label')}\n id={id}\n data-component=\"pagination\"\n data-component-id={id}\n className={[\n 'ds:flex ds:items-center',\n justifyClass,\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:flex-wrap',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <PaginationList size={size}>\n {showEndpoints ? (\n <PaginationItem>\n <PaginationEndpoint\n type=\"first\"\n size={size}\n disabled={atFirst}\n onClick={() => handleChange(1)}\n />\n </PaginationItem>\n ) : null}\n <PaginationItem>\n <PaginationPrevious\n size={size}\n disabled={atFirst}\n onClick={() => handleChange(currentPage - 1)}\n />\n </PaginationItem>\n {tokens.map((token, i) => {\n if (token === 'ellipsis-start' || token === 'ellipsis-end') {\n return (\n <PaginationItem key={`e-${i}`}>\n <PaginationEllipsis />\n </PaginationItem>\n );\n }\n return (\n <PaginationItem key={`p-${token}`}>\n <PaginationLink\n size={size}\n isActive={token === currentPage}\n aria-label={t('navigation.pagination.pageN', { n: token })}\n onClick={() => handleChange(token)}\n >\n {formatNumber(token)}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext\n size={size}\n disabled={atLast}\n onClick={() => handleChange(currentPage + 1)}\n />\n </PaginationItem>\n {showEndpoints ? (\n <PaginationItem>\n <PaginationEndpoint\n type=\"last\"\n size={size}\n disabled={atLast}\n onClick={() => handleChange(totalPages)}\n />\n </PaginationItem>\n ) : null}\n </PaginationList>\n {pageSize ? (\n <PageSizeSelect\n size={size}\n value={pageSize.value}\n options={pageSize.options ?? [10, 25, 50, 100]}\n onChange={pageSize.onChange}\n formatNumber={formatNumber}\n />\n ) : null}\n </nav>\n );\n },\n);\nPagination.displayName = 'Pagination';\n\n/* -------------------------------------------------------------------- */\n/* List + item */\n/* -------------------------------------------------------------------- */\n\nexport interface PaginationListProps extends ComponentPropsWithoutRef<'ul'> {\n size?: PaginationSize;\n}\n\nconst PaginationList = forwardRef<HTMLUListElement, PaginationListProps>(\n ({ children, className, ...rest }, ref) => (\n <ul\n ref={ref}\n className={[\n 'ds:flex ds:items-center',\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:m-0 ds:ps-0',\n 'ds:list-none',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </ul>\n ),\n);\nPaginationList.displayName = 'PaginationList';\n\nexport type PaginationItemProps = ComponentPropsWithoutRef<'li'>;\n\nconst PaginationItem = forwardRef<HTMLLIElement, PaginationItemProps>(\n ({ children, className, ...rest }, ref) => (\n <li ref={ref} className={className} {...rest}>\n {children}\n </li>\n ),\n);\nPaginationItem.displayName = 'PaginationItem';\n\n/* -------------------------------------------------------------------- */\n/* Link */\n/* -------------------------------------------------------------------- */\n\nexport interface PaginationLinkProps\n extends\n Omit<ComponentPropsWithoutRef<'button'>, 'size'>,\n VariantProps<typeof paginationButtonVariants> {\n isActive?: boolean;\n size?: PaginationSize;\n}\n\nconst PaginationLink = forwardRef<HTMLButtonElement, PaginationLinkProps>(\n ({ isActive = false, size = 'md', className, children, ...rest }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n aria-current={isActive ? 'page' : undefined}\n className={paginationButtonVariants({\n size,\n active: isActive,\n className,\n })}\n {...rest}\n >\n {children}\n </button>\n ),\n);\nPaginationLink.displayName = 'PaginationLink';\n\n/* -------------------------------------------------------------------- */\n/* Previous / Next / Endpoint buttons */\n/* -------------------------------------------------------------------- */\n\ninterface NavButtonProps {\n size?: PaginationSize;\n disabled?: boolean;\n onClick?: () => void;\n}\n\nconst chevronClasses = 'ds:size-4 ds:rtl:-scale-x-100';\n\nconst PaginationPrevious = forwardRef<HTMLButtonElement, NavButtonProps>(\n ({ size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation();\n const label = t('navigation.pagination.previous');\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <ChevronLeft aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationPrevious.displayName = 'PaginationPrevious';\n\nconst PaginationNext = forwardRef<HTMLButtonElement, NavButtonProps>(\n ({ size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation();\n const label = t('navigation.pagination.next');\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <ChevronRight aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationNext.displayName = 'PaginationNext';\n\ninterface EndpointProps extends NavButtonProps {\n type: 'first' | 'last';\n}\n\nconst PaginationEndpoint = forwardRef<HTMLButtonElement, EndpointProps>(\n ({ type, size = 'md', disabled, onClick }, ref) => {\n const { t } = useTranslation();\n const label =\n type === 'first'\n ? t('navigation.pagination.first')\n : t('navigation.pagination.last');\n const Icon = type === 'first' ? ChevronsLeft : ChevronsRight;\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={onClick}\n className={paginationButtonVariants({ size })}\n >\n <Icon aria-hidden=\"true\" className={chevronClasses} />\n </button>\n );\n },\n);\nPaginationEndpoint.displayName = 'PaginationEndpoint';\n\n/* -------------------------------------------------------------------- */\n/* Ellipsis */\n/* -------------------------------------------------------------------- */\n\nexport type PaginationEllipsisProps = ComponentPropsWithoutRef<'span'>;\n\nconst PaginationEllipsis = forwardRef<HTMLSpanElement, PaginationEllipsisProps>(\n ({ className, ...rest }, ref) => (\n <span\n ref={ref}\n aria-hidden=\"true\"\n role=\"presentation\"\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:text-[var(--muted-foreground)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"ds:size-4\" />\n </span>\n ),\n);\nPaginationEllipsis.displayName = 'PaginationEllipsis';\n\n/* -------------------------------------------------------------------- */\n/* Page-size select */\n/* -------------------------------------------------------------------- */\n\ninterface PageSizeSelectProps {\n size: PaginationSize;\n value: number;\n options: number[];\n onChange: (size: number) => void;\n formatNumber: (n: number) => string;\n}\n\nconst selectTriggerClasses = [\n 'ds:inline-flex ds:items-center ds:justify-between ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-[var(--border)] ds:bg-[var(--background)]',\n 'ds:text-[var(--foreground)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[6rem]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:text-[var(--font-size-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n].join(' ');\n\nconst selectContentClasses = [\n 'ds:z-[var(--z-dropdown)] ds:overflow-hidden',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95 ds:motion-reduce:animate-none',\n].join(' ');\n\nconst selectItemClasses = [\n 'ds:relative ds:flex ds:cursor-pointer ds:items-center',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-xl)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--foreground)] ds:outline-none ds:select-none',\n 'ds:data-[highlighted]:bg-[var(--muted)]/20',\n 'ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50',\n].join(' ');\n\nfunction PageSizeSelect({\n value,\n options,\n onChange,\n formatNumber,\n}: PageSizeSelectProps) {\n const { t } = useTranslation();\n const labelId = useId();\n return (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n id={labelId}\n className=\"type-label ds:text-[var(--muted-foreground)]\"\n >\n {t('navigation.pagination.rowsPerPage')}\n </span>\n <RadixSelect.Root\n value={String(value)}\n onValueChange={(v) => onChange(Number(v))}\n >\n <RadixSelect.Trigger\n aria-labelledby={labelId}\n className={selectTriggerClasses}\n >\n <RadixSelect.Value />\n <RadixSelect.Icon asChild>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:rotate-90\"\n />\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n <RadixSelect.Portal>\n <RadixSelect.Content\n className={selectContentClasses}\n position=\"popper\"\n >\n <RadixSelect.Viewport className=\"ds:p-[var(--spacing-xs)]\">\n {options.map((o) => (\n <RadixSelect.Item\n key={o}\n value={String(o)}\n className={selectItemClasses}\n >\n <RadixSelect.ItemIndicator className=\"ds:absolute ds:inline-flex ds:items-center ds:justify-center ds:start-[var(--spacing-sm)]\">\n <Check aria-hidden=\"true\" className=\"ds:size-3.5\" />\n </RadixSelect.ItemIndicator>\n <RadixSelect.ItemText>{formatNumber(o)}</RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Exports */\n/* -------------------------------------------------------------------- */\n\nexport {\n Pagination,\n PaginationList,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n"],"names":["paginationAgent","handle","args","buttonBase","paginationButtonVariants","cva","range","start","end","out","i","buildPageRange","current","totalPages","siblingCount","boundaryCount","startPages","endPages","siblingStart","siblingEnd","tokens","Pagination","forwardRef","controlledPage","defaultPage","onPageChange","size","showEndpoints","align","pageSize","useLocaleDigits","locale","className","id","rest","ref","t","i18n","useTranslation","isControlled","uncontrolledPage","setUncontrolledPage","useState","currentPage","useEffect","handleChange","useCallback","next","clamped","formatNumber","n","useMemo","atFirst","atLast","pageRef","useRef","totalRef","agentHandle","useAgentRegistration","justifyClass","jsxs","PaginationList","PaginationItem","jsx","PaginationEndpoint","PaginationPrevious","token","PaginationEllipsis","PaginationLink","PaginationNext","PageSizeSelect","children","isActive","chevronClasses","disabled","onClick","label","ChevronLeft","ChevronRight","type","Icon","ChevronsLeft","ChevronsRight","MoreHorizontal","selectTriggerClasses","selectContentClasses","selectItemClasses","value","options","onChange","labelId","useId","RadixSelect","v","o","Check"],"mappings":"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"}
@@ -1,242 +0,0 @@
1
- import { jsxs as g, jsx as s } from "react/jsx-runtime";
2
- import { forwardRef as P, useId as Y, useState as b, useCallback as N, useImperativeHandle as q, useEffect as j, useRef as L } from "react";
3
- import { c as C } from "./index-D2ZczOXr.js";
4
- import { useTranslation as S } from "react-i18next";
5
- import { I as D } from "./icon-button-C4CGcYuz.js";
6
- import { S as c } from "./sheet-BT0izeoI.js";
7
- import { X as F } from "./x-CCcI3eJp.js";
8
- import { M as W } from "./menu-XRhW3_99.js";
9
- const X = C(
10
- [
11
- "ds:flex ds:items-center ds:gap-[var(--spacing-md)]",
12
- "ds:w-full ds:z-[var(--z-sticky)]",
13
- "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:sm:ps-[var(--spacing-lg)] ds:sm:pe-[var(--spacing-lg)]",
14
- "ds:h-14 ds:md:h-16",
15
- "ds:transition-[background-color,box-shadow,transform] ds:duration-[var(--animation-duration)]",
16
- "ds:motion-reduce:transition-none"
17
- ].join(" "),
18
- {
19
- variants: {
20
- variant: {
21
- default: "ds:bg-[var(--card)] ds:text-[var(--foreground)] ds:border-b ds:border-[color:var(--border)]",
22
- // Transparent fades to default once data-stuck="true" (set by the
23
- // rAF scroll listener). The fade is handled via the same
24
- // background utility so `data-stuck` swaps cleanly between states.
25
- transparent: [
26
- "ds:bg-transparent ds:text-[var(--foreground)]",
27
- "ds:data-[stuck=true]:bg-[var(--card)]",
28
- "ds:data-[stuck=true]:shadow-[var(--shadow-md)]",
29
- "ds:forced-colors:border-b ds:forced-colors:border-[CanvasText]"
30
- ].join(" "),
31
- // `dark` flips its own scope into the dark token set so nav
32
- // links + buttons inside read off-white text on the blue-800
33
- // surface. Without the `theme-dark` scope the children inherit
34
- // the light-theme `--foreground` (blue-500) and fail
35
- // color-contrast at ~1.3:1.
36
- dark: "theme-dark ds:bg-[var(--color-blue-800)] ds:text-[var(--foreground)]"
37
- },
38
- sticky: {
39
- none: "",
40
- top: "ds:sticky ds:top-0",
41
- // `scroll-up` is sticky but translates off-screen when scrolling
42
- // down past `stickyOffset` (handled by data-hidden="true") and
43
- // slides back in when scrolling up.
44
- "scroll-up": [
45
- "ds:sticky ds:top-0",
46
- "ds:data-[hidden=true]:-translate-y-full"
47
- ].join(" ")
48
- }
49
- },
50
- defaultVariants: { variant: "default", sticky: "none" }
51
- }
52
- ), $ = C(
53
- [
54
- "ds:inline-flex ds:items-center",
55
- "ds:type-body-sm ds:font-medium",
56
- "ds:text-[var(--foreground)]",
57
- "ds:rounded-[var(--radius-sm)]",
58
- "ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)]",
59
- "ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
60
- "ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
61
- "ds:hover:text-[var(--primary)]",
62
- "ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
63
- "ds:data-[active=true]:text-[var(--primary)]",
64
- "ds:data-[active=true]:[box-shadow:inset_0_-2px_0_var(--primary)]"
65
- ].join(" ")
66
- );
67
- function G() {
68
- const [e, d] = b(() => typeof window > "u" || !window.matchMedia ? !1 : window.matchMedia("(prefers-reduced-motion: reduce)").matches);
69
- return j(() => {
70
- if (typeof window > "u" || !window.matchMedia) return;
71
- const r = window.matchMedia("(prefers-reduced-motion: reduce)"), n = () => d(r.matches);
72
- return r.addEventListener("change", n), () => r.removeEventListener("change", n);
73
- }, []), e;
74
- }
75
- function J(e, d, r) {
76
- const [n, a] = b(!1), [p, o] = b(!1), l = L(0), u = L(!1);
77
- return j(() => {
78
- if (!e || typeof window > "u") return;
79
- l.current = window.scrollY;
80
- const f = () => {
81
- const t = window.scrollY;
82
- if (a(t > r), d === "scroll-up") {
83
- const v = t - l.current;
84
- v > 4 && t > r ? o(!0) : (v < -4 || t <= r) && o(!1);
85
- }
86
- l.current = t, u.current = !1;
87
- }, m = () => {
88
- u.current || (u.current = !0, window.requestAnimationFrame(f));
89
- };
90
- return window.addEventListener("scroll", m, { passive: !0 }), f(), () => {
91
- window.removeEventListener("scroll", m);
92
- };
93
- }, [e, d, r]), { stuck: n, hidden: p };
94
- }
95
- const I = P(
96
- ({
97
- logo: e,
98
- homeHref: d = "/",
99
- homeLabel: r,
100
- navSlot: n,
101
- actionsSlot: a,
102
- variant: p = "default",
103
- sticky: o = "none",
104
- stickyOffset: l = 80,
105
- menuLabel: u,
106
- navLabel: f,
107
- id: m,
108
- className: t,
109
- ...v
110
- }, E) => {
111
- const { t: h } = S(), y = G(), O = Y(), H = `${m ?? O}-sheet`, [i, w] = b(!1), _ = p === "transparent" || o === "scroll-up", { stuck: z, hidden: T } = J(
112
- _,
113
- o,
114
- l
115
- ), A = y ? !1 : T, k = N(() => w(!0), []), M = N(() => w(!1), []);
116
- q(
117
- E,
118
- () => ({
119
- openMenu: k,
120
- closeMenu: M,
121
- getMenuOpen: () => i
122
- }),
123
- [k, M, i]
124
- );
125
- const B = r ?? h("publicHeader.homeLabel", "AlfaDocs — home"), x = f ?? h("publicHeader.primaryNavLabel", "Primary"), V = u ?? (i ? h("publicHeader.closeMenu", "Close menu") : h("publicHeader.openMenu", "Open menu"));
126
- return /* @__PURE__ */ g(
127
- "header",
128
- {
129
- ...v,
130
- "data-component": "public-header",
131
- "data-component-id": m,
132
- "data-stuck": z ? "true" : void 0,
133
- "data-hidden": A ? "true" : void 0,
134
- "data-state": y ? "reduced-motion" : void 0,
135
- className: X({ variant: p, sticky: o, className: t }),
136
- children: [
137
- /* @__PURE__ */ s(
138
- "a",
139
- {
140
- href: d,
141
- "aria-label": B,
142
- className: "ds:inline-flex ds:items-center ds:rounded-[var(--radius-sm)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
143
- children: e
144
- }
145
- ),
146
- n ? /* @__PURE__ */ s(
147
- "nav",
148
- {
149
- "aria-label": x,
150
- className: "ds:hidden ds:md:flex ds:items-center ds:gap-[var(--spacing-md)] ds:ms-[var(--spacing-lg)]",
151
- children: n
152
- }
153
- ) : null,
154
- a ? /* @__PURE__ */ s("div", { className: "ds:hidden ds:md:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ms-auto", children: a }) : null,
155
- /* @__PURE__ */ g(c, { open: i, onOpenChange: w, children: [
156
- /* @__PURE__ */ s(c.Trigger, { asChild: !0, children: /* @__PURE__ */ s(
157
- D,
158
- {
159
- size: "md",
160
- intent: "ghost",
161
- className: "ds:ms-auto ds:md:hidden",
162
- icon: i ? /* @__PURE__ */ s(F, { "aria-hidden": "true" }) : /* @__PURE__ */ s(W, { "aria-hidden": "true" }),
163
- "aria-controls": H,
164
- "aria-expanded": i,
165
- "aria-label": V
166
- }
167
- ) }),
168
- /* @__PURE__ */ g(c.Content, { side: "end", size: "md", id: H, children: [
169
- /* @__PURE__ */ s(c.Header, { children: /* @__PURE__ */ s(c.Title, { children: x }) }),
170
- /* @__PURE__ */ s(c.Body, { children: /* @__PURE__ */ g("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", children: [
171
- n ? /* @__PURE__ */ s(
172
- "nav",
173
- {
174
- "aria-label": x,
175
- className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]",
176
- children: n
177
- }
178
- ) : null,
179
- a ? /* @__PURE__ */ s("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:mt-[var(--spacing-md)]", children: a }) : null
180
- ] }) })
181
- ] })
182
- ] })
183
- ]
184
- }
185
- );
186
- }
187
- );
188
- I.displayName = "PublicHeader";
189
- const R = P(({ active: e, className: d, children: r, ...n }, a) => /* @__PURE__ */ s(
190
- "a",
191
- {
192
- ref: a,
193
- ...n,
194
- "data-active": e ? "true" : void 0,
195
- "aria-current": e ? "page" : void 0,
196
- className: [$(), d].filter(Boolean).join(" "),
197
- children: r
198
- }
199
- ));
200
- R.displayName = "PublicHeader.NavLink";
201
- const de = Object.assign(I, {
202
- NavLink: R
203
- }), ae = {
204
- id: "public-header",
205
- capabilities: ["open", "close"],
206
- state: {
207
- menuOpen: {
208
- type: "boolean",
209
- description: "Whether the mobile drawer is currently open.",
210
- read: (e) => e.getMenuOpen()
211
- }
212
- },
213
- actions: {
214
- open_menu: {
215
- safety: "read",
216
- description: "Open the mobile drawer.",
217
- invoke: (e) => {
218
- e.openMenu();
219
- }
220
- },
221
- close_menu: {
222
- safety: "read",
223
- description: "Close the mobile drawer.",
224
- invoke: (e) => {
225
- e.closeMenu();
226
- }
227
- }
228
- },
229
- domHooks: {
230
- root: { attr: "data-component", value: "public-header" },
231
- instanceId: {
232
- attr: "data-component-id",
233
- sourceProp: "id",
234
- description: "Sourced from the id prop on PublicHeader."
235
- }
236
- }
237
- };
238
- export {
239
- de as P,
240
- ae as p
241
- };
242
- //# sourceMappingURL=public-header.agent-ZLBAQ30j.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"public-header.agent-ZLBAQ30j.js","sources":["../../src/components/public-header/public-header.tsx","../../src/components/public-header/public-header.agent.ts"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* PublicHeader — anonymous / pre-auth site header. */\n/* */\n/* Distinct from the kit's `<Header>` (authenticated app shell): this */\n/* one is for booking-website, signature-website, marketing surfaces — */\n/* anywhere the chrome should read as continuous with `alfadocs.com`, */\n/* not as the logged-in app. */\n/* */\n/* DOM: */\n/* <header role=banner data-component=public-header data-stuck=…> */\n/* <a aria-label=homeLabel>{logo}</a> */\n/* <nav aria-label=primaryNav>{navSlot}</nav> ≥ md only */\n/* <div class=actions>{actionsSlot}</div> ≥ md only */\n/* <IconButton menu trigger /> ↔ Sheet (partial drawer) < md only */\n/* </header> */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Menu, X } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { IconButton } from '../button/icon-button';\nimport { Sheet } from '../sheet';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface PublicHeaderHandle {\n openMenu: () => void;\n closeMenu: () => void;\n getMenuOpen: () => boolean;\n}\n\nexport interface PublicHeaderProps\n extends\n Omit<ComponentPropsWithoutRef<'header'>, 'children'>,\n VariantProps<typeof rootVariants> {\n /** Logo lockup, typically `<Logo variant=\"wordmark\" tone=\"primary\" size=\"md\" />`. */\n logo: ReactNode;\n /** Optional href for the logo link. Defaults to `/`. */\n homeHref?: string;\n /** Accessible label for the logo link (falls back to `t('publicHeader.homeLabel')`). */\n homeLabel?: string;\n /** Primary nav links rendered inline ≥ md, collapsed into the mobile sheet below md. */\n navSlot?: ReactNode;\n /** Right-side actions (sign-in / register / role-switch CTAs). */\n actionsSlot?: ReactNode;\n /** Sticky behaviour. Default `none`. */\n sticky?: 'none' | 'top' | 'scroll-up';\n /** Pixel offset above which `sticky=\"scroll-up\"` engages and `transparent` fades to default. */\n stickyOffset?: number;\n /** Override the mobile menu trigger's accessible label (`t('publicHeader.openMenu')`). */\n menuLabel?: string;\n /** Override the navigation landmark label (`t('publicHeader.primaryNavLabel')`). */\n navLabel?: string;\n /** Consumer-supplied instance id, surfaced as `data-component-id`. */\n id?: string;\n}\n\nexport interface PublicHeaderNavLinkProps extends Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n 'children'\n> {\n href: string;\n active?: boolean;\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:w-full ds:z-[var(--z-sticky)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:sm:ps-[var(--spacing-lg)] ds:sm:pe-[var(--spacing-lg)]',\n 'ds:h-14 ds:md:h-16',\n 'ds:transition-[background-color,box-shadow,transform] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n variant: {\n default:\n 'ds:bg-[var(--card)] ds:text-[var(--foreground)] ds:border-b ds:border-[color:var(--border)]',\n // Transparent fades to default once data-stuck=\"true\" (set by the\n // rAF scroll listener). The fade is handled via the same\n // background utility so `data-stuck` swaps cleanly between states.\n transparent: [\n 'ds:bg-transparent ds:text-[var(--foreground)]',\n 'ds:data-[stuck=true]:bg-[var(--card)]',\n 'ds:data-[stuck=true]:shadow-[var(--shadow-md)]',\n 'ds:forced-colors:border-b ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n // `dark` flips its own scope into the dark token set so nav\n // links + buttons inside read off-white text on the blue-800\n // surface. Without the `theme-dark` scope the children inherit\n // the light-theme `--foreground` (blue-500) and fail\n // color-contrast at ~1.3:1.\n dark: 'theme-dark ds:bg-[var(--color-blue-800)] ds:text-[var(--foreground)]',\n },\n sticky: {\n none: '',\n top: 'ds:sticky ds:top-0',\n // `scroll-up` is sticky but translates off-screen when scrolling\n // down past `stickyOffset` (handled by data-hidden=\"true\") and\n // slides back in when scrolling up.\n 'scroll-up': [\n 'ds:sticky ds:top-0',\n 'ds:data-[hidden=true]:-translate-y-full',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'default', sticky: 'none' },\n },\n);\n\nconst navLinkVariants = cva(\n [\n 'ds:inline-flex ds:items-center',\n 'ds:type-body-sm ds:font-medium',\n 'ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:py-[var(--spacing-2xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:hover:text-[var(--primary)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[active=true]:text-[var(--primary)]',\n 'ds:data-[active=true]:[box-shadow:inset_0_-2px_0_var(--primary)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Reduced motion */\n/* ------------------------------------------------------------------ */\n\nfunction usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n });\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n const onChange = (): void => setReduced(mq.matches);\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, []);\n return reduced;\n}\n\n/* ------------------------------------------------------------------ */\n/* Scroll listener */\n/* */\n/* rAF-throttled tracker for two flags on the header root: */\n/* - `data-stuck`: scrollY > stickyOffset (drives the transparent → */\n/* solid fade + the scroll-up shadow lift). */\n/* - `data-hidden`: scrolling DOWN past stickyOffset hides the header */\n/* via transform; scrolling UP slides it back. Only emitted when */\n/* `sticky === 'scroll-up'`. */\n/* ------------------------------------------------------------------ */\n\nfunction useHeaderScrollState(\n enabled: boolean,\n sticky: NonNullable<PublicHeaderProps['sticky']>,\n stickyOffset: number,\n): {\n stuck: boolean;\n hidden: boolean;\n} {\n const [stuck, setStuck] = useState(false);\n const [hidden, setHidden] = useState(false);\n const lastYRef = useRef(0);\n const tickingRef = useRef(false);\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n lastYRef.current = window.scrollY;\n\n const update = (): void => {\n const y = window.scrollY;\n setStuck(y > stickyOffset);\n if (sticky === 'scroll-up') {\n const delta = y - lastYRef.current;\n // Hide on a meaningful downward delta past the offset; show on\n // any upward delta. 4px deadband keeps minor wheel inertia from\n // flapping the bar.\n if (delta > 4 && y > stickyOffset) setHidden(true);\n else if (delta < -4 || y <= stickyOffset) setHidden(false);\n }\n lastYRef.current = y;\n tickingRef.current = false;\n };\n const onScroll = (): void => {\n if (tickingRef.current) return;\n tickingRef.current = true;\n window.requestAnimationFrame(update);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n // Initial sync so we don't miss state when mounted past the offset.\n update();\n return () => {\n window.removeEventListener('scroll', onScroll);\n };\n }, [enabled, sticky, stickyOffset]);\n\n return { stuck, hidden };\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst PublicHeaderRoot = forwardRef<HTMLElement, PublicHeaderProps>(\n (\n {\n logo,\n homeHref = '/',\n homeLabel,\n navSlot,\n actionsSlot,\n variant = 'default',\n sticky = 'none',\n stickyOffset = 80,\n menuLabel,\n navLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const reduced = usePrefersReducedMotion();\n const autoId = useId();\n const sheetId = `${id ?? autoId}-sheet`;\n const [menuOpen, setMenuOpen] = useState(false);\n\n // Scroll listener is only active when `transparent` or `scroll-up`\n // need it. Hidden state is disabled under reduced motion (the bar\n // stays visible — translating off-screen is precisely the motion\n // class of user the preference targets).\n const scrollEnabled = variant === 'transparent' || sticky === 'scroll-up';\n const { stuck, hidden } = useHeaderScrollState(\n scrollEnabled,\n sticky,\n stickyOffset,\n );\n const effectiveHidden = reduced ? false : hidden;\n\n const openMenu = useCallback((): void => setMenuOpen(true), []);\n const closeMenu = useCallback((): void => setMenuOpen(false), []);\n\n useImperativeHandle(\n ref as React.Ref<PublicHeaderHandle> | null | undefined,\n () => ({\n openMenu,\n closeMenu,\n getMenuOpen: () => menuOpen,\n }),\n [openMenu, closeMenu, menuOpen],\n );\n\n const resolvedHomeLabel =\n homeLabel ?? t('publicHeader.homeLabel', 'AlfaDocs — home');\n const resolvedNavLabel =\n navLabel ?? t('publicHeader.primaryNavLabel', 'Primary');\n const resolvedMenuLabel =\n menuLabel ??\n (menuOpen\n ? t('publicHeader.closeMenu', 'Close menu')\n : t('publicHeader.openMenu', 'Open menu'));\n\n return (\n <header\n {...rest}\n data-component=\"public-header\"\n data-component-id={id}\n data-stuck={stuck ? 'true' : undefined}\n data-hidden={effectiveHidden ? 'true' : undefined}\n data-state={reduced ? 'reduced-motion' : undefined}\n className={rootVariants({ variant, sticky, className })}\n >\n <a\n href={homeHref}\n aria-label={resolvedHomeLabel}\n className=\"ds:inline-flex ds:items-center ds:rounded-[var(--radius-sm)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n {logo}\n </a>\n\n {navSlot ? (\n <nav\n aria-label={resolvedNavLabel}\n className=\"ds:hidden ds:md:flex ds:items-center ds:gap-[var(--spacing-md)] ds:ms-[var(--spacing-lg)]\"\n >\n {navSlot}\n </nav>\n ) : null}\n\n {actionsSlot ? (\n <div className=\"ds:hidden ds:md:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:ms-auto\">\n {actionsSlot}\n </div>\n ) : null}\n\n {/* Mobile menu trigger (< md). Wired to a Sheet (partial drawer\n from inline-end) so navSlot + actionsSlot collapse there. */}\n <Sheet open={menuOpen} onOpenChange={setMenuOpen}>\n <Sheet.Trigger asChild>\n <IconButton\n size=\"md\"\n intent=\"ghost\"\n className=\"ds:ms-auto ds:md:hidden\"\n icon={\n menuOpen ? (\n <X aria-hidden=\"true\" />\n ) : (\n <Menu aria-hidden=\"true\" />\n )\n }\n aria-controls={sheetId}\n aria-expanded={menuOpen}\n aria-label={resolvedMenuLabel}\n />\n </Sheet.Trigger>\n <Sheet.Content side=\"end\" size=\"md\" id={sheetId}>\n <Sheet.Header>\n <Sheet.Title>{resolvedNavLabel}</Sheet.Title>\n </Sheet.Header>\n <Sheet.Body>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {navSlot ? (\n <nav\n aria-label={resolvedNavLabel}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n {navSlot}\n </nav>\n ) : null}\n {actionsSlot ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:mt-[var(--spacing-md)]\">\n {actionsSlot}\n </div>\n ) : null}\n </div>\n </Sheet.Body>\n </Sheet.Content>\n </Sheet>\n </header>\n );\n },\n);\nPublicHeaderRoot.displayName = 'PublicHeader';\n\n/* ------------------------------------------------------------------ */\n/* NavLink */\n/* ------------------------------------------------------------------ */\n\nconst PublicHeaderNavLink = forwardRef<\n HTMLAnchorElement,\n PublicHeaderNavLinkProps\n>(({ active, className, children, ...rest }, ref) => (\n <a\n ref={ref}\n {...rest}\n data-active={active ? 'true' : undefined}\n aria-current={active ? 'page' : undefined}\n className={[navLinkVariants(), className].filter(Boolean).join(' ')}\n >\n {children}\n </a>\n));\nPublicHeaderNavLink.displayName = 'PublicHeader.NavLink';\n\n/* ------------------------------------------------------------------ */\n/* Public surface */\n/* ------------------------------------------------------------------ */\n\nexport const PublicHeader = Object.assign(PublicHeaderRoot, {\n NavLink: PublicHeaderNavLink,\n});\n","import type { AgentAdapter } from '../../agent/types';\nimport type { PublicHeaderHandle } from './public-header';\n\nexport const publicHeaderAgent: AgentAdapter<PublicHeaderHandle> = {\n id: 'public-header',\n capabilities: ['open', 'close'],\n state: {\n menuOpen: {\n type: 'boolean',\n description: 'Whether the mobile drawer is currently open.',\n read: (handle) => handle.getMenuOpen(),\n },\n },\n actions: {\n open_menu: {\n safety: 'read',\n description: 'Open the mobile drawer.',\n invoke: (handle) => {\n handle.openMenu();\n },\n },\n close_menu: {\n safety: 'read',\n description: 'Close the mobile drawer.',\n invoke: (handle) => {\n handle.closeMenu();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'public-header' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on PublicHeader.',\n },\n },\n};\n"],"names":["rootVariants","cva","navLinkVariants","usePrefersReducedMotion","reduced","setReduced","useState","useEffect","mq","onChange","useHeaderScrollState","enabled","sticky","stickyOffset","stuck","setStuck","hidden","setHidden","lastYRef","useRef","tickingRef","update","y","delta","onScroll","PublicHeaderRoot","forwardRef","logo","homeHref","homeLabel","navSlot","actionsSlot","variant","menuLabel","navLabel","id","className","rest","ref","t","useTranslation","autoId","useId","sheetId","menuOpen","setMenuOpen","scrollEnabled","effectiveHidden","openMenu","useCallback","closeMenu","useImperativeHandle","resolvedHomeLabel","resolvedNavLabel","resolvedMenuLabel","jsxs","jsx","Sheet","IconButton","X","Menu","PublicHeaderNavLink","active","children","PublicHeader","publicHeaderAgent","handle"],"mappings":"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"}