@crisp-ui-kit/crisp 0.54.7 → 0.54.9

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 (130) hide show
  1. package/dist/authshell.css +5 -1
  2. package/dist/authshell.layered.css +5 -1
  3. package/dist/badge.css +5 -5
  4. package/dist/badge.layered.css +5 -5
  5. package/dist/board.css +36 -8
  6. package/dist/board.layered.css +36 -8
  7. package/dist/button.css +3 -1
  8. package/dist/button.layered.css +3 -1
  9. package/dist/cjs/components/badge/badge.recipe.js +28 -5
  10. package/dist/cjs/components/button/button.js +33 -2
  11. package/dist/cjs/components/button/button.recipe.js +31 -5
  12. package/dist/cjs/components/contextmenu/contextmenu.js +2 -2
  13. package/dist/cjs/components/contextmenu/contextmenu.recipe.js +24 -0
  14. package/dist/cjs/components/datatable/datatable.js +590 -41
  15. package/dist/cjs/components/datatable/datatable.recipe.js +118 -5
  16. package/dist/cjs/components/dialog/dialog.js +72 -5
  17. package/dist/cjs/components/dialog/dialog.recipe.js +15 -1
  18. package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +49 -5
  19. package/dist/cjs/components/tabletoolbar/tabletoolbar.js +365 -49
  20. package/dist/cjs/components/tabletoolbar/tabletoolbar.recipe.js +78 -0
  21. package/dist/cjs/components/tabs/tabs.recipe.js +11 -2
  22. package/dist/cjs/components/tooltip/tooltip.js +23 -9
  23. package/dist/cjs/components/tooltip/tooltip.recipe.js +10 -9
  24. package/dist/cjs/product/authshell/authshell.js +14 -1
  25. package/dist/cjs/product/authshell/authshell.recipe.js +13 -1
  26. package/dist/cjs/product/board/board.js +175 -46
  27. package/dist/cjs/product/board/board.recipe.js +56 -4
  28. package/dist/cjs/product/comments/comments.js +34 -12
  29. package/dist/cjs/product/comments/comments.recipe.js +31 -7
  30. package/dist/cjs/product/formdialog/formdialog.js +10 -4
  31. package/dist/cjs/product/navitem/navitem.js +7 -2
  32. package/dist/cjs/product/navitem/navitem.recipe.js +16 -0
  33. package/dist/cjs/product/objectsettings/index.js +1 -2
  34. package/dist/cjs/product/objectsettings/objectsettings.js +3 -13
  35. package/dist/cjs/product/recordstable/recordstable.js +1 -17
  36. package/dist/cjs/product/richtext/richtext.js +76 -1
  37. package/dist/cjs/product/savedviews/savedviews.js +55 -24
  38. package/dist/cjs/product/savedviews/savedviews.recipe.js +27 -0
  39. package/dist/cjs/product/sidebar/sidebar.js +68 -15
  40. package/dist/cjs/product/sidebar/sidebar.recipe.js +6 -1
  41. package/dist/cjs/tokens/palette.js +32 -1
  42. package/dist/cjs/tokens/semantic.js +11 -0
  43. package/dist/comments.css +50 -14
  44. package/dist/comments.layered.css +50 -14
  45. package/dist/contextmenu.css +24 -0
  46. package/dist/contextmenu.layered.css +24 -0
  47. package/dist/datatable.css +101 -37
  48. package/dist/datatable.layered.css +101 -37
  49. package/dist/dialog.css +13 -1
  50. package/dist/dialog.layered.css +13 -1
  51. package/dist/esm/components/badge/badge.recipe.js +28 -5
  52. package/dist/esm/components/button/button.js +34 -3
  53. package/dist/esm/components/button/button.recipe.js +31 -5
  54. package/dist/esm/components/contextmenu/contextmenu.js +2 -2
  55. package/dist/esm/components/contextmenu/contextmenu.recipe.js +24 -0
  56. package/dist/esm/components/datatable/datatable.js +590 -42
  57. package/dist/esm/components/datatable/datatable.recipe.js +119 -6
  58. package/dist/esm/components/dialog/dialog.js +72 -5
  59. package/dist/esm/components/dialog/dialog.recipe.js +15 -1
  60. package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +49 -5
  61. package/dist/esm/components/tabletoolbar/tabletoolbar.js +366 -50
  62. package/dist/esm/components/tabletoolbar/tabletoolbar.recipe.js +80 -2
  63. package/dist/esm/components/tabs/tabs.recipe.js +11 -2
  64. package/dist/esm/components/tooltip/tooltip.js +23 -9
  65. package/dist/esm/components/tooltip/tooltip.recipe.js +10 -9
  66. package/dist/esm/product/authshell/authshell.js +15 -2
  67. package/dist/esm/product/authshell/authshell.recipe.js +13 -1
  68. package/dist/esm/product/authshell/index.js +1 -1
  69. package/dist/esm/product/board/board.js +176 -47
  70. package/dist/esm/product/board/board.recipe.js +56 -4
  71. package/dist/esm/product/comments/comments.js +35 -13
  72. package/dist/esm/product/comments/comments.recipe.js +31 -7
  73. package/dist/esm/product/formdialog/formdialog.js +10 -4
  74. package/dist/esm/product/navitem/index.js +1 -1
  75. package/dist/esm/product/navitem/navitem.js +7 -2
  76. package/dist/esm/product/navitem/navitem.recipe.js +16 -0
  77. package/dist/esm/product/objectsettings/index.js +1 -1
  78. package/dist/esm/product/objectsettings/objectsettings.js +2 -12
  79. package/dist/esm/product/recordstable/recordstable.js +2 -18
  80. package/dist/esm/product/richtext/richtext.js +76 -1
  81. package/dist/esm/product/savedviews/savedviews.js +57 -26
  82. package/dist/esm/product/savedviews/savedviews.recipe.js +27 -0
  83. package/dist/esm/product/sidebar/sidebar.js +69 -16
  84. package/dist/esm/product/sidebar/sidebar.recipe.js +6 -1
  85. package/dist/esm/tokens/palette.js +32 -1
  86. package/dist/esm/tokens/semantic.js +11 -0
  87. package/dist/native/tokens.d.ts +1 -1
  88. package/dist/native/tokens.js +16 -2
  89. package/dist/navitem.css +7 -0
  90. package/dist/navitem.layered.css +7 -0
  91. package/dist/recordstable.css +34 -32
  92. package/dist/recordstable.layered.css +34 -32
  93. package/dist/savedviews.css +27 -0
  94. package/dist/savedviews.layered.css +27 -0
  95. package/dist/sidebar.css +6 -1
  96. package/dist/sidebar.layered.css +6 -1
  97. package/dist/styles.css +369 -106
  98. package/dist/styles.layered.css +369 -106
  99. package/dist/tabletoolbar.css +47 -3
  100. package/dist/tabletoolbar.layered.css +47 -3
  101. package/dist/tabs.css +1 -1
  102. package/dist/tabs.layered.css +1 -1
  103. package/dist/tokens.css +9 -1
  104. package/dist/tokens.json +16 -2
  105. package/dist/tooltip.css +1 -1
  106. package/dist/tooltip.layered.css +1 -1
  107. package/dist/types/components/badge/badge.recipe.d.ts +5 -1
  108. package/dist/types/components/button/button.recipe.d.ts +18 -5
  109. package/dist/types/components/contextmenu/contextmenu.d.ts +8 -1
  110. package/dist/types/components/datatable/datatable.d.ts +98 -1
  111. package/dist/types/components/dialog/dialog.d.ts +25 -2
  112. package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +113 -3
  113. package/dist/types/components/tooltip/tooltip.d.ts +12 -4
  114. package/dist/types/components/tooltip/tooltip.recipe.d.ts +1 -1
  115. package/dist/types/product/authshell/authshell.d.ts +26 -2
  116. package/dist/types/product/authshell/index.d.ts +1 -1
  117. package/dist/types/product/board/board.d.ts +53 -6
  118. package/dist/types/product/comments/comments.d.ts +16 -3
  119. package/dist/types/product/formdialog/formdialog.d.ts +2 -1
  120. package/dist/types/product/navitem/index.d.ts +1 -1
  121. package/dist/types/product/navitem/navitem.d.ts +23 -0
  122. package/dist/types/product/objectsettings/index.d.ts +1 -1
  123. package/dist/types/product/objectsettings/objectsettings.d.ts +0 -10
  124. package/dist/types/product/recordstable/recordstable.d.ts +0 -1
  125. package/dist/types/product/savedviews/savedviews.d.ts +45 -8
  126. package/dist/types/product/sidebar/sidebar.d.ts +33 -5
  127. package/dist/types/tokens/contract.d.ts +4 -0
  128. package/dist/types/tokens/palette.d.ts +13 -1
  129. package/dist/types/tokens/semantic.d.ts +11 -0
  130. package/package.json +1 -1
@@ -43,7 +43,7 @@
43
43
  & .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; }
44
44
  & .crisp-recordstable-sort-learn svg { flex-shrink: 0; }
45
45
  & .crisp-recordstable-sort-learn:hover { color: var(--crisp-fg-primary); }
46
- & .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); line-height: 20px; font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
46
+ & .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); line-height: 20px; font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); text-align: left; text-decoration: none; cursor: pointer; }
47
47
  & .crisp-recordstable-menu-item:hover { background: var(--crisp-bg-raised); }
48
48
  & .crisp-recordstable-menu-item:disabled { opacity: 0.4; cursor: default; }
49
49
  & .crisp-recordstable-menu-item:disabled:hover { background: none; }
@@ -51,12 +51,30 @@
51
51
  & .crisp-recordstable-menu-item[data-on] svg { color: var(--crisp-bg-brand-solid); }
52
52
  & .crisp-recordstable-menu-item .crisp-recordstable-menu-check { margin-left: auto; }
53
53
  & .crisp-recordstable-menu-input { height: var(--crisp-size-row); margin: var(--crisp-space-0-5); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); background: var(--crisp-bg-surface); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); outline: none; }
54
- & .crisp-recordstable-menu-sep { height: 1px; background: var(--crisp-border-subtle); margin: var(--crisp-space-0-5) 0; }
54
+ & .crisp-recordstable-menu-sep { height: 1px; border: none; background: var(--crisp-border-subtle); margin: var(--crisp-space-0-5) 0; }
55
+ /* #592: the Filter field picker's nested-scope header (back control +
56
+ search, once drilled into a nestedColumns column) and a search
57
+ result's own breadcrumb row ("Team › Twitter follower count", surfaced by the SAME query matching a nested column). menu-back reuses the established 28px icon-only control pattern this file already uses twice (sort-remove, the kebab segment) rather than an independent measurement of Attio's own back arrow. The breadcrumb
58
+ colours ARE measured live: the parent segment muted at the same
59
+ exact color-mix 63% sort-learn above already uses, the
60
+ separator chevron and leaf segment both full fgPrimary (the
61
+ generic menu-item svg rule below defaults every icon to
62
+ fgMuted, so the separator needs its own override to read
63
+ correctly here). */
64
+ & .crisp-recordstable-menu-nesthead { display: flex; align-items: center; gap: var(--crisp-space-1); margin: var(--crisp-space-0-5); }
65
+ & .crisp-recordstable-menu-nesthead .crisp-recordstable-menu-input { flex: 1; margin: 0; }
66
+ & .crisp-recordstable-menu-back { 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: none; color: var(--crisp-fg-muted); cursor: pointer; }
67
+ & .crisp-recordstable-menu-back:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
68
+ & .crisp-recordstable-menu-item--expand { justify-content: space-between; }
69
+ & .crisp-recordstable-menu-item-path { display: inline-flex; align-items: center; gap: 2px; min-width: 0; overflow: hidden; }
70
+ & .crisp-recordstable-menu-item-path-parent { flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; max-width: 100px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
71
+ & .crisp-recordstable-menu-item-path-sep { flex-shrink: 0; color: var(--crisp-fg-primary); }
72
+ & .crisp-recordstable-menu-item-path > span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
55
73
  & .crisp-recordstable-menu--up { top: auto; bottom: calc(100% + var(--crisp-space-1)); transform-origin: bottom; }
56
74
  & .crisp-recordstable-menu--right { left: auto; right: 0; }
57
75
  & .crisp-recordstable-menu--fixed { position: fixed; top: auto; left: auto; z-index: 40; }
58
76
  & .crisp-recordstable-menu--hdr { min-width: 200px; }
59
- & .crisp-recordstable-menu--op { min-width: 134px; }
77
+ & .crisp-recordstable-menu--op { min-width: 0; }
60
78
  & .crisp-recordstable-menu-item--danger { color: var(--crisp-bg-danger); }
61
79
  & .crisp-recordstable-menu-item--danger svg { color: var(--crisp-bg-danger); }
62
80
  & .crisp-recordstable-menu-item--danger:hover { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
@@ -72,6 +90,7 @@
72
90
  & .crisp-recordstable-count { font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
73
91
  & .crisp-recordstable-new { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); padding: 0 var(--crisp-space-2-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); cursor: pointer; transition: background-color .12s; }
74
92
  & .crisp-recordstable-new:hover { background: var(--crisp-bg-brand-solid-pressed); }
93
+
75
94
  /* scroll frame + table */
76
95
  & .crisp-recordstable-scroll { flex: 1; min-height: 0; overflow: auto; background: var(--crisp-bg-surface); border-top: 1px solid var(--crisp-border-subtle); scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--crisp-fg-primary) 22%, transparent) transparent; }
77
96
  & .crisp-recordstable-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
@@ -89,16 +108,20 @@
89
108
  & .crisp-recordstable-sort { flex-shrink: 0; opacity: 0.4; transition: opacity .12s; color: color-mix(in srgb, var(--crisp-fg-primary) 45%, transparent); }
90
109
  & .crisp-recordstable-th:hover .crisp-recordstable-sort, & .crisp-recordstable-th[data-sorted] .crisp-recordstable-sort { opacity: 1; }
91
110
  & .crisp-recordstable-th[data-sorted="desc"] .crisp-recordstable-sort svg { transform: rotate(180deg); }
111
+
92
112
  /* column resize handle */
93
113
  & .crisp-recordstable-resize { position: absolute; top: 0; inset-inline-end: -3px; width: 9px; height: 100%; cursor: col-resize; z-index: 6; touch-action: none; }
94
114
  & .crisp-recordstable-resize::after { content: ""; position: absolute; top: 0; inset-inline-start: 3px; width: 2px; height: 100%; background: var(--crisp-bg-brand-solid); opacity: 0; transition: opacity .12s; }
95
115
  & .crisp-recordstable-resize:hover::after, & .crisp-recordstable-resize[data-resizing]::after { opacity: 1; }
116
+
96
117
  /* add-column header */
97
118
  & .crisp-recordstable-addcol { min-width: 44px; }
98
119
  & .crisp-recordstable-addcol button { display: flex; align-items: center; justify-content: center; width: 44px; height: 100%; border: none; background: none; color: var(--crisp-fg-muted); cursor: pointer; }
99
120
  & .crisp-recordstable-addcol button:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
100
- /* cells */ /* font-weight is explicit because the first cell of each row is a th[scope=row] — the record's name is what the row IS — and a th
101
- defaults to bold. Measured before the change and unchanged after: 400. */
121
+
122
+ /* cells */
123
+ /* font-weight is explicit because the first cell of each row is a
124
+ th[scope=row] — the record's name is what the row IS — and a th defaults to bold. Measured before the change and unchanged after: 400. */
102
125
  & .crisp-recordstable-td { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-regular); color: var(--crisp-fg-primary); background: var(--crisp-bg-surface); cursor: default; }
103
126
  & .crisp-recordstable-td--editable { cursor: text; }
104
127
  /* keyboard/click cell selection (spreadsheet-style) */
@@ -114,10 +137,8 @@
114
137
  & .crisp-recordstable-td--picker .crisp-multiselect-chips .crisp-recordstable-tag { flex-shrink: 0; max-width: none; }
115
138
  & .crisp-recordstable-td--picker .crisp-multiselect-chevron { display: none; }
116
139
  & .crisp-recordstable-td--picker .crisp-multiselect-placeholder { color: var(--crisp-fg-muted); }
117
- /* reference picker: a leading 16px avatar per option, plus a trailing
118
- "Create X" row when the consumer supplies one (#449) -- measured live
119
- against Attio's own picker (16px circular avatar, 16px plain icon for the create row, both sitting in the option's existing 8px gap, no new
120
- gap value invented). */
140
+ /* reference picker: a leading 16px avatar per option, plus a trailing "Create X" row when the consumer supplies one (#449) -- measured live against Attio's own picker (16px circular avatar, 16px plain icon for
141
+ the create row, both sitting in the option's existing 8px gap, no new gap value invented). */
121
142
  & .crisp-recordstable-refoption { display: flex; align-items: center; gap: var(--crisp-space-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; }
122
143
  & .crisp-recordstable-refoption-avatar { flex-shrink: 0; }
123
144
  & .crisp-recordstable-refoption--create { color: var(--crisp-fg-muted); }
@@ -145,46 +166,33 @@
145
166
  & tbody tr:hover .crisp-recordstable-open { opacity: 1; }
146
167
  & .crisp-recordstable-link { color: var(--crisp-fg-primary); text-decoration: none; overflow: hidden; text-overflow: ellipsis; }
147
168
  & .crisp-recordstable-link:hover { text-decoration: underline; }
148
-
149
169
  /* inline edit input */
150
170
  & .crisp-recordstable-edit { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0 var(--crisp-space-2); border: none; outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: -2px; border-radius: var(--crisp-radius-sm); background: var(--crisp-bg-surface); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); z-index: 5; }
151
171
  & .crisp-recordstable-edit--num { text-align: end; font-variant-numeric: tabular-nums; }
152
-
153
172
  /* selection / hover / sticky */
154
173
  & .crisp-recordstable-col-check { width: 40px; min-width: 40px; padding: 0; }
155
174
  & .crisp-recordstable-check-inner { display: flex; align-items: center; justify-content: center; height: 100%; }
156
175
  & .crisp-recordstable-col-check, & .crisp-recordstable-col-entity { position: sticky; z-index: 3; background: var(--crisp-bg-surface); }
157
- /* The sticky pin is a LOGICAL offset: with physical `left` these columns
158
- were not pinned at all under RTL -- scrolled, they left the viewport
159
- entirely (measured: viewport 13..773, check column at x=1333). Nothing in
160
- JS measures these, so converting them is safe; the two properties below
161
- that have no logical form get an explicit RTL rule rather than being
162
- left to point the wrong way. */
176
+ /* The sticky pin is a LOGICAL offset: with physical `left` these columns were not pinned at all under RTL -- scrolled, they left the viewport entirely (measured: viewport 13..773, check column at x=1333). Nothing in JS measures these, so converting them is safe; the two properties below that have no logical form get an explicit RTL rule rather than being left to point the wrong way. */
163
177
  & .crisp-recordstable-col-check { inset-inline-start: 0; }
164
178
  & .crisp-recordstable-col-entity { inset-inline-start: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
165
179
  [dir="rtl"] & .crisp-recordstable-col-entity { clip-path: inset(0 0 0 -38px); }
166
180
  & thead .crisp-recordstable-col-check, & thead .crisp-recordstable-col-entity { z-index: 4; }
167
181
  /* soft shadow on the sticky column edge once the grid is scrolled horizontally */
168
182
  & .crisp-recordstable-scroll[data-scrolled] .crisp-recordstable-col-entity { box-shadow: 6px 0 16px 4px rgba(0,0,0,0.12); }
169
- /* box-shadow has no logical form either: the bleed follows the scrolled
170
- content, which is the opposite side under RTL. */
183
+ /* box-shadow has no logical form either: the bleed follows the scrolled content, which is the opposite side under RTL. */
171
184
  [dir="rtl"] & .crisp-recordstable-scroll[data-scrolled] .crisp-recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
172
- /* AI-enriched values carry a purple wash. Measured live:
173
- a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
174
- whatever row-state background the cell already has, which is why it
175
- is an ::after and not a background. */
185
+ /* AI-enriched values carry a purple wash. Measured live: a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER whatever row-state background the cell already has, which is why it is an ::after and not a background. */
176
186
  & .crisp-recordstable-td[data-enriched]::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: color-mix(in srgb, var(--crisp-bg-purple) 4%, transparent); }
177
187
  & tbody tr:hover .crisp-recordstable-td { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-surface)); }
178
188
  & tbody tr[data-selected] .crisp-recordstable-td { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 10%, var(--crisp-bg-surface)); }
179
189
  & tbody tr[data-selected]:hover .crisp-recordstable-td { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, color-mix(in srgb, var(--crisp-bg-brand-solid) 10%, var(--crisp-bg-surface))); }
180
190
  & .crisp-recordstable-th:last-child, & .crisp-recordstable-td:last-child { border-inline-end: none; }
181
-
182
191
  /* add-row footer */
183
192
  & .crisp-recordstable-addrow { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-2); border: none; border-top: 1px solid var(--crisp-border-subtle); background: var(--crisp-bg-surface); color: var(--crisp-fg-muted); font-family: inherit; font-size: var(--crisp-text-lg); cursor: pointer; }
184
193
  & .crisp-recordstable-addrow:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
185
194
  /* zero-row empty state — centred in the body region (headers + summary stay) */
186
195
  & .crisp-recordstable-empty { display: flex; align-items: center; justify-content: center; min-height: 320px; padding: var(--crisp-space-8) var(--crisp-space-4); }
187
-
188
196
  /* summary footer — per-column aggregation, sticky to the bottom */
189
197
  & .crisp-recordstable-sum { position: sticky; bottom: 0; z-index: 2; height: var(--crisp-size-tableRow); padding: 0; border-top: 1px solid var(--crisp-border-subtle); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); background: var(--crisp-bg-surface); }
190
198
  & tfoot .crisp-recordstable-col-check, & tfoot .crisp-recordstable-col-entity { position: sticky; bottom: 0; z-index: 3; }
@@ -197,18 +205,12 @@
197
205
  & .crisp-recordstable-pin { flex-shrink: 0; margin-inline-start: var(--crisp-space-1); color: var(--crisp-bg-warning); fill: color-mix(in srgb, var(--crisp-bg-warning) 35%, transparent); }
198
206
  & .crisp-recordstable-sum-btn[data-empty] { opacity: 0; justify-content: flex-start; }
199
207
  & .crisp-recordstable-sum-btn[data-empty]:hover { opacity: 1; }
200
-
201
208
  /* bulk action bar lives in its own component now — see components/bulkbar */
202
209
  & .crisp-recordstable-bulk-sep { width: 1px; height: 20px; margin: 0 var(--crisp-space-0-5); background: var(--crisp-border-subtle); }
203
210
  & .crisp-recordstable-bulk-close { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: transparent; color: var(--crisp-fg-muted); cursor: pointer; }
204
211
  & .crisp-recordstable-bulk-close:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
205
-
206
212
  /* announced, never drawn */
207
- & .crisp-recordstable-live {
208
- position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
209
- overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
210
- }
211
-
213
+ & .crisp-recordstable-live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
212
214
  [dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
213
215
  }
214
216
 
@@ -44,7 +44,7 @@
44
44
  & .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; }
45
45
  & .crisp-recordstable-sort-learn svg { flex-shrink: 0; }
46
46
  & .crisp-recordstable-sort-learn:hover { color: var(--crisp-fg-primary); }
47
- & .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); line-height: 20px; font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); text-align: left; cursor: pointer; }
47
+ & .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); line-height: 20px; font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); text-align: left; text-decoration: none; cursor: pointer; }
48
48
  & .crisp-recordstable-menu-item:hover { background: var(--crisp-bg-raised); }
49
49
  & .crisp-recordstable-menu-item:disabled { opacity: 0.4; cursor: default; }
50
50
  & .crisp-recordstable-menu-item:disabled:hover { background: none; }
@@ -52,12 +52,30 @@
52
52
  & .crisp-recordstable-menu-item[data-on] svg { color: var(--crisp-bg-brand-solid); }
53
53
  & .crisp-recordstable-menu-item .crisp-recordstable-menu-check { margin-left: auto; }
54
54
  & .crisp-recordstable-menu-input { height: var(--crisp-size-row); margin: var(--crisp-space-0-5); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); background: var(--crisp-bg-surface); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); outline: none; }
55
- & .crisp-recordstable-menu-sep { height: 1px; background: var(--crisp-border-subtle); margin: var(--crisp-space-0-5) 0; }
55
+ & .crisp-recordstable-menu-sep { height: 1px; border: none; background: var(--crisp-border-subtle); margin: var(--crisp-space-0-5) 0; }
56
+ /* #592: the Filter field picker's nested-scope header (back control +
57
+ search, once drilled into a nestedColumns column) and a search
58
+ result's own breadcrumb row ("Team › Twitter follower count", surfaced by the SAME query matching a nested column). menu-back reuses the established 28px icon-only control pattern this file already uses twice (sort-remove, the kebab segment) rather than an independent measurement of Attio's own back arrow. The breadcrumb
59
+ colours ARE measured live: the parent segment muted at the same
60
+ exact color-mix 63% sort-learn above already uses, the
61
+ separator chevron and leaf segment both full fgPrimary (the
62
+ generic menu-item svg rule below defaults every icon to
63
+ fgMuted, so the separator needs its own override to read
64
+ correctly here). */
65
+ & .crisp-recordstable-menu-nesthead { display: flex; align-items: center; gap: var(--crisp-space-1); margin: var(--crisp-space-0-5); }
66
+ & .crisp-recordstable-menu-nesthead .crisp-recordstable-menu-input { flex: 1; margin: 0; }
67
+ & .crisp-recordstable-menu-back { 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: none; color: var(--crisp-fg-muted); cursor: pointer; }
68
+ & .crisp-recordstable-menu-back:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
69
+ & .crisp-recordstable-menu-item--expand { justify-content: space-between; }
70
+ & .crisp-recordstable-menu-item-path { display: inline-flex; align-items: center; gap: 2px; min-width: 0; overflow: hidden; }
71
+ & .crisp-recordstable-menu-item-path-parent { flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; max-width: 100px; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
72
+ & .crisp-recordstable-menu-item-path-sep { flex-shrink: 0; color: var(--crisp-fg-primary); }
73
+ & .crisp-recordstable-menu-item-path > span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
56
74
  & .crisp-recordstable-menu--up { top: auto; bottom: calc(100% + var(--crisp-space-1)); transform-origin: bottom; }
57
75
  & .crisp-recordstable-menu--right { left: auto; right: 0; }
58
76
  & .crisp-recordstable-menu--fixed { position: fixed; top: auto; left: auto; z-index: 40; }
59
77
  & .crisp-recordstable-menu--hdr { min-width: 200px; }
60
- & .crisp-recordstable-menu--op { min-width: 134px; }
78
+ & .crisp-recordstable-menu--op { min-width: 0; }
61
79
  & .crisp-recordstable-menu-item--danger { color: var(--crisp-bg-danger); }
62
80
  & .crisp-recordstable-menu-item--danger svg { color: var(--crisp-bg-danger); }
63
81
  & .crisp-recordstable-menu-item--danger:hover { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
@@ -73,6 +91,7 @@
73
91
  & .crisp-recordstable-count { font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
74
92
  & .crisp-recordstable-new { display: inline-flex; align-items: center; gap: var(--crisp-space-1); height: var(--crisp-size-row); padding: 0 var(--crisp-space-2-5); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand); font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); cursor: pointer; transition: background-color .12s; }
75
93
  & .crisp-recordstable-new:hover { background: var(--crisp-bg-brand-solid-pressed); }
94
+
76
95
  /* scroll frame + table */
77
96
  & .crisp-recordstable-scroll { flex: 1; min-height: 0; overflow: auto; background: var(--crisp-bg-surface); border-top: 1px solid var(--crisp-border-subtle); scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--crisp-fg-primary) 22%, transparent) transparent; }
78
97
  & .crisp-recordstable-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
@@ -90,16 +109,20 @@
90
109
  & .crisp-recordstable-sort { flex-shrink: 0; opacity: 0.4; transition: opacity .12s; color: color-mix(in srgb, var(--crisp-fg-primary) 45%, transparent); }
91
110
  & .crisp-recordstable-th:hover .crisp-recordstable-sort, & .crisp-recordstable-th[data-sorted] .crisp-recordstable-sort { opacity: 1; }
92
111
  & .crisp-recordstable-th[data-sorted="desc"] .crisp-recordstable-sort svg { transform: rotate(180deg); }
112
+
93
113
  /* column resize handle */
94
114
  & .crisp-recordstable-resize { position: absolute; top: 0; inset-inline-end: -3px; width: 9px; height: 100%; cursor: col-resize; z-index: 6; touch-action: none; }
95
115
  & .crisp-recordstable-resize::after { content: ""; position: absolute; top: 0; inset-inline-start: 3px; width: 2px; height: 100%; background: var(--crisp-bg-brand-solid); opacity: 0; transition: opacity .12s; }
96
116
  & .crisp-recordstable-resize:hover::after, & .crisp-recordstable-resize[data-resizing]::after { opacity: 1; }
117
+
97
118
  /* add-column header */
98
119
  & .crisp-recordstable-addcol { min-width: 44px; }
99
120
  & .crisp-recordstable-addcol button { display: flex; align-items: center; justify-content: center; width: 44px; height: 100%; border: none; background: none; color: var(--crisp-fg-muted); cursor: pointer; }
100
121
  & .crisp-recordstable-addcol button:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
101
- /* cells */ /* font-weight is explicit because the first cell of each row is a th[scope=row] — the record's name is what the row IS — and a th
102
- defaults to bold. Measured before the change and unchanged after: 400. */
122
+
123
+ /* cells */
124
+ /* font-weight is explicit because the first cell of each row is a
125
+ th[scope=row] — the record's name is what the row IS — and a th defaults to bold. Measured before the change and unchanged after: 400. */
103
126
  & .crisp-recordstable-td { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-regular); color: var(--crisp-fg-primary); background: var(--crisp-bg-surface); cursor: default; }
104
127
  & .crisp-recordstable-td--editable { cursor: text; }
105
128
  /* keyboard/click cell selection (spreadsheet-style) */
@@ -115,10 +138,8 @@
115
138
  & .crisp-recordstable-td--picker .crisp-multiselect-chips .crisp-recordstable-tag { flex-shrink: 0; max-width: none; }
116
139
  & .crisp-recordstable-td--picker .crisp-multiselect-chevron { display: none; }
117
140
  & .crisp-recordstable-td--picker .crisp-multiselect-placeholder { color: var(--crisp-fg-muted); }
118
- /* reference picker: a leading 16px avatar per option, plus a trailing
119
- "Create X" row when the consumer supplies one (#449) -- measured live
120
- against Attio's own picker (16px circular avatar, 16px plain icon for the create row, both sitting in the option's existing 8px gap, no new
121
- gap value invented). */
141
+ /* reference picker: a leading 16px avatar per option, plus a trailing "Create X" row when the consumer supplies one (#449) -- measured live against Attio's own picker (16px circular avatar, 16px plain icon for
142
+ the create row, both sitting in the option's existing 8px gap, no new gap value invented). */
122
143
  & .crisp-recordstable-refoption { display: flex; align-items: center; gap: var(--crisp-space-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; }
123
144
  & .crisp-recordstable-refoption-avatar { flex-shrink: 0; }
124
145
  & .crisp-recordstable-refoption--create { color: var(--crisp-fg-muted); }
@@ -146,46 +167,33 @@
146
167
  & tbody tr:hover .crisp-recordstable-open { opacity: 1; }
147
168
  & .crisp-recordstable-link { color: var(--crisp-fg-primary); text-decoration: none; overflow: hidden; text-overflow: ellipsis; }
148
169
  & .crisp-recordstable-link:hover { text-decoration: underline; }
149
-
150
170
  /* inline edit input */
151
171
  & .crisp-recordstable-edit { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0 var(--crisp-space-2); border: none; outline: 2px solid var(--crisp-bg-brand-solid); outline-offset: -2px; border-radius: var(--crisp-radius-sm); background: var(--crisp-bg-surface); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); z-index: 5; }
152
172
  & .crisp-recordstable-edit--num { text-align: end; font-variant-numeric: tabular-nums; }
153
-
154
173
  /* selection / hover / sticky */
155
174
  & .crisp-recordstable-col-check { width: 40px; min-width: 40px; padding: 0; }
156
175
  & .crisp-recordstable-check-inner { display: flex; align-items: center; justify-content: center; height: 100%; }
157
176
  & .crisp-recordstable-col-check, & .crisp-recordstable-col-entity { position: sticky; z-index: 3; background: var(--crisp-bg-surface); }
158
- /* The sticky pin is a LOGICAL offset: with physical `left` these columns
159
- were not pinned at all under RTL -- scrolled, they left the viewport
160
- entirely (measured: viewport 13..773, check column at x=1333). Nothing in
161
- JS measures these, so converting them is safe; the two properties below
162
- that have no logical form get an explicit RTL rule rather than being
163
- left to point the wrong way. */
177
+ /* The sticky pin is a LOGICAL offset: with physical `left` these columns were not pinned at all under RTL -- scrolled, they left the viewport entirely (measured: viewport 13..773, check column at x=1333). Nothing in JS measures these, so converting them is safe; the two properties below that have no logical form get an explicit RTL rule rather than being left to point the wrong way. */
164
178
  & .crisp-recordstable-col-check { inset-inline-start: 0; }
165
179
  & .crisp-recordstable-col-entity { inset-inline-start: 40px; clip-path: inset(0 -38px 0 0); transition: box-shadow .2s ease; }
166
180
  [dir="rtl"] & .crisp-recordstable-col-entity { clip-path: inset(0 0 0 -38px); }
167
181
  & thead .crisp-recordstable-col-check, & thead .crisp-recordstable-col-entity { z-index: 4; }
168
182
  /* soft shadow on the sticky column edge once the grid is scrolled horizontally */
169
183
  & .crisp-recordstable-scroll[data-scrolled] .crisp-recordstable-col-entity { box-shadow: 6px 0 16px 4px rgba(0,0,0,0.12); }
170
- /* box-shadow has no logical form either: the bleed follows the scrolled
171
- content, which is the opposite side under RTL. */
184
+ /* box-shadow has no logical form either: the bleed follows the scrolled content, which is the opposite side under RTL. */
172
185
  [dir="rtl"] & .crisp-recordstable-scroll[data-scrolled] .crisp-recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
173
- /* AI-enriched values carry a purple wash. Measured live:
174
- a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
175
- whatever row-state background the cell already has, which is why it
176
- is an ::after and not a background. */
186
+ /* AI-enriched values carry a purple wash. Measured live: a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER whatever row-state background the cell already has, which is why it is an ::after and not a background. */
177
187
  & .crisp-recordstable-td[data-enriched]::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: color-mix(in srgb, var(--crisp-bg-purple) 4%, transparent); }
178
188
  & tbody tr:hover .crisp-recordstable-td { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, var(--crisp-bg-surface)); }
179
189
  & tbody tr[data-selected] .crisp-recordstable-td { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 10%, var(--crisp-bg-surface)); }
180
190
  & tbody tr[data-selected]:hover .crisp-recordstable-td { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, color-mix(in srgb, var(--crisp-bg-brand-solid) 10%, var(--crisp-bg-surface))); }
181
191
  & .crisp-recordstable-th:last-child, & .crisp-recordstable-td:last-child { border-inline-end: none; }
182
-
183
192
  /* add-row footer */
184
193
  & .crisp-recordstable-addrow { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-2); border: none; border-top: 1px solid var(--crisp-border-subtle); background: var(--crisp-bg-surface); color: var(--crisp-fg-muted); font-family: inherit; font-size: var(--crisp-text-lg); cursor: pointer; }
185
194
  & .crisp-recordstable-addrow:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
186
195
  /* zero-row empty state — centred in the body region (headers + summary stay) */
187
196
  & .crisp-recordstable-empty { display: flex; align-items: center; justify-content: center; min-height: 320px; padding: var(--crisp-space-8) var(--crisp-space-4); }
188
-
189
197
  /* summary footer — per-column aggregation, sticky to the bottom */
190
198
  & .crisp-recordstable-sum { position: sticky; bottom: 0; z-index: 2; height: var(--crisp-size-tableRow); padding: 0; border-top: 1px solid var(--crisp-border-subtle); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); background: var(--crisp-bg-surface); }
191
199
  & tfoot .crisp-recordstable-col-check, & tfoot .crisp-recordstable-col-entity { position: sticky; bottom: 0; z-index: 3; }
@@ -198,18 +206,12 @@
198
206
  & .crisp-recordstable-pin { flex-shrink: 0; margin-inline-start: var(--crisp-space-1); color: var(--crisp-bg-warning); fill: color-mix(in srgb, var(--crisp-bg-warning) 35%, transparent); }
199
207
  & .crisp-recordstable-sum-btn[data-empty] { opacity: 0; justify-content: flex-start; }
200
208
  & .crisp-recordstable-sum-btn[data-empty]:hover { opacity: 1; }
201
-
202
209
  /* bulk action bar lives in its own component now — see components/bulkbar */
203
210
  & .crisp-recordstable-bulk-sep { width: 1px; height: 20px; margin: 0 var(--crisp-space-0-5); background: var(--crisp-border-subtle); }
204
211
  & .crisp-recordstable-bulk-close { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: transparent; color: var(--crisp-fg-muted); cursor: pointer; }
205
212
  & .crisp-recordstable-bulk-close:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
206
-
207
213
  /* announced, never drawn */
208
- & .crisp-recordstable-live {
209
- position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
210
- overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
211
- }
212
-
214
+ & .crisp-recordstable-live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
213
215
  [dir="rtl"] & [data-rtl-flip] { transform: scaleX(-1); }
214
216
  }
215
217
 
@@ -13,6 +13,21 @@
13
13
  .crisp-savedviews-panel[data-up] { transform-origin: bottom left; }
14
14
  .crisp-savedviews-panel { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
15
15
 
16
+ /* #618 (P-007): the panel's own "Search views..." box — measured live:
17
+ 32px tall, 6px/8px padding, NO border/background/leading icon of its
18
+ own (unlike Select's own bordered searchable-input pill), 14px text.
19
+ A hairline divider (borderSubtle, 1px, 3px top margin) separates it
20
+ from the view list, matching the divider Attio's own kebab menu uses
21
+ between its action items and the "Created by" footer below. */
22
+ .crisp-savedviews-search {
23
+ box-sizing: border-box; display: block; width: 100%; height: 32px; flex-shrink: 0;
24
+ margin: 0; padding: var(--crisp-space-1-5) var(--crisp-space-2); border: none; background: none;
25
+ font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); outline: none;
26
+ }
27
+ .crisp-savedviews-search::placeholder { color: var(--crisp-fg-muted); }
28
+ .crisp-savedviews-search-sep { height: 1px; flex-shrink: 0; margin: 3px 0 0; background: var(--crisp-border-subtle); }
29
+ .crisp-savedviews-empty { padding: var(--crisp-space-1-5) var(--crisp-space-2); font-size: var(--crisp-text-lg); color: var(--crisp-fg-muted); }
30
+
16
31
  .crisp-savedviews-row {
17
32
  box-sizing: border-box; position: relative; display: flex; align-items: center; gap: var(--crisp-space-1-5);
18
33
  height: var(--crisp-size-menuRow); flex-shrink: 0; padding: var(--crisp-space-1-5) var(--crisp-space-2);
@@ -44,6 +59,18 @@
44
59
  .crisp-savedviews-row:focus-within .crisp-savedviews-kebab,
45
60
  .crisp-savedviews-kebab[data-open] { opacity: 1; }
46
61
  .crisp-savedviews-kebab:hover, .crisp-savedviews-kebab[data-open] { background: var(--crisp-bg-surface); color: var(--crisp-fg-primary); }
62
+
63
+ /* #618 (P-008): the kebab menu's own "Created by X" / date footer —
64
+ measured live: 2 stacked lines, 6px/8px padding, 2px gap between
65
+ them, 12px/500 text, BOTH lines the same color-mix 50% muted (a
66
+ distinct value from the 63% mix #592's chip breadcrumb uses —
67
+ independently measured, not assumed to match). */
68
+ .crisp-savedviews-kebab-footer {
69
+ display: flex; flex-direction: column; gap: 2px;
70
+ padding: var(--crisp-space-1-5) var(--crisp-space-2);
71
+ font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium);
72
+ color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent);
73
+ }
47
74
 
48
75
  .crisp-savedviews {
49
76
  position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* Trigger fill measured rgb(246,247,247); bgRaised's light value is
@@ -14,6 +14,21 @@
14
14
  .crisp-savedviews-panel[data-up] { transform-origin: bottom left; }
15
15
  .crisp-savedviews-panel { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
16
16
 
17
+ /* #618 (P-007): the panel's own "Search views..." box — measured live:
18
+ 32px tall, 6px/8px padding, NO border/background/leading icon of its
19
+ own (unlike Select's own bordered searchable-input pill), 14px text.
20
+ A hairline divider (borderSubtle, 1px, 3px top margin) separates it
21
+ from the view list, matching the divider Attio's own kebab menu uses
22
+ between its action items and the "Created by" footer below. */
23
+ .crisp-savedviews-search {
24
+ box-sizing: border-box; display: block; width: 100%; height: 32px; flex-shrink: 0;
25
+ margin: 0; padding: var(--crisp-space-1-5) var(--crisp-space-2); border: none; background: none;
26
+ font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); outline: none;
27
+ }
28
+ .crisp-savedviews-search::placeholder { color: var(--crisp-fg-muted); }
29
+ .crisp-savedviews-search-sep { height: 1px; flex-shrink: 0; margin: 3px 0 0; background: var(--crisp-border-subtle); }
30
+ .crisp-savedviews-empty { padding: var(--crisp-space-1-5) var(--crisp-space-2); font-size: var(--crisp-text-lg); color: var(--crisp-fg-muted); }
31
+
17
32
  .crisp-savedviews-row {
18
33
  box-sizing: border-box; position: relative; display: flex; align-items: center; gap: var(--crisp-space-1-5);
19
34
  height: var(--crisp-size-menuRow); flex-shrink: 0; padding: var(--crisp-space-1-5) var(--crisp-space-2);
@@ -45,6 +60,18 @@
45
60
  .crisp-savedviews-row:focus-within .crisp-savedviews-kebab,
46
61
  .crisp-savedviews-kebab[data-open] { opacity: 1; }
47
62
  .crisp-savedviews-kebab:hover, .crisp-savedviews-kebab[data-open] { background: var(--crisp-bg-surface); color: var(--crisp-fg-primary); }
63
+
64
+ /* #618 (P-008): the kebab menu's own "Created by X" / date footer —
65
+ measured live: 2 stacked lines, 6px/8px padding, 2px gap between
66
+ them, 12px/500 text, BOTH lines the same color-mix 50% muted (a
67
+ distinct value from the 63% mix #592's chip breadcrumb uses —
68
+ independently measured, not assumed to match). */
69
+ .crisp-savedviews-kebab-footer {
70
+ display: flex; flex-direction: column; gap: 2px;
71
+ padding: var(--crisp-space-1-5) var(--crisp-space-2);
72
+ font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium);
73
+ color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent);
74
+ }
48
75
 
49
76
  .crisp-savedviews {
50
77
  position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* Trigger fill measured rgb(246,247,247); bgRaised's light value is
package/dist/sidebar.css CHANGED
@@ -6,9 +6,14 @@
6
6
  & .crisp-sidebar-section { display: flex; flex-direction: column; gap: var(--crisp-space-px); margin-top: var(--crisp-space-2); }
7
7
  & .crisp-sidebar-section[data-collapsed] { display: none; }
8
8
  & .crisp-sidebar-label { font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); }
9
- & .crisp-sidebar-section-header { display: flex; align-items: center; gap: var(--crisp-space-1); width: 100%; margin: 0; border: none; background: none; padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); cursor: pointer; }
9
+ & .crisp-sidebar-section-header-row { display: flex; align-items: center; }
10
+ & .crisp-sidebar-section-header { display: flex; align-items: center; gap: var(--crisp-space-1); flex: 1; min-width: 0; margin: 0; border: none; background: none; padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); cursor: pointer; }
10
11
  & .crisp-sidebar-section-header svg { flex-shrink: 0; transition: transform .15s ease; }
11
12
  & .crisp-sidebar-section-header[data-collapsed] svg { transform: rotate(-90deg); }
13
+ & .crisp-sidebar-section-actions { display: flex; align-items: center; gap: var(--crisp-space-1); flex-shrink: 0; padding-inline-end: var(--crisp-space-1); opacity: 0; transition: opacity .12s ease; }
14
+ & .crisp-sidebar-section-header-row:hover .crisp-sidebar-section-actions, & .crisp-sidebar-section-header-row:focus-within .crisp-sidebar-section-actions { opacity: 1; }
15
+ & .crisp-sidebar-section-action { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; width: var(--crisp-space-5); height: var(--crisp-space-5); margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-sm); background: transparent; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); font-family: inherit; cursor: pointer; text-decoration: none; transition: background-color 0.14s, color 0.14s; }
16
+ & .crisp-sidebar-section-action:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
12
17
  & .crisp-sidebar-ws-row { display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-header); padding: 0 var(--crisp-space-2); }
13
18
  & .crisp-sidebar-ws-menuroot { display: flex; flex: 1; min-width: 0; }
14
19
  & .crisp-sidebar-ws { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); flex: 1; min-width: 0; height: 100%; margin: 0; padding: 0; border: none; background: none; border-radius: var(--crisp-radius-lg); font-family: inherit; font-size: inherit; color: inherit; text-align: start; cursor: pointer; transition: background-color 0.16s; }
@@ -7,9 +7,14 @@
7
7
  & .crisp-sidebar-section { display: flex; flex-direction: column; gap: var(--crisp-space-px); margin-top: var(--crisp-space-2); }
8
8
  & .crisp-sidebar-section[data-collapsed] { display: none; }
9
9
  & .crisp-sidebar-label { font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); }
10
- & .crisp-sidebar-section-header { display: flex; align-items: center; gap: var(--crisp-space-1); width: 100%; margin: 0; border: none; background: none; padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); cursor: pointer; }
10
+ & .crisp-sidebar-section-header-row { display: flex; align-items: center; }
11
+ & .crisp-sidebar-section-header { display: flex; align-items: center; gap: var(--crisp-space-1); flex: 1; min-width: 0; margin: 0; border: none; background: none; padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); cursor: pointer; }
11
12
  & .crisp-sidebar-section-header svg { flex-shrink: 0; transition: transform .15s ease; }
12
13
  & .crisp-sidebar-section-header[data-collapsed] svg { transform: rotate(-90deg); }
14
+ & .crisp-sidebar-section-actions { display: flex; align-items: center; gap: var(--crisp-space-1); flex-shrink: 0; padding-inline-end: var(--crisp-space-1); opacity: 0; transition: opacity .12s ease; }
15
+ & .crisp-sidebar-section-header-row:hover .crisp-sidebar-section-actions, & .crisp-sidebar-section-header-row:focus-within .crisp-sidebar-section-actions { opacity: 1; }
16
+ & .crisp-sidebar-section-action { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; width: var(--crisp-space-5); height: var(--crisp-space-5); margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-sm); background: transparent; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); font-family: inherit; cursor: pointer; text-decoration: none; transition: background-color 0.14s, color 0.14s; }
17
+ & .crisp-sidebar-section-action:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
13
18
  & .crisp-sidebar-ws-row { display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-header); padding: 0 var(--crisp-space-2); }
14
19
  & .crisp-sidebar-ws-menuroot { display: flex; flex: 1; min-width: 0; }
15
20
  & .crisp-sidebar-ws { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); flex: 1; min-width: 0; height: 100%; margin: 0; padding: 0; border: none; background: none; border-radius: var(--crisp-radius-lg); font-family: inherit; font-size: inherit; color: inherit; text-align: start; cursor: pointer; transition: background-color 0.16s; }