@crisp-ui-kit/crisp 0.54.7 → 0.54.8

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 (113) hide show
  1. package/dist/authshell.css +5 -1
  2. package/dist/authshell.layered.css +5 -1
  3. package/dist/badge.css +5 -5
  4. package/dist/badge.layered.css +5 -5
  5. package/dist/board.css +13 -9
  6. package/dist/board.layered.css +13 -9
  7. package/dist/button.css +3 -1
  8. package/dist/button.layered.css +3 -1
  9. package/dist/cjs/components/badge/badge.recipe.js +28 -5
  10. package/dist/cjs/components/button/button.js +33 -2
  11. package/dist/cjs/components/button/button.recipe.js +31 -5
  12. package/dist/cjs/components/datatable/datatable.js +66 -7
  13. package/dist/cjs/components/datatable/datatable.recipe.js +57 -2
  14. package/dist/cjs/components/dialog/dialog.js +8 -5
  15. package/dist/cjs/components/dialog/dialog.recipe.js +15 -1
  16. package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +12 -3
  17. package/dist/cjs/components/tabletoolbar/tabletoolbar.js +231 -48
  18. package/dist/cjs/components/tabletoolbar/tabletoolbar.recipe.js +44 -0
  19. package/dist/cjs/components/tabs/tabs.recipe.js +11 -2
  20. package/dist/cjs/components/tooltip/tooltip.js +23 -9
  21. package/dist/cjs/components/tooltip/tooltip.recipe.js +10 -9
  22. package/dist/cjs/product/authshell/authshell.js +14 -1
  23. package/dist/cjs/product/authshell/authshell.recipe.js +13 -1
  24. package/dist/cjs/product/board/board.js +122 -27
  25. package/dist/cjs/product/board/board.recipe.js +14 -2
  26. package/dist/cjs/product/comments/comments.js +23 -10
  27. package/dist/cjs/product/comments/comments.recipe.js +17 -3
  28. package/dist/cjs/product/formdialog/formdialog.js +10 -4
  29. package/dist/cjs/product/navitem/navitem.js +7 -2
  30. package/dist/cjs/product/navitem/navitem.recipe.js +16 -0
  31. package/dist/cjs/product/objectsettings/index.js +1 -2
  32. package/dist/cjs/product/objectsettings/objectsettings.js +3 -13
  33. package/dist/cjs/product/richtext/richtext.js +76 -1
  34. package/dist/cjs/product/sidebar/sidebar.js +68 -15
  35. package/dist/cjs/product/sidebar/sidebar.recipe.js +6 -1
  36. package/dist/cjs/tokens/palette.js +32 -1
  37. package/dist/cjs/tokens/semantic.js +11 -0
  38. package/dist/comments.css +36 -10
  39. package/dist/comments.layered.css +36 -10
  40. package/dist/datatable.css +47 -9
  41. package/dist/datatable.layered.css +47 -9
  42. package/dist/dialog.css +13 -1
  43. package/dist/dialog.layered.css +13 -1
  44. package/dist/esm/components/badge/badge.recipe.js +28 -5
  45. package/dist/esm/components/button/button.js +34 -3
  46. package/dist/esm/components/button/button.recipe.js +31 -5
  47. package/dist/esm/components/datatable/datatable.js +67 -8
  48. package/dist/esm/components/datatable/datatable.recipe.js +57 -2
  49. package/dist/esm/components/dialog/dialog.js +8 -5
  50. package/dist/esm/components/dialog/dialog.recipe.js +15 -1
  51. package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +12 -3
  52. package/dist/esm/components/tabletoolbar/tabletoolbar.js +231 -48
  53. package/dist/esm/components/tabletoolbar/tabletoolbar.recipe.js +44 -0
  54. package/dist/esm/components/tabs/tabs.recipe.js +11 -2
  55. package/dist/esm/components/tooltip/tooltip.js +23 -9
  56. package/dist/esm/components/tooltip/tooltip.recipe.js +10 -9
  57. package/dist/esm/product/authshell/authshell.js +15 -2
  58. package/dist/esm/product/authshell/authshell.recipe.js +13 -1
  59. package/dist/esm/product/authshell/index.js +1 -1
  60. package/dist/esm/product/board/board.js +122 -27
  61. package/dist/esm/product/board/board.recipe.js +14 -2
  62. package/dist/esm/product/comments/comments.js +23 -10
  63. package/dist/esm/product/comments/comments.recipe.js +17 -3
  64. package/dist/esm/product/formdialog/formdialog.js +10 -4
  65. package/dist/esm/product/navitem/index.js +1 -1
  66. package/dist/esm/product/navitem/navitem.js +7 -2
  67. package/dist/esm/product/navitem/navitem.recipe.js +16 -0
  68. package/dist/esm/product/objectsettings/index.js +1 -1
  69. package/dist/esm/product/objectsettings/objectsettings.js +2 -12
  70. package/dist/esm/product/richtext/richtext.js +76 -1
  71. package/dist/esm/product/sidebar/sidebar.js +69 -16
  72. package/dist/esm/product/sidebar/sidebar.recipe.js +6 -1
  73. package/dist/esm/tokens/palette.js +32 -1
  74. package/dist/esm/tokens/semantic.js +11 -0
  75. package/dist/native/tokens.d.ts +1 -1
  76. package/dist/native/tokens.js +16 -2
  77. package/dist/navitem.css +7 -0
  78. package/dist/navitem.layered.css +7 -0
  79. package/dist/recordstable.css +1 -1
  80. package/dist/recordstable.layered.css +1 -1
  81. package/dist/sidebar.css +6 -1
  82. package/dist/sidebar.layered.css +6 -1
  83. package/dist/styles.css +163 -42
  84. package/dist/styles.layered.css +163 -42
  85. package/dist/tabletoolbar.css +16 -1
  86. package/dist/tabletoolbar.layered.css +16 -1
  87. package/dist/tabs.css +1 -1
  88. package/dist/tabs.layered.css +1 -1
  89. package/dist/tokens.css +9 -1
  90. package/dist/tokens.json +16 -2
  91. package/dist/tooltip.css +1 -1
  92. package/dist/tooltip.layered.css +1 -1
  93. package/dist/types/components/badge/badge.recipe.d.ts +5 -1
  94. package/dist/types/components/button/button.recipe.d.ts +18 -5
  95. package/dist/types/components/datatable/datatable.d.ts +9 -0
  96. package/dist/types/components/dialog/dialog.d.ts +25 -2
  97. package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +43 -3
  98. package/dist/types/components/tooltip/tooltip.d.ts +12 -4
  99. package/dist/types/components/tooltip/tooltip.recipe.d.ts +1 -1
  100. package/dist/types/product/authshell/authshell.d.ts +26 -2
  101. package/dist/types/product/authshell/index.d.ts +1 -1
  102. package/dist/types/product/board/board.d.ts +5 -4
  103. package/dist/types/product/comments/comments.d.ts +10 -2
  104. package/dist/types/product/formdialog/formdialog.d.ts +2 -1
  105. package/dist/types/product/navitem/index.d.ts +1 -1
  106. package/dist/types/product/navitem/navitem.d.ts +23 -0
  107. package/dist/types/product/objectsettings/index.d.ts +1 -1
  108. package/dist/types/product/objectsettings/objectsettings.d.ts +0 -10
  109. package/dist/types/product/sidebar/sidebar.d.ts +33 -5
  110. package/dist/types/tokens/contract.d.ts +4 -0
  111. package/dist/types/tokens/palette.d.ts +13 -1
  112. package/dist/types/tokens/semantic.d.ts +11 -0
  113. package/package.json +1 -1
package/dist/tokens.css CHANGED
@@ -5,14 +5,18 @@
5
5
  --crisp-fg-on-tone: #101112;
6
6
  --crisp-bg-surface: #ffffff;
7
7
  --crisp-bg-raised: #f4f4f5;
8
+ --crisp-bg-surface-muted: #f6f7f7;
8
9
  --crisp-border-default: #e4e4e7;
9
10
  --crisp-border-subtle: #eeeff1;
10
11
  --crisp-border-dropzone: #e6e7ea;
12
+ --crisp-border-divider: #e6e7ea;
11
13
  --crisp-ring-neutral: transparent;
12
14
  --crisp-ring-field: rgba(0,0,0,0.06);
13
15
  --crisp-ring-switch: #d9dade;
14
16
  --crisp-bg-tile-active: #ffffff;
15
17
  --crisp-shadow-tile-active: rgba(0,0,0,0.04);
18
+ --crisp-bg-scrim: rgba(0,0,0,0.25);
19
+ --crisp-fg-alert-description: rgba(0,0,0,0.63);
16
20
  --crisp-bg-overlay-frost: #ffffff;
17
21
  --crisp-shadow-overlay1: rgba(28,40,64,0.12);
18
22
  --crisp-shadow-overlay2: rgba(28,40,64,0.16);
@@ -46,7 +50,7 @@
46
50
  --crisp-fg-success-soft: #186b3d;
47
51
  --crisp-fg-warning-soft: #80520d;
48
52
  --crisp-fg-danger-soft: #a33539;
49
- --crisp-fg-neutral-soft: #686870;
53
+ --crisp-fg-neutral-soft: #505155;
50
54
  --crisp-bg-purple-soft: #f5f0ff;
51
55
  --crisp-fg-purple-soft: #6238b5;
52
56
  --crisp-ring-purple-soft: #e8ddfe;
@@ -59,14 +63,18 @@
59
63
  --crisp-fg-on-tone: #101112;
60
64
  --crisp-bg-surface: #0a0a0a;
61
65
  --crisp-bg-raised: #101112;
66
+ --crisp-bg-surface-muted: #101112;
62
67
  --crisp-border-default: #212224;
63
68
  --crisp-border-subtle: #1c1d1f;
64
69
  --crisp-border-dropzone: #212224;
70
+ --crisp-border-divider: #212224;
65
71
  --crisp-ring-neutral: #212224;
66
72
  --crisp-ring-field: #212224;
67
73
  --crisp-ring-switch: #212224;
68
74
  --crisp-bg-tile-active: #101112;
69
75
  --crisp-shadow-tile-active: rgba(0,0,0,0);
76
+ --crisp-bg-scrim: rgba(0,0,0,0.55);
77
+ --crisp-fg-alert-description: rgba(255,255,255,0.6);
70
78
  --crisp-bg-overlay-frost: #1c1d1f;
71
79
  --crisp-shadow-overlay1: rgba(0,0,0,0.48);
72
80
  --crisp-shadow-overlay2: rgba(0,0,0,0.64);
package/dist/tokens.json CHANGED
@@ -7,14 +7,18 @@
7
7
  "fgOnTone": "#101112",
8
8
  "bgSurface": "#ffffff",
9
9
  "bgRaised": "#f4f4f5",
10
+ "bgSurfaceMuted": "#f6f7f7",
10
11
  "borderDefault": "#e4e4e7",
11
12
  "borderSubtle": "#eeeff1",
12
13
  "borderDropzone": "#e6e7ea",
14
+ "borderDivider": "#e6e7ea",
13
15
  "ringNeutral": "transparent",
14
16
  "ringField": "rgba(0,0,0,0.06)",
15
17
  "ringSwitch": "#d9dade",
16
18
  "bgTileActive": "#ffffff",
17
19
  "shadowTileActive": "rgba(0,0,0,0.04)",
20
+ "bgScrim": "rgba(0,0,0,0.25)",
21
+ "fgAlertDescription": "rgba(0,0,0,0.63)",
18
22
  "bgOverlayFrost": "#ffffff",
19
23
  "shadowOverlay1": "rgba(28,40,64,0.12)",
20
24
  "shadowOverlay2": "rgba(28,40,64,0.16)",
@@ -48,7 +52,7 @@
48
52
  "fgSuccessSoft": "#186b3d",
49
53
  "fgWarningSoft": "#80520d",
50
54
  "fgDangerSoft": "#a33539",
51
- "fgNeutralSoft": "#686870",
55
+ "fgNeutralSoft": "#505155",
52
56
  "bgPurpleSoft": "#f5f0ff",
53
57
  "fgPurpleSoft": "#6238b5",
54
58
  "ringPurpleSoft": "#e8ddfe"
@@ -60,14 +64,18 @@
60
64
  "fgOnTone": "#101112",
61
65
  "bgSurface": "#0a0a0a",
62
66
  "bgRaised": "#101112",
67
+ "bgSurfaceMuted": "#101112",
63
68
  "borderDefault": "#212224",
64
69
  "borderSubtle": "#1c1d1f",
65
70
  "borderDropzone": "#212224",
71
+ "borderDivider": "#212224",
66
72
  "ringNeutral": "#212224",
67
73
  "ringField": "#212224",
68
74
  "ringSwitch": "#212224",
69
75
  "bgTileActive": "#101112",
70
76
  "shadowTileActive": "rgba(0,0,0,0)",
77
+ "bgScrim": "rgba(0,0,0,0.55)",
78
+ "fgAlertDescription": "rgba(255,255,255,0.6)",
71
79
  "bgOverlayFrost": "#1c1d1f",
72
80
  "shadowOverlay1": "rgba(0,0,0,0.48)",
73
81
  "shadowOverlay2": "rgba(0,0,0,0.64)",
@@ -117,11 +125,14 @@
117
125
  "line200": "#e4e4e7",
118
126
  "line100": "#eeeff1",
119
127
  "line150": "#e6e7ea",
128
+ "gray25": "#f6f7f7",
120
129
  "ringNeutral": "transparent",
121
130
  "ringField": "rgba(0,0,0,0.06)",
122
131
  "ringSwitch": "#d9dade",
123
132
  "tileActive": "#ffffff",
124
133
  "tileActiveShadow": "rgba(0,0,0,0.04)",
134
+ "bgScrim": "rgba(0,0,0,0.25)",
135
+ "fgAlertDescription": "rgba(0,0,0,0.63)",
125
136
  "overlayFrost": "#ffffff",
126
137
  "shadowOverlay1": "rgba(28,40,64,0.12)",
127
138
  "shadowOverlay2": "rgba(28,40,64,0.16)",
@@ -155,7 +166,7 @@
155
166
  "softSuccessText": "#186b3d",
156
167
  "softWarningText": "#80520d",
157
168
  "softDangerText": "#a33539",
158
- "softNeutralText": "#686870",
169
+ "softNeutralText": "#505155",
159
170
  "purpleTint": "#f5f0ff",
160
171
  "softPurpleText": "#6238b5",
161
172
  "purpleRing": "#e8ddfe"
@@ -169,11 +180,14 @@
169
180
  "line200": "#212224",
170
181
  "line100": "#1c1d1f",
171
182
  "line150": "#212224",
183
+ "gray25": "#101112",
172
184
  "ringNeutral": "#212224",
173
185
  "ringField": "#212224",
174
186
  "ringSwitch": "#212224",
175
187
  "tileActive": "#101112",
176
188
  "tileActiveShadow": "rgba(0,0,0,0)",
189
+ "bgScrim": "rgba(0,0,0,0.55)",
190
+ "fgAlertDescription": "rgba(255,255,255,0.6)",
177
191
  "overlayFrost": "#1c1d1f",
178
192
  "shadowOverlay1": "rgba(0,0,0,0.48)",
179
193
  "shadowOverlay2": "rgba(0,0,0,0.64)",
package/dist/tooltip.css CHANGED
@@ -1,5 +1,5 @@
1
1
  .crisp-tooltip {
2
- position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1-5) var(--crisp-space-2); border-radius: var(--crisp-radius-md); background: #101112; color: #eeeff1; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
2
+ position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1-5) var(--crisp-space-2); border-radius: var(--crisp-radius-md); background: #101112; color: #eeeff1; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: rgb(33,34,36) 0 0 0 1px inset, rgba(0,0,0,0.04) 0 0 2px 0, rgba(0,0,0,0.12) 0 1px 3px 0; opacity: 1; transition: opacity 0.12s ease;
3
3
  @starting-style { opacity: 0; }
4
4
  & .crisp-tooltip-reference-row { display: inline-flex; align-items: center; gap: var(--crisp-space-1); }
5
5
  }
@@ -1,6 +1,6 @@
1
1
  @layer crisp-components {
2
2
  .crisp-tooltip {
3
- position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1-5) var(--crisp-space-2); border-radius: var(--crisp-radius-md); background: #101112; color: #eeeff1; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
3
+ position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1-5) var(--crisp-space-2); border-radius: var(--crisp-radius-md); background: #101112; color: #eeeff1; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: rgb(33,34,36) 0 0 0 1px inset, rgba(0,0,0,0.04) 0 0 2px 0, rgba(0,0,0,0.12) 0 1px 3px 0; opacity: 1; transition: opacity 0.12s ease;
4
4
  @starting-style { opacity: 0; }
5
5
  & .crisp-tooltip-reference-row { display: inline-flex; align-items: center; gap: var(--crisp-space-1); }
6
6
  }
@@ -7,7 +7,7 @@ declare const spec: {
7
7
  readonly gap: `var(--${string})`;
8
8
  readonly fontFamily: `var(--${string})`;
9
9
  readonly fontWeight: `var(--${string})`;
10
- readonly letterSpacing: "-0.1px";
10
+ readonly letterSpacing: "normal";
11
11
  readonly whiteSpace: "nowrap";
12
12
  };
13
13
  readonly parts: [{
@@ -59,18 +59,22 @@ declare const spec: {
59
59
  readonly height: "16px";
60
60
  readonly paddingInline: `var(--${string})`;
61
61
  readonly fontSize: `var(--${string})`;
62
+ readonly lineHeight: "16px";
62
63
  readonly borderRadius: `var(--${string})`;
63
64
  };
64
65
  readonly medium: {
65
66
  readonly height: "20px";
66
67
  readonly paddingInline: `var(--${string})`;
67
68
  readonly fontSize: `var(--${string})`;
69
+ readonly lineHeight: "16px";
70
+ readonly gap: "3px";
68
71
  readonly borderRadius: `var(--${string})`;
69
72
  };
70
73
  readonly large: {
71
74
  readonly height: `var(--${string})`;
72
75
  readonly paddingInline: "9px";
73
76
  readonly fontSize: `var(--${string})`;
77
+ readonly letterSpacing: "-0.1px";
74
78
  readonly borderRadius: `var(--${string})`;
75
79
  };
76
80
  };
@@ -7,7 +7,7 @@ declare const spec: {
7
7
  readonly gap: `var(--${string})`;
8
8
  readonly fontFamily: `var(--${string})`;
9
9
  readonly fontWeight: `var(--${string})`;
10
- readonly letterSpacing: "-0.14px";
10
+ readonly letterSpacing: "-0.07px";
11
11
  readonly lineHeight: "20px";
12
12
  readonly whiteSpace: "nowrap";
13
13
  readonly border: "none";
@@ -95,10 +95,23 @@ declare const spec: {
95
95
  readonly borderRadius: `var(--${string})`;
96
96
  };
97
97
  readonly md: {
98
- readonly height: "28px";
99
- readonly paddingInline: `var(--${string})`;
100
- readonly fontSize: `var(--${string})`;
101
- readonly borderRadius: `var(--${string})`;
98
+ readonly decls: {
99
+ readonly height: "28px";
100
+ readonly paddingInline: `var(--${string})`;
101
+ readonly fontSize: `var(--${string})`;
102
+ readonly borderRadius: `var(--${string})`;
103
+ };
104
+ readonly parts: [{
105
+ readonly selector: "&[data-icon-start]";
106
+ readonly decls: {
107
+ paddingInlineStart: `var(--${string})`;
108
+ };
109
+ }, {
110
+ readonly selector: "&[data-icon-end]";
111
+ readonly decls: {
112
+ paddingInlineEnd: `var(--${string})`;
113
+ };
114
+ }];
102
115
  };
103
116
  readonly lg: {
104
117
  readonly height: "40px";
@@ -144,6 +144,15 @@ export type DataTableColumn<T> = {
144
144
  managed?: boolean;
145
145
  /** Hidden from the grid but still listed in the column manager. */
146
146
  hidden?: boolean;
147
+ /** A "no-edit" marker icon before the resize handle, for a read-only/
148
+ * computed column (crisp/#596, checklist G-027 — seen live on Attio's
149
+ * "Connection strength"/"Last interaction"). Attio's own icon is
150
+ * proprietary and isn't reproduced (AUTHORING.md: never copy Attio's
151
+ * icon set); this uses a Lucide `Lock`, the same substitution every
152
+ * other crisp icon makes. Purely a visual marker — it does NOT disable
153
+ * editing on its own; a column that shouldn't be editable simply
154
+ * doesn't set `editable: true`, the same as any other column. */
155
+ readOnly?: boolean;
147
156
  /** `type: "entity"` only (#501) — makes the cell's name its own click
148
157
  * target, separate from the row's own `onRowClick`: the name renders as a
149
158
  * `stopPropagation`-guarded button instead of a plain span, the same
@@ -22,6 +22,25 @@ export type DialogProps = Omit<React.ComponentPropsWithoutRef<"div">, "title" |
22
22
  "aria-label"?: string;
23
23
  /** aria-label on the close button (default "Close") — override for non-English UIs. */
24
24
  closeLabel?: string;
25
+ /**
26
+ * `"panel"` (default): the frosted content dialog measured everywhere
27
+ * else in crisp — top-anchored 15vh from the viewport, a bordered
28
+ * header with a close button, `role="dialog"`.
29
+ *
30
+ * `"alert"` (crisp#677): a small confirm — Attio's own "Discard changes"
31
+ * measured live, both themes: vertically centered (not top-anchored), a
32
+ * plain `bgPopover` surface with `elevation.floating` (not the frosted
33
+ * bezel), `radius.xl` (12px, not the panel's 16px), NO close button, and
34
+ * `role="alertdialog"`. Pairs with `description` below — a plain
35
+ * `title` alone reads oddly stacked with no border under it, since the
36
+ * alert variant has no header chrome to separate title from body.
37
+ */
38
+ variant?: "panel" | "alert";
39
+ /** `variant="alert"` only: the confirm's body sentence, stacked directly
40
+ * under `title` with no divider (Attio's own two-line shape — a bold
41
+ * title, then a muted sentence). Wired to Zag's `getDescriptionProps()`
42
+ * so `aria-describedby` follows it automatically. */
43
+ description?: React.ReactNode;
25
44
  children?: React.ReactNode;
26
45
  };
27
46
  /**
@@ -29,7 +48,7 @@ export type DialogProps = Omit<React.ComponentPropsWithoutRef<"div">, "title" |
29
48
  * Escape / outside-click dismissal) with the measured modal surface.
30
49
  * Compose the body with `DialogBody` and actions with `DialogFooter`.
31
50
  */
32
- export declare function Dialog({ open, onOpenChange, title, icon, width, "aria-label": ariaLabel, closeLabel: closeLabelProp, children, className, style, "aria-describedby": describedBy, ...rest }: DialogProps): React.JSX.Element | null;
51
+ export declare function Dialog({ open, onOpenChange, title, icon, width, variant, description, "aria-label": ariaLabel, closeLabel: closeLabelProp, children, className, style, "aria-describedby": describedBy, ...rest }: DialogProps): React.JSX.Element | null;
33
52
  export declare namespace Dialog {
34
53
  var displayName: string;
35
54
  }
@@ -37,6 +56,10 @@ export declare function DialogBody({ children, className, }: {
37
56
  children?: React.ReactNode;
38
57
  className?: string;
39
58
  }): React.JSX.Element;
40
- export declare function DialogFooter({ children }: {
59
+ export declare function DialogFooter({ children, variant, }: {
41
60
  children?: React.ReactNode;
61
+ /** Matches the owning `Dialog`'s own `variant` (crisp#677) — `"alert"`
62
+ * is a shorter bar (45px vs. the panel's 56px) with uniform 8px padding
63
+ * instead of the panel's 0/16px, measured off Attio's discard confirm. */
64
+ variant?: "panel" | "alert";
42
65
  }): React.JSX.Element;
@@ -8,11 +8,21 @@ export type ToolbarSort = {
8
8
  key: string;
9
9
  dir: SortDir;
10
10
  };
11
- export type ToolbarFilterOp = "contains" | "doesnotcontain" | "startswith" | "endswith" | "is" | "isnot" | "isanyof" | "empty" | "notempty";
11
+ export type ToolbarFilterOp = "contains" | "doesnotcontain" | "startswith" | "endswith" | "is" | "isnot" | "isanyof" | "empty" | "notempty"
12
+ /** Number columns only (#593). */
13
+ | "lessthan" | "greaterthan"
14
+ /** Date columns only (#593). */
15
+ | "before" | "after";
12
16
  export type ToolbarFilter = {
13
17
  id: string;
14
18
  key: string;
15
- op: ToolbarFilterOp;
19
+ /**
20
+ * Unset right after the field is (re)chosen — measured live, 2026-09-25:
21
+ * Attio's own chip shows "Select condition" until an operator is actually
22
+ * picked, rather than defaulting silently to one. Once set, it never goes
23
+ * back to unset short of changing the field, which resets it.
24
+ */
25
+ op?: ToolbarFilterOp;
16
26
  value: string;
17
27
  /** Selected values for `"isanyof"` — ignored by every other op. */
18
28
  values?: string[];
@@ -29,6 +39,17 @@ export type TableToolbarColumn = {
29
39
  * for a free-text column; there is nothing to check off.
30
40
  */
31
41
  values?: string[];
42
+ /**
43
+ * The column's value kind, gating which operators (and which value editor)
44
+ * its condition offers (#593). Defaults to a free-text column: `contains`/
45
+ * `does not contain`/`starts with`/`ends with`/`is`/`is not`/`empty`/
46
+ * `not empty`. `"number"` swaps in `is`/`is not`/`less than`/`greater
47
+ * than`/`empty`/`not empty` with a spinner number input; `"date"` swaps in
48
+ * `is`/`is not`/`before`/`after`/`empty`/`not empty` with a calendar +
49
+ * Today/Tomorrow/Next week quick-picks — both sets, and the number
50
+ * spinner, measured live against Attio's own column-typed filter menus.
51
+ */
52
+ type?: "text" | "number" | "date";
32
53
  };
33
54
  export type TableToolbarProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
34
55
  /**
@@ -121,6 +142,25 @@ export type TableToolbarProps = Omit<React.ComponentPropsWithoutRef<"div">, "chi
121
142
  */
122
143
  inline?: boolean;
123
144
  className?: string;
145
+ /**
146
+ * Renders the Sort trigger (and its popover) when true (default). Set
147
+ * `false` for a table with no client-side sort at all — GRC's Audit log,
148
+ * server-filtered with nothing for a sort control to do, is the case that
149
+ * added this (your-moon/crisp#714, internal/grc !146): the trigger was
150
+ * inert chrome, not a real control. The divider that otherwise separates
151
+ * Sort from Filter is dropped along with it, so Filter becomes the row's
152
+ * first tool rather than leaving a leading divider with nothing before it.
153
+ */
154
+ showSort?: boolean;
155
+ /**
156
+ * Renders the View settings trigger (and its popover) when true (default).
157
+ * Set `false` when a consumer renders its own view-settings control —
158
+ * GRC's Tasks page (internal/grc !149) rendered its own alongside
159
+ * `TableToolbar`'s, ending up with two "View settings" buttons; this is
160
+ * the opt-out (your-moon/crisp#714). The divider that otherwise separates
161
+ * the filter chips from View settings is dropped along with it.
162
+ */
163
+ showViewSettings?: boolean;
124
164
  /**
125
165
  * The full set of attributes View settings offers — every attribute on
126
166
  * the object, shown or not. Defaults to `columns`. Omit both, along with
@@ -178,7 +218,7 @@ export declare function applySorts<T>(rows: T[], sorts: ToolbarSort[], get?: (ro
178
218
  * this (Sort: Due date/Assignee/Creation date; Filter: Assignee/Record/
179
219
  * Created by), which one shared list can't reproduce.
180
220
  */
181
- export declare function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: filterColumnsProp, sorts: sortsProp, defaultSorts, onSortsChange, filters: filtersProp, defaultFilters, onFiltersChange, count, children, helpHref, className, sortLabel: sortLabelProp, filterLabel: filterLabelProp, reorderSortLabel: reorderSortLabelProp, noSortsLabel: noSortsLabelProp, addSortLabel: addSortLabelProp, learnSortingLabel: learnSortingLabelProp, selectConditionLabel: selectConditionLabelProp, sortFieldLabel: sortFieldLabelProp, sortDirectionLabel: sortDirectionLabelProp, removeSortLabel: removeSortLabelProp, filterFieldLabel: filterFieldLabelProp, filterFieldPlaceholder: filterFieldPlaceholderProp, filterValuePlaceholder: filterValuePlaceholderProp, filterOptionsLabel: filterOptionsLabelProp, deleteFilterLabel: deleteFilterLabelProp, ascendingLabel: ascendingLabelProp, descendingLabel: descendingLabelProp, sortTriggerLabel, filterTriggerLabel, inline, viewColumns: viewColumnsProp, shownKeys: shownKeysProp, defaultShownKeys, onShownKeysChange, viewSettingsLabel: viewSettingsLabelProp, reorderAttributeLabel: reorderAttributeLabelProp, hideAttributeLabel, addAttributeToViewLabel: addAttributeToViewLabelProp, searchAttributesPlaceholder: searchAttributesPlaceholderProp, ...rest }: TableToolbarProps): React.JSX.Element;
221
+ export declare function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: filterColumnsProp, sorts: sortsProp, defaultSorts, onSortsChange, filters: filtersProp, defaultFilters, onFiltersChange, count, children, helpHref, className, sortLabel: sortLabelProp, filterLabel: filterLabelProp, reorderSortLabel: reorderSortLabelProp, noSortsLabel: noSortsLabelProp, addSortLabel: addSortLabelProp, learnSortingLabel: learnSortingLabelProp, selectConditionLabel: selectConditionLabelProp, sortFieldLabel: sortFieldLabelProp, sortDirectionLabel: sortDirectionLabelProp, removeSortLabel: removeSortLabelProp, filterFieldLabel: filterFieldLabelProp, filterFieldPlaceholder: filterFieldPlaceholderProp, filterValuePlaceholder: filterValuePlaceholderProp, filterOptionsLabel: filterOptionsLabelProp, deleteFilterLabel: deleteFilterLabelProp, ascendingLabel: ascendingLabelProp, descendingLabel: descendingLabelProp, sortTriggerLabel, filterTriggerLabel, inline, showSort, showViewSettings, viewColumns: viewColumnsProp, shownKeys: shownKeysProp, defaultShownKeys, onShownKeysChange, viewSettingsLabel: viewSettingsLabelProp, reorderAttributeLabel: reorderAttributeLabelProp, hideAttributeLabel, addAttributeToViewLabel: addAttributeToViewLabelProp, searchAttributesPlaceholder: searchAttributesPlaceholderProp, ...rest }: TableToolbarProps): React.JSX.Element;
182
222
  export type ToolbarToolProps = React.ComponentPropsWithoutRef<"button"> & {
183
223
  /** Drawn the way Sort/Filter are once a condition is set (#399). */
184
224
  active?: boolean;
@@ -11,8 +11,12 @@ export type TooltipProps = Omit<React.ComponentPropsWithoutRef<"span">, "content
11
11
  * renders and hovers correctly but can't carry either.
12
12
  */
13
13
  children: React.ReactNode;
14
- /** Preferred side; flips to the other axis end when there's no room. */
15
- side?: "top" | "bottom";
14
+ /** Preferred side; "top"/"bottom" flip to the other axis end when there's
15
+ * no room. "right" (crisp#633: the sidebar's hotkey hint, measured 8px off
16
+ * the trigger's end edge, vertically centred) never flips -- every known
17
+ * user pins its trigger to the viewport's left edge, so there is always
18
+ * room. */
19
+ side?: "top" | "bottom" | "right";
16
20
  /** Delay in ms before showing (default 350). Hides immediately. */
17
21
  delay?: number;
18
22
  /** Controlled open state. Omit to let Tooltip manage it (see defaultOpen).
@@ -71,8 +75,12 @@ export declare const Tooltip: React.ForwardRefExoticComponent<Omit<Omit<React.De
71
75
  * renders and hovers correctly but can't carry either.
72
76
  */
73
77
  children: React.ReactNode;
74
- /** Preferred side; flips to the other axis end when there's no room. */
75
- side?: "top" | "bottom";
78
+ /** Preferred side; "top"/"bottom" flip to the other axis end when there's
79
+ * no room. "right" (crisp#633: the sidebar's hotkey hint, measured 8px off
80
+ * the trigger's end edge, vertically centred) never flips -- every known
81
+ * user pins its trigger to the viewport's left edge, so there is always
82
+ * room. */
83
+ side?: "top" | "bottom" | "right";
76
84
  /** Delay in ms before showing (default 350). Hides immediately. */
77
85
  delay?: number;
78
86
  /** Controlled open state. Omit to let Tooltip manage it (see defaultOpen).
@@ -14,7 +14,7 @@ declare const spec: {
14
14
  readonly fontSize: `var(--${string})`;
15
15
  readonly fontWeight: `var(--${string})`;
16
16
  readonly lineHeight: "1.45";
17
- readonly boxShadow: "0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04)";
17
+ readonly boxShadow: "rgb(33,34,36) 0 0 0 1px inset, rgba(0,0,0,0.04) 0 0 2px 0, rgba(0,0,0,0.12) 0 1px 3px 0";
18
18
  readonly opacity: 1;
19
19
  readonly transition: "opacity 0.12s ease";
20
20
  };
@@ -1,9 +1,33 @@
1
1
  import type * as React from "react";
2
+ /**
3
+ * A multi-part brand mark — an icon badge beside a bold wordmark and an
4
+ * optional tagline (your-moon/crisp#728) — for a consumer whose logo isn't a
5
+ * single flat image the way Attio's own `/login` mark is. `AuthShell` lays
6
+ * this out itself (badge + two-line stack, `authshell.recipe.ts`), so a
7
+ * consumer never writes its own `style`/`className` to compose one. Not
8
+ * measured against Attio: its own login has no such compound mark, so
9
+ * there's nothing to measure past what `.crisp-authshell-logo` already
10
+ * establishes (the 24px floor, the 32px top margin).
11
+ */
12
+ export type AuthShellBrand = {
13
+ /** A small glyph, rendered inside a 32px rounded brand-tone badge. */
14
+ icon: React.ReactNode;
15
+ /** The bold wordmark line. */
16
+ title: React.ReactNode;
17
+ /** An optional second line under the wordmark. */
18
+ subtitle?: React.ReactNode;
19
+ };
2
20
  export type AuthShellProps = Omit<React.ComponentPropsWithoutRef<"div">, "title"> & {
3
21
  /** 0–1. Omit for no progress bar. */
4
22
  progress?: number;
5
- /** Brand mark above the card (measured 96x24). */
6
- logo?: React.ReactNode;
23
+ /** Brand mark above the card (measured 96x24 on Attio's own logged-out
24
+ * `/login`). The slot's own `min-height` is 24px, not a fixed height
25
+ * (your-moon/crisp#722) — a taller lockup (an icon beside a two-line
26
+ * wordmark, say) grows the slot instead of getting clipped to it. Pass a
27
+ * plain node for a single flat mark (Attio's own shape), or an
28
+ * `AuthShellBrand` (`{ icon, title, subtitle? }`, your-moon/crisp#728)
29
+ * for a compound one `AuthShell` lays out itself. */
30
+ logo?: React.ReactNode | AuthShellBrand;
7
31
  /** Card heading. */
8
32
  title?: React.ReactNode;
9
33
  /** The form / body content. */
@@ -1,2 +1,2 @@
1
- export { AuthShell, type AuthShellProps } from "./authshell";
1
+ export { AuthShell, type AuthShellBrand, type AuthShellProps, } from "./authshell";
2
2
  export { authshellRecipe } from "./authshell.recipe";
@@ -48,10 +48,11 @@ export type BoardProps<T extends BoardCard> = Omit<React.ComponentPropsWithoutRe
48
48
  className?: string;
49
49
  };
50
50
  /**
51
- * A kanban board with native drag-and-drop between columns. Cards are
52
- * `draggable`; dropping one on a column reparents it via `onCardsChange`
53
- * (the parent owns the cards, so the move is a controlled state update).
54
- * Measured from a deals pipeline.
51
+ * A kanban board with pointer-events drag-and-drop between columns (#674 —
52
+ * Attio's own mechanism, confirmed live: mousedown, several mousemoves,
53
+ * mouseup, no `[draggable]` anywhere). Dropping a card on a column reparents
54
+ * it via `onCardsChange` (the parent owns the cards, so the move is a
55
+ * controlled state update). Measured from a deals pipeline.
55
56
  */
56
57
  export declare function Board<T extends BoardCard>({ columns, cards, onCardsChange, renderCard, onNewCard, newCardLabel: newCardLabelProp, getCardLabel, announceMove: announceMoveProp, calc, className, ...rest }: BoardProps<T>): React.JSX.Element;
57
58
  export declare namespace Board {
@@ -99,11 +99,19 @@ export type CommentsPanelProps = Omit<React.ComponentPropsWithoutRef<"div">, "ch
99
99
  * live DOM, which is why a caret placed anywhere in the field, including
100
100
  * on top of a mention, can't corrupt what gets posted. */
101
101
  onPost: (text: string, threadId: string | null) => void;
102
- onReact: (threadId: string, commentId: string, emoji: string) => void;
102
+ /** Omit for a consumer with no reaction capability of its own (crisp#705's
103
+ * follow-up) — the hover "React" trigger and the reactions row's own
104
+ * "add" button both disappear, the same way omitting `onResolve` already
105
+ * drops "Resolve". Existing `comment.reactions` still render, read-only. */
106
+ onReact?: (threadId: string, commentId: string, emoji: string) => void;
103
107
  /** Resolving only ever applies to the thread as a whole (its root),
104
108
  * matching the live behaviour -- no per-reply resolve was found. */
105
109
  onResolve?: (threadId: string) => void;
106
- onDelete: (threadId: string, commentId: string) => void;
110
+ /** Omit for a consumer whose comments can't be deleted at all (crisp#705's
111
+ * follow-up — an audit-trail/sign-off record, e.g.) — the "Delete"
112
+ * item drops out of the row's "…" menu (Copy link, the only other item
113
+ * there, is unaffected) and the confirm dialog never opens. */
114
+ onDelete?: (threadId: string, commentId: string) => void;
107
115
  /** Defaults to copying `#comment-{commentId}` appended to the current
108
116
  * URL -- override for a real permalink scheme. */
109
117
  onCopyLink?: (threadId: string, commentId: string) => void;
@@ -34,6 +34,7 @@ export type FormDialogProps = Omit<React.ComponentPropsWithoutRef<"div">, "title
34
34
  createMoreLabel?: string;
35
35
  cancelLabel?: string;
36
36
  discardTitle?: string;
37
+ discardDescription?: string;
37
38
  discardConfirmLabel?: string;
38
39
  discardCancelLabel?: string;
39
40
  };
@@ -51,7 +52,7 @@ export type FormDialogProps = Omit<React.ComponentPropsWithoutRef<"div">, "title
51
52
  * per-field wiring). A record needs several fields at once to be valid,
52
53
  * which is why records are not created by inline editing.
53
54
  */
54
- export declare function FormDialog({ title, submitLabel, onSubmit, onClose, busy, error, children, wide, size, createMode, createMoreLabel: createMoreLabelProp, cancelLabel: cancelLabelProp, discardTitle: discardTitleProp, discardConfirmLabel: discardConfirmLabelProp, discardCancelLabel: discardCancelLabelProp, className, ...rest }: FormDialogProps): React.JSX.Element;
55
+ export declare function FormDialog({ title, submitLabel, onSubmit, onClose, busy, error, children, wide, size, createMode, createMoreLabel: createMoreLabelProp, cancelLabel: cancelLabelProp, discardTitle: discardTitleProp, discardDescription: discardDescriptionProp, discardConfirmLabel: discardConfirmLabelProp, discardCancelLabel: discardCancelLabelProp, className, ...rest }: FormDialogProps): React.JSX.Element;
55
56
  export declare namespace FormDialog {
56
57
  var displayName: string;
57
58
  }
@@ -1 +1 @@
1
- export { NavItem, type NavItemProps } from "./navitem";
1
+ export { NavItem, type NavItemProps, type NavItemShortcut, } from "./navitem";
@@ -1,4 +1,21 @@
1
1
  import * as React from "react";
2
+ /**
3
+ * A row's hotkey hint (crisp#633, P-108) -- Attio's own "G then <letter>"
4
+ * tooltip, measured live on `product/companies`, `/people`, `/home`, etc.
5
+ * `description` is the tooltip's full sentence ("Go to all companies page"),
6
+ * NOT derived from the row's `children` (the short label) -- Attio's copy
7
+ * differs per row ("Go to all companies page" vs "Go to home page") in a way
8
+ * a template can't guess. `keys` is the whole chord in press order
9
+ * (`["g","c"]`), lower-case, same as Attio's own DOM text -- the visible
10
+ * upper-case letters are a CSS `text-transform`, not the source text a
11
+ * screen reader gets. Only some rows have one: Deals/Users/Workspaces/Calls/
12
+ * Sequences/Workflows showed no tooltip at all after a 1.2s hover, measured
13
+ * across repeated attempts -- left unset rather than guessed.
14
+ */
15
+ export type NavItemShortcut = {
16
+ description: string;
17
+ keys: string[];
18
+ };
2
19
  export type NavItemProps = React.ComponentPropsWithoutRef<"a"> & {
3
20
  asChild?: boolean;
4
21
  active?: boolean;
@@ -6,6 +23,9 @@ export type NavItemProps = React.ComponentPropsWithoutRef<"a"> & {
6
23
  icon?: React.ReactNode;
7
24
  /** Right-aligned content (count badge / options). */
8
25
  trailing?: React.ReactNode;
26
+ /** The hotkey hint tooltip (see `NavItemShortcut`). Omit for no tooltip
27
+ * (unchanged default). */
28
+ shortcut?: NavItemShortcut;
9
29
  };
10
30
  export declare const NavItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref"> & {
11
31
  asChild?: boolean;
@@ -14,4 +34,7 @@ export declare const NavItem: React.ForwardRefExoticComponent<Omit<React.Detaile
14
34
  icon?: React.ReactNode;
15
35
  /** Right-aligned content (count badge / options). */
16
36
  trailing?: React.ReactNode;
37
+ /** The hotkey hint tooltip (see `NavItemShortcut`). Omit for no tooltip
38
+ * (unchanged default). */
39
+ shortcut?: NavItemShortcut;
17
40
  } & React.RefAttributes<HTMLAnchorElement>>;
@@ -1,2 +1,2 @@
1
- export { ATTRIBUTE_AI_AUTOFILL_OPTIONS, ATTRIBUTE_TYPE_OPTIONS, type AttributeRow, AttributesTable, type AttributesTableProps, type AttributeTypeOption, AttributeTypeSelect, type AttributeTypeSelectProps, CreateAttributeDialog, type CreateAttributeDialogProps, ObjectAppearanceSection, type ObjectAppearanceSectionProps, ObjectDetailPage, type ObjectDetailPageProps, type ObjectDetailTab, ObjectGeneralSection, type ObjectGeneralSectionProps, ObjectSettings, type ObjectSummary, ObjectsList, type ObjectsListProps, } from "./objectsettings";
1
+ export { ATTRIBUTE_AI_AUTOFILL_OPTIONS, ATTRIBUTE_TYPE_OPTIONS, type AttributeRow, AttributesTable, type AttributesTableProps, type AttributeTypeOption, AttributeTypeSelect, type AttributeTypeSelectProps, CreateAttributeDialog, type CreateAttributeDialogProps, ObjectAppearanceSection, type ObjectAppearanceSectionProps, ObjectDetailPage, type ObjectDetailPageProps, type ObjectDetailTab, ObjectGeneralSection, type ObjectGeneralSectionProps, type ObjectSummary, ObjectsList, type ObjectsListProps, } from "./objectsettings";
2
2
  export { objectsettingsRecipe } from "./objectsettings.recipe";
@@ -249,13 +249,3 @@ export declare function CreateAttributeDialog({ type, onTypeChange, typeOptions,
249
249
  export declare namespace CreateAttributeDialog {
250
250
  var displayName: string;
251
251
  }
252
- /**
253
- * This folder holds several components (`ObjectsList`, `ObjectDetailPage`,
254
- * `AttributesTable`, `CreateAttributeDialog`, …), not one named after the
255
- * slug — unlike every other product dir, whose docs `<ManualInstallation>`
256
- * resolves an import binding from the folder slug ("avatargroup" →
257
- * `AvatarGroup`) by reading this file's exports. This alias exists only so
258
- * that resolver finds a match for "objectsettings"; consumers should import
259
- * the real names above, never this one.
260
- */
261
- export declare const ObjectSettings: typeof ObjectsList;