@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.
- package/dist/activityfeed.css +12 -0
- package/dist/activityfeed.d.ts +7 -0
- package/dist/activityfeed.layered.css +14 -0
- package/dist/badge.css +3 -0
- package/dist/badge.d.ts +2 -2
- package/dist/badge.layered.css +3 -0
- package/dist/cjs/components/badge/badge.recipe.js +10 -0
- package/dist/cjs/components/bulkbar/bulkbar.js +5 -1
- package/dist/cjs/components/fileupload/fileupload.js +19 -3
- package/dist/cjs/components/formfield/formfield.js +8 -1
- package/dist/cjs/components/heatmapchart/heatmapchart.js +14 -2
- package/dist/cjs/components/skiplink/index.js +17 -0
- package/dist/cjs/components/skiplink/skiplink.js +16 -0
- package/dist/cjs/components/skiplink/skiplink.recipe.js +33 -0
- package/dist/cjs/components/textlink/index.js +7 -0
- package/dist/cjs/components/textlink/textlink.js +16 -0
- package/dist/cjs/components/textlink/textlink.recipe.js +35 -0
- package/dist/cjs/components/visuallyhidden/index.js +17 -0
- package/dist/cjs/components/visuallyhidden/visuallyhidden.js +16 -0
- package/dist/cjs/components/visuallyhidden/visuallyhidden.recipe.js +20 -0
- package/dist/cjs/index.js +5 -0
- package/dist/cjs/product/activityfeed/activityfeed.js +38 -0
- package/dist/cjs/product/activityfeed/activityfeed.recipe.js +35 -0
- package/dist/cjs/product/activityfeed/index.js +10 -0
- package/dist/cjs/product/board/board.js +11 -2
- package/dist/cjs/product/command/command.js +13 -1
- package/dist/cjs/product/flowcanvas/flowcanvas.js +9 -2
- package/dist/cjs/product/headerbar/headerbar.js +15 -0
- package/dist/cjs/product/headerbar/headerbar.recipe.js +35 -0
- package/dist/cjs/product/headerbar/index.js +17 -0
- package/dist/cjs/product/inbox/inbox.js +13 -1
- package/dist/cjs/product/onboarding/onboarding.js +22 -1
- package/dist/cjs/product/recordpage/index.js +2 -1
- package/dist/cjs/product/recordpage/recordpage.js +197 -123
- package/dist/cjs/product/recordpage/recordpage.recipe.js +5 -0
- package/dist/cjs/product/richtext/richtext.js +43 -0
- package/dist/cjs/product/tasklist/tasklist.js +8 -1
- package/dist/cjs/tokens/palette.js +14 -0
- package/dist/cjs/tokens/semantic.js +5 -0
- package/dist/esm/components/badge/badge.recipe.js +10 -0
- package/dist/esm/components/bulkbar/bulkbar.js +5 -1
- package/dist/esm/components/fileupload/fileupload.js +20 -4
- package/dist/esm/components/formfield/formfield.js +8 -1
- package/dist/esm/components/heatmapchart/heatmapchart.js +14 -2
- package/dist/esm/components/skiplink/index.js +1 -0
- package/dist/esm/components/skiplink/skiplink.js +13 -0
- package/dist/esm/components/skiplink/skiplink.recipe.js +30 -0
- package/dist/esm/components/textlink/index.js +2 -0
- package/dist/esm/components/textlink/textlink.js +13 -0
- package/dist/esm/components/textlink/textlink.recipe.js +32 -0
- package/dist/esm/components/visuallyhidden/index.js +1 -0
- package/dist/esm/components/visuallyhidden/visuallyhidden.js +13 -0
- package/dist/esm/components/visuallyhidden/visuallyhidden.recipe.js +17 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/product/activityfeed/activityfeed.js +32 -0
- package/dist/esm/product/activityfeed/activityfeed.recipe.js +32 -0
- package/dist/esm/product/activityfeed/index.js +2 -0
- package/dist/esm/product/board/board.js +12 -3
- package/dist/esm/product/command/command.js +14 -2
- package/dist/esm/product/flowcanvas/flowcanvas.js +9 -2
- package/dist/esm/product/headerbar/headerbar.js +12 -0
- package/dist/esm/product/headerbar/headerbar.recipe.js +32 -0
- package/dist/esm/product/headerbar/index.js +1 -0
- package/dist/esm/product/inbox/inbox.js +13 -1
- package/dist/esm/product/onboarding/onboarding.js +22 -1
- package/dist/esm/product/recordpage/index.js +1 -1
- package/dist/esm/product/recordpage/recordpage.js +197 -124
- package/dist/esm/product/recordpage/recordpage.recipe.js +5 -0
- package/dist/esm/product/richtext/richtext.js +43 -0
- package/dist/esm/product/tasklist/tasklist.js +8 -1
- package/dist/esm/tokens/palette.js +14 -0
- package/dist/esm/tokens/semantic.js +5 -0
- package/dist/headerbar.css +7 -0
- package/dist/headerbar.d.ts +7 -0
- package/dist/headerbar.layered.css +9 -0
- package/dist/native/tokens.d.ts +1 -1
- package/dist/native/tokens.js +16 -4
- package/dist/recordpage.css +17 -31
- package/dist/recordpage.layered.css +17 -31
- package/dist/skiplink.css +5 -0
- package/dist/skiplink.d.ts +7 -0
- package/dist/skiplink.layered.css +7 -0
- package/dist/styles.css +69 -31
- package/dist/styles.layered.css +69 -31
- package/dist/textlink.css +11 -0
- package/dist/textlink.d.ts +7 -0
- package/dist/textlink.layered.css +13 -0
- package/dist/tokens.css +6 -0
- package/dist/tokens.json +16 -4
- package/dist/types/components/badge/badge.d.ts +2 -0
- package/dist/types/components/badge/badge.recipe.d.ts +8 -0
- package/dist/types/components/bulkbar/bulkbar.d.ts +1 -1
- package/dist/types/components/heatmapchart/heatmapchart.d.ts +1 -1
- package/dist/types/components/skiplink/index.d.ts +1 -0
- package/dist/types/components/skiplink/skiplink.d.ts +18 -0
- package/dist/types/components/skiplink/skiplink.recipe.d.ts +3 -0
- package/dist/types/components/textlink/index.d.ts +2 -0
- package/dist/types/components/textlink/textlink.d.ts +19 -0
- package/dist/types/components/textlink/textlink.recipe.d.ts +13 -0
- package/dist/types/components/visuallyhidden/index.d.ts +1 -0
- package/dist/types/components/visuallyhidden/visuallyhidden.d.ts +15 -0
- package/dist/types/components/visuallyhidden/visuallyhidden.recipe.d.ts +3 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/product/activityfeed/activityfeed.d.ts +57 -0
- package/dist/types/product/activityfeed/activityfeed.recipe.d.ts +3 -0
- package/dist/types/product/activityfeed/index.d.ts +2 -0
- package/dist/types/product/board/board.d.ts +1 -1
- package/dist/types/product/command/command.d.ts +1 -1
- package/dist/types/product/flowcanvas/flowcanvas.d.ts +1 -1
- package/dist/types/product/headerbar/headerbar.d.ts +27 -0
- package/dist/types/product/headerbar/headerbar.recipe.d.ts +3 -0
- package/dist/types/product/headerbar/index.d.ts +1 -0
- package/dist/types/product/inbox/inbox.d.ts +1 -1
- package/dist/types/product/onboarding/onboarding.d.ts +1 -1
- package/dist/types/product/recordpage/index.d.ts +1 -1
- package/dist/types/product/recordpage/recordpage.d.ts +90 -1
- package/dist/types/product/tasklist/tasklist.d.ts +1 -1
- package/dist/types/tokens/contract.d.ts +3 -0
- package/dist/types/tokens/palette.d.ts +12 -0
- package/dist/types/tokens/semantic.d.ts +5 -0
- package/dist/visuallyhidden.css +3 -0
- package/dist/visuallyhidden.d.ts +7 -0
- package/dist/visuallyhidden.layered.css +5 -0
- 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,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
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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
|
+
}
|
|
@@ -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":
|
|
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":
|
|
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 @@
|
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crisp-ui-kit/crisp",
|
|
3
|
-
"version": "0.
|
|
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",
|