@kodffe/ui 0.0.0-stage → 0.10.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 (304) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +11 -0
  2. package/dist/accordion/accordion.d.ts +44 -0
  3. package/dist/accordion/accordion.js +84 -0
  4. package/dist/accordion/accordion.js.map +1 -0
  5. package/dist/alert/alert.d.ts +17 -0
  6. package/dist/alert/alert.js +59 -0
  7. package/dist/alert/alert.js.map +1 -0
  8. package/dist/app-shell/app-footer.d.ts +29 -0
  9. package/dist/app-shell/app-footer.js +39 -0
  10. package/dist/app-shell/app-footer.js.map +1 -0
  11. package/dist/app-shell/app-shell-context.d.ts +10 -0
  12. package/dist/app-shell/app-shell-context.js +12 -0
  13. package/dist/app-shell/app-shell-context.js.map +1 -0
  14. package/dist/app-shell/app-shell.d.ts +42 -0
  15. package/dist/app-shell/app-shell.js +191 -0
  16. package/dist/app-shell/app-shell.js.map +1 -0
  17. package/dist/app-shell/floating-actions.d.ts +19 -0
  18. package/dist/app-shell/floating-actions.js +59 -0
  19. package/dist/app-shell/floating-actions.js.map +1 -0
  20. package/dist/app-shell/workspace-switcher.d.ts +25 -0
  21. package/dist/app-shell/workspace-switcher.js +82 -0
  22. package/dist/app-shell/workspace-switcher.js.map +1 -0
  23. package/dist/badge/badge.d.ts +19 -0
  24. package/dist/badge/badge.js +59 -0
  25. package/dist/badge/badge.js.map +1 -0
  26. package/dist/banner/banner.d.ts +22 -0
  27. package/dist/banner/banner.js +80 -0
  28. package/dist/banner/banner.js.map +1 -0
  29. package/dist/breadcrumbs/breadcrumbs.d.ts +18 -0
  30. package/dist/breadcrumbs/breadcrumbs.js +45 -0
  31. package/dist/breadcrumbs/breadcrumbs.js.map +1 -0
  32. package/dist/button/button.d.ts +38 -0
  33. package/dist/button/button.js +83 -0
  34. package/dist/button/button.js.map +1 -0
  35. package/dist/card/card.d.ts +159 -0
  36. package/dist/card/card.js +390 -0
  37. package/dist/card/card.js.map +1 -0
  38. package/dist/card/insight-card.d.ts +19 -0
  39. package/dist/card/insight-card.js +51 -0
  40. package/dist/card/insight-card.js.map +1 -0
  41. package/dist/card/integration-card.d.ts +19 -0
  42. package/dist/card/integration-card.js +70 -0
  43. package/dist/card/integration-card.js.map +1 -0
  44. package/dist/charts/charts.d.ts +75 -0
  45. package/dist/charts/charts.js +453 -0
  46. package/dist/charts/charts.js.map +1 -0
  47. package/dist/choice/choice.d.ts +39 -0
  48. package/dist/choice/choice.js +143 -0
  49. package/dist/choice/choice.js.map +1 -0
  50. package/dist/combobox/combobox.d.ts +46 -0
  51. package/dist/combobox/combobox.js +196 -0
  52. package/dist/combobox/combobox.js.map +1 -0
  53. package/dist/command-palette/command-palette.d.ts +35 -0
  54. package/dist/command-palette/command-palette.js +164 -0
  55. package/dist/command-palette/command-palette.js.map +1 -0
  56. package/dist/confirm-dialog/confirm-dialog.d.ts +37 -0
  57. package/dist/confirm-dialog/confirm-dialog.js +106 -0
  58. package/dist/confirm-dialog/confirm-dialog.js.map +1 -0
  59. package/dist/content/assistant.d.ts +86 -0
  60. package/dist/content/assistant.js +213 -0
  61. package/dist/content/assistant.js.map +1 -0
  62. package/dist/content/content.d.ts +45 -0
  63. package/dist/content/content.js +136 -0
  64. package/dist/content/content.js.map +1 -0
  65. package/dist/data-display/avatar-sizes.d.ts +8 -0
  66. package/dist/data-display/avatar-sizes.js +12 -0
  67. package/dist/data-display/avatar-sizes.js.map +1 -0
  68. package/dist/data-display/avatar.d.ts +21 -0
  69. package/dist/data-display/avatar.js +53 -0
  70. package/dist/data-display/avatar.js.map +1 -0
  71. package/dist/data-display/chip.d.ts +20 -0
  72. package/dist/data-display/chip.js +64 -0
  73. package/dist/data-display/chip.js.map +1 -0
  74. package/dist/data-display/code-block.d.ts +14 -0
  75. package/dist/data-display/code-block.js +50 -0
  76. package/dist/data-display/code-block.js.map +1 -0
  77. package/dist/data-display/data-display.d.ts +73 -0
  78. package/dist/data-display/data-display.js +227 -0
  79. package/dist/data-display/data-display.js.map +1 -0
  80. package/dist/data-display/insights.d.ts +120 -0
  81. package/dist/data-display/insights.js +220 -0
  82. package/dist/data-display/insights.js.map +1 -0
  83. package/dist/data-table/cells.d.ts +86 -0
  84. package/dist/data-table/cells.js +163 -0
  85. package/dist/data-table/cells.js.map +1 -0
  86. package/dist/data-table/data-table.d.ts +112 -0
  87. package/dist/data-table/data-table.js +558 -0
  88. package/dist/data-table/data-table.js.map +1 -0
  89. package/dist/date-picker/date-picker.d.ts +61 -0
  90. package/dist/date-picker/date-picker.js +309 -0
  91. package/dist/date-picker/date-picker.js.map +1 -0
  92. package/dist/drawer/drawer.d.ts +32 -0
  93. package/dist/drawer/drawer.js +72 -0
  94. package/dist/drawer/drawer.js.map +1 -0
  95. package/dist/empty-state/empty-state.d.ts +25 -0
  96. package/dist/empty-state/empty-state.js +78 -0
  97. package/dist/empty-state/empty-state.js.map +1 -0
  98. package/dist/error-state/error-state.d.ts +19 -0
  99. package/dist/error-state/error-state.js +56 -0
  100. package/dist/error-state/error-state.js.map +1 -0
  101. package/dist/event-calendar/calendar-logic.test.d.ts +1 -0
  102. package/dist/event-calendar/dates.d.ts +35 -0
  103. package/dist/event-calendar/dates.js +55 -0
  104. package/dist/event-calendar/dates.js.map +1 -0
  105. package/dist/event-calendar/event-calendar.d.ts +125 -0
  106. package/dist/event-calendar/event-calendar.js +795 -0
  107. package/dist/event-calendar/event-calendar.js.map +1 -0
  108. package/dist/event-calendar/event-details.d.ts +50 -0
  109. package/dist/event-calendar/event-details.js +124 -0
  110. package/dist/event-calendar/event-details.js.map +1 -0
  111. package/dist/event-calendar/layout.d.ts +48 -0
  112. package/dist/event-calendar/layout.js +55 -0
  113. package/dist/event-calendar/layout.js.map +1 -0
  114. package/dist/file-upload/file-upload.d.ts +70 -0
  115. package/dist/file-upload/file-upload.js +307 -0
  116. package/dist/file-upload/file-upload.js.map +1 -0
  117. package/dist/filters/filters.d.ts +48 -0
  118. package/dist/filters/filters.js +103 -0
  119. package/dist/filters/filters.js.map +1 -0
  120. package/dist/form-field/form-field.d.ts +39 -0
  121. package/dist/form-field/form-field.js +88 -0
  122. package/dist/form-field/form-field.js.map +1 -0
  123. package/dist/hover-card/hover-card.d.ts +15 -0
  124. package/dist/hover-card/hover-card.js +27 -0
  125. package/dist/hover-card/hover-card.js.map +1 -0
  126. package/dist/hover-card/person-hover-card.d.ts +26 -0
  127. package/dist/hover-card/person-hover-card.js +85 -0
  128. package/dist/hover-card/person-hover-card.js.map +1 -0
  129. package/dist/icon/icon-tile.d.ts +20 -0
  130. package/dist/icon/icon-tile.js +55 -0
  131. package/dist/icon/icon-tile.js.map +1 -0
  132. package/dist/icon/icon.d.ts +14 -0
  133. package/dist/icon/icon.js +28 -0
  134. package/dist/icon/icon.js.map +1 -0
  135. package/dist/icon/icons.generated.d.ts +358 -0
  136. package/dist/icon/icons.generated.js +362 -0
  137. package/dist/icon/icons.generated.js.map +1 -0
  138. package/dist/index.d.ts +90 -0
  139. package/dist/index.js +88 -0
  140. package/dist/input/extra-inputs.d.ts +122 -0
  141. package/dist/input/extra-inputs.js +351 -0
  142. package/dist/input/extra-inputs.js.map +1 -0
  143. package/dist/input/field-styles.d.ts +5 -0
  144. package/dist/input/field-styles.js +14 -0
  145. package/dist/input/field-styles.js.map +1 -0
  146. package/dist/input/input.d.ts +50 -0
  147. package/dist/input/input.js +107 -0
  148. package/dist/input/input.js.map +1 -0
  149. package/dist/layout/layout.d.ts +41 -0
  150. package/dist/layout/layout.js +90 -0
  151. package/dist/layout/layout.js.map +1 -0
  152. package/dist/lib/control-styles.d.ts +9 -0
  153. package/dist/lib/control-styles.js +16 -0
  154. package/dist/lib/control-styles.js.map +1 -0
  155. package/dist/lib/cx.d.ts +2 -0
  156. package/dist/lib/cx.js +8 -0
  157. package/dist/lib/cx.js.map +1 -0
  158. package/dist/lib/glyphs.d.ts +13 -0
  159. package/dist/lib/glyphs.js +67 -0
  160. package/dist/lib/glyphs.js.map +1 -0
  161. package/dist/lib/segmented-styles.d.ts +8 -0
  162. package/dist/lib/segmented-styles.js +12 -0
  163. package/dist/lib/segmented-styles.js.map +1 -0
  164. package/dist/lib/select-on-arrow.d.ts +7 -0
  165. package/dist/lib/select-on-arrow.js +21 -0
  166. package/dist/lib/select-on-arrow.js.map +1 -0
  167. package/dist/lib/skip-link.d.ts +5 -0
  168. package/dist/lib/skip-link.js +13 -0
  169. package/dist/lib/skip-link.js.map +1 -0
  170. package/dist/lib/use-media-query.d.ts +4 -0
  171. package/dist/lib/use-media-query.js +15 -0
  172. package/dist/lib/use-media-query.js.map +1 -0
  173. package/dist/lists/lists.d.ts +76 -0
  174. package/dist/lists/lists.js +133 -0
  175. package/dist/lists/lists.js.map +1 -0
  176. package/dist/locale-switch/locale-switch.d.ts +29 -0
  177. package/dist/locale-switch/locale-switch.js +62 -0
  178. package/dist/locale-switch/locale-switch.js.map +1 -0
  179. package/dist/logo/logo.d.ts +31 -0
  180. package/dist/logo/logo.js +157 -0
  181. package/dist/logo/logo.js.map +1 -0
  182. package/dist/logo/product-logo.d.ts +19 -0
  183. package/dist/logo/product-logo.js +46 -0
  184. package/dist/logo/product-logo.js.map +1 -0
  185. package/dist/marketing/marketing.d.ts +176 -0
  186. package/dist/marketing/marketing.js +451 -0
  187. package/dist/marketing/marketing.js.map +1 -0
  188. package/dist/marketing/newsletter-form.d.ts +21 -0
  189. package/dist/marketing/newsletter-form.js +100 -0
  190. package/dist/marketing/newsletter-form.js.map +1 -0
  191. package/dist/mascot/mascot.d.ts +28 -0
  192. package/dist/mascot/mascot.js +28 -0
  193. package/dist/mascot/mascot.js.map +1 -0
  194. package/dist/mascot/mascots.generated.d.ts +284 -0
  195. package/dist/mascot/mascots.generated.js +287 -0
  196. package/dist/mascot/mascots.generated.js.map +1 -0
  197. package/dist/master-detail/master-detail.d.ts +30 -0
  198. package/dist/master-detail/master-detail.js +71 -0
  199. package/dist/master-detail/master-detail.js.map +1 -0
  200. package/dist/menu/account-menu.d.ts +44 -0
  201. package/dist/menu/account-menu.js +78 -0
  202. package/dist/menu/account-menu.js.map +1 -0
  203. package/dist/menu/context-menu.d.ts +31 -0
  204. package/dist/menu/context-menu.js +111 -0
  205. package/dist/menu/context-menu.js.map +1 -0
  206. package/dist/menu/dropdown-menu.d.ts +49 -0
  207. package/dist/menu/dropdown-menu.js +152 -0
  208. package/dist/menu/dropdown-menu.js.map +1 -0
  209. package/dist/menu/menu-styles.d.ts +8 -0
  210. package/dist/menu/menu-styles.js +6 -0
  211. package/dist/menu/menu-styles.js.map +1 -0
  212. package/dist/menu/menubar.d.ts +31 -0
  213. package/dist/menu/menubar.js +125 -0
  214. package/dist/menu/menubar.js.map +1 -0
  215. package/dist/modal/modal.d.ts +34 -0
  216. package/dist/modal/modal.js +58 -0
  217. package/dist/modal/modal.js.map +1 -0
  218. package/dist/notification-center/notification-center.d.ts +51 -0
  219. package/dist/notification-center/notification-center.js +244 -0
  220. package/dist/notification-center/notification-center.js.map +1 -0
  221. package/dist/otp-input/otp-input.d.ts +23 -0
  222. package/dist/otp-input/otp-input.js +61 -0
  223. package/dist/otp-input/otp-input.js.map +1 -0
  224. package/dist/overlay/overlay.d.ts +53 -0
  225. package/dist/overlay/overlay.js +103 -0
  226. package/dist/overlay/overlay.js.map +1 -0
  227. package/dist/page-header/page-header.d.ts +55 -0
  228. package/dist/page-header/page-header.js +114 -0
  229. package/dist/page-header/page-header.js.map +1 -0
  230. package/dist/page-header/record-headers.d.ts +51 -0
  231. package/dist/page-header/record-headers.js +134 -0
  232. package/dist/page-header/record-headers.js.map +1 -0
  233. package/dist/page-header/section-header.d.ts +21 -0
  234. package/dist/page-header/section-header.js +44 -0
  235. package/dist/page-header/section-header.js.map +1 -0
  236. package/dist/page-navigation/page-navigation.d.ts +59 -0
  237. package/dist/page-navigation/page-navigation.js +136 -0
  238. package/dist/page-navigation/page-navigation.js.map +1 -0
  239. package/dist/pagination/pagination.d.ts +28 -0
  240. package/dist/pagination/pagination.js +102 -0
  241. package/dist/pagination/pagination.js.map +1 -0
  242. package/dist/phone-input/phone-input.d.ts +34 -0
  243. package/dist/phone-input/phone-input.js +171 -0
  244. package/dist/phone-input/phone-input.js.map +1 -0
  245. package/dist/popover/popover.d.ts +23 -0
  246. package/dist/popover/popover.js +40 -0
  247. package/dist/popover/popover.js.map +1 -0
  248. package/dist/progress/progress.d.ts +21 -0
  249. package/dist/progress/progress.js +49 -0
  250. package/dist/progress/progress.js.map +1 -0
  251. package/dist/segmented-control/segmented-control.d.ts +32 -0
  252. package/dist/segmented-control/segmented-control.js +29 -0
  253. package/dist/segmented-control/segmented-control.js.map +1 -0
  254. package/dist/select/select.d.ts +48 -0
  255. package/dist/select/select.js +136 -0
  256. package/dist/select/select.js.map +1 -0
  257. package/dist/settings/permission-matrix.d.ts +29 -0
  258. package/dist/settings/permission-matrix.js +101 -0
  259. package/dist/settings/permission-matrix.js.map +1 -0
  260. package/dist/settings/settings-row.d.ts +32 -0
  261. package/dist/settings/settings-row.js +63 -0
  262. package/dist/settings/settings-row.js.map +1 -0
  263. package/dist/side-nav/side-nav.d.ts +36 -0
  264. package/dist/side-nav/side-nav.js +123 -0
  265. package/dist/side-nav/side-nav.js.map +1 -0
  266. package/dist/site-header/site-header.d.ts +32 -0
  267. package/dist/site-header/site-header.js +99 -0
  268. package/dist/site-header/site-header.js.map +1 -0
  269. package/dist/skeleton/skeleton.d.ts +16 -0
  270. package/dist/skeleton/skeleton.js +19 -0
  271. package/dist/skeleton/skeleton.js.map +1 -0
  272. package/dist/slider/slider.d.ts +15 -0
  273. package/dist/slider/slider.js +48 -0
  274. package/dist/slider/slider.js.map +1 -0
  275. package/dist/spinner/spinner.d.ts +15 -0
  276. package/dist/spinner/spinner.js +42 -0
  277. package/dist/spinner/spinner.js.map +1 -0
  278. package/dist/stepper/step-dots.d.ts +16 -0
  279. package/dist/stepper/step-dots.js +26 -0
  280. package/dist/stepper/step-dots.js.map +1 -0
  281. package/dist/stepper/stepper.d.ts +26 -0
  282. package/dist/stepper/stepper.js +113 -0
  283. package/dist/stepper/stepper.js.map +1 -0
  284. package/dist/tabs/tabs.d.ts +31 -0
  285. package/dist/tabs/tabs.js +66 -0
  286. package/dist/tabs/tabs.js.map +1 -0
  287. package/dist/templates/app-templates.d.ts +126 -0
  288. package/dist/templates/app-templates.js +153 -0
  289. package/dist/templates/app-templates.js.map +1 -0
  290. package/dist/templates/site-templates.d.ts +49 -0
  291. package/dist/templates/site-templates.js +110 -0
  292. package/dist/templates/site-templates.js.map +1 -0
  293. package/dist/toast/toast-store.d.ts +54 -0
  294. package/dist/toast/toast-store.js +49 -0
  295. package/dist/toast/toast-store.js.map +1 -0
  296. package/dist/toast/toaster.d.ts +15 -0
  297. package/dist/toast/toaster.js +124 -0
  298. package/dist/toast/toaster.js.map +1 -0
  299. package/dist/tooltip/tooltip.d.ts +29 -0
  300. package/dist/tooltip/tooltip.js +54 -0
  301. package/dist/tooltip/tooltip.js.map +1 -0
  302. package/package.json +88 -3
  303. package/styles.css +521 -0
  304. package/README.md +0 -3
@@ -0,0 +1,15 @@
1
+ import * as RadixSlider from '@radix-ui/react-slider';
2
+ import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
3
+ export interface SliderProps extends Omit<ComponentPropsWithoutRef<typeof RadixSlider.Root>, 'children'> {
4
+ /** Formats the visible value and `aria-valuetext` ("40 h / month", "$2,400"). */
5
+ format?: (value: number) => string;
6
+ /** Show the value above the track (default) or hide it when shown elsewhere. */
7
+ showValue?: boolean;
8
+ /** Labels under the ends of the track. */
9
+ minLabel?: ReactNode;
10
+ maxLabel?: ReactNode;
11
+ /** Accessible names per thumb (required for ranges: ["Minimum price", "Maximum price"]). */
12
+ thumbLabels?: string[];
13
+ }
14
+ /** Pick a value or range on a scale (ROI calculator, budgets, thresholds). The value is always visible. */
15
+ export declare function Slider({ format, showValue, minLabel, maxLabel, thumbLabels, value, defaultValue, onValueChange, className, ...rest }: SliderProps): import("react").JSX.Element;
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import { cx as e } from "../lib/cx.js";
3
+ import { useFieldProps as t } from "../input/input.js";
4
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
+ import { useState as i } from "react";
6
+ import * as a from "@radix-ui/react-slider";
7
+ //#region src/slider/slider.tsx
8
+ function o({ format: o = String, showValue: s = !0, minLabel: c, maxLabel: l, thumbLabels: u, value: d, defaultValue: f, onValueChange: p, className: m, ...h }) {
9
+ let g = t(h), [_, v] = i(f ?? [h.min ?? 0]), y = d ?? _;
10
+ return /* @__PURE__ */ r("div", {
11
+ className: e("grid gap-2 font-sans", m),
12
+ children: [
13
+ s && /* @__PURE__ */ n("output", {
14
+ htmlFor: g.id,
15
+ className: "justify-self-end font-display text-lg font-bold text-fg tabular-nums",
16
+ children: y.map(o).join(" – ")
17
+ }),
18
+ /* @__PURE__ */ r(a.Root, {
19
+ ...h,
20
+ value: d,
21
+ defaultValue: f,
22
+ onValueChange: (e) => {
23
+ v(e), p?.(e);
24
+ },
25
+ className: "relative flex h-6 w-full touch-none items-center select-none data-[disabled]:opacity-50",
26
+ children: [/* @__PURE__ */ n(a.Track, {
27
+ className: "relative h-2 grow overflow-hidden rounded-full bg-surface-muted",
28
+ children: /* @__PURE__ */ n(a.Range, { className: "absolute h-full rounded-full bg-primary" })
29
+ }), y.map((e, t) => /* @__PURE__ */ n(a.Thumb, {
30
+ id: t === 0 ? g.id : void 0,
31
+ "aria-label": u?.[t],
32
+ "aria-labelledby": !u && g.id ? `${g.id}-label` : void 0,
33
+ "aria-describedby": g["aria-describedby"],
34
+ "aria-valuetext": o(e),
35
+ className: "block size-6 cursor-grab rounded-full border-2 border-primary bg-surface shadow-[0_2px_6px_rgb(0_0_0/0.18)] transition-transform hover:scale-110 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus active:cursor-grabbing pointer-coarse:size-7 motion-reduce:transition-none"
36
+ }, t))]
37
+ }),
38
+ (c || l) && /* @__PURE__ */ r("div", {
39
+ className: "flex justify-between text-xs text-fg-muted",
40
+ children: [/* @__PURE__ */ n("span", { children: c }), /* @__PURE__ */ n("span", { children: l })]
41
+ })
42
+ ]
43
+ });
44
+ }
45
+ //#endregion
46
+ export { o as Slider };
47
+
48
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","names":["RadixSlider","Slider","rest","field","useFieldProps","internal","setInternal","useState","defaultValue","current","value","cx","className","showValue","format","v","onValueChange","i","thumbLabels","minLabel","maxLabel"],"sources":["../../src/slider/slider.tsx"],"sourcesContent":["'use client';\n\nimport * as RadixSlider from '@radix-ui/react-slider';\nimport { useState, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useFieldProps } from '../input/input';\n\nexport interface SliderProps extends Omit<ComponentPropsWithoutRef<typeof RadixSlider.Root>, 'children'> {\n /** Formats the visible value and `aria-valuetext` (\"40 h / month\", \"$2,400\"). */\n format?: (value: number) => string;\n /** Show the value above the track (default) or hide it when shown elsewhere. */\n showValue?: boolean;\n /** Labels under the ends of the track. */\n minLabel?: ReactNode;\n maxLabel?: ReactNode;\n /** Accessible names per thumb (required for ranges: [\"Minimum price\", \"Maximum price\"]). */\n thumbLabels?: string[];\n}\n\n/** Pick a value or range on a scale (ROI calculator, budgets, thresholds). The value is always visible. */\nexport function Slider({\n format = String,\n showValue = true,\n minLabel,\n maxLabel,\n thumbLabels,\n value,\n defaultValue,\n onValueChange,\n className,\n ...rest\n}: SliderProps) {\n const field = useFieldProps(rest);\n const [internal, setInternal] = useState(defaultValue ?? [rest.min ?? 0]);\n const current = value ?? internal;\n return (\n <div className={cx('grid gap-2 font-sans', className)}>\n {showValue && (\n <output htmlFor={field.id} className=\"justify-self-end font-display text-lg font-bold text-fg tabular-nums\">\n {current.map(format).join(' – ')}\n </output>\n )}\n <RadixSlider.Root\n {...rest}\n value={value}\n defaultValue={defaultValue}\n onValueChange={(v) => {\n setInternal(v);\n onValueChange?.(v);\n }}\n className=\"relative flex h-6 w-full touch-none items-center select-none data-[disabled]:opacity-50\"\n >\n <RadixSlider.Track className=\"relative h-2 grow overflow-hidden rounded-full bg-surface-muted\">\n <RadixSlider.Range className=\"absolute h-full rounded-full bg-primary\" />\n </RadixSlider.Track>\n {current.map((v, i) => (\n <RadixSlider.Thumb\n key={i}\n id={i === 0 ? field.id : undefined}\n aria-label={thumbLabels?.[i]}\n aria-labelledby={!thumbLabels && field.id ? `${field.id}-label` : undefined}\n aria-describedby={field['aria-describedby']}\n aria-valuetext={format(v)}\n className=\"block size-6 cursor-grab rounded-full border-2 border-primary bg-surface shadow-[0_2px_6px_rgb(0_0_0/0.18)] transition-transform hover:scale-110 focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus active:cursor-grabbing pointer-coarse:size-7 motion-reduce:transition-none\"\n />\n ))}\n </RadixSlider.Root>\n {(minLabel || maxLabel) && (\n <div className=\"flex justify-between text-xs text-fg-muted\">\n <span>{minLabel}</span>\n <span>{maxLabel}</span>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAoBA,SAAgBC,EAAO,EACrB,YAAS,QACT,eAAY,IACZ,aACA,aACA,gBACA,UACA,iBACA,kBACA,cACA,GAAGC,KACW;CACd,IAAMC,IAAQC,EAAcF,CAAI,GAC1B,CAACG,GAAUC,KAAeC,EAASC,KAAgB,CAACN,EAAK,OAAO,CAAC,CAAC,GAClEO,IAAUC,KAASL;CACzB,OACE,kBAAC,OAAD;EAAK,WAAWM,EAAG,wBAAwBC,CAAS;EAApD,UAAA;GACGC,KACC,kBAAC,UAAD;IAAQ,SAASV,EAAM;IAAI,WAAU;IAClC,UAAAM,EAAQ,IAAIK,CAAM,CAAC,CAAC,KAAK,KAAK;GACzB,CAAA;GAEV,kBAACd,EAAY,MAAb;IACE,GAAIE;IACG;IACO;IACd,gBAAgB,MAAM;KAEpB,AADAI,EAAYS,CAAC,GACbC,IAAgBD,CAAC;IACnB;IACA,WAAU;IARZ,UAAA,CAUE,kBAACf,EAAY,OAAb;KAAmB,WAAU;KAC3B,UAAA,kBAACA,EAAY,OAAb,EAAmB,WAAU,0CAA2C,CAAA;IACvD,CAAA,GAClBS,EAAQ,KAAK,GAAG,MACf,kBAACT,EAAY,OAAb;KAEE,IAAIiB,MAAM,IAAId,EAAM,KAAK,KAAA;KACzB,cAAYe,IAAcD;KAC1B,mBAAiB,CAACC,KAAef,EAAM,KAAK,GAAGA,EAAM,GAAG,UAAU,KAAA;KAClE,oBAAkBA,EAAM;KACxB,kBAAgBW,EAAOC,CAAC;KACxB,WAAU;IACX,GAPME,CAON,CACF,CACe;;IAChBE,KAAYC,MACZ,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,QAAD,EAAA,UAAOD,EAAe,CAAA,GACtB,kBAAC,QAAD,EAAA,UAAOC,EAAe,CAAA,CACnB;;EAEJ;;AAET"}
@@ -0,0 +1,15 @@
1
+ import type { SVGProps } from 'react';
2
+ export interface SpinnerProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {
3
+ /** Height in px or any CSS length. Defaults to 1em (follows the text). */
4
+ size?: number | string;
5
+ /**
6
+ * Accessible name ("Loading results"). Leave it out when the surrounding control already says it is busy
7
+ * (`aria-busy` on a button); the spinner is then hidden from screen readers.
8
+ */
9
+ label?: string;
10
+ }
11
+ /**
12
+ * Small progress indicator (ADR-0015): the logo's eye with the pupil going round, no mouth. For buttons, inputs,
13
+ * toasts and any place under 40 px; use `Mascot state="loading"` for large waiting areas.
14
+ */
15
+ export declare function Spinner({ size, label, className, style, ...rest }: SpinnerProps): import("react").JSX.Element;
@@ -0,0 +1,42 @@
1
+ import { cx as e } from "../lib/cx.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/spinner/spinner.tsx
4
+ function r({ size: r = "1em", label: i, className: a, style: o, ...s }) {
5
+ let c = i ? {
6
+ role: "status",
7
+ "aria-label": i
8
+ } : { "aria-hidden": !0 };
9
+ return /* @__PURE__ */ n("svg", {
10
+ viewBox: "16 0 68 68",
11
+ focusable: "false",
12
+ className: e("kf-spinner inline-block shrink-0", a),
13
+ style: {
14
+ height: r,
15
+ width: "auto",
16
+ ...o
17
+ },
18
+ ...c,
19
+ ...s,
20
+ children: [/* @__PURE__ */ t("circle", {
21
+ cx: "50",
22
+ cy: "34",
23
+ r: "25.57",
24
+ fill: "none",
25
+ stroke: "currentColor",
26
+ strokeWidth: "11",
27
+ opacity: "0.3"
28
+ }), /* @__PURE__ */ t("g", {
29
+ className: "kf-spinner__pupil",
30
+ children: /* @__PURE__ */ t("circle", {
31
+ cx: "58",
32
+ cy: "34",
33
+ r: "9.72",
34
+ fill: "currentColor"
35
+ })
36
+ })]
37
+ });
38
+ }
39
+ //#endregion
40
+ export { r as Spinner };
41
+
42
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","names":["Spinner","rest","a11y","label","cx","className","size","style"],"sources":["../../src/spinner/spinner.tsx"],"sourcesContent":["import type { SVGProps } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface SpinnerProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {\n /** Height in px or any CSS length. Defaults to 1em (follows the text). */\n size?: number | string;\n /**\n * Accessible name (\"Loading results\"). Leave it out when the surrounding control already says it is busy\n * (`aria-busy` on a button); the spinner is then hidden from screen readers.\n */\n label?: string;\n}\n\n/**\n * Small progress indicator (ADR-0015): the logo's eye with the pupil going round, no mouth. For buttons, inputs,\n * toasts and any place under 40 px; use `Mascot state=\"loading\"` for large waiting areas.\n */\nexport function Spinner({ size = '1em', label, className, style, ...rest }: SpinnerProps) {\n const a11y = label ? { role: 'status', 'aria-label': label } : { 'aria-hidden': true as const };\n return (\n <svg\n viewBox=\"16 0 68 68\"\n focusable=\"false\"\n className={cx('kf-spinner inline-block shrink-0', className)}\n style={{ height: size, width: 'auto', ...style }}\n {...a11y}\n {...rest}\n >\n <circle cx=\"50\" cy=\"34\" r=\"25.57\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"11\" opacity=\"0.3\" />\n <g className=\"kf-spinner__pupil\">\n <circle cx=\"58\" cy=\"34\" r=\"9.72\" fill=\"currentColor\" />\n </g>\n </svg>\n );\n}\n"],"mappings":";;;AAiBA,SAAgBA,EAAQ,EAAE,UAAO,OAAO,UAAO,cAAW,UAAO,GAAGC,KAAsB;CACxF,IAAMC,IAAOC,IAAQ;EAAE,MAAM;EAAU,cAAcA;CAAM,IAAI,EAAE,eAAe,GAAc;CAC9F,OACE,kBAAC,OAAD;EACE,SAAQ;EACR,WAAU;EACV,WAAWC,EAAG,oCAAoCC,CAAS;EAC3D,OAAO;GAAE,QAAQC;GAAM,OAAO;GAAQ,GAAGC;EAAM;EAC/C,GAAIL;EACJ,GAAID;EANN,UAAA,CAQE,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAQ,MAAK;GAAO,QAAO;GAAe,aAAY;GAAK,SAAQ;EAAO,CAAA,GACpG,kBAAC,KAAD;GAAG,WAAU;GACX,UAAA,kBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAO,MAAK;GAAgB,CAAA;EACrD,CAAA,CACA;;AAET"}
@@ -0,0 +1,16 @@
1
+ export interface StepDot {
2
+ label: string;
3
+ state: 'done' | 'current' | 'upcoming';
4
+ /** Per-step color for done steps (status palettes). */
5
+ color?: string;
6
+ }
7
+ /** A row of small dots for process steps; the text alternative lists each step and its state. */
8
+ export declare function StepDots({ steps, labels, className, }: {
9
+ steps: StepDot[];
10
+ labels?: {
11
+ done?: string;
12
+ current?: string;
13
+ upcoming?: string;
14
+ };
15
+ className?: string;
16
+ }): import("react").JSX.Element;
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { cx as e } from "../lib/cx.js";
3
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
+ //#region src/stepper/step-dots.tsx
5
+ function r({ steps: r, labels: i = {}, className: a }) {
6
+ let o = {
7
+ done: i.done ?? "done",
8
+ current: i.current ?? "current",
9
+ upcoming: i.upcoming ?? "upcoming"
10
+ };
11
+ return /* @__PURE__ */ n("span", {
12
+ className: e("inline-flex items-center gap-1", a),
13
+ children: [r.map((n) => /* @__PURE__ */ t("span", {
14
+ "aria-hidden": "true",
15
+ className: e("rounded-full", n.state === "current" ? "h-2 w-4 bg-primary" : "size-2", n.state === "upcoming" && "bg-border", n.state === "done" && !n.color && "bg-success-icon"),
16
+ style: n.state === "done" && n.color ? { background: n.color } : void 0
17
+ }, n.label)), /* @__PURE__ */ t("span", {
18
+ className: "sr-only",
19
+ children: r.map((e) => `${e.label}: ${o[e.state]}`).join(", ")
20
+ })]
21
+ });
22
+ }
23
+ //#endregion
24
+ export { r as StepDots };
25
+
26
+ //# sourceMappingURL=step-dots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-dots.js","names":["StepDots","state","labels","cx","className","steps","s"],"sources":["../../src/stepper/step-dots.tsx"],"sourcesContent":["'use client';\nimport { cx } from '../lib/cx';\n\n/* ---------------- StepDots ---------------- */\n\nexport interface StepDot {\n label: string;\n state: 'done' | 'current' | 'upcoming';\n /** Per-step color for done steps (status palettes). */\n color?: string;\n}\n\n/** A row of small dots for process steps; the text alternative lists each step and its state. */\nexport function StepDots({\n steps,\n labels = {},\n className,\n}: {\n steps: StepDot[];\n labels?: { done?: string; current?: string; upcoming?: string };\n className?: string;\n}) {\n const state = {\n done: labels.done ?? 'done',\n current: labels.current ?? 'current',\n upcoming: labels.upcoming ?? 'upcoming',\n };\n return (\n <span className={cx('inline-flex items-center gap-1', className)}>\n {steps.map((s) => (\n <span\n key={s.label}\n aria-hidden=\"true\"\n className={cx(\n 'rounded-full',\n s.state === 'current' ? 'h-2 w-4 bg-primary' : 'size-2',\n s.state === 'upcoming' && 'bg-border',\n s.state === 'done' && !s.color && 'bg-success-icon',\n )}\n style={s.state === 'done' && s.color ? { background: s.color } : undefined}\n />\n ))}\n <span className=\"sr-only\">{steps.map((s) => `${s.label}: ${state[s.state]}`).join(', ')}</span>\n </span>\n );\n}\n"],"mappings":";;;;AAaA,SAAgBA,EAAS,EACvB,UACA,YAAS,CAAC,GACV,gBAKC;CACD,IAAMC,IAAQ;EACZ,MAAMC,EAAO,QAAQ;EACrB,SAASA,EAAO,WAAW;EAC3B,UAAUA,EAAO,YAAY;CAC/B;CACA,OACE,kBAAC,QAAD;EAAM,WAAWC,EAAG,kCAAkCC,CAAS;EAA/D,UAAA,CACGC,EAAM,KAAK,MACV,kBAAC,QAAD;GAEE,eAAY;GACZ,WAAWF,EACT,gBACAG,EAAE,UAAU,YAAY,uBAAuB,UAC/CA,EAAE,UAAU,cAAc,aAC1BA,EAAE,UAAU,UAAU,CAACA,EAAE,SAAS,iBACpC;GACA,OAAOA,EAAE,UAAU,UAAUA,EAAE,QAAQ,EAAE,YAAYA,EAAE,MAAM,IAAI,KAAA;EAClE,GATMA,EAAE,KASR,CACF,GACD,kBAAC,QAAD;GAAM,WAAU;GAAW,UAAAD,EAAM,KAAK,MAAM,GAAGC,EAAE,MAAM,IAAIL,EAAMK,EAAE,QAAQ,CAAC,CAAC,KAAK,IAAI;EAAQ,CAAA,CAC1F;;AAEV"}
@@ -0,0 +1,26 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export interface StepperStep {
3
+ label: ReactNode;
4
+ description?: ReactNode;
5
+ }
6
+ export interface StepperProps extends HTMLAttributes<HTMLOListElement> {
7
+ steps: StepperStep[];
8
+ /** Index of the current step (0-based). Steps before it are complete. */
9
+ current: number;
10
+ orientation?: 'horizontal' | 'vertical';
11
+ /**
12
+ * `default`: numbered steps with labels. `counter`: "Step 2 of 5" with a progress bar (narrow places, wizards).
13
+ * `dots`: step dots with the current label (onboarding cards, carousels).
14
+ */
15
+ variant?: 'default' | 'counter' | 'dots';
16
+ labels?: {
17
+ completed?: string;
18
+ current?: string;
19
+ stepOf?: string;
20
+ };
21
+ }
22
+ /**
23
+ * Progress through a multi-step flow (onboarding, checkout, workflow setup).
24
+ * Horizontal stepper collapses to "Step 2 of 4 · Connect apps" on mobile.
25
+ */
26
+ export declare function Stepper({ steps, current, orientation, variant, labels, className, ...rest }: StepperProps): import("react").JSX.Element;
@@ -0,0 +1,113 @@
1
+ import { cx as e } from "../lib/cx.js";
2
+ import { Glyph as t } from "../lib/glyphs.js";
3
+ import { StepDots as n } from "./step-dots.js";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region src/stepper/stepper.tsx
6
+ function a({ steps: a, current: o, orientation: s = "horizontal", variant: c = "default", labels: l = {}, className: u, ...d }) {
7
+ let { completed: f = "Completed", current: p = "Current step", stepOf: m = "Step {n} of {count}" } = l, h = s === "vertical", g = m.replace("{n}", String(o + 1)).replace("{count}", String(a.length));
8
+ return c === "default" ? /* @__PURE__ */ i("div", {
9
+ className: e("font-sans", u),
10
+ children: [!h && /* @__PURE__ */ i("p", {
11
+ className: "m-0 mb-2 text-sm sm:hidden",
12
+ children: [/* @__PURE__ */ i("span", {
13
+ className: "text-fg-muted",
14
+ children: [
15
+ m.replace("{n}", String(o + 1)).replace("{count}", String(a.length)),
16
+ " ·",
17
+ " "
18
+ ]
19
+ }), /* @__PURE__ */ r("span", {
20
+ className: "font-semibold",
21
+ children: a[o]?.label
22
+ })]
23
+ }), /* @__PURE__ */ r("ol", {
24
+ className: e("m-0 list-none p-0", h ? "grid gap-0" : "hidden gap-2 sm:flex"),
25
+ ...d,
26
+ children: a.map((n, s) => {
27
+ let c = s < o ? "complete" : s === o ? "current" : "upcoming";
28
+ return /* @__PURE__ */ i("li", {
29
+ "aria-current": c === "current" ? "step" : void 0,
30
+ className: e("relative flex gap-3", h ? "pb-6 last:pb-0" : "min-w-0 flex-1 items-center"),
31
+ children: [
32
+ /* @__PURE__ */ r("span", {
33
+ className: e("relative z-10 grid size-8 shrink-0 place-items-center rounded-full text-sm font-bold tabular-nums", c === "complete" && "bg-primary text-on-primary", c === "current" && "bg-surface text-link ring-2 ring-primary ring-inset", c === "upcoming" && "bg-surface-muted text-fg-muted"),
34
+ children: c === "complete" ? /* @__PURE__ */ r(t, {
35
+ name: "check",
36
+ size: 16
37
+ }) : s + 1
38
+ }),
39
+ /* @__PURE__ */ i("span", {
40
+ className: e("min-w-0", !h && "truncate"),
41
+ children: [/* @__PURE__ */ i("span", {
42
+ className: e("block text-sm", c === "upcoming" ? "text-fg-muted" : "font-semibold text-fg", !h && "truncate"),
43
+ children: [
44
+ n.label,
45
+ c === "complete" && /* @__PURE__ */ i("span", {
46
+ className: "sr-only",
47
+ children: [
48
+ " (",
49
+ f,
50
+ ")"
51
+ ]
52
+ }),
53
+ c === "current" && /* @__PURE__ */ i("span", {
54
+ className: "sr-only",
55
+ children: [
56
+ " (",
57
+ p,
58
+ ")"
59
+ ]
60
+ })
61
+ ]
62
+ }), n.description && h && /* @__PURE__ */ r("span", {
63
+ className: "mt-0.5 block text-sm text-fg-muted",
64
+ children: n.description
65
+ })]
66
+ }),
67
+ s < a.length - 1 && (h ? /* @__PURE__ */ r("span", {
68
+ "aria-hidden": "true",
69
+ className: e("absolute top-9 bottom-1 left-[15px] w-0.5 rounded-full", c === "complete" ? "bg-primary" : "bg-border")
70
+ }) : /* @__PURE__ */ r("span", {
71
+ "aria-hidden": "true",
72
+ className: e("h-0.5 min-w-4 flex-1 rounded-full", c === "complete" ? "bg-primary" : "bg-border")
73
+ }))
74
+ ]
75
+ }, s);
76
+ })
77
+ })]
78
+ }) : /* @__PURE__ */ i("div", {
79
+ className: e("grid gap-2 font-sans", u),
80
+ children: [/* @__PURE__ */ i("p", {
81
+ className: "m-0 flex flex-wrap items-center gap-x-2 text-sm",
82
+ children: [
83
+ /* @__PURE__ */ r("span", {
84
+ className: "text-fg-muted",
85
+ children: g
86
+ }),
87
+ /* @__PURE__ */ r("span", {
88
+ "aria-hidden": "true",
89
+ className: "text-fg-muted",
90
+ children: "·"
91
+ }),
92
+ /* @__PURE__ */ r("span", {
93
+ className: "font-semibold text-fg",
94
+ children: a[o]?.label
95
+ })
96
+ ]
97
+ }), c === "counter" ? /* @__PURE__ */ r("span", {
98
+ "aria-hidden": "true",
99
+ className: "h-1.5 overflow-hidden rounded-full bg-surface-muted",
100
+ children: /* @__PURE__ */ r("span", {
101
+ className: "block h-full rounded-full bg-primary",
102
+ style: { width: `${(o + 1) / a.length * 100}%` }
103
+ })
104
+ }) : /* @__PURE__ */ r(n, { steps: a.map((e, t) => ({
105
+ label: typeof e.label == "string" ? e.label : `${t + 1}`,
106
+ state: t < o ? "done" : t === o ? "current" : "upcoming"
107
+ })) })]
108
+ });
109
+ }
110
+ //#endregion
111
+ export { a as Stepper };
112
+
113
+ //# sourceMappingURL=stepper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper.js","names":["Stepper","rest","currentLabel","labels","vertical","orientation","position","stepOf","current","steps","variant","cx","className","state","i","Glyph","step","completed","StepDots","s"],"sources":["../../src/stepper/stepper.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { Glyph } from '../lib/glyphs';\nimport { StepDots } from './step-dots';\n\nexport interface StepperStep {\n label: ReactNode;\n description?: ReactNode;\n}\n\nexport interface StepperProps extends HTMLAttributes<HTMLOListElement> {\n steps: StepperStep[];\n /** Index of the current step (0-based). Steps before it are complete. */\n current: number;\n orientation?: 'horizontal' | 'vertical';\n /**\n * `default`: numbered steps with labels. `counter`: \"Step 2 of 5\" with a progress bar (narrow places, wizards).\n * `dots`: step dots with the current label (onboarding cards, carousels).\n */\n variant?: 'default' | 'counter' | 'dots';\n labels?: { completed?: string; current?: string; stepOf?: string };\n}\n\n/**\n * Progress through a multi-step flow (onboarding, checkout, workflow setup).\n * Horizontal stepper collapses to \"Step 2 of 4 · Connect apps\" on mobile.\n */\nexport function Stepper({ steps, current, orientation = 'horizontal', variant = 'default', labels = {}, className, ...rest }: StepperProps) {\n const { completed = 'Completed', current: currentLabel = 'Current step', stepOf = 'Step {n} of {count}' } = labels;\n const vertical = orientation === 'vertical';\n const position = stepOf.replace('{n}', String(current + 1)).replace('{count}', String(steps.length));\n if (variant !== 'default') {\n return (\n <div className={cx('grid gap-2 font-sans', className)}>\n <p className=\"m-0 flex flex-wrap items-center gap-x-2 text-sm\">\n <span className=\"text-fg-muted\">{position}</span>\n <span aria-hidden=\"true\" className=\"text-fg-muted\">\n ·\n </span>\n <span className=\"font-semibold text-fg\">{steps[current]?.label}</span>\n </p>\n {variant === 'counter' ? (\n <span aria-hidden=\"true\" className=\"h-1.5 overflow-hidden rounded-full bg-surface-muted\">\n <span className=\"block h-full rounded-full bg-primary\" style={{ width: `${((current + 1) / steps.length) * 100}%` }} />\n </span>\n ) : (\n <StepDots\n steps={steps.map((s, i) => ({\n label: typeof s.label === 'string' ? s.label : `${i + 1}`,\n state: i < current ? 'done' : i === current ? 'current' : 'upcoming',\n }))}\n />\n )}\n </div>\n );\n }\n return (\n <div className={cx('font-sans', className)}>\n {!vertical && (\n <p className=\"m-0 mb-2 text-sm sm:hidden\">\n <span className=\"text-fg-muted\">\n {stepOf.replace('{n}', String(current + 1)).replace('{count}', String(steps.length))} ·{' '}\n </span>\n <span className=\"font-semibold\">{steps[current]?.label}</span>\n </p>\n )}\n <ol className={cx('m-0 list-none p-0', vertical ? 'grid gap-0' : 'hidden gap-2 sm:flex')} {...rest}>\n {steps.map((step, i) => {\n const state = i < current ? 'complete' : i === current ? 'current' : 'upcoming';\n return (\n <li\n key={i}\n aria-current={state === 'current' ? 'step' : undefined}\n className={cx('relative flex gap-3', vertical ? 'pb-6 last:pb-0' : 'min-w-0 flex-1 items-center')}\n >\n <span\n className={cx(\n 'relative z-10 grid size-8 shrink-0 place-items-center rounded-full text-sm font-bold tabular-nums',\n state === 'complete' && 'bg-primary text-on-primary',\n state === 'current' && 'bg-surface text-link ring-2 ring-primary ring-inset',\n state === 'upcoming' && 'bg-surface-muted text-fg-muted',\n )}\n >\n {state === 'complete' ? <Glyph name=\"check\" size={16} /> : i + 1}\n </span>\n <span className={cx('min-w-0', !vertical && 'truncate')}>\n <span\n className={cx(\n 'block text-sm',\n state === 'upcoming' ? 'text-fg-muted' : 'font-semibold text-fg',\n !vertical && 'truncate',\n )}\n >\n {step.label}\n {state === 'complete' && <span className=\"sr-only\"> ({completed})</span>}\n {state === 'current' && <span className=\"sr-only\"> ({currentLabel})</span>}\n </span>\n {step.description && vertical && (\n <span className=\"mt-0.5 block text-sm text-fg-muted\">{step.description}</span>\n )}\n </span>\n {i < steps.length - 1 &&\n (vertical ? (\n <span\n aria-hidden=\"true\"\n className={cx(\n 'absolute top-9 bottom-1 left-[15px] w-0.5 rounded-full',\n state === 'complete' ? 'bg-primary' : 'bg-border',\n )}\n />\n ) : (\n <span\n aria-hidden=\"true\"\n className={cx(\n 'h-0.5 min-w-4 flex-1 rounded-full',\n state === 'complete' ? 'bg-primary' : 'bg-border',\n )}\n />\n ))}\n </li>\n );\n })}\n </ol>\n </div>\n );\n}\n"],"mappings":";;;;;AA2BA,SAAgBA,EAAQ,EAAE,UAAO,YAAS,iBAAc,cAAc,aAAU,WAAW,YAAS,CAAC,GAAG,cAAW,GAAGC,KAAsB;CAC1I,IAAM,EAAE,eAAY,aAAa,SAASC,IAAe,gBAAgB,YAAS,0BAA0BC,GACtGC,IAAWC,MAAgB,YAC3BC,IAAWC,EAAO,QAAQ,OAAO,OAAOC,IAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,WAAW,OAAOC,EAAM,MAAM,CAAC;CA0BnG,OAzBIC,MAAY,YA0Bd,kBAAC,OAAD;EAAK,WAAWC,EAAG,aAAaC,CAAS;EAAzC,UAAA,CACG,CAACR,KACA,kBAAC,KAAD;GAAG,WAAU;GAAb,UAAA,CACE,kBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KACGG,EAAO,QAAQ,OAAO,OAAOC,IAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,WAAW,OAAOC,EAAM,MAAM,CAAC;KAAE;KAAG;IACpF;GACN,CAAA,GAAA,kBAAC,QAAD;IAAM,WAAU;IAAiB,UAAAA,EAAMD,EAAQ,EAAE;GAAY,CAAA,CAC5D;EAEL,CAAA,GAAA,kBAAC,MAAD;GAAI,WAAWG,EAAG,qBAAqBP,IAAW,eAAe,sBAAsB;GAAG,GAAIH;GAC3F,UAAAQ,EAAM,KAAK,GAAM,MAAM;IACtB,IAAMI,IAAQC,IAAIN,IAAU,aAAaM,MAAMN,IAAU,YAAY;IACrE,OACE,kBAAC,MAAD;KAEE,gBAAcK,MAAU,YAAY,SAAS,KAAA;KAC7C,WAAWF,EAAG,uBAAuBP,IAAW,mBAAmB,6BAA6B;KAHlG,UAAA;MAKE,kBAAC,QAAD;OACE,WAAWO,EACT,qGACAE,MAAU,cAAc,8BACxBA,MAAU,aAAa,uDACvBA,MAAU,cAAc,gCAC1B;OAEC,UAAAA,MAAU,aAAa,kBAACE,GAAD;QAAO,MAAK;QAAQ,MAAM;OAAK,CAAA,IAAID,IAAI;MAC3D,CAAA;MACN,kBAAC,QAAD;OAAM,WAAWH,EAAG,WAAW,CAACP,KAAY,UAAU;OAAtD,UAAA,CACE,kBAAC,QAAD;QACE,WAAWO,EACT,iBACAE,MAAU,aAAa,kBAAkB,yBACzC,CAACT,KAAY,UACf;QALF,UAAA;SAOGY,EAAK;SACLH,MAAU,cAAc,kBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA;WAA0B;WAAGI;WAAU;UAAO;;SACtEJ,MAAU,aAAa,kBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA;WAA0B;WAAGX;WAAa;UAAO;;QACrE;OACL,CAAA,GAAAc,EAAK,eAAeZ,KACnB,kBAAC,QAAD;QAAM,WAAU;QAAsC,UAAAY,EAAK;OAAkB,CAAA,CAE3E;;MACLF,IAAIL,EAAM,SAAS,MACjBL,IACC,kBAAC,QAAD;OACE,eAAY;OACZ,WAAWO,EACT,0DACAE,MAAU,aAAa,eAAe,WACxC;MACD,CAAA,IAED,kBAAC,QAAD;OACE,eAAY;OACZ,WAAWF,EACT,qCACAE,MAAU,aAAa,eAAe,WACxC;MACD,CAAA;KAEH;IAhDG,GAAAC,CAgDH;GAER,CAAC;EACC,CAAA,CACD;C,KA1FH,kBAAC,OAAD;EAAK,WAAWH,EAAG,wBAAwBC,CAAS;EAApD,UAAA,CACE,kBAAC,KAAD;GAAG,WAAU;GAAb,UAAA;IACE,kBAAC,QAAD;KAAM,WAAU;KAAiB,UAAAN;IAAe,CAAA;IAChD,kBAAC,QAAD;KAAM,eAAY;KAAO,WAAU;KAAgB,UAAA;IAE7C,CAAA;IACN,kBAAC,QAAD;KAAM,WAAU;KAAyB,UAAAG,EAAMD,EAAQ,EAAE;IAAY,CAAA;GACpE;EACF,CAAA,GAAAE,MAAY,YACX,kBAAC,QAAD;GAAM,eAAY;GAAO,WAAU;GACjC,UAAA,kBAAC,QAAD;IAAM,WAAU;IAAuC,OAAO,EAAE,OAAO,IAAKF,IAAU,KAAKC,EAAM,SAAU,IAAI,GAAG;GAAI,CAAA;EAClH,CAAA,IAEN,kBAACS,GAAD,EACE,OAAOT,EAAM,KAAK,GAAG,OAAO;GAC1B,OAAO,OAAOU,EAAE,SAAU,WAAWA,EAAE,QAAQ,GAAGL,IAAI;GACtD,OAAOA,IAAIN,IAAU,SAASM,MAAMN,IAAU,YAAY;EAC5D,EAAE,EACH,CAAA,CAEA;;AAwEX"}
@@ -0,0 +1,31 @@
1
+ import * as RadixTabs from '@radix-ui/react-tabs';
2
+ import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
3
+ import { type IconName } from '../icon/icon';
4
+ /**
5
+ * - `underline`: sections inside the content.
6
+ * - `pill`: soft switch on a light surface.
7
+ * - `segmented`: page-level views and period presets; the active option is filled with the brand color.
8
+ * - `segmented-inverse`: the same inside a brand band (`PageHeader`), with a white active option.
9
+ */
10
+ export type TabsVariant = 'underline' | 'pill' | 'segmented' | 'segmented-inverse';
11
+ export interface TabsProps extends ComponentPropsWithoutRef<typeof RadixTabs.Root> {
12
+ variant?: TabsVariant;
13
+ }
14
+ /**
15
+ * Switches between views of the same context. Arrow keys move between tabs (Radix Tabs).
16
+ * On narrow screens the list scrolls horizontally; for 6+ tabs on mobile consider a Select.
17
+ */
18
+ export declare function Tabs({ variant, className, ...rest }: TabsProps): import("react").JSX.Element;
19
+ export interface TabsListProps extends ComponentPropsWithoutRef<typeof RadixTabs.List> {
20
+ /** Stretch tabs to fill the width (good for 2–3 tabs on mobile). */
21
+ fullWidth?: boolean;
22
+ }
23
+ export declare function TabsList({ fullWidth, className, ...rest }: TabsListProps): import("react").JSX.Element;
24
+ export interface TabsTriggerProps extends ComponentPropsWithoutRef<typeof RadixTabs.Trigger> {
25
+ icon?: IconName;
26
+ /** Count shown after the label (e.g. unread items). */
27
+ count?: number;
28
+ children: ReactNode;
29
+ }
30
+ export declare function TabsTrigger({ icon, count, className, children, ...rest }: TabsTriggerProps): import("react").JSX.Element;
31
+ export declare function TabsContent({ className, ...rest }: ComponentPropsWithoutRef<typeof RadixTabs.Content>): import("react").JSX.Element;
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ import { cx as e } from "../lib/cx.js";
3
+ import { Icon as t } from "../icon/icon.js";
4
+ import { SEGMENTED_ITEM as n, SEGMENTED_TRACK as r } from "../lib/segmented-styles.js";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import { createContext as o, useContext as s } from "react";
7
+ import * as c from "@radix-ui/react-tabs";
8
+ //#region src/tabs/tabs.tsx
9
+ var l = {
10
+ underline: "gap-1",
11
+ pill: "gap-1 rounded-full bg-surface-muted p-1",
12
+ segmented: r.default,
13
+ "segmented-inverse": r.inverse
14
+ }, u = "text-fg-muted hover:text-fg focus-visible:outline-focus", d = {
15
+ underline: u + " relative h-11 px-3 after:absolute after:inset-x-2 after:-bottom-px after:h-0.5 after:rounded-full after:bg-transparent data-[state=active]:text-fg data-[state=active]:after:bg-primary",
16
+ pill: u + " h-9 rounded-full px-4 data-[state=active]:bg-surface data-[state=active]:text-fg data-[state=active]:shadow-[0_1px_3px_rgb(0_0_0/0.12)]",
17
+ segmented: "h-8 rounded-xs px-3 " + n.default,
18
+ "segmented-inverse": "h-8 rounded-xs px-3 " + n.inverse
19
+ }, f = o("underline");
20
+ function p({ variant: t = "underline", className: n, ...r }) {
21
+ return /* @__PURE__ */ i(f.Provider, {
22
+ value: t,
23
+ children: /* @__PURE__ */ i(c.Root, {
24
+ className: e("font-sans", n),
25
+ ...r
26
+ })
27
+ });
28
+ }
29
+ function m({ fullWidth: t, className: n, ...r }) {
30
+ let a = s(f);
31
+ return /* @__PURE__ */ i("div", {
32
+ className: e("relative max-w-full overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", a === "underline" && "border-b border-border", a.startsWith("segmented") && "w-fit"),
33
+ children: /* @__PURE__ */ i(c.List, {
34
+ className: e("flex w-max", !a.startsWith("segmented") && "min-w-full", l[a], t && "*:flex-1", n),
35
+ ...r
36
+ })
37
+ });
38
+ }
39
+ function h({ icon: n, count: r, className: o, children: l, ...u }) {
40
+ let p = s(f);
41
+ return /* @__PURE__ */ a(c.Trigger, {
42
+ className: e("group inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 border-0 bg-transparent font-sans text-sm font-semibold whitespace-nowrap", "transition-colors duration-150 disabled:pointer-events-none disabled:opacity-45", "focus-visible:outline-3 focus-visible:-outline-offset-3", d[p], o),
43
+ ...u,
44
+ children: [
45
+ n && /* @__PURE__ */ i(t, {
46
+ name: n,
47
+ size: 20
48
+ }),
49
+ l,
50
+ r !== void 0 && /* @__PURE__ */ i("span", {
51
+ className: "min-w-5 rounded-full bg-surface-muted px-1.5 py-0.5 text-center text-xs leading-none tabular-nums group-data-[state=active]:bg-primary group-data-[state=active]:text-on-primary",
52
+ children: r
53
+ })
54
+ ]
55
+ });
56
+ }
57
+ function g({ className: t, ...n }) {
58
+ return /* @__PURE__ */ i(c.Content, {
59
+ className: e("pt-5 focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-focus", t),
60
+ ...n
61
+ });
62
+ }
63
+ //#endregion
64
+ export { p as Tabs, g as TabsContent, m as TabsList, h as TabsTrigger };
65
+
66
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","names":["RadixTabs","LIST","SEGMENTED_TRACK","BASE_COLOR","TRIGGER","SEGMENTED_ITEM","VariantContext","createContext","Tabs","rest","variant","cx","className","TabsList","useContext","fullWidth","TabsTrigger","icon","Icon","children","count","TabsContent"],"sources":["../../src/tabs/tabs.tsx"],"sourcesContent":["'use client';\n\nimport * as RadixTabs from '@radix-ui/react-tabs';\nimport { createContext, useContext, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SEGMENTED_ITEM, SEGMENTED_TRACK } from '../lib/segmented-styles';\nimport { Icon, type IconName } from '../icon/icon';\n\n/**\n * - `underline`: sections inside the content.\n * - `pill`: soft switch on a light surface.\n * - `segmented`: page-level views and period presets; the active option is filled with the brand color.\n * - `segmented-inverse`: the same inside a brand band (`PageHeader`), with a white active option.\n */\nexport type TabsVariant = 'underline' | 'pill' | 'segmented' | 'segmented-inverse';\n\nconst LIST: Record<TabsVariant, string> = {\n underline: 'gap-1',\n pill: 'gap-1 rounded-full bg-surface-muted p-1',\n segmented: SEGMENTED_TRACK.default,\n 'segmented-inverse': SEGMENTED_TRACK.inverse,\n};\n\n// Colors live per variant: `cx` joins classes without merging, so two text colors must never meet.\nconst BASE_COLOR = 'text-fg-muted hover:text-fg focus-visible:outline-focus';\nconst TRIGGER: Record<TabsVariant, string> = {\n underline:\n BASE_COLOR +\n ' relative h-11 px-3 after:absolute after:inset-x-2 after:-bottom-px after:h-0.5 after:rounded-full after:bg-transparent data-[state=active]:text-fg data-[state=active]:after:bg-primary',\n pill:\n BASE_COLOR +\n ' h-9 rounded-full px-4 data-[state=active]:bg-surface data-[state=active]:text-fg data-[state=active]:shadow-[0_1px_3px_rgb(0_0_0/0.12)]',\n segmented: 'h-8 rounded-xs px-3 ' + SEGMENTED_ITEM.default,\n 'segmented-inverse': 'h-8 rounded-xs px-3 ' + SEGMENTED_ITEM.inverse,\n};\n\nconst VariantContext = createContext<TabsVariant>('underline');\n\nexport interface TabsProps extends ComponentPropsWithoutRef<typeof RadixTabs.Root> {\n variant?: TabsVariant;\n}\n\n/**\n * Switches between views of the same context. Arrow keys move between tabs (Radix Tabs).\n * On narrow screens the list scrolls horizontally; for 6+ tabs on mobile consider a Select.\n */\nexport function Tabs({ variant = 'underline', className, ...rest }: TabsProps) {\n return (\n <VariantContext.Provider value={variant}>\n <RadixTabs.Root className={cx('font-sans', className)} {...rest} />\n </VariantContext.Provider>\n );\n}\n\nexport interface TabsListProps extends ComponentPropsWithoutRef<typeof RadixTabs.List> {\n /** Stretch tabs to fill the width (good for 2–3 tabs on mobile). */\n fullWidth?: boolean;\n}\n\nexport function TabsList({ fullWidth, className, ...rest }: TabsListProps) {\n const variant = useContext(VariantContext);\n return (\n <div\n className={cx(\n 'relative max-w-full overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden',\n variant === 'underline' && 'border-b border-border',\n variant.startsWith('segmented') && 'w-fit',\n )}\n >\n <RadixTabs.List\n className={cx(\n 'flex w-max',\n !variant.startsWith('segmented') && 'min-w-full',\n LIST[variant],\n fullWidth && '*:flex-1',\n className,\n )}\n {...rest}\n />\n </div>\n );\n}\n\nexport interface TabsTriggerProps extends ComponentPropsWithoutRef<typeof RadixTabs.Trigger> {\n icon?: IconName;\n /** Count shown after the label (e.g. unread items). */\n count?: number;\n children: ReactNode;\n}\n\nexport function TabsTrigger({ icon, count, className, children, ...rest }: TabsTriggerProps) {\n const variant = useContext(VariantContext);\n return (\n <RadixTabs.Trigger\n className={cx(\n 'group inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 border-0 bg-transparent font-sans text-sm font-semibold whitespace-nowrap',\n 'transition-colors duration-150 disabled:pointer-events-none disabled:opacity-45',\n 'focus-visible:outline-3 focus-visible:-outline-offset-3',\n TRIGGER[variant],\n className,\n )}\n {...rest}\n >\n {icon && <Icon name={icon} size={20} />}\n {children}\n {count !== undefined && (\n <span className=\"min-w-5 rounded-full bg-surface-muted px-1.5 py-0.5 text-center text-xs leading-none tabular-nums group-data-[state=active]:bg-primary group-data-[state=active]:text-on-primary\">\n {count}\n </span>\n )}\n </RadixTabs.Trigger>\n );\n}\n\nexport function TabsContent({ className, ...rest }: ComponentPropsWithoutRef<typeof RadixTabs.Content>) {\n return (\n <RadixTabs.Content\n className={cx(\n 'pt-5 focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-focus',\n className,\n )}\n {...rest}\n />\n );\n}\n"],"mappings":";;;;;;;;AAgBA,IAAMC,IAAoC;CACxC,WAAW;CACX,MAAM;CACN,WAAWC,EAAgB;CAC3B,qBAAqBA,EAAgB;AACvC,GAGMC,IAAa,2DACbC,IAAuC;CAC3C,WACED,IACA;CACF,MACEA,IACA;CACF,WAAW,yBAAyBE,EAAe;CACnD,qBAAqB,yBAAyBA,EAAe;AAC/D,GAEMC,IAAiBC,EAA2B,WAAW;AAU7D,SAAgBC,EAAK,EAAE,aAAU,aAAa,cAAW,GAAGC,KAAmB;CAC7E,OACE,kBAACH,EAAe,UAAhB;EAAyB,OAAOI;EAC9B,UAAA,kBAACV,EAAU,MAAX;GAAgB,WAAWW,EAAG,aAAaC,CAAS;GAAG,GAAIH;EAAO,CAAA;CAC3C,CAAA;AAE7B;AAOA,SAAgBI,EAAS,EAAE,cAAW,cAAW,GAAGJ,KAAuB;CACzE,IAAMC,IAAUI,EAAWR,CAAc;CACzC,OACE,kBAAC,OAAD;EACE,WAAWK,EACT,4FACAD,MAAY,eAAe,0BAC3BA,EAAQ,WAAW,WAAW,KAAK,OACrC;EAEA,UAAA,kBAACV,EAAU,MAAX;GACE,WAAWW,EACT,cACA,CAACD,EAAQ,WAAW,WAAW,KAAK,cACpCT,EAAKS,IACLK,KAAa,YACbH,CACF;GACA,GAAIH;EACL,CAAA;CACE,CAAA;AAET;AASA,SAAgBO,EAAY,EAAE,SAAM,UAAO,cAAW,aAAU,GAAGP,KAA0B;CAC3F,IAAMC,IAAUI,EAAWR,CAAc;CACzC,OACE,kBAACN,EAAU,SAAX;EACE,WAAWW,EACT,yJACA,mFACA,2DACAP,EAAQM,IACRE,CACF;EACA,GAAIH;EARN,UAAA;GAUGQ,KAAQ,kBAACC,GAAD;IAAM,MAAMD;IAAM,MAAM;GAAK,CAAA;GACrCE;GACAC,MAAU,KAAA,KACT,kBAAC,QAAD;IAAM,WAAU;IACb,UAAAA;GACG,CAAA;EAES;;AAEvB;AAEA,SAAgBC,EAAY,EAAE,cAAW,GAAGZ,KAA4D;CACtG,OACE,kBAACT,EAAU,SAAX;EACE,WAAWW,EACT,2FACAC,CACF;EACA,GAAIH;CACL,CAAA;AAEL"}
@@ -0,0 +1,126 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface AppLayoutProps {
3
+ /** `ProductLogo` in a link to the dashboard home. */
4
+ logo: ReactNode;
5
+ /** The user's role ("Administrator"), shown as a badge in the top bar from 640px. */
6
+ role?: ReactNode;
7
+ /** Notifications button (`NotificationCenter`). */
8
+ notifications?: ReactNode;
9
+ /** `AccountMenu`. */
10
+ account: ReactNode;
11
+ /** `WorkspaceSwitcher` above the navigation. */
12
+ workspace?: ReactNode;
13
+ /** `SideNav`. Omit for pages without a sidebar (account settings). */
14
+ nav?: ReactNode;
15
+ /** `AppFooter`. */
16
+ footer?: ReactNode;
17
+ /** `FloatingActions` (the assistant button). */
18
+ floating?: ReactNode;
19
+ children: ReactNode;
20
+ className?: string;
21
+ }
22
+ /**
23
+ * The one dashboard layout for every product: top bar (logo, role, notifications, account), sidebar (workspace +
24
+ * navigation), content and a slim footer, plus the floating assistant. Built on `AppShell layout="topbar"`.
25
+ */
26
+ export declare function AppLayout({ logo, role, notifications, account, workspace, nav, footer, floating, children, className, }: AppLayoutProps): import("react").JSX.Element;
27
+ export interface DashboardPageProps {
28
+ /**
29
+ * `PageHeader`. With page tabs, render the header (with its `TabsList`) above and this page inside the active
30
+ * `TabsContent`, without `header`, so each tab controls a real panel.
31
+ */
32
+ header?: ReactNode;
33
+ /** A row of `MetricCard`s. */
34
+ metrics?: ReactNode;
35
+ /** The wide column (2/3): charts and lists. */
36
+ main?: ReactNode;
37
+ /** The narrow column (1/3): tasks, activity. */
38
+ aside?: ReactNode;
39
+ /** Full-width content below the columns. */
40
+ children?: ReactNode;
41
+ className?: string;
42
+ }
43
+ /** Overview: header, a row of metrics, then a 2/3 + 1/3 grid of cards and full-width content. */
44
+ export declare function DashboardPage({ header, metrics, main, aside, children, className }: DashboardPageProps): import("react").JSX.Element;
45
+ export interface ListPageProps {
46
+ header?: ReactNode;
47
+ /** Underline `Tabs` or a `SectionHeader` above the table. */
48
+ toolbar?: ReactNode;
49
+ /** The `DataTable`. */
50
+ children: ReactNode;
51
+ className?: string;
52
+ }
53
+ /** A list of records: header, optional section header or tabs, the table. */
54
+ export declare function ListPage({ header, toolbar, children, className }: ListPageProps): import("react").JSX.Element;
55
+ export interface ReportPageProps {
56
+ header?: ReactNode;
57
+ /** `FilterBar`. */
58
+ filters?: ReactNode;
59
+ metrics?: ReactNode;
60
+ /** Charts, two per row from 1024px. */
61
+ children: ReactNode;
62
+ className?: string;
63
+ }
64
+ /** Reports: header, filters, a row of metrics and charts in a two-column grid. */
65
+ export declare function ReportPage({ header, filters, metrics, children, className }: ReportPageProps): import("react").JSX.Element;
66
+ export interface CalendarPageProps {
67
+ /** `PageHeader` (with tabs when the calendar is one view of a module). */
68
+ header?: ReactNode;
69
+ /** `EventCalendar`, with its side panel in `aside`. */
70
+ calendar: ReactNode;
71
+ /** Summary under the calendar: a heading row with period presets (`SectionHeader` + `SegmentedControl`). */
72
+ summaryHeader?: ReactNode;
73
+ /** Summary cards (`StatGrid`, `RankedList`, charts), two per row from 1024px. */
74
+ summary?: ReactNode;
75
+ className?: string;
76
+ }
77
+ /** Calendar (ADR-0016): header, the calendar with its side panel, and a full-width summary below. */
78
+ export declare function CalendarPage({ header, calendar, summaryHeader, summary, className }: CalendarPageProps): import("react").JSX.Element;
79
+ export interface SettingsPageProps {
80
+ header?: ReactNode;
81
+ /** Secondary navigation (`SideNav appearance="solid"`), `--kf-subnav-width` wide. */
82
+ nav: ReactNode;
83
+ /** Sub-tabs above the form column (Kudibot's third navigation level). */
84
+ tabs?: ReactNode;
85
+ /** Cards with `SettingsRow` / `FormField`, in a column limited to the form width. */
86
+ children: ReactNode;
87
+ className?: string;
88
+ }
89
+ /** Settings: header, a secondary navigation and a form column of cards. Below 768px the navigation comes first. */
90
+ export declare function SettingsPage({ header, nav, tabs, children, className }: SettingsPageProps): import("react").JSX.Element;
91
+ export interface MasterDetailPageProps {
92
+ header?: ReactNode;
93
+ /** `MasterDetail`. */
94
+ children: ReactNode;
95
+ className?: string;
96
+ }
97
+ /** Configuration of grouped records (clients and projects): header and a `MasterDetail`. */
98
+ export declare function MasterDetailPage({ header, children, className }: MasterDetailPageProps): import("react").JSX.Element;
99
+ export interface ProfilePageProps {
100
+ /** A back link ("‹ People"). */
101
+ back?: ReactNode;
102
+ /** `ProfileHeader` (or `EntityHeader` for companies). */
103
+ profile: ReactNode;
104
+ /** Underline `Tabs` for the profile's sections. */
105
+ tabs?: ReactNode;
106
+ children: ReactNode;
107
+ /** A side column (about me, contact, teams) from 1024px. */
108
+ aside?: ReactNode;
109
+ className?: string;
110
+ }
111
+ /** A person's or a company's page: back link, profile header, tabs, then cards with an optional side column. */
112
+ export declare function ProfilePage({ back, profile, tabs, children, aside, className }: ProfilePageProps): import("react").JSX.Element;
113
+ export interface AccountPageProps {
114
+ /** `PageHeader` with the user's avatar as `media`. */
115
+ header: ReactNode;
116
+ /** Forms (profile, password, notifications). */
117
+ children: ReactNode;
118
+ /** A side list (organizations, devices). */
119
+ aside?: ReactNode;
120
+ className?: string;
121
+ }
122
+ /**
123
+ * The user's account across organizations: a narrow container with forms and a side list. Use it inside
124
+ * `AppLayout` without `nav` (top bar only).
125
+ */
126
+ export declare function AccountPage({ header, children, aside, className }: AccountPageProps): import("react").JSX.Element;