@crisp-ui-kit/crisp 0.54.10 → 0.54.11
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/cjs/components/datatable/datatable.js +121 -10
- package/dist/cjs/components/datatable/datatable.recipe.js +24 -0
- package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +25 -2
- package/dist/cjs/components/tabletoolbar/tabletoolbar.js +93 -43
- package/dist/cjs/components/tabletoolbar/tabletoolbar.recipe.js +28 -9
- package/dist/cjs/product/recordpage/column.js +19 -0
- package/dist/cjs/product/recordpage/recordpage.js +5 -4
- package/dist/cjs/product/recordpage/test-fixtures.js +55 -0
- package/dist/cjs/product/recordstable/index.js +1 -1
- package/dist/cjs/product/recordstable/recordstable.js +5 -0
- package/dist/cjs/product/savedviews/savedviews.recipe.js +13 -11
- package/dist/cjs/product/taskstable/taskstable.js +5 -0
- package/dist/datatable.css +14 -0
- package/dist/datatable.layered.css +14 -0
- package/dist/esm/components/datatable/datatable.js +121 -10
- package/dist/esm/components/datatable/datatable.recipe.js +24 -0
- package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +25 -2
- package/dist/esm/components/tabletoolbar/tabletoolbar.js +93 -43
- package/dist/esm/components/tabletoolbar/tabletoolbar.recipe.js +28 -9
- package/dist/esm/product/recordpage/column.js +16 -0
- package/dist/esm/product/recordpage/recordpage.js +2 -1
- package/dist/esm/product/recordpage/test-fixtures.js +52 -0
- package/dist/esm/product/recordstable/index.js +1 -1
- package/dist/esm/product/recordstable/recordstable.js +5 -0
- package/dist/esm/product/savedviews/savedviews.recipe.js +13 -11
- package/dist/esm/product/taskstable/taskstable.js +5 -0
- package/dist/recordstable.css +19 -2
- package/dist/recordstable.layered.css +19 -2
- package/dist/savedviews.css +6 -18
- package/dist/savedviews.layered.css +6 -18
- package/dist/styles.css +62 -23
- package/dist/styles.layered.css +62 -23
- package/dist/tabletoolbar.css +23 -3
- package/dist/tabletoolbar.layered.css +23 -3
- package/dist/types/components/datatable/datatable.d.ts +30 -3
- package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +26 -1
- package/dist/types/product/recordpage/column.d.ts +112 -0
- package/dist/types/product/recordpage/recordpage.d.ts +1 -1
- package/dist/types/product/recordpage/test-fixtures.d.ts +3 -0
- package/dist/types/product/recordpanel/recordpanel.d.ts +1 -1
- package/dist/types/product/recordstable/index.d.ts +1 -1
- package/dist/types/product/recordstable/recordstable.d.ts +6 -1
- package/dist/types/product/taskstable/taskstable.d.ts +5 -0
- package/package.json +1 -1
- /package/dist/cjs/product/{recordstable → recordpage}/editable-field.js +0 -0
- /package/dist/esm/product/{recordstable → recordpage}/editable-field.js +0 -0
- /package/dist/types/product/{recordstable → recordpage}/editable-field.d.ts +0 -0
package/dist/styles.css
CHANGED
|
@@ -751,6 +751,10 @@
|
|
|
751
751
|
& th[data-drop-after]::after { inset-inline-end: -1.5px; }
|
|
752
752
|
/* typed cells — entity (avatar + name), colour-coded tags, numbers, dates */
|
|
753
753
|
& .crisp-datatable-entity { display: flex; align-items: center; gap: var(--crisp-space-1-5); min-width: 0; color: var(--crisp-fg-primary); font-weight: var(--crisp-weight-medium); }
|
|
754
|
+
/* crisp/#601 supersession follow-up -- the same flex-row shape .crisp-datatable-entity gives its own avatar+name+actions, but structural only (no entity-specific colour/weight): lets onOpenComments/onOpenPreview compose alongside ANY column's own
|
|
755
|
+
content (a custom render, or a non-entity built-in type), not just
|
|
756
|
+
type: "entity"'s own inline rendering. */
|
|
757
|
+
& .crisp-datatable-cell-actions-row { display: flex; align-items: center; gap: var(--crisp-space-1-5); min-width: 0; width: 100%; }
|
|
754
758
|
/* crisp/#601, G-050: measured LIVE (getComputedStyle on the name text, plain hover vs rest) that Attio's underline is unconditional, not a
|
|
755
759
|
hover reveal -- identical at rest and on hover: text-decoration-color
|
|
756
760
|
is rgba(0,0,0,0.09), a 9% tint, not the name's own full-contrast text colour. The previous :hover-gated, full-contrast rule here was itself unmeasured and wrong in two ways at once. */
|
|
@@ -782,6 +786,16 @@
|
|
|
782
786
|
/* url/email cell types (#654) -- same measured values as RecordsTable's own .crisp-recordstable-link, which this mirrors: no underline at rest, underline on hover, own-colour text rather than a browser-blue link. */
|
|
783
787
|
& .crisp-datatable-link { color: var(--crisp-fg-primary); text-decoration: none; overflow: hidden; text-overflow: ellipsis; }
|
|
784
788
|
& .crisp-datatable-link:hover { text-decoration: underline; }
|
|
789
|
+
/* rating cell type/editor (#760) -- measured live: 16px stars on an 18px pitch (a 2px gap), an empty star at rgba(0,0,0,0.1), a committed/filled star at brand600 (--crisp-bg-brand-solid, an exact match to the measured #266df0), and a distinct hover-preview colour -- rgb(33,91,196) -- that's close to but NOT brand700/bgBrandSolidPressed
|
|
790
|
+
(#1f5fd6); kept as its own literal rather than forced onto that token,
|
|
791
|
+
since the two were measured stable and different. The read-only svg
|
|
792
|
+
and the editable button's own inner svg both carry the crisp-datatable-rating-star class on the svg itself (not the button), so one set of fill rules covers both -- the button only adds its own reset + cursor via a separate -btn class. */
|
|
793
|
+
& .crisp-datatable-rating { display: inline-flex; align-items: center; gap: 2px; }
|
|
794
|
+
& .crisp-datatable-rating-star { display: block; }
|
|
795
|
+
& .crisp-datatable-rating-star path { fill: rgba(0, 0, 0, 0.1); }
|
|
796
|
+
& .crisp-datatable-rating-star[data-filled] path { fill: var(--crisp-bg-brand-solid); }
|
|
797
|
+
& .crisp-datatable-rating-star[data-hovering] path { fill: #215bc4; }
|
|
798
|
+
& .crisp-datatable-rating-star-btn { display: inline-flex; padding: 0; margin: 0; border: none; background: none; font-family: inherit; cursor: pointer; }
|
|
785
799
|
/* row drag-to-reorder -- a Settings > Objects > Attributes screen measures a leading 20px grip column, a 16px grip icon, and the row's own
|
|
786
800
|
hairline doubling as the drop indicator (it tints toward the brand
|
|
787
801
|
colour as the active drop target). The affordance + geometry are
|
|
@@ -1827,12 +1841,29 @@
|
|
|
1827
1841
|
& .crisp-tabletoolbar-search svg { flex-shrink: 0; }
|
|
1828
1842
|
& .crisp-tabletoolbar-search input { border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-md); color: var(--crisp-fg-primary); width: 180px; }
|
|
1829
1843
|
& .crisp-tabletoolbar-search input::placeholder { color: var(--crisp-fg-muted); }
|
|
1830
|
-
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background:
|
|
1844
|
+
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-divider); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
|
|
1831
1845
|
& .crisp-tabletoolbar-tool:hover { background: var(--crisp-bg-raised); }
|
|
1832
1846
|
& .crisp-tabletoolbar-tool svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
1833
|
-
|
|
1847
|
+
/* crisp/#772: re-measured live on Sort with an actual sort applied -- an active trigger's own fill is white (bgSurface), the same as the
|
|
1848
|
+
base .tool rule above now already sets; this override existed to
|
|
1849
|
+
distinguish active from a base state that used to be transparent.
|
|
1850
|
+
Kept explicit (not just deleted) so a future change to the base
|
|
1851
|
+
rule's background can't silently change this one too. */
|
|
1852
|
+
& .crisp-tabletoolbar-tool--active { background: var(--crisp-bg-surface); }
|
|
1834
1853
|
& .crisp-tabletoolbar-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
|
|
1835
1854
|
& .crisp-tabletoolbar-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
1855
|
+
/* crisp/#772 follow-up, re-measured live 2026-09-25: an EMPTY Sort/Filter
|
|
1856
|
+
trigger (no sort/condition set) isn't a solid-ring chip at all -- it's
|
|
1857
|
+
a dashed ::before (1px dashed, border-radius: inherit, absolutely
|
|
1858
|
+
positioned inset: 0) over a barely-there fill, confirmed on Attio's own empty Filter chip (its ::before border computes to exactly "1px dashed rgba(0, 0, 0, 0.06)"). Once a value IS set, the trigger drops the dashed pseudo and picks up the base tool's own solid ring
|
|
1859
|
+
instead (the --active modifier, unchanged) -- confirmed on Sort with
|
|
1860
|
+
an actual sort applied. color-mix (not the raw rgba Attio computes
|
|
1861
|
+
to) so both the border and the fill flip correctly in dark mode, the
|
|
1862
|
+
same reasoning --ghost above already uses. Only wired into
|
|
1863
|
+
TableToolbar itself (tabletoolbar.tsx) this pass -- RecordsTable's own Sort/Filter triggers share this same chrome function but are deprecated, not touched here. */
|
|
1864
|
+
& .crisp-tabletoolbar-tool--dashed { position: relative; box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); }
|
|
1865
|
+
& .crisp-tabletoolbar-tool--dashed::before { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px dashed color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); pointer-events: none; }
|
|
1866
|
+
& .crisp-tabletoolbar-tool--dashed:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); }
|
|
1836
1867
|
& .crisp-tabletoolbar-toolgroup { position: relative; display: inline-flex; }
|
|
1837
1868
|
& .crisp-tabletoolbar-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
|
|
1838
1869
|
& .crisp-tabletoolbar-menu { position: absolute; top: calc(100% + var(--crisp-space-1)); left: 0; z-index: 30; min-width: 232px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); display: flex; flex-direction: column; gap: var(--crisp-space-px); transform-origin: top; opacity: 1; transform: none; transition: opacity .13s ease, transform .13s ease; }
|
|
@@ -1942,7 +1973,10 @@
|
|
|
1942
1973
|
& .crisp-tabletoolbar-datepop-preset { height: var(--crisp-size-chip); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-chip); background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-sm); cursor: pointer; }
|
|
1943
1974
|
& .crisp-tabletoolbar-datepop-preset:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 8%, transparent); }
|
|
1944
1975
|
|
|
1945
|
-
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface
|
|
1976
|
+
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; cursor: pointer; }
|
|
1977
|
+
|
|
1978
|
+
& .crisp-tabletoolbar-sorted-prefix { color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
1979
|
+
& .crisp-tabletoolbar-sorted-count { font-size: var(--crisp-text-sm); color: color-mix(in srgb, var(--crisp-fg-primary) 73%, transparent); }
|
|
1946
1980
|
[dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
|
|
1947
1981
|
}
|
|
1948
1982
|
|
|
@@ -2963,12 +2997,29 @@
|
|
|
2963
2997
|
& .crisp-recordstable-search svg { flex-shrink: 0; }
|
|
2964
2998
|
& .crisp-recordstable-search input { border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-md); color: var(--crisp-fg-primary); width: 180px; }
|
|
2965
2999
|
& .crisp-recordstable-search input::placeholder { color: var(--crisp-fg-muted); }
|
|
2966
|
-
& .crisp-recordstable-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background:
|
|
3000
|
+
& .crisp-recordstable-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-divider); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
|
|
2967
3001
|
& .crisp-recordstable-tool:hover { background: var(--crisp-bg-raised); }
|
|
2968
3002
|
& .crisp-recordstable-tool svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
2969
|
-
|
|
3003
|
+
/* crisp/#772: re-measured live on Sort with an actual sort applied -- an active trigger's own fill is white (bgSurface), the same as the
|
|
3004
|
+
base .tool rule above now already sets; this override existed to
|
|
3005
|
+
distinguish active from a base state that used to be transparent.
|
|
3006
|
+
Kept explicit (not just deleted) so a future change to the base
|
|
3007
|
+
rule's background can't silently change this one too. */
|
|
3008
|
+
& .crisp-recordstable-tool--active { background: var(--crisp-bg-surface); }
|
|
2970
3009
|
& .crisp-recordstable-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
|
|
2971
3010
|
& .crisp-recordstable-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
3011
|
+
/* crisp/#772 follow-up, re-measured live 2026-09-25: an EMPTY Sort/Filter
|
|
3012
|
+
trigger (no sort/condition set) isn't a solid-ring chip at all -- it's
|
|
3013
|
+
a dashed ::before (1px dashed, border-radius: inherit, absolutely
|
|
3014
|
+
positioned inset: 0) over a barely-there fill, confirmed on Attio's own empty Filter chip (its ::before border computes to exactly "1px dashed rgba(0, 0, 0, 0.06)"). Once a value IS set, the trigger drops the dashed pseudo and picks up the base tool's own solid ring
|
|
3015
|
+
instead (the --active modifier, unchanged) -- confirmed on Sort with
|
|
3016
|
+
an actual sort applied. color-mix (not the raw rgba Attio computes
|
|
3017
|
+
to) so both the border and the fill flip correctly in dark mode, the
|
|
3018
|
+
same reasoning --ghost above already uses. Only wired into
|
|
3019
|
+
TableToolbar itself (tabletoolbar.tsx) this pass -- RecordsTable's own Sort/Filter triggers share this same chrome function but are deprecated, not touched here. */
|
|
3020
|
+
& .crisp-recordstable-tool--dashed { position: relative; box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); }
|
|
3021
|
+
& .crisp-recordstable-tool--dashed::before { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px dashed color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); pointer-events: none; }
|
|
3022
|
+
& .crisp-recordstable-tool--dashed:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); }
|
|
2972
3023
|
& .crisp-recordstable-toolgroup { position: relative; display: inline-flex; }
|
|
2973
3024
|
& .crisp-recordstable-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
|
|
2974
3025
|
& .crisp-recordstable-menu { position: absolute; top: calc(100% + var(--crisp-space-1)); left: 0; z-index: 30; min-width: 232px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); display: flex; flex-direction: column; gap: var(--crisp-space-px); transform-origin: top; opacity: 1; transform: none; transition: opacity .13s ease, transform .13s ease; }
|
|
@@ -3321,24 +3372,12 @@
|
|
|
3321
3372
|
}
|
|
3322
3373
|
|
|
3323
3374
|
.crisp-savedviews {
|
|
3324
|
-
position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /*
|
|
3325
|
-
#
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
wrong (a flat colour that stayed visible where the reference had
|
|
3331
|
-
none) — this is the opposite risk (a token that already flips per
|
|
3332
|
-
theme, applied to the closest measured match). */
|
|
3333
|
-
& .crisp-savedviews-trigger {
|
|
3334
|
-
box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5);
|
|
3335
|
-
height: var(--crisp-size-row); margin: 0; padding: var(--crisp-space-1) var(--crisp-space-1-5);
|
|
3336
|
-
border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-raised);
|
|
3337
|
-
font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary);
|
|
3338
|
-
cursor: pointer; white-space: nowrap; transition: background-color .12s ease;
|
|
3339
|
-
}
|
|
3340
|
-
& .crisp-savedviews-trigger:hover,
|
|
3341
|
-
& .crisp-savedviews-trigger[data-open] { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-raised)); }
|
|
3375
|
+
position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* crisp/#772 follow-up, re-measured live 2026-09-25 in the trigger's
|
|
3376
|
+
actual position (Attio's real view bar, next to View settings -- fixed there in #766/#768/#778): white (bgSurface, rgb(255,255,255) exact) with elevation.field's 3-layer shadow, the same raised
|
|
3377
|
+
chrome View settings and Import/Export both carry
|
|
3378
|
+
(tabletoolbar.recipe.ts's own --raised, not reused here directly since this is a separate recipe/component, but the identical measured values). Supersedes the original #555 measurement (rgb(246,247,247), reused as bgRaised -- a flat grey fill with no shadow at all), which was wrong: this trigger was never re-checked once it moved into its real view-bar position. */
|
|
3379
|
+
& .crisp-savedviews-trigger { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-row); margin: 0; padding: var(--crisp-space-1) var(--crisp-space-1-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); cursor: pointer; white-space: nowrap; transition: background-color .12s ease; }
|
|
3380
|
+
& .crisp-savedviews-trigger:hover, & .crisp-savedviews-trigger[data-open] { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-surface)); }
|
|
3342
3381
|
& .crisp-savedviews-trigger-icon { flex-shrink: 0; display: inline-flex; width: var(--crisp-size-icon); height: var(--crisp-size-icon); }
|
|
3343
3382
|
& .crisp-savedviews-trigger-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
3344
3383
|
& .crisp-savedviews-trigger-chevron { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
package/dist/styles.layered.css
CHANGED
|
@@ -752,6 +752,10 @@
|
|
|
752
752
|
& th[data-drop-after]::after { inset-inline-end: -1.5px; }
|
|
753
753
|
/* typed cells — entity (avatar + name), colour-coded tags, numbers, dates */
|
|
754
754
|
& .crisp-datatable-entity { display: flex; align-items: center; gap: var(--crisp-space-1-5); min-width: 0; color: var(--crisp-fg-primary); font-weight: var(--crisp-weight-medium); }
|
|
755
|
+
/* crisp/#601 supersession follow-up -- the same flex-row shape .crisp-datatable-entity gives its own avatar+name+actions, but structural only (no entity-specific colour/weight): lets onOpenComments/onOpenPreview compose alongside ANY column's own
|
|
756
|
+
content (a custom render, or a non-entity built-in type), not just
|
|
757
|
+
type: "entity"'s own inline rendering. */
|
|
758
|
+
& .crisp-datatable-cell-actions-row { display: flex; align-items: center; gap: var(--crisp-space-1-5); min-width: 0; width: 100%; }
|
|
755
759
|
/* crisp/#601, G-050: measured LIVE (getComputedStyle on the name text, plain hover vs rest) that Attio's underline is unconditional, not a
|
|
756
760
|
hover reveal -- identical at rest and on hover: text-decoration-color
|
|
757
761
|
is rgba(0,0,0,0.09), a 9% tint, not the name's own full-contrast text colour. The previous :hover-gated, full-contrast rule here was itself unmeasured and wrong in two ways at once. */
|
|
@@ -783,6 +787,16 @@
|
|
|
783
787
|
/* url/email cell types (#654) -- same measured values as RecordsTable's own .crisp-recordstable-link, which this mirrors: no underline at rest, underline on hover, own-colour text rather than a browser-blue link. */
|
|
784
788
|
& .crisp-datatable-link { color: var(--crisp-fg-primary); text-decoration: none; overflow: hidden; text-overflow: ellipsis; }
|
|
785
789
|
& .crisp-datatable-link:hover { text-decoration: underline; }
|
|
790
|
+
/* rating cell type/editor (#760) -- measured live: 16px stars on an 18px pitch (a 2px gap), an empty star at rgba(0,0,0,0.1), a committed/filled star at brand600 (--crisp-bg-brand-solid, an exact match to the measured #266df0), and a distinct hover-preview colour -- rgb(33,91,196) -- that's close to but NOT brand700/bgBrandSolidPressed
|
|
791
|
+
(#1f5fd6); kept as its own literal rather than forced onto that token,
|
|
792
|
+
since the two were measured stable and different. The read-only svg
|
|
793
|
+
and the editable button's own inner svg both carry the crisp-datatable-rating-star class on the svg itself (not the button), so one set of fill rules covers both -- the button only adds its own reset + cursor via a separate -btn class. */
|
|
794
|
+
& .crisp-datatable-rating { display: inline-flex; align-items: center; gap: 2px; }
|
|
795
|
+
& .crisp-datatable-rating-star { display: block; }
|
|
796
|
+
& .crisp-datatable-rating-star path { fill: rgba(0, 0, 0, 0.1); }
|
|
797
|
+
& .crisp-datatable-rating-star[data-filled] path { fill: var(--crisp-bg-brand-solid); }
|
|
798
|
+
& .crisp-datatable-rating-star[data-hovering] path { fill: #215bc4; }
|
|
799
|
+
& .crisp-datatable-rating-star-btn { display: inline-flex; padding: 0; margin: 0; border: none; background: none; font-family: inherit; cursor: pointer; }
|
|
786
800
|
/* row drag-to-reorder -- a Settings > Objects > Attributes screen measures a leading 20px grip column, a 16px grip icon, and the row's own
|
|
787
801
|
hairline doubling as the drop indicator (it tints toward the brand
|
|
788
802
|
colour as the active drop target). The affordance + geometry are
|
|
@@ -1828,12 +1842,29 @@
|
|
|
1828
1842
|
& .crisp-tabletoolbar-search svg { flex-shrink: 0; }
|
|
1829
1843
|
& .crisp-tabletoolbar-search input { border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-md); color: var(--crisp-fg-primary); width: 180px; }
|
|
1830
1844
|
& .crisp-tabletoolbar-search input::placeholder { color: var(--crisp-fg-muted); }
|
|
1831
|
-
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background:
|
|
1845
|
+
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-divider); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
|
|
1832
1846
|
& .crisp-tabletoolbar-tool:hover { background: var(--crisp-bg-raised); }
|
|
1833
1847
|
& .crisp-tabletoolbar-tool svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
1834
|
-
|
|
1848
|
+
/* crisp/#772: re-measured live on Sort with an actual sort applied -- an active trigger's own fill is white (bgSurface), the same as the
|
|
1849
|
+
base .tool rule above now already sets; this override existed to
|
|
1850
|
+
distinguish active from a base state that used to be transparent.
|
|
1851
|
+
Kept explicit (not just deleted) so a future change to the base
|
|
1852
|
+
rule's background can't silently change this one too. */
|
|
1853
|
+
& .crisp-tabletoolbar-tool--active { background: var(--crisp-bg-surface); }
|
|
1835
1854
|
& .crisp-tabletoolbar-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
|
|
1836
1855
|
& .crisp-tabletoolbar-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
1856
|
+
/* crisp/#772 follow-up, re-measured live 2026-09-25: an EMPTY Sort/Filter
|
|
1857
|
+
trigger (no sort/condition set) isn't a solid-ring chip at all -- it's
|
|
1858
|
+
a dashed ::before (1px dashed, border-radius: inherit, absolutely
|
|
1859
|
+
positioned inset: 0) over a barely-there fill, confirmed on Attio's own empty Filter chip (its ::before border computes to exactly "1px dashed rgba(0, 0, 0, 0.06)"). Once a value IS set, the trigger drops the dashed pseudo and picks up the base tool's own solid ring
|
|
1860
|
+
instead (the --active modifier, unchanged) -- confirmed on Sort with
|
|
1861
|
+
an actual sort applied. color-mix (not the raw rgba Attio computes
|
|
1862
|
+
to) so both the border and the fill flip correctly in dark mode, the
|
|
1863
|
+
same reasoning --ghost above already uses. Only wired into
|
|
1864
|
+
TableToolbar itself (tabletoolbar.tsx) this pass -- RecordsTable's own Sort/Filter triggers share this same chrome function but are deprecated, not touched here. */
|
|
1865
|
+
& .crisp-tabletoolbar-tool--dashed { position: relative; box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); }
|
|
1866
|
+
& .crisp-tabletoolbar-tool--dashed::before { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px dashed color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); pointer-events: none; }
|
|
1867
|
+
& .crisp-tabletoolbar-tool--dashed:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); }
|
|
1837
1868
|
& .crisp-tabletoolbar-toolgroup { position: relative; display: inline-flex; }
|
|
1838
1869
|
& .crisp-tabletoolbar-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
|
|
1839
1870
|
& .crisp-tabletoolbar-menu { position: absolute; top: calc(100% + var(--crisp-space-1)); left: 0; z-index: 30; min-width: 232px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); display: flex; flex-direction: column; gap: var(--crisp-space-px); transform-origin: top; opacity: 1; transform: none; transition: opacity .13s ease, transform .13s ease; }
|
|
@@ -1943,7 +1974,10 @@
|
|
|
1943
1974
|
& .crisp-tabletoolbar-datepop-preset { height: var(--crisp-size-chip); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-chip); background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-sm); cursor: pointer; }
|
|
1944
1975
|
& .crisp-tabletoolbar-datepop-preset:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 8%, transparent); }
|
|
1945
1976
|
|
|
1946
|
-
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface
|
|
1977
|
+
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; cursor: pointer; }
|
|
1978
|
+
|
|
1979
|
+
& .crisp-tabletoolbar-sorted-prefix { color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
1980
|
+
& .crisp-tabletoolbar-sorted-count { font-size: var(--crisp-text-sm); color: color-mix(in srgb, var(--crisp-fg-primary) 73%, transparent); }
|
|
1947
1981
|
[dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
|
|
1948
1982
|
}
|
|
1949
1983
|
|
|
@@ -2964,12 +2998,29 @@
|
|
|
2964
2998
|
& .crisp-recordstable-search svg { flex-shrink: 0; }
|
|
2965
2999
|
& .crisp-recordstable-search input { border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-md); color: var(--crisp-fg-primary); width: 180px; }
|
|
2966
3000
|
& .crisp-recordstable-search input::placeholder { color: var(--crisp-fg-muted); }
|
|
2967
|
-
& .crisp-recordstable-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background:
|
|
3001
|
+
& .crisp-recordstable-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-divider); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
|
|
2968
3002
|
& .crisp-recordstable-tool:hover { background: var(--crisp-bg-raised); }
|
|
2969
3003
|
& .crisp-recordstable-tool svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
2970
|
-
|
|
3004
|
+
/* crisp/#772: re-measured live on Sort with an actual sort applied -- an active trigger's own fill is white (bgSurface), the same as the
|
|
3005
|
+
base .tool rule above now already sets; this override existed to
|
|
3006
|
+
distinguish active from a base state that used to be transparent.
|
|
3007
|
+
Kept explicit (not just deleted) so a future change to the base
|
|
3008
|
+
rule's background can't silently change this one too. */
|
|
3009
|
+
& .crisp-recordstable-tool--active { background: var(--crisp-bg-surface); }
|
|
2971
3010
|
& .crisp-recordstable-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
|
|
2972
3011
|
& .crisp-recordstable-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
3012
|
+
/* crisp/#772 follow-up, re-measured live 2026-09-25: an EMPTY Sort/Filter
|
|
3013
|
+
trigger (no sort/condition set) isn't a solid-ring chip at all -- it's
|
|
3014
|
+
a dashed ::before (1px dashed, border-radius: inherit, absolutely
|
|
3015
|
+
positioned inset: 0) over a barely-there fill, confirmed on Attio's own empty Filter chip (its ::before border computes to exactly "1px dashed rgba(0, 0, 0, 0.06)"). Once a value IS set, the trigger drops the dashed pseudo and picks up the base tool's own solid ring
|
|
3016
|
+
instead (the --active modifier, unchanged) -- confirmed on Sort with
|
|
3017
|
+
an actual sort applied. color-mix (not the raw rgba Attio computes
|
|
3018
|
+
to) so both the border and the fill flip correctly in dark mode, the
|
|
3019
|
+
same reasoning --ghost above already uses. Only wired into
|
|
3020
|
+
TableToolbar itself (tabletoolbar.tsx) this pass -- RecordsTable's own Sort/Filter triggers share this same chrome function but are deprecated, not touched here. */
|
|
3021
|
+
& .crisp-recordstable-tool--dashed { position: relative; box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); }
|
|
3022
|
+
& .crisp-recordstable-tool--dashed::before { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px dashed color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); pointer-events: none; }
|
|
3023
|
+
& .crisp-recordstable-tool--dashed:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); }
|
|
2973
3024
|
& .crisp-recordstable-toolgroup { position: relative; display: inline-flex; }
|
|
2974
3025
|
& .crisp-recordstable-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
|
|
2975
3026
|
& .crisp-recordstable-menu { position: absolute; top: calc(100% + var(--crisp-space-1)); left: 0; z-index: 30; min-width: 232px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); display: flex; flex-direction: column; gap: var(--crisp-space-px); transform-origin: top; opacity: 1; transform: none; transition: opacity .13s ease, transform .13s ease; }
|
|
@@ -3322,24 +3373,12 @@
|
|
|
3322
3373
|
}
|
|
3323
3374
|
|
|
3324
3375
|
.crisp-savedviews {
|
|
3325
|
-
position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /*
|
|
3326
|
-
#
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
|
|
3331
|
-
wrong (a flat colour that stayed visible where the reference had
|
|
3332
|
-
none) — this is the opposite risk (a token that already flips per
|
|
3333
|
-
theme, applied to the closest measured match). */
|
|
3334
|
-
& .crisp-savedviews-trigger {
|
|
3335
|
-
box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5);
|
|
3336
|
-
height: var(--crisp-size-row); margin: 0; padding: var(--crisp-space-1) var(--crisp-space-1-5);
|
|
3337
|
-
border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-raised);
|
|
3338
|
-
font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary);
|
|
3339
|
-
cursor: pointer; white-space: nowrap; transition: background-color .12s ease;
|
|
3340
|
-
}
|
|
3341
|
-
& .crisp-savedviews-trigger:hover,
|
|
3342
|
-
& .crisp-savedviews-trigger[data-open] { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-raised)); }
|
|
3376
|
+
position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* crisp/#772 follow-up, re-measured live 2026-09-25 in the trigger's
|
|
3377
|
+
actual position (Attio's real view bar, next to View settings -- fixed there in #766/#768/#778): white (bgSurface, rgb(255,255,255) exact) with elevation.field's 3-layer shadow, the same raised
|
|
3378
|
+
chrome View settings and Import/Export both carry
|
|
3379
|
+
(tabletoolbar.recipe.ts's own --raised, not reused here directly since this is a separate recipe/component, but the identical measured values). Supersedes the original #555 measurement (rgb(246,247,247), reused as bgRaised -- a flat grey fill with no shadow at all), which was wrong: this trigger was never re-checked once it moved into its real view-bar position. */
|
|
3380
|
+
& .crisp-savedviews-trigger { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-row); margin: 0; padding: var(--crisp-space-1) var(--crisp-space-1-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); cursor: pointer; white-space: nowrap; transition: background-color .12s ease; }
|
|
3381
|
+
& .crisp-savedviews-trigger:hover, & .crisp-savedviews-trigger[data-open] { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-surface)); }
|
|
3343
3382
|
& .crisp-savedviews-trigger-icon { flex-shrink: 0; display: inline-flex; width: var(--crisp-size-icon); height: var(--crisp-size-icon); }
|
|
3344
3383
|
& .crisp-savedviews-trigger-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
3345
3384
|
& .crisp-savedviews-trigger-chevron { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
package/dist/tabletoolbar.css
CHANGED
|
@@ -7,12 +7,29 @@
|
|
|
7
7
|
& .crisp-tabletoolbar-search svg { flex-shrink: 0; }
|
|
8
8
|
& .crisp-tabletoolbar-search input { border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-md); color: var(--crisp-fg-primary); width: 180px; }
|
|
9
9
|
& .crisp-tabletoolbar-search input::placeholder { color: var(--crisp-fg-muted); }
|
|
10
|
-
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background:
|
|
10
|
+
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-divider); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
|
|
11
11
|
& .crisp-tabletoolbar-tool:hover { background: var(--crisp-bg-raised); }
|
|
12
12
|
& .crisp-tabletoolbar-tool svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
13
|
-
|
|
13
|
+
/* crisp/#772: re-measured live on Sort with an actual sort applied -- an active trigger's own fill is white (bgSurface), the same as the
|
|
14
|
+
base .tool rule above now already sets; this override existed to
|
|
15
|
+
distinguish active from a base state that used to be transparent.
|
|
16
|
+
Kept explicit (not just deleted) so a future change to the base
|
|
17
|
+
rule's background can't silently change this one too. */
|
|
18
|
+
& .crisp-tabletoolbar-tool--active { background: var(--crisp-bg-surface); }
|
|
14
19
|
& .crisp-tabletoolbar-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
|
|
15
20
|
& .crisp-tabletoolbar-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
21
|
+
/* crisp/#772 follow-up, re-measured live 2026-09-25: an EMPTY Sort/Filter
|
|
22
|
+
trigger (no sort/condition set) isn't a solid-ring chip at all -- it's
|
|
23
|
+
a dashed ::before (1px dashed, border-radius: inherit, absolutely
|
|
24
|
+
positioned inset: 0) over a barely-there fill, confirmed on Attio's own empty Filter chip (its ::before border computes to exactly "1px dashed rgba(0, 0, 0, 0.06)"). Once a value IS set, the trigger drops the dashed pseudo and picks up the base tool's own solid ring
|
|
25
|
+
instead (the --active modifier, unchanged) -- confirmed on Sort with
|
|
26
|
+
an actual sort applied. color-mix (not the raw rgba Attio computes
|
|
27
|
+
to) so both the border and the fill flip correctly in dark mode, the
|
|
28
|
+
same reasoning --ghost above already uses. Only wired into
|
|
29
|
+
TableToolbar itself (tabletoolbar.tsx) this pass -- RecordsTable's own Sort/Filter triggers share this same chrome function but are deprecated, not touched here. */
|
|
30
|
+
& .crisp-tabletoolbar-tool--dashed { position: relative; box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); }
|
|
31
|
+
& .crisp-tabletoolbar-tool--dashed::before { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px dashed color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); pointer-events: none; }
|
|
32
|
+
& .crisp-tabletoolbar-tool--dashed:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); }
|
|
16
33
|
& .crisp-tabletoolbar-toolgroup { position: relative; display: inline-flex; }
|
|
17
34
|
& .crisp-tabletoolbar-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
|
|
18
35
|
& .crisp-tabletoolbar-menu { position: absolute; top: calc(100% + var(--crisp-space-1)); left: 0; z-index: 30; min-width: 232px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); display: flex; flex-direction: column; gap: var(--crisp-space-px); transform-origin: top; opacity: 1; transform: none; transition: opacity .13s ease, transform .13s ease; }
|
|
@@ -122,7 +139,10 @@
|
|
|
122
139
|
& .crisp-tabletoolbar-datepop-preset { height: var(--crisp-size-chip); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-chip); background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-sm); cursor: pointer; }
|
|
123
140
|
& .crisp-tabletoolbar-datepop-preset:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 8%, transparent); }
|
|
124
141
|
|
|
125
|
-
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface
|
|
142
|
+
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; cursor: pointer; }
|
|
143
|
+
|
|
144
|
+
& .crisp-tabletoolbar-sorted-prefix { color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
145
|
+
& .crisp-tabletoolbar-sorted-count { font-size: var(--crisp-text-sm); color: color-mix(in srgb, var(--crisp-fg-primary) 73%, transparent); }
|
|
126
146
|
[dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
|
|
127
147
|
}
|
|
128
148
|
|
|
@@ -8,12 +8,29 @@
|
|
|
8
8
|
& .crisp-tabletoolbar-search svg { flex-shrink: 0; }
|
|
9
9
|
& .crisp-tabletoolbar-search input { border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-md); color: var(--crisp-fg-primary); width: 180px; }
|
|
10
10
|
& .crisp-tabletoolbar-search input::placeholder { color: var(--crisp-fg-muted); }
|
|
11
|
-
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background:
|
|
11
|
+
& .crisp-tabletoolbar-tool { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-divider); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
|
|
12
12
|
& .crisp-tabletoolbar-tool:hover { background: var(--crisp-bg-raised); }
|
|
13
13
|
& .crisp-tabletoolbar-tool svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
14
|
-
|
|
14
|
+
/* crisp/#772: re-measured live on Sort with an actual sort applied -- an active trigger's own fill is white (bgSurface), the same as the
|
|
15
|
+
base .tool rule above now already sets; this override existed to
|
|
16
|
+
distinguish active from a base state that used to be transparent.
|
|
17
|
+
Kept explicit (not just deleted) so a future change to the base
|
|
18
|
+
rule's background can't silently change this one too. */
|
|
19
|
+
& .crisp-tabletoolbar-tool--active { background: var(--crisp-bg-surface); }
|
|
15
20
|
& .crisp-tabletoolbar-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
|
|
16
21
|
& .crisp-tabletoolbar-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
22
|
+
/* crisp/#772 follow-up, re-measured live 2026-09-25: an EMPTY Sort/Filter
|
|
23
|
+
trigger (no sort/condition set) isn't a solid-ring chip at all -- it's
|
|
24
|
+
a dashed ::before (1px dashed, border-radius: inherit, absolutely
|
|
25
|
+
positioned inset: 0) over a barely-there fill, confirmed on Attio's own empty Filter chip (its ::before border computes to exactly "1px dashed rgba(0, 0, 0, 0.06)"). Once a value IS set, the trigger drops the dashed pseudo and picks up the base tool's own solid ring
|
|
26
|
+
instead (the --active modifier, unchanged) -- confirmed on Sort with
|
|
27
|
+
an actual sort applied. color-mix (not the raw rgba Attio computes
|
|
28
|
+
to) so both the border and the fill flip correctly in dark mode, the
|
|
29
|
+
same reasoning --ghost above already uses. Only wired into
|
|
30
|
+
TableToolbar itself (tabletoolbar.tsx) this pass -- RecordsTable's own Sort/Filter triggers share this same chrome function but are deprecated, not touched here. */
|
|
31
|
+
& .crisp-tabletoolbar-tool--dashed { position: relative; box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); }
|
|
32
|
+
& .crisp-tabletoolbar-tool--dashed::before { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 1px dashed color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); pointer-events: none; }
|
|
33
|
+
& .crisp-tabletoolbar-tool--dashed:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); }
|
|
17
34
|
& .crisp-tabletoolbar-toolgroup { position: relative; display: inline-flex; }
|
|
18
35
|
& .crisp-tabletoolbar-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
|
|
19
36
|
& .crisp-tabletoolbar-menu { position: absolute; top: calc(100% + var(--crisp-space-1)); left: 0; z-index: 30; min-width: 232px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); display: flex; flex-direction: column; gap: var(--crisp-space-px); transform-origin: top; opacity: 1; transform: none; transition: opacity .13s ease, transform .13s ease; }
|
|
@@ -123,7 +140,10 @@
|
|
|
123
140
|
& .crisp-tabletoolbar-datepop-preset { height: var(--crisp-size-chip); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-chip); background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-sm); cursor: pointer; }
|
|
124
141
|
& .crisp-tabletoolbar-datepop-preset:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 8%, transparent); }
|
|
125
142
|
|
|
126
|
-
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface
|
|
143
|
+
& .crisp-tabletoolbar-tool--raised { border: none; background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; cursor: pointer; }
|
|
144
|
+
|
|
145
|
+
& .crisp-tabletoolbar-sorted-prefix { color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
146
|
+
& .crisp-tabletoolbar-sorted-count { font-size: var(--crisp-text-sm); color: color-mix(in srgb, var(--crisp-fg-primary) 73%, transparent); }
|
|
127
147
|
[dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
|
|
128
148
|
}
|
|
129
149
|
|
|
@@ -37,7 +37,12 @@ export type DataCellType = "text" | "entity" | "tags" | "status" | "date" | "dat
|
|
|
37
37
|
* workspace -- this type is display-only for now; editing still falls
|
|
38
38
|
* through to the plain-text editor every other non-number/date type
|
|
39
39
|
* gets, not a dedicated one (see #597 for when that's measured). */
|
|
40
|
-
| "email"
|
|
40
|
+
| "email"
|
|
41
|
+
/** A star row (crisp/#760) -- Attio's own "Rating" attribute type,
|
|
42
|
+
* confirmed live: 5 filled/empty 5-point stars, `maxRating` stars total
|
|
43
|
+
* (default 5). Read-only display without `editor: "rating"`; see that
|
|
44
|
+
* prop for the always-live editable version. */
|
|
45
|
+
| "rating";
|
|
41
46
|
export type DataTableColumn<T> = {
|
|
42
47
|
key: string;
|
|
43
48
|
/** Truncates with an ellipsis when it's wider than the column (#534: a
|
|
@@ -63,6 +68,10 @@ export type DataTableColumn<T> = {
|
|
|
63
68
|
};
|
|
64
69
|
/** Currency symbol for `currency` columns (default "$"). */
|
|
65
70
|
symbol?: string;
|
|
71
|
+
/** Star count for `type: "rating"` / `editor: "rating"` (default 5 --
|
|
72
|
+
* Attio's own scale wasn't independently varied beyond the default in
|
|
73
|
+
* the measured workspace, #760). */
|
|
74
|
+
maxRating?: number;
|
|
66
75
|
/** Allow drag-to-resize on this column (default true). */
|
|
67
76
|
resizable?: boolean;
|
|
68
77
|
/** Tone overrides for `status`/`tags` values (else a stable colour per value). */
|
|
@@ -94,8 +103,26 @@ export type DataTableColumn<T> = {
|
|
|
94
103
|
* empty-search state reads "No users" rather than `Select`'s own
|
|
95
104
|
* generic "No results" — both still overridable the normal way.
|
|
96
105
|
* Otherwise identical to `reference`: same `refOptions` shape, same
|
|
97
|
-
* `onCreateReference`/`createLabel` "Create X" row.
|
|
98
|
-
|
|
106
|
+
* `onCreateReference`/`createLabel` "Create X" row.
|
|
107
|
+
*
|
|
108
|
+
* `"rating"` (crisp/#760) is the other always-live exception, same
|
|
109
|
+
* category as `"switch"`: confirmed live, a single click on any star
|
|
110
|
+
* commits immediately (no double-click gate, no separate rest/edit
|
|
111
|
+
* display) — clicking the star that already equals the current value
|
|
112
|
+
* clears it to 0/empty rather than re-setting it. Reads/writes
|
|
113
|
+
* `maxRating` stars (default 5).
|
|
114
|
+
*
|
|
115
|
+
* `"checkbox"` (crisp/#761) is a THIRD, distinct boolean rendering from
|
|
116
|
+
* `"switch"` — confirmed live against Attio's own "Checkbox" attribute
|
|
117
|
+
* type (Settings → Data → Lists → Attributes → Create attribute), which
|
|
118
|
+
* renders a plain checked/unchecked square, not a toggle pill; `"switch"`
|
|
119
|
+
* was never actually measured against that surface (no cited source —
|
|
120
|
+
* see #761's own investigation) and stays as-is for a genuine toggle
|
|
121
|
+
* field. Always-live like `"switch"`/`"rating"`; renders crisp's own
|
|
122
|
+
* `Checkbox` component (already measured 16px/r6/brand-fill from the
|
|
123
|
+
* grid's own row-selection checkbox — this is the SAME visual, not a
|
|
124
|
+
* new one). */
|
|
125
|
+
editor?: "select" | "switch" | "reference" | "actor" | "rating" | "checkbox";
|
|
99
126
|
/** Options for `editor: "select"` (value/label, an optional `color` a
|
|
100
127
|
* caller's own `render` can read) — same shape as RecordsTable's
|
|
101
128
|
* `Column.options` for its `status` picker. */
|
|
@@ -192,6 +192,31 @@ export type TableToolbarProps = Omit<React.ComponentPropsWithoutRef<"div">, "chi
|
|
|
192
192
|
* the filter chips from View settings is dropped along with it.
|
|
193
193
|
*/
|
|
194
194
|
showViewSettings?: boolean;
|
|
195
|
+
/**
|
|
196
|
+
* Relocates the View settings trigger (and its popover) into a
|
|
197
|
+
* consumer-supplied element instead of this toolbar's own row
|
|
198
|
+
* (your-moon/crisp#766) — a plain DOM ref, e.g. a `<span ref={...} />`
|
|
199
|
+
* rendered right next to `SavedViews`' own trigger. Measured live: Attio's
|
|
200
|
+
* view bar puts the view switcher and View settings adjacent, then a
|
|
201
|
+
* flexible gap, then Import/Export immediately before the primary "+ New"
|
|
202
|
+
* action (see `importExportRef`, a SEPARATE ref — the two controls sit
|
|
203
|
+
* far apart, not next to each other). The row below holds only Sort and
|
|
204
|
+
* Filter. Neither `SavedViews` nor `TableToolbar` renders the OTHER
|
|
205
|
+
* component's pieces itself — they stay two separate components, each
|
|
206
|
+
* still owning its own state — this ref is a portal target, not a new
|
|
207
|
+
* cross-component API. Omit it (the default) and View settings renders
|
|
208
|
+
* exactly where it always has, inline in this toolbar's own row,
|
|
209
|
+
* unchanged — existing consumers see no difference at all.
|
|
210
|
+
*/
|
|
211
|
+
viewSettingsRef?: React.RefObject<HTMLElement | null>;
|
|
212
|
+
/**
|
|
213
|
+
* Same relocation, for the Import/Export trigger (and its menu) — a
|
|
214
|
+
* separate ref from `viewSettingsRef` because Attio's own layout puts
|
|
215
|
+
* Import/Export far from View settings, immediately before the primary
|
|
216
|
+
* action instead of next to the view switcher. Omit it and Import/Export
|
|
217
|
+
* renders exactly where it always has, inline in this toolbar's own row.
|
|
218
|
+
*/
|
|
219
|
+
importExportRef?: React.RefObject<HTMLElement | null>;
|
|
195
220
|
/**
|
|
196
221
|
* The full set of attributes View settings offers — every attribute on
|
|
197
222
|
* the object, shown or not. Defaults to `columns`. Omit both, along with
|
|
@@ -288,7 +313,7 @@ export declare function applySorts<T>(rows: T[], sorts: ToolbarSort[], get?: (ro
|
|
|
288
313
|
* this (Sort: Due date/Assignee/Creation date; Filter: Assignee/Record/
|
|
289
314
|
* Created by), which one shared list can't reproduce.
|
|
290
315
|
*/
|
|
291
|
-
export declare function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: filterColumnsProp, sorts: sortsProp, defaultSorts, onSortsChange, filters: filtersProp, defaultFilters, onFiltersChange, count, children, helpHref, className, sortLabel: sortLabelProp, filterLabel: filterLabelProp, reorderSortLabel: reorderSortLabelProp, noSortsLabel: noSortsLabelProp, addSortLabel: addSortLabelProp, learnSortingLabel: learnSortingLabelProp, selectConditionLabel: selectConditionLabelProp, sortFieldLabel: sortFieldLabelProp, sortDirectionLabel: sortDirectionLabelProp, removeSortLabel: removeSortLabelProp, filterFieldLabel: filterFieldLabelProp, filterFieldPlaceholder: filterFieldPlaceholderProp, filterValuePlaceholder: filterValuePlaceholderProp, filterOptionsLabel: filterOptionsLabelProp, deleteFilterLabel: deleteFilterLabelProp, ascendingLabel: ascendingLabelProp, descendingLabel: descendingLabelProp, sortTriggerLabel, filterTriggerLabel, inline, showSort, showViewSettings, viewColumns: viewColumnsProp, shownKeys: shownKeysProp, defaultShownKeys, onShownKeysChange, viewSettingsLabel: viewSettingsLabelProp, reorderAttributeLabel: reorderAttributeLabelProp, hideAttributeLabel, addAttributeToViewLabel: addAttributeToViewLabelProp, searchAttributesPlaceholder: searchAttributesPlaceholderProp, importExportLabel: importExportLabelProp, onImportCsv, onExportCsv, onExportExcel, importExportHelpHref, importCsvLabel: importCsvLabelProp, exportCsvLabel: exportCsvLabelProp, exportExcelLabel: exportExcelLabelProp, learnImportExportLabel: learnImportExportLabelProp, backLabel: backLabelProp, nestedFieldPlaceholder, ...rest }: TableToolbarProps): React.JSX.Element;
|
|
316
|
+
export declare function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: filterColumnsProp, sorts: sortsProp, defaultSorts, onSortsChange, filters: filtersProp, defaultFilters, onFiltersChange, count, children, helpHref, className, sortLabel: sortLabelProp, filterLabel: filterLabelProp, reorderSortLabel: reorderSortLabelProp, noSortsLabel: noSortsLabelProp, addSortLabel: addSortLabelProp, learnSortingLabel: learnSortingLabelProp, selectConditionLabel: selectConditionLabelProp, sortFieldLabel: sortFieldLabelProp, sortDirectionLabel: sortDirectionLabelProp, removeSortLabel: removeSortLabelProp, filterFieldLabel: filterFieldLabelProp, filterFieldPlaceholder: filterFieldPlaceholderProp, filterValuePlaceholder: filterValuePlaceholderProp, filterOptionsLabel: filterOptionsLabelProp, deleteFilterLabel: deleteFilterLabelProp, ascendingLabel: ascendingLabelProp, descendingLabel: descendingLabelProp, sortTriggerLabel, filterTriggerLabel, inline, showSort, showViewSettings, viewSettingsRef, importExportRef, viewColumns: viewColumnsProp, shownKeys: shownKeysProp, defaultShownKeys, onShownKeysChange, viewSettingsLabel: viewSettingsLabelProp, reorderAttributeLabel: reorderAttributeLabelProp, hideAttributeLabel, addAttributeToViewLabel: addAttributeToViewLabelProp, searchAttributesPlaceholder: searchAttributesPlaceholderProp, importExportLabel: importExportLabelProp, onImportCsv, onExportCsv, onExportExcel, importExportHelpHref, importCsvLabel: importCsvLabelProp, exportCsvLabel: exportCsvLabelProp, exportExcelLabel: exportExcelLabelProp, learnImportExportLabel: learnImportExportLabelProp, backLabel: backLabelProp, nestedFieldPlaceholder, ...rest }: TableToolbarProps): React.JSX.Element;
|
|
292
317
|
export type ToolbarToolProps = React.ComponentPropsWithoutRef<"button"> & {
|
|
293
318
|
/** Drawn the way Sort/Filter are once a condition is set (#399). */
|
|
294
319
|
active?: boolean;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { EditableOption } from "./editable-field";
|
|
3
|
+
type IconType = React.ComponentType<{
|
|
4
|
+
size?: number;
|
|
5
|
+
strokeWidth?: number;
|
|
6
|
+
}>;
|
|
7
|
+
export type ColumnType = "entity" | "text" | "tags" | "number" | "url" | "date" | "currency" | "status" | "reference";
|
|
8
|
+
export type StatusOption = {
|
|
9
|
+
value: string;
|
|
10
|
+
label: string;
|
|
11
|
+
color: string;
|
|
12
|
+
};
|
|
13
|
+
export type ReferenceOption = {
|
|
14
|
+
value: string;
|
|
15
|
+
label: string;
|
|
16
|
+
avatar?: string;
|
|
17
|
+
};
|
|
18
|
+
export type EntityValue = {
|
|
19
|
+
name: string;
|
|
20
|
+
avatar?: string;
|
|
21
|
+
};
|
|
22
|
+
export type Row = {
|
|
23
|
+
id: string;
|
|
24
|
+
} & Record<string, any>;
|
|
25
|
+
export type Column = {
|
|
26
|
+
key: string;
|
|
27
|
+
label: string;
|
|
28
|
+
type?: ColumnType;
|
|
29
|
+
/** Mark the column's values as AI-enriched — tints the cells the way
|
|
30
|
+
* enriched values are washed (#9b69ff at 4%). */
|
|
31
|
+
enriched?: boolean;
|
|
32
|
+
icon?: IconType;
|
|
33
|
+
/** This column's values reference another type of record (e.g. a
|
|
34
|
+
* "Primary location" column of Country records). When the header
|
|
35
|
+
* overflows, its `Tooltip` appends this type's icon and name after the
|
|
36
|
+
* label and switches to Attio's second, reference-column tooltip chrome
|
|
37
|
+
* (crisp#580) — distinct from `icon` above (the column's own field-type
|
|
38
|
+
* glyph shown in the header row) and from `refOptions` (the picker's
|
|
39
|
+
* selectable values). Omit for a plain column; the tooltip stays
|
|
40
|
+
* label-only (#534). */
|
|
41
|
+
referencedType?: {
|
|
42
|
+
icon: IconType;
|
|
43
|
+
label: string;
|
|
44
|
+
};
|
|
45
|
+
width?: number;
|
|
46
|
+
/** Currency symbol for `currency` columns (default "$"). */
|
|
47
|
+
symbol?: string;
|
|
48
|
+
/** Choices for a `status` column (each a coloured dot + label). */
|
|
49
|
+
options?: StatusOption[];
|
|
50
|
+
/** Choices for a `reference` column (a searchable record picker). */
|
|
51
|
+
refOptions?: ReferenceOption[];
|
|
52
|
+
/** Adds a trailing "Create {createLabel}" row to the picker (Attio's own
|
|
53
|
+
* always has one) — rendered only when this is provided. Picking it hands
|
|
54
|
+
* back the picker's current search text, e.g. to open a create flow
|
|
55
|
+
* pre-seeded with it. */
|
|
56
|
+
onCreateReference?: (query: string) => void;
|
|
57
|
+
/** The object noun in "Create {createLabel}" (Attio: "Create Person").
|
|
58
|
+
* Only used with `onCreateReference`; defaults to "record". */
|
|
59
|
+
createLabel?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Full custom cell content — an escape hatch for a display crisp can't
|
|
62
|
+
* express via `type` (sign-coloured currency, a maskable amount, a custom
|
|
63
|
+
* badge, …). Precedence is **`render` > `format` > the built-in `type`
|
|
64
|
+
* renderer**: when `render` is set it is the *only* thing drawn in the
|
|
65
|
+
* cell, replacing whatever `type` would normally render.
|
|
66
|
+
*
|
|
67
|
+
* Interaction contract for a `render` column: it keeps every grid chrome —
|
|
68
|
+
* row height, hairlines, padding, hover/selected tint, the cell focus ring,
|
|
69
|
+
* shift-click range select, the right-click row menu — but is **never**
|
|
70
|
+
* inline-editable and never shows a `type` picker (status/reference/date/
|
|
71
|
+
* tags), because crisp has no way to write a value back into custom
|
|
72
|
+
* content. Use `format` instead if the column should stay editable.
|
|
73
|
+
*
|
|
74
|
+
* ⌘C copies `format(value, row)` when the column also has one, otherwise
|
|
75
|
+
* the raw value stringified the same way a plain column would — never a
|
|
76
|
+
* serialization of the rendered node. Sort, filter, and the footer
|
|
77
|
+
* aggregation all read `row[column.key]` directly and never call `render`.
|
|
78
|
+
*/
|
|
79
|
+
render?: (value: unknown, row: Row) => React.ReactNode;
|
|
80
|
+
/**
|
|
81
|
+
* Display-only string transform. Unlike `render`, a `format` column keeps
|
|
82
|
+
* the built-in `type` renderer's chrome (a `currency`/`number` column stays
|
|
83
|
+
* right-aligned in its numeric span; `text`/`url`/`date`/the default case
|
|
84
|
+
* keep their own wrapper) — `format`'s return value simply replaces the
|
|
85
|
+
* text that renderer would otherwise show. `format` fully owns that text,
|
|
86
|
+
* so a `currency` column's `format` should include its own symbol/masking
|
|
87
|
+
* if it wants one (the built-in `$` prefix is skipped once `format` is
|
|
88
|
+
* set). A `format` column stays editable/pickable exactly like a plain
|
|
89
|
+
* `type` column — only `render` disables that.
|
|
90
|
+
*
|
|
91
|
+
* Sort, filter, and the footer aggregation all read the **raw**
|
|
92
|
+
* `row[column.key]` value, never `format`'s output — so a grouped/prefixed
|
|
93
|
+
* currency string still sums and sorts numerically.
|
|
94
|
+
*/
|
|
95
|
+
format?: (value: unknown, row: Row) => string;
|
|
96
|
+
/**
|
|
97
|
+
* Opts this column into `RecordPanel`/`RecordPage`'s editable-field API
|
|
98
|
+
* (#431) — click-to-edit there. A plain `editable` column, with no
|
|
99
|
+
* `editor`, opens a text/number/date field (inferred from `type`); `editor`
|
|
100
|
+
* below picks a `select`/`switch` picker instead. Requires `onEdit` to
|
|
101
|
+
* actually be given for a field to open at all.
|
|
102
|
+
*/
|
|
103
|
+
editable?: boolean;
|
|
104
|
+
/** `select`/`switch` render as the field's own live, always-interactive
|
|
105
|
+
* content instead of opening on click. `select` reads `editOptions`. */
|
|
106
|
+
editor?: "select" | "switch";
|
|
107
|
+
/** Options for `editor: "select"`. Not `options` (`StatusOption` requires
|
|
108
|
+
* `color`, for this type's own `status` picker) so this stays additive. */
|
|
109
|
+
editOptions?: EditableOption[];
|
|
110
|
+
};
|
|
111
|
+
export declare function tagTone(t: string): string;
|
|
112
|
+
export {};
|