@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
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
// seed-design's file-upload behaviour on
|
|
3
|
+
// seed-design's file-upload behaviour on the measured scale.
|
|
4
4
|
//
|
|
5
|
-
// Measured from
|
|
5
|
+
// Measured from a record Files pane (Deal record → Files, empty state):
|
|
6
6
|
// the title is 16/20 at weight 600 in `rgb(16,17,18)` (= gray900 = fgPrimary),
|
|
7
7
|
// the hint 14/20 at weight 500 in `rgba(0,0,0,0.63)`, and the action button is
|
|
8
8
|
// 28px tall with an 8px corner.
|
|
9
9
|
//
|
|
10
|
-
//
|
|
10
|
+
// That pane draws NO boundary around itself -- the whole surface is the drop
|
|
11
11
|
// target -- but a reusable dropzone needs an edge, so the dashed affordance is
|
|
12
12
|
// crisp's own measured one from `sidebar-newlist` (1px dashed borderDefault,
|
|
13
|
-
// r8, bgRaised on hover) rather than a new invention.
|
|
13
|
+
// r8, bgRaised on hover) rather than a new invention. The drag-OVER
|
|
14
14
|
// treatment could not be measured: synthetic DragEvents do not trigger its
|
|
15
15
|
// handlers. The active state therefore reuses the brand emphasis crisp already
|
|
16
16
|
// uses for a live drag affordance (`appshell-resize[data-dragging]`).
|
|
@@ -40,12 +40,12 @@ const config = defineRecipe({
|
|
|
40
40
|
& .fileupload-zone[data-disabled] { opacity: .5; cursor: not-allowed; }
|
|
41
41
|
& .fileupload-zone[data-invalid] { border-color: ${c.bgDanger}; }
|
|
42
42
|
|
|
43
|
-
/*
|
|
43
|
+
/* "No files" 16/20 weight 600 */
|
|
44
44
|
& .fileupload-title {
|
|
45
45
|
color: ${c.fgPrimary}; font-size: ${c.text.xl}; line-height: 20px;
|
|
46
46
|
font-weight: ${c.weight.semibold};
|
|
47
47
|
}
|
|
48
|
-
/*
|
|
48
|
+
/* The hint line, 14/20 weight 500 at 63% of the foreground */
|
|
49
49
|
& .fileupload-hint {
|
|
50
50
|
color: color-mix(in srgb, ${c.fgPrimary} 63%, transparent);
|
|
51
51
|
font-size: ${c.text.lg}; line-height: 20px;
|
|
@@ -52,7 +52,7 @@ function useFieldWiring({ htmlFor, messageId, invalid, required, }) {
|
|
|
52
52
|
}, [htmlFor, messageId, invalid, required]);
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* A labelled form field — measured from
|
|
55
|
+
* A labelled form field — measured from settings forms. A muted label
|
|
56
56
|
* above any control, with an optional description or error line below. When
|
|
57
57
|
* `error` is set it replaces the description; the control is given
|
|
58
58
|
* `aria-describedby`, plus `aria-invalid` and `aria-required` as they apply.
|
|
@@ -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 labelled form field — measured from
|
|
3
|
+
// A labelled form field — measured from Settings forms: a 12px/500 muted
|
|
4
4
|
// label above the control, with an optional description or danger error line
|
|
5
5
|
// below. Wraps any control (Input, Select, Textarea…).
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -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
|
-
// Geometry is
|
|
3
|
+
// Geometry is measured: 32/36px tall, r8/r10, 10/12px side padding.
|
|
4
4
|
// The FOCUS TREATMENT is seed-design's, measured from @seed-design/css: a 2px
|
|
5
5
|
// ring on an ::after overlay that is present-but-transparent at rest, so
|
|
6
6
|
// focusing cannot shift layout the way a width change would, and animates
|
|
@@ -10,7 +10,7 @@ function niceNum(raw) {
|
|
|
10
10
|
return step * mag;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* A responsive line chart — measured from
|
|
13
|
+
* A responsive line chart — measured from a reports historical chart.
|
|
14
14
|
* A stretched SVG line/area (non-scaling stroke keeps it crisp) over dashed
|
|
15
15
|
* gridlines; dots are HTML so they stay round. `role="img"` with a summary.
|
|
16
16
|
*/
|
|
@@ -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 line chart — measured from
|
|
3
|
+
// A responsive line chart — measured from Reports historical charts: a
|
|
4
4
|
// brand line with a soft area fill over dashed horizontal gridlines, a value
|
|
5
5
|
// axis on the left, and category labels below. The plot is an SVG stretched to
|
|
6
6
|
// its box (non-scaling stroke keeps the line crisp); axes are HTML.
|
|
@@ -6,7 +6,7 @@ import { menuRecipe } from "./menu.recipe.js";
|
|
|
6
6
|
import { useMenuKeyboard } from "./menu-keyboard.js";
|
|
7
7
|
const MenuContext = React.createContext(null);
|
|
8
8
|
/**
|
|
9
|
-
* A dropdown menu — the ⋯ / sort / filter menu surface, on
|
|
9
|
+
* A dropdown menu — the ⋯ / sort / filter menu surface, on a measured
|
|
10
10
|
* popover. Give it a `trigger` element and Menu items as children. Opens on
|
|
11
11
|
* click / ↓ / Enter; roving-focus keyboard model (↑/↓ move, Home/End jump,
|
|
12
12
|
* typeahead, Enter/Space select, Esc closes and returns focus to the trigger);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c, elevation as e } from "../../tokens/index.js";
|
|
3
|
-
// A dropdown menu — same popover surface
|
|
4
|
-
// menus (measured from
|
|
3
|
+
// A dropdown menu — same popover surface used for ⋯ / sort / filter
|
|
4
|
+
// menus (measured from listboxes): radius 12, 4px padding, a layered
|
|
5
5
|
// soft shadow, over 32px items (radius 8, icon + label + optional shortcut /
|
|
6
6
|
// check). The content is rendered inside this relative root so it keeps these
|
|
7
7
|
// nested styles while escaping the trigger's own box.
|
|
@@ -24,7 +24,7 @@ function Chip({ opt }) {
|
|
|
24
24
|
return (_jsx("span", { className: "recordstable-tag", "data-tone": opt.tone ?? toneFor(opt.value), children: opt.label }));
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
|
-
* A multi-select / tag editor — measured from
|
|
27
|
+
* A multi-select / tag editor — measured from a cell tag picker. The
|
|
28
28
|
* outlined trigger shows the selected values as coloured chips; it opens a
|
|
29
29
|
* popover with a search field over rows of "[chip] … [checkbox]" that toggle on
|
|
30
30
|
* click (the menu stays open). Keyboard: ↑/↓ move, Enter toggles, Esc closes.
|
|
@@ -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 multi-select / tag editor — measured from
|
|
3
|
+
// A multi-select / tag editor — measured from a cell tag picker: an
|
|
4
4
|
// outlined trigger showing the selected values as coloured chips, opening a
|
|
5
5
|
// popover with a search field over rows of "[coloured chip] … [checkbox]" that
|
|
6
6
|
// toggle on click. The popover keeps these nested styles by rendering inside
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
3
|
// A progress indicator — a continuous brand-filled track, or a segmented row of
|
|
4
|
-
// pills (
|
|
4
|
+
// pills (a "Getting started 3/6" bar).
|
|
5
5
|
const config = defineRecipe({
|
|
6
6
|
name: "progress",
|
|
7
7
|
base: `display: block; box-sizing: border-box; height: 6px; border-radius: ${c.radius.full}; background: color-mix(in srgb, ${c.fgPrimary} 8%, transparent); overflow: hidden;
|
|
@@ -2,8 +2,8 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
3
|
// seed-design's quantity-picker, shape for shape, in crisp's colours.
|
|
4
4
|
//
|
|
5
|
-
//
|
|
6
|
-
// as with Slider there is nothing
|
|
5
|
+
// No stepper exists — quantity-ish fields are plain number inputs — so
|
|
6
|
+
// as with Slider there is nothing measured to draw from and the GEOMETRY is
|
|
7
7
|
// seed's own, read from `@seed-design/css/recipes/quantity-picker.css`:
|
|
8
8
|
//
|
|
9
9
|
// size root height / button square radius icon text
|
|
@@ -5,7 +5,7 @@ import { radiogroupRecipe } from "./radiogroup.recipe.js";
|
|
|
5
5
|
import { useRadioGroupKeyboard } from "./radiogroup-keyboard.js";
|
|
6
6
|
const RadioContext = React.createContext(null);
|
|
7
7
|
/**
|
|
8
|
-
* A radio group — measured from
|
|
8
|
+
* A radio group — measured from a settings page. `default` renders rows (a ring
|
|
9
9
|
* that fills brand when selected + a label); `card` renders a row of bordered
|
|
10
10
|
* preview cards whose border turns brand when picked (the Theme picker). Arrow
|
|
11
11
|
* keys move between options (roving focus). Controlled or uncontrolled.
|
|
@@ -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 radio group with two shapes, measured from
|
|
3
|
+
// A radio group with two shapes, measured from settings: the default is
|
|
4
4
|
// a column of rows (a 16px ring that fills brand when selected + a label); the
|
|
5
5
|
// `card` variant is a row of bordered preview cards (radius 16) whose border
|
|
6
6
|
// turns brand (#266df0) when selected — the Appearance "Theme" picker.
|
|
@@ -53,7 +53,7 @@ export function writeStoredPercent(key, percent, storage = window.localStorage)
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
|
-
*
|
|
56
|
+
* An adjustable-panel primitive: a spacer that reserves layout width
|
|
57
57
|
* plus a panel that overlays it, so the panel can move between docked
|
|
58
58
|
* (in-flow) and floating (`position: fixed`, an overlay) without a reflow
|
|
59
59
|
* glitch. Drag the edge handle to resize; constraints are CSS `min-width`/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c, elevation as e } from "../../tokens/index.js";
|
|
3
|
-
//
|
|
4
|
-
//
|
|
3
|
+
// The adjustable-panel primitive (measured live). Two elements carry the
|
|
4
|
+
// layout: an
|
|
5
5
|
// invisible SPACER that reserves flow width (it alone animates `width`, a
|
|
6
6
|
// cheap reflow of a leaf node) and the PANEL, taken out of flow with
|
|
7
7
|
// `position: absolute` and drawn on top of the spacer. That split is what
|
|
@@ -4,7 +4,7 @@ import { useLabelAssociation } from "../../core/index.js";
|
|
|
4
4
|
import { useRadioGroupKeyboard } from "../radiogroup/index.js";
|
|
5
5
|
import { segmentedRecipe } from "./segmented.recipe.js";
|
|
6
6
|
/**
|
|
7
|
-
* A segmented control (single-choice toggle) — measured from
|
|
7
|
+
* A segmented control (single-choice toggle) — measured from a view
|
|
8
8
|
* switcher. `role="radiogroup"` over `role="radio"` buttons with roving
|
|
9
9
|
* tabindex and ←/→ (Home/End) keyboard selection.
|
|
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 segmented control —
|
|
3
|
+
// A segmented control — a view switcher: a subtle track holding options,
|
|
4
4
|
// the selected one raised on a white pill.
|
|
5
5
|
const config = defineRecipe({
|
|
6
6
|
name: "segmented",
|
|
@@ -10,7 +10,7 @@ function optionText(o) {
|
|
|
10
10
|
return typeof o.label === "string" ? o.label : o.value;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* A select / dropdown — the settings control, measured
|
|
13
|
+
* A select / dropdown — the settings control, measured live, with an
|
|
14
14
|
* optional Linear-style search. A `role="combobox"` trigger opens a
|
|
15
15
|
* `role="listbox"`; pass `searchable` to add a filter field at the top (with a
|
|
16
16
|
* "No results" empty state). Full keyboard model — ↑/↓ move, Enter/Space pick,
|
|
@@ -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 select / dropdown, measured from
|
|
3
|
+
// A select / dropdown, measured from settings: a 32px combobox trigger
|
|
4
4
|
// (radius 9, value + a 16px chevron) over a listbox — radius 12, 4px padding, a
|
|
5
5
|
// layered soft shadow — of 32px options (radius 8, 6/8 padding) that show a
|
|
6
6
|
// check on the selected one and highlight on hover / keyboard. The listbox is
|
|
@@ -54,7 +54,7 @@ const config = defineRecipe({
|
|
|
54
54
|
`,
|
|
55
55
|
variants: {
|
|
56
56
|
// ghost: borderless at rest (transparent), reveals a subtle fill on hover —
|
|
57
|
-
//
|
|
57
|
+
// inline selects (e.g. the sort configurator).
|
|
58
58
|
variant: {
|
|
59
59
|
default: "",
|
|
60
60
|
ghost: `
|
|
@@ -2,9 +2,9 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
|
2
2
|
import { contract as c, elevation as e } from "../../tokens/index.js";
|
|
3
3
|
// seed-design's slider, shape for shape, in crisp's colours.
|
|
4
4
|
//
|
|
5
|
-
//
|
|
5
|
+
// No slider ships anywhere — Records, Reports, Settings and the record
|
|
6
6
|
// pages contain no `input[type=range]` or `[role=slider]` — so there is nothing
|
|
7
|
-
//
|
|
7
|
+
// measured to draw from. The GEOMETRY is therefore seed's own, read from
|
|
8
8
|
// `@seed-design/css/recipes/slider.css`: a 26px control row, a 4px track on
|
|
9
9
|
// `radius.full`, a 20px thumb whose visible disc is an `::after` that scales to
|
|
10
10
|
// 1.2 while dragging, and a 2px focus ring offset 2px.
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { stagebarRecipe } from "./stagebar.recipe.js";
|
|
3
3
|
const DEFAULT = "#266df0";
|
|
4
4
|
/**
|
|
5
|
-
* A pipeline stage bar — measured from
|
|
5
|
+
* A pipeline stage bar — measured from a deal-stage highlight. Each stage
|
|
6
6
|
* is a segment tinted with its colour; the current stage is at full strength.
|
|
7
7
|
*/
|
|
8
8
|
export function StageBar({ stages, current, "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 pipeline stage indicator —
|
|
3
|
+
// A pipeline stage indicator — a Deal-stage Highlight bar: one segment per
|
|
4
4
|
// stage, each tinted with its stage colour, the current stage at full strength.
|
|
5
5
|
const config = defineRecipe({
|
|
6
6
|
name: "stagebar",
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { ArrowDown, ArrowUp } from "lucide-react";
|
|
3
3
|
import { statcardRecipe } from "./statcard.recipe.js";
|
|
4
4
|
/**
|
|
5
|
-
* A single-metric KPI tile — measured from
|
|
5
|
+
* A single-metric KPI tile — measured from a reports number/insight card.
|
|
6
6
|
* Label, a large value, and an optional up/down delta pill with a caption.
|
|
7
7
|
*/
|
|
8
8
|
export function StatCard({ label, icon, value, delta, deltaSuffix = "%", caption, card, 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 single-metric KPI tile — measured from
|
|
3
|
+
// A single-metric KPI tile — measured from a Reports "Insight" number
|
|
4
4
|
// report: a small muted label, a large semibold value, and an optional delta
|
|
5
5
|
// pill (green up / red down) with a caption. Fills its container.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -18,7 +18,7 @@ const config = defineRecipe({
|
|
|
18
18
|
& .statcard-delta[data-trend="flat"] { background: color-mix(in srgb, ${c.fgPrimary} 6%, transparent); color: ${c.fgMuted}; }`,
|
|
19
19
|
variants: {
|
|
20
20
|
// Opt-in chrome for consumers who want the tile self-contained instead of
|
|
21
|
-
// hand-wrapping it in <Card><CardBody>. Not measured as part of the
|
|
21
|
+
// hand-wrapping it in <Card><CardBody>. Not measured as part of the
|
|
22
22
|
// report tile itself (the tile sits bare inside the report's own Card —
|
|
23
23
|
// see the docs page) — reuses Card's exact border/radius/bg rather than
|
|
24
24
|
// inventing a new value, since it is only ever an explicit opt-in.
|
|
@@ -3,7 +3,7 @@ import * as React from "react";
|
|
|
3
3
|
import { formValueStyle, useFormReset } from "../../core/index.js";
|
|
4
4
|
import { switchRecipe } from "./switch.recipe.js";
|
|
5
5
|
/**
|
|
6
|
-
* An on/off toggle — the settings switch, measured
|
|
6
|
+
* An on/off toggle — the settings switch, measured live. Renders a
|
|
7
7
|
* `role="switch"` button (a native checkbox's semantics without its box), so
|
|
8
8
|
* label association and keyboard (Space/Enter) come for free. Controlled via
|
|
9
9
|
* `checked`/`onCheckedChange`, or uncontrolled from `defaultChecked`.
|
|
@@ -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
|
+
// A settings toggle, measured from the live app: a 24×16 pill track that
|
|
4
4
|
// flips from a muted grey to brand blue (#266df0), with a 12px white thumb
|
|
5
5
|
// (2px inset) that slides 8px across. background + transform both animate .2s.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -2,7 +2,7 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
3
|
// A general-purpose, composable data table — the lightweight primitive for
|
|
4
4
|
// arbitrary tabular data (as opposed to `product/recordstable`, which is a
|
|
5
|
-
// faithful rebuild of
|
|
5
|
+
// faithful rebuild of a heavy records grid). It carries the SAME measured
|
|
6
6
|
// grid styling as RecordsTable — 36px rows, a 40px header, hairline vertical +
|
|
7
7
|
// horizontal grid lines — so `DataTable` (built on this) matches that polish.
|
|
8
8
|
const config = defineRecipe({
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { contract as c, elevation as e } from "../../tokens/index.js";
|
|
2
|
-
// The measured chrome of
|
|
2
|
+
// The measured chrome of the table toolbar: the Sort/Filter controls, the
|
|
3
3
|
// menu/popover surface they open into, the sort-condition rows, and the filter
|
|
4
4
|
// chips. It lives here, parameterised by class prefix, because TWO surfaces
|
|
5
5
|
// render it — the standalone `TableToolbar` primitive and `RecordsTable`, whose
|
|
6
6
|
// markup predates it and must keep its own `recordstable-` class names.
|
|
7
7
|
//
|
|
8
8
|
// These strings were MOVED out of `recordstable.recipe.ts` verbatim, not
|
|
9
|
-
// retyped: every value is still the one measured
|
|
9
|
+
// retyped: every value is still the one originally measured. Do not "tidy" them.
|
|
10
10
|
//
|
|
11
11
|
// It comes in two halves because RecordsTable interleaves three rules of its own
|
|
12
12
|
// (the context-menu z-index and the column drop-target) into the middle of the
|
|
@@ -28,7 +28,7 @@ const asText = (v) => {
|
|
|
28
28
|
// Before the generic object branch, which would look for `.name`, find none
|
|
29
29
|
// and return "" — turning every Date into the empty string (#185). The ISO
|
|
30
30
|
// date is stable and locale-independent, so `contains "2026-06"` works; it
|
|
31
|
-
// will not match "16/06/2026", and a date-aware operator set
|
|
31
|
+
// will not match "16/06/2026", and a date-aware operator set needs a
|
|
32
32
|
// date-picker UI, which has to be measured before it can be built.
|
|
33
33
|
if (v instanceof Date)
|
|
34
34
|
return Number.isNaN(v.getTime()) ? "" : v.toISOString().slice(0, 10);
|
|
@@ -90,7 +90,7 @@ export function applySorts(rows, sorts, get = (row, key) => row[key]) {
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
93
|
-
*
|
|
93
|
+
* The table toolbar as a standalone primitive: the Sort and Filter
|
|
94
94
|
* controls, their menus, the sort-condition rows and the filter chips.
|
|
95
95
|
*
|
|
96
96
|
* `RecordsTable` renders this same measured chrome internally; this is the
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
3
|
import { toolbarChromeBody, toolbarChromeHead } from "./tabletoolbar.chrome.js";
|
|
4
|
-
//
|
|
4
|
+
// The table toolbar, measured: 28px controls, the Sort/Filter buttons and
|
|
5
5
|
// the menus they open, sort-condition rows, and the filter chips. The chrome
|
|
6
6
|
// itself lives in ./tabletoolbar.chrome.ts because RecordsTable renders the
|
|
7
7
|
// same measured surface under its own class prefix — one source, two prefixes,
|
|
@@ -4,8 +4,8 @@ import { tabsRecipe } from "./tabs.recipe.js";
|
|
|
4
4
|
import { useTablistKeyboard } from "./tabs-keyboard.js";
|
|
5
5
|
/**
|
|
6
6
|
* A row of text tabs over a sliding ink underline — the record-view tab bar,
|
|
7
|
-
* measured
|
|
8
|
-
* Home/End jump); activation follows focus
|
|
7
|
+
* measured live. Roving-tabindex keyboard model (←/→ move + activate,
|
|
8
|
+
* Home/End jump); activation follows focus. Controlled via
|
|
9
9
|
* `value`/`onValueChange`, or uncontrolled from `defaultValue`.
|
|
10
10
|
*/
|
|
11
11
|
export function Tabs({ tabs, value, defaultValue, onValueChange, leading, children, className, "aria-label": ariaLabel, ...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
|
-
//
|
|
3
|
+
// Record-view tabs: a row of segmented tab buttons over a 1px baseline.
|
|
4
4
|
// The active tab is a light pill — bg #fbfbfb + inset ring borderSubtle, r8 —
|
|
5
5
|
// with a 2px ink underline that slides along the baseline; inactive tabs are
|
|
6
6
|
// muted and fill to a subtle pill on hover. Each tab carries a 16px leading icon
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { textareaRecipe } from "./textarea.recipe.js";
|
|
4
4
|
/**
|
|
5
|
-
* A multiline text field — measured from
|
|
5
|
+
* A multiline text field — measured from settings. Forwards every native
|
|
6
6
|
* `<textarea>` prop; pass `showCount` with `maxLength` to render a live
|
|
7
7
|
* character counter (which turns red if the value exceeds the limit).
|
|
8
8
|
*/
|
|
@@ -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 multiline text field, measured from
|
|
3
|
+
// A multiline text field, measured from a settings "Personal context" field: an
|
|
4
4
|
// inset 1px ring (radius 8), 14px text, 6/10 padding, and an optional character
|
|
5
5
|
// counter pinned bottom-right (12px, muted). Focus rings the field brand.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -3,7 +3,7 @@ import * as React from "react";
|
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
4
|
import { tooltipRecipe } from "./tooltip.recipe.js";
|
|
5
5
|
/**
|
|
6
|
-
* A hover/focus tooltip — a dark hint chip measured
|
|
6
|
+
* A hover/focus tooltip — a dark hint chip measured live. Wraps its
|
|
7
7
|
* trigger in an inline element, shows after `delay` on pointer-enter / focus,
|
|
8
8
|
* and hides on leave / blur / Escape. The bubble is portaled and positioned
|
|
9
9
|
* above the trigger (flipping below near the top edge).
|
|
@@ -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 floating bubble for a Tooltip —
|
|
3
|
+
// The floating bubble for a Tooltip — a dark hint chip. Applied to the
|
|
4
4
|
// portaled bubble itself (not a wrapper), so its styles survive the portal.
|
|
5
5
|
const config = defineRecipe({
|
|
6
6
|
name: "tooltip",
|
|
@@ -4,8 +4,8 @@ import * as React from "react";
|
|
|
4
4
|
import { isRtlElement } from "../../core/index.js";
|
|
5
5
|
import { appshellRecipe } from "./appshell.recipe.js";
|
|
6
6
|
/**
|
|
7
|
-
* App-shell layout with a collapsible + resizable sidebar, mirroring
|
|
8
|
-
* window: drag the sidebar's right edge to resize, press the sidebar's
|
|
7
|
+
* App-shell layout with a collapsible + resizable sidebar, mirroring a live
|
|
8
|
+
* app's window: drag the sidebar's right edge to resize, press the sidebar's
|
|
9
9
|
* collapse button to slide it away (a floating button brings it back). The
|
|
10
10
|
* sidebar pane clips rather than squishing, so its content never reflows.
|
|
11
11
|
*/
|
|
@@ -32,8 +32,8 @@ export function AppShell({ sidebar, children, width: widthProp, defaultWidth = 2
|
|
|
32
32
|
// it there. Mirroring the handle's CSS without this is the half-conversion
|
|
33
33
|
// lesson 54 is about, which is why both change in one commit (#212).
|
|
34
34
|
const dir = isRtlElement(e.currentTarget) ? -1 : 1;
|
|
35
|
-
//
|
|
36
|
-
//
|
|
35
|
+
// Only enter the drag state once the pointer has actually moved — a click
|
|
36
|
+
// on the handle is not a drag, so the blue bar must not flash on press.
|
|
37
37
|
let moved = false;
|
|
38
38
|
let last = startW;
|
|
39
39
|
const prevSelect = document.body.style.userSelect;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe, rtlFlipCss } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
3
|
// App-shell layout: a collapsible + resizable sidebar pane next to a main pane,
|
|
4
|
-
// mirroring
|
|
4
|
+
// mirroring a familiar app-window layout. The sidebar pane clips (never squishes)
|
|
5
5
|
// when collapsing, and a drag handle on its edge resizes it.
|
|
6
6
|
const config = defineRecipe({
|
|
7
7
|
name: "appshell",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { authshellRecipe } from "./authshell.recipe.js";
|
|
3
3
|
/**
|
|
4
|
-
* The
|
|
4
|
+
* The welcome/auth layout — measured live.
|
|
5
5
|
* A centered page frame: an optional top progress bar, a logo, a two-pane
|
|
6
6
|
* card (the form + an optional product preview, hidden under 1200px), and
|
|
7
7
|
* a footer. Auth-surface Input/FormField/Button treatment (flatter fields,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
2
|
import { contract as c } from "../../tokens/index.js";
|
|
3
|
-
//
|
|
3
|
+
// A welcome/auth surface — measured live,
|
|
4
4
|
// 2026-09-15. A centered page frame holding a two-pane card: the form on the
|
|
5
5
|
// left, an optional product preview on the right, with an optional top
|
|
6
6
|
// progress bar and a footer under the card. Every value below is measured
|
|
7
7
|
// from the live app, EXCEPT the 1200px preview-hiding breakpoint (called out
|
|
8
|
-
// at the container query below) —
|
|
8
|
+
// at the container query below) — the pane drops out in JS somewhere between a
|
|
9
9
|
// measured 954px and 1393px viewport width, so 1200px is chosen, not measured.
|
|
10
10
|
const config = defineRecipe({
|
|
11
11
|
name: "authshell",
|
|
@@ -48,7 +48,7 @@ const config = defineRecipe({
|
|
|
48
48
|
& .authshell-body .button { height: 36px; padding-inline: ${c.space["3"]}; border-radius: 10px; }
|
|
49
49
|
& .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); }
|
|
50
50
|
|
|
51
|
-
/*
|
|
51
|
+
/* The preview pane drops out in JS on narrow viewports (measured: two
|
|
52
52
|
panes at 1393px, one at 954px), so 1200px is a chosen threshold inside
|
|
53
53
|
that bracket, not a measured value. A CONTAINER query, not a media
|
|
54
54
|
query: the shell is embedded in the docs inside an ~800px column, where
|
|
@@ -6,7 +6,7 @@ import { boardRecipe } from "./board.recipe.js";
|
|
|
6
6
|
* A kanban board with native drag-and-drop between columns. Cards are
|
|
7
7
|
* `draggable`; dropping one on a column reparents it via `onCardsChange`
|
|
8
8
|
* (the parent owns the cards, so the move is a controlled state update).
|
|
9
|
-
* Measured from
|
|
9
|
+
* Measured from a deals pipeline.
|
|
10
10
|
*/
|
|
11
11
|
export function Board({ columns, cards, onCardsChange, renderCard, onNewCard, newCardLabel = "New", getCardLabel, announceMove = (column, card) => card ? `${card} moved to ${column}` : `Moved to ${column}`, className, ...rest }) {
|
|
12
12
|
const [dragId, setDragId] = React.useState(null);
|
|
@@ -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 kanban board — measured from
|
|
3
|
+
// A kanban board — measured from a Deals pipeline: horizontally scrolling
|
|
4
4
|
// columns (dot + title + count header, a "New" button, a stack of draggable
|
|
5
5
|
// cards), with the hovered drop column highlighted.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -208,7 +208,7 @@ export function Command({ open, onOpenChange, items = defaultCommandItems, place
|
|
|
208
208
|
combo.setInputValue("", "script");
|
|
209
209
|
combo.clearHighlightValue();
|
|
210
210
|
}, [open]);
|
|
211
|
-
// The footer's primary button mirrors the currently highlighted row (
|
|
211
|
+
// The footer's primary button mirrors the currently highlighted row (this
|
|
212
212
|
// shows the active action there and runs it on ↵ / click).
|
|
213
213
|
const highlightedItem = filteredItems.find((item) => item.id === combo.highlightedValue) ??
|
|
214
214
|
filteredItems[0];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { entitycardRecipe } from "./entitycard.recipe.js";
|
|
3
3
|
/**
|
|
4
|
-
* A note / entity card — measured from
|
|
4
|
+
* A note / entity card — measured from a notes grid. A bordered white
|
|
5
5
|
* card with an author row, a title, a clamped excerpt, and a footer row with a
|
|
6
6
|
* right-aligned date. Rendered as a button so the whole card is clickable.
|
|
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 note / entity card — measured from
|
|
3
|
+
// A note / entity card — measured from a Notes grid: a bordered white card
|
|
4
4
|
// with an author row (avatar + name) at the top, a title, a clamped excerpt,
|
|
5
5
|
// and a footer row (avatar + name … date). The whole card is clickable.
|
|
6
6
|
const config = defineRecipe({
|
|
@@ -6,7 +6,7 @@ const GRID = 20;
|
|
|
6
6
|
const clampZoom = (z) => Math.min(1.5, Math.max(0.5, z));
|
|
7
7
|
/**
|
|
8
8
|
* A pannable, zoomable node canvas with draggable nodes and connecting edges —
|
|
9
|
-
* measured from
|
|
9
|
+
* measured from a workflows editor. Drag a node to move it (fires
|
|
10
10
|
* `onNodesChange`); drag the background to pan; use the toolbar to zoom.
|
|
11
11
|
*/
|
|
12
12
|
export function FlowCanvas({ nodes, edges, onNodesChange, renderNode, nodeWidth = 240, nodeHeight = 64, "aria-label": ariaLabel, className, zoomOutLabel = "Zoom out", zoomInLabel = "Zoom in", resetLabel = "Reset", edgesLabel = "Edges", ...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 pannable, zoomable node canvas — measured from
|
|
3
|
+
// A pannable, zoomable node canvas — measured from a Workflows editor:
|
|
4
4
|
// a dotted-grid background, draggable node cards, and connecting edges with dots.
|
|
5
5
|
const config = defineRecipe({
|
|
6
6
|
name: "flowcanvas",
|
|
@@ -4,7 +4,7 @@ import * as React from "react";
|
|
|
4
4
|
import { useTablistKeyboard } from "../../components/tabs/index.js";
|
|
5
5
|
import { inboxRecipe } from "./inbox.recipe.js";
|
|
6
6
|
/**
|
|
7
|
-
* A notifications inbox panel — measured from
|
|
7
|
+
* A notifications inbox panel — measured from a notification flyout. A
|
|
8
8
|
* title, Notifications/Requests tabs with counts, then notification rows
|
|
9
9
|
* (avatar + message + time + unread dot) or a centred empty state. Put it inside
|
|
10
10
|
* a Popover for the flyout.
|
|
@@ -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 notifications inbox panel — measured from
|
|
3
|
+
// A notifications inbox panel — measured from a notification flyout: a
|
|
4
4
|
// ~380px rounded panel with a title, "Notifications / Requests" tabs (with
|
|
5
5
|
// counts), then notification rows (avatar + message + time + unread dot) or a
|
|
6
6
|
// centred empty state. Drop it in a Popover for the flyout, or use standalone.
|