@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
|
@@ -5,7 +5,7 @@ const tabletoolbar_chrome_1 = require("../../components/tabletoolbar/tabletoolba
|
|
|
5
5
|
const core_1 = require("../../core");
|
|
6
6
|
const tokens_1 = require("../../tokens");
|
|
7
7
|
const recordstable_tag_1 = require("./recordstable.tag");
|
|
8
|
-
//
|
|
8
|
+
// A record grid, measured: 36px rows, 1px borderSubtle (#eeeff1) grid
|
|
9
9
|
// lines on BOTH axes, sticky checkbox + entity (first) columns, entity = 16px
|
|
10
10
|
// avatar + 14px/500 name, 28px toolbar controls, a floating bulk-action bar.
|
|
11
11
|
//
|
|
@@ -115,7 +115,7 @@ ${(0, tabletoolbar_chrome_1.toolbarChromeBody)("recordstable")}
|
|
|
115
115
|
/* box-shadow has no logical form either: the bleed follows the scrolled
|
|
116
116
|
content, which is the opposite side under RTL. */
|
|
117
117
|
[dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
|
|
118
|
-
/* AI-enriched values carry a purple wash. Measured
|
|
118
|
+
/* AI-enriched values carry a purple wash. Measured live:
|
|
119
119
|
a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
|
|
120
120
|
whatever row-state background the cell already has, which is why it
|
|
121
121
|
is an ::after and not a background. */
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.recordTagCss = void 0;
|
|
4
4
|
const tokens_1 = require("../../tokens");
|
|
5
5
|
/**
|
|
6
|
-
* The record tag/chip, measured
|
|
6
|
+
* The record tag/chip, measured live: 22px tall, `padding: 0 4px`,
|
|
7
7
|
* `border-radius: ${c.radius.chip}`, 14px/20px at weight 500, and a 1px inset ring in the
|
|
8
8
|
* tone's colour.
|
|
9
9
|
*
|
|
@@ -40,7 +40,7 @@ const React = __importStar(require("react"));
|
|
|
40
40
|
const richtext_recipe_1 = require("./richtext.recipe");
|
|
41
41
|
const exec = (cmd, value) => document.execCommand(cmd, false, value);
|
|
42
42
|
/**
|
|
43
|
-
* A block rich-text editor — measured from
|
|
43
|
+
* A block rich-text editor — measured from a notes editor. A large title,
|
|
44
44
|
* a prose body (headings, lists, quote, marks, links), and a floating toolbar
|
|
45
45
|
* that appears over a text selection. Built on contentEditable, dependency-free.
|
|
46
46
|
* Uncontrolled: seed with `defaultTitle`/`defaultHtml`, read via `onChange`.
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.richtextRecipe = void 0;
|
|
4
4
|
const core_1 = require("../../core");
|
|
5
5
|
const tokens_1 = require("../../tokens");
|
|
6
|
-
// A block rich-text editor — measured from
|
|
6
|
+
// A block rich-text editor — measured from a Notes editor: a large 32/36
|
|
7
7
|
// title, a 14/20 prose body (headings, lists, quote, code, marks, links), and a
|
|
8
8
|
// floating selection toolbar. Built on contentEditable so it stays dependency-
|
|
9
9
|
// free. Placeholders show via [data-empty]::before.
|
|
@@ -4,7 +4,7 @@ exports.SettingsSection = SettingsSection;
|
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const settingssection_recipe_1 = require("./settingssection.recipe");
|
|
6
6
|
/**
|
|
7
|
-
* A settings section — measured from
|
|
7
|
+
* A settings section — measured from settings pages. A title + optional
|
|
8
8
|
* subtitle and trailing action, then a gapped stack of rows (pair with
|
|
9
9
|
* FormField). Compose several inside a settings content pane.
|
|
10
10
|
*/
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.settingssectionRecipe = void 0;
|
|
4
4
|
const core_1 = require("../../core");
|
|
5
5
|
const tokens_1 = require("../../tokens");
|
|
6
|
-
// A settings section — measured from
|
|
6
|
+
// A settings section — measured from Settings pages: a 16px/600 title
|
|
7
7
|
// with an optional subtitle, then a stack of rows (form fields, toggles…). Rows
|
|
8
8
|
// gap evenly; an optional trailing action sits on the title row.
|
|
9
9
|
const config = (0, core_1.defineRecipe)({
|
|
@@ -39,7 +39,7 @@ const lucide_react_1 = require("lucide-react");
|
|
|
39
39
|
const React = __importStar(require("react"));
|
|
40
40
|
const settingsshell_recipe_1 = require("./settingsshell.recipe");
|
|
41
41
|
/**
|
|
42
|
-
* The Settings layout — measured
|
|
42
|
+
* The Settings layout — measured live. A left nav (back header,
|
|
43
43
|
* search, grouped items) beside a scrolling content pane. The search filters the
|
|
44
44
|
* nav by label. Fills the height its container gives it.
|
|
45
45
|
*/
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.settingsshellRecipe = void 0;
|
|
4
4
|
const core_1 = require("../../core");
|
|
5
5
|
const tokens_1 = require("../../tokens");
|
|
6
|
-
// The Settings layout — measured from
|
|
6
|
+
// The Settings layout — measured from a Settings screen: a 256px left nav with a
|
|
7
7
|
// back header, a search field, and grouped nav items (active row raised), beside
|
|
8
8
|
// a scrolling content pane. Sits inside whatever height its container gives it.
|
|
9
9
|
const config = (0, core_1.defineRecipe)({
|
|
@@ -18,7 +18,7 @@ const config = (0, core_1.defineRecipe)({
|
|
|
18
18
|
|
|
19
19
|
& .settingsshell-search { display: flex; align-items: center; gap: ${tokens_1.contract.space["2"]}; height: 32px; margin-bottom: ${tokens_1.contract.space["2"]}; padding: 0 ${tokens_1.contract.space["2.5"]}; border-radius: ${tokens_1.contract.radius.md}; background: ${tokens_1.contract.bgSurface}; box-shadow: inset 0 0 0 1px ${tokens_1.contract.borderDefault}; color: ${tokens_1.contract.fgMuted}; }
|
|
20
20
|
/* The field box owns the ring, so focus has to move it -- the inner
|
|
21
|
-
input kills its own outline. Measured
|
|
21
|
+
input kills its own outline. Measured live: a focused field's
|
|
22
22
|
input carries box-shadow: none while its wrapper carries
|
|
23
23
|
inset 0 0 0 1px #266df0. */
|
|
24
24
|
& .settingsshell-search:focus-within { box-shadow: inset 0 0 0 1px ${tokens_1.contract.bgBrandSolid}; }
|
|
@@ -64,13 +64,13 @@ const GlyphPeople = () => ((0, jsx_runtime_1.jsx)(lucide_react_1.User, { size: 1
|
|
|
64
64
|
const GlyphDeals = () => ((0, jsx_runtime_1.jsx)(lucide_react_1.CircleDollarSign, { size: 12, color: "white", strokeWidth: 1.75, "aria-hidden": "true" }));
|
|
65
65
|
const GlyphUsers = () => ((0, jsx_runtime_1.jsx)(lucide_react_1.Users, { size: 12, color: "white", strokeWidth: 1.75, "aria-hidden": "true" }));
|
|
66
66
|
const GlyphWorkspaces = () => ((0, jsx_runtime_1.jsx)(lucide_react_1.LayoutGrid, { size: 12, color: "white", strokeWidth: 1.75, "aria-hidden": "true" }));
|
|
67
|
-
/** The measured
|
|
67
|
+
/** The measured workspace switcher — the default `workspace` prop. */
|
|
68
68
|
exports.ATTIO_SIDEBAR_WORKSPACE = {
|
|
69
69
|
name: "techpartners",
|
|
70
70
|
avatarLabel: "T",
|
|
71
71
|
avatarTone: "cyan",
|
|
72
72
|
};
|
|
73
|
-
/** The measured
|
|
73
|
+
/** The measured main nav — the default `items` prop. */
|
|
74
74
|
exports.ATTIO_SIDEBAR_ITEMS = [
|
|
75
75
|
{ label: "Home", icon: IconHome },
|
|
76
76
|
{
|
|
@@ -86,7 +86,7 @@ exports.ATTIO_SIDEBAR_ITEMS = [
|
|
|
86
86
|
{ label: "Sequences", icon: IconSequences },
|
|
87
87
|
{ label: "Workflows", icon: IconWorkflows },
|
|
88
88
|
];
|
|
89
|
-
/** The measured
|
|
89
|
+
/** The measured Records section — the default `recordsSection` prop. */
|
|
90
90
|
exports.ATTIO_SIDEBAR_RECORDS_SECTION = {
|
|
91
91
|
label: "Records",
|
|
92
92
|
items: [
|
|
@@ -97,17 +97,17 @@ exports.ATTIO_SIDEBAR_RECORDS_SECTION = {
|
|
|
97
97
|
{ label: "Workspaces", tone: "purple", glyph: GlyphWorkspaces },
|
|
98
98
|
],
|
|
99
99
|
};
|
|
100
|
-
/** The measured
|
|
100
|
+
/** The measured Lists section — the default `listsSection` prop. */
|
|
101
101
|
exports.ATTIO_SIDEBAR_LISTS_SECTION = {
|
|
102
102
|
label: "Lists",
|
|
103
103
|
newListLabel: "+ New list",
|
|
104
104
|
};
|
|
105
|
-
/** The measured
|
|
105
|
+
/** The measured Chats section — the default `chatsSection` prop. */
|
|
106
106
|
exports.ATTIO_SIDEBAR_CHATS_SECTION = {
|
|
107
107
|
label: "Chats",
|
|
108
108
|
items: [{ label: "In-app notification for deal wins", icon: IconChat }],
|
|
109
109
|
};
|
|
110
|
-
/** The measured
|
|
110
|
+
/** The measured footer copy — the default `footer` prop. */
|
|
111
111
|
exports.ATTIO_SIDEBAR_FOOTER = {
|
|
112
112
|
gettingStartedLabel: "Getting started 1/6",
|
|
113
113
|
inviteLabel: "Invite team members",
|
|
@@ -7,7 +7,7 @@ function Row({ task, onToggle, completeLabel, incompleteLabel, }) {
|
|
|
7
7
|
return ((0, jsx_runtime_1.jsxs)("div", { className: "tasklist-row", "data-done": task.done ? "" : undefined, children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", className: "tasklist-check", checked: !!task.done, "aria-label": task.done ? incompleteLabel : completeLabel, onChange: () => onToggle?.(task.id, !task.done) }), (0, jsx_runtime_1.jsx)("span", { className: "tasklist-title", children: task.title }), (task.due != null || task.meta != null) && ((0, jsx_runtime_1.jsxs)("span", { className: "tasklist-meta", children: [task.due != null && ((0, jsx_runtime_1.jsx)("span", { className: "tasklist-due", "data-overdue": task.overdue ? "" : undefined, children: task.due })), task.meta] }))] }));
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* A task list — measured from
|
|
10
|
+
* A task list — measured from a tasks page. Optional group headers with a
|
|
11
11
|
* count, then rows of a round complete-checkbox + title + trailing meta.
|
|
12
12
|
* Completed rows strike through; overdue dates go red.
|
|
13
13
|
*/
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.tasklistRecipe = void 0;
|
|
4
4
|
const core_1 = require("../../core");
|
|
5
5
|
const tokens_1 = require("../../tokens");
|
|
6
|
-
// A task list — measured from
|
|
6
|
+
// A task list — measured from a Tasks page: optional group headers, then
|
|
7
7
|
// rows of a round complete-checkbox + title + trailing meta (due date, record,
|
|
8
8
|
// assignee). Completed rows strike through; overdue due-dates go red.
|
|
9
9
|
const config = (0, core_1.defineRecipe)({
|
|
@@ -4,7 +4,7 @@ exports.TrialBanner = TrialBanner;
|
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const trialbanner_recipe_1 = require("./trialbanner.recipe");
|
|
6
6
|
/**
|
|
7
|
-
* A compact trial / upgrade banner — measured from
|
|
7
|
+
* A compact trial / upgrade banner — measured from a sidebar footer.
|
|
8
8
|
* Icon + message + an optional small action pill (soft-glow outlined button).
|
|
9
9
|
*/
|
|
10
10
|
function TrialBanner({ icon, children, action, onAction, tone = "neutral", className, ...rest }) {
|
|
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.trialbannerRecipe = void 0;
|
|
4
4
|
const core_1 = require("../../core");
|
|
5
5
|
const tokens_1 = require("../../tokens");
|
|
6
|
-
// A compact trial / upgrade banner — measured from
|
|
6
|
+
// A compact trial / upgrade banner — measured from a sidebar footer: an
|
|
7
7
|
// icon + a message on the left and a small action pill on the right, in a 28px
|
|
8
|
-
// row. The action uses
|
|
8
|
+
// row. The action uses the measured soft-glow outlined-button shadow.
|
|
9
9
|
const config = (0, core_1.defineRecipe)({
|
|
10
10
|
name: "trialbanner",
|
|
11
11
|
base: `display: flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; box-sizing: border-box; min-height: 28px;
|
|
@@ -38,7 +38,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
38
38
|
const React = __importStar(require("react"));
|
|
39
39
|
const viewtoggle_recipe_1 = require("./viewtoggle.recipe");
|
|
40
40
|
/**
|
|
41
|
-
* A compact icon toggle — measured from
|
|
41
|
+
* A compact icon toggle — measured from a list/grid switch. A padded track
|
|
42
42
|
* of icon tiles; the selected tile is raised. Use for view-mode switches (list ⇄
|
|
43
43
|
* grid) or any small mutually-exclusive icon choice.
|
|
44
44
|
*/
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.viewtoggleRecipe = void 0;
|
|
4
4
|
const core_1 = require("../../core");
|
|
5
5
|
const tokens_1 = require("../../tokens");
|
|
6
|
-
// A compact icon toggle — measured from
|
|
6
|
+
// A compact icon toggle — measured from a list/grid switch: a 28px track
|
|
7
7
|
// (radius 10, ~5% ink) padded 2px, holding 24px icon tiles (radius 8). The
|
|
8
8
|
// selected tile gets a raised surface with a soft shadow.
|
|
9
9
|
const config = (0, core_1.defineRecipe)({
|
package/dist/columncalc.css
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
shrink the button back to its text. Make the wrapper fill too, so the
|
|
5
5
|
whole cell stays clickable. */
|
|
6
6
|
& .menu { width: 100%; height: 100%; }
|
|
7
|
-
/*
|
|
7
|
+
/* The hit target is the WHOLE summary cell -- measured 246x37 with
|
|
8
8
|
padding 0 12px, not a content-sized chip. Clicking anywhere in the cell
|
|
9
9
|
opens the aggregation menu. */
|
|
10
10
|
& .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; }
|
package/dist/datatable.css
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
& .datatable-search input::placeholder { color: var(--fg-muted); }
|
|
8
8
|
& .datatable-search input:focus { box-shadow: inset 0 0 0 1px var(--bg-brand-solid); }
|
|
9
9
|
& .datatable-count { margin-inline-start: auto; font-size: var(--text-md); color: var(--fg-muted); }
|
|
10
|
-
/*
|
|
10
|
+
/* The header cell has no padding of its own -- the button owns the
|
|
11
11
|
full cell so the whole header is clickable (its own inset is 12px).
|
|
12
12
|
Mirrors the summary-row fix. */
|
|
13
13
|
& th { padding: 0; }
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
& th .menu { width: 100%; height: 100%; }
|
|
22
22
|
& .datatable-th-inner { display: inline-flex; align-items: center; gap: var(--space-1-5); width: 100%; min-width: 0; height: 100%; }
|
|
23
23
|
& .datatable-th-inner > svg { flex-shrink: 0; color: var(--fg-muted); }
|
|
24
|
-
/*
|
|
24
|
+
/* The summary cell has NO padding of its own -- the calculation trigger
|
|
25
25
|
owns the whole 246x37 area so a click anywhere in the cell opens the
|
|
26
26
|
menu. Zero the cell's inset and let ColumnCalc supply the 12px. */
|
|
27
27
|
& tfoot td { padding: 0; }
|
|
28
|
-
/* Group heading row --
|
|
28
|
+
/* Group heading row -- a view is grouped under a subtle label with the
|
|
29
29
|
bucket's count beside it. */
|
|
30
30
|
& .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; }
|
|
31
31
|
& .datatable-viewsettings:hover { background: color-mix(in srgb, var(--fg-primary) 4%, transparent); color: var(--fg-primary); }
|
|
@@ -83,13 +83,13 @@
|
|
|
83
83
|
& .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)); }
|
|
84
84
|
& .datatable-num { font-variant-numeric: tabular-nums; }
|
|
85
85
|
& .datatable-muted { color: var(--fg-muted); }
|
|
86
|
-
/* row drag-to-reorder --
|
|
86
|
+
/* row drag-to-reorder -- a Settings > Objects > Attributes screen measures
|
|
87
87
|
a leading 20px grip column, a 16px grip icon, and the row's own
|
|
88
88
|
hairline doubling as the drop indicator (it tints toward the brand
|
|
89
89
|
colour as the active drop target). The affordance + geometry are
|
|
90
90
|
measured; the drag MECHANISM is crisp's existing house idiom -- HTML5
|
|
91
91
|
draggable + dataTransfer, the same one column reorder already uses
|
|
92
|
-
(RecordsTable's reorderColumn) -- not
|
|
92
|
+
(RecordsTable's reorderColumn) -- not a proprietary
|
|
93
93
|
pointer-events implementation. */
|
|
94
94
|
& .datatable-col-grip { width: 20px; padding: 0; text-align: center; }
|
|
95
95
|
& .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; }
|
|
@@ -3,7 +3,7 @@ import { ChevronDown } from "lucide-react";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { accordionRecipe } from "./accordion.recipe.js";
|
|
5
5
|
/**
|
|
6
|
-
* A collapsible section list — measured from
|
|
6
|
+
* A collapsible section list — measured from sidebar groups. Single or
|
|
7
7
|
* multiple open; panels animate their height (grid-rows 0fr->1fr). Headers are
|
|
8
8
|
* buttons with `aria-expanded` / `aria-controls`.
|
|
9
9
|
*/
|
|
@@ -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 stack of collapsible sections —
|
|
3
|
+
// A stack of collapsible sections — sidebar sections / "view all".
|
|
4
4
|
// The panel animates height via the grid-template-rows 0fr->1fr technique.
|
|
5
5
|
const config = defineRecipe({
|
|
6
6
|
name: "accordion",
|
|
@@ -4,7 +4,7 @@ import { Avatar } from "../avatar/avatar.js";
|
|
|
4
4
|
import { avatargroupRecipe } from "./avatargroup.recipe.js";
|
|
5
5
|
/**
|
|
6
6
|
* A stack of overlapping avatars with an optional "+N" overflow chip — measured
|
|
7
|
-
* from
|
|
7
|
+
* from team / member rows. Pass `<Avatar>` children; each is ringed in
|
|
8
8
|
* the surface colour so it reads against its neighbour.
|
|
9
9
|
*/
|
|
10
10
|
export function AvatarGroup({ children, max, size = "md", className, "aria-label": ariaLabel, ...rest }) {
|
|
@@ -11,7 +11,7 @@ function niceNum(raw) {
|
|
|
11
11
|
return step * mag;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* A responsive bar chart
|
|
14
|
+
* A responsive bar chart for dashboards. Pure CSS, so
|
|
15
15
|
* it scales with its container. Renders `role="img"` with an accessible summary.
|
|
16
16
|
*/
|
|
17
17
|
export function BarChart({ data, height = 240, max, ticks = 5, color, format = (n) => n.toLocaleString(), yAxisWidth, xAxisTitle, "aria-label": ariaLabel, className, ...rest }) {
|
|
@@ -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 responsive bar chart — measured from
|
|
3
|
+
// A responsive bar chart — measured from a Reports dashboard: brand bars
|
|
4
4
|
// with rounded tops over dashed horizontal gridlines, a value axis on the left,
|
|
5
5
|
// and category labels below. Pure CSS (no SVG), so it scales with its container.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -3,7 +3,7 @@ import { ChevronRight } from "lucide-react";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { breadcrumbRecipe } from "./breadcrumb.recipe.js";
|
|
5
5
|
/**
|
|
6
|
-
* A breadcrumb trail — measured from
|
|
6
|
+
* A breadcrumb trail — measured from a record-page nav. The last item is
|
|
7
7
|
* marked `aria-current="page"`; earlier items render as links or buttons.
|
|
8
8
|
*/
|
|
9
9
|
export function Breadcrumb({ items, separator, "aria-label": ariaLabel = "Breadcrumb", className, ...rest }) {
|
|
@@ -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
|
-
// A breadcrumb trail —
|
|
3
|
+
// A breadcrumb trail — record-page nav ("Companies / Google").
|
|
4
4
|
const config = defineRecipe({
|
|
5
5
|
name: "breadcrumb",
|
|
6
6
|
base: `display: flex; align-items: center; gap: ${c.space["0.5"]}; font-family: ${c.font.sans}; font-size: ${c.text.lg};
|
|
@@ -5,7 +5,7 @@ import { bulkbarRecipe } from "./bulkbar.recipe.js";
|
|
|
5
5
|
/**
|
|
6
6
|
* A floating bulk-action bar. Rises from the bottom-centre of its nearest
|
|
7
7
|
* positioned ancestor when a selection is active; render it conditionally
|
|
8
|
-
* (e.g. `count > 0 && <BulkBar …/>`). Measured from
|
|
8
|
+
* (e.g. `count > 0 && <BulkBar …/>`). Measured from a records table.
|
|
9
9
|
*/
|
|
10
10
|
export function BulkBar({ count, onClear, countLabel = "selected", countText = (count, label) => (_jsxs(_Fragment, { children: [count, " ", label] })), children, className, clearLabel = "Clear selection", ...rest }) {
|
|
11
11
|
return (_jsx("div", { className: bulkbarRecipe({ className }), ...rest, children: _jsxs("div", { className: "bulkbar-bar", children: [count != null && (_jsxs("button", { type: "button", className: "bulkbar-count", onClick: onClear, title: clearLabel, children: [countText(count, countLabel), _jsx(X, { size: 13, strokeWidth: 2, "aria-hidden": "true" })] })), children] }) }));
|
|
@@ -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
|
// A floating bulk-action bar — the pill that rises from the bottom of a
|
|
4
4
|
// selection surface (a table, a gallery) when one or more rows are selected.
|
|
5
|
-
// Measured from
|
|
5
|
+
// Measured from a records-table bulk bar. The root is an absolutely-
|
|
6
6
|
// positioned anchor that centres the bar with flex (NOT a transform): a resting
|
|
7
7
|
// transform on the bar would reparent any `position: fixed` menu inside it (the
|
|
8
8
|
// "More" overflow), detaching it — the enter slide lives in @starting-style only.
|
|
@@ -9,7 +9,7 @@ const DEFAULT_ICONS = {
|
|
|
9
9
|
danger: CircleAlert,
|
|
10
10
|
};
|
|
11
11
|
/**
|
|
12
|
-
* An inline callout / banner — measured from
|
|
12
|
+
* An inline callout / banner — measured from info notices. `tone` tints
|
|
13
13
|
* the background and icon; pass a `title` and/or body `children`.
|
|
14
14
|
*/
|
|
15
15
|
export function Callout({ tone = "neutral", icon, title, children, action, className, ...rest }) {
|
|
@@ -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 callout / banner —
|
|
3
|
+
// A callout / banner — inline info notices (e.g. "Changes apply to all
|
|
4
4
|
// workspaces", the trial banner). Tone tints the background + icon.
|
|
5
5
|
const config = defineRecipe({
|
|
6
6
|
name: "callout",
|
|
@@ -3,7 +3,7 @@ import * as React from "react";
|
|
|
3
3
|
import { Primitive } from "../../core/index.js";
|
|
4
4
|
import { checkboxRecipe } from "./checkbox.recipe.js";
|
|
5
5
|
/**
|
|
6
|
-
* A native `<input type="checkbox">` styled to
|
|
6
|
+
* A native `<input type="checkbox">` styled to the measured grid checkbox (16px,
|
|
7
7
|
* r6, brand fill + white check). Native on purpose: keyboard, focus, and form
|
|
8
8
|
* semantics come for free. `indeterminate` is a DOM-only property, so it is
|
|
9
9
|
* applied via ref rather than an attribute.
|
|
@@ -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 16px square checkbox measured from
|
|
3
|
+
// A 16px square checkbox measured from a record grid: r6, a subtle 1px
|
|
4
4
|
// inset ring when empty, brand fill + white check when on. The check is a
|
|
5
5
|
// data-URI SVG background so it renders reliably (input pseudo-content doesn't).
|
|
6
6
|
const CHECK = "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E\")";
|
|
@@ -3,14 +3,14 @@ import { ChevronDown, Plus } from "lucide-react";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { Menu, MenuItem } from "../menu/index.js";
|
|
5
5
|
import { columncalcRecipe } from "./columncalc.recipe.js";
|
|
6
|
-
/** The four
|
|
6
|
+
/** The four calcs offered on every column, in their order. */
|
|
7
7
|
export const UNIVERSAL_CALCS = [
|
|
8
8
|
"countEmpty",
|
|
9
9
|
"countFilled",
|
|
10
10
|
"percentEmpty",
|
|
11
11
|
"percentFilled",
|
|
12
12
|
];
|
|
13
|
-
/** The four
|
|
13
|
+
/** The four calcs added for numeric columns, in their order. */
|
|
14
14
|
export const NUMERIC_CALCS = ["sum", "average", "min", "max"];
|
|
15
15
|
export const CALC_LABEL = {
|
|
16
16
|
none: "None",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
//
|
|
3
|
+
// The column footer calculation. The summary row is 36px and sticky at the
|
|
4
4
|
// grid's bottom edge; each cell holds a quiet trigger that reads "Add
|
|
5
5
|
// calculation" until an aggregation is chosen, then shows the value with its
|
|
6
6
|
// operation name beside it.
|
|
@@ -11,7 +11,7 @@ const config = defineRecipe({
|
|
|
11
11
|
shrink the button back to its text. Make the wrapper fill too, so the
|
|
12
12
|
whole cell stays clickable. */
|
|
13
13
|
& .menu { width: 100%; height: 100%; }
|
|
14
|
-
/*
|
|
14
|
+
/* The hit target is the WHOLE summary cell -- measured 246x37 with
|
|
15
15
|
padding 0 12px, not a content-sized chip. Clicking anywhere in the cell
|
|
16
16
|
opens the aggregation menu. */
|
|
17
17
|
& .columncalc-trigger { display: flex; align-items: center; gap: ${c.space["1"]}; width: 100%; height: 100%; min-height: ${c.size.tableRow}; margin: 0; padding: 0 ${c.space["3"]}; border: none; border-radius: ${c.radius.md}; background: transparent; color: ${c.fgMuted}; font-family: inherit; font-size: ${c.text.md}; font-weight: ${c.weight.medium}; white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
|
|
@@ -33,7 +33,7 @@ function asText(v) {
|
|
|
33
33
|
return v.join(", ");
|
|
34
34
|
return String(v);
|
|
35
35
|
}
|
|
36
|
-
// stable pastel tone per string value — colour-coded tags/statuses
|
|
36
|
+
// stable pastel tone per string value — colour-coded tags/statuses
|
|
37
37
|
const TAG_TONES = [
|
|
38
38
|
"brand",
|
|
39
39
|
"success",
|
|
@@ -241,8 +241,8 @@ export function DataTable({ columns: columnsProp, data, selectable = false, sele
|
|
|
241
241
|
});
|
|
242
242
|
}, [filtered, sorts, colByKey]);
|
|
243
243
|
/**
|
|
244
|
-
* Rows bucketed under a heading, preserving first-seen group order (
|
|
245
|
-
*
|
|
244
|
+
* Rows bucketed under a heading, preserving first-seen group order (a
|
|
245
|
+
* grouped view without reordering within a group). One bucket with a null
|
|
246
246
|
* group when `groupBy` is absent, so the render path is identical either way.
|
|
247
247
|
*/
|
|
248
248
|
const groupedRows = React.useMemo(() => {
|
|
@@ -274,7 +274,7 @@ export function DataTable({ columns: columnsProp, data, selectable = false, sele
|
|
|
274
274
|
}
|
|
275
275
|
function cycleSort(key) {
|
|
276
276
|
// Clicking a header drives a single sort, as before. Multi-sort is supplied
|
|
277
|
-
// by the caller through the `sort` prop (
|
|
277
|
+
// by the caller through the `sort` prop (built in a sort popover).
|
|
278
278
|
const dir = sortDirByKey.get(key);
|
|
279
279
|
if (!dir)
|
|
280
280
|
setSort({ key, dir: "asc" });
|
|
@@ -284,7 +284,7 @@ export function DataTable({ columns: columnsProp, data, selectable = false, sele
|
|
|
284
284
|
setSort(null);
|
|
285
285
|
}
|
|
286
286
|
/**
|
|
287
|
-
* Which editor a column gets. Mirrors RecordsTable — the
|
|
287
|
+
* Which editor a column gets. Mirrors RecordsTable — the measured
|
|
288
288
|
* sibling — rather than giving every type the same text box:
|
|
289
289
|
* number/currency numeric, with a decimal keypad on touch
|
|
290
290
|
* date a native date field
|
|
@@ -14,7 +14,7 @@ const config = defineRecipe({
|
|
|
14
14
|
& .datatable-search input::placeholder { color: ${c.fgMuted}; }
|
|
15
15
|
& .datatable-search input:focus { box-shadow: inset 0 0 0 1px ${c.bgBrandSolid}; }
|
|
16
16
|
& .datatable-count { margin-inline-start: auto; font-size: ${c.text.md}; color: ${c.fgMuted}; }
|
|
17
|
-
/*
|
|
17
|
+
/* The header cell has no padding of its own -- the button owns the
|
|
18
18
|
full cell so the whole header is clickable (its own inset is 12px).
|
|
19
19
|
Mirrors the summary-row fix. */
|
|
20
20
|
& th { padding: 0; }
|
|
@@ -28,11 +28,11 @@ const config = defineRecipe({
|
|
|
28
28
|
& th .menu { width: 100%; height: 100%; }
|
|
29
29
|
& .datatable-th-inner { display: inline-flex; align-items: center; gap: ${c.space["1.5"]}; width: 100%; min-width: 0; height: 100%; }
|
|
30
30
|
& .datatable-th-inner > svg { flex-shrink: 0; color: ${c.fgMuted}; }
|
|
31
|
-
/*
|
|
31
|
+
/* The summary cell has NO padding of its own -- the calculation trigger
|
|
32
32
|
owns the whole 246x37 area so a click anywhere in the cell opens the
|
|
33
33
|
menu. Zero the cell's inset and let ColumnCalc supply the 12px. */
|
|
34
34
|
& tfoot td { padding: 0; }
|
|
35
|
-
/* Group heading row --
|
|
35
|
+
/* Group heading row -- a view is grouped under a subtle label with the
|
|
36
36
|
bucket's count beside it. */
|
|
37
37
|
& .datatable-viewsettings { display: inline-flex; align-items: center; gap: ${c.space["1.5"]}; height: ${c.size.row}; margin: 0; padding: 0 ${c.space["2"]}; border: none; border-radius: ${c.radius.md}; background: transparent; color: ${c.fgMuted}; font-family: inherit; font-size: ${c.text.md}; font-weight: ${c.weight.medium}; white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
|
|
38
38
|
& .datatable-viewsettings:hover { background: color-mix(in srgb, ${c.fgPrimary} 4%, transparent); color: ${c.fgPrimary}; }
|
|
@@ -90,13 +90,13 @@ const config = defineRecipe({
|
|
|
90
90
|
& .datatable-tag[data-tone="orange"] { background: color-mix(in srgb, ${c.bgOrange} 16%, transparent); color: color-mix(in srgb, ${c.bgOrange} 82%, ${c.fgPrimary}); }
|
|
91
91
|
& .datatable-num { font-variant-numeric: tabular-nums; }
|
|
92
92
|
& .datatable-muted { color: ${c.fgMuted}; }
|
|
93
|
-
/* row drag-to-reorder --
|
|
93
|
+
/* row drag-to-reorder -- a Settings > Objects > Attributes screen measures
|
|
94
94
|
a leading 20px grip column, a 16px grip icon, and the row's own
|
|
95
95
|
hairline doubling as the drop indicator (it tints toward the brand
|
|
96
96
|
colour as the active drop target). The affordance + geometry are
|
|
97
97
|
measured; the drag MECHANISM is crisp's existing house idiom -- HTML5
|
|
98
98
|
draggable + dataTransfer, the same one column reorder already uses
|
|
99
|
-
(RecordsTable's reorderColumn) -- not
|
|
99
|
+
(RecordsTable's reorderColumn) -- not a proprietary
|
|
100
100
|
pointer-events implementation. */
|
|
101
101
|
& .datatable-col-grip { width: 20px; padding: 0; text-align: center; }
|
|
102
102
|
& .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: ${c.fgMuted}; cursor: grab; }
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// seed-design's calendar structure on
|
|
4
|
-
// markup and range model are seed's; every visual value is measured from
|
|
5
|
-
//
|
|
3
|
+
// seed-design's calendar structure on the measured scale. The behaviour,
|
|
4
|
+
// markup and range model are seed's; every visual value is measured from a
|
|
5
|
+
// live date picker (task due-date field): a 32px day on a 34px
|
|
6
6
|
// pitch, an 8px-radius highlight rather than a circle, 14/20 medium numerals and
|
|
7
7
|
// the brand blue for the selection.
|
|
8
8
|
//
|
|
@@ -17,7 +17,7 @@ const fromDate = (d) => ({
|
|
|
17
17
|
day: d.getDate(),
|
|
18
18
|
});
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* A measured date field: a trigger showing the value, opening a calendar in a
|
|
21
21
|
* popover. This is what `DatePicker` used to be; `DatePicker` is now
|
|
22
22
|
* seed-design's bare calendar, and this composes it.
|
|
23
23
|
*/
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// The trigger crisp's DatePicker used to own, measured
|
|
3
|
+
// The trigger crisp's DatePicker used to own, measured live: a 32px
|
|
4
4
|
// outlined chip showing the value, opening a calendar in a popover. Split out
|
|
5
|
-
// when DatePicker became seed-design's bare calendar, so this
|
|
5
|
+
// when DatePicker became seed-design's bare calendar, so this measured
|
|
6
6
|
// field survives unchanged for the consumers already using it.
|
|
7
7
|
const config = defineRecipe({
|
|
8
8
|
name: "datepickerfield",
|
|
@@ -19,7 +19,7 @@ function useDialogInstanceId() {
|
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* A modal dialog — composes Zag's dialog machine (focus trap, scroll lock,
|
|
22
|
-
* Escape / outside-click dismissal) with the measured
|
|
22
|
+
* Escape / outside-click dismissal) with the measured modal surface.
|
|
23
23
|
* Compose the body with `DialogBody` and actions with `DialogFooter`.
|
|
24
24
|
*/
|
|
25
25
|
export function Dialog({ open, onOpenChange, title, icon, width = 640, "aria-label": ariaLabel, closeLabel = "Close", children, className, style, "aria-describedby": describedBy, ...rest }) {
|
|
@@ -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
|
-
// A modal dialog surface — measured from
|
|
3
|
+
// A modal dialog surface — measured from a create-record modal: a radius-16
|
|
4
4
|
// frosted-glass card (60% tinted background + 15px backdrop blur, both re-measured
|
|
5
5
|
// per theme — light uses a blue-tinted 3-layer shadow, dark drops to a plain
|
|
6
6
|
// 2-layer black shadow) with a bordered header (title + close), a scrollable
|
|
@@ -12,7 +12,7 @@ const PALETTE = [
|
|
|
12
12
|
c.bgDanger,
|
|
13
13
|
];
|
|
14
14
|
/**
|
|
15
|
-
* A donut / ring chart — measured from
|
|
15
|
+
* A donut / ring chart — measured from a reports breakdown report. SVG
|
|
16
16
|
* ring using the r=15.915 (circumference 100) trick so slices are percentages;
|
|
17
17
|
* a centred total and an optional legend. `role="img"` with a summary.
|
|
18
18
|
*/
|
|
@@ -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 donut / ring chart — measured from
|
|
3
|
+
// A donut / ring chart — measured from Reports breakdown reports: a
|
|
4
4
|
// segmented ring with a centred total, plus a legend of coloured swatches with
|
|
5
5
|
// labels and values. Pure SVG ring; HTML legend.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -12,9 +12,9 @@ const config = defineRecipe({
|
|
|
12
12
|
variant: {
|
|
13
13
|
// compact icon tile (default)
|
|
14
14
|
default: ``,
|
|
15
|
-
// a large icon on a dotted-grid backdrop —
|
|
15
|
+
// a large icon on a dotted-grid backdrop — a Developers/Reports empty state
|
|
16
16
|
illustrated: `& .emptystate-icon { width: 132px; height: 96px; margin-bottom: ${c.space["2"]}; border-radius: 0; color: color-mix(in srgb, ${c.fgPrimary} 22%, transparent); background: radial-gradient(circle, color-mix(in srgb, ${c.fgPrimary} 12%, transparent) 1.2px, transparent 1.2px) 0 0 / 16px 16px; }`,
|
|
17
|
-
//
|
|
17
|
+
// A full-view empty state (measured from a filtered-to-zero records table):
|
|
18
18
|
// a 45px ringed circle icon, a 20/24 semibold heading, a 14/20 medium muted body,
|
|
19
19
|
// then a primary action. Gaps are 16 / 8 / 16 (icon→title→desc→action).
|
|
20
20
|
page: `gap: ${c.space["2"]};
|
|
@@ -6,7 +6,7 @@ import * as React from "react";
|
|
|
6
6
|
import { useFocusAfterRemoval } from "../../core/index.js";
|
|
7
7
|
import { fileuploadRecipe } from "./fileupload.recipe.js";
|
|
8
8
|
export const fileUploadLabels = {
|
|
9
|
-
//
|
|
9
|
+
// Matches the copy on the record Files pane.
|
|
10
10
|
title: "No files",
|
|
11
11
|
hint: "Drag a file here or choose one from your computer.",
|
|
12
12
|
remove: "Remove file",
|