@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,159 @@
1
+ import type { ElementType, HTMLAttributes, ReactNode } from 'react';
2
+ import { type IconTileTone } from '../icon/icon-tile';
3
+ import { type IconName } from '../icon/icon';
4
+ export interface CardProps extends HTMLAttributes<HTMLElement> {
5
+ as?: ElementType;
6
+ /** `outline` (default), `raised` (shadow), `muted` (filled), `brand` (gradient, white text), `danger` (danger zone). */
7
+ variant?: 'outline' | 'raised' | 'muted' | 'brand' | 'danger';
8
+ padding?: 'none' | 'sm' | 'md' | 'lg';
9
+ /** Makes the whole card a link target: pass `href` to the title's link and set `interactive`. */
10
+ interactive?: boolean;
11
+ /** A colored top border, e.g. a client's category color: `var(--kf-category-2)`. */
12
+ accent?: string;
13
+ /** Selected in a list of cards: a brand bar on the left and a tinted border. */
14
+ selected?: boolean;
15
+ }
16
+ /**
17
+ * Base surface. With `interactive`, the first link inside stretches over the card (one tab stop,
18
+ * whole card clickable) and the card lifts on hover.
19
+ */
20
+ export declare function Card({ as: Tag, variant, padding, interactive, accent, selected, className, style, ...rest }: CardProps): import("react").JSX.Element;
21
+ export type CardHeaderMarker = 'none' | 'bar' | 'dot';
22
+ export interface CardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
23
+ title: ReactNode;
24
+ description?: ReactNode;
25
+ /** `band` (default, dashboards): tinted background and a divider. `plain`: no background. */
26
+ appearance?: 'band' | 'plain';
27
+ /** Accent mark before the title (default `bar`). */
28
+ marker?: CardHeaderMarker;
29
+ /** Icon in a small tile before the title (replaces the marker). */
30
+ icon?: IconName;
31
+ /** `danger` for danger zones: red title with a warning icon. */
32
+ tone?: 'default' | 'danger';
33
+ /** Right side: a link ("View all →"), a button or a status badge. */
34
+ action?: ReactNode;
35
+ headingLevel?: 2 | 3 | 4;
36
+ }
37
+ /**
38
+ * Header of a dashboard card (ADR-0013). Use inside `<Card padding="none">` with `CardBody` and `CardFooter`.
39
+ */
40
+ export declare function CardHeader({ title, description, appearance, marker, icon, tone, action, headingLevel, className, ...rest }: CardHeaderProps): import("react").JSX.Element;
41
+ /** Body of a card that uses `CardHeader`: the card padding token (16 → 24 px). */
42
+ export declare function CardBody({ className, ...rest }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
43
+ /** Actions at the bottom of a card (Cancel / Save), right-aligned, with a divider. */
44
+ export declare function CardFooter({ className, ...rest }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
45
+ /** Title that links the whole interactive card. */
46
+ export declare function CardLink({ href, as: Link, children, className, }: {
47
+ href: string;
48
+ as?: ElementType;
49
+ children: ReactNode;
50
+ className?: string;
51
+ }): import("react").JSX.Element;
52
+ export interface IconCardProps extends Omit<CardProps, 'title'> {
53
+ icon: IconName;
54
+ title: ReactNode;
55
+ description?: ReactNode;
56
+ href?: string;
57
+ linkAs?: ElementType;
58
+ /** `stacked` (default): icon above the text. `inline`: icon beside the text (compact lists, settings shortcuts). */
59
+ layout?: 'stacked' | 'inline';
60
+ /** `start` (default) or `center` (stacked only, e.g. a row of three benefits). */
61
+ align?: 'start' | 'center';
62
+ /** A button or link at the bottom ("Set up", "Learn more"). Not with `href` (the whole card is the link). */
63
+ action?: ReactNode;
64
+ /** The icon tile's color. */
65
+ iconTone?: Extract<IconTileTone, 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'neutral'>;
66
+ }
67
+ /** Feature / service card: icon tile, title, short text; stacked or inline, with an optional action. */
68
+ export declare function IconCard({ icon, title, description, href, linkAs, layout, align, action, iconTone, className, ...rest }: IconCardProps): import("react").JSX.Element;
69
+ export interface PersonLink {
70
+ /** Visible text ("LinkedIn"). */
71
+ label: string;
72
+ href: string;
73
+ icon?: IconName;
74
+ /** Full accessible name when several cards repeat the same label ("Alexis Saransig on LinkedIn"). */
75
+ ariaLabel?: string;
76
+ }
77
+ export interface PersonCardProps extends Omit<CardProps, 'title' | 'role'> {
78
+ name: string;
79
+ /** Job title ("CEO", "Co-founder & CTO"). */
80
+ role: ReactNode;
81
+ /** Square photo, shown round. Falls back to initials. Real people only, with their consent. */
82
+ photo?: string;
83
+ bio?: ReactNode;
84
+ links?: PersonLink[];
85
+ /** Heading level of the name; `h3` inside a titled section. */
86
+ headingAs?: 'h2' | 'h3' | 'h4';
87
+ }
88
+ /** Team member or founder: photo, name, role, short bio and profile links. Server-safe. */
89
+ export declare function PersonCard({ name, role, photo, bio, links, headingAs: Heading, ...rest }: PersonCardProps): import("react").JSX.Element;
90
+ export interface MetricCardProps extends Omit<CardProps, 'title'> {
91
+ label: ReactNode;
92
+ value: ReactNode;
93
+ /** Change vs. previous period, e.g. +12.5. Positive is good unless `invertTrend`. */
94
+ delta?: number;
95
+ deltaLabel?: ReactNode;
96
+ invertTrend?: boolean;
97
+ /** Small chart under the value (e.g. `<Sparkline />`). */
98
+ chart?: ReactNode;
99
+ icon?: IconName;
100
+ /** Colored stripe on the left, to group or tell metrics apart. Pair it with the label, never alone. */
101
+ tone?: MetricTone;
102
+ /** One line under the value ("12 still in", "of 15 members"). */
103
+ hint?: ReactNode;
104
+ }
105
+ export type MetricTone = 'none' | 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'info';
106
+ /** KPI tile for dashboards. */
107
+ export declare function MetricCard({ label, value, delta, deltaLabel, invertTrend, chart, icon, tone, hint, ...rest }: MetricCardProps): import("react").JSX.Element;
108
+ export interface ProductCardProps extends Omit<CardProps, 'title'> {
109
+ name: ReactNode;
110
+ tagline: ReactNode;
111
+ /** Status badge (e.g. `<Badge variant="live">Live</Badge>`). */
112
+ badge?: ReactNode;
113
+ icon?: IconName;
114
+ price?: ReactNode;
115
+ href: string;
116
+ linkAs?: ElementType;
117
+ }
118
+ /** Kodffe product (Yapakit, LinkedFace…). */
119
+ export declare function ProductCard({ name, tagline, badge, icon, price, href, linkAs, ...rest }: ProductCardProps): import("react").JSX.Element;
120
+ export interface PlanCardProps extends Omit<CardProps, 'title'> {
121
+ name: ReactNode;
122
+ price: ReactNode;
123
+ period?: ReactNode;
124
+ /** A line under the price ("or $100 a year", "billed monthly"). */
125
+ priceNote?: ReactNode;
126
+ description?: ReactNode;
127
+ features: ReactNode[];
128
+ cta: ReactNode;
129
+ /** Highlights the recommended plan. */
130
+ featured?: boolean;
131
+ featuredLabel?: ReactNode;
132
+ }
133
+ /** Pricing plan. Mark one plan `featured` at most. */
134
+ export declare function PlanCard({ name, price, period, priceNote, description, features, cta, featured, featuredLabel, ...rest }: PlanCardProps): import("react").JSX.Element;
135
+ export interface CaseCardProps extends Omit<CardProps, 'title'> {
136
+ client: ReactNode;
137
+ title: ReactNode;
138
+ /** Headline result, e.g. "−82% manual entry". */
139
+ result: ReactNode;
140
+ tags?: ReactNode[];
141
+ image?: string;
142
+ href: string;
143
+ linkAs?: ElementType;
144
+ }
145
+ /** Case study teaser: result first. */
146
+ export declare function CaseCard({ client, title, result, tags, image, href, linkAs, ...rest }: CaseCardProps): import("react").JSX.Element;
147
+ export interface ArticleCardProps extends Omit<CardProps, 'title'> {
148
+ title: ReactNode;
149
+ excerpt?: ReactNode;
150
+ category?: ReactNode;
151
+ date?: string;
152
+ /** e.g. "6 min read". */
153
+ readingTime?: ReactNode;
154
+ image?: string;
155
+ href: string;
156
+ linkAs?: ElementType;
157
+ }
158
+ /** Blog / resource teaser. */
159
+ export declare function ArticleCard({ title, excerpt, category, date, readingTime, image, href, linkAs, ...rest }: ArticleCardProps): import("react").JSX.Element;
@@ -0,0 +1,390 @@
1
+ import { cx as e } from "../lib/cx.js";
2
+ import { Icon as t } from "../icon/icon.js";
3
+ import { Glyph as n } from "../lib/glyphs.js";
4
+ import { IconTile as r } from "../icon/icon-tile.js";
5
+ import { CheckList as i } from "../lists/lists.js";
6
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
+ //#region src/card/card.tsx
8
+ var s = {
9
+ outline: "border border-border bg-surface",
10
+ raised: "border border-border bg-surface shadow-raised",
11
+ muted: "bg-surface-muted",
12
+ brand: "bg-gradient-brand text-on-primary",
13
+ danger: "border border-danger-border bg-surface"
14
+ }, c = {
15
+ none: "",
16
+ sm: "p-4",
17
+ md: "p-6",
18
+ lg: "p-8"
19
+ };
20
+ function l({ as: t = "div", variant: n = "outline", padding: r = "md", interactive: i, accent: o, selected: l, className: u, style: d, ...f }) {
21
+ return /* @__PURE__ */ a(t, {
22
+ ...n === "brand" ? { "data-theme": "dark" } : {},
23
+ className: e("relative rounded-lg font-sans text-fg", s[n], c[r], i && "transition-[transform,box-shadow,border-color] duration-200 ease-standard hover:-translate-y-0.5 hover:border-fg-muted/40 hover:shadow-raised motion-reduce:transition-none motion-reduce:hover:translate-y-0 has-[a:focus-visible]:outline-3 has-[a:focus-visible]:outline-offset-2 has-[a:focus-visible]:outline-focus", o && "overflow-hidden before:absolute before:inset-x-0 before:top-0 before:h-1 before:bg-(--kf-card-accent)", l && "overflow-hidden ring-2 ring-primary after:absolute after:inset-y-0 after:left-0 after:w-1 after:bg-primary", u),
24
+ style: o ? {
25
+ "--kf-card-accent": o,
26
+ ...d
27
+ } : d,
28
+ ...l === void 0 ? {} : { "aria-current": l ? "true" : void 0 },
29
+ ...f
30
+ });
31
+ }
32
+ function u({ title: n, description: r, appearance: i = "band", marker: s = "bar", icon: c, tone: l = "default", action: u, headingLevel: d = 3, className: f, ...p }) {
33
+ let m = `h${d}`, h = l === "danger";
34
+ return /* @__PURE__ */ o("div", {
35
+ className: e("flex flex-wrap items-start justify-between gap-x-4 gap-y-2 px-card py-4 first:rounded-t-[inherit]", i === "band" && !h && "border-b border-border bg-surface-muted", f),
36
+ ...p,
37
+ children: [/* @__PURE__ */ o("div", {
38
+ className: "flex min-w-0 flex-1 items-start gap-3",
39
+ children: [c && !h && /* @__PURE__ */ a("span", {
40
+ className: "grid size-10 shrink-0 place-items-center rounded-sm bg-surface text-link shadow-[inset_0_0_0_1px_var(--kf-border)]",
41
+ children: /* @__PURE__ */ a(t, {
42
+ name: c,
43
+ size: 20
44
+ })
45
+ }), /* @__PURE__ */ o("div", {
46
+ className: "grid min-w-0 gap-0.5",
47
+ children: [/* @__PURE__ */ o(m, {
48
+ className: e("m-0 flex items-center gap-2 font-sans text-base font-semibold", h ? "text-danger-fg" : "text-fg"),
49
+ children: [h ? /* @__PURE__ */ a(t, {
50
+ name: "warning",
51
+ size: 18,
52
+ className: "shrink-0 text-danger-icon"
53
+ }) : !c && s !== "none" && /* @__PURE__ */ a("span", {
54
+ "aria-hidden": "true",
55
+ className: e("shrink-0 bg-accent", s === "bar" ? "h-4 w-1 rounded-full" : "size-2 rounded-full")
56
+ }), n]
57
+ }), r && /* @__PURE__ */ a("p", {
58
+ className: "m-0 text-sm text-pretty text-fg-muted",
59
+ children: r
60
+ })]
61
+ })]
62
+ }), u && /* @__PURE__ */ a("div", {
63
+ className: "flex shrink-0 items-center gap-2 text-sm",
64
+ children: u
65
+ })]
66
+ });
67
+ }
68
+ function d({ className: t, ...n }) {
69
+ return /* @__PURE__ */ a("div", {
70
+ className: e("p-card", t),
71
+ ...n
72
+ });
73
+ }
74
+ function f({ className: t, ...n }) {
75
+ return /* @__PURE__ */ a("div", {
76
+ className: e("flex flex-wrap items-center justify-end gap-3 border-t border-border px-card py-4", t),
77
+ ...n
78
+ });
79
+ }
80
+ function p({ href: t, as: n = "a", children: r, className: i }) {
81
+ return /* @__PURE__ */ a(n, {
82
+ href: t,
83
+ "data-card-link": "",
84
+ className: e("text-inherit no-underline after:absolute after:inset-0 after:rounded-[inherit] after:content-[''] focus-visible:outline-none", i),
85
+ children: r
86
+ });
87
+ }
88
+ function m({ icon: t, title: n, description: i, href: s, linkAs: c, layout: u = "stacked", align: d = "start", action: f, iconTone: m = "primary", className: h, ...g }) {
89
+ let _ = u === "inline", v = !_ && d === "center";
90
+ return /* @__PURE__ */ o(l, {
91
+ interactive: !!s,
92
+ className: e(_ ? "flex items-start gap-4" : "grid content-start", v && "justify-items-center text-center", h),
93
+ ...g,
94
+ children: [/* @__PURE__ */ a(r, {
95
+ icon: t,
96
+ size: _ ? "md" : "lg",
97
+ tone: m,
98
+ className: _ ? void 0 : "mb-4"
99
+ }), /* @__PURE__ */ o("div", {
100
+ className: e("grid min-w-0 gap-1.5", v && "justify-items-center"),
101
+ children: [
102
+ /* @__PURE__ */ a("h3", {
103
+ className: e("m-0 font-display font-bold tracking-tight", _ ? "text-base" : "text-lg"),
104
+ children: s ? /* @__PURE__ */ a(p, {
105
+ href: s,
106
+ as: c,
107
+ children: n
108
+ }) : n
109
+ }),
110
+ i && /* @__PURE__ */ a("p", {
111
+ className: "m-0 text-[15px] text-fg-muted",
112
+ children: i
113
+ }),
114
+ f && !s && /* @__PURE__ */ a("div", {
115
+ className: "mt-2.5",
116
+ children: f
117
+ })
118
+ ]
119
+ })]
120
+ });
121
+ }
122
+ var h = (e) => e.split(/\s+/).filter(Boolean).slice(0, 2).map((e) => e[0].toUpperCase()).join("");
123
+ function g({ name: n, role: r, photo: i, bio: s, links: c = [], headingAs: u = "h3", ...d }) {
124
+ return /* @__PURE__ */ o(l, {
125
+ ...d,
126
+ className: e("grid content-start gap-4", d.className),
127
+ children: [
128
+ /* @__PURE__ */ o("div", {
129
+ className: "flex items-center gap-4",
130
+ children: [i ? /* @__PURE__ */ a("img", {
131
+ src: i,
132
+ alt: "",
133
+ width: 96,
134
+ height: 96,
135
+ loading: "lazy",
136
+ decoding: "async",
137
+ className: "size-20 shrink-0 rounded-full bg-surface-muted object-cover sm:size-24"
138
+ }) : /* @__PURE__ */ a("span", {
139
+ "aria-hidden": "true",
140
+ className: "grid size-20 shrink-0 place-items-center rounded-full bg-info-surface font-display text-2xl font-bold text-info-fg sm:size-24",
141
+ children: h(n)
142
+ }), /* @__PURE__ */ o("div", {
143
+ className: "grid gap-0.5",
144
+ children: [/* @__PURE__ */ a(u, {
145
+ className: "m-0 font-display text-xl font-bold tracking-tight",
146
+ children: n
147
+ }), /* @__PURE__ */ a("p", {
148
+ className: "m-0 text-sm font-semibold text-link",
149
+ children: r
150
+ })]
151
+ })]
152
+ }),
153
+ s && /* @__PURE__ */ a("p", {
154
+ className: "m-0 text-[15px] text-fg-muted",
155
+ children: s
156
+ }),
157
+ c.length > 0 && /* @__PURE__ */ a("ul", {
158
+ className: "m-0 flex list-none flex-wrap gap-x-4 gap-y-2 p-0",
159
+ children: c.map((e) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ o("a", {
160
+ href: e.href,
161
+ "aria-label": e.ariaLabel,
162
+ className: "inline-flex min-h-6 items-center gap-1.5 rounded-xs text-sm font-semibold text-link underline-offset-4 hover:underline focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus",
163
+ children: [e.icon && /* @__PURE__ */ a(t, {
164
+ name: e.icon,
165
+ size: 18
166
+ }), e.label]
167
+ }) }, e.href))
168
+ })
169
+ ]
170
+ });
171
+ }
172
+ var _ = {
173
+ primary: "before:bg-primary",
174
+ accent: "before:bg-accent",
175
+ success: "before:bg-success-icon",
176
+ warning: "before:bg-warning-icon",
177
+ danger: "before:bg-danger-icon",
178
+ info: "before:bg-info-icon"
179
+ };
180
+ function v({ label: r, value: i, delta: s, deltaLabel: c, invertTrend: u, chart: d, icon: f, tone: p = "none", hint: m, ...h }) {
181
+ let g = s === void 0 ? void 0 : u ? s < 0 : s > 0;
182
+ return /* @__PURE__ */ o(l, {
183
+ padding: "sm",
184
+ ...h,
185
+ className: e("grid gap-2 overflow-hidden sm:p-5", p !== "none" && e("pl-5 before:absolute before:inset-y-0 before:left-0 before:w-1 sm:pl-6", _[p]), h.className),
186
+ children: [
187
+ /* @__PURE__ */ o("div", {
188
+ className: "flex items-center justify-between gap-2 text-sm font-medium text-fg-muted",
189
+ children: [r, f && /* @__PURE__ */ a(t, {
190
+ name: f,
191
+ size: 22,
192
+ className: "text-primary"
193
+ })]
194
+ }),
195
+ /* @__PURE__ */ a("div", {
196
+ className: "font-display text-3xl font-extrabold tracking-tight tabular-nums",
197
+ children: i
198
+ }),
199
+ m && /* @__PURE__ */ a("div", {
200
+ className: "text-sm text-fg-muted",
201
+ children: m
202
+ }),
203
+ s !== void 0 && /* @__PURE__ */ o("div", {
204
+ className: "flex items-center gap-1.5 text-sm",
205
+ children: [/* @__PURE__ */ o("span", {
206
+ className: e("inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 font-semibold tabular-nums", g ? "bg-success-surface text-success-fg" : s === 0 ? "bg-surface-muted text-fg-muted" : "bg-danger-surface text-danger-fg"),
207
+ children: [
208
+ /* @__PURE__ */ a(n, {
209
+ name: s >= 0 ? "arrow-up" : "arrow-down",
210
+ size: 12
211
+ }),
212
+ Math.abs(s),
213
+ "%"
214
+ ]
215
+ }), c && /* @__PURE__ */ a("span", {
216
+ className: "text-fg-muted",
217
+ children: c
218
+ })]
219
+ }),
220
+ d
221
+ ]
222
+ });
223
+ }
224
+ function y({ name: n, tagline: r, badge: i, icon: s = "store", price: c, href: u, linkAs: d, ...f }) {
225
+ return /* @__PURE__ */ o(l, {
226
+ interactive: !0,
227
+ ...f,
228
+ className: e("flex flex-col gap-4", f.className),
229
+ children: [
230
+ /* @__PURE__ */ o("div", {
231
+ className: "flex items-start justify-between gap-3",
232
+ children: [/* @__PURE__ */ a("span", {
233
+ className: "grid size-12 place-items-center rounded-md bg-gradient-brand text-on-primary",
234
+ children: /* @__PURE__ */ a(t, {
235
+ name: s,
236
+ size: 28
237
+ })
238
+ }), i]
239
+ }),
240
+ /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h3", {
241
+ className: "m-0 font-display text-xl font-bold tracking-tight",
242
+ children: /* @__PURE__ */ a(p, {
243
+ href: u,
244
+ as: d,
245
+ children: n
246
+ })
247
+ }), /* @__PURE__ */ a("p", {
248
+ className: "m-0 mt-1 text-[15px] text-fg-muted",
249
+ children: r
250
+ })] }),
251
+ c && /* @__PURE__ */ a("p", {
252
+ className: "m-0 mt-auto text-sm font-semibold text-fg",
253
+ children: c
254
+ })
255
+ ]
256
+ });
257
+ }
258
+ function b({ name: t, price: n, period: r, priceNote: s, description: c, features: u, cta: d, featured: f, featuredLabel: p = "Most popular", ...m }) {
259
+ return /* @__PURE__ */ o(l, {
260
+ variant: f ? "raised" : "outline",
261
+ padding: "lg",
262
+ ...m,
263
+ className: e("flex flex-col gap-5", f && "border-2 border-primary", m.className),
264
+ children: [
265
+ f && /* @__PURE__ */ a("span", {
266
+ className: "absolute -top-3 left-8 rounded-full bg-primary px-3 py-1 text-xs font-bold text-on-primary",
267
+ children: p
268
+ }),
269
+ /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h3", {
270
+ className: "m-0 font-display text-lg font-bold",
271
+ children: t
272
+ }), c && /* @__PURE__ */ a("p", {
273
+ className: "m-0 mt-1 text-sm text-fg-muted",
274
+ children: c
275
+ })] }),
276
+ /* @__PURE__ */ o("p", {
277
+ className: "m-0 flex items-baseline gap-1",
278
+ children: [/* @__PURE__ */ a("span", {
279
+ className: "font-display text-4xl font-extrabold tracking-tight tabular-nums",
280
+ children: n
281
+ }), r && /* @__PURE__ */ a("span", {
282
+ className: "text-sm text-fg-muted",
283
+ children: r
284
+ })]
285
+ }),
286
+ s && /* @__PURE__ */ a("p", {
287
+ className: "m-0 -mt-3 text-sm text-fg-muted",
288
+ children: s
289
+ }),
290
+ /* @__PURE__ */ a(i, {
291
+ items: u,
292
+ marker: "plain"
293
+ }),
294
+ /* @__PURE__ */ a("div", {
295
+ className: "mt-auto grid *:w-full",
296
+ children: d
297
+ })
298
+ ]
299
+ });
300
+ }
301
+ function x({ client: t, title: n, result: r, tags: i, image: s, href: c, linkAs: u, ...d }) {
302
+ return /* @__PURE__ */ o(l, {
303
+ interactive: !0,
304
+ padding: "none",
305
+ ...d,
306
+ className: e("flex flex-col overflow-hidden", d.className),
307
+ children: [s && /* @__PURE__ */ a("img", {
308
+ src: s,
309
+ alt: "",
310
+ className: "aspect-[16/9] w-full object-cover"
311
+ }), /* @__PURE__ */ o("div", {
312
+ className: "flex flex-1 flex-col gap-3 p-6",
313
+ children: [
314
+ /* @__PURE__ */ a("p", {
315
+ className: "m-0 text-xs font-semibold tracking-wide text-fg-muted uppercase",
316
+ children: t
317
+ }),
318
+ /* @__PURE__ */ a("p", {
319
+ className: "m-0 font-display text-3xl font-extrabold tracking-tight text-link",
320
+ children: r
321
+ }),
322
+ /* @__PURE__ */ a("h3", {
323
+ className: "m-0 text-[17px] leading-snug font-semibold",
324
+ children: /* @__PURE__ */ a(p, {
325
+ href: c,
326
+ as: u,
327
+ children: n
328
+ })
329
+ }),
330
+ i && /* @__PURE__ */ a("div", {
331
+ className: "mt-auto flex flex-wrap gap-1.5 pt-2",
332
+ children: i
333
+ })
334
+ ]
335
+ })]
336
+ });
337
+ }
338
+ function S({ title: t, excerpt: n, category: r, date: i, readingTime: s, image: c, href: u, linkAs: d, ...f }) {
339
+ return /* @__PURE__ */ o(l, {
340
+ as: "article",
341
+ interactive: !0,
342
+ padding: "none",
343
+ variant: "outline",
344
+ ...f,
345
+ className: e("flex flex-col overflow-hidden", f.className),
346
+ children: [c && /* @__PURE__ */ a("img", {
347
+ src: c,
348
+ alt: "",
349
+ className: "aspect-[16/9] w-full object-cover"
350
+ }), /* @__PURE__ */ o("div", {
351
+ className: "flex flex-1 flex-col gap-2 p-6",
352
+ children: [
353
+ r && /* @__PURE__ */ a("p", {
354
+ className: "m-0 text-xs font-semibold tracking-wide text-link uppercase",
355
+ children: r
356
+ }),
357
+ /* @__PURE__ */ a("h3", {
358
+ className: "m-0 font-display text-lg leading-snug font-bold tracking-tight text-balance",
359
+ children: /* @__PURE__ */ a(p, {
360
+ href: u,
361
+ as: d,
362
+ children: t
363
+ })
364
+ }),
365
+ n && /* @__PURE__ */ a("p", {
366
+ className: "m-0 line-clamp-3 text-[15px] text-fg-muted",
367
+ children: n
368
+ }),
369
+ (i || s) && /* @__PURE__ */ o("p", {
370
+ className: "m-0 mt-auto flex gap-2 pt-2 text-sm text-fg-muted",
371
+ children: [
372
+ i && /* @__PURE__ */ a("time", {
373
+ dateTime: i,
374
+ children: new Date(i).toLocaleDateString(void 0, { dateStyle: "medium" })
375
+ }),
376
+ i && s && /* @__PURE__ */ a("span", {
377
+ "aria-hidden": "true",
378
+ children: "·"
379
+ }),
380
+ s
381
+ ]
382
+ })
383
+ ]
384
+ })]
385
+ });
386
+ }
387
+ //#endregion
388
+ export { S as ArticleCard, l as Card, d as CardBody, f as CardFooter, u as CardHeader, p as CardLink, x as CaseCard, m as IconCard, v as MetricCard, g as PersonCard, b as PlanCard, y as ProductCard };
389
+
390
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","names":["VARIANTS","PADDING","Card","Tag","rest","variant","cx","padding","interactive","accent","selected","className","style","CardHeader","Heading","headingLevel","danger","tone","appearance","icon","Icon","marker","title","description","action","CardBody","CardFooter","CardLink","Link","IconCard","inline","layout","centered","align","href","IconTile","iconTone","linkAs","initials","name","p","PersonCard","photo","role","bio","links","l","TONE_STRIPE","MetricCard","good","delta","invertTrend","label","value","hint","Glyph","deltaLabel","chart","ProductCard","badge","tagline","price","PlanCard","featured","featuredLabel","period","priceNote","CheckList","features","cta","CaseCard","image","client","result","tags","ArticleCard","category","excerpt","date","readingTime"],"sources":["../../src/card/card.tsx"],"sourcesContent":["import type { ElementType, HTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { IconTile, type IconTileTone } from '../icon/icon-tile';\nimport { CheckList } from '../lists/lists';\nimport { Icon, type IconName } from '../icon/icon';\nimport { Glyph } from '../lib/glyphs';\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n as?: ElementType;\n /** `outline` (default), `raised` (shadow), `muted` (filled), `brand` (gradient, white text), `danger` (danger zone). */\n variant?: 'outline' | 'raised' | 'muted' | 'brand' | 'danger';\n padding?: 'none' | 'sm' | 'md' | 'lg';\n /** Makes the whole card a link target: pass `href` to the title's link and set `interactive`. */\n interactive?: boolean;\n /** A colored top border, e.g. a client's category color: `var(--kf-category-2)`. */\n accent?: string;\n /** Selected in a list of cards: a brand bar on the left and a tinted border. */\n selected?: boolean;\n}\n\nconst VARIANTS = {\n outline: 'border border-border bg-surface',\n raised: 'border border-border bg-surface shadow-raised',\n muted: 'bg-surface-muted',\n brand: 'bg-gradient-brand text-on-primary',\n danger: 'border border-danger-border bg-surface',\n};\nconst PADDING = { none: '', sm: 'p-4', md: 'p-6', lg: 'p-8' };\n\n/**\n * Base surface. With `interactive`, the first link inside stretches over the card (one tab stop,\n * whole card clickable) and the card lifts on hover.\n */\nexport function Card({\n as: Tag = 'div',\n variant = 'outline',\n padding = 'md',\n interactive,\n accent,\n selected,\n className,\n style,\n ...rest\n}: CardProps) {\n return (\n <Tag\n // The brand gradient is dark: switch to the dark token set so text, links and focus rings stay AA.\n {...(variant === 'brand' ? { 'data-theme': 'dark' } : {})}\n className={cx(\n 'relative rounded-lg font-sans text-fg',\n VARIANTS[variant],\n PADDING[padding],\n interactive &&\n 'transition-[transform,box-shadow,border-color] duration-200 ease-standard hover:-translate-y-0.5 hover:border-fg-muted/40 hover:shadow-raised motion-reduce:transition-none motion-reduce:hover:translate-y-0 has-[a:focus-visible]:outline-3 has-[a:focus-visible]:outline-offset-2 has-[a:focus-visible]:outline-focus',\n accent && 'overflow-hidden before:absolute before:inset-x-0 before:top-0 before:h-1 before:bg-(--kf-card-accent)',\n // A ring (not a border color) so it never conflicts with the variant's border class.\n selected && 'overflow-hidden ring-2 ring-primary after:absolute after:inset-y-0 after:left-0 after:w-1 after:bg-primary',\n className,\n )}\n style={accent ? { ['--kf-card-accent' as string]: accent, ...style } : style}\n {...(selected !== undefined ? { 'aria-current': selected ? 'true' : undefined } : {})}\n {...rest}\n />\n );\n}\n\nexport type CardHeaderMarker = 'none' | 'bar' | 'dot';\n\nexport interface CardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: ReactNode;\n description?: ReactNode;\n /** `band` (default, dashboards): tinted background and a divider. `plain`: no background. */\n appearance?: 'band' | 'plain';\n /** Accent mark before the title (default `bar`). */\n marker?: CardHeaderMarker;\n /** Icon in a small tile before the title (replaces the marker). */\n icon?: IconName;\n /** `danger` for danger zones: red title with a warning icon. */\n tone?: 'default' | 'danger';\n /** Right side: a link (\"View all →\"), a button or a status badge. */\n action?: ReactNode;\n headingLevel?: 2 | 3 | 4;\n}\n\n/**\n * Header of a dashboard card (ADR-0013). Use inside `<Card padding=\"none\">` with `CardBody` and `CardFooter`.\n */\nexport function CardHeader({\n title,\n description,\n appearance = 'band',\n marker = 'bar',\n icon,\n tone = 'default',\n action,\n headingLevel = 3,\n className,\n ...rest\n}: CardHeaderProps) {\n const Heading = `h${headingLevel}` as const;\n const danger = tone === 'danger';\n return (\n <div\n className={cx(\n 'flex flex-wrap items-start justify-between gap-x-4 gap-y-2 px-card py-4 first:rounded-t-[inherit]',\n appearance === 'band' && !danger && 'border-b border-border bg-surface-muted',\n className,\n )}\n {...rest}\n >\n <div className=\"flex min-w-0 flex-1 items-start gap-3\">\n {icon && !danger && (\n <span className=\"grid size-10 shrink-0 place-items-center rounded-sm bg-surface text-link shadow-[inset_0_0_0_1px_var(--kf-border)]\">\n <Icon name={icon} size={20} />\n </span>\n )}\n <div className=\"grid min-w-0 gap-0.5\">\n <Heading\n className={cx(\n 'm-0 flex items-center gap-2 font-sans text-base font-semibold',\n danger ? 'text-danger-fg' : 'text-fg',\n )}\n >\n {danger ? (\n <Icon name=\"warning\" size={18} className=\"shrink-0 text-danger-icon\" />\n ) : (\n !icon &&\n marker !== 'none' && (\n <span\n aria-hidden=\"true\"\n className={cx('shrink-0 bg-accent', marker === 'bar' ? 'h-4 w-1 rounded-full' : 'size-2 rounded-full')}\n />\n )\n )}\n {title}\n </Heading>\n {description && <p className=\"m-0 text-sm text-pretty text-fg-muted\">{description}</p>}\n </div>\n </div>\n {action && <div className=\"flex shrink-0 items-center gap-2 text-sm\">{action}</div>}\n </div>\n );\n}\n\n/** Body of a card that uses `CardHeader`: the card padding token (16 → 24 px). */\nexport function CardBody({ className, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cx('p-card', className)} {...rest} />;\n}\n\n/** Actions at the bottom of a card (Cancel / Save), right-aligned, with a divider. */\nexport function CardFooter({ className, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cx('flex flex-wrap items-center justify-end gap-3 border-t border-border px-card py-4', className)}\n {...rest}\n />\n );\n}\n\n/** Title that links the whole interactive card. */\nexport function CardLink({\n href,\n as: Link = 'a',\n children,\n className,\n}: {\n href: string;\n as?: ElementType;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <Link\n href={href}\n data-card-link=\"\"\n className={cx(\n \"text-inherit no-underline after:absolute after:inset-0 after:rounded-[inherit] after:content-[''] focus-visible:outline-none\",\n className,\n )}\n >\n {children}\n </Link>\n );\n}\n\n/* ---------- Specialized cards (patterns from the kodffe.com wireframes) ---------- */\n\nexport interface IconCardProps extends Omit<CardProps, 'title'> {\n icon: IconName;\n title: ReactNode;\n description?: ReactNode;\n href?: string;\n linkAs?: ElementType;\n /** `stacked` (default): icon above the text. `inline`: icon beside the text (compact lists, settings shortcuts). */\n layout?: 'stacked' | 'inline';\n /** `start` (default) or `center` (stacked only, e.g. a row of three benefits). */\n align?: 'start' | 'center';\n /** A button or link at the bottom (\"Set up\", \"Learn more\"). Not with `href` (the whole card is the link). */\n action?: ReactNode;\n /** The icon tile's color. */\n iconTone?: Extract<IconTileTone, 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'neutral'>;\n}\n\n\n/** Feature / service card: icon tile, title, short text; stacked or inline, with an optional action. */\nexport function IconCard({\n icon,\n title,\n description,\n href,\n linkAs,\n layout = 'stacked',\n align = 'start',\n action,\n iconTone = 'primary',\n className,\n ...rest\n}: IconCardProps) {\n const inline = layout === 'inline';\n const centered = !inline && align === 'center';\n return (\n <Card\n interactive={!!href}\n className={cx(inline ? 'flex items-start gap-4' : 'grid content-start', centered && 'justify-items-center text-center', className)}\n {...rest}\n >\n <IconTile icon={icon} size={inline ? 'md' : 'lg'} tone={iconTone} className={inline ? undefined : 'mb-4'} />\n <div className={cx('grid min-w-0 gap-1.5', centered && 'justify-items-center')}>\n <h3 className={cx('m-0 font-display font-bold tracking-tight', inline ? 'text-base' : 'text-lg')}>\n {href ? (\n <CardLink href={href} as={linkAs}>\n {title}\n </CardLink>\n ) : (\n title\n )}\n </h3>\n {description && <p className=\"m-0 text-[15px] text-fg-muted\">{description}</p>}\n {action && !href && <div className=\"mt-2.5\">{action}</div>}\n </div>\n </Card>\n );\n}\n\nexport interface PersonLink {\n /** Visible text (\"LinkedIn\"). */\n label: string;\n href: string;\n icon?: IconName;\n /** Full accessible name when several cards repeat the same label (\"Alexis Saransig on LinkedIn\"). */\n ariaLabel?: string;\n}\n\nexport interface PersonCardProps extends Omit<CardProps, 'title' | 'role'> {\n name: string;\n /** Job title (\"CEO\", \"Co-founder & CTO\"). */\n role: ReactNode;\n /** Square photo, shown round. Falls back to initials. Real people only, with their consent. */\n photo?: string;\n bio?: ReactNode;\n links?: PersonLink[];\n /** Heading level of the name; `h3` inside a titled section. */\n headingAs?: 'h2' | 'h3' | 'h4';\n}\n\nconst initials = (name: string) =>\n name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((p) => p[0]!.toUpperCase())\n .join('');\n\n/** Team member or founder: photo, name, role, short bio and profile links. Server-safe. */\nexport function PersonCard({\n name,\n role,\n photo,\n bio,\n links = [],\n headingAs: Heading = 'h3',\n ...rest\n}: PersonCardProps) {\n return (\n <Card {...rest} className={cx('grid content-start gap-4', rest.className)}>\n <div className=\"flex items-center gap-4\">\n {photo ? (\n <img\n src={photo}\n alt=\"\"\n width={96}\n height={96}\n loading=\"lazy\"\n decoding=\"async\"\n className=\"size-20 shrink-0 rounded-full bg-surface-muted object-cover sm:size-24\"\n />\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"grid size-20 shrink-0 place-items-center rounded-full bg-info-surface font-display text-2xl font-bold text-info-fg sm:size-24\"\n >\n {initials(name)}\n </span>\n )}\n <div className=\"grid gap-0.5\">\n <Heading className=\"m-0 font-display text-xl font-bold tracking-tight\">{name}</Heading>\n <p className=\"m-0 text-sm font-semibold text-link\">{role}</p>\n </div>\n </div>\n {bio && <p className=\"m-0 text-[15px] text-fg-muted\">{bio}</p>}\n {links.length > 0 && (\n <ul className=\"m-0 flex list-none flex-wrap gap-x-4 gap-y-2 p-0\">\n {links.map((l) => (\n <li key={l.href}>\n <a\n href={l.href}\n aria-label={l.ariaLabel}\n className=\"inline-flex min-h-6 items-center gap-1.5 rounded-xs text-sm font-semibold text-link underline-offset-4 hover:underline focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {l.icon && <Icon name={l.icon} size={18} />}\n {l.label}\n </a>\n </li>\n ))}\n </ul>\n )}\n </Card>\n );\n}\n\nexport interface MetricCardProps extends Omit<CardProps, 'title'> {\n label: ReactNode;\n value: ReactNode;\n /** Change vs. previous period, e.g. +12.5. Positive is good unless `invertTrend`. */\n delta?: number;\n deltaLabel?: ReactNode;\n invertTrend?: boolean;\n /** Small chart under the value (e.g. `<Sparkline />`). */\n chart?: ReactNode;\n icon?: IconName;\n /** Colored stripe on the left, to group or tell metrics apart. Pair it with the label, never alone. */\n tone?: MetricTone;\n /** One line under the value (\"12 still in\", \"of 15 members\"). */\n hint?: ReactNode;\n}\n\nexport type MetricTone = 'none' | 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'info';\n\nconst TONE_STRIPE: Record<Exclude<MetricTone, 'none'>, string> = {\n primary: 'before:bg-primary',\n accent: 'before:bg-accent',\n success: 'before:bg-success-icon',\n warning: 'before:bg-warning-icon',\n danger: 'before:bg-danger-icon',\n info: 'before:bg-info-icon',\n};\n\n/** KPI tile for dashboards. */\nexport function MetricCard({\n label,\n value,\n delta,\n deltaLabel,\n invertTrend,\n chart,\n icon,\n tone = 'none',\n hint,\n ...rest\n}: MetricCardProps) {\n const good = delta === undefined ? undefined : invertTrend ? delta < 0 : delta > 0;\n return (\n <Card\n padding=\"sm\"\n {...rest}\n className={cx(\n 'grid gap-2 overflow-hidden sm:p-5',\n tone !== 'none' &&\n cx('pl-5 before:absolute before:inset-y-0 before:left-0 before:w-1 sm:pl-6', TONE_STRIPE[tone]),\n rest.className,\n )}\n >\n <div className=\"flex items-center justify-between gap-2 text-sm font-medium text-fg-muted\">\n {label}\n {icon && <Icon name={icon} size={22} className=\"text-primary\" />}\n </div>\n <div className=\"font-display text-3xl font-extrabold tracking-tight tabular-nums\">{value}</div>\n {hint && <div className=\"text-sm text-fg-muted\">{hint}</div>}\n {delta !== undefined && (\n <div className=\"flex items-center gap-1.5 text-sm\">\n <span\n className={cx(\n 'inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 font-semibold tabular-nums',\n good\n ? 'bg-success-surface text-success-fg'\n : delta === 0\n ? 'bg-surface-muted text-fg-muted'\n : 'bg-danger-surface text-danger-fg',\n )}\n >\n <Glyph name={delta >= 0 ? 'arrow-up' : 'arrow-down'} size={12} />\n {Math.abs(delta)}%\n </span>\n {deltaLabel && <span className=\"text-fg-muted\">{deltaLabel}</span>}\n </div>\n )}\n {chart}\n </Card>\n );\n}\n\nexport interface ProductCardProps extends Omit<CardProps, 'title'> {\n name: ReactNode;\n tagline: ReactNode;\n /** Status badge (e.g. `<Badge variant=\"live\">Live</Badge>`). */\n badge?: ReactNode;\n icon?: IconName;\n price?: ReactNode;\n href: string;\n linkAs?: ElementType;\n}\n\n/** Kodffe product (Yapakit, LinkedFace…). */\nexport function ProductCard({ name, tagline, badge, icon = 'store', price, href, linkAs, ...rest }: ProductCardProps) {\n return (\n <Card interactive {...rest} className={cx('flex flex-col gap-4', rest.className)}>\n <div className=\"flex items-start justify-between gap-3\">\n <span className=\"grid size-12 place-items-center rounded-md bg-gradient-brand text-on-primary\">\n <Icon name={icon} size={28} />\n </span>\n {badge}\n </div>\n <div>\n <h3 className=\"m-0 font-display text-xl font-bold tracking-tight\">\n <CardLink href={href} as={linkAs}>\n {name}\n </CardLink>\n </h3>\n <p className=\"m-0 mt-1 text-[15px] text-fg-muted\">{tagline}</p>\n </div>\n {price && <p className=\"m-0 mt-auto text-sm font-semibold text-fg\">{price}</p>}\n </Card>\n );\n}\n\nexport interface PlanCardProps extends Omit<CardProps, 'title'> {\n name: ReactNode;\n price: ReactNode;\n period?: ReactNode;\n /** A line under the price (\"or $100 a year\", \"billed monthly\"). */\n priceNote?: ReactNode;\n description?: ReactNode;\n features: ReactNode[];\n cta: ReactNode;\n /** Highlights the recommended plan. */\n featured?: boolean;\n featuredLabel?: ReactNode;\n}\n\n/** Pricing plan. Mark one plan `featured` at most. */\nexport function PlanCard({\n name,\n price,\n period,\n priceNote,\n description,\n features,\n cta,\n featured,\n featuredLabel = 'Most popular',\n ...rest\n}: PlanCardProps) {\n return (\n <Card\n variant={featured ? 'raised' : 'outline'}\n padding=\"lg\"\n {...rest}\n className={cx('flex flex-col gap-5', featured && 'border-2 border-primary', rest.className)}\n >\n {featured && (\n <span className=\"absolute -top-3 left-8 rounded-full bg-primary px-3 py-1 text-xs font-bold text-on-primary\">\n {featuredLabel}\n </span>\n )}\n <div>\n <h3 className=\"m-0 font-display text-lg font-bold\">{name}</h3>\n {description && <p className=\"m-0 mt-1 text-sm text-fg-muted\">{description}</p>}\n </div>\n <p className=\"m-0 flex items-baseline gap-1\">\n <span className=\"font-display text-4xl font-extrabold tracking-tight tabular-nums\">{price}</span>\n {period && <span className=\"text-sm text-fg-muted\">{period}</span>}\n </p>\n {priceNote && <p className=\"m-0 -mt-3 text-sm text-fg-muted\">{priceNote}</p>}\n <CheckList items={features} marker=\"plain\" />\n <div className=\"mt-auto grid *:w-full\">{cta}</div>\n </Card>\n );\n}\n\nexport interface CaseCardProps extends Omit<CardProps, 'title'> {\n client: ReactNode;\n title: ReactNode;\n /** Headline result, e.g. \"−82% manual entry\". */\n result: ReactNode;\n tags?: ReactNode[];\n image?: string;\n href: string;\n linkAs?: ElementType;\n}\n\n/** Case study teaser: result first. */\nexport function CaseCard({ client, title, result, tags, image, href, linkAs, ...rest }: CaseCardProps) {\n return (\n <Card interactive padding=\"none\" {...rest} className={cx('flex flex-col overflow-hidden', rest.className)}>\n {image && <img src={image} alt=\"\" className=\"aspect-[16/9] w-full object-cover\" />}\n <div className=\"flex flex-1 flex-col gap-3 p-6\">\n <p className=\"m-0 text-xs font-semibold tracking-wide text-fg-muted uppercase\">{client}</p>\n <p className=\"m-0 font-display text-3xl font-extrabold tracking-tight text-link\">{result}</p>\n <h3 className=\"m-0 text-[17px] leading-snug font-semibold\">\n <CardLink href={href} as={linkAs}>\n {title}\n </CardLink>\n </h3>\n {tags && <div className=\"mt-auto flex flex-wrap gap-1.5 pt-2\">{tags}</div>}\n </div>\n </Card>\n );\n}\n\nexport interface ArticleCardProps extends Omit<CardProps, 'title'> {\n title: ReactNode;\n excerpt?: ReactNode;\n category?: ReactNode;\n date?: string;\n /** e.g. \"6 min read\". */\n readingTime?: ReactNode;\n image?: string;\n href: string;\n linkAs?: ElementType;\n}\n\n/** Blog / resource teaser. */\nexport function ArticleCard({\n title,\n excerpt,\n category,\n date,\n readingTime,\n image,\n href,\n linkAs,\n ...rest\n}: ArticleCardProps) {\n return (\n <Card\n as=\"article\"\n interactive\n padding=\"none\"\n variant=\"outline\"\n {...rest}\n className={cx('flex flex-col overflow-hidden', rest.className)}\n >\n {image && <img src={image} alt=\"\" className=\"aspect-[16/9] w-full object-cover\" />}\n <div className=\"flex flex-1 flex-col gap-2 p-6\">\n {category && <p className=\"m-0 text-xs font-semibold tracking-wide text-link uppercase\">{category}</p>}\n <h3 className=\"m-0 font-display text-lg leading-snug font-bold tracking-tight text-balance\">\n <CardLink href={href} as={linkAs}>\n {title}\n </CardLink>\n </h3>\n {excerpt && <p className=\"m-0 line-clamp-3 text-[15px] text-fg-muted\">{excerpt}</p>}\n {(date || readingTime) && (\n <p className=\"m-0 mt-auto flex gap-2 pt-2 text-sm text-fg-muted\">\n {date && (\n <time dateTime={date}>{new Date(date).toLocaleDateString(undefined, { dateStyle: 'medium' })}</time>\n )}\n {date && readingTime && <span aria-hidden=\"true\">·</span>}\n {readingTime}\n </p>\n )}\n </div>\n </Card>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type ChipListItem } from '../data-display/insights';
3
+ export interface InsightCardProps {
4
+ name: string;
5
+ /** "@ana" or a role. */
6
+ handle?: string;
7
+ avatarSrc?: string;
8
+ /** Clamped to three lines. */
9
+ summary: ReactNode;
10
+ topics?: ChipListItem[];
11
+ action?: {
12
+ label: string;
13
+ href: string;
14
+ };
15
+ headingLevel?: 2 | 3;
16
+ className?: string;
17
+ }
18
+ /** A person's AI summary in a grid: avatar, name and handle, a clamped summary, topics and a link to the profile. */
19
+ export declare function InsightCard({ name, handle, avatarSrc, summary, topics, action, headingLevel, className, }: InsightCardProps): import("react").JSX.Element;