@design.estate/dees-catalog 3.61.2 → 3.63.0

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.
@@ -113,29 +113,48 @@ export const tableStyles = [
113
113
  border-bottom-width: 0px;
114
114
  }
115
115
 
116
+ /* Default mode (Mode B, page sticky): horizontal scroll lives on
117
+ .tableScroll (so wide tables don't get clipped by an ancestor
118
+ overflow:hidden such as dees-tile). Vertical sticky is handled by
119
+ a JS-managed floating header (.floatingHeader, position:fixed),
120
+ which is unaffected by ancestor overflow. */
116
121
  .tableScroll {
117
- /* enable horizontal scroll only when content exceeds width */
122
+ position: relative;
118
123
  overflow-x: auto;
119
- /* prevent vertical scroll inside the table container */
120
- overflow-y: hidden;
121
- /* avoid reserving extra space for classic scrollbars where possible */
124
+ overflow-y: visible;
125
+ scrollbar-gutter: stable;
126
+ }
127
+ /* Mode A, internal scroll: opt-in via fixed-height attribute.
128
+ The table scrolls inside its own box and the header sticks via plain CSS sticky. */
129
+ :host([fixed-height]) .tableScroll {
130
+ max-height: var(--table-max-height, 360px);
131
+ overflow: auto;
122
132
  scrollbar-gutter: stable both-edges;
123
133
  }
124
- /* Hide horizontal scrollbar entirely when not using sticky header */
125
- :host(:not([sticky-header])) .tableScroll {
126
- -ms-overflow-style: none; /* IE/Edge */
127
- scrollbar-width: none; /* Firefox (hides both axes) */
134
+ :host([fixed-height]) .tableScroll::-webkit-scrollbar:horizontal {
135
+ height: 0px;
128
136
  }
129
- :host(:not([sticky-header])) .tableScroll::-webkit-scrollbar {
130
- display: none; /* Chrome/Safari */
137
+
138
+ /* Floating header overlay (Mode B). Position is managed by JS so it
139
+ escapes any ancestor overflow:hidden (position:fixed is not clipped
140
+ by overflow ancestors). */
141
+ .floatingHeader {
142
+ position: fixed;
143
+ top: 0;
144
+ left: 0;
145
+ z-index: 100;
146
+ visibility: hidden;
147
+ overflow: hidden;
148
+ pointer-events: none;
131
149
  }
132
- /* In sticky-header mode, hide only the horizontal scrollbar in WebKit/Blink */
133
- :host([sticky-header]) .tableScroll::-webkit-scrollbar:horizontal {
134
- height: 0px;
150
+ .floatingHeader.active {
151
+ visibility: visible;
135
152
  }
136
- :host([sticky-header]) .tableScroll {
137
- max-height: var(--table-max-height, 360px);
138
- overflow: auto;
153
+ .floatingHeader table {
154
+ margin: 0;
155
+ }
156
+ .floatingHeader th {
157
+ pointer-events: auto;
139
158
  }
140
159
 
141
160
  table {
@@ -158,11 +177,20 @@ export const tableStyles = [
158
177
  background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 9%)')};
159
178
  border-bottom: 1px solid var(--dees-color-border-strong);
160
179
  }
161
- :host([sticky-header]) thead th {
180
+ /* th needs its own background so sticky cells paint over scrolled rows
181
+ (browsers don't paint the <thead> box behind a sticky <th>). */
182
+ th {
183
+ background: ${cssManager.bdTheme('hsl(210 40% 96.1%)', 'hsl(0 0% 9%)')};
184
+ }
185
+ /* Mode A — internal scroll sticky */
186
+ :host([fixed-height]) thead th {
162
187
  position: sticky;
163
188
  top: 0;
164
189
  z-index: 2;
165
190
  }
191
+ :host([fixed-height]) thead tr.filtersRow th {
192
+ top: 36px; /* matches th { height: 36px } below */
193
+ }
166
194
 
167
195
  tbody tr {
168
196
  transition: background-color 0.15s ease;
@@ -275,6 +303,32 @@ export const tableStyles = [
275
303
  color: ${cssManager.bdTheme('hsl(215.4 16.3% 46.9%)', 'hsl(215 20.2% 65.1%)')};
276
304
  letter-spacing: -0.01em;
277
305
  }
306
+
307
+ th[role='columnheader']:hover {
308
+ color: var(--dees-color-text-primary);
309
+ }
310
+
311
+ th .sortArrow {
312
+ display: inline-block;
313
+ margin-left: 6px;
314
+ font-size: 10px;
315
+ line-height: 1;
316
+ opacity: 0.7;
317
+ vertical-align: middle;
318
+ }
319
+
320
+ th .sortBadge {
321
+ display: inline-block;
322
+ margin-left: 3px;
323
+ padding: 1px 5px;
324
+ font-size: 10px;
325
+ font-weight: 600;
326
+ line-height: 1;
327
+ color: ${cssManager.bdTheme('hsl(222.2 47.4% 30%)', 'hsl(217.2 91.2% 75%)')};
328
+ background: ${cssManager.bdTheme('hsl(222.2 47.4% 51.2% / 0.12)', 'hsl(217.2 91.2% 59.8% / 0.18)')};
329
+ border-radius: 999px;
330
+ vertical-align: middle;
331
+ }
278
332
 
279
333
  :host([show-vertical-lines]) th {
280
334
  border-right: 1px solid var(--dees-color-border-default);
@@ -436,4 +490,4 @@ export const tableStyles = [
436
490
  }
437
491
  `,
438
492
  ];
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy10YWJsZS9zdHlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQWtCLE1BQU0sNkJBQTZCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFnQjtJQUN0QyxrQkFBa0I7SUFDbEIsVUFBVSxDQUFDLGFBQWE7SUFDeEIsR0FBRyxDQUFBOzs7Ozs7Ozs7dUJBU2tCLGtCQUFrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQWlDeEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQXlHcEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQzs7OztzQkFJL0QsVUFBVSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQXNDeEQsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsRUFBRSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O3NCQWVwRixVQUFVLENBQUMsT0FBTyxDQUFDLCtCQUErQixFQUFFLCtCQUErQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBbURwRixVQUFVLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFLCtCQUErQixDQUFDOzs7O3NCQUluRixVQUFVLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFLDhCQUE4QixDQUFDOzs7Ozs7Ozs7aUJBU3ZGLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQXdEL0QsVUFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUM7Ozs7Ozs7Ozs7d0JBVWxELFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsd0JBQXdCLENBQUM7OztnQ0FHOUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7c0JBYzVGLFVBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O2lCQWdCekQsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQzs7Ozs7O3NCQU0vRCxVQUFVLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLGlCQUFpQixDQUFDO2lCQUNoRSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUM7Ozs7c0JBSTlDLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFvQ2hFLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLENBQUM7Ozs7Ozs7O3NCQVEvRCxVQUFVLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDO2lCQUM3RCxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUM7Ozs7Ozs7R0FPakU7Q0FDRixDQUFDIn0=
493
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy10YWJsZS9zdHlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQWtCLE1BQU0sNkJBQTZCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFnQjtJQUN0QyxrQkFBa0I7SUFDbEIsVUFBVSxDQUFDLGFBQWE7SUFDeEIsR0FBRyxDQUFBOzs7Ozs7Ozs7dUJBU2tCLGtCQUFrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQWlDeEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkE0SHBFLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLENBQUM7Ozs7c0JBSS9ELFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDOzs7Ozs7c0JBTXhELFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkF5Q3hELFVBQVUsQ0FBQyxPQUFPLENBQUMsK0JBQStCLEVBQUUsK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztzQkFlcEYsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsRUFBRSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQW1EcEYsVUFBVSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSwrQkFBK0IsQ0FBQzs7OztzQkFJbkYsVUFBVSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7O2lCQVN2RixVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBd0JwRSxVQUFVLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQixDQUFDO3NCQUM3RCxVQUFVLENBQUMsT0FBTyxDQUFDLCtCQUErQixFQUFFLCtCQUErQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBeURwRixVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozt3QkFVbEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQzs7O2dDQUc5RCxVQUFVLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFLDhCQUE4QixDQUFDOzs7Ozs7Ozs7Ozs7OztzQkFjNUYsVUFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBZ0J6RCxVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDOzs7Ozs7c0JBTS9ELFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7aUJBQ2hFLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQzs7OztzQkFJOUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQW9DaEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7c0JBUS9ELFVBQVUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7aUJBQzdELFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQzs7Ozs7OztHQU9qRTtDQUNGLENBQUMifQ==
@@ -26,4 +26,12 @@ export interface Column<T = any> {
26
26
  filterable?: boolean;
27
27
  hidden?: boolean;
28
28
  }
29
+ /**
30
+ * One entry in a multi-column sort cascade. Order in the array reflects priority:
31
+ * index 0 is the primary sort key, index 1 the secondary tiebreaker, and so on.
32
+ */
33
+ export interface ISortDescriptor {
34
+ key: string;
35
+ dir: 'asc' | 'desc';
36
+ }
29
37
  export type TDisplayFunction<T = any> = (itemArg: T) => Record<string, any>;