@crisp-ui-kit/crisp 0.57.1 → 0.57.3
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 +9 -4
- package/dist/authshell.layered.css +9 -4
- package/dist/badge.css +3 -3
- package/dist/badge.layered.css +3 -3
- package/dist/board.css +28 -8
- package/dist/board.layered.css +28 -8
- package/dist/bottomsheet.css +26 -0
- package/dist/bottomsheet.d.ts +7 -0
- package/dist/bottomsheet.layered.css +28 -0
- package/dist/button.css +10 -6
- package/dist/button.d.ts +2 -2
- package/dist/button.layered.css +10 -6
- package/dist/checkbox.css +7 -3
- package/dist/checkbox.layered.css +7 -3
- package/dist/chip.css +16 -1
- package/dist/chip.d.ts +3 -1
- package/dist/chip.layered.css +16 -1
- package/dist/chipgroup.css +5 -0
- package/dist/chipgroup.d.ts +7 -0
- package/dist/chipgroup.layered.css +7 -0
- package/dist/cjs/components/badge/badge.recipe.js +22 -8
- package/dist/cjs/components/bottomsheet/bottomsheet.js +90 -0
- package/dist/cjs/components/bottomsheet/bottomsheet.recipe.js +77 -0
- package/dist/cjs/components/bottomsheet/index.js +9 -0
- package/dist/cjs/components/breadcrumb/breadcrumb.js +1 -1
- package/dist/cjs/components/button/button.recipe.js +67 -15
- package/dist/cjs/components/checkbox/checkbox.recipe.js +61 -9
- package/dist/cjs/components/chip/chip.js +14 -2
- package/dist/cjs/components/chip/chip.recipe.js +72 -2
- package/dist/cjs/components/chipgroup/chipgroup.js +51 -0
- package/dist/cjs/components/chipgroup/chipgroup.recipe.js +36 -0
- package/dist/cjs/components/chipgroup/index.js +7 -0
- package/dist/cjs/components/datatable/datatable.js +5 -1
- package/dist/cjs/components/datatable/datatable.recipe.js +21 -6
- package/dist/cjs/components/datepickerfield/datepickerfield.js +2 -2
- package/dist/cjs/components/datepickerfield/datepickerfield.recipe.js +16 -3
- package/dist/cjs/components/dialog/dialog.recipe.js +21 -10
- package/dist/cjs/components/emptystate/emptystate.recipe.js +7 -2
- package/dist/cjs/components/fileupload/fileupload.js +21 -4
- package/dist/cjs/components/input/index.js +2 -1
- package/dist/cjs/components/input/input.js +31 -1
- package/dist/cjs/components/input/input.recipe.js +16 -9
- package/dist/cjs/components/menu/menu.js +18 -2
- package/dist/cjs/components/menu/menu.recipe.js +21 -7
- package/dist/cjs/components/menusheet/index.js +9 -0
- package/dist/cjs/components/menusheet/menusheet.js +133 -0
- package/dist/cjs/components/menusheet/menusheet.recipe.js +103 -0
- package/dist/cjs/components/multiselect/multiselect.js +1 -1
- package/dist/cjs/components/multiselect/multiselect.recipe.js +33 -9
- package/dist/cjs/components/select/select.js +1 -1
- package/dist/cjs/components/select/select.recipe.js +38 -12
- package/dist/cjs/components/snackbar/index.js +8 -0
- package/dist/cjs/components/snackbar/snackbar.js +121 -0
- package/dist/cjs/components/snackbar/snackbar.recipe.js +71 -0
- package/dist/cjs/components/table/table.recipe.js +7 -1
- package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +7 -2
- package/dist/cjs/components/tabletoolbar/tabletoolbar.js +37 -12
- package/dist/cjs/components/tabs/tabs.js +10 -4
- package/dist/cjs/components/tabs/tabs.recipe.js +23 -6
- package/dist/cjs/components/textarea/textarea.recipe.js +11 -8
- package/dist/cjs/core/floating-portal.js +7 -4
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/product/authshell/authshell.recipe.js +5 -1
- package/dist/cjs/product/command/command.recipe.js +4 -1
- package/dist/cjs/product/comments/comments.js +7 -2
- package/dist/cjs/product/comments/comments.recipe.js +25 -7
- package/dist/cjs/product/inbox/inbox.js +11 -3
- package/dist/cjs/product/memberssettings/index.js +6 -0
- package/dist/cjs/product/memberssettings/memberssettings.js +99 -0
- package/dist/cjs/product/memberssettings/memberssettings.recipe.js +83 -0
- package/dist/cjs/product/notificationssettings/index.js +5 -0
- package/dist/cjs/product/notificationssettings/notificationssettings.js +19 -0
- package/dist/cjs/product/notificationssettings/notificationssettings.recipe.js +44 -0
- package/dist/cjs/product/recordpage/index.js +2 -1
- package/dist/cjs/product/recordpage/recordpage.js +106 -9
- package/dist/cjs/product/recordpage/recordpage.recipe.js +68 -6
- package/dist/cjs/product/workspacegeneralsettings/index.js +5 -0
- package/dist/cjs/product/workspacegeneralsettings/workspacegeneralsettings.js +21 -0
- package/dist/cjs/product/workspacegeneralsettings/workspacegeneralsettings.recipe.js +51 -0
- package/dist/cjs/tokens/contract.js +1 -0
- package/dist/cjs/tokens/elevation.js +8 -5
- package/dist/cjs/tokens/palette.js +28 -8
- package/dist/cjs/tokens/scale.js +44 -2
- package/dist/cjs/tokens/semantic.js +2 -0
- package/dist/columncalc.css +15 -7
- package/dist/columncalc.layered.css +15 -7
- package/dist/command.css +23 -19
- package/dist/command.layered.css +23 -19
- package/dist/comments.css +28 -19
- package/dist/comments.d.ts +2 -2
- package/dist/comments.layered.css +28 -19
- package/dist/datatable.css +171 -71
- package/dist/datatable.layered.css +171 -71
- package/dist/datepicker.css +13 -41
- package/dist/datepicker.layered.css +13 -41
- package/dist/datepickerfield.css +12 -3
- package/dist/datepickerfield.d.ts +2 -2
- package/dist/datepickerfield.layered.css +12 -3
- package/dist/dialog.css +12 -7
- package/dist/dialog.layered.css +12 -7
- package/dist/emptystate.css +5 -3
- package/dist/emptystate.layered.css +5 -3
- package/dist/esm/components/badge/badge.recipe.js +22 -8
- package/dist/esm/components/bottomsheet/bottomsheet.js +52 -0
- package/dist/esm/components/bottomsheet/bottomsheet.recipe.js +74 -0
- package/dist/esm/components/bottomsheet/index.js +2 -0
- package/dist/esm/components/breadcrumb/breadcrumb.js +1 -1
- package/dist/esm/components/button/button.recipe.js +68 -16
- package/dist/esm/components/checkbox/checkbox.recipe.js +61 -9
- package/dist/esm/components/chip/chip.js +14 -2
- package/dist/esm/components/chip/chip.recipe.js +72 -2
- package/dist/esm/components/chipgroup/chipgroup.js +15 -0
- package/dist/esm/components/chipgroup/chipgroup.recipe.js +33 -0
- package/dist/esm/components/chipgroup/index.js +2 -0
- package/dist/esm/components/datatable/datatable.js +5 -1
- package/dist/esm/components/datatable/datatable.recipe.js +21 -6
- package/dist/esm/components/datepickerfield/datepickerfield.js +2 -2
- package/dist/esm/components/datepickerfield/datepickerfield.recipe.js +16 -3
- package/dist/esm/components/dialog/dialog.recipe.js +22 -11
- package/dist/esm/components/emptystate/emptystate.recipe.js +7 -2
- package/dist/esm/components/fileupload/fileupload.js +20 -5
- package/dist/esm/components/input/index.js +1 -1
- package/dist/esm/components/input/input.js +30 -0
- package/dist/esm/components/input/input.recipe.js +17 -10
- package/dist/esm/components/menu/menu.js +18 -2
- package/dist/esm/components/menu/menu.recipe.js +21 -7
- package/dist/esm/components/menusheet/index.js +2 -0
- package/dist/esm/components/menusheet/menusheet.js +95 -0
- package/dist/esm/components/menusheet/menusheet.recipe.js +100 -0
- package/dist/esm/components/multiselect/multiselect.js +1 -1
- package/dist/esm/components/multiselect/multiselect.recipe.js +33 -9
- package/dist/esm/components/select/select.js +1 -1
- package/dist/esm/components/select/select.recipe.js +38 -12
- package/dist/esm/components/snackbar/index.js +2 -0
- package/dist/esm/components/snackbar/snackbar.js +84 -0
- package/dist/esm/components/snackbar/snackbar.recipe.js +68 -0
- package/dist/esm/components/table/table.recipe.js +7 -1
- package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +7 -2
- package/dist/esm/components/tabletoolbar/tabletoolbar.js +37 -12
- package/dist/esm/components/tabs/tabs.js +10 -4
- package/dist/esm/components/tabs/tabs.recipe.js +23 -6
- package/dist/esm/components/textarea/textarea.recipe.js +12 -9
- package/dist/esm/core/floating-portal.js +7 -4
- package/dist/esm/index.js +7 -0
- package/dist/esm/product/authshell/authshell.recipe.js +5 -1
- package/dist/esm/product/command/command.recipe.js +4 -1
- package/dist/esm/product/comments/comments.js +7 -2
- package/dist/esm/product/comments/comments.recipe.js +25 -7
- package/dist/esm/product/inbox/inbox.js +11 -3
- package/dist/esm/product/memberssettings/index.js +1 -0
- package/dist/esm/product/memberssettings/memberssettings.js +62 -0
- package/dist/esm/product/memberssettings/memberssettings.recipe.js +80 -0
- package/dist/esm/product/notificationssettings/index.js +1 -0
- package/dist/esm/product/notificationssettings/notificationssettings.js +16 -0
- package/dist/esm/product/notificationssettings/notificationssettings.recipe.js +41 -0
- package/dist/esm/product/recordpage/index.js +1 -1
- package/dist/esm/product/recordpage/recordpage.js +106 -10
- package/dist/esm/product/recordpage/recordpage.recipe.js +68 -6
- package/dist/esm/product/workspacegeneralsettings/index.js +1 -0
- package/dist/esm/product/workspacegeneralsettings/workspacegeneralsettings.js +18 -0
- package/dist/esm/product/workspacegeneralsettings/workspacegeneralsettings.recipe.js +48 -0
- package/dist/esm/tokens/contract.js +2 -1
- package/dist/esm/tokens/elevation.js +8 -5
- package/dist/esm/tokens/palette.js +28 -8
- package/dist/esm/tokens/scale.js +43 -1
- package/dist/esm/tokens/semantic.js +2 -0
- package/dist/fileupload.css +3 -1
- package/dist/fileupload.layered.css +3 -1
- package/dist/input.css +6 -4
- package/dist/input.layered.css +6 -4
- package/dist/listpage.css +3 -1
- package/dist/listpage.layered.css +3 -1
- package/dist/memberssettings.css +67 -0
- package/dist/memberssettings.d.ts +7 -0
- package/dist/memberssettings.layered.css +69 -0
- package/dist/menu.css +2 -2
- package/dist/menu.layered.css +2 -2
- package/dist/menusheet.css +36 -0
- package/dist/menusheet.d.ts +7 -0
- package/dist/menusheet.layered.css +38 -0
- package/dist/multiselect.css +13 -6
- package/dist/multiselect.layered.css +13 -6
- package/dist/native/tokens.d.ts +2 -1
- package/dist/native/tokens.js +20 -3
- package/dist/notificationssettings.css +22 -0
- package/dist/notificationssettings.d.ts +7 -0
- package/dist/notificationssettings.layered.css +24 -0
- package/dist/objectsettings.css +4 -4
- package/dist/objectsettings.layered.css +4 -4
- package/dist/recordpage.css +90 -23
- package/dist/recordpage.layered.css +90 -23
- package/dist/recordpanel.css +35 -16
- package/dist/recordpanel.layered.css +35 -16
- package/dist/resizablepanel.css +8 -5
- package/dist/resizablepanel.layered.css +8 -5
- package/dist/richtext.css +24 -8
- package/dist/richtext.layered.css +24 -8
- package/dist/savedviews.css +9 -2
- package/dist/savedviews.layered.css +9 -2
- package/dist/select.css +25 -5
- package/dist/select.layered.css +25 -5
- package/dist/settingsshell.css +2 -3
- package/dist/settingsshell.layered.css +2 -3
- package/dist/slider.css +6 -27
- package/dist/slider.layered.css +6 -27
- package/dist/snackbar.css +24 -0
- package/dist/snackbar.d.ts +7 -0
- package/dist/snackbar.layered.css +26 -0
- package/dist/statcard.css +3 -1
- package/dist/statcard.layered.css +3 -1
- package/dist/styles.css +911 -354
- package/dist/styles.layered.css +911 -354
- package/dist/table.css +35 -12
- package/dist/table.layered.css +35 -12
- package/dist/tabletoolbar.css +35 -24
- package/dist/tabletoolbar.layered.css +35 -24
- package/dist/tabs.css +18 -4
- package/dist/tabs.layered.css +18 -4
- package/dist/textarea.css +2 -6
- package/dist/textarea.layered.css +2 -6
- package/dist/themepicker.css +2 -1
- package/dist/themepicker.layered.css +2 -1
- package/dist/tokens.css +13 -2
- package/dist/tokens.json +20 -3
- package/dist/types/components/bottomsheet/bottomsheet.d.ts +35 -0
- package/dist/types/components/bottomsheet/bottomsheet.recipe.d.ts +3 -0
- package/dist/types/components/bottomsheet/index.d.ts +2 -0
- package/dist/types/components/breadcrumb/breadcrumb.d.ts +9 -1
- package/dist/types/components/button/button.d.ts +2 -0
- package/dist/types/components/button/button.recipe.d.ts +24 -6
- package/dist/types/components/checkbox/checkbox.recipe.d.ts +28 -5
- package/dist/types/components/chip/chip.d.ts +22 -0
- package/dist/types/components/chip/chip.recipe.d.ts +49 -1
- package/dist/types/components/chipgroup/chipgroup.d.ts +14 -0
- package/dist/types/components/chipgroup/chipgroup.recipe.d.ts +5 -0
- package/dist/types/components/chipgroup/index.d.ts +2 -0
- package/dist/types/components/datatable/datatable.d.ts +19 -0
- package/dist/types/components/datepickerfield/datepickerfield.d.ts +4 -1
- package/dist/types/components/datepickerfield/datepickerfield.recipe.d.ts +18 -3
- package/dist/types/components/fileupload/fileupload.d.ts +26 -0
- package/dist/types/components/input/index.d.ts +1 -1
- package/dist/types/components/input/input.d.ts +72 -0
- package/dist/types/components/menusheet/index.d.ts +2 -0
- package/dist/types/components/menusheet/menusheet.d.ts +42 -0
- package/dist/types/components/menusheet/menusheet.recipe.d.ts +3 -0
- package/dist/types/components/snackbar/index.d.ts +2 -0
- package/dist/types/components/snackbar/snackbar.d.ts +36 -0
- package/dist/types/components/snackbar/snackbar.recipe.d.ts +5 -0
- package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +28 -1
- package/dist/types/components/tabs/tabs.d.ts +11 -1
- package/dist/types/core/floating-portal.d.ts +6 -5
- package/dist/types/index.d.ts +7 -0
- package/dist/types/product/comments/comments.d.ts +9 -3
- package/dist/types/product/comments/comments.recipe.d.ts +12 -2
- package/dist/types/product/inbox/inbox.d.ts +13 -1
- package/dist/types/product/memberssettings/index.d.ts +1 -0
- package/dist/types/product/memberssettings/memberssettings.d.ts +85 -0
- package/dist/types/product/memberssettings/memberssettings.recipe.d.ts +3 -0
- package/dist/types/product/notificationssettings/index.d.ts +1 -0
- package/dist/types/product/notificationssettings/notificationssettings.d.ts +37 -0
- package/dist/types/product/notificationssettings/notificationssettings.recipe.d.ts +3 -0
- package/dist/types/product/recordpage/index.d.ts +1 -1
- package/dist/types/product/recordpage/recordpage.d.ts +99 -2
- package/dist/types/product/workspacegeneralsettings/index.d.ts +1 -0
- package/dist/types/product/workspacegeneralsettings/workspacegeneralsettings.d.ts +48 -0
- package/dist/types/product/workspacegeneralsettings/workspacegeneralsettings.recipe.d.ts +3 -0
- package/dist/types/tokens/contract.d.ts +4 -1
- package/dist/types/tokens/elevation.d.ts +8 -5
- package/dist/types/tokens/palette.d.ts +9 -1
- package/dist/types/tokens/scale.d.ts +11 -1
- package/dist/types/tokens/semantic.d.ts +2 -0
- package/dist/wheelpicker.css +4 -2
- package/dist/wheelpicker.layered.css +4 -2
- package/dist/workspacegeneralsettings.css +30 -0
- package/dist/workspacegeneralsettings.d.ts +7 -0
- package/dist/workspacegeneralsettings.layered.css +32 -0
- package/package.json +36 -1
package/dist/recordpanel.css
CHANGED
|
@@ -8,11 +8,14 @@
|
|
|
8
8
|
beneath (the same borderSubtle every other panel/row edge here
|
|
9
9
|
already uses). Close keeps the existing transparent ghost button;
|
|
10
10
|
Previous/Next/Open record are a distinct field-elevation style
|
|
11
|
-
(white fill, e.field's own ring+shadow, solid icon) -- measured as
|
|
11
|
+
(white fill, e.field's own ring+shadow, solid icon) -- measured as
|
|
12
|
+
genuinely different chrome from Close, not a reuse. */
|
|
12
13
|
& .crisp-recordpanel-toolbar { display: flex; align-items: center; height: 49px; flex-shrink: 0; padding: var(--crisp-space-2) var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); }
|
|
13
14
|
& .crisp-recordpanel-toolbar-spacer { flex: 1; }
|
|
14
15
|
& .crisp-recordpanel-pager { display: flex; align-items: center; gap: var(--crisp-space-1-5); margin-inline-start: var(--crisp-space-3); }
|
|
15
|
-
/* #413: "2 of 37 in All Companies" -- measured live, same toolbar row,
|
|
16
|
+
/* #413: "2 of 37 in All Companies" -- measured live, same toolbar row,
|
|
17
|
+
right after Prev/Next. 12px/500, the same 63%-of-fgPrimary mix every
|
|
18
|
+
other muted heading in this panel already uses. */
|
|
16
19
|
& .crisp-recordpanel-counter { margin-inline-start: var(--crisp-space-3); font-size: 12px; font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
17
20
|
& .crisp-recordpanel-iconbtn { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; flex-shrink: 0; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: transparent; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); font-family: inherit; cursor: pointer; transition: background-color .12s; }
|
|
18
21
|
& .crisp-recordpanel-iconbtn:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
|
|
@@ -20,26 +23,36 @@
|
|
|
20
23
|
& .crisp-recordpanel-navbtn:hover:not(:disabled) { background: var(--crisp-bg-raised); }
|
|
21
24
|
& .crisp-recordpanel-navbtn:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
22
25
|
/* #413: measured live -- a 10px strip at the panel's own left edge,
|
|
23
|
-
cursor: col-resize (the issue's own repro calls it "ew-resize";
|
|
24
|
-
|
|
26
|
+
cursor: col-resize (the issue's own repro calls it "ew-resize";
|
|
27
|
+
the actual computed value read off the live DOM is col-resize, the
|
|
28
|
+
same cursor family under a different keyword). Kept fully inside the
|
|
29
|
+
panel's own box, not extending past inset-inline-start: 0, so the
|
|
30
|
+
panel's own overflow: hidden (there for its rounded corners) never
|
|
31
|
+
clips it. touch-action: none stops a touchscreen's own pan gesture
|
|
25
32
|
from fighting the drag. */
|
|
26
33
|
& .crisp-recordpanel-resize-handle { position: absolute; top: 0; bottom: 0; inset-inline-start: 0; width: 10px; cursor: col-resize; z-index: 1; touch-action: none; }
|
|
27
34
|
& .crisp-recordpanel-resize-handle:hover, & .crisp-recordpanel-resize-handle:active { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
28
|
-
|
|
29
35
|
& .crisp-recordpanel-header { display: flex; align-items: center; gap: var(--crisp-space-2); height: 52px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
|
|
30
36
|
& .crisp-recordpanel-fav { width: 22px; height: var(--crisp-size-chip); border-radius: var(--crisp-radius-sm); flex-shrink: 0; object-fit: cover; background: var(--crisp-bg-raised); }
|
|
31
37
|
& .crisp-recordpanel-title { flex: 1; min-width: 0; font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-semibold); letter-spacing: -0.2px; color: var(--crisp-fg-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
32
|
-
|
|
33
38
|
& .crisp-recordpanel-body { flex: 1; min-height: 0; overflow-y: auto; padding: var(--crisp-space-2) var(--crisp-space-3); }
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
/* #448: measured live on app.attio.com's peek (hover a Companies row,
|
|
40
|
+
click "Open preview"). Section label reads identically for both
|
|
41
|
+
Highlights and Activity: 14px/500, the same 63%-of-fgPrimary mix
|
|
42
|
+
RecordPage's own field-label already uses (product/recordpage's
|
|
43
|
+
.crisp-recordpage-field-label) -- one more surface landing on the
|
|
44
|
+
same measured "muted section heading" colour. */
|
|
36
45
|
& .crisp-recordpanel-section { padding: var(--crisp-space-2) var(--crisp-space-1) 0; }
|
|
37
46
|
& .crisp-recordpanel-section-head { display: flex; align-items: center; justify-content: space-between; gap: var(--crisp-space-2); height: 20px; margin-bottom: var(--crisp-space-2); }
|
|
38
47
|
& .crisp-recordpanel-section-label { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
39
|
-
/* "View all" -- measured 10px/400, a lighter mix than the section label
|
|
48
|
+
/* "View all" -- measured 10px/400, a lighter mix than the section label
|
|
49
|
+
(55%, not 63%) -- its own distinct, honestly-measured value, not a
|
|
50
|
+
reuse of a nearby one that happened to be close. */
|
|
40
51
|
& .crisp-recordpanel-section-action { border: none; background: none; padding: 0; font-family: inherit; font-size: 10px; font-weight: var(--crisp-weight-regular); color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer; }
|
|
41
52
|
& .crisp-recordpanel-section-action:hover { color: var(--crisp-fg-primary); }
|
|
42
|
-
/* Highlights: a 2-column grid of label+icon+value cards, no card
|
|
53
|
+
/* Highlights: a 2-column grid of label+icon+value cards, no card
|
|
54
|
+
chrome at all (no border/background/radius/shadow -- confirmed on
|
|
55
|
+
the live DOM: every highlight's computed style is fully transparent).
|
|
43
56
|
8px row/column gap; two rows measured "233x86" inside 473px content
|
|
44
57
|
width is exactly (473 - 8) / 2. */
|
|
45
58
|
& .crisp-recordpanel-highlights { display: grid; grid-template-columns: 1fr 1fr; gap: var(--crisp-space-2); }
|
|
@@ -48,27 +61,33 @@
|
|
|
48
61
|
& .crisp-recordpanel-highlight-label span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
49
62
|
& .crisp-recordpanel-highlight-label svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
50
63
|
& .crisp-recordpanel-highlight-value { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); overflow: hidden; text-overflow: ellipsis; }
|
|
51
|
-
|
|
52
64
|
/* Activity is a consumer-supplied slot (crisp has no activity-feed
|
|
53
65
|
model of its own to render) -- this only wraps it with the measured
|
|
54
66
|
section heading above. */
|
|
55
67
|
& .crisp-recordpanel-activity { font-size: var(--crisp-text-lg); }
|
|
56
|
-
|
|
57
68
|
/* #413: collapsed Emails/Notes/Tasks below Activity -- measured live: a
|
|
58
|
-
473px-wide row (the panel's own content width, 497 minus its 12px/8px
|
|
59
|
-
|
|
69
|
+
473px-wide row (the panel's own content width, 497 minus its 12px/8px
|
|
70
|
+
side insets), 20px tall, 14px/500 solid fgPrimary label (NOT the 63%
|
|
71
|
+
mix Highlights/Activity headings use -- this is body text, not a
|
|
72
|
+
muted heading), a trailing count. padding "0 8px 0 12px" measured on
|
|
73
|
+
the row itself; reproduced here as the trigger's own padding, since
|
|
74
|
+
the trigger IS the row (a plain div, not a button, when there's no
|
|
75
|
+
content to expand into -- matches the empty ("Emails 0") row
|
|
76
|
+
measured live, which has no expand affordance at all). */
|
|
60
77
|
& .crisp-recordpanel-sections { display: flex; flex-direction: column; padding-top: var(--crisp-space-2); }
|
|
61
78
|
& .crisp-recordpanel-section-trigger { display: flex; align-items: center; gap: var(--crisp-space-1); width: 100%; height: 20px; padding: 0 var(--crisp-space-2) 0 var(--crisp-space-3); border: none; background: none; font-family: inherit; text-align: start; cursor: pointer; }
|
|
62
79
|
& .crisp-recordpanel-section-trigger-inert { cursor: default; }
|
|
63
80
|
& .crisp-recordpanel-section-row-label { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
|
|
64
81
|
/* The count wasn't captured with its own background/pill chrome in the
|
|
65
82
|
live measurement (only its text: 14px, a "tertiary" internal variant
|
|
66
|
-
name that doesn't map to anything crisp defines) -- muted text next
|
|
83
|
+
name that doesn't map to anything crisp defines) -- muted text next
|
|
84
|
+
to the label, not an invented badge shape. */
|
|
67
85
|
& .crisp-recordpanel-section-row-count { font-size: var(--crisp-text-lg); color: var(--crisp-fg-muted); }
|
|
68
86
|
& .crisp-recordpanel-section-chevron { margin-inline-start: auto; flex-shrink: 0; color: var(--crisp-fg-muted); transition: transform .15s ease; }
|
|
69
87
|
& .crisp-recordpanel-section-chevron[data-open] { transform: rotate(180deg); }
|
|
70
88
|
& .crisp-recordpanel-section-content { padding: var(--crisp-space-2) var(--crisp-space-2) var(--crisp-space-2) var(--crisp-space-3); }
|
|
71
|
-
/* #329: an optional slot for record actions (e.g. Edit). Reuses the
|
|
89
|
+
/* #329: an optional slot for record actions (e.g. Edit). Reuses the
|
|
90
|
+
header's own measured values rather than inventing new ones -- the
|
|
72
91
|
same horizontal inset (space.3), the same hairline border token
|
|
73
92
|
(borderSubtle, flipped to border-top since this sits at the opposite
|
|
74
93
|
edge), and the header/body gap (space.2) for its own vertical padding
|
|
@@ -9,11 +9,14 @@
|
|
|
9
9
|
beneath (the same borderSubtle every other panel/row edge here
|
|
10
10
|
already uses). Close keeps the existing transparent ghost button;
|
|
11
11
|
Previous/Next/Open record are a distinct field-elevation style
|
|
12
|
-
(white fill, e.field's own ring+shadow, solid icon) -- measured as
|
|
12
|
+
(white fill, e.field's own ring+shadow, solid icon) -- measured as
|
|
13
|
+
genuinely different chrome from Close, not a reuse. */
|
|
13
14
|
& .crisp-recordpanel-toolbar { display: flex; align-items: center; height: 49px; flex-shrink: 0; padding: var(--crisp-space-2) var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); }
|
|
14
15
|
& .crisp-recordpanel-toolbar-spacer { flex: 1; }
|
|
15
16
|
& .crisp-recordpanel-pager { display: flex; align-items: center; gap: var(--crisp-space-1-5); margin-inline-start: var(--crisp-space-3); }
|
|
16
|
-
/* #413: "2 of 37 in All Companies" -- measured live, same toolbar row,
|
|
17
|
+
/* #413: "2 of 37 in All Companies" -- measured live, same toolbar row,
|
|
18
|
+
right after Prev/Next. 12px/500, the same 63%-of-fgPrimary mix every
|
|
19
|
+
other muted heading in this panel already uses. */
|
|
17
20
|
& .crisp-recordpanel-counter { margin-inline-start: var(--crisp-space-3); font-size: 12px; font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
18
21
|
& .crisp-recordpanel-iconbtn { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; flex-shrink: 0; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: transparent; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); font-family: inherit; cursor: pointer; transition: background-color .12s; }
|
|
19
22
|
& .crisp-recordpanel-iconbtn:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
|
|
@@ -21,26 +24,36 @@
|
|
|
21
24
|
& .crisp-recordpanel-navbtn:hover:not(:disabled) { background: var(--crisp-bg-raised); }
|
|
22
25
|
& .crisp-recordpanel-navbtn:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
23
26
|
/* #413: measured live -- a 10px strip at the panel's own left edge,
|
|
24
|
-
cursor: col-resize (the issue's own repro calls it "ew-resize";
|
|
25
|
-
|
|
27
|
+
cursor: col-resize (the issue's own repro calls it "ew-resize";
|
|
28
|
+
the actual computed value read off the live DOM is col-resize, the
|
|
29
|
+
same cursor family under a different keyword). Kept fully inside the
|
|
30
|
+
panel's own box, not extending past inset-inline-start: 0, so the
|
|
31
|
+
panel's own overflow: hidden (there for its rounded corners) never
|
|
32
|
+
clips it. touch-action: none stops a touchscreen's own pan gesture
|
|
26
33
|
from fighting the drag. */
|
|
27
34
|
& .crisp-recordpanel-resize-handle { position: absolute; top: 0; bottom: 0; inset-inline-start: 0; width: 10px; cursor: col-resize; z-index: 1; touch-action: none; }
|
|
28
35
|
& .crisp-recordpanel-resize-handle:hover, & .crisp-recordpanel-resize-handle:active { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
|
|
29
|
-
|
|
30
36
|
& .crisp-recordpanel-header { display: flex; align-items: center; gap: var(--crisp-space-2); height: 52px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
|
|
31
37
|
& .crisp-recordpanel-fav { width: 22px; height: var(--crisp-size-chip); border-radius: var(--crisp-radius-sm); flex-shrink: 0; object-fit: cover; background: var(--crisp-bg-raised); }
|
|
32
38
|
& .crisp-recordpanel-title { flex: 1; min-width: 0; font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-semibold); letter-spacing: -0.2px; color: var(--crisp-fg-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
33
|
-
|
|
34
39
|
& .crisp-recordpanel-body { flex: 1; min-height: 0; overflow-y: auto; padding: var(--crisp-space-2) var(--crisp-space-3); }
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
/* #448: measured live on app.attio.com's peek (hover a Companies row,
|
|
41
|
+
click "Open preview"). Section label reads identically for both
|
|
42
|
+
Highlights and Activity: 14px/500, the same 63%-of-fgPrimary mix
|
|
43
|
+
RecordPage's own field-label already uses (product/recordpage's
|
|
44
|
+
.crisp-recordpage-field-label) -- one more surface landing on the
|
|
45
|
+
same measured "muted section heading" colour. */
|
|
37
46
|
& .crisp-recordpanel-section { padding: var(--crisp-space-2) var(--crisp-space-1) 0; }
|
|
38
47
|
& .crisp-recordpanel-section-head { display: flex; align-items: center; justify-content: space-between; gap: var(--crisp-space-2); height: 20px; margin-bottom: var(--crisp-space-2); }
|
|
39
48
|
& .crisp-recordpanel-section-label { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
40
|
-
/* "View all" -- measured 10px/400, a lighter mix than the section label
|
|
49
|
+
/* "View all" -- measured 10px/400, a lighter mix than the section label
|
|
50
|
+
(55%, not 63%) -- its own distinct, honestly-measured value, not a
|
|
51
|
+
reuse of a nearby one that happened to be close. */
|
|
41
52
|
& .crisp-recordpanel-section-action { border: none; background: none; padding: 0; font-family: inherit; font-size: 10px; font-weight: var(--crisp-weight-regular); color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer; }
|
|
42
53
|
& .crisp-recordpanel-section-action:hover { color: var(--crisp-fg-primary); }
|
|
43
|
-
/* Highlights: a 2-column grid of label+icon+value cards, no card
|
|
54
|
+
/* Highlights: a 2-column grid of label+icon+value cards, no card
|
|
55
|
+
chrome at all (no border/background/radius/shadow -- confirmed on
|
|
56
|
+
the live DOM: every highlight's computed style is fully transparent).
|
|
44
57
|
8px row/column gap; two rows measured "233x86" inside 473px content
|
|
45
58
|
width is exactly (473 - 8) / 2. */
|
|
46
59
|
& .crisp-recordpanel-highlights { display: grid; grid-template-columns: 1fr 1fr; gap: var(--crisp-space-2); }
|
|
@@ -49,27 +62,33 @@
|
|
|
49
62
|
& .crisp-recordpanel-highlight-label span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
50
63
|
& .crisp-recordpanel-highlight-label svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
51
64
|
& .crisp-recordpanel-highlight-value { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); overflow: hidden; text-overflow: ellipsis; }
|
|
52
|
-
|
|
53
65
|
/* Activity is a consumer-supplied slot (crisp has no activity-feed
|
|
54
66
|
model of its own to render) -- this only wraps it with the measured
|
|
55
67
|
section heading above. */
|
|
56
68
|
& .crisp-recordpanel-activity { font-size: var(--crisp-text-lg); }
|
|
57
|
-
|
|
58
69
|
/* #413: collapsed Emails/Notes/Tasks below Activity -- measured live: a
|
|
59
|
-
473px-wide row (the panel's own content width, 497 minus its 12px/8px
|
|
60
|
-
|
|
70
|
+
473px-wide row (the panel's own content width, 497 minus its 12px/8px
|
|
71
|
+
side insets), 20px tall, 14px/500 solid fgPrimary label (NOT the 63%
|
|
72
|
+
mix Highlights/Activity headings use -- this is body text, not a
|
|
73
|
+
muted heading), a trailing count. padding "0 8px 0 12px" measured on
|
|
74
|
+
the row itself; reproduced here as the trigger's own padding, since
|
|
75
|
+
the trigger IS the row (a plain div, not a button, when there's no
|
|
76
|
+
content to expand into -- matches the empty ("Emails 0") row
|
|
77
|
+
measured live, which has no expand affordance at all). */
|
|
61
78
|
& .crisp-recordpanel-sections { display: flex; flex-direction: column; padding-top: var(--crisp-space-2); }
|
|
62
79
|
& .crisp-recordpanel-section-trigger { display: flex; align-items: center; gap: var(--crisp-space-1); width: 100%; height: 20px; padding: 0 var(--crisp-space-2) 0 var(--crisp-space-3); border: none; background: none; font-family: inherit; text-align: start; cursor: pointer; }
|
|
63
80
|
& .crisp-recordpanel-section-trigger-inert { cursor: default; }
|
|
64
81
|
& .crisp-recordpanel-section-row-label { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
|
|
65
82
|
/* The count wasn't captured with its own background/pill chrome in the
|
|
66
83
|
live measurement (only its text: 14px, a "tertiary" internal variant
|
|
67
|
-
name that doesn't map to anything crisp defines) -- muted text next
|
|
84
|
+
name that doesn't map to anything crisp defines) -- muted text next
|
|
85
|
+
to the label, not an invented badge shape. */
|
|
68
86
|
& .crisp-recordpanel-section-row-count { font-size: var(--crisp-text-lg); color: var(--crisp-fg-muted); }
|
|
69
87
|
& .crisp-recordpanel-section-chevron { margin-inline-start: auto; flex-shrink: 0; color: var(--crisp-fg-muted); transition: transform .15s ease; }
|
|
70
88
|
& .crisp-recordpanel-section-chevron[data-open] { transform: rotate(180deg); }
|
|
71
89
|
& .crisp-recordpanel-section-content { padding: var(--crisp-space-2) var(--crisp-space-2) var(--crisp-space-2) var(--crisp-space-3); }
|
|
72
|
-
/* #329: an optional slot for record actions (e.g. Edit). Reuses the
|
|
90
|
+
/* #329: an optional slot for record actions (e.g. Edit). Reuses the
|
|
91
|
+
header's own measured values rather than inventing new ones -- the
|
|
73
92
|
same horizontal inset (space.3), the same hairline border token
|
|
74
93
|
(borderSubtle, flipped to border-top since this sits at the opposite
|
|
75
94
|
edge), and the header/body gap (space.2) for its own vertical padding
|
package/dist/resizablepanel.css
CHANGED
|
@@ -8,13 +8,15 @@
|
|
|
8
8
|
& .crisp-resizablepanel-panel[data-floating="false"] { border-radius: 0; box-shadow: none; }
|
|
9
9
|
& .crisp-resizablepanel-panel[data-floating="false"][data-side="left"] { border-inline-end: 1px solid var(--crisp-border-subtle); }
|
|
10
10
|
& .crisp-resizablepanel-panel[data-floating="false"][data-side="right"] { border-inline-start: 1px solid var(--crisp-border-subtle); }
|
|
11
|
-
/* floating — position: fixed, 8px gutter, r10, the measured floating elevation.
|
|
11
|
+
/* floating — position: fixed, 8px gutter, r10, the measured floating elevation.
|
|
12
|
+
Rest is transform: none (Lesson 27); the off-canvas value is the @starting-style enter only. */
|
|
12
13
|
& .crisp-resizablepanel-panel[data-floating="true"] { position: fixed; top: var(--crisp-space-2); bottom: var(--crisp-space-2); border-inline-end: none; border-inline-start: none; border-radius: 10px; 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); transform: none; transition: transform 0.14s, padding 0.14s; }
|
|
13
14
|
& .crisp-resizablepanel-panel[data-floating="true"][data-side="left"] { padding: var(--crisp-space-2) 0 var(--crisp-space-2) var(--crisp-space-2); @starting-style { transform: translateX(calc(-100% - var(--crisp-space-2))); } }
|
|
14
15
|
& .crisp-resizablepanel-panel[data-floating="true"][data-side="right"] { padding: var(--crisp-space-2) var(--crisp-space-2) var(--crisp-space-2) 0; @starting-style { transform: translateX(calc(100% + var(--crisp-space-2))); } }
|
|
15
16
|
& .crisp-resizablepanel-inner { height: 100%; opacity: 1; }
|
|
16
17
|
& .crisp-resizablepanel-panel[data-floating="true"] .crisp-resizablepanel-inner { opacity: 1; transition: opacity 0.14s; @starting-style { opacity: 0; } }
|
|
17
|
-
/* handle — variant "panel" (default): a 10px hit target, its ::before the
|
|
18
|
+
/* handle — variant "panel" (default): a 10px hit target, its ::before the
|
|
19
|
+
only visible divider (1px rest -> 2px on hover/drag, brand-solid). */
|
|
18
20
|
& .crisp-resizablepanel-handle { position: absolute; top: 0; width: 10px; height: 100%; z-index: 2; cursor: col-resize; background: transparent; touch-action: none; }
|
|
19
21
|
& .crisp-resizablepanel-handle[data-side="left"] { right: 0; }
|
|
20
22
|
& .crisp-resizablepanel-handle[data-side="right"] { left: 0; }
|
|
@@ -22,9 +24,10 @@
|
|
|
22
24
|
& .crisp-resizablepanel-handle[data-side="left"]::before { right: 0; }
|
|
23
25
|
& .crisp-resizablepanel-handle[data-side="right"]::before { left: 0; }
|
|
24
26
|
& .crisp-resizablepanel-handle:hover::before, & .crisp-resizablepanel-handle[data-dragging="true"]::before { width: 2px; background: var(--crisp-bg-brand-solid); }
|
|
25
|
-
/* handle — variant "column": a wider 7px hit target straddling a 1px
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
/* handle — variant "column": a wider 7px hit target straddling a 1px
|
|
28
|
+
divider (table column edges), with a real 3px inner bar whose opacity
|
|
29
|
+
comes in on a 100ms DELAY — distinct from the panel variant's instant
|
|
30
|
+
::before swap. */ /* .crisp-resizablepanel-handle.crisp-resizablepanel-handle--column (both classes) to
|
|
28
31
|
out-specificity the base [data-side] left/right rules above, which
|
|
29
32
|
otherwise tie-break by source order alone and would win. */
|
|
30
33
|
& .crisp-resizablepanel-handle.crisp-resizablepanel-handle--column { display: flex; align-items: center; justify-content: center; width: 7px; left: -3px; right: -3px; z-index: 1; cursor: col-resize; }
|
|
@@ -9,13 +9,15 @@
|
|
|
9
9
|
& .crisp-resizablepanel-panel[data-floating="false"] { border-radius: 0; box-shadow: none; }
|
|
10
10
|
& .crisp-resizablepanel-panel[data-floating="false"][data-side="left"] { border-inline-end: 1px solid var(--crisp-border-subtle); }
|
|
11
11
|
& .crisp-resizablepanel-panel[data-floating="false"][data-side="right"] { border-inline-start: 1px solid var(--crisp-border-subtle); }
|
|
12
|
-
/* floating — position: fixed, 8px gutter, r10, the measured floating elevation.
|
|
12
|
+
/* floating — position: fixed, 8px gutter, r10, the measured floating elevation.
|
|
13
|
+
Rest is transform: none (Lesson 27); the off-canvas value is the @starting-style enter only. */
|
|
13
14
|
& .crisp-resizablepanel-panel[data-floating="true"] { position: fixed; top: var(--crisp-space-2); bottom: var(--crisp-space-2); border-inline-end: none; border-inline-start: none; border-radius: 10px; 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); transform: none; transition: transform 0.14s, padding 0.14s; }
|
|
14
15
|
& .crisp-resizablepanel-panel[data-floating="true"][data-side="left"] { padding: var(--crisp-space-2) 0 var(--crisp-space-2) var(--crisp-space-2); @starting-style { transform: translateX(calc(-100% - var(--crisp-space-2))); } }
|
|
15
16
|
& .crisp-resizablepanel-panel[data-floating="true"][data-side="right"] { padding: var(--crisp-space-2) var(--crisp-space-2) var(--crisp-space-2) 0; @starting-style { transform: translateX(calc(100% + var(--crisp-space-2))); } }
|
|
16
17
|
& .crisp-resizablepanel-inner { height: 100%; opacity: 1; }
|
|
17
18
|
& .crisp-resizablepanel-panel[data-floating="true"] .crisp-resizablepanel-inner { opacity: 1; transition: opacity 0.14s; @starting-style { opacity: 0; } }
|
|
18
|
-
/* handle — variant "panel" (default): a 10px hit target, its ::before the
|
|
19
|
+
/* handle — variant "panel" (default): a 10px hit target, its ::before the
|
|
20
|
+
only visible divider (1px rest -> 2px on hover/drag, brand-solid). */
|
|
19
21
|
& .crisp-resizablepanel-handle { position: absolute; top: 0; width: 10px; height: 100%; z-index: 2; cursor: col-resize; background: transparent; touch-action: none; }
|
|
20
22
|
& .crisp-resizablepanel-handle[data-side="left"] { right: 0; }
|
|
21
23
|
& .crisp-resizablepanel-handle[data-side="right"] { left: 0; }
|
|
@@ -23,9 +25,10 @@
|
|
|
23
25
|
& .crisp-resizablepanel-handle[data-side="left"]::before { right: 0; }
|
|
24
26
|
& .crisp-resizablepanel-handle[data-side="right"]::before { left: 0; }
|
|
25
27
|
& .crisp-resizablepanel-handle:hover::before, & .crisp-resizablepanel-handle[data-dragging="true"]::before { width: 2px; background: var(--crisp-bg-brand-solid); }
|
|
26
|
-
/* handle — variant "column": a wider 7px hit target straddling a 1px
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
/* handle — variant "column": a wider 7px hit target straddling a 1px
|
|
29
|
+
divider (table column edges), with a real 3px inner bar whose opacity
|
|
30
|
+
comes in on a 100ms DELAY — distinct from the panel variant's instant
|
|
31
|
+
::before swap. */ /* .crisp-resizablepanel-handle.crisp-resizablepanel-handle--column (both classes) to
|
|
29
32
|
out-specificity the base [data-side] left/right rules above, which
|
|
30
33
|
otherwise tie-break by source order alone and would win. */
|
|
31
34
|
& .crisp-resizablepanel-handle.crisp-resizablepanel-handle--column { display: flex; align-items: center; justify-content: center; width: 7px; left: -3px; right: -3px; z-index: 1; cursor: col-resize; }
|
package/dist/richtext.css
CHANGED
|
@@ -9,13 +9,28 @@
|
|
|
9
9
|
& .crisp-rte-body h1 { font-size: var(--crisp-text-xl); line-height: 28px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.3px; margin-top: var(--crisp-space-4); }
|
|
10
10
|
& .crisp-rte-body h2 { font-size: 17px; line-height: 24px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.2px; margin-top: var(--crisp-space-3); }
|
|
11
11
|
& .crisp-rte-body h3 { font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-semibold); margin-top: var(--crisp-space-2-5); }
|
|
12
|
-
/* #575: a consumer's CSS reset (e.g. Tailwind preflight's un-scoped
|
|
13
|
-
|
|
12
|
+
/* #575: a consumer's CSS reset (e.g. Tailwind preflight's un-scoped
|
|
13
|
+
ul, ol { list-style: none }, specificity 0,0,1) was winning every
|
|
14
|
+
list marker outright -- this rule set padding but never declared
|
|
15
|
+
list-style-type, so there was no higher-specificity value (this
|
|
16
|
+
selector is 0,1,1) to beat the reset with. Split into two
|
|
17
|
+
single-selector rules, each declaring its own marker type, rather
|
|
18
|
+
than the old single comma-joined rule ( .crisp-rte-body ul, &
|
|
19
|
+
.crisp-rte-body ol ) the issue flagged as malformed.
|
|
20
|
+
#611: padding-inline-start re-measured live once CRUD on the
|
|
21
|
+
measurement workspace was allowed (a "zz-parity" note with a
|
|
22
|
+
bulleted list, a nested bulleted list, and a numbered list) --
|
|
23
|
+
Attio's own <ul>/<ol> measures 36px (getComputedStyle,
|
|
14
24
|
~36.1353px), not the 20px placeholder #575 shipped with no real
|
|
15
|
-
content to check against. 36px isn't in tokens/scale.ts (steps
|
|
25
|
+
content to check against. 36px isn't in tokens/scale.ts (steps
|
|
26
|
+
stop at 24px, jump to 32px) and is a single component-intrinsic
|
|
27
|
+
value, so it stays a raw px per AUTHORING.md's golden rule 4b
|
|
16
28
|
rather than being rounded to an existing token or added to the
|
|
17
29
|
shared scale. Marker colour (currentColor via the already-measured
|
|
18
|
-
fgPrimary, confirmed to equal Attio's measured rgb(16,17,18) ==
|
|
30
|
+
fgPrimary, confirmed to equal Attio's measured rgb(16,17,18) ==
|
|
31
|
+
#101112 exactly) and the ~4px li-to-li gap (the existing li
|
|
32
|
+
margin-top rule below) were re-checked at the same time and
|
|
33
|
+
already matched -- only the padding was wrong. Attio doesn't vary
|
|
19
34
|
marker type for a nested list either (nested <ul> is disc too,
|
|
20
35
|
not circle), which this already doesn't attempt. */
|
|
21
36
|
& .crisp-rte-body ul { list-style-type: disc; padding-inline-start: 36px; }
|
|
@@ -26,10 +41,13 @@
|
|
|
26
41
|
& .crisp-rte-body a { color: var(--crisp-bg-brand-solid); text-decoration: underline; text-underline-offset: 2px; }
|
|
27
42
|
& .crisp-rte-body strong { font-weight: var(--crisp-weight-semibold); }
|
|
28
43
|
& .crisp-rte-body img { display: block; max-width: 100%; border-radius: var(--crisp-radius-md); }
|
|
29
|
-
/* Not measured against Attio (#428) — nothing in a read-only pass over
|
|
44
|
+
/* Not measured against Attio (#428) — nothing in a read-only pass over
|
|
45
|
+
app.attio.com had a live @mention rendered to read computed styles
|
|
46
|
+
from, and typing one to create one is off-limits there. Reused
|
|
47
|
+
verbatim from the one measured "brand" tag/chip this repo already
|
|
48
|
+
has (RecordsTable/MultiSelect's [data-tone="brand"]) rather than
|
|
30
49
|
inventing a new color or shape. */
|
|
31
50
|
& .crisp-rte-mention { display: inline; border-radius: var(--crisp-radius-chip); padding: 0 var(--crisp-space-1); background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: color-mix(in srgb, var(--crisp-bg-brand-solid) 82%, var(--crisp-fg-primary)); font-weight: var(--crisp-weight-medium); cursor: default; }
|
|
32
|
-
|
|
33
51
|
& .crisp-rte-toolbar { position: fixed; z-index: 70; display: inline-flex; align-items: center; gap: 2px; padding: 2px; border-radius: 10px; background: var(--crisp-bg-surface); 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); transform: translate(-50%, -100%); opacity: 1; transition: opacity 0.1s ease; }
|
|
34
52
|
& .crisp-rte-toolbar { @starting-style { opacity: 0; } }
|
|
35
53
|
& .crisp-rte-tool { display: inline-flex; align-items: center; justify-content: center; gap: var(--crisp-space-1); min-width: 30px; height: 28px; padding: 0 7px; margin: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); font-family: inherit; font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); cursor: pointer; transition: background-color .1s; }
|
|
@@ -37,13 +55,11 @@
|
|
|
37
55
|
& .crisp-rte-tool:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
|
|
38
56
|
& .crisp-rte-tool[data-active], & .crisp-rte-tool[aria-expanded="true"] { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 12%, transparent); color: var(--crisp-bg-brand-solid); }
|
|
39
57
|
& .crisp-rte-tool-sep { width: 1px; height: 16px; margin: 0 2px; background: var(--crisp-border-subtle); }
|
|
40
|
-
|
|
41
58
|
& .crisp-rte-swatchpanel { position: fixed; z-index: 71; display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--crisp-space-1); width: 168px; padding: var(--crisp-space-1-5); border-radius: var(--crisp-radius-lg); background: var(--crisp-bg-surface); 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); transform: translate(-50%, var(--crisp-space-1-5)); opacity: 1; transition: opacity 0.1s ease; }
|
|
42
59
|
& .crisp-rte-swatchpanel { @starting-style { opacity: 0; } }
|
|
43
60
|
& .crisp-rte-swatch { width: 28px; height: 28px; padding: 0; margin: 0; border: none; border-radius: 50%; background: none; font-family: inherit; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 10%, transparent); cursor: pointer; }
|
|
44
61
|
& .crisp-rte-swatch--none { background: var(--crisp-bg-surface); position: relative; }
|
|
45
62
|
& .crisp-rte-swatch--none::after { content: ""; position: absolute; inset: 6px; border-top: 1.5px solid color-mix(in srgb, var(--crisp-fg-primary) 40%, transparent); transform: rotate(-45deg); }
|
|
46
|
-
|
|
47
63
|
& .crisp-rte-blockmenu { position: fixed; z-index: 71; box-sizing: border-box; width: 356px; padding: 0; border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); 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); opacity: 1; transition: opacity 0.1s ease; }
|
|
48
64
|
& .crisp-rte-blockmenu { @starting-style { opacity: 0; } }
|
|
49
65
|
& .crisp-rte-blockmenu-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding: var(--crisp-space-2-5) var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
@@ -10,13 +10,28 @@
|
|
|
10
10
|
& .crisp-rte-body h1 { font-size: var(--crisp-text-xl); line-height: 28px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.3px; margin-top: var(--crisp-space-4); }
|
|
11
11
|
& .crisp-rte-body h2 { font-size: 17px; line-height: 24px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.2px; margin-top: var(--crisp-space-3); }
|
|
12
12
|
& .crisp-rte-body h3 { font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-semibold); margin-top: var(--crisp-space-2-5); }
|
|
13
|
-
/* #575: a consumer's CSS reset (e.g. Tailwind preflight's un-scoped
|
|
14
|
-
|
|
13
|
+
/* #575: a consumer's CSS reset (e.g. Tailwind preflight's un-scoped
|
|
14
|
+
ul, ol { list-style: none }, specificity 0,0,1) was winning every
|
|
15
|
+
list marker outright -- this rule set padding but never declared
|
|
16
|
+
list-style-type, so there was no higher-specificity value (this
|
|
17
|
+
selector is 0,1,1) to beat the reset with. Split into two
|
|
18
|
+
single-selector rules, each declaring its own marker type, rather
|
|
19
|
+
than the old single comma-joined rule ( .crisp-rte-body ul, &
|
|
20
|
+
.crisp-rte-body ol ) the issue flagged as malformed.
|
|
21
|
+
#611: padding-inline-start re-measured live once CRUD on the
|
|
22
|
+
measurement workspace was allowed (a "zz-parity" note with a
|
|
23
|
+
bulleted list, a nested bulleted list, and a numbered list) --
|
|
24
|
+
Attio's own <ul>/<ol> measures 36px (getComputedStyle,
|
|
15
25
|
~36.1353px), not the 20px placeholder #575 shipped with no real
|
|
16
|
-
content to check against. 36px isn't in tokens/scale.ts (steps
|
|
26
|
+
content to check against. 36px isn't in tokens/scale.ts (steps
|
|
27
|
+
stop at 24px, jump to 32px) and is a single component-intrinsic
|
|
28
|
+
value, so it stays a raw px per AUTHORING.md's golden rule 4b
|
|
17
29
|
rather than being rounded to an existing token or added to the
|
|
18
30
|
shared scale. Marker colour (currentColor via the already-measured
|
|
19
|
-
fgPrimary, confirmed to equal Attio's measured rgb(16,17,18) ==
|
|
31
|
+
fgPrimary, confirmed to equal Attio's measured rgb(16,17,18) ==
|
|
32
|
+
#101112 exactly) and the ~4px li-to-li gap (the existing li
|
|
33
|
+
margin-top rule below) were re-checked at the same time and
|
|
34
|
+
already matched -- only the padding was wrong. Attio doesn't vary
|
|
20
35
|
marker type for a nested list either (nested <ul> is disc too,
|
|
21
36
|
not circle), which this already doesn't attempt. */
|
|
22
37
|
& .crisp-rte-body ul { list-style-type: disc; padding-inline-start: 36px; }
|
|
@@ -27,10 +42,13 @@
|
|
|
27
42
|
& .crisp-rte-body a { color: var(--crisp-bg-brand-solid); text-decoration: underline; text-underline-offset: 2px; }
|
|
28
43
|
& .crisp-rte-body strong { font-weight: var(--crisp-weight-semibold); }
|
|
29
44
|
& .crisp-rte-body img { display: block; max-width: 100%; border-radius: var(--crisp-radius-md); }
|
|
30
|
-
/* Not measured against Attio (#428) — nothing in a read-only pass over
|
|
45
|
+
/* Not measured against Attio (#428) — nothing in a read-only pass over
|
|
46
|
+
app.attio.com had a live @mention rendered to read computed styles
|
|
47
|
+
from, and typing one to create one is off-limits there. Reused
|
|
48
|
+
verbatim from the one measured "brand" tag/chip this repo already
|
|
49
|
+
has (RecordsTable/MultiSelect's [data-tone="brand"]) rather than
|
|
31
50
|
inventing a new color or shape. */
|
|
32
51
|
& .crisp-rte-mention { display: inline; border-radius: var(--crisp-radius-chip); padding: 0 var(--crisp-space-1); background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: color-mix(in srgb, var(--crisp-bg-brand-solid) 82%, var(--crisp-fg-primary)); font-weight: var(--crisp-weight-medium); cursor: default; }
|
|
33
|
-
|
|
34
52
|
& .crisp-rte-toolbar { position: fixed; z-index: 70; display: inline-flex; align-items: center; gap: 2px; padding: 2px; border-radius: 10px; background: var(--crisp-bg-surface); 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); transform: translate(-50%, -100%); opacity: 1; transition: opacity 0.1s ease; }
|
|
35
53
|
& .crisp-rte-toolbar { @starting-style { opacity: 0; } }
|
|
36
54
|
& .crisp-rte-tool { display: inline-flex; align-items: center; justify-content: center; gap: var(--crisp-space-1); min-width: 30px; height: 28px; padding: 0 7px; margin: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); font-family: inherit; font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); cursor: pointer; transition: background-color .1s; }
|
|
@@ -38,13 +56,11 @@
|
|
|
38
56
|
& .crisp-rte-tool:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
|
|
39
57
|
& .crisp-rte-tool[data-active], & .crisp-rte-tool[aria-expanded="true"] { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 12%, transparent); color: var(--crisp-bg-brand-solid); }
|
|
40
58
|
& .crisp-rte-tool-sep { width: 1px; height: 16px; margin: 0 2px; background: var(--crisp-border-subtle); }
|
|
41
|
-
|
|
42
59
|
& .crisp-rte-swatchpanel { position: fixed; z-index: 71; display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--crisp-space-1); width: 168px; padding: var(--crisp-space-1-5); border-radius: var(--crisp-radius-lg); background: var(--crisp-bg-surface); 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); transform: translate(-50%, var(--crisp-space-1-5)); opacity: 1; transition: opacity 0.1s ease; }
|
|
43
60
|
& .crisp-rte-swatchpanel { @starting-style { opacity: 0; } }
|
|
44
61
|
& .crisp-rte-swatch { width: 28px; height: 28px; padding: 0; margin: 0; border: none; border-radius: 50%; background: none; font-family: inherit; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 10%, transparent); cursor: pointer; }
|
|
45
62
|
& .crisp-rte-swatch--none { background: var(--crisp-bg-surface); position: relative; }
|
|
46
63
|
& .crisp-rte-swatch--none::after { content: ""; position: absolute; inset: 6px; border-top: 1.5px solid color-mix(in srgb, var(--crisp-fg-primary) 40%, transparent); transform: rotate(-45deg); }
|
|
47
|
-
|
|
48
64
|
& .crisp-rte-blockmenu { position: fixed; z-index: 71; box-sizing: border-box; width: 356px; padding: 0; border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); 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); opacity: 1; transition: opacity 0.1s ease; }
|
|
49
65
|
& .crisp-rte-blockmenu { @starting-style { opacity: 0; } }
|
|
50
66
|
& .crisp-rte-blockmenu-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding: var(--crisp-space-2-5) var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
package/dist/savedviews.css
CHANGED
|
@@ -74,9 +74,16 @@
|
|
|
74
74
|
|
|
75
75
|
.crisp-savedviews {
|
|
76
76
|
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
|
|
77
|
-
actual position (Attio's real view bar, next to View settings --
|
|
77
|
+
actual position (Attio's real view bar, next to View settings --
|
|
78
|
+
fixed there in #766/#768/#778): white (bgSurface, rgb(255,255,255)
|
|
79
|
+
exact) with elevation.field's 3-layer shadow, the same raised
|
|
78
80
|
chrome View settings and Import/Export both carry
|
|
79
|
-
(tabletoolbar.recipe.ts's own --raised, not reused here directly
|
|
81
|
+
(tabletoolbar.recipe.ts's own --raised, not reused here directly
|
|
82
|
+
since this is a separate recipe/component, but the identical measured
|
|
83
|
+
values). Supersedes the original #555 measurement (rgb(246,247,247),
|
|
84
|
+
reused as bgRaised -- a flat grey fill with no shadow at all), which
|
|
85
|
+
was wrong: this trigger was never re-checked once it moved into its
|
|
86
|
+
real view-bar position. */
|
|
80
87
|
& .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; }
|
|
81
88
|
& .crisp-savedviews-trigger:hover, & .crisp-savedviews-trigger[data-open] { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-surface)); }
|
|
82
89
|
& .crisp-savedviews-trigger-icon { flex-shrink: 0; display: inline-flex; width: var(--crisp-size-icon); height: var(--crisp-size-icon); }
|
|
@@ -75,9 +75,16 @@
|
|
|
75
75
|
|
|
76
76
|
.crisp-savedviews {
|
|
77
77
|
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
|
|
78
|
-
actual position (Attio's real view bar, next to View settings --
|
|
78
|
+
actual position (Attio's real view bar, next to View settings --
|
|
79
|
+
fixed there in #766/#768/#778): white (bgSurface, rgb(255,255,255)
|
|
80
|
+
exact) with elevation.field's 3-layer shadow, the same raised
|
|
79
81
|
chrome View settings and Import/Export both carry
|
|
80
|
-
(tabletoolbar.recipe.ts's own --raised, not reused here directly
|
|
82
|
+
(tabletoolbar.recipe.ts's own --raised, not reused here directly
|
|
83
|
+
since this is a separate recipe/component, but the identical measured
|
|
84
|
+
values). Supersedes the original #555 measurement (rgb(246,247,247),
|
|
85
|
+
reused as bgRaised -- a flat grey fill with no shadow at all), which
|
|
86
|
+
was wrong: this trigger was never re-checked once it moved into its
|
|
87
|
+
real view-bar position. */
|
|
81
88
|
& .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; }
|
|
82
89
|
& .crisp-savedviews-trigger:hover, & .crisp-savedviews-trigger[data-open] { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-surface)); }
|
|
83
90
|
& .crisp-savedviews-trigger-icon { flex-shrink: 0; display: inline-flex; width: var(--crisp-size-icon); height: var(--crisp-size-icon); }
|
package/dist/select.css
CHANGED
|
@@ -27,6 +27,20 @@
|
|
|
27
27
|
.crisp-select-search svg { flex-shrink: 0; }
|
|
28
28
|
.crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); line-height: 19px; color: var(--crisp-fg-select-neutral); }
|
|
29
29
|
.crisp-select-search input::placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
30
|
+
/* select.yaml's own divider slot (marginX x4, height 1px, colour
|
|
31
|
+
stroke.neutral-muted -- described upstream as "the line marking a
|
|
32
|
+
boundary between semantic units: between sections, between content
|
|
33
|
+
and an action area, between a header and a body" -- exactly the
|
|
34
|
+
search-field/option-list boundary crisp#904's review flagged as
|
|
35
|
+
reading too tight). Not the general-purpose separator #867 declined
|
|
36
|
+
to build (nothing groups options with one) -- scoped to this one
|
|
37
|
+
specific header/body seam, which now exists because searchable
|
|
38
|
+
does. Sits as an ordinary flex child, so the listbox's own 8px gap
|
|
39
|
+
still applies on both sides of it -- total visual seam is
|
|
40
|
+
gap+1px+gap (17px), deliberately more than the 8px between two
|
|
41
|
+
plain option rows, so it reads as a section break, not a wider list
|
|
42
|
+
gap. */
|
|
43
|
+
.crisp-select-divider { flex-shrink: 0; height: 1px; margin-inline: var(--crisp-space-4); background: var(--crisp-stroke-select-divider); }
|
|
30
44
|
.crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-4); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-neutral-subtle); }
|
|
31
45
|
/* select.yaml's groupLabel -- font-size/line-height/weight are the same
|
|
32
46
|
across sizes, only paddingY differs (medium 8px, large 10px). */
|
|
@@ -56,21 +70,27 @@
|
|
|
56
70
|
.crisp-select {
|
|
57
71
|
position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
58
72
|
& .crisp-select-trigger { box-sizing: border-box; display: inline-flex; align-items: center; width: 100%; min-width: 0; margin: 0; border: 1px solid var(--crisp-stroke-select-trigger); background: transparent; cursor: pointer; font-family: inherit; color: var(--crisp-fg-select-neutral); transition: background-color .15s cubic-bezier(.35,0,.35,1), border-color .1s cubic-bezier(.35,0,.35,1), border-width .1s cubic-bezier(.35,0,.35,1); }
|
|
59
|
-
/* seed defines no hover state for this trigger -- only pressed, invalid,
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
/* seed defines no hover state for this trigger -- only pressed, invalid,
|
|
74
|
+
disabled and readonly. The scale-down is scoped to the CONTENT
|
|
75
|
+
(seed's scaleScope: content), not the button itself, so the border
|
|
76
|
+
never moves. */ /* Only the value scales, not the chevron: the chevron's own transform is
|
|
77
|
+
its open/close rotation, and a scale would fight it for one shared
|
|
78
|
+
CSS property when both are true at once (pressing while open). */
|
|
62
79
|
& .crisp-select-trigger:active:not(:disabled):not([aria-readonly="true"]) { background: var(--crisp-bg-select-pressed); }
|
|
63
80
|
& .crisp-select-trigger:active:not(:disabled):not([aria-readonly="true"]) .crisp-select-value { transform: scale(0.98); }
|
|
64
81
|
& .crisp-select-trigger:focus-visible { outline: 2px solid var(--crisp-stroke-focus-ring); outline-offset: -2px; }
|
|
65
82
|
& .crisp-select-trigger:disabled { background: var(--crisp-bg-select-disabled); cursor: not-allowed; }
|
|
66
83
|
& .crisp-select-trigger:disabled .crisp-select-value, & .crisp-select-trigger:disabled .crisp-select-placeholder, & .crisp-select-trigger:disabled .crisp-select-chevron { color: var(--crisp-fg-disabled); }
|
|
67
|
-
/* readonly: same fill as disabled, but the value/placeholder text stays
|
|
84
|
+
/* readonly: same fill as disabled, but the value/placeholder text stays
|
|
85
|
+
normal ink -- it reads as "answered and locked", not "answered and
|
|
68
86
|
greyed out" (select-trigger.yaml's readonly state only overrides
|
|
69
87
|
root.color; value/placeholder keep their enabled colours). */
|
|
70
88
|
& .crisp-select-trigger[aria-readonly="true"] { background: var(--crisp-bg-select-disabled); cursor: default; }
|
|
71
89
|
& .crisp-select-value { flex: 1; min-width: 0; display: inline-flex; align-items: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: start; transition: transform .15s cubic-bezier(0,0,.15,1); }
|
|
72
90
|
& .crisp-select-placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
73
|
-
/* closeRotateDuration/closeRotateTimingFunction: 100ms, seed's "easing"
|
|
91
|
+
/* closeRotateDuration/closeRotateTimingFunction: 100ms, seed's "easing"
|
|
92
|
+
curve. Overridden to 150ms on open (openRotateDuration) below --
|
|
93
|
+
same curve both ways, only the duration differs. */
|
|
74
94
|
& .crisp-select-chevron { flex-shrink: 0; color: var(--crisp-fg-neutral-muted); transition: transform .1s cubic-bezier(.35,0,.35,1); }
|
|
75
95
|
& .crisp-select-trigger[data-open] .crisp-select-chevron { transform: rotate(180deg); transition-duration: .15s; }
|
|
76
96
|
}
|
package/dist/select.layered.css
CHANGED
|
@@ -28,6 +28,20 @@
|
|
|
28
28
|
.crisp-select-search svg { flex-shrink: 0; }
|
|
29
29
|
.crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); line-height: 19px; color: var(--crisp-fg-select-neutral); }
|
|
30
30
|
.crisp-select-search input::placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
31
|
+
/* select.yaml's own divider slot (marginX x4, height 1px, colour
|
|
32
|
+
stroke.neutral-muted -- described upstream as "the line marking a
|
|
33
|
+
boundary between semantic units: between sections, between content
|
|
34
|
+
and an action area, between a header and a body" -- exactly the
|
|
35
|
+
search-field/option-list boundary crisp#904's review flagged as
|
|
36
|
+
reading too tight). Not the general-purpose separator #867 declined
|
|
37
|
+
to build (nothing groups options with one) -- scoped to this one
|
|
38
|
+
specific header/body seam, which now exists because searchable
|
|
39
|
+
does. Sits as an ordinary flex child, so the listbox's own 8px gap
|
|
40
|
+
still applies on both sides of it -- total visual seam is
|
|
41
|
+
gap+1px+gap (17px), deliberately more than the 8px between two
|
|
42
|
+
plain option rows, so it reads as a section break, not a wider list
|
|
43
|
+
gap. */
|
|
44
|
+
.crisp-select-divider { flex-shrink: 0; height: 1px; margin-inline: var(--crisp-space-4); background: var(--crisp-stroke-select-divider); }
|
|
31
45
|
.crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-4); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-neutral-subtle); }
|
|
32
46
|
/* select.yaml's groupLabel -- font-size/line-height/weight are the same
|
|
33
47
|
across sizes, only paddingY differs (medium 8px, large 10px). */
|
|
@@ -57,21 +71,27 @@
|
|
|
57
71
|
.crisp-select {
|
|
58
72
|
position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
59
73
|
& .crisp-select-trigger { box-sizing: border-box; display: inline-flex; align-items: center; width: 100%; min-width: 0; margin: 0; border: 1px solid var(--crisp-stroke-select-trigger); background: transparent; cursor: pointer; font-family: inherit; color: var(--crisp-fg-select-neutral); transition: background-color .15s cubic-bezier(.35,0,.35,1), border-color .1s cubic-bezier(.35,0,.35,1), border-width .1s cubic-bezier(.35,0,.35,1); }
|
|
60
|
-
/* seed defines no hover state for this trigger -- only pressed, invalid,
|
|
61
|
-
|
|
62
|
-
|
|
74
|
+
/* seed defines no hover state for this trigger -- only pressed, invalid,
|
|
75
|
+
disabled and readonly. The scale-down is scoped to the CONTENT
|
|
76
|
+
(seed's scaleScope: content), not the button itself, so the border
|
|
77
|
+
never moves. */ /* Only the value scales, not the chevron: the chevron's own transform is
|
|
78
|
+
its open/close rotation, and a scale would fight it for one shared
|
|
79
|
+
CSS property when both are true at once (pressing while open). */
|
|
63
80
|
& .crisp-select-trigger:active:not(:disabled):not([aria-readonly="true"]) { background: var(--crisp-bg-select-pressed); }
|
|
64
81
|
& .crisp-select-trigger:active:not(:disabled):not([aria-readonly="true"]) .crisp-select-value { transform: scale(0.98); }
|
|
65
82
|
& .crisp-select-trigger:focus-visible { outline: 2px solid var(--crisp-stroke-focus-ring); outline-offset: -2px; }
|
|
66
83
|
& .crisp-select-trigger:disabled { background: var(--crisp-bg-select-disabled); cursor: not-allowed; }
|
|
67
84
|
& .crisp-select-trigger:disabled .crisp-select-value, & .crisp-select-trigger:disabled .crisp-select-placeholder, & .crisp-select-trigger:disabled .crisp-select-chevron { color: var(--crisp-fg-disabled); }
|
|
68
|
-
/* readonly: same fill as disabled, but the value/placeholder text stays
|
|
85
|
+
/* readonly: same fill as disabled, but the value/placeholder text stays
|
|
86
|
+
normal ink -- it reads as "answered and locked", not "answered and
|
|
69
87
|
greyed out" (select-trigger.yaml's readonly state only overrides
|
|
70
88
|
root.color; value/placeholder keep their enabled colours). */
|
|
71
89
|
& .crisp-select-trigger[aria-readonly="true"] { background: var(--crisp-bg-select-disabled); cursor: default; }
|
|
72
90
|
& .crisp-select-value { flex: 1; min-width: 0; display: inline-flex; align-items: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: start; transition: transform .15s cubic-bezier(0,0,.15,1); }
|
|
73
91
|
& .crisp-select-placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
74
|
-
/* closeRotateDuration/closeRotateTimingFunction: 100ms, seed's "easing"
|
|
92
|
+
/* closeRotateDuration/closeRotateTimingFunction: 100ms, seed's "easing"
|
|
93
|
+
curve. Overridden to 150ms on open (openRotateDuration) below --
|
|
94
|
+
same curve both ways, only the duration differs. */
|
|
75
95
|
& .crisp-select-chevron { flex-shrink: 0; color: var(--crisp-fg-neutral-muted); transition: transform .1s cubic-bezier(.35,0,.35,1); }
|
|
76
96
|
& .crisp-select-trigger[data-open] .crisp-select-chevron { transform: rotate(180deg); transition-duration: .15s; }
|
|
77
97
|
}
|