@crisp-ui-kit/crisp 0.31.3 → 0.31.5
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/authshell.css +1 -1
- package/dist/cjs/components/accordion/accordion.js +1 -1
- package/dist/cjs/components/accordion/accordion.recipe.js +1 -1
- package/dist/cjs/components/avatargroup/avatargroup.js +1 -1
- package/dist/cjs/components/barchart/barchart.js +1 -1
- package/dist/cjs/components/barchart/barchart.recipe.js +1 -1
- package/dist/cjs/components/breadcrumb/breadcrumb.js +1 -1
- package/dist/cjs/components/breadcrumb/breadcrumb.recipe.js +1 -1
- package/dist/cjs/components/bulkbar/bulkbar.js +1 -1
- package/dist/cjs/components/bulkbar/bulkbar.recipe.js +1 -1
- package/dist/cjs/components/callout/callout.js +1 -1
- package/dist/cjs/components/callout/callout.recipe.js +1 -1
- package/dist/cjs/components/checkbox/checkbox.js +1 -1
- package/dist/cjs/components/checkbox/checkbox.recipe.js +1 -1
- package/dist/cjs/components/columncalc/columncalc.js +2 -2
- package/dist/cjs/components/columncalc/columncalc.recipe.js +2 -2
- package/dist/cjs/components/datatable/datatable.js +5 -5
- package/dist/cjs/components/datatable/datatable.recipe.js +5 -5
- package/dist/cjs/components/datepicker/datepicker.recipe.js +3 -3
- package/dist/cjs/components/datepickerfield/datepickerfield.js +1 -1
- package/dist/cjs/components/datepickerfield/datepickerfield.recipe.js +2 -2
- package/dist/cjs/components/dialog/dialog.js +1 -1
- package/dist/cjs/components/dialog/dialog.recipe.js +1 -1
- package/dist/cjs/components/donutchart/donutchart.js +1 -1
- package/dist/cjs/components/donutchart/donutchart.recipe.js +1 -1
- package/dist/cjs/components/emptystate/emptystate.recipe.js +2 -2
- package/dist/cjs/components/fileupload/fileupload.js +1 -1
- package/dist/cjs/components/fileupload/fileupload.recipe.js +6 -6
- package/dist/cjs/components/formfield/formfield.js +1 -1
- package/dist/cjs/components/formfield/formfield.recipe.js +1 -1
- package/dist/cjs/components/input/input.recipe.js +1 -1
- package/dist/cjs/components/linechart/linechart.js +1 -1
- package/dist/cjs/components/linechart/linechart.recipe.js +1 -1
- package/dist/cjs/components/menu/menu.js +1 -1
- package/dist/cjs/components/menu/menu.recipe.js +2 -2
- package/dist/cjs/components/multiselect/multiselect.js +1 -1
- package/dist/cjs/components/multiselect/multiselect.recipe.js +1 -1
- package/dist/cjs/components/progress/progress.recipe.js +1 -1
- package/dist/cjs/components/quantitypicker/quantitypicker.recipe.js +2 -2
- package/dist/cjs/components/radiogroup/radiogroup.js +1 -1
- package/dist/cjs/components/radiogroup/radiogroup.recipe.js +1 -1
- package/dist/cjs/components/resizablepanel/resizablepanel.js +1 -1
- package/dist/cjs/components/resizablepanel/resizablepanel.recipe.js +2 -2
- package/dist/cjs/components/segmented/segmented.js +1 -1
- package/dist/cjs/components/segmented/segmented.recipe.js +1 -1
- package/dist/cjs/components/select/select.js +1 -1
- package/dist/cjs/components/select/select.recipe.js +2 -2
- package/dist/cjs/components/slider/slider.recipe.js +2 -2
- package/dist/cjs/components/stagebar/stagebar.js +1 -1
- package/dist/cjs/components/stagebar/stagebar.recipe.js +1 -1
- package/dist/cjs/components/statcard/statcard.js +1 -1
- package/dist/cjs/components/statcard/statcard.recipe.js +2 -2
- package/dist/cjs/components/switch/switch.js +1 -1
- package/dist/cjs/components/switch/switch.recipe.js +1 -1
- package/dist/cjs/components/table/table.recipe.js +1 -1
- package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +2 -2
- package/dist/cjs/components/tabletoolbar/tabletoolbar.js +2 -2
- package/dist/cjs/components/tabletoolbar/tabletoolbar.recipe.js +1 -1
- package/dist/cjs/components/tabs/tabs.js +2 -2
- package/dist/cjs/components/tabs/tabs.recipe.js +1 -1
- package/dist/cjs/components/textarea/textarea.js +1 -1
- package/dist/cjs/components/textarea/textarea.recipe.js +1 -1
- package/dist/cjs/components/tooltip/tooltip.js +1 -1
- package/dist/cjs/components/tooltip/tooltip.recipe.js +1 -1
- package/dist/cjs/product/appshell/appshell.js +4 -4
- package/dist/cjs/product/appshell/appshell.recipe.js +1 -1
- package/dist/cjs/product/authshell/authshell.js +1 -1
- package/dist/cjs/product/authshell/authshell.recipe.js +3 -3
- package/dist/cjs/product/board/board.js +1 -1
- package/dist/cjs/product/board/board.recipe.js +1 -1
- package/dist/cjs/product/command/command.js +1 -1
- package/dist/cjs/product/entitycard/entitycard.js +1 -1
- package/dist/cjs/product/entitycard/entitycard.recipe.js +1 -1
- package/dist/cjs/product/flowcanvas/flowcanvas.js +1 -1
- package/dist/cjs/product/flowcanvas/flowcanvas.recipe.js +1 -1
- package/dist/cjs/product/inbox/inbox.js +1 -1
- package/dist/cjs/product/inbox/inbox.recipe.js +1 -1
- package/dist/cjs/product/listpage/listpage.js +1 -1
- package/dist/cjs/product/listpage/listpage.recipe.js +1 -1
- package/dist/cjs/product/onboarding/onboarding.js +1 -1
- package/dist/cjs/product/onboarding/onboarding.recipe.js +1 -1
- package/dist/cjs/product/recordpage/recordpage.js +7 -7
- package/dist/cjs/product/recordpage/recordpage.recipe.js +2 -2
- package/dist/cjs/product/recordpanel/recordpanel.recipe.js +1 -1
- package/dist/cjs/product/recordstable/recordstable.js +9 -9
- package/dist/cjs/product/recordstable/recordstable.recipe.js +2 -2
- package/dist/cjs/product/recordstable/recordstable.tag.js +1 -1
- package/dist/cjs/product/richtext/richtext.js +1 -1
- package/dist/cjs/product/richtext/richtext.recipe.js +1 -1
- package/dist/cjs/product/settingssection/settingssection.js +1 -1
- package/dist/cjs/product/settingssection/settingssection.recipe.js +1 -1
- package/dist/cjs/product/settingsshell/settingsshell.js +1 -1
- package/dist/cjs/product/settingsshell/settingsshell.recipe.js +2 -2
- package/dist/cjs/product/sidebar/sidebar.js +6 -6
- package/dist/cjs/product/tasklist/tasklist.js +1 -1
- package/dist/cjs/product/tasklist/tasklist.recipe.js +1 -1
- package/dist/cjs/product/trialbanner/trialbanner.js +1 -1
- package/dist/cjs/product/trialbanner/trialbanner.recipe.js +2 -2
- package/dist/cjs/product/viewtoggle/viewtoggle.js +1 -1
- package/dist/cjs/product/viewtoggle/viewtoggle.recipe.js +1 -1
- package/dist/columncalc.css +1 -1
- package/dist/datatable.css +5 -5
- package/dist/esm/components/accordion/accordion.js +1 -1
- package/dist/esm/components/accordion/accordion.recipe.js +1 -1
- package/dist/esm/components/avatargroup/avatargroup.js +1 -1
- package/dist/esm/components/barchart/barchart.js +1 -1
- package/dist/esm/components/barchart/barchart.recipe.js +1 -1
- package/dist/esm/components/breadcrumb/breadcrumb.js +1 -1
- package/dist/esm/components/breadcrumb/breadcrumb.recipe.js +1 -1
- package/dist/esm/components/bulkbar/bulkbar.js +1 -1
- package/dist/esm/components/bulkbar/bulkbar.recipe.js +1 -1
- package/dist/esm/components/callout/callout.js +1 -1
- package/dist/esm/components/callout/callout.recipe.js +1 -1
- package/dist/esm/components/checkbox/checkbox.js +1 -1
- package/dist/esm/components/checkbox/checkbox.recipe.js +1 -1
- package/dist/esm/components/columncalc/columncalc.js +2 -2
- package/dist/esm/components/columncalc/columncalc.recipe.js +2 -2
- package/dist/esm/components/datatable/datatable.js +5 -5
- package/dist/esm/components/datatable/datatable.recipe.js +5 -5
- package/dist/esm/components/datepicker/datepicker.recipe.js +3 -3
- package/dist/esm/components/datepickerfield/datepickerfield.js +1 -1
- package/dist/esm/components/datepickerfield/datepickerfield.recipe.js +2 -2
- package/dist/esm/components/dialog/dialog.js +1 -1
- package/dist/esm/components/dialog/dialog.recipe.js +1 -1
- package/dist/esm/components/donutchart/donutchart.js +1 -1
- package/dist/esm/components/donutchart/donutchart.recipe.js +1 -1
- package/dist/esm/components/emptystate/emptystate.recipe.js +2 -2
- package/dist/esm/components/fileupload/fileupload.js +1 -1
- package/dist/esm/components/fileupload/fileupload.recipe.js +6 -6
- package/dist/esm/components/formfield/formfield.js +1 -1
- package/dist/esm/components/formfield/formfield.recipe.js +1 -1
- package/dist/esm/components/input/input.recipe.js +1 -1
- package/dist/esm/components/linechart/linechart.js +1 -1
- package/dist/esm/components/linechart/linechart.recipe.js +1 -1
- package/dist/esm/components/menu/menu.js +1 -1
- package/dist/esm/components/menu/menu.recipe.js +2 -2
- package/dist/esm/components/multiselect/multiselect.js +1 -1
- package/dist/esm/components/multiselect/multiselect.recipe.js +1 -1
- package/dist/esm/components/progress/progress.recipe.js +1 -1
- package/dist/esm/components/quantitypicker/quantitypicker.recipe.js +2 -2
- package/dist/esm/components/radiogroup/radiogroup.js +1 -1
- package/dist/esm/components/radiogroup/radiogroup.recipe.js +1 -1
- package/dist/esm/components/resizablepanel/resizablepanel.js +1 -1
- package/dist/esm/components/resizablepanel/resizablepanel.recipe.js +2 -2
- package/dist/esm/components/segmented/segmented.js +1 -1
- package/dist/esm/components/segmented/segmented.recipe.js +1 -1
- package/dist/esm/components/select/select.js +1 -1
- package/dist/esm/components/select/select.recipe.js +2 -2
- package/dist/esm/components/slider/slider.recipe.js +2 -2
- package/dist/esm/components/stagebar/stagebar.js +1 -1
- package/dist/esm/components/stagebar/stagebar.recipe.js +1 -1
- package/dist/esm/components/statcard/statcard.js +1 -1
- package/dist/esm/components/statcard/statcard.recipe.js +2 -2
- package/dist/esm/components/switch/switch.js +1 -1
- package/dist/esm/components/switch/switch.recipe.js +1 -1
- package/dist/esm/components/table/table.recipe.js +1 -1
- package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +2 -2
- package/dist/esm/components/tabletoolbar/tabletoolbar.js +2 -2
- package/dist/esm/components/tabletoolbar/tabletoolbar.recipe.js +1 -1
- package/dist/esm/components/tabs/tabs.js +2 -2
- package/dist/esm/components/tabs/tabs.recipe.js +1 -1
- package/dist/esm/components/textarea/textarea.js +1 -1
- package/dist/esm/components/textarea/textarea.recipe.js +1 -1
- package/dist/esm/components/tooltip/tooltip.js +1 -1
- package/dist/esm/components/tooltip/tooltip.recipe.js +1 -1
- package/dist/esm/product/appshell/appshell.js +4 -4
- package/dist/esm/product/appshell/appshell.recipe.js +1 -1
- package/dist/esm/product/authshell/authshell.js +1 -1
- package/dist/esm/product/authshell/authshell.recipe.js +3 -3
- package/dist/esm/product/board/board.js +1 -1
- package/dist/esm/product/board/board.recipe.js +1 -1
- package/dist/esm/product/command/command.js +1 -1
- package/dist/esm/product/entitycard/entitycard.js +1 -1
- package/dist/esm/product/entitycard/entitycard.recipe.js +1 -1
- package/dist/esm/product/flowcanvas/flowcanvas.js +1 -1
- package/dist/esm/product/flowcanvas/flowcanvas.recipe.js +1 -1
- package/dist/esm/product/inbox/inbox.js +1 -1
- package/dist/esm/product/inbox/inbox.recipe.js +1 -1
- package/dist/esm/product/listpage/listpage.js +1 -1
- package/dist/esm/product/listpage/listpage.recipe.js +1 -1
- package/dist/esm/product/onboarding/onboarding.js +1 -1
- package/dist/esm/product/onboarding/onboarding.recipe.js +1 -1
- package/dist/esm/product/recordpage/recordpage.js +7 -7
- package/dist/esm/product/recordpage/recordpage.recipe.js +2 -2
- package/dist/esm/product/recordpanel/recordpanel.recipe.js +1 -1
- package/dist/esm/product/recordstable/recordstable.js +9 -9
- package/dist/esm/product/recordstable/recordstable.recipe.js +2 -2
- package/dist/esm/product/recordstable/recordstable.tag.js +1 -1
- package/dist/esm/product/richtext/richtext.js +1 -1
- package/dist/esm/product/richtext/richtext.recipe.js +1 -1
- package/dist/esm/product/settingssection/settingssection.js +1 -1
- package/dist/esm/product/settingssection/settingssection.recipe.js +1 -1
- package/dist/esm/product/settingsshell/settingsshell.js +1 -1
- package/dist/esm/product/settingsshell/settingsshell.recipe.js +2 -2
- package/dist/esm/product/sidebar/sidebar.js +6 -6
- package/dist/esm/product/tasklist/tasklist.js +1 -1
- package/dist/esm/product/tasklist/tasklist.recipe.js +1 -1
- package/dist/esm/product/trialbanner/trialbanner.js +1 -1
- package/dist/esm/product/trialbanner/trialbanner.recipe.js +2 -2
- package/dist/esm/product/viewtoggle/viewtoggle.js +1 -1
- package/dist/esm/product/viewtoggle/viewtoggle.recipe.js +1 -1
- package/dist/fileupload.css +2 -2
- package/dist/recordpage.css +1 -1
- package/dist/recordstable.css +1 -1
- package/dist/settingsshell.css +1 -1
- package/dist/styles.css +12 -12
- package/dist/types/components/avatargroup/avatargroup.d.ts +1 -1
- package/dist/types/components/barchart/barchart.d.ts +1 -1
- package/dist/types/components/breadcrumb/breadcrumb.d.ts +1 -1
- package/dist/types/components/bulkbar/bulkbar.d.ts +1 -1
- package/dist/types/components/callout/callout.d.ts +1 -1
- package/dist/types/components/checkbox/checkbox.d.ts +1 -1
- package/dist/types/components/columncalc/columncalc.d.ts +5 -5
- package/dist/types/components/datatable/datatable.d.ts +5 -5
- package/dist/types/components/datepickerfield/datepickerfield.d.ts +1 -1
- package/dist/types/components/dialog/dialog.d.ts +1 -1
- package/dist/types/components/donutchart/donutchart.d.ts +1 -1
- package/dist/types/components/emptystate/emptystate.d.ts +1 -1
- package/dist/types/components/formfield/formfield.d.ts +1 -1
- package/dist/types/components/linechart/linechart.d.ts +1 -1
- package/dist/types/components/menu/menu.d.ts +1 -1
- package/dist/types/components/multiselect/multiselect.d.ts +1 -1
- package/dist/types/components/progress/progress.d.ts +1 -1
- package/dist/types/components/radiogroup/radiogroup.d.ts +1 -1
- package/dist/types/components/resizablepanel/resizablepanel.d.ts +4 -4
- package/dist/types/components/segmented/segmented.d.ts +1 -1
- package/dist/types/components/select/select.d.ts +2 -2
- package/dist/types/components/stagebar/stagebar.d.ts +1 -1
- package/dist/types/components/statcard/statcard.d.ts +1 -1
- package/dist/types/components/switch/switch.d.ts +1 -1
- package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +1 -1
- package/dist/types/components/tabs/tabs.d.ts +2 -2
- package/dist/types/components/textarea/textarea.d.ts +1 -1
- package/dist/types/components/tooltip/tooltip.d.ts +1 -1
- package/dist/types/product/appshell/appshell.d.ts +2 -2
- package/dist/types/product/authshell/authshell.d.ts +1 -1
- package/dist/types/product/board/board.d.ts +1 -1
- package/dist/types/product/entitycard/entitycard.d.ts +1 -1
- package/dist/types/product/flowcanvas/flowcanvas.d.ts +1 -1
- package/dist/types/product/inbox/inbox.d.ts +1 -1
- package/dist/types/product/listpage/listpage.d.ts +1 -1
- package/dist/types/product/onboarding/onboarding.d.ts +1 -1
- package/dist/types/product/recordpage/recordpage.d.ts +2 -2
- package/dist/types/product/recordstable/recordstable.d.ts +10 -4
- package/dist/types/product/recordstable/recordstable.tag.d.ts +1 -1
- package/dist/types/product/richtext/richtext.d.ts +1 -1
- package/dist/types/product/settingssection/settingssection.d.ts +1 -1
- package/dist/types/product/settingsshell/settingsshell.d.ts +1 -1
- package/dist/types/product/sidebar/sidebar.d.ts +10 -10
- package/dist/types/product/tasklist/tasklist.d.ts +1 -1
- package/dist/types/product/trialbanner/trialbanner.d.ts +1 -1
- package/dist/types/product/viewtoggle/viewtoggle.d.ts +1 -1
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ export function ListRow({ children, onClick, }) {
|
|
|
9
9
|
return _jsx("div", { className: "listpage-row", children: children });
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* The entity-list page shell — measured from
|
|
12
|
+
* The entity-list page shell — measured from Reports/Sequences/Tasks/
|
|
13
13
|
* Notes list views. A view-bar toolbar (leading/trailing slots + record count),
|
|
14
14
|
* an optional dashed Favorites region, then column headers and time-grouped
|
|
15
15
|
* rows. Rows are composed by the caller (wrap each in <ListRow>).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// The entity-list page shell — measured from
|
|
3
|
+
// The entity-list page shell — measured from Reports / Sequences / Tasks
|
|
4
4
|
// / Notes list views: a view-bar toolbar (leading Sort/Filter, trailing view
|
|
5
5
|
// toggle / settings / New, and a record count), an optional dashed "Favorites"
|
|
6
6
|
// region, then a list with column headers and time-grouped 52px rows.
|
|
@@ -11,7 +11,7 @@ export const onboardingLabels = {
|
|
|
11
11
|
completedStepLabel: (label) => `${String(label)} — completed`,
|
|
12
12
|
};
|
|
13
13
|
/**
|
|
14
|
-
* An onboarding checklist card — measured from
|
|
14
|
+
* An onboarding checklist card — measured from a floating "Getting
|
|
15
15
|
* started" widget. Title + optional menu/minimize, a segmented progress bar,
|
|
16
16
|
* and step rows (completed rows strike through with a brand check).
|
|
17
17
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// An onboarding checklist card — measured from
|
|
3
|
+
// An onboarding checklist card — measured from a floating "Getting started"
|
|
4
4
|
// widget: a title + menu/minimize header, a "N/total steps" subtitle, a
|
|
5
5
|
// segmented progress bar (filled pills brand, rest 4% ink), then step rows with
|
|
6
6
|
// an icon + label; completed rows strike through and show a brand check.
|
|
@@ -26,7 +26,7 @@ export const recordPageLabels = {
|
|
|
26
26
|
exitFullScreen: "Exit full screen",
|
|
27
27
|
resizeDetails: "Resize details column",
|
|
28
28
|
composeEmail: "Compose email",
|
|
29
|
-
askAttio: "Ask
|
|
29
|
+
askAttio: "Ask AI",
|
|
30
30
|
addToList: "Add to list",
|
|
31
31
|
noLists: "This record has not been added to any lists.",
|
|
32
32
|
highlights: "Highlights",
|
|
@@ -146,7 +146,7 @@ function EmptyCard({ icon, children, }) {
|
|
|
146
146
|
return (_jsxs("div", { className: "recordpage-emptycard", children: [icon, children] }));
|
|
147
147
|
}
|
|
148
148
|
/**
|
|
149
|
-
* The full-page company record view — the page
|
|
149
|
+
* The full-page company record view — the page that opens when you click into a
|
|
150
150
|
* record (as opposed to the peek [RecordPanel]). A top breadcrumb bar with
|
|
151
151
|
* favourite/edit/compose/… actions, a 320px left attribute column, and a tabbed
|
|
152
152
|
* main area: Overview stacks Highlights, an Activity feed, and Notes / Tasks /
|
|
@@ -171,12 +171,12 @@ export function RecordPage({ record, columns, collection = "Records", labels, on
|
|
|
171
171
|
const [notes, setNotes] = React.useState([]);
|
|
172
172
|
const [tasks, setTasks] = React.useState([]);
|
|
173
173
|
const [showAllActivity, setShowAllActivity] = React.useState(false);
|
|
174
|
-
// Collapsible + searchable Record Details
|
|
174
|
+
// Collapsible + searchable Record Details.
|
|
175
175
|
const [detailsOpen, setDetailsOpen] = React.useState(true);
|
|
176
176
|
const [searchOpen, setSearchOpen] = React.useState(false);
|
|
177
177
|
const [fieldQuery, setFieldQuery] = React.useState("");
|
|
178
178
|
const [showAllValues, setShowAllValues] = React.useState(false);
|
|
179
|
-
// Drag-resizable left details column
|
|
179
|
+
// Drag-resizable left details column.
|
|
180
180
|
const [detailsW, setDetailsW] = React.useState(320);
|
|
181
181
|
const [resizing, setResizing] = React.useState(false);
|
|
182
182
|
const dragRef = React.useRef(null);
|
|
@@ -217,14 +217,14 @@ export function RecordPage({ record, columns, collection = "Records", labels, on
|
|
|
217
217
|
const matchedFields = q
|
|
218
218
|
? fields.filter((col) => col.label.toLowerCase().includes(q))
|
|
219
219
|
: fields;
|
|
220
|
-
//
|
|
220
|
+
// Shows the first 5 fields; "View all values" reveals the rest.
|
|
221
221
|
const FIELD_LIMIT = 5;
|
|
222
222
|
const canRevealFields = !q && matchedFields.length > FIELD_LIMIT;
|
|
223
223
|
const shownFields = canRevealFields && !showAllValues
|
|
224
224
|
? matchedFields.slice(0, FIELD_LIMIT)
|
|
225
225
|
: matchedFields;
|
|
226
226
|
const byKey = React.useMemo(() => new Map(columns.map((col) => [col.key, col])), [columns]);
|
|
227
|
-
//
|
|
227
|
+
// The Overview "Highlights" — a fixed set of enrichment stats (measured
|
|
228
228
|
// from the live app), a couple derived from the record, the rest empty.
|
|
229
229
|
const arrVal = record.arr;
|
|
230
230
|
const empVal = record.employees;
|
|
@@ -369,7 +369,7 @@ export function RecordPage({ record, columns, collection = "Records", labels, on
|
|
|
369
369
|
setDetailsOpen(true);
|
|
370
370
|
}, children: searchOpen ? (_jsx(X, { size: 14, strokeWidth: 1.75 })) : (_jsx(Search, { size: 14, strokeWidth: 1.75 })) })] }), detailsOpen &&
|
|
371
371
|
(shownFields.length > 0 ? (_jsxs(_Fragment, { children: [shownFields.map((col) => (_jsxs("div", { className: "recordpage-field", children: [_jsxs("span", { className: "recordpage-field-label", children: [col.icon ? (_jsx(col.icon, { size: 15, strokeWidth: 1.75 })) : null, _jsx("span", { className: "recordpage-field-label-text", children: col.label })] }), _jsx("span", { className: "recordpage-field-value", children: _jsx(FieldValue, { col: col, row: record, labels: t }) })] }, col.key))), canRevealFields && (_jsx("button", { type: "button", className: "recordpage-viewall recordpage-viewall--section", onClick: () => {
|
|
372
|
-
//
|
|
372
|
+
// Revealing all fields also opens the (focused)
|
|
373
373
|
// field search; collapsing closes it.
|
|
374
374
|
const next = !showAllValues;
|
|
375
375
|
setShowAllValues(next);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c, elevation as e } from "../../tokens/index.js";
|
|
3
|
-
// The full-page company record view
|
|
3
|
+
// The full-page company record view opened when you click into a record —
|
|
4
4
|
// measured from the live app. A slim top bar (breadcrumb · logo · name 16/600 ·
|
|
5
5
|
// actions), then a two-column body: a 320px left "Record Details" attribute
|
|
6
6
|
// column (transparent, border-right) and a flexible main area whose tab bar
|
|
@@ -50,7 +50,7 @@ const config = defineRecipe({
|
|
|
50
50
|
& .recordpage-section { padding-top: ${c.space["2"]}; }
|
|
51
51
|
& .recordpage-section-title { font-size: ${c.text.sm}; font-weight: ${c.weight.medium}; letter-spacing: -0.12px; color: color-mix(in srgb, ${c.fgPrimary} 63%, transparent); padding: ${c.space["1"]}; }
|
|
52
52
|
/* main-area section headers (Highlights / Activity / Emails / Notes / Tasks)
|
|
53
|
-
are 14px
|
|
53
|
+
are 14px; the left column's (Record Details / Lists) stay 12px. */
|
|
54
54
|
& .recordpage-main .recordpage-section-title { font-size: ${c.text.lg}; }
|
|
55
55
|
& .recordpage-detailhead { display: flex; align-items: center; gap: ${c.space["0.5"]}; margin-bottom: ${c.space["3"]}; padding-inline-end: ${c.space["0.5"]}; }
|
|
56
56
|
& .recordpage-collapse { display: inline-flex; align-items: center; gap: 2px; flex: 1; min-width: 0; margin: 0; border: none; background: none; padding: ${c.space["1"]}; border-radius: ${c.radius.md}; font-family: inherit; font-size: ${c.text.sm}; font-weight: ${c.weight.medium}; letter-spacing: -0.12px; color: ${c.fgMuted}; cursor: pointer; text-align: start; }
|
|
@@ -2,7 +2,7 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
|
2
2
|
import { contract as c, elevation as e } from "../../tokens/index.js";
|
|
3
3
|
import { recordTagCss } from "../recordstable/recordstable.tag.js";
|
|
4
4
|
// A right-side record peek panel — slides in over the main content to show one
|
|
5
|
-
// record's fields, the way
|
|
5
|
+
// record's fields, the way a row peek panel opens. Positioned absolutely inside a
|
|
6
6
|
// relative container (the app main area); slides in via @starting-style.
|
|
7
7
|
const config = defineRecipe({
|
|
8
8
|
name: "recordpanel",
|
|
@@ -271,7 +271,7 @@ function CellView({ column, row, pinned, onOpenPage, avatarTone = "brand", label
|
|
|
271
271
|
}
|
|
272
272
|
// Always-interactive cell editors for the picker column types (status / date /
|
|
273
273
|
// reference). Each is a ghost crisp control that reads the cell value and
|
|
274
|
-
// commits the new one — matching
|
|
274
|
+
// commits the new one — matching measured inline field editors.
|
|
275
275
|
function StatusCell({ column, row, onChange, }) {
|
|
276
276
|
return (_jsx(Select, { variant: "ghost", "aria-label": column.label, placeholder: "\u2014", value: row[column.key] ?? undefined, onValueChange: onChange, options: column.options ?? [] }));
|
|
277
277
|
}
|
|
@@ -288,8 +288,8 @@ function TagsCell({ column, row, options, onChange, labels, }) {
|
|
|
288
288
|
/**
|
|
289
289
|
* A date-only cell is a CALENDAR DATE, not an instant. ECMA-262 parses the
|
|
290
290
|
* date-only ISO forms — `1998`, `1998-09`, `1998-09-04` — as UTC midnight, and
|
|
291
|
-
* the field then renders that instant in the reader's own timezone.
|
|
292
|
-
*
|
|
291
|
+
* the field then renders that instant in the reader's own timezone. A
|
|
292
|
+
* `founded: "1998"` field therefore read **Dec 31, 1997** for every reader west
|
|
293
293
|
* of UTC, at every hour of every day, and a date picked east of UTC
|
|
294
294
|
* round-tripped back a day short through `toISOString()` (#220).
|
|
295
295
|
*
|
|
@@ -318,7 +318,7 @@ function DateCell({ column, row, onChange, }) {
|
|
|
318
318
|
return (_jsx(DatePickerField, { variant: "ghost", "aria-label": column.label, value: value, onChange: (d) => onChange(formatCellDate(d)) }));
|
|
319
319
|
}
|
|
320
320
|
/**
|
|
321
|
-
* The "New <object>" create modal — measured from
|
|
321
|
+
* The "New <object>" create modal — measured from a create-record dialog:
|
|
322
322
|
* a stacked label + "Set …" input per column, a "Create more" toggle, and a
|
|
323
323
|
* primary "Create record" action (⌘↵). Building the row mirrors the inline
|
|
324
324
|
* editor's per-type coercion so a created record reads back like an edited one.
|
|
@@ -378,7 +378,7 @@ function CreateRecordDialog({ open, onOpenChange, columns, entityLabel, onCreate
|
|
|
378
378
|
} })] }, col.key))) }), _jsxs(DialogFooter, { children: [_jsxs("span", { className: "dialog-more", children: [labels.createMore, _jsx(Switch, { checked: createMore, onCheckedChange: setCreateMore, "aria-label": labels.createMore })] }), _jsxs("button", { type: "button", className: "dialog-submit", onClick: submit, children: [labels.createRecord, _jsx("span", { className: "dialog-submit-key", children: "\u2318\u21B5" })] })] })] }));
|
|
379
379
|
}
|
|
380
380
|
/**
|
|
381
|
-
*
|
|
381
|
+
* A measured-style record grid — fully featured. Toolbar (search / sort status /
|
|
382
382
|
* count / New), sticky checkbox + entity columns, 36px rows, typed cells,
|
|
383
383
|
* click-to-sort headers, column resize by dragging a header edge, inline cell
|
|
384
384
|
* editing (double-click a text/number/url/date cell), add-row and add-column,
|
|
@@ -397,13 +397,13 @@ export function RecordsTable({ labels, columns: columnsProp = defaultColumns, ro
|
|
|
397
397
|
// because a caller passing a stable array never triggers this.
|
|
398
398
|
React.useEffect(() => setCols(columnsProp), [columnsProp]);
|
|
399
399
|
React.useEffect(() => setData(rowsProp), [rowsProp]);
|
|
400
|
-
//
|
|
400
|
+
// Multi-criteria sort: an ordered list of {field, direction} rows.
|
|
401
401
|
const [sorts, setSorts] = React.useState([]);
|
|
402
402
|
const [dragSort, setDragSort] = React.useState(null);
|
|
403
403
|
const [editing, setEditing] = React.useState(null);
|
|
404
404
|
const [renamingCol, setRenamingCol] = React.useState(null);
|
|
405
405
|
const [creating, setCreating] = React.useState(false);
|
|
406
|
-
//
|
|
406
|
+
// A measured-style filter: an ordered list of conditions, each shown as a toolbar
|
|
407
407
|
// chip with an editable value (operator is "contains")
|
|
408
408
|
const [filterConds, setFilterConds] = React.useState([]);
|
|
409
409
|
const [filterQuery, setFilterQuery] = React.useState("");
|
|
@@ -694,7 +694,7 @@ export function RecordsTable({ labels, columns: columnsProp = defaultColumns, ro
|
|
|
694
694
|
* `nearest` on both axes: a cell already in view is left exactly where it
|
|
695
695
|
* is, which is what makes this safe to run after a click too.
|
|
696
696
|
*
|
|
697
|
-
* No `behavior` of our own — the page's `scroll-behavior` decides, and
|
|
697
|
+
* No `behavior` of our own — the page's `scroll-behavior` decides, and it
|
|
698
698
|
* jumps rather than glides — except under reduced motion, where an explicit
|
|
699
699
|
* "auto" is the only thing that beats a host page that set
|
|
700
700
|
* `scroll-behavior: smooth` on the scroller (#208's rule: JS motion reads
|
|
@@ -983,7 +983,7 @@ export function RecordsTable({ labels, columns: columnsProp = defaultColumns, ro
|
|
|
983
983
|
label: (_jsxs("span", { className: "recordstable-sort-optlabel", children: [_jsx(ArrowDownWideNarrow, { size: 15, strokeWidth: 1.75 }), t.descending] })),
|
|
984
984
|
keywords: t.descending,
|
|
985
985
|
},
|
|
986
|
-
], "aria-label": t.sortDirection }), _jsx("button", { type: "button", className: "recordstable-sort-remove", onClick: () => removeSort(i), "aria-label": t.removeSort, children: _jsx(X, { size: 15, strokeWidth: 1.75 }) })] }, s.key)))), _jsx("div", { className: "recordstable-sort-addrow", children: _jsxs("button", { type: "button", className: "recordstable-sort-add", onClick: addSort, children: [_jsx(Plus, { size: 15, strokeWidth: 1.75 }), t.addSort] }) }), _jsx("div", { className: "recordstable-sort-foot", children: _jsxs("a", { className: "recordstable-sort-learn", href:
|
|
986
|
+
], "aria-label": t.sortDirection }), _jsx("button", { type: "button", className: "recordstable-sort-remove", onClick: () => removeSort(i), "aria-label": t.removeSort, children: _jsx(X, { size: 15, strokeWidth: 1.75 }) })] }, s.key)))), _jsx("div", { className: "recordstable-sort-addrow", children: _jsxs("button", { type: "button", className: "recordstable-sort-add", onClick: addSort, children: [_jsx(Plus, { size: 15, strokeWidth: 1.75 }), t.addSort] }) }), _jsx("div", { className: "recordstable-sort-foot", children: t.learnSortingHref ? (_jsxs("a", { className: "recordstable-sort-learn", href: t.learnSortingHref, target: "_blank", rel: "noreferrer", children: [_jsx(CircleHelp, { size: 14, strokeWidth: 1.75 }), t.learnSorting] })) : (_jsxs("span", { className: "recordstable-sort-learn", children: [_jsx(CircleHelp, { size: 14, strokeWidth: 1.75 }), t.learnSorting] })) })] }))] }), _jsxs("span", { className: "recordstable-toolgroup", children: [_jsxs("button", { type: "button", className: `recordstable-tool recordstable-tool--ghost${activeFilters ? " recordstable-tool--active" : ""}`, onClick: () => setOpenMenu(openMenu === "filter" ? null : "filter"), "aria-haspopup": "dialog", "aria-expanded": openMenu === "filter", "data-menu-trigger": true, children: [_jsx(ListFilter, { size: 14, strokeWidth: 1.75, "aria-hidden": "true" }), t.filterCount(activeFilters)] }), openMenu === "filter" && (_jsxs("div", { className: "recordstable-menu", role: "dialog", "aria-label": t.addFilter, children: [_jsx("input", { className: "recordstable-menu-input", placeholder: t.filterByPlaceholder, "aria-label": t.filterByField,
|
|
987
987
|
// biome-ignore lint/a11y/noAutofocus: focus the picker on open
|
|
988
988
|
autoFocus: true, value: filterQuery, onChange: (e) => setFilterQuery(e.target.value) }), cols
|
|
989
989
|
.filter((col) => col.label
|
|
@@ -2,7 +2,7 @@ import { toolbarChromeBody, toolbarChromeHead, } from "../../components/tabletoo
|
|
|
2
2
|
import { defineRecipe, resolveRecipe, rtlFlipCss } from "../../core/index.js";
|
|
3
3
|
import { contract as c } from "../../tokens/index.js";
|
|
4
4
|
import { recordTagCss } from "./recordstable.tag.js";
|
|
5
|
-
//
|
|
5
|
+
// A record grid, measured: 36px rows, 1px borderSubtle (#eeeff1) grid
|
|
6
6
|
// lines on BOTH axes, sticky checkbox + entity (first) columns, entity = 16px
|
|
7
7
|
// avatar + 14px/500 name, 28px toolbar controls, a floating bulk-action bar.
|
|
8
8
|
//
|
|
@@ -112,7 +112,7 @@ ${toolbarChromeBody("recordstable")}
|
|
|
112
112
|
/* box-shadow has no logical form either: the bleed follows the scrolled
|
|
113
113
|
content, which is the opposite side under RTL. */
|
|
114
114
|
[dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
|
|
115
|
-
/* AI-enriched values carry a purple wash. Measured
|
|
115
|
+
/* AI-enriched values carry a purple wash. Measured live:
|
|
116
116
|
a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
|
|
117
117
|
whatever row-state background the cell already has, which is why it
|
|
118
118
|
is an ::after and not a background. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { contract as c } from "../../tokens/index.js";
|
|
2
2
|
/**
|
|
3
|
-
* The record tag/chip, measured
|
|
3
|
+
* The record tag/chip, measured live: 22px tall, `padding: 0 4px`,
|
|
4
4
|
* `border-radius: ${c.radius.chip}`, 14px/20px at weight 500, and a 1px inset ring in the
|
|
5
5
|
* tone's colour.
|
|
6
6
|
*
|
|
@@ -4,7 +4,7 @@ import * as React from "react";
|
|
|
4
4
|
import { richtextRecipe } from "./richtext.recipe.js";
|
|
5
5
|
const exec = (cmd, value) => document.execCommand(cmd, false, value);
|
|
6
6
|
/**
|
|
7
|
-
* A block rich-text editor — measured from
|
|
7
|
+
* A block rich-text editor — measured from a notes editor. A large title,
|
|
8
8
|
* a prose body (headings, lists, quote, marks, links), and a floating toolbar
|
|
9
9
|
* that appears over a text selection. Built on contentEditable, dependency-free.
|
|
10
10
|
* Uncontrolled: seed with `defaultTitle`/`defaultHtml`, read via `onChange`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// A block rich-text editor — measured from
|
|
3
|
+
// A block rich-text editor — measured from a Notes editor: a large 32/36
|
|
4
4
|
// title, a 14/20 prose body (headings, lists, quote, code, marks, links), and a
|
|
5
5
|
// floating selection toolbar. Built on contentEditable so it stays dependency-
|
|
6
6
|
// free. Placeholders show via [data-empty]::before.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { settingssectionRecipe } from "./settingssection.recipe.js";
|
|
3
3
|
/**
|
|
4
|
-
* A settings section — measured from
|
|
4
|
+
* A settings section — measured from settings pages. A title + optional
|
|
5
5
|
* subtitle and trailing action, then a gapped stack of rows (pair with
|
|
6
6
|
* FormField). Compose several inside a settings content pane.
|
|
7
7
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// A settings section — measured from
|
|
3
|
+
// A settings section — measured from Settings pages: a 16px/600 title
|
|
4
4
|
// with an optional subtitle, then a stack of rows (form fields, toggles…). Rows
|
|
5
5
|
// gap evenly; an optional trailing action sits on the title row.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -3,7 +3,7 @@ import { ChevronLeft, Search } from "lucide-react";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { settingsshellRecipe } from "./settingsshell.recipe.js";
|
|
5
5
|
/**
|
|
6
|
-
* The Settings layout — measured
|
|
6
|
+
* The Settings layout — measured live. A left nav (back header,
|
|
7
7
|
* search, grouped items) beside a scrolling content pane. The search filters the
|
|
8
8
|
* nav by label. Fills the height its container gives it.
|
|
9
9
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe, rtlFlipCss } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// The Settings layout — measured from
|
|
3
|
+
// The Settings layout — measured from a Settings screen: a 256px left nav with a
|
|
4
4
|
// back header, a search field, and grouped nav items (active row raised), beside
|
|
5
5
|
// a scrolling content pane. Sits inside whatever height its container gives it.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -15,7 +15,7 @@ const config = defineRecipe({
|
|
|
15
15
|
|
|
16
16
|
& .settingsshell-search { display: flex; align-items: center; gap: ${c.space["2"]}; height: 32px; margin-bottom: ${c.space["2"]}; padding: 0 ${c.space["2.5"]}; border-radius: ${c.radius.md}; background: ${c.bgSurface}; box-shadow: inset 0 0 0 1px ${c.borderDefault}; color: ${c.fgMuted}; }
|
|
17
17
|
/* The field box owns the ring, so focus has to move it -- the inner
|
|
18
|
-
input kills its own outline. Measured
|
|
18
|
+
input kills its own outline. Measured live: a focused field's
|
|
19
19
|
input carries box-shadow: none while its wrapper carries
|
|
20
20
|
inset 0 0 0 1px #266df0. */
|
|
21
21
|
& .settingsshell-search:focus-within { box-shadow: inset 0 0 0 1px ${c.bgBrandSolid}; }
|
|
@@ -28,13 +28,13 @@ const GlyphPeople = () => (_jsx(User, { size: 12, color: "white", strokeWidth: 1
|
|
|
28
28
|
const GlyphDeals = () => (_jsx(CircleDollarSign, { size: 12, color: "white", strokeWidth: 1.75, "aria-hidden": "true" }));
|
|
29
29
|
const GlyphUsers = () => (_jsx(Users, { size: 12, color: "white", strokeWidth: 1.75, "aria-hidden": "true" }));
|
|
30
30
|
const GlyphWorkspaces = () => (_jsx(LayoutGrid, { size: 12, color: "white", strokeWidth: 1.75, "aria-hidden": "true" }));
|
|
31
|
-
/** The measured
|
|
31
|
+
/** The measured workspace switcher — the default `workspace` prop. */
|
|
32
32
|
export const ATTIO_SIDEBAR_WORKSPACE = {
|
|
33
33
|
name: "techpartners",
|
|
34
34
|
avatarLabel: "T",
|
|
35
35
|
avatarTone: "cyan",
|
|
36
36
|
};
|
|
37
|
-
/** The measured
|
|
37
|
+
/** The measured main nav — the default `items` prop. */
|
|
38
38
|
export const ATTIO_SIDEBAR_ITEMS = [
|
|
39
39
|
{ label: "Home", icon: IconHome },
|
|
40
40
|
{
|
|
@@ -50,7 +50,7 @@ export const ATTIO_SIDEBAR_ITEMS = [
|
|
|
50
50
|
{ label: "Sequences", icon: IconSequences },
|
|
51
51
|
{ label: "Workflows", icon: IconWorkflows },
|
|
52
52
|
];
|
|
53
|
-
/** The measured
|
|
53
|
+
/** The measured Records section — the default `recordsSection` prop. */
|
|
54
54
|
export const ATTIO_SIDEBAR_RECORDS_SECTION = {
|
|
55
55
|
label: "Records",
|
|
56
56
|
items: [
|
|
@@ -61,17 +61,17 @@ export const ATTIO_SIDEBAR_RECORDS_SECTION = {
|
|
|
61
61
|
{ label: "Workspaces", tone: "purple", glyph: GlyphWorkspaces },
|
|
62
62
|
],
|
|
63
63
|
};
|
|
64
|
-
/** The measured
|
|
64
|
+
/** The measured Lists section — the default `listsSection` prop. */
|
|
65
65
|
export const ATTIO_SIDEBAR_LISTS_SECTION = {
|
|
66
66
|
label: "Lists",
|
|
67
67
|
newListLabel: "+ New list",
|
|
68
68
|
};
|
|
69
|
-
/** The measured
|
|
69
|
+
/** The measured Chats section — the default `chatsSection` prop. */
|
|
70
70
|
export const ATTIO_SIDEBAR_CHATS_SECTION = {
|
|
71
71
|
label: "Chats",
|
|
72
72
|
items: [{ label: "In-app notification for deal wins", icon: IconChat }],
|
|
73
73
|
};
|
|
74
|
-
/** The measured
|
|
74
|
+
/** The measured footer copy — the default `footer` prop. */
|
|
75
75
|
export const ATTIO_SIDEBAR_FOOTER = {
|
|
76
76
|
gettingStartedLabel: "Getting started 1/6",
|
|
77
77
|
inviteLabel: "Invite team members",
|
|
@@ -4,7 +4,7 @@ function Row({ task, onToggle, completeLabel, incompleteLabel, }) {
|
|
|
4
4
|
return (_jsxs("div", { className: "tasklist-row", "data-done": task.done ? "" : undefined, children: [_jsx("input", { type: "checkbox", className: "tasklist-check", checked: !!task.done, "aria-label": task.done ? incompleteLabel : completeLabel, onChange: () => onToggle?.(task.id, !task.done) }), _jsx("span", { className: "tasklist-title", children: task.title }), (task.due != null || task.meta != null) && (_jsxs("span", { className: "tasklist-meta", children: [task.due != null && (_jsx("span", { className: "tasklist-due", "data-overdue": task.overdue ? "" : undefined, children: task.due })), task.meta] }))] }));
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
-
* A task list — measured from
|
|
7
|
+
* A task list — measured from a tasks page. Optional group headers with a
|
|
8
8
|
* count, then rows of a round complete-checkbox + title + trailing meta.
|
|
9
9
|
* Completed rows strike through; overdue dates go red.
|
|
10
10
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// A task list — measured from
|
|
3
|
+
// A task list — measured from a Tasks page: optional group headers, then
|
|
4
4
|
// rows of a round complete-checkbox + title + trailing meta (due date, record,
|
|
5
5
|
// assignee). Completed rows strike through; overdue due-dates go red.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { trialbannerRecipe } from "./trialbanner.recipe.js";
|
|
3
3
|
/**
|
|
4
|
-
* A compact trial / upgrade banner — measured from
|
|
4
|
+
* A compact trial / upgrade banner — measured from a sidebar footer.
|
|
5
5
|
* Icon + message + an optional small action pill (soft-glow outlined button).
|
|
6
6
|
*/
|
|
7
7
|
export function TrialBanner({ icon, children, action, onAction, tone = "neutral", className, ...rest }) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c, elevation as e } from "../../tokens/index.js";
|
|
3
|
-
// A compact trial / upgrade banner — measured from
|
|
3
|
+
// A compact trial / upgrade banner — measured from a sidebar footer: an
|
|
4
4
|
// icon + a message on the left and a small action pill on the right, in a 28px
|
|
5
|
-
// row. The action uses
|
|
5
|
+
// row. The action uses the measured soft-glow outlined-button shadow.
|
|
6
6
|
const config = defineRecipe({
|
|
7
7
|
name: "trialbanner",
|
|
8
8
|
base: `display: flex; align-items: center; gap: ${c.space["1.5"]}; box-sizing: border-box; min-height: 28px;
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { viewtoggleRecipe } from "./viewtoggle.recipe.js";
|
|
4
4
|
/**
|
|
5
|
-
* A compact icon toggle — measured from
|
|
5
|
+
* A compact icon toggle — measured from a list/grid switch. A padded track
|
|
6
6
|
* of icon tiles; the selected tile is raised. Use for view-mode switches (list ⇄
|
|
7
7
|
* grid) or any small mutually-exclusive icon choice.
|
|
8
8
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// A compact icon toggle — measured from
|
|
3
|
+
// A compact icon toggle — measured from a list/grid switch: a 28px track
|
|
4
4
|
// (radius 10, ~5% ink) padded 2px, holding 24px icon tiles (radius 8). The
|
|
5
5
|
// selected tile gets a raised surface with a soft shadow.
|
|
6
6
|
const config = defineRecipe({
|
package/dist/fileupload.css
CHANGED
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
& .fileupload-zone[data-disabled] { opacity: .5; cursor: not-allowed; }
|
|
24
24
|
& .fileupload-zone[data-invalid] { border-color: var(--bg-danger); }
|
|
25
25
|
|
|
26
|
-
/*
|
|
26
|
+
/* "No files" 16/20 weight 600 */
|
|
27
27
|
& .fileupload-title {
|
|
28
28
|
color: var(--fg-primary); font-size: var(--text-xl); line-height: 20px;
|
|
29
29
|
font-weight: var(--weight-semibold);
|
|
30
30
|
}
|
|
31
|
-
/*
|
|
31
|
+
/* The hint line, 14/20 weight 500 at 63% of the foreground */
|
|
32
32
|
& .fileupload-hint {
|
|
33
33
|
color: color-mix(in srgb, var(--fg-primary) 63%, transparent);
|
|
34
34
|
font-size: var(--text-lg); line-height: 20px;
|
package/dist/recordpage.css
CHANGED
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
& .recordpage-section { padding-top: var(--space-2); }
|
|
42
42
|
& .recordpage-section-title { font-size: var(--text-sm); font-weight: var(--weight-medium); letter-spacing: -0.12px; color: color-mix(in srgb, var(--fg-primary) 63%, transparent); padding: var(--space-1); }
|
|
43
43
|
/* main-area section headers (Highlights / Activity / Emails / Notes / Tasks)
|
|
44
|
-
are 14px
|
|
44
|
+
are 14px; the left column's (Record Details / Lists) stay 12px. */
|
|
45
45
|
& .recordpage-main .recordpage-section-title { font-size: var(--text-lg); }
|
|
46
46
|
& .recordpage-detailhead { display: flex; align-items: center; gap: var(--space-0-5); margin-bottom: var(--space-3); padding-inline-end: var(--space-0-5); }
|
|
47
47
|
& .recordpage-collapse { display: inline-flex; align-items: center; gap: 2px; flex: 1; min-width: 0; margin: 0; border: none; background: none; padding: var(--space-1); border-radius: var(--radius-md); font-family: inherit; font-size: var(--text-sm); font-weight: var(--weight-medium); letter-spacing: -0.12px; color: var(--fg-muted); cursor: pointer; text-align: start; }
|
package/dist/recordstable.css
CHANGED
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
/* box-shadow has no logical form either: the bleed follows the scrolled
|
|
168
168
|
content, which is the opposite side under RTL. */
|
|
169
169
|
[dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
|
|
170
|
-
/* AI-enriched values carry a purple wash. Measured
|
|
170
|
+
/* AI-enriched values carry a purple wash. Measured live:
|
|
171
171
|
a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
|
|
172
172
|
whatever row-state background the cell already has, which is why it
|
|
173
173
|
is an ::after and not a background. */
|
package/dist/settingsshell.css
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
& .settingsshell-search { display: flex; align-items: center; gap: var(--space-2); height: 32px; margin-bottom: var(--space-2); padding: 0 var(--space-2-5); border-radius: var(--radius-md); background: var(--bg-surface); box-shadow: inset 0 0 0 1px var(--border-default); color: var(--fg-muted); }
|
|
11
11
|
/* The field box owns the ring, so focus has to move it -- the inner
|
|
12
|
-
input kills its own outline. Measured
|
|
12
|
+
input kills its own outline. Measured live: a focused field's
|
|
13
13
|
input carries box-shadow: none while its wrapper carries
|
|
14
14
|
inset 0 0 0 1px #266df0. */
|
|
15
15
|
& .settingsshell-search:focus-within { box-shadow: inset 0 0 0 1px var(--bg-brand-solid); }
|
package/dist/styles.css
CHANGED
|
@@ -415,7 +415,7 @@
|
|
|
415
415
|
shrink the button back to its text. Make the wrapper fill too, so the
|
|
416
416
|
whole cell stays clickable. */
|
|
417
417
|
& .menu { width: 100%; height: 100%; }
|
|
418
|
-
/*
|
|
418
|
+
/* The hit target is the WHOLE summary cell -- measured 246x37 with
|
|
419
419
|
padding 0 12px, not a content-sized chip. Clicking anywhere in the cell
|
|
420
420
|
opens the aggregation menu. */
|
|
421
421
|
& .columncalc-trigger { display: flex; align-items: center; gap: var(--space-1); width: 100%; height: 100%; min-height: var(--size-tableRow); margin: 0; padding: 0 var(--space-3); border: none; border-radius: var(--radius-md); background: transparent; color: var(--fg-muted); font-family: inherit; font-size: var(--text-md); font-weight: var(--weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
|
|
@@ -466,7 +466,7 @@
|
|
|
466
466
|
& .datatable-search input::placeholder { color: var(--fg-muted); }
|
|
467
467
|
& .datatable-search input:focus { box-shadow: inset 0 0 0 1px var(--bg-brand-solid); }
|
|
468
468
|
& .datatable-count { margin-inline-start: auto; font-size: var(--text-md); color: var(--fg-muted); }
|
|
469
|
-
/*
|
|
469
|
+
/* The header cell has no padding of its own -- the button owns the
|
|
470
470
|
full cell so the whole header is clickable (its own inset is 12px).
|
|
471
471
|
Mirrors the summary-row fix. */
|
|
472
472
|
& th { padding: 0; }
|
|
@@ -480,11 +480,11 @@
|
|
|
480
480
|
& th .menu { width: 100%; height: 100%; }
|
|
481
481
|
& .datatable-th-inner { display: inline-flex; align-items: center; gap: var(--space-1-5); width: 100%; min-width: 0; height: 100%; }
|
|
482
482
|
& .datatable-th-inner > svg { flex-shrink: 0; color: var(--fg-muted); }
|
|
483
|
-
/*
|
|
483
|
+
/* The summary cell has NO padding of its own -- the calculation trigger
|
|
484
484
|
owns the whole 246x37 area so a click anywhere in the cell opens the
|
|
485
485
|
menu. Zero the cell's inset and let ColumnCalc supply the 12px. */
|
|
486
486
|
& tfoot td { padding: 0; }
|
|
487
|
-
/* Group heading row --
|
|
487
|
+
/* Group heading row -- a view is grouped under a subtle label with the
|
|
488
488
|
bucket's count beside it. */
|
|
489
489
|
& .datatable-viewsettings { display: inline-flex; align-items: center; gap: var(--space-1-5); height: var(--size-row); margin: 0; padding: 0 var(--space-2); border: none; border-radius: var(--radius-md); background: transparent; color: var(--fg-muted); font-family: inherit; font-size: var(--text-md); font-weight: var(--weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
|
|
490
490
|
& .datatable-viewsettings:hover { background: color-mix(in srgb, var(--fg-primary) 4%, transparent); color: var(--fg-primary); }
|
|
@@ -542,13 +542,13 @@
|
|
|
542
542
|
& .datatable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--bg-orange) 16%, transparent); color: color-mix(in srgb, var(--bg-orange) 82%, var(--fg-primary)); }
|
|
543
543
|
& .datatable-num { font-variant-numeric: tabular-nums; }
|
|
544
544
|
& .datatable-muted { color: var(--fg-muted); }
|
|
545
|
-
/* row drag-to-reorder --
|
|
545
|
+
/* row drag-to-reorder -- a Settings > Objects > Attributes screen measures
|
|
546
546
|
a leading 20px grip column, a 16px grip icon, and the row's own
|
|
547
547
|
hairline doubling as the drop indicator (it tints toward the brand
|
|
548
548
|
colour as the active drop target). The affordance + geometry are
|
|
549
549
|
measured; the drag MECHANISM is crisp's existing house idiom -- HTML5
|
|
550
550
|
draggable + dataTransfer, the same one column reorder already uses
|
|
551
|
-
(RecordsTable's reorderColumn) -- not
|
|
551
|
+
(RecordsTable's reorderColumn) -- not a proprietary
|
|
552
552
|
pointer-events implementation. */
|
|
553
553
|
& .datatable-col-grip { width: 20px; padding: 0; text-align: center; }
|
|
554
554
|
& .datatable-grip { display: inline-flex; align-items: center; justify-content: center; width: 100%; height: 100%; margin: 0; border: none; border-radius: 0; background: none; font-family: inherit; color: var(--fg-muted); cursor: grab; }
|
|
@@ -901,12 +901,12 @@
|
|
|
901
901
|
& .fileupload-zone[data-disabled] { opacity: .5; cursor: not-allowed; }
|
|
902
902
|
& .fileupload-zone[data-invalid] { border-color: var(--bg-danger); }
|
|
903
903
|
|
|
904
|
-
/*
|
|
904
|
+
/* "No files" 16/20 weight 600 */
|
|
905
905
|
& .fileupload-title {
|
|
906
906
|
color: var(--fg-primary); font-size: var(--text-xl); line-height: 20px;
|
|
907
907
|
font-weight: var(--weight-semibold);
|
|
908
908
|
}
|
|
909
|
-
/*
|
|
909
|
+
/* The hint line, 14/20 weight 500 at 63% of the foreground */
|
|
910
910
|
& .fileupload-hint {
|
|
911
911
|
color: color-mix(in srgb, var(--fg-primary) 63%, transparent);
|
|
912
912
|
font-size: var(--text-lg); line-height: 20px;
|
|
@@ -1926,7 +1926,7 @@
|
|
|
1926
1926
|
& .authshell-body .button { height: 36px; padding-inline: var(--space-3); border-radius: 10px; }
|
|
1927
1927
|
& .authshell-body .button--intent_primary { box-shadow: inset 0 0 0 1px rgba(0,0,0,0.06), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08); }
|
|
1928
1928
|
|
|
1929
|
-
/*
|
|
1929
|
+
/* The preview pane drops out in JS on narrow viewports (measured: two
|
|
1930
1930
|
panes at 1393px, one at 954px), so 1200px is a chosen threshold inside
|
|
1931
1931
|
that bracket, not a measured value. A CONTAINER query, not a media
|
|
1932
1932
|
query: the shell is embedded in the docs inside an ~800px column, where
|
|
@@ -2248,7 +2248,7 @@
|
|
|
2248
2248
|
& .recordpage-section { padding-top: var(--space-2); }
|
|
2249
2249
|
& .recordpage-section-title { font-size: var(--text-sm); font-weight: var(--weight-medium); letter-spacing: -0.12px; color: color-mix(in srgb, var(--fg-primary) 63%, transparent); padding: var(--space-1); }
|
|
2250
2250
|
/* main-area section headers (Highlights / Activity / Emails / Notes / Tasks)
|
|
2251
|
-
are 14px
|
|
2251
|
+
are 14px; the left column's (Record Details / Lists) stay 12px. */
|
|
2252
2252
|
& .recordpage-main .recordpage-section-title { font-size: var(--text-lg); }
|
|
2253
2253
|
& .recordpage-detailhead { display: flex; align-items: center; gap: var(--space-0-5); margin-bottom: var(--space-3); padding-inline-end: var(--space-0-5); }
|
|
2254
2254
|
& .recordpage-collapse { display: inline-flex; align-items: center; gap: 2px; flex: 1; min-width: 0; margin: 0; border: none; background: none; padding: var(--space-1); border-radius: var(--radius-md); font-family: inherit; font-size: var(--text-sm); font-weight: var(--weight-medium); letter-spacing: -0.12px; color: var(--fg-muted); cursor: pointer; text-align: start; }
|
|
@@ -2575,7 +2575,7 @@
|
|
|
2575
2575
|
/* box-shadow has no logical form either: the bleed follows the scrolled
|
|
2576
2576
|
content, which is the opposite side under RTL. */
|
|
2577
2577
|
[dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
|
|
2578
|
-
/* AI-enriched values carry a purple wash. Measured
|
|
2578
|
+
/* AI-enriched values carry a purple wash. Measured live:
|
|
2579
2579
|
a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
|
|
2580
2580
|
whatever row-state background the cell already has, which is why it
|
|
2581
2581
|
is an ::after and not a background. */
|
|
@@ -2685,7 +2685,7 @@
|
|
|
2685
2685
|
|
|
2686
2686
|
& .settingsshell-search { display: flex; align-items: center; gap: var(--space-2); height: 32px; margin-bottom: var(--space-2); padding: 0 var(--space-2-5); border-radius: var(--radius-md); background: var(--bg-surface); box-shadow: inset 0 0 0 1px var(--border-default); color: var(--fg-muted); }
|
|
2687
2687
|
/* The field box owns the ring, so focus has to move it -- the inner
|
|
2688
|
-
input kills its own outline. Measured
|
|
2688
|
+
input kills its own outline. Measured live: a focused field's
|
|
2689
2689
|
input carries box-shadow: none while its wrapper carries
|
|
2690
2690
|
inset 0 0 0 1px #266df0. */
|
|
2691
2691
|
& .settingsshell-search:focus-within { box-shadow: inset 0 0 0 1px var(--bg-brand-solid); }
|
|
@@ -12,7 +12,7 @@ export type AvatarGroupProps = React.ComponentPropsWithoutRef<"div"> & {
|
|
|
12
12
|
};
|
|
13
13
|
/**
|
|
14
14
|
* A stack of overlapping avatars with an optional "+N" overflow chip — measured
|
|
15
|
-
* from
|
|
15
|
+
* from team / member rows. Pass `<Avatar>` children; each is ringed in
|
|
16
16
|
* the surface colour so it reads against its neighbour.
|
|
17
17
|
*/
|
|
18
18
|
export declare function AvatarGroup({ children, max, size, className, "aria-label": ariaLabel, ...rest }: AvatarGroupProps): React.JSX.Element;
|
|
@@ -23,7 +23,7 @@ export type BarChartProps = Omit<React.ComponentPropsWithoutRef<"div">, "color">
|
|
|
23
23
|
className?: string;
|
|
24
24
|
};
|
|
25
25
|
/**
|
|
26
|
-
* A responsive bar chart
|
|
26
|
+
* A responsive bar chart for dashboards. Pure CSS, so
|
|
27
27
|
* it scales with its container. Renders `role="img"` with an accessible summary.
|
|
28
28
|
*/
|
|
29
29
|
export declare function BarChart({ data, height, max, ticks, color, format, yAxisWidth, xAxisTitle, "aria-label": ariaLabel, className, ...rest }: BarChartProps): React.JSX.Element;
|
|
@@ -13,7 +13,7 @@ export type BreadcrumbProps = React.ComponentPropsWithoutRef<"nav"> & {
|
|
|
13
13
|
className?: string;
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
|
-
* A breadcrumb trail — measured from
|
|
16
|
+
* A breadcrumb trail — measured from a record-page nav. The last item is
|
|
17
17
|
* marked `aria-current="page"`; earlier items render as links or buttons.
|
|
18
18
|
*/
|
|
19
19
|
export declare function Breadcrumb({ items, separator, "aria-label": ariaLabel, className, ...rest }: BreadcrumbProps): React.JSX.Element;
|
|
@@ -23,7 +23,7 @@ export type BulkBarProps = Omit<React.ComponentPropsWithoutRef<"div">, "children
|
|
|
23
23
|
/**
|
|
24
24
|
* A floating bulk-action bar. Rises from the bottom-centre of its nearest
|
|
25
25
|
* positioned ancestor when a selection is active; render it conditionally
|
|
26
|
-
* (e.g. `count > 0 && <BulkBar …/>`). Measured from
|
|
26
|
+
* (e.g. `count > 0 && <BulkBar …/>`). Measured from a records table.
|
|
27
27
|
*/
|
|
28
28
|
export declare function BulkBar({ count, onClear, countLabel, countText, children, className, clearLabel, ...rest }: BulkBarProps): React.JSX.Element;
|
|
29
29
|
export declare namespace BulkBar {
|