@adia-ai/web-components 0.6.32 → 0.6.34

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 (164) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/components/accordion/accordion.css +2 -2
  3. package/components/action-list/action-list.css +2 -2
  4. package/components/agent-artifact/agent-artifact.css +31 -31
  5. package/components/agent-feedback-bar/agent-feedback-bar.css +10 -10
  6. package/components/agent-questions/agent-questions.css +57 -57
  7. package/components/agent-reasoning/agent-reasoning.css +62 -62
  8. package/components/agent-suggestions/agent-suggestions.css +4 -4
  9. package/components/agent-trace/agent-trace.css +53 -53
  10. package/components/alert/alert.css +41 -41
  11. package/components/avatar/avatar.css +27 -27
  12. package/components/badge/badge.css +27 -27
  13. package/components/block/block.css +16 -16
  14. package/components/breadcrumb/breadcrumb.css +23 -23
  15. package/components/button/button.css +101 -91
  16. package/components/calendar-grid/calendar-grid.a2ui.json +136 -0
  17. package/components/calendar-grid/calendar-grid.css +226 -0
  18. package/components/calendar-grid/calendar-grid.d.ts +37 -0
  19. package/components/calendar-grid/calendar-grid.js +17 -0
  20. package/components/calendar-grid/calendar-grid.yaml +116 -0
  21. package/components/calendar-grid/class.js +300 -0
  22. package/components/calendar-picker/calendar-picker.css +139 -139
  23. package/components/canvas/canvas.css +12 -12
  24. package/components/card/card.css +83 -83
  25. package/components/chart/chart.css +224 -224
  26. package/components/chart-legend/chart-legend.css +26 -26
  27. package/components/check/check.css +40 -40
  28. package/components/code/code.css +125 -125
  29. package/components/col/col.css +15 -15
  30. package/components/color-picker/color-picker.css +55 -55
  31. package/components/combobox/class.js +861 -0
  32. package/components/combobox/combobox.a2ui.json +363 -0
  33. package/components/combobox/combobox.css +244 -0
  34. package/components/combobox/combobox.d.ts +113 -0
  35. package/components/combobox/combobox.examples.md +59 -0
  36. package/components/combobox/combobox.js +17 -0
  37. package/components/combobox/combobox.test.js +181 -0
  38. package/components/combobox/combobox.yaml +369 -0
  39. package/components/command/command.css +90 -90
  40. package/components/date-range-picker/class.js +775 -0
  41. package/components/date-range-picker/date-range-picker.a2ui.json +300 -0
  42. package/components/date-range-picker/date-range-picker.css +178 -0
  43. package/components/date-range-picker/date-range-picker.d.ts +82 -0
  44. package/components/date-range-picker/date-range-picker.examples.md +37 -0
  45. package/components/date-range-picker/date-range-picker.js +17 -0
  46. package/components/date-range-picker/date-range-picker.test.js +387 -0
  47. package/components/date-range-picker/date-range-picker.yaml +285 -0
  48. package/components/datetime-picker/class.js +706 -0
  49. package/components/datetime-picker/datetime-picker.a2ui.json +334 -0
  50. package/components/datetime-picker/datetime-picker.css +150 -0
  51. package/components/datetime-picker/datetime-picker.d.ts +86 -0
  52. package/components/datetime-picker/datetime-picker.examples.md +46 -0
  53. package/components/datetime-picker/datetime-picker.js +17 -0
  54. package/components/datetime-picker/datetime-picker.test.js +454 -0
  55. package/components/datetime-picker/datetime-picker.yaml +332 -0
  56. package/components/demo-toggle/demo-toggle.css +27 -27
  57. package/components/description-list/description-list.css +18 -18
  58. package/components/divider/divider.css +24 -24
  59. package/components/embed/embed.css +6 -6
  60. package/components/empty-state/empty-state.css +27 -27
  61. package/components/feed/feed.css +12 -12
  62. package/components/field/field.css +37 -28
  63. package/components/field/field.test.js +32 -0
  64. package/components/fields/fields.css +5 -5
  65. package/components/grid/grid.css +5 -5
  66. package/components/heatmap/heatmap.css +63 -63
  67. package/components/icon/icon.css +12 -12
  68. package/components/image/image.css +14 -14
  69. package/components/index.js +8 -0
  70. package/components/input/input.css +66 -66
  71. package/components/inspector/inspector.css +6 -6
  72. package/components/integration-card/class.js +410 -0
  73. package/components/integration-card/integration-card.a2ui.json +268 -0
  74. package/components/integration-card/integration-card.css +169 -0
  75. package/components/integration-card/integration-card.d.ts +63 -0
  76. package/components/integration-card/integration-card.examples.md +41 -0
  77. package/components/integration-card/integration-card.js +17 -0
  78. package/components/integration-card/integration-card.test.js +306 -0
  79. package/components/integration-card/integration-card.yaml +280 -0
  80. package/components/kbd/kbd.css +32 -32
  81. package/components/link/link.css +12 -12
  82. package/components/list/list.css +8 -8
  83. package/components/list-window/class.js +688 -0
  84. package/components/list-window/list-window.a2ui.json +277 -0
  85. package/components/list-window/list-window.css +124 -0
  86. package/components/list-window/list-window.d.ts +84 -0
  87. package/components/list-window/list-window.examples.md +73 -0
  88. package/components/list-window/list-window.js +17 -0
  89. package/components/list-window/list-window.test.js +303 -0
  90. package/components/list-window/list-window.yaml +270 -0
  91. package/components/menu/menu.css +8 -8
  92. package/components/modal/modal.css +43 -43
  93. package/components/nav/nav.css +40 -40
  94. package/components/nav-group/nav-group.css +52 -52
  95. package/components/nav-item/nav-item.css +44 -44
  96. package/components/noodles/noodles.css +31 -31
  97. package/components/option-card/option-card.css +69 -69
  98. package/components/otp-input/otp-input.css +30 -30
  99. package/components/page/page.css +18 -18
  100. package/components/pagination/pagination.css +61 -61
  101. package/components/pane/pane.css +57 -57
  102. package/components/pipeline-status/pipeline-status.css +65 -65
  103. package/components/popover/popover.css +17 -17
  104. package/components/progress/progress.css +23 -23
  105. package/components/progress-row/progress-row.css +17 -17
  106. package/components/radio/radio.css +39 -39
  107. package/components/range/range.css +55 -55
  108. package/components/rating/rating.css +28 -28
  109. package/components/richtext/richtext.css +133 -133
  110. package/components/row/row.css +19 -19
  111. package/components/search/search.css +5 -5
  112. package/components/segment/segment.css +24 -24
  113. package/components/segmented/segmented.css +25 -25
  114. package/components/select/select.css +84 -84
  115. package/components/skeleton/skeleton.css +14 -14
  116. package/components/slider/slider.css +46 -46
  117. package/components/spinner/class.js +69 -0
  118. package/components/spinner/spinner.a2ui.json +197 -0
  119. package/components/spinner/spinner.css +165 -0
  120. package/components/spinner/spinner.d.ts +26 -0
  121. package/components/spinner/spinner.examples.md +26 -0
  122. package/components/spinner/spinner.js +17 -0
  123. package/components/spinner/spinner.test.js +234 -0
  124. package/components/spinner/spinner.yaml +230 -0
  125. package/components/stack/stack.css +11 -11
  126. package/components/stat/stat.css +25 -25
  127. package/components/step-progress/step-progress.css +20 -20
  128. package/components/stepper/stepper.css +29 -29
  129. package/components/stream/stream.css +12 -12
  130. package/components/swatch/swatch.css +68 -68
  131. package/components/swiper/swiper.css +57 -57
  132. package/components/switch/switch.css +52 -52
  133. package/components/table/class.js +9 -0
  134. package/components/table/table.a2ui.json +1 -1
  135. package/components/table/table.css +162 -162
  136. package/components/table/table.d.ts +1 -1
  137. package/components/table/table.test.js +53 -0
  138. package/components/table/table.yaml +13 -1
  139. package/components/table-toolbar/table-toolbar.css +32 -32
  140. package/components/tabs/tabs.css +51 -51
  141. package/components/tag/tag.css +48 -48
  142. package/components/text/text.css +44 -44
  143. package/components/textarea/textarea.css +46 -46
  144. package/components/time-picker/class.js +693 -0
  145. package/components/time-picker/time-picker.a2ui.json +267 -0
  146. package/components/time-picker/time-picker.css +122 -0
  147. package/components/time-picker/time-picker.d.ts +75 -0
  148. package/components/time-picker/time-picker.examples.md +35 -0
  149. package/components/time-picker/time-picker.js +17 -0
  150. package/components/time-picker/time-picker.test.js +287 -0
  151. package/components/time-picker/time-picker.yaml +256 -0
  152. package/components/timeline/timeline.css +50 -50
  153. package/components/toast/toast.css +58 -58
  154. package/components/toggle-group/toggle-group.css +6 -6
  155. package/components/toggle-scheme/toggle-scheme.css +2 -2
  156. package/components/toolbar/toolbar.css +17 -17
  157. package/components/tooltip/tooltip.css +2 -2
  158. package/components/tree/tree.css +37 -37
  159. package/components/upload/upload.css +49 -49
  160. package/dist/icons-manifest.js +3 -3
  161. package/dist/web-components.min.css +1 -1
  162. package/dist/web-components.min.js +121 -83
  163. package/package.json +1 -1
  164. package/styles/components.css +8 -0
@@ -1,95 +1,95 @@
1
1
  @scope (table-ui) {
2
2
  :where(:scope) {
3
3
  /* ── Tokens ── */
4
- --table-font-size: var(--a-ui-size);
5
- --table-heading-size: var(--a-ui-xs);
6
- --table-heading-weight: var(--a-weight-medium);
7
- --table-heading-tracking: 0.06em;
8
- --table-heading-fg: var(--a-fg-muted);
9
- --table-heading-bg: transparent;
10
-
11
- --table-fg: var(--a-fg);
12
- --table-fg-hover: var(--a-fg-strong);
13
- --table-fg-secondary: var(--a-fg-muted);
14
- --table-border: var(--a-border-subtle);
15
- --table-border-strong: var(--a-border);
16
- --table-py: var(--a-space-3);
17
- --table-px: var(--a-space-4);
18
-
19
- --table-row-bg: transparent;
20
- --table-row-bg-hover: var(--a-bg-hover);
21
- --table-row-bg-selected: var(--a-bg-selected);
22
- --table-row-bg-striped: var(--a-bg-subtle);
23
-
24
- --table-sort-fg: var(--a-fg-muted);
25
- --table-accent: var(--a-primary);
26
- --table-fg-disabled: var(--a-ui-text-disabled);
27
- --table-bg: var(--a-bg);
28
- --table-radius: var(--a-radius-lg);
4
+ --table-font-size-default: var(--a-ui-size);
5
+ --table-heading-size-default: var(--a-ui-xs);
6
+ --table-heading-weight-default: var(--a-weight-medium);
7
+ --table-heading-tracking-default: 0.06em;
8
+ --table-heading-fg-default: var(--a-fg-muted);
9
+ --table-heading-bg-default: transparent;
10
+
11
+ --table-fg-default: var(--a-fg);
12
+ --table-fg-hover-default: var(--a-fg-strong);
13
+ --table-fg-secondary-default: var(--a-fg-muted);
14
+ --table-border-default: var(--a-border-subtle);
15
+ --table-border-strong-default: var(--a-border);
16
+ --table-py-default: var(--a-space-3);
17
+ --table-px-default: var(--a-space-4);
18
+
19
+ --table-row-bg-default: transparent;
20
+ --table-row-bg-hover-default: var(--a-bg-hover);
21
+ --table-row-bg-selected-default: var(--a-bg-selected);
22
+ --table-row-bg-striped-default: var(--a-bg-subtle);
23
+
24
+ --table-sort-fg-default: var(--a-fg-muted);
25
+ --table-accent-default: var(--a-primary);
26
+ --table-fg-disabled-default: var(--a-ui-text-disabled);
27
+ --table-bg-default: var(--a-bg);
28
+ --table-radius-default: var(--a-radius-lg);
29
29
 
30
30
  /* ── Resize + pinned-column intrinsics ── */
31
- --table-resize-width: var(--a-space-1);
32
- --table-pin-shadow-width: var(--a-space-1);
33
- --table-cell-min-width: 11.25rem;
31
+ --table-resize-width-default: var(--a-space-1);
32
+ --table-pin-shadow-width-default: var(--a-space-1);
33
+ --table-cell-min-width-default: 11.25rem;
34
34
 
35
35
  /* ── Filter popover ── */
36
- --table-filter-bg: var(--a-canvas);
37
- --table-filter-fg: var(--a-canvas-text);
38
- --table-filter-border: var(--a-border);
39
- --table-filter-radius: var(--a-radius-md);
40
- --table-filter-inset: var(--a-space-2);
41
- --table-filter-gap: var(--a-space-1);
42
- --table-filter-shadow: var(--a-shadow-md);
43
- --table-filter-input-py: var(--a-space-1);
44
- --table-filter-input-px: var(--a-space-2);
45
- --table-filter-input-radius: var(--a-radius-sm);
46
- --table-filter-input-size: var(--a-ui-tiny);
47
- --table-filter-btn-px: var(--a-space-1);
48
- --table-filter-clear-fg: var(--a-accent);
36
+ --table-filter-bg-default: var(--a-canvas);
37
+ --table-filter-fg-default: var(--a-canvas-text);
38
+ --table-filter-border-default: var(--a-border);
39
+ --table-filter-radius-default: var(--a-radius-md);
40
+ --table-filter-inset-default: var(--a-space-2);
41
+ --table-filter-gap-default: var(--a-space-1);
42
+ --table-filter-shadow-default: var(--a-shadow-md);
43
+ --table-filter-input-py-default: var(--a-space-1);
44
+ --table-filter-input-px-default: var(--a-space-2);
45
+ --table-filter-input-radius-default: var(--a-radius-sm);
46
+ --table-filter-input-size-default: var(--a-ui-tiny);
47
+ --table-filter-btn-px-default: var(--a-space-1);
48
+ --table-filter-clear-fg-default: var(--a-accent);
49
49
 
50
50
  /* ── Chips / filter bar ── */
51
- --table-chip-bar-bg: var(--a-canvas-subtle);
52
- --table-chip-bar-border: var(--a-border);
53
- --table-chip-bar-gap: var(--a-space-1);
54
- --table-chip-bar-py: var(--a-space-1);
55
- --table-chip-bar-px: var(--a-space-2);
56
- --table-chip-dismiss-gap: var(--a-space-1);
51
+ --table-chip-bar-bg-default: var(--a-canvas-subtle);
52
+ --table-chip-bar-border-default: var(--a-border);
53
+ --table-chip-bar-gap-default: var(--a-space-1);
54
+ --table-chip-bar-py-default: var(--a-space-1);
55
+ --table-chip-bar-px-default: var(--a-space-2);
56
+ --table-chip-dismiss-gap-default: var(--a-space-1);
57
57
 
58
58
  /* ── Detail / expansion row ── */
59
- --table-detail-bg: var(--a-canvas-subtle);
60
- --table-detail-border: var(--a-border);
61
- --table-detail-py: var(--a-space-3);
62
- --table-detail-px: var(--a-space-4);
59
+ --table-detail-bg-default: var(--a-canvas-subtle);
60
+ --table-detail-border-default: var(--a-border);
61
+ --table-detail-py-default: var(--a-space-3);
62
+ --table-detail-px-default: var(--a-space-4);
63
63
 
64
64
  /* ── Pinning ── */
65
- --table-pinned-bg: var(--a-canvas);
66
- --table-pinned-shadow: var(--a-chrome-shadow-soft);
65
+ --table-pinned-bg-default: var(--a-canvas);
66
+ --table-pinned-shadow-default: var(--a-chrome-shadow-soft);
67
67
 
68
68
  /* ── Aggregation row ── */
69
- --table-agg-border: var(--a-border);
70
- --table-agg-size: var(--a-ui-tiny);
71
- --table-agg-py: var(--a-space-2);
72
- --table-agg-px: var(--a-space-3);
69
+ --table-agg-border-default: var(--a-border);
70
+ --table-agg-size-default: var(--a-ui-tiny);
71
+ --table-agg-py-default: var(--a-space-2);
72
+ --table-agg-px-default: var(--a-space-3);
73
73
 
74
74
  /* ── Sort priority badge ── */
75
- --table-sort-priority-fg: var(--a-chrome-light);
75
+ --table-sort-priority-fg-default: var(--a-chrome-light);
76
76
 
77
77
  /* ── Sort icon gap ── */
78
- --table-sort-icon-gap: var(--a-space-1);
78
+ --table-sort-icon-gap-default: var(--a-space-1);
79
79
 
80
80
  /* ── Footer / pagination ── */
81
- --table-footer-py: var(--a-space-3);
81
+ --table-footer-py-default: var(--a-space-3);
82
82
 
83
83
  /* ── Overlays ── */
84
- --table-overlay-gap: var(--a-space-3);
85
- --table-overlay-pad: var(--a-space-8);
84
+ --table-overlay-gap-default: var(--a-space-3);
85
+ --table-overlay-pad-default: var(--a-space-8);
86
86
 
87
87
  /* ── Transitions ── */
88
- --table-duration: var(--a-duration-fast);
89
- --table-easing: var(--a-easing);
88
+ --table-duration-default: var(--a-duration-fast);
89
+ --table-easing-default: var(--a-easing);
90
90
 
91
91
  /* ── State ── */
92
- --table-focus-ring: var(--a-focus-ring);
92
+ --table-focus-ring-default: var(--a-focus-ring);
93
93
 
94
94
  /* ── Z-index layers ── */
95
95
  --_z-cell: 0;
@@ -104,11 +104,11 @@
104
104
  box-sizing: border-box;
105
105
  display: grid;
106
106
  overflow-x: auto;
107
- font-size: var(--table-font-size);
108
- color: var(--table-fg);
109
- background: var(--table-bg);
110
- border: 1px solid var(--table-border);
111
- border-radius: var(--table-radius);
107
+ font-size: var(--table-font-size, var(--table-font-size-default));
108
+ color: var(--table-fg, var(--table-fg-default));
109
+ background: var(--table-bg, var(--table-bg-default));
110
+ border: 1px solid var(--table-border, var(--table-border-default));
111
+ border-radius: var(--table-radius, var(--table-radius-default));
112
112
  position: relative;
113
113
  /* Own stacking context — sticky headers, pinned columns, and filter
114
114
  dropdowns use internal z-indices that must not leak to parents. */
@@ -144,11 +144,11 @@
144
144
  /* ═══════ Header row ═══════ */
145
145
 
146
146
  [data-header] {
147
- border-bottom: 1px solid var(--table-border-strong);
147
+ border-bottom: 1px solid var(--table-border-strong, var(--table-border-strong-default));
148
148
  position: sticky;
149
149
  top: 0;
150
150
  z-index: var(--_z-header);
151
- background: var(--table-bg);
151
+ background: var(--table-bg, var(--table-bg-default));
152
152
  }
153
153
 
154
154
  /* ═══════ Column headers ═══════ */
@@ -156,13 +156,13 @@
156
156
  [role="columnheader"] {
157
157
  box-sizing: border-box;
158
158
  text-align: left;
159
- padding: var(--table-py) var(--table-px);
160
- font-size: var(--table-heading-size);
161
- font-weight: var(--table-heading-weight);
162
- color: var(--table-heading-fg);
163
- background: var(--table-heading-bg);
159
+ padding: var(--table-py, var(--table-py-default)) var(--table-px, var(--table-px-default));
160
+ font-size: var(--table-heading-size, var(--table-heading-size-default));
161
+ font-weight: var(--table-heading-weight, var(--table-heading-weight-default));
162
+ color: var(--table-heading-fg, var(--table-heading-fg-default));
163
+ background: var(--table-heading-bg, var(--table-heading-bg-default));
164
164
  text-transform: uppercase;
165
- letter-spacing: var(--table-heading-tracking);
165
+ letter-spacing: var(--table-heading-tracking, var(--table-heading-tracking-default));
166
166
  white-space: nowrap;
167
167
  position: relative;
168
168
  display: flex;
@@ -186,31 +186,31 @@
186
186
  cursor: pointer;
187
187
  user-select: none;
188
188
  -webkit-user-select: none;
189
- transition: color var(--table-duration) var(--table-easing);
189
+ transition: color var(--table-duration, var(--table-duration-default)) var(--table-easing, var(--table-easing-default));
190
190
  }
191
191
 
192
192
  [data-sort-key]:hover {
193
- color: var(--table-fg);
193
+ color: var(--table-fg, var(--table-fg-default));
194
194
  }
195
195
 
196
196
  /* ═══════ Sort indicator ═══════ */
197
197
 
198
198
  [data-sort-icon] {
199
- color: var(--table-sort-fg);
200
- margin-inline-start: var(--table-sort-icon-gap);
199
+ color: var(--table-sort-fg, var(--table-sort-fg-default));
200
+ margin-inline-start: var(--table-sort-icon-gap, var(--table-sort-icon-gap-default));
201
201
  vertical-align: middle;
202
202
  --a-icon-size: 0.75em;
203
203
  }
204
204
 
205
205
  [aria-sort] [data-sort-icon] {
206
- color: var(--table-fg);
206
+ color: var(--table-fg, var(--table-fg-default));
207
207
  }
208
208
 
209
209
  [data-sort-priority] {
210
210
  display: inline-flex;
211
211
  font-size: 0.6em;
212
- background: var(--table-accent);
213
- color: var(--table-sort-priority-fg);
212
+ background: var(--table-accent, var(--table-accent-default));
213
+ color: var(--table-sort-priority-fg, var(--table-sort-priority-fg-default));
214
214
  width: 1em;
215
215
  height: 1em;
216
216
  border-radius: 50%;
@@ -226,8 +226,8 @@
226
226
  display: flex;
227
227
  align-items: center;
228
228
  align-self: stretch;
229
- padding: var(--table-py) var(--table-px);
230
- border-bottom: 1px solid var(--table-border);
229
+ padding: var(--table-py, var(--table-py-default)) var(--table-px, var(--table-px-default));
230
+ border-bottom: 1px solid var(--table-border, var(--table-border-default));
231
231
  min-width: 0;
232
232
  /* Default: single line with ellipsis. Authors opt in to wrapping
233
233
  via [wrap] on the host (whole table) or [data-wrap] on a column /
@@ -299,17 +299,17 @@
299
299
  /* ═══════ Row states ═══════ */
300
300
 
301
301
  [data-body] > [role="row"] {
302
- background: var(--table-row-bg);
303
- transition: background var(--table-duration) var(--table-easing);
302
+ background: var(--table-row-bg, var(--table-row-bg-default));
303
+ transition: background var(--table-duration, var(--table-duration-default)) var(--table-easing, var(--table-easing-default));
304
304
  }
305
305
 
306
306
  [data-body] > [role="row"]:hover {
307
- background: var(--table-row-bg-hover);
308
- color: var(--table-fg-hover);
307
+ background: var(--table-row-bg-hover, var(--table-row-bg-hover-default));
308
+ color: var(--table-fg-hover, var(--table-fg-hover-default));
309
309
  }
310
310
 
311
311
  [data-selected] {
312
- background: var(--table-row-bg-selected);
312
+ background: var(--table-row-bg-selected, var(--table-row-bg-selected-default));
313
313
  }
314
314
 
315
315
  /* ═══════ Striped ═══════ */
@@ -319,11 +319,11 @@
319
319
  }
320
320
 
321
321
  :scope[striped] [data-body] > [role="row"]:nth-child(even) {
322
- background: var(--table-row-bg-striped);
322
+ background: var(--table-row-bg-striped, var(--table-row-bg-striped-default));
323
323
  }
324
324
 
325
325
  :scope[striped] [data-body] > [role="row"]:nth-child(even):hover {
326
- background: var(--table-row-bg-hover);
326
+ background: var(--table-row-bg-hover, var(--table-row-bg-hover-default));
327
327
  }
328
328
 
329
329
  /* ═══════ Selection checkboxes ═══════ */
@@ -340,12 +340,12 @@
340
340
  /* ═══════ Density ═══════ */
341
341
 
342
342
  :scope[density="compact"] {
343
- --table-py: var(--a-space-1);
344
- --table-px: var(--a-space-2);
343
+ --table-py-default: var(--a-space-1);
344
+ --table-px-default: var(--a-space-2);
345
345
  }
346
346
 
347
347
  :scope[density="comfortable"] {
348
- --table-py: var(--a-space-4);
348
+ --table-py-default: var(--a-space-4);
349
349
  }
350
350
 
351
351
  /* ═══════ Pinned cells ═══════ */
@@ -354,14 +354,14 @@
354
354
  position: sticky;
355
355
  left: var(--_pin-left, 0);
356
356
  z-index: var(--_z-pinned);
357
- background: var(--table-bg);
357
+ background: var(--table-bg, var(--table-bg-default));
358
358
  }
359
359
 
360
360
  [data-pinned="right"] {
361
361
  position: sticky;
362
362
  right: var(--_pin-right, 0);
363
363
  z-index: var(--_z-pinned);
364
- background: var(--table-bg);
364
+ background: var(--table-bg, var(--table-bg-default));
365
365
  }
366
366
 
367
367
  [data-header] [data-pinned] {
@@ -372,17 +372,17 @@
372
372
 
373
373
  [data-resize-handle] {
374
374
  position: absolute;
375
- right: calc(-1 * var(--table-resize-width) / 2);
375
+ right: calc(-1 * var(--table-resize-width, var(--table-resize-width-default)) / 2);
376
376
  top: 0;
377
377
  bottom: 0;
378
- width: var(--table-resize-width);
378
+ width: var(--table-resize-width, var(--table-resize-width-default));
379
379
  cursor: col-resize;
380
380
  z-index: 1;
381
381
  }
382
382
 
383
383
  [data-resize-handle]:hover,
384
384
  [data-resize-handle][data-resizing] {
385
- background: var(--table-accent);
385
+ background: var(--table-accent, var(--table-accent-default));
386
386
  }
387
387
 
388
388
  /* ═══════ Footer / pagination ═══════ */
@@ -391,10 +391,10 @@
391
391
  display: flex;
392
392
  align-items: center;
393
393
  justify-content: space-between;
394
- padding: var(--table-footer-py) var(--table-px);
395
- font-size: var(--table-heading-size);
396
- color: var(--table-heading-fg);
397
- border-top: 1px solid var(--table-border);
394
+ padding: var(--table-footer-py, var(--table-footer-py-default)) var(--table-px, var(--table-px-default));
395
+ font-size: var(--table-heading-size, var(--table-heading-size-default));
396
+ color: var(--table-heading-fg, var(--table-heading-fg-default));
397
+ border-top: 1px solid var(--table-border, var(--table-border-default));
398
398
  }
399
399
 
400
400
  /* ═══════ Overlays (empty / loading / error) ═══════ */
@@ -407,15 +407,15 @@
407
407
  flex-direction: column;
408
408
  align-items: center;
409
409
  justify-content: center;
410
- gap: var(--table-overlay-gap);
411
- padding: var(--table-overlay-pad);
412
- color: var(--table-heading-fg);
410
+ gap: var(--table-overlay-gap, var(--table-overlay-gap-default));
411
+ padding: var(--table-overlay-pad, var(--table-overlay-pad-default));
412
+ color: var(--table-heading-fg, var(--table-heading-fg-default));
413
413
  }
414
414
 
415
415
  /* ═══════ Keyboard focus ═══════ */
416
416
 
417
417
  [data-focused] {
418
- outline: 2px solid var(--table-accent);
418
+ outline: 2px solid var(--table-accent, var(--table-accent-default));
419
419
  outline-offset: -2px;
420
420
  }
421
421
 
@@ -423,12 +423,12 @@
423
423
 
424
424
  :scope[disabled] {
425
425
  pointer-events: none;
426
- color: var(--table-fg-disabled);
426
+ color: var(--table-fg-disabled, var(--table-fg-disabled-default));
427
427
  }
428
428
 
429
429
  :scope[disabled] [data-body] > [role="row"]:hover {
430
- background: var(--table-row-bg);
431
- color: var(--table-fg-disabled);
430
+ background: var(--table-row-bg, var(--table-row-bg-default));
431
+ color: var(--table-fg-disabled, var(--table-fg-disabled-default));
432
432
  }
433
433
 
434
434
  /* ═══════ Loading (skeleton rows) ═══════
@@ -460,7 +460,7 @@
460
460
  all: unset;
461
461
  cursor: pointer;
462
462
  opacity: 0.5;
463
- padding: 0 var(--table-filter-btn-px);
463
+ padding: 0 var(--table-filter-btn-px, var(--table-filter-btn-px-default));
464
464
  &:hover { opacity: 1; }
465
465
  }
466
466
 
@@ -471,55 +471,55 @@
471
471
  top: 100%;
472
472
  left: 0;
473
473
  right: 0;
474
- min-width: var(--table-cell-min-width);
474
+ min-width: var(--table-cell-min-width, var(--table-cell-min-width-default));
475
475
  z-index: 10;
476
- background: var(--table-filter-bg);
477
- border: 1px solid var(--table-filter-border);
478
- border-radius: var(--table-filter-radius);
479
- padding: var(--table-filter-inset);
480
- box-shadow: var(--table-filter-shadow);
476
+ background: var(--table-filter-bg, var(--table-filter-bg-default));
477
+ border: 1px solid var(--table-filter-border, var(--table-filter-border-default));
478
+ border-radius: var(--table-filter-radius, var(--table-filter-radius-default));
479
+ padding: var(--table-filter-inset, var(--table-filter-inset-default));
480
+ box-shadow: var(--table-filter-shadow, var(--table-filter-shadow-default));
481
481
  display: flex;
482
482
  flex-direction: column;
483
- gap: var(--table-filter-gap);
483
+ gap: var(--table-filter-gap, var(--table-filter-gap-default));
484
484
  }
485
485
 
486
486
  [data-filter-input] {
487
487
  width: 100%;
488
- padding: var(--table-filter-input-py) var(--table-filter-input-px);
489
- border: 1px solid var(--table-filter-border);
490
- border-radius: var(--table-filter-input-radius);
488
+ padding: var(--table-filter-input-py, var(--table-filter-input-py-default)) var(--table-filter-input-px, var(--table-filter-input-px-default));
489
+ border: 1px solid var(--table-filter-border, var(--table-filter-border-default));
490
+ border-radius: var(--table-filter-input-radius, var(--table-filter-input-radius-default));
491
491
  font: inherit;
492
- font-size: var(--table-filter-input-size);
493
- background: var(--table-filter-bg);
494
- color: var(--table-filter-fg);
492
+ font-size: var(--table-filter-input-size, var(--table-filter-input-size-default));
493
+ background: var(--table-filter-bg, var(--table-filter-bg-default));
494
+ color: var(--table-filter-fg, var(--table-filter-fg-default));
495
495
  }
496
496
 
497
497
  [data-filter-op] {
498
- padding: var(--table-filter-input-py);
499
- border: 1px solid var(--table-filter-border);
500
- border-radius: var(--table-filter-input-radius);
498
+ padding: var(--table-filter-input-py, var(--table-filter-input-py-default));
499
+ border: 1px solid var(--table-filter-border, var(--table-filter-border-default));
500
+ border-radius: var(--table-filter-input-radius, var(--table-filter-input-radius-default));
501
501
  font: inherit;
502
- font-size: var(--table-filter-input-size);
503
- background: var(--table-filter-bg);
504
- color: var(--table-filter-fg);
502
+ font-size: var(--table-filter-input-size, var(--table-filter-input-size-default));
503
+ background: var(--table-filter-bg, var(--table-filter-bg-default));
504
+ color: var(--table-filter-fg, var(--table-filter-fg-default));
505
505
  }
506
506
 
507
507
  [data-filter-option] {
508
508
  display: flex;
509
509
  align-items: center;
510
- gap: var(--table-filter-gap);
511
- font-size: var(--table-filter-input-size);
510
+ gap: var(--table-filter-gap, var(--table-filter-gap-default));
511
+ font-size: var(--table-filter-input-size, var(--table-filter-input-size-default));
512
512
  cursor: pointer;
513
- padding: var(--table-filter-input-py) 0;
513
+ padding: var(--table-filter-input-py, var(--table-filter-input-py-default)) 0;
514
514
  }
515
515
 
516
516
  [data-filter-clear] {
517
517
  all: unset;
518
518
  cursor: pointer;
519
- font-size: var(--table-filter-input-size);
520
- color: var(--table-filter-clear-fg);
519
+ font-size: var(--table-filter-input-size, var(--table-filter-input-size-default));
520
+ color: var(--table-filter-clear-fg, var(--table-filter-clear-fg-default));
521
521
  text-align: center;
522
- padding: var(--table-filter-input-py);
522
+ padding: var(--table-filter-input-py, var(--table-filter-input-py-default));
523
523
  &:hover { text-decoration: underline; }
524
524
  }
525
525
 
@@ -530,16 +530,16 @@
530
530
  display: flex;
531
531
  flex-wrap: wrap;
532
532
  align-items: center;
533
- gap: var(--table-chip-bar-gap);
534
- padding: var(--table-chip-bar-py) var(--table-chip-bar-px);
535
- border-bottom: 1px solid var(--table-chip-bar-border);
536
- background: var(--table-chip-bar-bg);
533
+ gap: var(--table-chip-bar-gap, var(--table-chip-bar-gap-default));
534
+ padding: var(--table-chip-bar-py, var(--table-chip-bar-py-default)) var(--table-chip-bar-px, var(--table-chip-bar-px-default));
535
+ border-bottom: 1px solid var(--table-chip-bar-border, var(--table-chip-bar-border-default));
536
+ background: var(--table-chip-bar-bg, var(--table-chip-bar-bg-default));
537
537
  }
538
538
 
539
539
  [data-chip-dismiss] {
540
540
  all: unset;
541
541
  cursor: pointer;
542
- margin-left: var(--table-chip-dismiss-gap);
542
+ margin-left: var(--table-chip-dismiss-gap, var(--table-chip-dismiss-gap-default));
543
543
  opacity: 0.6;
544
544
  &:hover { opacity: 1; }
545
545
  }
@@ -547,9 +547,9 @@
547
547
  [data-filter-clear-all] {
548
548
  all: unset;
549
549
  cursor: pointer;
550
- font-size: var(--table-filter-input-size);
551
- color: var(--table-filter-clear-fg);
552
- padding: var(--table-chip-bar-py) var(--table-chip-bar-px);
550
+ font-size: var(--table-filter-input-size, var(--table-filter-input-size-default));
551
+ color: var(--table-filter-clear-fg, var(--table-filter-clear-fg-default));
552
+ padding: var(--table-chip-bar-py, var(--table-chip-bar-py-default)) var(--table-chip-bar-px, var(--table-chip-bar-px-default));
553
553
  &:hover { text-decoration: underline; }
554
554
  }
555
555
 
@@ -557,9 +557,9 @@
557
557
 
558
558
  [data-detail-row] {
559
559
  grid-column: 1 / -1;
560
- padding: var(--table-detail-py) var(--table-detail-px);
561
- background: var(--table-detail-bg);
562
- border-bottom: 1px solid var(--table-detail-border);
560
+ padding: var(--table-detail-py, var(--table-detail-py-default)) var(--table-detail-px, var(--table-detail-px-default));
561
+ background: var(--table-detail-bg, var(--table-detail-bg-default));
562
+ border-bottom: 1px solid var(--table-detail-border, var(--table-detail-border-default));
563
563
  }
564
564
 
565
565
  [data-expand-toggle] {
@@ -568,7 +568,7 @@
568
568
  display: flex;
569
569
  align-items: center;
570
570
  justify-content: center;
571
- transition: transform var(--table-duration) var(--table-easing);
571
+ transition: transform var(--table-duration, var(--table-duration-default)) var(--table-easing, var(--table-easing-default));
572
572
  }
573
573
 
574
574
  [data-expanded] [data-expand-toggle] {
@@ -580,25 +580,25 @@
580
580
  [data-pinned] {
581
581
  position: sticky;
582
582
  z-index: 1;
583
- background: var(--table-pinned-bg);
583
+ background: var(--table-pinned-bg, var(--table-pinned-bg-default));
584
584
  }
585
585
 
586
586
  [data-pinned="left"]::after {
587
587
  content: '';
588
588
  position: absolute;
589
- right: calc(-1 * var(--table-pin-shadow-width)); top: 0; bottom: 0;
590
- width: var(--table-pin-shadow-width);
589
+ right: calc(-1 * var(--table-pin-shadow-width, var(--table-pin-shadow-width-default))); top: 0; bottom: 0;
590
+ width: var(--table-pin-shadow-width, var(--table-pin-shadow-width-default));
591
591
  pointer-events: none;
592
- background: linear-gradient(to right, var(--table-pinned-shadow), transparent);
592
+ background: linear-gradient(to right, var(--table-pinned-shadow, var(--table-pinned-shadow-default)), transparent);
593
593
  }
594
594
 
595
595
  [data-pinned="right"]::before {
596
596
  content: '';
597
597
  position: absolute;
598
- left: calc(-1 * var(--table-pin-shadow-width)); top: 0; bottom: 0;
599
- width: var(--table-pin-shadow-width);
598
+ left: calc(-1 * var(--table-pin-shadow-width, var(--table-pin-shadow-width-default))); top: 0; bottom: 0;
599
+ width: var(--table-pin-shadow-width, var(--table-pin-shadow-width-default));
600
600
  pointer-events: none;
601
- background: linear-gradient(to left, var(--table-pinned-shadow), transparent);
601
+ background: linear-gradient(to left, var(--table-pinned-shadow, var(--table-pinned-shadow-default)), transparent);
602
602
  }
603
603
 
604
604
  /* ═══════ Aggregation Footer ═══════ */
@@ -607,13 +607,13 @@
607
607
  display: grid;
608
608
  grid-template-columns: subgrid;
609
609
  grid-column: 1 / -1;
610
- border-top: 2px solid var(--table-agg-border);
610
+ border-top: 2px solid var(--table-agg-border, var(--table-agg-border-default));
611
611
  font-weight: 600;
612
- font-size: var(--table-agg-size);
613
- color: var(--table-fg-secondary);
612
+ font-size: var(--table-agg-size, var(--table-agg-size-default));
613
+ color: var(--table-fg-secondary, var(--table-fg-secondary-default));
614
614
  }
615
615
 
616
616
  [data-agg-row] > [role="gridcell"] {
617
- padding: var(--table-agg-py) var(--table-agg-px);
617
+ padding: var(--table-agg-py, var(--table-agg-py-default)) var(--table-agg-px, var(--table-agg-px-default));
618
618
  }
619
619
  }
@@ -98,7 +98,7 @@ export class UITable extends UIElement {
98
98
  loading: boolean;
99
99
  /** Rows per page. 0 = show all rows without pagination. When > 0, renders a pagination bar below the table. */
100
100
  paginate: number;
101
- /** Raw mode */
101
+ /** Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom "No data" overlay. v0.6.33+ matches the documented contract. */
102
102
  raw: boolean;
103
103
  /** Global search/filter string. Filters visible rows across all columns using case-insensitive substring matching. Resets to page 1 on change. */
104
104
  search: string;
@@ -283,3 +283,56 @@ describe('table-ui — FB-47 keyboard: Enter activates focused body cell', () =>
283
283
  expect(cellClickFired).toBe(false);
284
284
  });
285
285
  });
286
+
287
+ /**
288
+ * Raw mode: visual-only passthrough — consumer owns the body shape.
289
+ *
290
+ * Pre-v0.6.33 (FB-53 §2), `<table-ui raw>` only applied the CSS chrome
291
+ * reset (background/border/radius transparent) but the data lifecycle
292
+ * still ran. With `.data === []` (the natural state when wrapping a
293
+ * consumer-authored native <table>), `#renderOverlays` injected a
294
+ * [data-empty] "No data" placeholder above the consumer's content.
295
+ *
296
+ * v0.6.33 short-circuits `render()` at the top when `this.raw` is set:
297
+ * no header injection, no body reconciliation, no overlays, no
298
+ * aggregation, no pagination.
299
+ */
300
+ describe('table-ui — raw mode passthrough (FB-53 §2)', () => {
301
+ beforeEach(() => { document.body.innerHTML = ''; });
302
+
303
+ it('raw mode does NOT inject [data-empty] overlay when .data is empty', async () => {
304
+ const el = mount('<table-ui raw><table><tr><td>foo</td></tr></table></table-ui>');
305
+ // No .data set → empty by default. Without the raw early-return,
306
+ // #renderOverlays would create the [data-empty] placeholder.
307
+ await raf();
308
+ expect(el.querySelector(':scope > [data-empty]')).toBeNull();
309
+ // Consumer's native <table> survives untouched.
310
+ expect(el.querySelector(':scope > table')).not.toBeNull();
311
+ });
312
+
313
+ it('raw mode does NOT inject [data-header] or [data-body] rowgroups', async () => {
314
+ const el = mount('<table-ui raw><table><tr><td>x</td></tr></table></table-ui>');
315
+ await raf();
316
+ expect(el.querySelector(':scope > [data-header]')).toBeNull();
317
+ expect(el.querySelector(':scope > [data-body]')).toBeNull();
318
+ });
319
+
320
+ it('raw mode preserves consumer markup even when .columns + .data are set', async () => {
321
+ const el = mount('<table-ui raw><table id="consumer"><tr><td>consumer-owned</td></tr></table></table-ui>');
322
+ el.columns = COLS;
323
+ el.data = ROWS;
324
+ await raf();
325
+ // The consumer's native <table> is still the only table-shaped child.
326
+ expect(el.querySelector('#consumer')).not.toBeNull();
327
+ expect(el.querySelectorAll(':scope > [role="rowgroup"]').length).toBe(0);
328
+ });
329
+
330
+ it('non-raw mode (default) still injects header + body rowgroups', async () => {
331
+ const el = mount('<table-ui></table-ui>');
332
+ el.columns = COLS;
333
+ el.data = ROWS;
334
+ await raf();
335
+ expect(el.querySelector(':scope > [data-header]')).not.toBeNull();
336
+ expect(el.querySelector(':scope > [data-body]')).not.toBeNull();
337
+ });
338
+ });