@crisp-ui-kit/crisp 0.52.4 → 0.52.6

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.
Files changed (78) hide show
  1. package/dist/board.css +6 -6
  2. package/dist/board.layered.css +6 -6
  3. package/dist/bulkbar.css +2 -2
  4. package/dist/bulkbar.layered.css +2 -2
  5. package/dist/cjs/components/bulkbar/bulkbar.js +1 -1
  6. package/dist/cjs/components/bulkbar/bulkbar.recipe.js +2 -2
  7. package/dist/cjs/components/datatable/datatable.recipe.js +4 -1
  8. package/dist/cjs/components/input/input.recipe.js +6 -1
  9. package/dist/cjs/components/multiselect/multiselect.js +1 -1
  10. package/dist/cjs/components/multiselect/multiselect.recipe.js +1 -1
  11. package/dist/cjs/components/switch/switch.recipe.js +4 -0
  12. package/dist/cjs/components/table/table.recipe.js +5 -1
  13. package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +5 -4
  14. package/dist/cjs/components/tabletoolbar/tabletoolbar.js +1 -1
  15. package/dist/cjs/components/textarea/textarea.recipe.js +6 -1
  16. package/dist/cjs/components/tooltip/tooltip.recipe.js +13 -4
  17. package/dist/cjs/product/board/board.recipe.js +16 -6
  18. package/dist/cjs/product/entitycard/entitycard.recipe.js +20 -4
  19. package/dist/cjs/product/listpage/listpage.js +1 -1
  20. package/dist/cjs/product/listpage/listpage.recipe.js +5 -7
  21. package/dist/cjs/tokens/elevation.js +17 -2
  22. package/dist/cjs/tokens/palette.js +17 -0
  23. package/dist/cjs/tokens/semantic.js +2 -0
  24. package/dist/datatable.css +30 -24
  25. package/dist/datatable.layered.css +30 -24
  26. package/dist/entitycard.css +4 -4
  27. package/dist/entitycard.layered.css +4 -4
  28. package/dist/esm/components/bulkbar/bulkbar.js +1 -1
  29. package/dist/esm/components/bulkbar/bulkbar.recipe.js +2 -2
  30. package/dist/esm/components/datatable/datatable.recipe.js +4 -1
  31. package/dist/esm/components/input/input.recipe.js +6 -1
  32. package/dist/esm/components/multiselect/multiselect.js +1 -1
  33. package/dist/esm/components/multiselect/multiselect.recipe.js +1 -1
  34. package/dist/esm/components/switch/switch.recipe.js +4 -0
  35. package/dist/esm/components/table/table.recipe.js +5 -1
  36. package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +5 -4
  37. package/dist/esm/components/tabletoolbar/tabletoolbar.js +1 -1
  38. package/dist/esm/components/textarea/textarea.recipe.js +6 -1
  39. package/dist/esm/components/tooltip/tooltip.recipe.js +13 -4
  40. package/dist/esm/product/board/board.recipe.js +16 -6
  41. package/dist/esm/product/entitycard/entitycard.recipe.js +20 -4
  42. package/dist/esm/product/listpage/listpage.js +2 -2
  43. package/dist/esm/product/listpage/listpage.recipe.js +5 -7
  44. package/dist/esm/tokens/elevation.js +17 -2
  45. package/dist/esm/tokens/palette.js +17 -0
  46. package/dist/esm/tokens/semantic.js +2 -0
  47. package/dist/input.css +1 -1
  48. package/dist/input.layered.css +1 -1
  49. package/dist/listpage.css +5 -5
  50. package/dist/listpage.layered.css +5 -5
  51. package/dist/multiselect.css +1 -1
  52. package/dist/multiselect.layered.css +1 -1
  53. package/dist/native/tokens.d.ts +1 -1
  54. package/dist/native/tokens.js +8 -0
  55. package/dist/recordstable.css +5 -4
  56. package/dist/recordstable.layered.css +5 -4
  57. package/dist/styles.css +69 -55
  58. package/dist/styles.layered.css +69 -55
  59. package/dist/switch.css +1 -1
  60. package/dist/switch.layered.css +1 -1
  61. package/dist/table.css +3 -1
  62. package/dist/table.layered.css +3 -1
  63. package/dist/tabletoolbar.css +5 -4
  64. package/dist/tabletoolbar.layered.css +5 -4
  65. package/dist/textarea.css +1 -1
  66. package/dist/textarea.layered.css +1 -1
  67. package/dist/tokens.css +4 -0
  68. package/dist/tokens.json +8 -0
  69. package/dist/tooltip.css +1 -1
  70. package/dist/tooltip.layered.css +1 -1
  71. package/dist/types/components/bulkbar/bulkbar.d.ts +3 -3
  72. package/dist/types/components/switch/switch.recipe.d.ts +1 -0
  73. package/dist/types/components/tooltip/tooltip.recipe.d.ts +2 -2
  74. package/dist/types/tokens/contract.d.ts +2 -0
  75. package/dist/types/tokens/elevation.d.ts +17 -2
  76. package/dist/types/tokens/palette.d.ts +8 -0
  77. package/dist/types/tokens/semantic.d.ts +2 -0
  78. package/package.json +1 -1
@@ -8,6 +8,8 @@
8
8
  --crisp-border-default: #e4e4e7;
9
9
  --crisp-border-subtle: #eeeff1;
10
10
  --crisp-ring-neutral: transparent;
11
+ --crisp-ring-field: rgba(0,0,0,0.06);
12
+ --crisp-ring-switch: #d9dade;
11
13
  --crisp-bg-tile-active: #ffffff;
12
14
  --crisp-shadow-tile-active: rgba(0,0,0,0.04);
13
15
  --crisp-bg-overlay-frost: #ffffff;
@@ -55,6 +57,8 @@
55
57
  --crisp-border-default: #212224;
56
58
  --crisp-border-subtle: #1c1d1f;
57
59
  --crisp-ring-neutral: #212224;
60
+ --crisp-ring-field: #212224;
61
+ --crisp-ring-switch: #212224;
58
62
  --crisp-bg-tile-active: #101112;
59
63
  --crisp-shadow-tile-active: rgba(0,0,0,0);
60
64
  --crisp-bg-overlay-frost: #1c1d1f;
@@ -291,13 +295,13 @@
291
295
  position: absolute; left: 0; right: 0; bottom: var(--crisp-space-4); display: flex; justify-content: center; pointer-events: none; z-index: 10;
292
296
  & .crisp-bulkbar-bar { pointer-events: auto; display: flex; align-items: center; gap: var(--crisp-space-0-5); height: 48px; padding: 0 var(--crisp-space-1) 0 var(--crisp-space-1-5); border-radius: 14px; 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); color: var(--crisp-fg-primary); transition: opacity .16s ease, transform .16s ease; }
293
297
  & .crisp-bulkbar-bar { @starting-style { opacity: 0; transform: translateY(10px); } }
294
- & .crisp-bulkbar-count { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-menuRow); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
298
+ & .crisp-bulkbar-count { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-menuRow); margin: 0; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-lg); background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); white-space: nowrap; cursor: pointer; transition: background-color .12s; }
295
299
  & .crisp-bulkbar-count:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 8%, transparent); color: var(--crisp-fg-primary); }
296
300
  & .crisp-bulkbar-count svg { flex-shrink: 0; }
297
301
  /* the ", Clear selection" ARIA concatenates onto the pill's name (#324)
298
302
  -- read, never drawn. Same technique as Slider's thumblabel. */
299
303
  & .crisp-bulkbar-clearlabel { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
300
- & .crisp-bulkbar-btn { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-menuRow); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: transparent; 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; }
304
+ & .crisp-bulkbar-btn { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-menuRow); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-lg); 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); 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; }
301
305
  & .crisp-bulkbar-btn:hover { background: var(--crisp-bg-raised); }
302
306
  & .crisp-bulkbar-btn--danger { color: var(--crisp-bg-danger); }
303
307
  & .crisp-bulkbar-btn--danger:hover { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
@@ -573,13 +577,15 @@
573
577
  & .crisp-datatable-th-rename { width: 100%; min-width: 0; height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-1); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); outline: none; }
574
578
  & .crisp-datatable-th-rename:focus { box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); }
575
579
  & .crisp-datatable-th-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
576
- & .crisp-datatable-sort { display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; min-width: 0; height: 100%; margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; font: inherit; letter-spacing: inherit; color: inherit; text-align: start; cursor: pointer; }
577
- /* A right-aligned column's header keeps its field-icon + label packed at
578
- the START, matching its own values only in that the VALUES right-align
579
- -- Attio's own right-aligned header (measured live: "Twitter follower
580
- count") keeps the icon+label left and only the trailing column-menu icon sits pinned to the right edge, independent of the label's width
581
- (#406, reversing #393's own justify-content: flex-end here). The chevron's own margin-inline-start: auto below already pins IT to the
582
- end of a flex-start row with no override needed -- that's what pins the trailing icon on Attio too. */
580
+ /* #465: 12px per the comment above (and Attio's measured header cell
581
+ padding: 0 12px) -- was still c.space["2"] (8px), drifted from its
582
+ own documented value. */
583
+ & .crisp-datatable-sort { display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; min-width: 0; height: 100%; margin: 0; padding: 0 var(--crisp-space-3); border: none; background: none; font: inherit; letter-spacing: inherit; color: inherit; text-align: start; cursor: pointer; }
584
+ /* A right-aligned column's header keeps its field-icon + label packed at the START, matching its own values only in that the VALUES right-align -- Attio's own right-aligned header (measured live: "Twitter follower
585
+ count") keeps the icon+label left and only the trailing column-menu
586
+ icon sits pinned to the right edge, independent of the label's width (#406, reversing #393's own justify-content: flex-end here). The
587
+ chevron's own margin-inline-start: auto below already pins IT to the end of a flex-start row with no override needed -- that's what pins
588
+ the trailing icon on Attio too. */
583
589
  & .crisp-datatable-chevron { margin-inline-start: auto; flex-shrink: 0; color: var(--crisp-fg-muted); opacity: 0; transition: opacity .12s; }
584
590
  & .crisp-datatable-sort:hover .crisp-datatable-chevron { opacity: 0.6; }
585
591
  & .crisp-datatable-sort[data-sorted] .crisp-datatable-chevron { opacity: 1; color: var(--crisp-fg-primary); }
@@ -603,25 +609,23 @@
603
609
  & .crisp-datatable-editable:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-surface)); cursor: text; }
604
610
  & .crisp-datatable-edit { width: 100%; height: 28px; margin: 0; padding: 0 var(--crisp-space-1-5); border: none; border-radius: var(--crisp-radius-sm); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); outline: none; vertical-align: middle; }
605
611
  & .crisp-datatable-edit:focus { box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); }
606
- /* An async onEdit's in-flight state (#385) -- the field/picker dims and
607
- stops accepting input rather than disappearing, so the just-typed or
608
- just-chosen value stays visible while its commit is pending. Same
609
- treatment Input already gives its own disabled state. */
612
+ /* An async onEdit's in-flight state (#385) -- the field/picker dims and stops accepting input rather than disappearing, so the just-typed or just-chosen value stays visible while its commit is pending. Same treatment Input already gives its own disabled state. */
610
613
  & .crisp-datatable-edit:disabled { opacity: 0.5; cursor: not-allowed; }
611
614
  & .crisp-datatable-edit-pending { flex-shrink: 0; margin-inline-start: var(--crisp-space-1); color: var(--crisp-fg-muted); vertical-align: middle; }
612
- /* The rejection's message, beside the cell's own content -- a sibling in
613
- the TableCell, never nested inside a column's own render output, so a hover-only wrapper (a Tooltip, say) around a custom render can't hide
614
- it. Block-level: the row grows to fit it rather than floating over
615
- the row below, so it can never end up clipped by the scroll
616
- container's overflow the way a position:fixed escape would need guarding against. */
615
+ /* The rejection's message, beside the cell's own content -- a sibling in the TableCell, never nested inside a column's own render output, so a
616
+ hover-only wrapper (a Tooltip, say) around a custom render can't hide it. Block-level: the row grows to fit it rather than floating over the row below, so it can never end up clipped by the scroll container's overflow the way a position:fixed escape would need
617
+ guarding against. */
617
618
  & .crisp-datatable-edit-error { display: block; padding: var(--crisp-space-0-5) 0 0; font-size: var(--crisp-text-sm); color: var(--crisp-bg-danger); }
618
- /* editor: "select"/"switch" -- always live, no separate edit mode, so the cell IS the picker: same chromeless-fill treatment as RecordsTable's own --picker cells (measured there already; DataTable
619
- shares RecordsTable's grid, Golden Rule 0). */
619
+ /* editor: "select"/"switch" -- always live, no separate edit mode, so
620
+ the cell IS the picker: same chromeless-fill treatment as
621
+ RecordsTable's own --picker cells (measured there already; DataTable shares RecordsTable's grid, Golden Rule 0). */
620
622
  & .crisp-datatable-td--picker { padding: 0; }
621
623
  & .crisp-datatable-edit-picker { display: flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-2); }
622
624
  & .crisp-datatable-edit-picker .crisp-select-trigger { flex: 1; min-width: 0; height: 100%; min-height: 0; border-radius: 0; box-shadow: none; padding: 0; }
623
625
  & .crisp-datatable-td--picker .crisp-datatable-edit-error { padding-inline-start: var(--crisp-space-2); }
624
- /* reference picker: a leading 16px avatar per option, plus a trailing "Create X" row when the consumer supplies one (#449) -- same measured values as RecordsTable's own .crisp-recordstable-refoption*. */
626
+ /* reference picker: a leading 16px avatar per option, plus a trailing
627
+ "Create X" row when the consumer supplies one (#449) -- same measured
628
+ values as RecordsTable's own .crisp-recordstable-refoption*. */
625
629
  & .crisp-datatable-refoption { display: flex; align-items: center; gap: var(--crisp-space-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; }
626
630
  & .crisp-datatable-refoption-avatar { flex-shrink: 0; }
627
631
  & .crisp-datatable-refoption--create { color: var(--crisp-fg-muted); }
@@ -636,7 +640,12 @@
636
640
  & .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); }
637
641
  & .crisp-datatable-entity-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
638
642
  & .crisp-datatable-avatar { width: var(--crisp-size-icon); height: var(--crisp-size-icon); border-radius: var(--crisp-radius-sm); flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; line-height: 1; font-weight: var(--crisp-weight-semibold); text-transform: uppercase; color: var(--crisp-fg-on-brand); background: var(--crisp-bg-brand-solid); }
639
- & .crisp-datatable-avatar[data-tone="success"] { background: var(--crisp-bg-success); } & .crisp-datatable-avatar[data-tone="warning"] { background: var(--crisp-bg-warning); } & .crisp-datatable-avatar[data-tone="danger"] { background: var(--crisp-bg-danger); } & .crisp-datatable-avatar[data-tone="purple"] { background: var(--crisp-bg-purple); } & .crisp-datatable-avatar[data-tone="cyan"] { background: var(--crisp-bg-cyan); } & .crisp-datatable-avatar[data-tone="orange"] { background: var(--crisp-bg-orange); }
643
+ & .crisp-datatable-avatar[data-tone="success"] { background: var(--crisp-bg-success); }
644
+ & .crisp-datatable-avatar[data-tone="warning"] { background: var(--crisp-bg-warning); }
645
+ & .crisp-datatable-avatar[data-tone="danger"] { background: var(--crisp-bg-danger); }
646
+ & .crisp-datatable-avatar[data-tone="purple"] { background: var(--crisp-bg-purple); }
647
+ & .crisp-datatable-avatar[data-tone="cyan"] { background: var(--crisp-bg-cyan); }
648
+ & .crisp-datatable-avatar[data-tone="orange"] { background: var(--crisp-bg-orange); }
640
649
  & .crisp-datatable-avatar img { width: 100%; height: 100%; border-radius: inherit; object-fit: cover; }
641
650
  & .crisp-datatable-tags { display: flex; align-items: center; gap: var(--crisp-space-1); overflow: hidden; }
642
651
  & .crisp-datatable-tag { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap; background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: color-mix(in srgb, var(--crisp-fg-primary) 82%, transparent); }
@@ -649,10 +658,11 @@
649
658
  & .crisp-datatable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); }
650
659
  & .crisp-datatable-num { font-variant-numeric: tabular-nums; }
651
660
  & .crisp-datatable-muted { color: var(--crisp-fg-muted); }
652
- /* row drag-to-reorder -- a Settings > Objects > Attributes screen measures
653
- a leading 20px grip column, a 16px grip icon, and the row's own hairline doubling as the drop indicator (it tints toward the brand colour as the active drop target). The affordance + geometry are measured; the drag MECHANISM is crisp's existing house idiom -- HTML5
654
- draggable + dataTransfer, the same one column reorder already uses
655
- (RecordsTable's reorderColumn) -- not a proprietary pointer-events implementation. */
661
+ /* row drag-to-reorder -- a Settings > Objects > Attributes screen measures a leading 20px grip column, a 16px grip icon, and the row's own
662
+ hairline doubling as the drop indicator (it tints toward the brand
663
+ colour as the active drop target). The affordance + geometry are
664
+ measured; the drag MECHANISM is crisp's existing house idiom -- HTML5 draggable + dataTransfer, the same one column reorder already uses (RecordsTable's reorderColumn) -- not a proprietary
665
+ pointer-events implementation. */
656
666
  & .crisp-datatable-col-grip { width: 20px; padding: 0; text-align: center; }
657
667
  & .crisp-datatable-grip { display: inline-flex; align-items: center; justify-content: center; width: 100%; height: 100%; margin: 0; border: none; border-radius: 0; background: none; font-family: inherit; color: var(--crisp-fg-muted); cursor: grab; }
658
668
  & .crisp-datatable-grip:active { cursor: grabbing; }
@@ -1017,7 +1027,7 @@
1017
1027
  }
1018
1028
 
1019
1029
  .crisp-input {
1020
- position: relative; box-sizing: border-box; display: inline-flex; align-items: center; width: 100%; 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: var(--crisp-font-sans); font-size: var(--crisp-text-lg); line-height: 20px;
1030
+ position: relative; box-sizing: border-box; display: inline-flex; align-items: center; width: 100%; background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-field); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); line-height: 20px;
1021
1031
  &::after { content: ""; position: absolute; inset: 0; border-radius: inherit; border: 2px solid transparent; transition: border-color .1s ease; pointer-events: none; }
1022
1032
  &:focus-within::after { border-color: var(--crisp-stroke-field-focus); }
1023
1033
  & .crisp-input-value { box-sizing: border-box; flex: 1 1 auto; min-width: 0; width: 100%; align-self: stretch; margin: 0; border: none; background: none; outline: none; font: inherit; color: var(--crisp-fg-primary); }
@@ -1136,7 +1146,7 @@
1136
1146
  }
1137
1147
  .crisp-multiselect-listbox[data-up] { transform-origin: bottom left; }
1138
1148
  .crisp-multiselect-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
1139
- .crisp-multiselect-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
1149
+ .crisp-multiselect-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: 36px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: var(--crisp-space-2) var(--crisp-space-3); color: var(--crisp-fg-muted); }
1140
1150
  .crisp-multiselect-search svg { flex-shrink: 0; }
1141
1151
  .crisp-multiselect-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
1142
1152
  .crisp-multiselect-search input::placeholder { color: var(--crisp-fg-muted); }
@@ -1547,7 +1557,7 @@
1547
1557
 
1548
1558
  .crisp-switch {
1549
1559
  display: inline-flex; align-items: center; flex-shrink: 0; width: 24px; height: 16px; padding: 0; margin: 0; border: none; border-radius: var(--crisp-radius-full); background: color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); cursor: pointer; transition: background-color .2s ease; -webkit-tap-highlight-color: transparent;
1550
- & .crisp-switch-thumb { width: 12px; height: 12px; margin: 0 2px; border-radius: var(--crisp-radius-full); background: #fff; transition: transform .2s ease; }
1560
+ & .crisp-switch-thumb { width: 12px; height: 12px; margin: 0 2px; border-radius: var(--crisp-radius-full); background: #fff; box-shadow: 0 0 0 1px var(--crisp-ring-switch); transition: transform .2s ease; }
1551
1561
  &[data-checked] { background: var(--crisp-bg-brand-solid); }
1552
1562
  &[data-checked] .crisp-switch-thumb { transform: translateX(8px); }
1553
1563
  &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 2px; }
@@ -1566,7 +1576,9 @@
1566
1576
  display: block; box-sizing: border-box; background: var(--crisp-bg-surface);
1567
1577
  & .crisp-table-scroll { overflow-x: auto; }
1568
1578
  & table { width: 100%; border-collapse: separate; border-spacing: 0; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
1569
- & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-2); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1579
+ /* #465: 12px, not crisp's old 8px -- measured on a live header cell
1580
+ (padding: 0 12px) and independently on a body cell's text inset (getBoundingClientRect delta from the cell edge). Matches ColumnCalc's own already-correct 12px trigger inset. */
1581
+ & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1570
1582
  & th { height: var(--crisp-size-tableHeader); background: var(--crisp-bg-surface); border-top: 1px solid var(--crisp-border-subtle); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); user-select: none; }
1571
1583
  & td { color: var(--crisp-fg-primary); background: var(--crisp-bg-surface); }
1572
1584
  & th:last-child, & td:last-child { border-inline-end: none; }
@@ -1603,7 +1615,7 @@
1603
1615
  .crisp-tabletoolbar {
1604
1616
  display: contents; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
1605
1617
  & * { box-sizing: border-box; }
1606
- & .crisp-tabletoolbar-toolbar { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
1618
+ & .crisp-tabletoolbar-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
1607
1619
  & .crisp-tabletoolbar-toolbar[data-inline] { padding-bottom: 0; }
1608
1620
  & .crisp-tabletoolbar-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-row); padding: 0 var(--crisp-space-2-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
1609
1621
  & .crisp-tabletoolbar-search svg { flex-shrink: 0; }
@@ -1616,10 +1628,11 @@
1616
1628
  & .crisp-tabletoolbar-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
1617
1629
  & .crisp-tabletoolbar-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
1618
1630
  & .crisp-tabletoolbar-toolgroup { position: relative; display: inline-flex; }
1619
- & .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-lg); 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; }
1631
+ & .crisp-tabletoolbar-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
1632
+ & .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; }
1620
1633
  & .crisp-tabletoolbar-menu { @starting-style { opacity: 0; transform: scale(0.96); } }
1621
1634
  & .crisp-tabletoolbar-menu-head { padding: var(--crisp-space-1) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
1622
- & .crisp-tabletoolbar-sortpop { min-width: 460px; overflow: visible; padding: var(--crisp-space-1-5); gap: var(--crisp-space-1); }
1635
+ & .crisp-tabletoolbar-sortpop { min-width: 480px; overflow: visible; padding: var(--crisp-space-3) var(--crisp-space-1-5); gap: var(--crisp-space-2); }
1623
1636
  & .crisp-tabletoolbar-sort-empty { padding: var(--crisp-space-1) var(--crisp-space-1) var(--crisp-space-2); font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
1624
1637
  & .crisp-tabletoolbar-sort-row { display: flex; align-items: center; gap: var(--crisp-space-1-5); }
1625
1638
  & .crisp-tabletoolbar-sort-grip { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 28px; flex-shrink: 0; margin-right: calc(-1 * var(--crisp-space-1)); padding: 0; border: none; background: none; color: var(--crisp-fg-muted); cursor: grab; }
@@ -1640,7 +1653,7 @@
1640
1653
  & .crisp-tabletoolbar-sort-learn { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-lg); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); text-decoration: none; }
1641
1654
  & .crisp-tabletoolbar-sort-learn svg { flex-shrink: 0; }
1642
1655
  & .crisp-tabletoolbar-sort-learn:hover { color: var(--crisp-fg-primary); }
1643
- & .crisp-tabletoolbar-menu-item { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
1656
+ & .crisp-tabletoolbar-menu-item { display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; height: var(--crisp-size-menuRow); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
1644
1657
  & .crisp-tabletoolbar-menu-item:hover { background: var(--crisp-bg-raised); }
1645
1658
  & .crisp-tabletoolbar-menu-item:disabled { opacity: 0.4; cursor: default; }
1646
1659
  & .crisp-tabletoolbar-menu-item:disabled:hover { background: none; }
@@ -1705,7 +1718,7 @@
1705
1718
 
1706
1719
  .crisp-textarea {
1707
1720
  position: relative; display: block; width: 100%; font-family: var(--crisp-font-sans);
1708
- & .crisp-textarea-field { box-sizing: border-box; display: block; width: 100%; min-height: 80px; resize: vertical; margin: 0; padding: var(--crisp-space-2-5) 14px; 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); line-height: 20px; color: var(--crisp-fg-primary); outline: none; transition: box-shadow .15s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
1721
+ & .crisp-textarea-field { box-sizing: border-box; display: block; width: 100%; min-height: 80px; resize: vertical; margin: 0; padding: var(--crisp-space-2-5) 14px; border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-field); font-family: inherit; font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary); outline: none; transition: box-shadow .15s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
1709
1722
  & .crisp-textarea-field::placeholder { color: var(--crisp-fg-muted); }
1710
1723
  & .crisp-textarea-field:disabled { opacity: 0.5; cursor: not-allowed; }
1711
1724
  /* seed-design's focus treatment, same as Input: a 2px ring on an ::after
@@ -1760,7 +1773,7 @@
1760
1773
  }
1761
1774
 
1762
1775
  .crisp-tooltip {
1763
- position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1) var(--crisp-space-2); border-radius: var(--crisp-radius-sm); background: #20242c; color: #fff; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
1776
+ position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1-5) var(--crisp-space-2); border-radius: var(--crisp-radius-md); background: #101112; color: #eeeff1; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
1764
1777
  @starting-style { opacity: 0; }
1765
1778
  }
1766
1779
 
@@ -1861,19 +1874,19 @@
1861
1874
  }
1862
1875
 
1863
1876
  .crisp-board {
1864
- display: flex; gap: var(--crisp-space-3); height: 100%; box-sizing: border-box; padding: var(--crisp-space-3); overflow-x: auto; align-items: flex-start; font-family: var(--crisp-font-sans);
1865
- & .crisp-board-col { display: flex; flex-direction: column; width: 280px; flex-shrink: 0; max-height: 100%; box-sizing: border-box; }
1877
+ display: flex; gap: var(--crisp-space-2); height: 100%; box-sizing: border-box; padding: var(--crisp-space-3); overflow-x: auto; align-items: flex-start; font-family: var(--crisp-font-sans);
1878
+ & .crisp-board-col { display: flex; flex-direction: column; width: 268px; flex-shrink: 0; max-height: 100%; box-sizing: border-box; }
1866
1879
  & .crisp-board-col-header { display: flex; align-items: center; gap: var(--crisp-space-2); height: 36px; padding: 0 var(--crisp-space-1); flex-shrink: 0; }
1867
- & .crisp-board-col-dot { width: 9px; height: 9px; border-radius: var(--crisp-radius-full); flex-shrink: 0; }
1880
+ & .crisp-board-col-dot { width: 12px; height: 12px; border-radius: var(--crisp-radius-full); flex-shrink: 0; }
1868
1881
  & .crisp-board-col-title { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-semibold); color: var(--crisp-fg-primary); }
1869
- & .crisp-board-col-count { font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
1870
- & .crisp-board-col-add { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; margin-inline-start: auto; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: var(--crisp-fg-muted); font-family: inherit; cursor: pointer; }
1882
+ & .crisp-board-col-count { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-sm); background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
1883
+ & .crisp-board-col-add { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; margin-inline-start: auto; padding: 0; border: none; border-radius: var(--crisp-radius-sm); background: none; color: var(--crisp-fg-muted); font-family: inherit; cursor: pointer; }
1871
1884
  & .crisp-board-col-add:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
1872
1885
  & .crisp-board-col-body { display: flex; flex-direction: column; gap: var(--crisp-space-2); flex: 1; min-height: 48px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-lg); overflow-y: auto; transition: background 0.12s; }
1873
1886
  & .crisp-board-col[data-over] .crisp-board-col-body { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 7%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-brand-solid) 30%, transparent); }
1874
1887
  & .crisp-board-newcard { display: flex; align-items: center; justify-content: center; gap: var(--crisp-space-1-5); height: 32px; flex-shrink: 0; border: none; border-radius: var(--crisp-radius-md); background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); color: var(--crisp-fg-muted); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); cursor: pointer; }
1875
1888
  & .crisp-board-newcard:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 7%, transparent); color: var(--crisp-fg-primary); }
1876
- & .crisp-board-card { display: flex; flex-direction: column; gap: var(--crisp-space-2); box-sizing: border-box; padding: var(--crisp-space-2-5) var(--crisp-space-3); border-radius: var(--crisp-radius-lg); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle), 0 1px 2px rgba(0,0,0,0.04); cursor: grab; }
1889
+ & .crisp-board-card { display: flex; flex-direction: column; gap: var(--crisp-space-2); box-sizing: border-box; padding: var(--crisp-space-2-5) var(--crisp-space-3); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); cursor: grab; }
1877
1890
  & .crisp-board-card:active { cursor: grabbing; }
1878
1891
  & .crisp-board-card[data-dragging] { opacity: 0.4; }
1879
1892
  & .crisp-board-card:focus { outline: none; }
@@ -1935,11 +1948,11 @@
1935
1948
  display: flex; flex-direction: column; box-sizing: border-box; width: 100%; min-width: 0; text-align: start; padding: var(--crisp-space-3) var(--crisp-space-4); margin: 0; border: none; border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); color: var(--crisp-fg-primary); font-family: var(--crisp-font-sans); cursor: pointer; transition: box-shadow .12s ease, background-color .12s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
1936
1949
  &:hover { box-shadow: inset 0 0 0 1px var(--crisp-border-default), 0 1px 2px rgba(0,0,0,0.04), 0 6px 16px -6px rgba(28,40,64,0.12); }
1937
1950
  &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 2px; }
1938
- & .crisp-entitycard-author { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
1939
- & .crisp-entitycard-title { margin-top: var(--crisp-space-2); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-semibold); letter-spacing: -0.1px; color: var(--crisp-fg-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1940
- & .crisp-entitycard-excerpt { margin-top: var(--crisp-space-1); font-size: var(--crisp-text-md); line-height: 18px; color: var(--crisp-fg-muted); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
1951
+ & .crisp-entitycard-author { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
1952
+ & .crisp-entitycard-title { margin-top: var(--crisp-space-2); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.1px; color: var(--crisp-fg-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1953
+ & .crisp-entitycard-excerpt { margin-top: var(--crisp-space-1); font-size: var(--crisp-text-sm); line-height: 16px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
1941
1954
  & .crisp-entitycard-spacer { flex: 1; min-height: var(--crisp-space-3); }
1942
- & .crisp-entitycard-foot { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding-top: var(--crisp-space-2-5); margin-top: var(--crisp-space-1); border-top: 1px solid var(--crisp-border-subtle); font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); }
1955
+ & .crisp-entitycard-foot { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding-top: var(--crisp-space-2-5); margin-top: var(--crisp-space-1); border-top: 1px solid var(--crisp-border-subtle); font-size: var(--crisp-text-sm); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
1943
1956
  & .crisp-entitycard-foot-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--crisp-fg-primary); }
1944
1957
  & .crisp-entitycard-date { margin-inline-start: auto; flex-shrink: 0; white-space: nowrap; }
1945
1958
  }
@@ -2004,18 +2017,18 @@
2004
2017
 
2005
2018
  .crisp-listpage {
2006
2019
  display: flex; flex-direction: column; min-height: 0; box-sizing: border-box; font-family: var(--crisp-font-sans); color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
2007
- & .crisp-listpage-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); height: 52px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
2020
+ & .crisp-listpage-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-header); flex-shrink: 0; padding: 0 var(--crisp-space-3); }
2008
2021
  & .crisp-listpage-toolbar-lead { display: flex; align-items: center; gap: var(--crisp-space-2); }
2009
2022
  & .crisp-listpage-count { margin-inline-start: auto; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); white-space: nowrap; }
2010
2023
  & .crisp-listpage-toolbar-trail { display: flex; align-items: center; gap: var(--crisp-space-2); }
2011
2024
  & .crisp-listpage-count + .crisp-listpage-toolbar-trail { margin-inline-start: var(--crisp-space-3); }
2012
2025
  & .crisp-listpage-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--crisp-space-3) var(--crisp-space-3); }
2013
2026
  & .crisp-listpage-section-label { padding: var(--crisp-space-2) var(--crisp-space-1); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
2014
- & .crisp-listpage-favorites { display: flex; align-items: center; justify-content: center; min-height: 200px; padding: var(--crisp-space-6); border-radius: var(--crisp-radius-xl); background: repeating-linear-gradient(0deg, transparent, transparent) padding-box, border-box; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 8%, transparent); }
2015
- & .crisp-listpage-favorites[data-dashed] { box-shadow: none; border: 1px dashed color-mix(in srgb, var(--crisp-fg-primary) 14%, transparent); }
2016
- & .crisp-listpage-colhead { display: flex; align-items: center; gap: var(--crisp-space-2-5); height: 40px; padding: 0 var(--crisp-space-2); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); }
2027
+ & .crisp-listpage-favorites-section { background: var(--crisp-bg-subtle); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); }
2028
+ & .crisp-listpage-favorites { display: flex; align-items: center; justify-content: center; min-height: 200px; padding: var(--crisp-space-6); }
2029
+ & .crisp-listpage-colhead { display: flex; align-items: center; gap: var(--crisp-space-2-5); height: var(--crisp-size-menuRow); padding: 0 var(--crisp-space-4); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); }
2017
2030
  & .crisp-listpage-colhead-cell { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); }
2018
- & .crisp-listpage-group { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: 36px; padding: 0 var(--crisp-space-2); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
2031
+ & .crisp-listpage-group { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-menuRow); padding: var(--crisp-space-2) var(--crisp-space-4); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); background: color-mix(in srgb, var(--crisp-fg-primary) 2%, transparent); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
2019
2032
  & .crisp-listpage-group-count { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-sm); background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); font-size: var(--crisp-text-xs); color: var(--crisp-fg-muted); }
2020
2033
  & .crisp-listpage-row { display: flex; align-items: center; gap: var(--crisp-space-2-5); width: 100%; height: 52px; padding: 0 var(--crisp-space-2); margin: 0; border: none; border-top: 1px solid var(--crisp-border-subtle); background: none; font-family: inherit; color: inherit; text-align: start; cursor: pointer; transition: background-color .12s; }
2021
2034
  & .crisp-listpage-row:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: -2px; }
@@ -2343,7 +2356,7 @@
2343
2356
  box-sizing: border-box; position: relative; display: flex; flex-direction: column; min-height: 0; height: 100%; width: 100%; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
2344
2357
  & * { box-sizing: border-box; }
2345
2358
  /* toolbar */
2346
- & .crisp-recordstable-toolbar { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
2359
+ & .crisp-recordstable-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
2347
2360
  & .crisp-recordstable-toolbar[data-inline] { padding-bottom: 0; }
2348
2361
  & .crisp-recordstable-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-row); padding: 0 var(--crisp-space-2-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
2349
2362
  & .crisp-recordstable-search svg { flex-shrink: 0; }
@@ -2356,13 +2369,14 @@
2356
2369
  & .crisp-recordstable-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
2357
2370
  & .crisp-recordstable-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
2358
2371
  & .crisp-recordstable-toolgroup { position: relative; display: inline-flex; }
2359
- & .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-lg); 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; }
2372
+ & .crisp-recordstable-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
2373
+ & .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; }
2360
2374
  & .crisp-recordstable-menu { @starting-style { opacity: 0; transform: scale(0.96); } }
2361
2375
  & .crisp-recordstable-ctx { z-index: 60; }
2362
2376
  & .crisp-recordstable-th[data-drop] { box-shadow: inset 2px 0 0 var(--crisp-bg-brand-solid); }
2363
2377
  & .crisp-recordstable-th-inner[draggable="true"]:active { cursor: grabbing; }
2364
2378
  & .crisp-recordstable-menu-head { padding: var(--crisp-space-1) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
2365
- & .crisp-recordstable-sortpop { min-width: 460px; overflow: visible; padding: var(--crisp-space-1-5); gap: var(--crisp-space-1); }
2379
+ & .crisp-recordstable-sortpop { min-width: 480px; overflow: visible; padding: var(--crisp-space-3) var(--crisp-space-1-5); gap: var(--crisp-space-2); }
2366
2380
  & .crisp-recordstable-sort-empty { padding: var(--crisp-space-1) var(--crisp-space-1) var(--crisp-space-2); font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
2367
2381
  & .crisp-recordstable-sort-row { display: flex; align-items: center; gap: var(--crisp-space-1-5); }
2368
2382
  & .crisp-recordstable-sort-grip { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 28px; flex-shrink: 0; margin-right: calc(-1 * var(--crisp-space-1)); padding: 0; border: none; background: none; color: var(--crisp-fg-muted); cursor: grab; }
@@ -2383,7 +2397,7 @@
2383
2397
  & .crisp-recordstable-sort-learn { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-lg); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); text-decoration: none; }
2384
2398
  & .crisp-recordstable-sort-learn svg { flex-shrink: 0; }
2385
2399
  & .crisp-recordstable-sort-learn:hover { color: var(--crisp-fg-primary); }
2386
- & .crisp-recordstable-menu-item { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
2400
+ & .crisp-recordstable-menu-item { display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; height: var(--crisp-size-menuRow); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
2387
2401
  & .crisp-recordstable-menu-item:hover { background: var(--crisp-bg-raised); }
2388
2402
  & .crisp-recordstable-menu-item:disabled { opacity: 0.4; cursor: default; }
2389
2403
  & .crisp-recordstable-menu-item:disabled:hover { background: none; }
package/dist/switch.css CHANGED
@@ -1,6 +1,6 @@
1
1
  .crisp-switch {
2
2
  display: inline-flex; align-items: center; flex-shrink: 0; width: 24px; height: 16px; padding: 0; margin: 0; border: none; border-radius: var(--crisp-radius-full); background: color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); cursor: pointer; transition: background-color .2s ease; -webkit-tap-highlight-color: transparent;
3
- & .crisp-switch-thumb { width: 12px; height: 12px; margin: 0 2px; border-radius: var(--crisp-radius-full); background: #fff; transition: transform .2s ease; }
3
+ & .crisp-switch-thumb { width: 12px; height: 12px; margin: 0 2px; border-radius: var(--crisp-radius-full); background: #fff; box-shadow: 0 0 0 1px var(--crisp-ring-switch); transition: transform .2s ease; }
4
4
  &[data-checked] { background: var(--crisp-bg-brand-solid); }
5
5
  &[data-checked] .crisp-switch-thumb { transform: translateX(8px); }
6
6
  &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 2px; }
@@ -1,7 +1,7 @@
1
1
  @layer crisp-components {
2
2
  .crisp-switch {
3
3
  display: inline-flex; align-items: center; flex-shrink: 0; width: 24px; height: 16px; padding: 0; margin: 0; border: none; border-radius: var(--crisp-radius-full); background: color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); cursor: pointer; transition: background-color .2s ease; -webkit-tap-highlight-color: transparent;
4
- & .crisp-switch-thumb { width: 12px; height: 12px; margin: 0 2px; border-radius: var(--crisp-radius-full); background: #fff; transition: transform .2s ease; }
4
+ & .crisp-switch-thumb { width: 12px; height: 12px; margin: 0 2px; border-radius: var(--crisp-radius-full); background: #fff; box-shadow: 0 0 0 1px var(--crisp-ring-switch); transition: transform .2s ease; }
5
5
  &[data-checked] { background: var(--crisp-bg-brand-solid); }
6
6
  &[data-checked] .crisp-switch-thumb { transform: translateX(8px); }
7
7
  &:focus-visible { outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: 2px; }
package/dist/table.css CHANGED
@@ -2,7 +2,9 @@
2
2
  display: block; box-sizing: border-box; background: var(--crisp-bg-surface);
3
3
  & .crisp-table-scroll { overflow-x: auto; }
4
4
  & table { width: 100%; border-collapse: separate; border-spacing: 0; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
5
- & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-2); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
5
+ /* #465: 12px, not crisp's old 8px -- measured on a live header cell
6
+ (padding: 0 12px) and independently on a body cell's text inset (getBoundingClientRect delta from the cell edge). Matches ColumnCalc's own already-correct 12px trigger inset. */
7
+ & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
6
8
  & th { height: var(--crisp-size-tableHeader); background: var(--crisp-bg-surface); border-top: 1px solid var(--crisp-border-subtle); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); user-select: none; }
7
9
  & td { color: var(--crisp-fg-primary); background: var(--crisp-bg-surface); }
8
10
  & th:last-child, & td:last-child { border-inline-end: none; }
@@ -3,7 +3,9 @@
3
3
  display: block; box-sizing: border-box; background: var(--crisp-bg-surface);
4
4
  & .crisp-table-scroll { overflow-x: auto; }
5
5
  & table { width: 100%; border-collapse: separate; border-spacing: 0; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
6
- & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-2); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
6
+ /* #465: 12px, not crisp's old 8px -- measured on a live header cell
7
+ (padding: 0 12px) and independently on a body cell's text inset (getBoundingClientRect delta from the cell edge). Matches ColumnCalc's own already-correct 12px trigger inset. */
8
+ & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
7
9
  & th { height: var(--crisp-size-tableHeader); background: var(--crisp-bg-surface); border-top: 1px solid var(--crisp-border-subtle); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.14px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); user-select: none; }
8
10
  & td { color: var(--crisp-fg-primary); background: var(--crisp-bg-surface); }
9
11
  & th:last-child, & td:last-child { border-inline-end: none; }
@@ -1,7 +1,7 @@
1
1
  .crisp-tabletoolbar {
2
2
  display: contents; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
3
3
  & * { box-sizing: border-box; }
4
- & .crisp-tabletoolbar-toolbar { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
4
+ & .crisp-tabletoolbar-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
5
5
  & .crisp-tabletoolbar-toolbar[data-inline] { padding-bottom: 0; }
6
6
  & .crisp-tabletoolbar-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-row); padding: 0 var(--crisp-space-2-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
7
7
  & .crisp-tabletoolbar-search svg { flex-shrink: 0; }
@@ -14,10 +14,11 @@
14
14
  & .crisp-tabletoolbar-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
15
15
  & .crisp-tabletoolbar-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
16
16
  & .crisp-tabletoolbar-toolgroup { position: relative; display: inline-flex; }
17
- & .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-lg); 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; }
17
+ & .crisp-tabletoolbar-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
18
+ & .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; }
18
19
  & .crisp-tabletoolbar-menu { @starting-style { opacity: 0; transform: scale(0.96); } }
19
20
  & .crisp-tabletoolbar-menu-head { padding: var(--crisp-space-1) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
20
- & .crisp-tabletoolbar-sortpop { min-width: 460px; overflow: visible; padding: var(--crisp-space-1-5); gap: var(--crisp-space-1); }
21
+ & .crisp-tabletoolbar-sortpop { min-width: 480px; overflow: visible; padding: var(--crisp-space-3) var(--crisp-space-1-5); gap: var(--crisp-space-2); }
21
22
  & .crisp-tabletoolbar-sort-empty { padding: var(--crisp-space-1) var(--crisp-space-1) var(--crisp-space-2); font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
22
23
  & .crisp-tabletoolbar-sort-row { display: flex; align-items: center; gap: var(--crisp-space-1-5); }
23
24
  & .crisp-tabletoolbar-sort-grip { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 28px; flex-shrink: 0; margin-right: calc(-1 * var(--crisp-space-1)); padding: 0; border: none; background: none; color: var(--crisp-fg-muted); cursor: grab; }
@@ -38,7 +39,7 @@
38
39
  & .crisp-tabletoolbar-sort-learn { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-lg); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); text-decoration: none; }
39
40
  & .crisp-tabletoolbar-sort-learn svg { flex-shrink: 0; }
40
41
  & .crisp-tabletoolbar-sort-learn:hover { color: var(--crisp-fg-primary); }
41
- & .crisp-tabletoolbar-menu-item { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
42
+ & .crisp-tabletoolbar-menu-item { display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; height: var(--crisp-size-menuRow); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
42
43
  & .crisp-tabletoolbar-menu-item:hover { background: var(--crisp-bg-raised); }
43
44
  & .crisp-tabletoolbar-menu-item:disabled { opacity: 0.4; cursor: default; }
44
45
  & .crisp-tabletoolbar-menu-item:disabled:hover { background: none; }
@@ -2,7 +2,7 @@
2
2
  .crisp-tabletoolbar {
3
3
  display: contents; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
4
4
  & * { box-sizing: border-box; }
5
- & .crisp-tabletoolbar-toolbar { display: flex; align-items: center; gap: var(--crisp-space-1-5); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
5
+ & .crisp-tabletoolbar-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
6
6
  & .crisp-tabletoolbar-toolbar[data-inline] { padding-bottom: 0; }
7
7
  & .crisp-tabletoolbar-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-row); padding: 0 var(--crisp-space-2-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
8
8
  & .crisp-tabletoolbar-search svg { flex-shrink: 0; }
@@ -15,10 +15,11 @@
15
15
  & .crisp-tabletoolbar-tool--ghost { box-shadow: none; background: color-mix(in srgb, var(--crisp-fg-primary) 3%, transparent); color: var(--crisp-fg-muted); }
16
16
  & .crisp-tabletoolbar-tool--ghost:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
17
17
  & .crisp-tabletoolbar-toolgroup { position: relative; display: inline-flex; }
18
- & .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-lg); 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; }
18
+ & .crisp-tabletoolbar-divider { flex-shrink: 0; width: 1px; height: 20px; background: var(--crisp-border-subtle); }
19
+ & .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; }
19
20
  & .crisp-tabletoolbar-menu { @starting-style { opacity: 0; transform: scale(0.96); } }
20
21
  & .crisp-tabletoolbar-menu-head { padding: var(--crisp-space-1) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
21
- & .crisp-tabletoolbar-sortpop { min-width: 460px; overflow: visible; padding: var(--crisp-space-1-5); gap: var(--crisp-space-1); }
22
+ & .crisp-tabletoolbar-sortpop { min-width: 480px; overflow: visible; padding: var(--crisp-space-3) var(--crisp-space-1-5); gap: var(--crisp-space-2); }
22
23
  & .crisp-tabletoolbar-sort-empty { padding: var(--crisp-space-1) var(--crisp-space-1) var(--crisp-space-2); font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
23
24
  & .crisp-tabletoolbar-sort-row { display: flex; align-items: center; gap: var(--crisp-space-1-5); }
24
25
  & .crisp-tabletoolbar-sort-grip { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 28px; flex-shrink: 0; margin-right: calc(-1 * var(--crisp-space-1)); padding: 0; border: none; background: none; color: var(--crisp-fg-muted); cursor: grab; }
@@ -39,7 +40,7 @@
39
40
  & .crisp-tabletoolbar-sort-learn { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-lg); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); text-decoration: none; }
40
41
  & .crisp-tabletoolbar-sort-learn svg { flex-shrink: 0; }
41
42
  & .crisp-tabletoolbar-sort-learn:hover { color: var(--crisp-fg-primary); }
42
- & .crisp-tabletoolbar-menu-item { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
43
+ & .crisp-tabletoolbar-menu-item { display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; height: var(--crisp-size-menuRow); margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
43
44
  & .crisp-tabletoolbar-menu-item:hover { background: var(--crisp-bg-raised); }
44
45
  & .crisp-tabletoolbar-menu-item:disabled { opacity: 0.4; cursor: default; }
45
46
  & .crisp-tabletoolbar-menu-item:disabled:hover { background: none; }
package/dist/textarea.css CHANGED
@@ -1,6 +1,6 @@
1
1
  .crisp-textarea {
2
2
  position: relative; display: block; width: 100%; font-family: var(--crisp-font-sans);
3
- & .crisp-textarea-field { box-sizing: border-box; display: block; width: 100%; min-height: 80px; resize: vertical; margin: 0; padding: var(--crisp-space-2-5) 14px; 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); line-height: 20px; color: var(--crisp-fg-primary); outline: none; transition: box-shadow .15s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
3
+ & .crisp-textarea-field { box-sizing: border-box; display: block; width: 100%; min-height: 80px; resize: vertical; margin: 0; padding: var(--crisp-space-2-5) 14px; border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-field); font-family: inherit; font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary); outline: none; transition: box-shadow .15s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
4
4
  & .crisp-textarea-field::placeholder { color: var(--crisp-fg-muted); }
5
5
  & .crisp-textarea-field:disabled { opacity: 0.5; cursor: not-allowed; }
6
6
  /* seed-design's focus treatment, same as Input: a 2px ring on an ::after
@@ -1,7 +1,7 @@
1
1
  @layer crisp-components {
2
2
  .crisp-textarea {
3
3
  position: relative; display: block; width: 100%; font-family: var(--crisp-font-sans);
4
- & .crisp-textarea-field { box-sizing: border-box; display: block; width: 100%; min-height: 80px; resize: vertical; margin: 0; padding: var(--crisp-space-2-5) 14px; 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); line-height: 20px; color: var(--crisp-fg-primary); outline: none; transition: box-shadow .15s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
4
+ & .crisp-textarea-field { box-sizing: border-box; display: block; width: 100%; min-height: 80px; resize: vertical; margin: 0; padding: var(--crisp-space-2-5) 14px; border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-field); font-family: inherit; font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary); outline: none; transition: box-shadow .15s ease; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
5
5
  & .crisp-textarea-field::placeholder { color: var(--crisp-fg-muted); }
6
6
  & .crisp-textarea-field:disabled { opacity: 0.5; cursor: not-allowed; }
7
7
  /* seed-design's focus treatment, same as Input: a 2px ring on an ::after
package/dist/tokens.css CHANGED
@@ -8,6 +8,8 @@
8
8
  --crisp-border-default: #e4e4e7;
9
9
  --crisp-border-subtle: #eeeff1;
10
10
  --crisp-ring-neutral: transparent;
11
+ --crisp-ring-field: rgba(0,0,0,0.06);
12
+ --crisp-ring-switch: #d9dade;
11
13
  --crisp-bg-tile-active: #ffffff;
12
14
  --crisp-shadow-tile-active: rgba(0,0,0,0.04);
13
15
  --crisp-bg-overlay-frost: #ffffff;
@@ -55,6 +57,8 @@
55
57
  --crisp-border-default: #212224;
56
58
  --crisp-border-subtle: #1c1d1f;
57
59
  --crisp-ring-neutral: #212224;
60
+ --crisp-ring-field: #212224;
61
+ --crisp-ring-switch: #212224;
58
62
  --crisp-bg-tile-active: #101112;
59
63
  --crisp-shadow-tile-active: rgba(0,0,0,0);
60
64
  --crisp-bg-overlay-frost: #1c1d1f;
package/dist/tokens.json CHANGED
@@ -10,6 +10,8 @@
10
10
  "borderDefault": "#e4e4e7",
11
11
  "borderSubtle": "#eeeff1",
12
12
  "ringNeutral": "transparent",
13
+ "ringField": "rgba(0,0,0,0.06)",
14
+ "ringSwitch": "#d9dade",
13
15
  "bgTileActive": "#ffffff",
14
16
  "shadowTileActive": "rgba(0,0,0,0.04)",
15
17
  "bgOverlayFrost": "#ffffff",
@@ -56,6 +58,8 @@
56
58
  "borderDefault": "#212224",
57
59
  "borderSubtle": "#1c1d1f",
58
60
  "ringNeutral": "#212224",
61
+ "ringField": "#212224",
62
+ "ringSwitch": "#212224",
59
63
  "bgTileActive": "#101112",
60
64
  "shadowTileActive": "rgba(0,0,0,0)",
61
65
  "bgOverlayFrost": "#1c1d1f",
@@ -103,6 +107,8 @@
103
107
  "line200": "#e4e4e7",
104
108
  "line100": "#eeeff1",
105
109
  "ringNeutral": "transparent",
110
+ "ringField": "rgba(0,0,0,0.06)",
111
+ "ringSwitch": "#d9dade",
106
112
  "tileActive": "#ffffff",
107
113
  "tileActiveShadow": "rgba(0,0,0,0.04)",
108
114
  "overlayFrost": "#ffffff",
@@ -148,6 +154,8 @@
148
154
  "line200": "#212224",
149
155
  "line100": "#1c1d1f",
150
156
  "ringNeutral": "#212224",
157
+ "ringField": "#212224",
158
+ "ringSwitch": "#212224",
151
159
  "tileActive": "#101112",
152
160
  "tileActiveShadow": "rgba(0,0,0,0)",
153
161
  "overlayFrost": "#1c1d1f",
package/dist/tooltip.css CHANGED
@@ -1,5 +1,5 @@
1
1
  .crisp-tooltip {
2
- position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1) var(--crisp-space-2); border-radius: var(--crisp-radius-sm); background: #20242c; color: #fff; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
2
+ position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1-5) var(--crisp-space-2); border-radius: var(--crisp-radius-md); background: #101112; color: #eeeff1; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
3
3
  @starting-style { opacity: 0; }
4
4
  }
5
5
 
@@ -1,6 +1,6 @@
1
1
  @layer crisp-components {
2
2
  .crisp-tooltip {
3
- position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1) var(--crisp-space-2); border-radius: var(--crisp-radius-sm); background: #20242c; color: #fff; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
3
+ position: fixed; z-index: 70; box-sizing: border-box; pointer-events: none; max-width: 260px; padding: var(--crisp-space-1-5) var(--crisp-space-2); border-radius: var(--crisp-radius-md); background: #101112; color: #eeeff1; font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); line-height: 1.45; box-shadow: 0 4px 14px -2px rgba(28,40,64,0.28), 0 0 0 1px rgba(255,255,255,0.04); opacity: 1; transition: opacity 0.12s ease;
4
4
  @starting-style { opacity: 0; }
5
5
  }
6
6
 
@@ -1,14 +1,14 @@
1
1
  import * as React from "react";
2
2
  export type BulkBarProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
3
- /** Selected count — renders the leading "N selected" pill when provided. */
3
+ /** Selected count — renders the leading "N Selected" pill when provided. */
4
4
  count?: number;
5
5
  /** Called when the count pill (its ✕) is pressed — clear the selection. */
6
6
  onClear?: () => void;
7
- /** Word after the count in the pill (default "selected"). */
7
+ /** Word after the count in the pill (default "Selected"). */
8
8
  countLabel?: string;
9
9
  /**
10
10
  * The whole pill line, given the count and `countLabel`. A formatter,
11
- * because "3 selected" is a sentence with a hole in it and the count does
11
+ * because "3 Selected" is a sentence with a hole in it and the count does
12
12
  * not sit in the same place in every language. Defaults to
13
13
  * `{count} {countLabel}`, so a consumer who only wants the word keeps
14
14
  * passing `countLabel`.