@crisp-ui-kit/crisp 0.53.5 → 0.54.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 (124) hide show
  1. package/dist/activityfeed.css +12 -0
  2. package/dist/activityfeed.d.ts +7 -0
  3. package/dist/activityfeed.layered.css +14 -0
  4. package/dist/badge.css +3 -0
  5. package/dist/badge.d.ts +2 -2
  6. package/dist/badge.layered.css +3 -0
  7. package/dist/cjs/components/badge/badge.recipe.js +10 -0
  8. package/dist/cjs/components/bulkbar/bulkbar.js +5 -1
  9. package/dist/cjs/components/fileupload/fileupload.js +19 -3
  10. package/dist/cjs/components/formfield/formfield.js +8 -1
  11. package/dist/cjs/components/heatmapchart/heatmapchart.js +14 -2
  12. package/dist/cjs/components/skiplink/index.js +17 -0
  13. package/dist/cjs/components/skiplink/skiplink.js +16 -0
  14. package/dist/cjs/components/skiplink/skiplink.recipe.js +33 -0
  15. package/dist/cjs/components/textlink/index.js +7 -0
  16. package/dist/cjs/components/textlink/textlink.js +16 -0
  17. package/dist/cjs/components/textlink/textlink.recipe.js +35 -0
  18. package/dist/cjs/components/visuallyhidden/index.js +17 -0
  19. package/dist/cjs/components/visuallyhidden/visuallyhidden.js +16 -0
  20. package/dist/cjs/components/visuallyhidden/visuallyhidden.recipe.js +20 -0
  21. package/dist/cjs/index.js +5 -0
  22. package/dist/cjs/product/activityfeed/activityfeed.js +38 -0
  23. package/dist/cjs/product/activityfeed/activityfeed.recipe.js +35 -0
  24. package/dist/cjs/product/activityfeed/index.js +10 -0
  25. package/dist/cjs/product/board/board.js +11 -2
  26. package/dist/cjs/product/command/command.js +13 -1
  27. package/dist/cjs/product/flowcanvas/flowcanvas.js +9 -2
  28. package/dist/cjs/product/headerbar/headerbar.js +15 -0
  29. package/dist/cjs/product/headerbar/headerbar.recipe.js +35 -0
  30. package/dist/cjs/product/headerbar/index.js +17 -0
  31. package/dist/cjs/product/inbox/inbox.js +13 -1
  32. package/dist/cjs/product/onboarding/onboarding.js +22 -1
  33. package/dist/cjs/product/recordpage/index.js +2 -1
  34. package/dist/cjs/product/recordpage/recordpage.js +197 -123
  35. package/dist/cjs/product/recordpage/recordpage.recipe.js +5 -0
  36. package/dist/cjs/product/richtext/richtext.js +43 -0
  37. package/dist/cjs/product/tasklist/tasklist.js +8 -1
  38. package/dist/cjs/tokens/palette.js +14 -0
  39. package/dist/cjs/tokens/semantic.js +5 -0
  40. package/dist/esm/components/badge/badge.recipe.js +10 -0
  41. package/dist/esm/components/bulkbar/bulkbar.js +5 -1
  42. package/dist/esm/components/fileupload/fileupload.js +20 -4
  43. package/dist/esm/components/formfield/formfield.js +8 -1
  44. package/dist/esm/components/heatmapchart/heatmapchart.js +14 -2
  45. package/dist/esm/components/skiplink/index.js +1 -0
  46. package/dist/esm/components/skiplink/skiplink.js +13 -0
  47. package/dist/esm/components/skiplink/skiplink.recipe.js +30 -0
  48. package/dist/esm/components/textlink/index.js +2 -0
  49. package/dist/esm/components/textlink/textlink.js +13 -0
  50. package/dist/esm/components/textlink/textlink.recipe.js +32 -0
  51. package/dist/esm/components/visuallyhidden/index.js +1 -0
  52. package/dist/esm/components/visuallyhidden/visuallyhidden.js +13 -0
  53. package/dist/esm/components/visuallyhidden/visuallyhidden.recipe.js +17 -0
  54. package/dist/esm/index.js +5 -0
  55. package/dist/esm/product/activityfeed/activityfeed.js +32 -0
  56. package/dist/esm/product/activityfeed/activityfeed.recipe.js +32 -0
  57. package/dist/esm/product/activityfeed/index.js +2 -0
  58. package/dist/esm/product/board/board.js +12 -3
  59. package/dist/esm/product/command/command.js +14 -2
  60. package/dist/esm/product/flowcanvas/flowcanvas.js +9 -2
  61. package/dist/esm/product/headerbar/headerbar.js +12 -0
  62. package/dist/esm/product/headerbar/headerbar.recipe.js +32 -0
  63. package/dist/esm/product/headerbar/index.js +1 -0
  64. package/dist/esm/product/inbox/inbox.js +13 -1
  65. package/dist/esm/product/onboarding/onboarding.js +22 -1
  66. package/dist/esm/product/recordpage/index.js +1 -1
  67. package/dist/esm/product/recordpage/recordpage.js +197 -124
  68. package/dist/esm/product/recordpage/recordpage.recipe.js +5 -0
  69. package/dist/esm/product/richtext/richtext.js +43 -0
  70. package/dist/esm/product/tasklist/tasklist.js +8 -1
  71. package/dist/esm/tokens/palette.js +14 -0
  72. package/dist/esm/tokens/semantic.js +5 -0
  73. package/dist/headerbar.css +7 -0
  74. package/dist/headerbar.d.ts +7 -0
  75. package/dist/headerbar.layered.css +9 -0
  76. package/dist/native/tokens.d.ts +1 -1
  77. package/dist/native/tokens.js +16 -4
  78. package/dist/recordpage.css +17 -31
  79. package/dist/recordpage.layered.css +17 -31
  80. package/dist/skiplink.css +5 -0
  81. package/dist/skiplink.d.ts +7 -0
  82. package/dist/skiplink.layered.css +7 -0
  83. package/dist/styles.css +69 -31
  84. package/dist/styles.layered.css +69 -31
  85. package/dist/textlink.css +11 -0
  86. package/dist/textlink.d.ts +7 -0
  87. package/dist/textlink.layered.css +13 -0
  88. package/dist/tokens.css +6 -0
  89. package/dist/tokens.json +16 -4
  90. package/dist/types/components/badge/badge.d.ts +2 -0
  91. package/dist/types/components/badge/badge.recipe.d.ts +8 -0
  92. package/dist/types/components/bulkbar/bulkbar.d.ts +1 -1
  93. package/dist/types/components/heatmapchart/heatmapchart.d.ts +1 -1
  94. package/dist/types/components/skiplink/index.d.ts +1 -0
  95. package/dist/types/components/skiplink/skiplink.d.ts +18 -0
  96. package/dist/types/components/skiplink/skiplink.recipe.d.ts +3 -0
  97. package/dist/types/components/textlink/index.d.ts +2 -0
  98. package/dist/types/components/textlink/textlink.d.ts +19 -0
  99. package/dist/types/components/textlink/textlink.recipe.d.ts +13 -0
  100. package/dist/types/components/visuallyhidden/index.d.ts +1 -0
  101. package/dist/types/components/visuallyhidden/visuallyhidden.d.ts +15 -0
  102. package/dist/types/components/visuallyhidden/visuallyhidden.recipe.d.ts +3 -0
  103. package/dist/types/index.d.ts +5 -0
  104. package/dist/types/product/activityfeed/activityfeed.d.ts +57 -0
  105. package/dist/types/product/activityfeed/activityfeed.recipe.d.ts +3 -0
  106. package/dist/types/product/activityfeed/index.d.ts +2 -0
  107. package/dist/types/product/board/board.d.ts +1 -1
  108. package/dist/types/product/command/command.d.ts +1 -1
  109. package/dist/types/product/flowcanvas/flowcanvas.d.ts +1 -1
  110. package/dist/types/product/headerbar/headerbar.d.ts +27 -0
  111. package/dist/types/product/headerbar/headerbar.recipe.d.ts +3 -0
  112. package/dist/types/product/headerbar/index.d.ts +1 -0
  113. package/dist/types/product/inbox/inbox.d.ts +1 -1
  114. package/dist/types/product/onboarding/onboarding.d.ts +1 -1
  115. package/dist/types/product/recordpage/index.d.ts +1 -1
  116. package/dist/types/product/recordpage/recordpage.d.ts +90 -1
  117. package/dist/types/product/tasklist/tasklist.d.ts +1 -1
  118. package/dist/types/tokens/contract.d.ts +3 -0
  119. package/dist/types/tokens/palette.d.ts +12 -0
  120. package/dist/types/tokens/semantic.d.ts +5 -0
  121. package/dist/visuallyhidden.css +3 -0
  122. package/dist/visuallyhidden.d.ts +7 -0
  123. package/dist/visuallyhidden.layered.css +5 -0
  124. package/package.json +26 -1
@@ -25,7 +25,7 @@ export type BulkBarProps = Omit<React.ComponentPropsWithoutRef<"div">, "children
25
25
  * positioned ancestor when a selection is active; render it conditionally
26
26
  * (e.g. `count > 0 && <BulkBar …/>`). Measured from a records table.
27
27
  */
28
- export declare function BulkBar({ count, onClear, countLabel, countText, children, className, clearLabel, ...rest }: BulkBarProps): React.JSX.Element;
28
+ export declare function BulkBar({ count, onClear, countLabel: countLabelProp, countText, children, className, clearLabel: clearLabelProp, ...rest }: BulkBarProps): React.JSX.Element;
29
29
  export declare namespace BulkBar {
30
30
  var displayName: string;
31
31
  }
@@ -45,7 +45,7 @@ export type HeatmapChartProps = Omit<React.ComponentPropsWithoutRef<"div">, "chi
45
45
  * the recipe's own doc comment for why (and for its measurement — or lack
46
46
  * of one — against Attio).
47
47
  */
48
- export declare function HeatmapChart({ data, rowAxis, colAxis, format, cellTitle, onCellClick, isCellClickable, empty, emptyLabel, "aria-label": ariaLabel, className, ...rest }: HeatmapChartProps): React.JSX.Element;
48
+ export declare function HeatmapChart({ data, rowAxis, colAxis, format, cellTitle, onCellClick, isCellClickable, empty, emptyLabel: emptyLabelProp, "aria-label": ariaLabel, className, ...rest }: HeatmapChartProps): React.JSX.Element;
49
49
  export declare namespace HeatmapChart {
50
50
  var displayName: string;
51
51
  }
@@ -0,0 +1 @@
1
+ export * from "./skiplink";
@@ -0,0 +1,18 @@
1
+ import type * as React from "react";
2
+ export type SkipLinkProps = Omit<React.ComponentPropsWithoutRef<"a">, "href"> & {
3
+ /** The target to jump to. Default `"#main-content"` — give the page's
4
+ * main landmark that id. */
5
+ href?: string;
6
+ className?: string;
7
+ };
8
+ /**
9
+ * A "skip to content" link — invisible until it is the thing with focus
10
+ * (a sighted mouse user never sees it), so a keyboard user's first Tab from
11
+ * a cold load reaches it instead of walking the whole nav first. Render it
12
+ * as the very first thing on the page, before the sidebar/header. See the
13
+ * recipe's own doc comment for why there's no Attio value behind its chrome.
14
+ */
15
+ export declare function SkipLink({ href, children, className, ...rest }: SkipLinkProps): React.JSX.Element;
16
+ export declare namespace SkipLink {
17
+ var displayName: string;
18
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const skiplinkRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -0,0 +1,2 @@
1
+ export { TextLink, type TextLinkProps } from "./textlink";
2
+ export { textlinkRecipe } from "./textlink.recipe";
@@ -0,0 +1,19 @@
1
+ import type * as React from "react";
2
+ export type TextLinkProps = React.ComponentPropsWithoutRef<"a"> & {
3
+ /** `"brand"` — bold, always brand-coloured (a card's trailing "View all →").
4
+ * `"muted"` (default) — quiet until hover, then brand-coloured (an
5
+ * in-context reference link, e.g. a sample record under a finding). */
6
+ tone?: "brand" | "muted";
7
+ className?: string;
8
+ };
9
+ /**
10
+ * Inline navigable text — a real `<a href>` always, the same href+onClick
11
+ * division `StatList` uses: `href` gives ordinary browser behaviour (new
12
+ * tab, copy link, hover status), an `onClick` that calls
13
+ * `event.preventDefault()` pairs it with client-side routing (e.g.
14
+ * react-router's own `Link`).
15
+ */
16
+ export declare function TextLink({ tone, className, ...rest }: TextLinkProps): React.JSX.Element;
17
+ export declare namespace TextLink {
18
+ var displayName: string;
19
+ }
@@ -0,0 +1,13 @@
1
+ declare const config: import("../..").RecipeConfig<{
2
+ tone: {
3
+ brand: string;
4
+ muted: string;
5
+ };
6
+ }>;
7
+ export declare const textlinkRecipe: import("../..").RecipeFn<{
8
+ tone: {
9
+ brand: string;
10
+ muted: string;
11
+ };
12
+ }>;
13
+ export default config;
@@ -0,0 +1 @@
1
+ export * from "./visuallyhidden";
@@ -0,0 +1,15 @@
1
+ import type * as React from "react";
2
+ export type VisuallyHiddenProps = React.ComponentPropsWithoutRef<"span"> & {
3
+ className?: string;
4
+ };
5
+ /**
6
+ * Hides content visually while keeping it in the accessibility tree and
7
+ * the tab order — a label for an icon-only control, extra context for a
8
+ * screen-reader user that a sighted one gets from layout alone. Renders a
9
+ * `<span>`; wrap the element that needs the treatment, or read its content
10
+ * as a `label`/`aria-label` source in a test.
11
+ */
12
+ export declare function VisuallyHidden({ className, ...rest }: VisuallyHiddenProps): React.JSX.Element;
13
+ export declare namespace VisuallyHidden {
14
+ var displayName: string;
15
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const visuallyhiddenRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -40,6 +40,7 @@ export * from "./components/resizablepanel";
40
40
  export * from "./components/segmented";
41
41
  export * from "./components/select";
42
42
  export * from "./components/skeleton";
43
+ export * from "./components/skiplink";
43
44
  export * from "./components/slider";
44
45
  export * from "./components/spinner";
45
46
  export * from "./components/stagebar";
@@ -49,17 +50,21 @@ export * from "./components/table";
49
50
  export * from "./components/tabletoolbar";
50
51
  export * from "./components/tabs";
51
52
  export * from "./components/textarea";
53
+ export * from "./components/textlink";
52
54
  export * from "./components/timepicker";
53
55
  export * from "./components/toast";
54
56
  export * from "./components/tooltip";
57
+ export * from "./components/visuallyhidden";
55
58
  export * from "./components/wheelpicker";
56
59
  export * from "./core";
60
+ export * from "./product/activityfeed";
57
61
  export * from "./product/appshell";
58
62
  export * from "./product/authshell";
59
63
  export * from "./product/board";
60
64
  export * from "./product/command";
61
65
  export * from "./product/entitycard";
62
66
  export * from "./product/flowcanvas";
67
+ export * from "./product/headerbar";
63
68
  export * from "./product/inbox";
64
69
  export * from "./product/listpage";
65
70
  export * from "./product/navitem";
@@ -0,0 +1,57 @@
1
+ import type * as React from "react";
2
+ export type ActivityFeedProps = React.ComponentPropsWithoutRef<"div"> & {
3
+ className?: string;
4
+ };
5
+ /**
6
+ * A record's own event timeline — a vertically stacked, bordered list of
7
+ * `ActivityFeedRow`s, capped at a readable content width. Built for
8
+ * internal/grc's per-record "Activity" tab (crisp#462 SHELL/forms gap): it
9
+ * replaces a hand-rolled `<div className="mx-auto max-w-3xl space-y-4
10
+ * p-6">`. No live Attio re-measurement behind its own chrome this pass (the
11
+ * CDP bridge was unreachable when this was built) — see the recipe's own
12
+ * doc comment for which already-measured crisp values it reuses instead of
13
+ * a new guess.
14
+ */
15
+ export declare function ActivityFeed({ className, children, ...rest }: ActivityFeedProps): React.JSX.Element;
16
+ export declare namespace ActivityFeed {
17
+ var displayName: string;
18
+ }
19
+ export type ActivityFeedRowProps = {
20
+ /** Who did it — a chip, an avatar+name, whatever the consumer's identity
21
+ * treatment is. crisp renders no actor chip of its own. */
22
+ actor: React.ReactNode;
23
+ /** What happened — a tag/badge naming the action. */
24
+ action: React.ReactNode;
25
+ /** When — already formatted for display. */
26
+ when: React.ReactNode;
27
+ /** An optional field-level diff list under the row (see
28
+ * `ActivityFeedDiffItem`). */
29
+ children?: React.ReactNode;
30
+ };
31
+ /** One event row: actor + action + timestamp, with an optional diff list
32
+ * underneath. The last row in an `ActivityFeed` draws no divider. */
33
+ export declare function ActivityFeedRow({ actor, action, when, children, }: ActivityFeedRowProps): React.JSX.Element;
34
+ export declare namespace ActivityFeedRow {
35
+ var displayName: string;
36
+ }
37
+ export type ActivityFeedDiffItemProps = {
38
+ /** The changed field's label. */
39
+ field: React.ReactNode;
40
+ /** The prior value, already formatted — omit for a "set to" (no known
41
+ * prior value) row. */
42
+ before?: React.ReactNode;
43
+ /** The new value, already formatted. */
44
+ after: React.ReactNode;
45
+ };
46
+ /** One changed-field line under an `ActivityFeedRow` — "Field: before →
47
+ * after", or "Field: set to after" when there is no known prior value. */
48
+ export declare function ActivityFeedDiffItem({ field, before, after, }: ActivityFeedDiffItemProps): React.JSX.Element;
49
+ export declare namespace ActivityFeedDiffItem {
50
+ var displayName: string;
51
+ }
52
+ export declare function ActivityFeedDiffList({ children, }: {
53
+ children: React.ReactNode;
54
+ }): React.JSX.Element;
55
+ export declare namespace ActivityFeedDiffList {
56
+ var displayName: string;
57
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const activityfeedRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -0,0 +1,2 @@
1
+ export { ActivityFeed, ActivityFeedDiffItem, type ActivityFeedDiffItemProps, ActivityFeedDiffList, type ActivityFeedProps, ActivityFeedRow, type ActivityFeedRowProps, } from "./activityfeed";
2
+ export { activityfeedRecipe } from "./activityfeed.recipe";
@@ -34,7 +34,7 @@ export type BoardProps<T extends BoardCard> = Omit<React.ComponentPropsWithoutRe
34
34
  * (the parent owns the cards, so the move is a controlled state update).
35
35
  * Measured from a deals pipeline.
36
36
  */
37
- export declare function Board<T extends BoardCard>({ columns, cards, onCardsChange, renderCard, onNewCard, newCardLabel, getCardLabel, announceMove, className, ...rest }: BoardProps<T>): React.JSX.Element;
37
+ export declare function Board<T extends BoardCard>({ columns, cards, onCardsChange, renderCard, onNewCard, newCardLabel: newCardLabelProp, getCardLabel, announceMove: announceMoveProp, className, ...rest }: BoardProps<T>): React.JSX.Element;
38
38
  export declare namespace Board {
39
39
  var displayName: string;
40
40
  }
@@ -54,4 +54,4 @@ export type CommandProps = Omit<React.ComponentPropsWithoutRef<"div">, "children
54
54
  * option list) so keyboard/focus correctness comes from the machines, not
55
55
  * hand-rolled event handling.
56
56
  */
57
- export declare function Command({ open, onOpenChange, items, placeholder, "aria-label": ariaLabel, navigateLabel, selectLabel, emptyLabel, query: queryProp, onQueryChange, filterItems, className, "aria-describedby": describedBy, ...rest }: CommandProps): React.JSX.Element | null;
57
+ export declare function Command({ open, onOpenChange, items, placeholder: placeholderProp, "aria-label": ariaLabelProp, navigateLabel: navigateLabelProp, selectLabel: selectLabelProp, emptyLabel: emptyLabelProp, query: queryProp, onQueryChange, filterItems, className, "aria-describedby": describedBy, ...rest }: CommandProps): React.JSX.Element | null;
@@ -34,7 +34,7 @@ export type FlowCanvasProps<T extends FlowNode> = Omit<React.ComponentPropsWitho
34
34
  * measured from a workflows editor. Drag a node to move it (fires
35
35
  * `onNodesChange`); drag the background to pan; use the toolbar to zoom.
36
36
  */
37
- export declare function FlowCanvas<T extends FlowNode>({ nodes, edges, onNodesChange, renderNode, nodeWidth, nodeHeight, "aria-label": ariaLabel, className, zoomOutLabel, zoomInLabel, resetLabel, edgesLabel, ...rest }: FlowCanvasProps<T>): React.JSX.Element;
37
+ export declare function FlowCanvas<T extends FlowNode>({ nodes, edges, onNodesChange, renderNode, nodeWidth, nodeHeight, "aria-label": ariaLabelProp, className, zoomOutLabel: zoomOutLabelProp, zoomInLabel: zoomInLabelProp, resetLabel: resetLabelProp, edgesLabel: edgesLabelProp, ...rest }: FlowCanvasProps<T>): React.JSX.Element;
38
38
  export declare namespace FlowCanvas {
39
39
  var displayName: string;
40
40
  }
@@ -0,0 +1,27 @@
1
+ import type * as React from "react";
2
+ export type HeaderBarProps = Omit<React.ComponentPropsWithoutRef<"div">, "title"> & {
3
+ /** Content before the title — a back button, an icon. Optional. */
4
+ leading?: React.ReactNode;
5
+ /** The bar's main content — plain text, or a `Breadcrumb`. Optional. */
6
+ title?: React.ReactNode;
7
+ /** Trailing action cluster — icon buttons, a search trigger. Optional. */
8
+ trailing?: React.ReactNode;
9
+ /**
10
+ * Draws the measured bottom divider. Default `true`. Set `false` when
11
+ * stacking two bars (a page header over a view bar) so only the outer one
12
+ * carries it — matches Attio's own two-bar pages, where only the top bar
13
+ * has a border and the one directly under it does not.
14
+ */
15
+ bordered?: boolean;
16
+ className?: string;
17
+ };
18
+ /**
19
+ * A page-level header row: an optional leading slot, a flexible title/
20
+ * breadcrumb region, and a trailing action cluster, on the measured 48px
21
+ * bar Attio uses for both its page-header and its view-bar row. See the
22
+ * recipe's own doc comment for the live measurement (crisp#462).
23
+ */
24
+ export declare function HeaderBar({ leading, title, trailing, bordered, className, ...rest }: HeaderBarProps): React.JSX.Element;
25
+ export declare namespace HeaderBar {
26
+ var displayName: string;
27
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const headerbarRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -0,0 +1 @@
1
+ export * from "./headerbar";
@@ -38,7 +38,7 @@ export type InboxProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"
38
38
  * (avatar + message + time + unread dot) or a centred empty state. Put it inside
39
39
  * a Popover for the flyout.
40
40
  */
41
- export declare function Inbox({ notifications, title, tabs, activeTab, onTabChange, emptyTitle, emptySubtitle, emptyAction, tabsLabel, className, ...rest }: InboxProps): React.JSX.Element;
41
+ export declare function Inbox({ notifications, title: titleProp, tabs, activeTab, onTabChange, emptyTitle: emptyTitleProp, emptySubtitle: emptySubtitleProp, emptyAction, tabsLabel: tabsLabelProp, className, ...rest }: InboxProps): React.JSX.Element;
42
42
  export declare namespace Inbox {
43
43
  var displayName: string;
44
44
  }
@@ -52,7 +52,7 @@ export declare const onboardingLabels: {
52
52
  * started" widget. Title + optional menu/minimize, a segmented progress bar,
53
53
  * and step rows (completed rows strike through with a brand check).
54
54
  */
55
- export declare function OnboardingChecklist({ title, steps, encouragement, onStepClick, onMenu, onMinimize, className, optionsLabel, minimizeLabel, progressLabel, progressText, completedStepLabel, ...rest }: OnboardingChecklistProps): React.JSX.Element;
55
+ export declare function OnboardingChecklist({ title: titleProp, steps, encouragement: encouragementProp, onStepClick, onMenu, onMinimize, className, optionsLabel: optionsLabelProp, minimizeLabel: minimizeLabelProp, progressLabel: progressLabelProp, progressText: progressTextProp, completedStepLabel: completedStepLabelProp, ...rest }: OnboardingChecklistProps): React.JSX.Element;
56
56
  export declare namespace OnboardingChecklist {
57
57
  var displayName: string;
58
58
  }
@@ -1,2 +1,2 @@
1
- export { RecordPage, type RecordPageLabels, type RecordPageLabelsInput, type RecordPageProps, recordPageLabels, } from "./recordpage";
1
+ export { RecordDetails, type RecordDetailsProps, RecordPage, type RecordPageHighlight, type RecordPageLabels, type RecordPageLabelsInput, type RecordPageNote, type RecordPageProps, type RecordPageSection, type RecordPageTab, type RecordPageTask, recordPageLabels, } from "./recordpage";
2
2
  export { recordpageRecipe } from "./recordpage.recipe";
@@ -1,3 +1,4 @@
1
+ import { type LucideIcon } from "lucide-react";
1
2
  import * as React from "react";
2
3
  import { type Column, type Row } from "../recordstable";
3
4
  export type RecordPageNote = {
@@ -23,6 +24,39 @@ export type RecordPageTab = {
23
24
  count?: number;
24
25
  render: () => React.ReactNode;
25
26
  };
27
+ /**
28
+ * One heading in the Details column, grouping a subset of `columns` by key
29
+ * (#528). Attio's own Details column is flat (measured live — no section
30
+ * headings at all), so a caller with no grouping of its own just omits
31
+ * `sections` and keeps that flat list, "View all values" reveal included.
32
+ * A caller that supplies `sections` replaces the flat list WHOLESALE — the
33
+ * same "caller's list replaces the built-in one, never merges with it"
34
+ * choice `tabs` already makes (#379) — so a column key named by no
35
+ * `fields` array here simply doesn't render. Sectioned mode always shows
36
+ * every field in every section (no 5-field reveal/"View all values"): a
37
+ * caller reaching for `sections` at all (GRC's own field groups; Attio has
38
+ * none to match) has already opted out of the flat Attio shape that reveal
39
+ * exists for.
40
+ */
41
+ export type RecordPageSection = {
42
+ /** Section heading; omit for an untitled group (no heading rendered). */
43
+ title?: React.ReactNode;
44
+ /** Field keys in this section, in the order shown. */
45
+ fields: string[];
46
+ };
47
+ /**
48
+ * One Overview Highlights card — same shape `RecordPanel`'s own
49
+ * `RecordPanelHighlight` uses (#448), plus the empty-state node the CRM
50
+ * default already needed: `RecordPanel`'s peek never shows an empty
51
+ * highlight card, but `RecordPage`'s Overview always has (Attio's own
52
+ * "No connection", "No team", measured live), so that stays here.
53
+ */
54
+ export type RecordPageHighlight = {
55
+ label: string;
56
+ icon?: LucideIcon;
57
+ value: React.ReactNode | null;
58
+ empty?: React.ReactNode;
59
+ };
26
60
  export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
27
61
  record: Row;
28
62
  columns: Column[];
@@ -70,6 +104,22 @@ export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "child
70
104
  tasks?: RecordPageTask[];
71
105
  onAddTask?: (text: string) => void;
72
106
  onToggleTask?: (id: string) => void;
107
+ /**
108
+ * Groups the Details column's fields under headings instead of Attio's
109
+ * flat list (#528) — see `RecordPageSection`'s own doc. Omit to keep the
110
+ * flat Attio-parity list.
111
+ */
112
+ sections?: RecordPageSection[];
113
+ /**
114
+ * Replaces the Overview Highlights cards (#528) — Attio's own set is a
115
+ * fixed CRM shape (Connection strength, Estimated ARR, …) that has
116
+ * nothing to do with a non-CRM domain's data, the same problem #379
117
+ * already solved for `tabs`. `false` omits the whole Highlights section
118
+ * (heading included, matching how `RecordPanel`'s own `highlights` omits
119
+ * its section by being left out, #448). Omit the prop entirely to keep
120
+ * the built-in CRM set.
121
+ */
122
+ highlights?: RecordPageHighlight[] | false;
73
123
  };
74
124
  /**
75
125
  * Every chrome string RecordPage renders. Supplied as a PARTIAL map, so
@@ -139,6 +189,10 @@ export type RecordPageLabels = {
139
189
  recordCreated: (name: React.ReactNode) => React.ReactNode;
140
190
  /** Empty state on the Emails tab, given the record's name. */
141
191
  noEmailsWith: (name: React.ReactNode) => React.ReactNode;
192
+ /** Field search's own empty state, given the typed query — previously a
193
+ * hardcoded English string; #528 moved it here alongside every other
194
+ * chrome string this component renders, so it translates like the rest. */
195
+ noFieldsMatch: (query: React.ReactNode) => React.ReactNode;
142
196
  };
143
197
  export declare const recordPageLabels: RecordPageLabels;
144
198
  /** Partial override of any chrome string; the keyed maps nest. */
@@ -147,6 +201,41 @@ export type RecordPageLabelsInput = Partial<Omit<RecordPageLabels, "tabs" | "hig
147
201
  highlightLabels?: Partial<RecordPageLabels["highlightLabels"]>;
148
202
  highlightEmpty?: Partial<RecordPageLabels["highlightEmpty"]>;
149
203
  };
204
+ export type RecordDetailsProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
205
+ record: Row;
206
+ columns: Column[];
207
+ /** Groups fields under headings instead of Attio's flat list — see
208
+ * `RecordPageSection`'s own doc. Omit to keep the flat list. */
209
+ sections?: RecordPageSection[];
210
+ onEdit?: (id: string, key: string, value: string) => Promise<void> | void;
211
+ labels?: RecordPageLabelsInput;
212
+ className?: string;
213
+ };
214
+ /**
215
+ * The Details column's own field list, on its own (#528) — `RecordPage`'s
216
+ * "Record Details" collapsible + searchable field list, the one piece a
217
+ * consumer with a fixed-width rail of its own (no resize handle, no entity
218
+ * header, no CRM Lists panel — GRC's own persistent 320px column, grc#66)
219
+ * actually needs, rather than rebuilding this same click-to-edit/search/
220
+ * `sections` machinery by hand or pulling in the whole page's chrome for a
221
+ * rail that isn't one. `RecordPage` composes this internally for its own
222
+ * resizable aside (same component either way, not a second copy) — this is
223
+ * that same block, exactly, just not wrapped in `RecordPage`'s own topbar/
224
+ * tabs/resizer.
225
+ *
226
+ * Not wrapped in `recordpageRecipe` itself: doing so would duplicate the
227
+ * recipe's own `display:flex;height:100%` base rule as a nested child
228
+ * inside `RecordPage`'s aside (which already carries that class from
229
+ * `RecordPage`'s own root), breaking that layout. A standalone caller
230
+ * needs exactly one `.crisp-recordpage`-scoped ancestor for this
231
+ * component's classes to resolve — wrap it in one, the same way
232
+ * `RecordPage`'s own root does: `<div className={recordpageRecipe()}>`
233
+ * (also exported from this package).
234
+ */
235
+ export declare function RecordDetails({ record, columns, sections, onEdit, labels, className, ...rest }: RecordDetailsProps): React.JSX.Element;
236
+ export declare namespace RecordDetails {
237
+ var displayName: string;
238
+ }
150
239
  /**
151
240
  * The full-page company record view — the page that opens when you click into a
152
241
  * record (as opposed to the peek [RecordPanel]). A top breadcrumb bar with
@@ -155,7 +244,7 @@ export type RecordPageLabelsInput = Partial<Omit<RecordPageLabels, "tabs" | "hig
155
244
  * Emails sections (Notes & Tasks are live — add and check things off). Drop it
156
245
  * into the app's main content area.
157
246
  */
158
- export declare function RecordPage({ record, columns, collection, labels, onBack, onToggleFull, full, className, onEdit, tabs: tabsProp, defaultTab, notes: notesProp, onAddNote, tasks: tasksProp, onAddTask, onToggleTask, ...rest }: RecordPageProps): React.JSX.Element;
247
+ export declare function RecordPage({ record, columns, collection, labels, onBack, onToggleFull, full, className, onEdit, tabs: tabsProp, defaultTab, notes: notesProp, onAddNote, tasks: tasksProp, onAddTask, onToggleTask, sections, highlights: highlightsProp, ...rest }: RecordPageProps): React.JSX.Element;
159
248
  export declare namespace RecordPage {
160
249
  var displayName: string;
161
250
  }
@@ -34,7 +34,7 @@ export type TaskListProps = Omit<React.ComponentPropsWithoutRef<"div">, "childre
34
34
  * count, then rows of a round complete-checkbox + title + trailing meta.
35
35
  * Completed rows strike through; overdue dates go red.
36
36
  */
37
- export declare function TaskList({ tasks, groups, onToggle, emptyLabel, className, completeLabel, incompleteLabel, ...rest }: TaskListProps): React.JSX.Element;
37
+ export declare function TaskList({ tasks, groups, onToggle, emptyLabel: emptyLabelProp, className, completeLabel: completeLabelProp, incompleteLabel: incompleteLabelProp, ...rest }: TaskListProps): React.JSX.Element;
38
38
  export declare namespace TaskList {
39
39
  var displayName: string;
40
40
  }
@@ -47,6 +47,9 @@ export declare const contract: MapLeafNodes<{
47
47
  fgWarningSoft: "softWarningText";
48
48
  fgDangerSoft: "softDangerText";
49
49
  fgNeutralSoft: "softNeutralText";
50
+ bgPurpleSoft: "purpleTint";
51
+ fgPurpleSoft: "softPurpleText";
52
+ ringPurpleSoft: "purpleRing";
50
53
  }, `var(--${string})`> & {
51
54
  space: Record<"0.5" | "1" | "1.5" | "2" | "2.5" | "3" | "4" | "5" | "6" | "8" | "px", `var(--${string})`>;
52
55
  radius: Record<"2xl" | "chip" | "full" | "lg" | "md" | "sm" | "xl", `var(--${string})`>;
@@ -179,5 +179,17 @@ export declare const palette: {
179
179
  readonly light: "#686870";
180
180
  readonly dark: "#9a9aa2";
181
181
  };
182
+ readonly purpleTint: {
183
+ readonly light: "#f5f0ff";
184
+ readonly dark: "#f5f0ff";
185
+ };
186
+ readonly softPurpleText: {
187
+ readonly light: "#6238b5";
188
+ readonly dark: "#6238b5";
189
+ };
190
+ readonly purpleRing: {
191
+ readonly light: "#e8ddfe";
192
+ readonly dark: "#e8ddfe";
193
+ };
182
194
  };
183
195
  export type PaletteKey = keyof typeof palette;
@@ -55,5 +55,10 @@ export declare const semantic: {
55
55
  fgWarningSoft: "softWarningText";
56
56
  fgDangerSoft: "softDangerText";
57
57
  fgNeutralSoft: "softNeutralText";
58
+ /** Badge's purple/role-pill tone (crisp#506) — see palette.ts's comment
59
+ * on `purpleTint`/`softPurpleText`/`purpleRing` for the measurement. */
60
+ bgPurpleSoft: "purpleTint";
61
+ fgPurpleSoft: "softPurpleText";
62
+ ringPurpleSoft: "purpleRing";
58
63
  };
59
64
  export type Tokens = typeof semantic;
@@ -0,0 +1,3 @@
1
+ .crisp-visuallyhidden {
2
+ position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
3
+ }
@@ -0,0 +1,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface VisuallyhiddenVariants {
4
+
5
+ }
6
+
7
+ export declare const visuallyhiddenRecipe: RecipeFn<{ }>;
@@ -0,0 +1,5 @@
1
+ @layer crisp-components {
2
+ .crisp-visuallyhidden {
3
+ position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
4
+ }
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crisp-ui-kit/crisp",
3
- "version": "0.53.5",
3
+ "version": "0.54.1",
4
4
  "description": "A lean React design system, measured pixel-for-pixel from Attio.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -243,6 +243,11 @@
243
243
  "import": "./dist/esm/components/skeleton/index.js",
244
244
  "require": "./dist/cjs/components/skeleton/index.js"
245
245
  },
246
+ "./skiplink": {
247
+ "types": "./dist/types/components/skiplink/index.d.ts",
248
+ "import": "./dist/esm/components/skiplink/index.js",
249
+ "require": "./dist/cjs/components/skiplink/index.js"
250
+ },
246
251
  "./slider": {
247
252
  "types": "./dist/types/components/slider/index.d.ts",
248
253
  "import": "./dist/esm/components/slider/index.js",
@@ -288,6 +293,11 @@
288
293
  "import": "./dist/esm/components/textarea/index.js",
289
294
  "require": "./dist/cjs/components/textarea/index.js"
290
295
  },
296
+ "./textlink": {
297
+ "types": "./dist/types/components/textlink/index.d.ts",
298
+ "import": "./dist/esm/components/textlink/index.js",
299
+ "require": "./dist/cjs/components/textlink/index.js"
300
+ },
291
301
  "./timepicker": {
292
302
  "types": "./dist/types/components/timepicker/index.d.ts",
293
303
  "import": "./dist/esm/components/timepicker/index.js",
@@ -303,11 +313,21 @@
303
313
  "import": "./dist/esm/components/tooltip/index.js",
304
314
  "require": "./dist/cjs/components/tooltip/index.js"
305
315
  },
316
+ "./visuallyhidden": {
317
+ "types": "./dist/types/components/visuallyhidden/index.d.ts",
318
+ "import": "./dist/esm/components/visuallyhidden/index.js",
319
+ "require": "./dist/cjs/components/visuallyhidden/index.js"
320
+ },
306
321
  "./wheelpicker": {
307
322
  "types": "./dist/types/components/wheelpicker/index.d.ts",
308
323
  "import": "./dist/esm/components/wheelpicker/index.js",
309
324
  "require": "./dist/cjs/components/wheelpicker/index.js"
310
325
  },
326
+ "./activityfeed": {
327
+ "types": "./dist/types/product/activityfeed/index.d.ts",
328
+ "import": "./dist/esm/product/activityfeed/index.js",
329
+ "require": "./dist/cjs/product/activityfeed/index.js"
330
+ },
311
331
  "./appshell": {
312
332
  "types": "./dist/types/product/appshell/index.d.ts",
313
333
  "import": "./dist/esm/product/appshell/index.js",
@@ -338,6 +358,11 @@
338
358
  "import": "./dist/esm/product/flowcanvas/index.js",
339
359
  "require": "./dist/cjs/product/flowcanvas/index.js"
340
360
  },
361
+ "./headerbar": {
362
+ "types": "./dist/types/product/headerbar/index.d.ts",
363
+ "import": "./dist/esm/product/headerbar/index.js",
364
+ "require": "./dist/cjs/product/headerbar/index.js"
365
+ },
341
366
  "./inbox": {
342
367
  "types": "./dist/types/product/inbox/index.d.ts",
343
368
  "import": "./dist/esm/product/inbox/index.js",