@xplortech/apollo-react 2.7.0 → 2.8.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.
package/css/apollo.css CHANGED
@@ -4515,10 +4515,16 @@ button.xpl-button--loading.xpl-button--tertiary,
4515
4515
  /* @floating/ui now calculates the position for the dropdown */
4516
4516
 
4517
4517
  .xpl-dropdown--anchor-to-trigger {
4518
- position: fixed;
4519
- margin: 0px;
4520
- transform: none;
4521
- }
4518
+ will-change: transform;
4519
+
4520
+ /* Cancel base `-translate-y-2` / `--open` `translate-y-2`; Floating UI owns `transform`. */
4521
+
4522
+ position: fixed;
4523
+
4524
+ margin: 0px;
4525
+
4526
+ transform: none;
4527
+ }
4522
4528
 
4523
4529
  .xpl-dropdown--above {
4524
4530
  margin-top: 0px;
@@ -4663,38 +4669,28 @@ button.xpl-button--loading.xpl-button--tertiary,
4663
4669
  .xpl-dynamic-table-cell {
4664
4670
  border-right-width: 1px;
4665
4671
  border-bottom-width: 1px;
4672
+ border-color: var(--xpl-color-gray-400);
4666
4673
  vertical-align: middle;
4667
4674
  display: flex;
4675
+ height: 3.5rem;
4676
+ min-width: 3rem;
4668
4677
  align-items: center;
4669
4678
  justify-content: center;
4670
4679
  overflow: hidden;
4671
4680
  text-overflow: ellipsis;
4672
4681
  white-space: nowrap;
4673
4682
  overflow-wrap: break-word;
4683
+ padding: 1rem;
4674
4684
  text-align: left;
4675
4685
 
4676
- border-color: var(--xpl-border-default);
4677
- padding: calc(var(--xpl-space-10) + 1px) var(--xpl-space-16);
4678
- min-height: var(--xpl-size-350);
4679
- background-color: var(--xpl-background-surface-default);
4680
- color: var(--xpl-text-default);
4681
- font-family: var(--xpl-font-family-default);
4682
- font-size: var(--xpl-font-size-title-5);
4686
+ background-color: var(--xpl-color-foreground-lm);
4687
+ color: var(--xpl-color-text-primary-lm);
4688
+ font-size: var(--xpl-size-font-title-5);
4683
4689
  font-weight: var(--xpl-font-weight-medium);
4684
4690
  }
4685
4691
 
4686
- .xpl-dynamic-table-cell:has(button[dropdown]) {
4687
- padding: 0;
4688
- }
4689
-
4690
- /* Checkbox-only column: Figma py-20 / px-16 */
4691
-
4692
- .xpl-dynamic-table-cell:has(> xpl-checkbox:first-child:last-child) {
4693
- padding: calc(var(--xpl-space-16) + var(--xpl-space-4)) var(--xpl-space-16);
4694
- }
4695
-
4696
4692
  .xpl-dynamic-table-cell .xpl-checkbox-radio-container {
4697
- margin-bottom: 0px;
4693
+ margin-bottom: 0.25rem;
4698
4694
  }
4699
4695
 
4700
4696
  .xpl-dynamic-table-cell .xpl-checkbox-radio-container .xpl-label {
@@ -4702,8 +4698,8 @@ button.xpl-button--loading.xpl-button--tertiary,
4702
4698
  }
4703
4699
 
4704
4700
  .xpl-dynamic-table-cell xpl-avatar {
4705
- margin-right: var(--xpl-space-8);
4706
- }
4701
+ padding-right: 0.5rem;
4702
+ }
4707
4703
 
4708
4704
  .xpl-dynamic-table-cell button[dropdown] {
4709
4705
  display: flex;
@@ -4712,25 +4708,22 @@ button.xpl-button--loading.xpl-button--tertiary,
4712
4708
  flex-direction: row;
4713
4709
  align-items: center;
4714
4710
  justify-content: center;
4711
+ padding: 1rem;
4715
4712
  outline: 2px solid transparent;
4716
4713
  outline-offset: 2px;
4717
-
4718
- padding: calc(var(--xpl-space-10) + 1px) var(--xpl-space-16);
4719
4714
  }
4720
4715
 
4721
4716
  .xpl-dynamic-table-cell button[dropdown] xpl-icon {
4722
- margin-left: var(--xpl-space-8);
4723
- }
4717
+ margin-left: 0.5rem;
4718
+ }
4724
4719
 
4725
- .xpl-dynamic-table-cell button[dropdown]:focus-visible {
4726
- outline-color: var(--xpl-border-focus);
4727
- outline-width: 2px;
4728
- outline-offset: 2px;
4720
+ .xpl-dynamic-table-cell button[dropdown]:focus {
4721
+ box-shadow: inset 0 0 0 1px var(--xpl-color-purple-700);
4729
4722
  }
4730
4723
 
4731
4724
  .xpl-dynamic-table-cell button[dropdown]:disabled {
4732
- cursor: not-allowed;
4733
- }
4725
+ cursor: not-allowed;
4726
+ }
4734
4727
 
4735
4728
  .xpl-dynamic-table-cell span:not(button[dropdown] span) {
4736
4729
  margin-right: auto;
@@ -4744,23 +4737,62 @@ button.xpl-button--loading.xpl-button--tertiary,
4744
4737
  overflow-wrap: break-word;
4745
4738
  }
4746
4739
 
4740
+ .dark .xpl-dynamic-table-cell {
4741
+ border-color: var(--xpl-color-gray-600);
4742
+
4743
+ background-color: var(--xpl-color-foreground-dm);
4744
+ color: var(--xpl-color-gray-50);
4745
+ }
4746
+
4747
+ .dark .xpl-dynamic-table-cell button[dropdown] {
4748
+ display: flex;
4749
+ align-items: center;
4750
+ justify-content: center;
4751
+ }
4752
+
4753
+ .dark .xpl-dynamic-table-cell button[dropdown]:focus {
4754
+ box-shadow: inset 0 0 0 1px var(--xpl-color-purple-500);
4755
+ }
4756
+
4757
+ .xpl-dynamic-table-cell:has(button[dropdown]) {
4758
+ padding: 0;
4759
+ }
4760
+
4747
4761
  .xpl-dynamic-table-row {
4748
4762
  display: contents;
4749
4763
  }
4750
4764
 
4751
4765
  .xpl-dynamic-table-row > *:first-child {
4752
- border-left: var(--xpl-border-small) solid var(--xpl-border-default);
4753
- }
4766
+ border-left-width: 1px;
4767
+ border-color: var(--xpl-color-gray-400);
4768
+ }
4754
4769
 
4755
4770
  .xpl-dynamic-table-row.selected .xpl-dynamic-table-cell {
4756
- background-color: var(--xpl-background-surface-information);
4771
+ background-color: var(--xpl-color-purple-50);
4757
4772
  }
4758
4773
 
4759
4774
  .xpl-dynamic-table-row.disabled .xpl-dynamic-table-cell {
4760
- background-color: var(--xpl-background-surface-subtlest);
4761
- color: var(--xpl-text-disabled);
4775
+ background-color: var(--xpl-color-gray-50);
4776
+ color: var(--xpl-color-gray-500);
4777
+ }
4778
+
4779
+ .dark .xpl-dynamic-table-row > *:first-child {
4780
+ border-color: var(--xpl-color-gray-600);
4781
+ }
4782
+
4783
+ .dark .xpl-dynamic-table-row.selected .xpl-dynamic-table-cell {
4784
+ background-color: var(--xpl-color-gray-700);
4785
+ }
4786
+
4787
+ .dark .xpl-dynamic-table-row.disabled .xpl-dynamic-table-cell {
4788
+ background-color: var(--xpl-color-gray-900);
4789
+ color: var(--xpl-color-gray-500);
4762
4790
  }
4763
4791
 
4792
+ .dark .xpl-dynamic-table-row.disabled .xpl-dynamic-table-cell .xpl-badge {
4793
+ color: var(--xpl-color-gray-500);
4794
+ }
4795
+
4764
4796
  /* stylelint-disable color-no-hex -- third-party flatpickr overrides; hex values are intentional. Flatpickr overrides */
4765
4797
 
4766
4798
  [class^="flatpickr-"] {
@@ -5364,37 +5396,6 @@ span.flatpickr-weekday {
5364
5396
  grid-template-columns: var(--column-widths);
5365
5397
  }
5366
5398
 
5367
- /*
5368
- * Slotted table rows live in the light DOM (not under .content--shown), so corner radius
5369
- * is keyed off the host expanded class.
5370
- */
5371
-
5372
- .xpl-header-accordion--expanded
5373
- xpl-table-body
5374
- > xpl-table-row:last-child
5375
- > xpl-table-cell:first-child {
5376
- border-bottom-left-radius: var(--xpl-border-radius-default);
5377
- }
5378
-
5379
- .xpl-header-accordion--expanded
5380
- xpl-table-body
5381
- > xpl-table-row:last-child
5382
- > xpl-table-cell:last-child {
5383
- border-bottom-right-radius: var(--xpl-border-radius-default);
5384
- }
5385
-
5386
- .xpl-header-accordion--expanded
5387
- xpl-dynamic-table-row:last-child
5388
- > xpl-dynamic-table-cell:first-child {
5389
- border-bottom-left-radius: var(--xpl-border-radius-default);
5390
- }
5391
-
5392
- .xpl-header-accordion--expanded
5393
- xpl-dynamic-table-row:last-child
5394
- > xpl-dynamic-table-cell:last-child {
5395
- border-bottom-right-radius: var(--xpl-border-radius-default);
5396
- }
5397
-
5398
5399
  .dark .xpl-header-accordion .header-accordion {
5399
5400
  background-color: var(--xpl-color-background-dm);
5400
5401
  border-color: var(--xpl-color-gray-600);
@@ -8936,274 +8937,13 @@ span.xpl-placeholder--hidden,
8936
8937
  }
8937
8938
  }
8938
8939
 
8939
- /*
8940
- * xpl-table styles
8941
- *
8942
- * Supports two rendering modes:
8943
- * 1. Compositional (CSS grid): .xpl-table without .xpl-table--legacy
8944
- * 2. Legacy data-driven: .xpl-table--legacy (native <table> markup)
8945
- *
8946
- * The legacy path preserves backward compatibility and will be removed in a
8947
- * future major release.
8948
- */
8949
-
8950
- /* --------------------------------------------------------------------------
8951
- * Compositional grid mode
8952
- * -------------------------------------------------------------------------- */
8953
-
8954
- .xpl-table:not(.xpl-table--legacy) {
8955
- display: grid;
8956
-
8957
- grid-template-columns: var(--column-widths);
8958
- border: var(--xpl-border-small) solid var(--xpl-border-default);
8959
- border-radius: var(--xpl-border-radius-default);
8960
- overflow: auto;
8961
- --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
8962
- --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
8963
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
8964
- }
8965
-
8966
- /* Nested inside xpl-header-accordion: outer card draws border + radius; table is flush grid */
8967
-
8968
- .xpl-header-accordion .xpl-table:not(.xpl-table--legacy) {
8969
- /* Keep side + bottom frame inside accordion; suppress top to avoid double rule under accordion header. */
8970
- border-top: none;
8971
- border-right: var(--xpl-border-small) solid var(--xpl-border-default);
8972
- border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
8973
- border-left: var(--xpl-border-small) solid var(--xpl-border-default);
8974
- border-radius: 0;
8975
- box-shadow: none;
8976
- }
8977
-
8978
- /* Visually hidden assertive live region for row reorder announcements (compositional `row-reorderable`). */
8979
-
8980
- .xpl-table:not(.xpl-table--legacy) > .xpl-table__reorder-live {
8981
- grid-column: 1 / -1;
8982
- position: absolute;
8983
- width: 1px;
8984
- height: 1px;
8985
- padding: 0;
8986
- margin: -1px;
8987
- overflow: hidden;
8988
- clip: rect(0, 0, 0, 0);
8989
- white-space: nowrap;
8990
- border-width: 0;
8991
- }
8992
-
8993
- /* Selection bulk-action toolbar (same structure/classes as `xpl-toolbar`); full width, sticky while scrolling. */
8994
-
8995
- .xpl-table:not(.xpl-table--legacy) > .xpl-table__toolbar {
8996
- grid-column: 1 / -1;
8997
- position: sticky;
8998
- top: 0px;
8999
-
9000
- z-index: var(--xpl-z-index-200);
9001
- }
9002
-
9003
- /* Outer host already draws the top border; avoid a double line under the rounded top edge. */
9004
-
9005
- .xpl-table:not(.xpl-table--legacy) > .xpl-table__toolbar .toolbar {
9006
- border-top: none;
9007
- max-height: var(--xpl-size-350);
9008
-
9009
- /* Figma: 56px bar height with 12px vertical / 24px horizontal padding; 16px gaps come from toolbar.css */
9010
- min-height: var(--xpl-size-350);
9011
- box-sizing: border-box;
9012
- }
9013
-
9014
- /* Match `xpl-toolbar`: push right-slot actions to the end (slot name differs on the table host). */
9015
-
9016
- .xpl-table__toolbar .actions [slot="toolbar-actions-right"]:first-child {
9017
- margin-left: auto;
9018
- }
9019
-
9020
- .xpl-table-container {
9021
- overflow: auto;
9022
-
9023
- border: var(--xpl-border-small) solid var(--xpl-border-default);
9024
- border-radius: var(--xpl-border-radius-default);
9025
- --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
9026
- --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
9027
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
9028
- }
9029
-
9030
- /*
9031
- * Freeze: sticky first *data* column (compositional grid).
9032
- * Leading selection and/or row-reorder columns are not frozen — they scroll horizontally;
9033
- * `nth-child` skips 0–2 leading cells when `xpl-table--selectable` / `xpl-table--row-reorderable` are set.
9034
- */
9035
-
9036
- .xpl-table--freeze:not(.xpl-table--legacy):not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-header-cell:first-child,
9037
- .xpl-table--freeze:not(.xpl-table--legacy):not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-cell:first-child,
9038
- .xpl-table--freeze:not(.xpl-table--legacy):not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-footer-cell:first-child {
9039
- position: sticky;
9040
- left: 0px;
9041
-
9042
- z-index: var(--xpl-z-index-100);
9043
- }
9044
-
9045
- .xpl-table--freeze:not(.xpl-table--legacy):not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-header-cell:first-child::after, .xpl-table--freeze:not(.xpl-table--legacy):not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-cell:first-child::after, .xpl-table--freeze:not(.xpl-table--legacy):not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-footer-cell:first-child::after {
9046
- content: "";
9047
- width: var(--xpl-space-24);
9048
- position: absolute;
9049
- left: 100%;
9050
- top: 0px;
9051
- display: block;
9052
- height: 100%;
9053
- opacity: 0;
9054
- transition-property: opacity;
9055
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
9056
- transition-duration: 150ms;
9057
-
9058
- background: linear-gradient(
9059
- 90deg,
9060
- var(--xpl-background-surface-transparent-10) 0%,
9061
- var(--xpl-background-surface-transparent-0) 100%
9062
- );
9063
- }
9064
-
9065
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--selectable.xpl-table--row-reorderable .xpl-table-header-cell:nth-child(3),
9066
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--selectable.xpl-table--row-reorderable .xpl-table-cell:nth-child(3),
9067
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--selectable.xpl-table--row-reorderable .xpl-table-footer-cell:nth-child(3) {
9068
- position: sticky;
9069
- left: 0px;
9070
-
9071
- z-index: var(--xpl-z-index-100);
9072
- }
9073
-
9074
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--selectable.xpl-table--row-reorderable .xpl-table-header-cell:nth-child(3)::after, .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--selectable.xpl-table--row-reorderable .xpl-table-cell:nth-child(3)::after, .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--selectable.xpl-table--row-reorderable .xpl-table-footer-cell:nth-child(3)::after {
9075
- content: "";
9076
- width: var(--xpl-space-24);
9077
- position: absolute;
9078
- left: 100%;
9079
- top: 0px;
9080
- display: block;
9081
- height: 100%;
9082
- opacity: 0;
9083
- transition-property: opacity;
9084
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
9085
- transition-duration: 150ms;
9086
-
9087
- background: linear-gradient(
9088
- 90deg,
9089
- var(--xpl-background-surface-transparent-10) 0%,
9090
- var(--xpl-background-surface-transparent-0) 100%
9091
- );
9092
- }
9093
-
9094
- .xpl-table--freeze:not(.xpl-table--legacy):is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9095
- .xpl-table--selectable.xpl-table--row-reorderable
9096
- ) .xpl-table-header-cell:nth-child(2),
9097
- .xpl-table--freeze:not(.xpl-table--legacy):is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9098
- .xpl-table--selectable.xpl-table--row-reorderable
9099
- ) .xpl-table-cell:nth-child(2),
9100
- .xpl-table--freeze:not(.xpl-table--legacy):is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9101
- .xpl-table--selectable.xpl-table--row-reorderable
9102
- ) .xpl-table-footer-cell:nth-child(2) {
9103
- position: sticky;
9104
- left: 0px;
9105
-
9106
- z-index: var(--xpl-z-index-100);
9107
- }
9108
-
9109
- .xpl-table--freeze:not(.xpl-table--legacy):is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9110
- .xpl-table--selectable.xpl-table--row-reorderable
9111
- ) .xpl-table-header-cell:nth-child(2)::after, .xpl-table--freeze:not(.xpl-table--legacy):is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9112
- .xpl-table--selectable.xpl-table--row-reorderable
9113
- ) .xpl-table-cell:nth-child(2)::after, .xpl-table--freeze:not(.xpl-table--legacy):is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9114
- .xpl-table--selectable.xpl-table--row-reorderable
9115
- ) .xpl-table-footer-cell:nth-child(2)::after {
9116
- content: "";
9117
- width: var(--xpl-space-24);
9118
- position: absolute;
9119
- left: 100%;
9120
- top: 0px;
9121
- display: block;
9122
- height: 100%;
9123
- opacity: 0;
9124
- transition-property: opacity;
9125
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
9126
- transition-duration: 150ms;
9127
-
9128
- background: linear-gradient(
9129
- 90deg,
9130
- var(--xpl-background-surface-transparent-10) 0%,
9131
- var(--xpl-background-surface-transparent-0) 100%
9132
- );
9133
- }
9134
-
9135
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled:not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-header-cell:first-child::after,
9136
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled:not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-cell:first-child::after,
9137
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled:not(.xpl-table--selectable, .xpl-table--row-reorderable) .xpl-table-footer-cell:first-child::after {
9138
- opacity: 1;
9139
- }
9140
-
9141
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled.xpl-table--selectable.xpl-table--row-reorderable .xpl-table-header-cell:nth-child(3)::after,
9142
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled.xpl-table--selectable.xpl-table--row-reorderable .xpl-table-cell:nth-child(3)::after,
9143
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled.xpl-table--selectable.xpl-table--row-reorderable .xpl-table-footer-cell:nth-child(3)::after {
9144
- opacity: 1;
9145
- }
9146
-
9147
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled:is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9148
- .xpl-table--selectable.xpl-table--row-reorderable
9149
- ) .xpl-table-header-cell:nth-child(2)::after,
9150
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled:is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9151
- .xpl-table--selectable.xpl-table--row-reorderable
9152
- ) .xpl-table-cell:nth-child(2)::after,
9153
- .xpl-table--freeze:not(.xpl-table--legacy).xpl-table--has-scrolled:is(.xpl-table--selectable, .xpl-table--row-reorderable):not(
9154
- .xpl-table--selectable.xpl-table--row-reorderable
9155
- ) .xpl-table-footer-cell:nth-child(2)::after {
9156
- opacity: 1;
9157
- }
9158
-
9159
- /*
9160
- * Perimeter cell borders: outer host draws the frame; suppress duplicate edges on `:last-child` / last row.
9161
- * Follows `.xpl-table--freeze` so `:first-child` sticky rules precede these `:last-child` resets.
9162
- */
9163
-
9164
- /* stylelint-disable no-duplicate-selectors, no-descending-specificity -- second block merges perimeter into the same host selector as the grid rule above */
9165
-
9166
- .xpl-table:not(.xpl-table--legacy) .xpl-table-footer > xpl-table-row:last-of-type .xpl-table-footer-cell,
9167
- .xpl-table:not(.xpl-table--legacy) .xpl-table-footer > .xpl-table-row:last-of-type > .xpl-table-footer-cell {
9168
- border-bottom: none;
9169
- }
9170
-
9171
- .xpl-table:not(.xpl-table--legacy) .xpl-table-header > xpl-table-row .xpl-table-header-cell:last-child,
9172
- .xpl-table:not(.xpl-table--legacy) .xpl-table-header > .xpl-table-row > .xpl-table-header-cell:last-child,
9173
- .xpl-table:not(.xpl-table--legacy) .xpl-table-body > xpl-table-row .xpl-table-cell:last-child,
9174
- .xpl-table:not(.xpl-table--legacy) .xpl-table-body > .xpl-table-row > .xpl-table-cell:last-child,
9175
- .xpl-table:not(.xpl-table--legacy) .xpl-table-footer > xpl-table-row .xpl-table-footer-cell:last-child,
9176
- .xpl-table:not(.xpl-table--legacy) .xpl-table-footer > .xpl-table-row > .xpl-table-footer-cell:last-child {
9177
- border-right: none;
9178
- }
9179
-
9180
- .xpl-table:not(.xpl-table--legacy, :has(.xpl-table-footer))
9181
- .xpl-table-body
9182
- > xpl-table-row:last-of-type
9183
- .xpl-table-cell,
9184
- .xpl-table:not(.xpl-table--legacy, :has(.xpl-table-footer))
9185
- .xpl-table-body
9186
- > .xpl-table-row:last-of-type
9187
- > .xpl-table-cell {
9188
- border-bottom: none;
9189
- }
9190
-
9191
- /* stylelint-enable no-duplicate-selectors, no-descending-specificity */
9192
-
9193
- /* --------------------------------------------------------------------------
9194
- * Legacy data-driven mode (native <table> markup)
9195
- *
9196
- * TODO: Remove in Phase 3 major release. These styles use deprecated tokens
9197
- * and .dark overrides intentionally to preserve backward compatibility.
9198
- * -------------------------------------------------------------------------- */
9199
-
9200
- /* stylelint-disable color-no-hex, function-disallowed-list -- legacy path; will be removed */
8940
+ /* stylelint-disable color-no-hex, function-disallowed-list -- TODO: migrate to var(--xpl-*) tokens (see TECH_DEBT.md) */
9201
8941
 
9202
- .xpl-table--legacy {
8942
+ .xpl-table {
9203
8943
  min-width: 100%;
9204
8944
  }
9205
8945
 
9206
- .xpl-table--legacy > :not(tfoot, [hidden]) ~ :not(tfoot, [hidden]) {
8946
+ .xpl-table > :not(tfoot, [hidden]) ~ :not(tfoot, [hidden]) {
9207
8947
  --tw-divide-y-reverse: 0;
9208
8948
  --tw-divide-opacity: 1;
9209
8949
 
@@ -9212,15 +8952,33 @@ span.xpl-placeholder--hidden,
9212
8952
  border-color: var(--xpl-color-gray-200);
9213
8953
  }
9214
8954
 
9215
- .dark .xpl-table--legacy > :not(tfoot, [hidden]) ~ :not(tfoot, [hidden]) {
8955
+ .dark .xpl-table > :not(tfoot, [hidden]) ~ :not(tfoot, [hidden]) {
9216
8956
  border-color: var(--xpl-color-gray-800);
9217
8957
  }
9218
8958
 
9219
- .xpl-table--legacy--abs {
8959
+ .xpl-table--abs {
9220
8960
  position: absolute;
9221
8961
  }
9222
8962
 
9223
- .xpl-table--legacy th {
8963
+ .xpl-table-container {
8964
+ overflow: auto;
8965
+ border-radius: 0.375rem;
8966
+ border-width: 1px;
8967
+ --tw-border-opacity: 1;
8968
+ border-color: rgb(238 239 243 / var(--tw-border-opacity, 1));
8969
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
8970
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
8971
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
8972
+ }
8973
+
8974
+ .dark .xpl-table-container {
8975
+ --tw-border-opacity: 1;
8976
+ border-color: rgb(54 50 64 / var(--tw-border-opacity, 1));
8977
+ --tw-bg-opacity: 1;
8978
+ background-color: rgb(48 45 59 / var(--tw-bg-opacity, 1));
8979
+ }
8980
+
8981
+ .xpl-table th {
9224
8982
  white-space: nowrap;
9225
8983
  padding-left: 1.5rem;
9226
8984
  padding-right: 1.5rem;
@@ -9234,12 +8992,12 @@ span.xpl-placeholder--hidden,
9234
8992
  color: rgb(153 155 168 / var(--tw-text-opacity, 1));
9235
8993
  }
9236
8994
 
9237
- .dark .xpl-table--legacy th {
8995
+ .dark .xpl-table th {
9238
8996
  --tw-text-opacity: 1;
9239
8997
  color: rgb(234 235 239 / var(--tw-text-opacity, 1));
9240
8998
  }
9241
8999
 
9242
- .xpl-table--legacy tr td {
9000
+ .xpl-table tr td {
9243
9001
  white-space: nowrap;
9244
9002
  padding-left: 1.5rem;
9245
9003
  padding-right: 1.5rem;
@@ -9251,21 +9009,21 @@ span.xpl-placeholder--hidden,
9251
9009
  color: rgb(153 155 168 / var(--tw-text-opacity, 1));
9252
9010
  }
9253
9011
 
9254
- .dark .xpl-table--legacy tr td {
9012
+ .dark .xpl-table tr td {
9255
9013
  --tw-text-opacity: 1;
9256
9014
  color: rgb(234 235 239 / var(--tw-text-opacity, 1));
9257
9015
  }
9258
9016
 
9259
- .xpl-table--legacy thead {
9017
+ .xpl-table thead {
9260
9018
  --tw-bg-opacity: 1;
9261
9019
  background-color: rgb(248 249 250 / var(--tw-bg-opacity, 1));
9262
9020
  }
9263
9021
 
9264
- .dark .xpl-table--legacy thead {
9022
+ .dark .xpl-table thead {
9265
9023
  background-color: var(--xpl-color-background-dm);
9266
9024
  }
9267
9025
 
9268
- .xpl-table--legacy tbody > :not([hidden]) ~ :not([hidden]) {
9026
+ .xpl-table tbody > :not([hidden]) ~ :not([hidden]) {
9269
9027
  --tw-divide-y-reverse: 0;
9270
9028
  border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
9271
9029
  border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
@@ -9273,72 +9031,72 @@ span.xpl-placeholder--hidden,
9273
9031
  border-color: rgb(238 239 243 / var(--tw-divide-opacity, 1));
9274
9032
  }
9275
9033
 
9276
- .xpl-table--legacy tbody {
9034
+ .xpl-table tbody {
9277
9035
  --tw-bg-opacity: 1;
9278
9036
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
9279
9037
  }
9280
9038
 
9281
- .dark .xpl-table--legacy tbody {
9039
+ .dark .xpl-table tbody {
9282
9040
  background-color: var(--xpl-color-foreground-dm);
9283
9041
  }
9284
9042
 
9285
- .dark .xpl-table--legacy tbody > :not([hidden]) ~ :not([hidden]) {
9043
+ .dark .xpl-table tbody > :not([hidden]) ~ :not([hidden]) {
9286
9044
  --tw-divide-opacity: 1;
9287
9045
  border-color: rgb(60 56 71 / var(--tw-divide-opacity, 1));
9288
9046
  }
9289
9047
 
9290
- .xpl-table--legacy tfoot {
9048
+ .xpl-table tfoot {
9291
9049
  border-top-color: var(--xpl-color-stroke-dm);
9292
9050
  border-right: none;
9293
9051
  border-bottom: none;
9294
9052
  border-width: 1px;
9295
9053
  }
9296
9054
 
9297
- .dark .xpl-table--legacy tfoot {
9055
+ .dark .xpl-table tfoot {
9298
9056
  border-top-color: var(--xpl-color-stroke-lm);
9299
9057
  }
9300
9058
 
9301
- .xpl-table--legacy a {
9059
+ .xpl-table a {
9302
9060
  --tw-text-opacity: 1;
9303
9061
  color: rgb(79 70 229 / var(--tw-text-opacity, 1));
9304
9062
  }
9305
9063
 
9306
- .xpl-table--legacy a:hover {
9064
+ .xpl-table a:hover {
9307
9065
  --tw-text-opacity: 1;
9308
9066
  color: rgb(49 46 129 / var(--tw-text-opacity, 1));
9309
9067
  }
9310
9068
 
9311
- .xpl-table--legacy label {
9069
+ .xpl-table label {
9312
9070
  display: flex;
9313
9071
  align-items: center;
9314
9072
  }
9315
9073
 
9316
- .xpl-table--legacy input[type="checkbox"] {
9074
+ .xpl-table input[type="checkbox"] {
9317
9075
  margin-right: 1.5rem;
9318
9076
  cursor: pointer;
9319
9077
  }
9320
9078
 
9321
- .xpl-table--legacy xpl-icon {
9079
+ .xpl-table xpl-icon {
9322
9080
  margin-left: 0.5rem;
9323
9081
  cursor: pointer;
9324
9082
  }
9325
9083
 
9326
- .xpl-table--legacy .wrap {
9084
+ .xpl-table .wrap {
9327
9085
  white-space: normal;
9328
9086
  }
9329
9087
 
9330
- .xpl-table--legacy .xpl-table-row-selected td {
9088
+ .xpl-table-row-selected td {
9331
9089
  --tw-bg-opacity: 1 !important;
9332
9090
  background-color: rgb(244 242 255 / var(--tw-bg-opacity, 1)) !important;
9333
9091
  }
9334
9092
 
9335
- .dark .xpl-table--legacy .xpl-table-row-selected td {
9093
+ .dark .xpl-table-row-selected td {
9336
9094
  --tw-bg-opacity: 1 !important;
9337
9095
  background-color: rgb(54 50 64 / var(--tw-bg-opacity, 1)) !important;
9338
9096
  }
9339
9097
 
9340
- .xpl-table--legacy.xpl-table--freeze th:first-child,
9341
- .xpl-table--legacy.xpl-table--freeze td:first-child {
9098
+ .xpl-table--freeze th:first-child,
9099
+ .xpl-table--freeze td:first-child {
9342
9100
  position: sticky;
9343
9101
  left: 0px;
9344
9102
  z-index: 10;
@@ -9346,13 +9104,8 @@ span.xpl-placeholder--hidden,
9346
9104
  border-color: rgb(238 239 243 / var(--tw-border-opacity, 1));
9347
9105
  }
9348
9106
 
9349
- .xpl-table--legacy.xpl-table--freeze th:first-child::after, .xpl-table--legacy.xpl-table--freeze td:first-child::after {
9350
- background: linear-gradient(
9351
- 90deg,
9352
- var(--xpl-color-neutral-300) 0%,
9353
- var(--xpl-color-neutral-300) 0.01%,
9354
- transparent 100%
9355
- );
9107
+ .xpl-table--freeze th:first-child::after, .xpl-table--freeze td:first-child::after {
9108
+ background: linear-gradient(90deg, #e4e6eb 0%, #e4e6eb 0.01%, rgba(228 230 235 / 0%) 100%);
9356
9109
  content: "";
9357
9110
  width: 24px;
9358
9111
  position: absolute;
@@ -9366,19 +9119,19 @@ span.xpl-placeholder--hidden,
9366
9119
  transition-duration: 150ms;
9367
9120
  }
9368
9121
 
9369
- .xpl-table--legacy.xpl-table--freeze th:first-child {
9122
+ .xpl-table--freeze th:first-child {
9370
9123
  --tw-bg-opacity: 1;
9371
9124
  background-color: rgb(248 249 250 / var(--tw-bg-opacity, 1));
9372
9125
  }
9373
9126
 
9374
- .dark .xpl-table--legacy.xpl-table--freeze th:first-child {
9127
+ .dark .xpl-table--freeze th:first-child {
9375
9128
  background-color: var(--xpl-color-background-dm);
9376
9129
  --tw-border-opacity: 1;
9377
9130
  border-color: rgb(54 50 64 / var(--tw-border-opacity, 1));
9378
9131
  }
9379
9132
 
9380
- .xpl-table--legacy.xpl-table--freeze tr td:first-child,
9381
- .xpl-table--legacy.xpl-table--freeze p {
9133
+ .xpl-table--freeze tr td:first-child,
9134
+ .xpl-table--freeze p {
9382
9135
  font-size: 0.875rem;
9383
9136
  line-height: 1.25rem;
9384
9137
  font-weight: 500;
@@ -9386,612 +9139,141 @@ span.xpl-placeholder--hidden,
9386
9139
  color: rgb(48 45 59 / var(--tw-text-opacity, 1));
9387
9140
  }
9388
9141
 
9389
- .dark .xpl-table--legacy.xpl-table--freeze td:first-child {
9142
+ .dark .xpl-table--freeze td:first-child {
9390
9143
  --tw-border-opacity: 1;
9391
9144
  border-color: rgb(54 50 64 / var(--tw-border-opacity, 1));
9392
9145
  }
9393
9146
 
9394
- .dark .xpl-table--legacy.xpl-table--freeze td:first-child::after {
9395
- background: linear-gradient(
9396
- 90deg,
9397
- color-mix(in srgb, var(--xpl-color-neutral-1100) 40%, transparent) 0%,
9398
- transparent 100%
9399
- );
9147
+ .dark .xpl-table--freeze td:first-child::after {
9148
+ background: linear-gradient(90deg, rgba(0 0 0 / 40%) 0%, rgba(0 0 0 / 0%) 100%);
9400
9149
  }
9401
9150
 
9402
- .xpl-table--legacy.xpl-table--has-scrolled th:first-child::after,
9403
- .xpl-table--legacy.xpl-table--has-scrolled td:first-child::after {
9151
+ .xpl-table--has-scrolled th:first-child::after,
9152
+ .xpl-table--has-scrolled td:first-child::after {
9404
9153
  opacity: 1;
9405
9154
  }
9406
9155
 
9407
- .xpl-table--legacy.xpl-table--striped tr:nth-of-type(even) {
9156
+ .xpl-table--striped tr:nth-of-type(even) {
9408
9157
  --tw-bg-opacity: 1;
9409
9158
  background-color: rgb(248 249 250 / var(--tw-bg-opacity, 1));
9410
9159
  }
9411
9160
 
9412
- .dark .xpl-table--legacy.xpl-table--striped tr:nth-of-type(even) {
9161
+ .dark .xpl-table--striped tr:nth-of-type(even) {
9413
9162
  --tw-bg-opacity: 1;
9414
9163
  background-color: rgb(48 45 59 / var(--tw-bg-opacity, 1));
9415
9164
  }
9416
9165
 
9417
- .dark .xpl-table--legacy tr td:first-child,
9418
- .dark .xpl-table--legacy p {
9166
+ .dark .xpl-table tr td:first-child,
9167
+ .dark .xpl-table p {
9419
9168
  --tw-text-opacity: 1;
9420
9169
  color: rgb(255 255 255 / var(--tw-text-opacity, 1));
9421
9170
  }
9422
9171
 
9423
- /* stylelint-enable color-no-hex, function-disallowed-list */
9424
-
9425
- .xpl-table-body {
9172
+ .xpl-table-header {
9426
9173
  display: contents;
9427
9174
  }
9428
9175
 
9429
- /* Shared layout and tokens for body and footer grid cells */
9176
+ .xpl-table-header > *:first-child {
9177
+ border-left-width: 1px;
9178
+ border-color: var(--xpl-color-gray-400);
9179
+ }
9430
9180
 
9431
- .xpl-table-cell-base {
9432
- display: flex;
9433
- align-items: center;
9434
- overflow: hidden;
9435
- text-overflow: ellipsis;
9436
- }
9437
-
9438
- .xpl-table-cell-base {
9439
- font-size: var(--xpl-size-font-title-5);
9440
- font-weight: var(--xpl-font-weight-medium);
9441
- line-height: 1.4286;
9442
- }
9443
-
9444
- .xpl-table-cell-base {
9445
-
9446
- /* Figma Dynamic Table text cells: space/10 vertical, space/16 horizontal */
9447
- padding: var(--xpl-space-10) var(--xpl-space-16);
9448
- min-height: var(--xpl-size-350);
9449
- border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
9450
- border-right: var(--xpl-border-small) solid var(--xpl-border-default);
9451
- background-color: var(--xpl-background-surface-default);
9452
- color: var(--xpl-text-default);
9453
- font-family: var(--xpl-font-family-default);
9454
- }
9455
-
9456
- .xpl-table-cell-base--align-left {
9457
- justify-content: flex-start;
9458
- text-align: left;
9459
- }
9460
-
9461
- .xpl-table-cell-base--align-right {
9462
- justify-content: flex-end;
9463
- text-align: right;
9464
- }
9465
-
9466
- .xpl-table-cell-base--align-center {
9467
- justify-content: center;
9468
- text-align: center;
9469
- }
9470
-
9471
- .xpl-table-cell {
9472
- display: flex;
9473
- align-items: center;
9474
- overflow: hidden;
9475
- text-overflow: ellipsis;
9476
- }
9477
-
9478
- .xpl-table-cell {
9479
- font-size: var(--xpl-size-font-title-5);
9480
- font-weight: var(--xpl-font-weight-medium);
9481
- line-height: 1.4286;
9482
- }
9483
-
9484
- .xpl-table-cell {
9485
-
9486
- /* Figma Dynamic Table text cells: space/10 vertical, space/16 horizontal */
9487
- padding: var(--xpl-space-10) var(--xpl-space-16);
9488
- min-height: var(--xpl-size-350);
9489
- border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
9490
- border-right: var(--xpl-border-small) solid var(--xpl-border-default);
9491
- background-color: var(--xpl-background-surface-default);
9492
- color: var(--xpl-text-default);
9493
- font-family: var(--xpl-font-family-default);
9494
- }
9495
-
9496
- /* Checkbox-only column: Figma py-20 / px-16 */
9497
-
9498
- .xpl-table-cell:has(> xpl-checkbox:first-child:last-child) {
9499
- padding: calc(var(--xpl-space-16) + var(--xpl-space-4)) var(--xpl-space-16);
9500
- }
9501
-
9502
- .xpl-table-cell--align-left {
9503
- justify-content: flex-start;
9504
- text-align: left;
9505
- }
9506
-
9507
- .xpl-table-cell--align-right {
9508
- justify-content: flex-end;
9509
- text-align: right;
9510
- }
9511
-
9512
- .xpl-table-cell--align-center {
9513
- justify-content: center;
9514
- text-align: center;
9515
- }
9516
-
9517
- .xpl-table-cell--bold {
9518
- font-weight: var(--xpl-font-weight-semibold);
9519
- }
9520
-
9521
- .xpl-table-cell--underline {
9522
- text-decoration-line: underline;
9523
- }
9524
-
9525
- .xpl-table-cell--disabled {
9526
- color: var(--xpl-text-disabled);
9527
- cursor: not-allowed;
9528
- }
9529
-
9530
- .xpl-table-cell--disabled xpl-icon {
9531
- color: var(--xpl-icon-disabled);
9532
- }
9533
-
9534
- /*
9535
- * Rich slots (Figma Light / Dark): secondary line uses text/subdued; icons use icon tokens
9536
- * (not inherited text color) so they match the table spec in both themes.
9537
- */
9538
-
9539
- .xpl-table-cell .xpl-text-caption {
9540
- color: var(--xpl-text-subdued);
9541
- }
9542
-
9543
- .xpl-table-cell--disabled .xpl-text-caption {
9544
- color: var(--xpl-text-disabled);
9545
- }
9546
-
9547
- .xpl-table-cell xpl-icon {
9548
- color: var(--xpl-icon-default);
9549
- }
9550
-
9551
- .xpl-table-cell xpl-avatar {
9552
- margin-right: var(--xpl-space-8);
9553
- }
9554
-
9555
- .xpl-table-cell .xpl-checkbox-radio-container {
9556
- margin-bottom: 0px;
9557
- }
9558
-
9559
- .xpl-table-cell .xpl-checkbox-radio-container .xpl-label {
9560
- padding: 0px;
9561
- }
9562
-
9563
- /*
9564
- * Managed reorder column cells use `align="center"`; this reinforces flex centering for the grip.
9565
- */
9566
-
9567
- .xpl-table-cell[data-xpl-row-reorder-managed] {
9568
- justify-content: center;
9569
- }
9570
-
9571
- /* Row reorder grip (managed column; compositional `row-reorderable`) */
9572
-
9573
- .xpl-table-cell .xpl-table__row-drag-handle {
9574
- display: inline-flex;
9575
- cursor: move;
9576
- align-items: center;
9577
- justify-content: center;
9578
- border-width: 0px;
9579
- background-color: transparent;
9580
- padding: 0px;
9581
-
9582
- border-radius: var(--xpl-border-radius-default);
9583
- min-width: var(--xpl-space-32);
9584
- min-height: var(--xpl-space-32);
9585
- color: var(--xpl-icon-subdued);
9586
- }
9587
-
9588
- .xpl-table-cell .xpl-table__row-drag-handle:active {
9589
- cursor: grabbing;
9590
- }
9591
-
9592
- /* Ensure the native `<button>` stays the hit target (helps DnD + shadow children like `xpl-icon`). */
9593
-
9594
- .xpl-table-cell .xpl-table__row-drag-handle xpl-icon {
9595
- /* Beat `.xpl-table-cell xpl-icon { color: icon-default }` so resting/subdued + row states control the grip. */
9596
- color: inherit;
9597
- pointer-events: none;
9598
- }
9599
-
9600
- .xpl-table-cell .xpl-table__row-drag-handle:disabled {
9601
- cursor: not-allowed;
9602
-
9603
- color: var(--xpl-icon-disabled);
9604
- }
9605
-
9606
- .xpl-table-cell .xpl-table__row-drag-handle:focus-visible {
9607
- border-radius: var(--xpl-border-radius-default);
9608
- outline-color: var(--xpl-border-focus);
9609
- outline-width: 2px;
9610
- outline-offset: 2px;
9611
- }
9612
-
9613
- .xpl-table-footer {
9614
- display: contents;
9615
- }
9616
-
9617
- .xpl-table-footer > xpl-table-row:first-child .xpl-table-footer-cell,
9618
- .xpl-table-footer > .xpl-table-row:first-child > .xpl-table-footer-cell {
9619
- border-top: var(--xpl-border-large) solid var(--xpl-border-strong);
9620
- }
9621
-
9622
- .xpl-table-footer-cell {
9623
- display: flex;
9624
- align-items: center;
9625
- overflow: hidden;
9626
- text-overflow: ellipsis;
9627
- }
9628
-
9629
- .xpl-table-footer-cell {
9630
- font-size: var(--xpl-size-font-title-5);
9631
- font-weight: var(--xpl-font-weight-medium);
9632
- line-height: 1.4286;
9633
- }
9634
-
9635
- .xpl-table-footer-cell {
9636
-
9637
- /* Figma Dynamic Table text cells: space/10 vertical, space/16 horizontal */
9638
- padding: var(--xpl-space-10) var(--xpl-space-16);
9639
- min-height: var(--xpl-size-350);
9640
- border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
9641
- border-right: var(--xpl-border-small) solid var(--xpl-border-default);
9642
- background-color: var(--xpl-background-surface-default);
9643
- color: var(--xpl-text-default);
9644
- font-family: var(--xpl-font-family-default);
9645
- }
9646
-
9647
- .xpl-table-footer-cell:has(> xpl-checkbox:first-child:last-child) {
9648
- padding: calc(var(--xpl-space-16) + var(--xpl-space-4)) var(--xpl-space-16);
9649
- }
9650
-
9651
- .xpl-table-footer-cell--align-left {
9652
- justify-content: flex-start;
9653
- text-align: left;
9654
- }
9655
-
9656
- .xpl-table-footer-cell--align-right {
9657
- justify-content: flex-end;
9658
- text-align: right;
9659
- }
9660
-
9661
- .xpl-table-footer-cell--align-center {
9662
- justify-content: center;
9663
- text-align: center;
9664
- }
9665
-
9666
- .xpl-table-footer-cell[data-xpl-row-reorder-managed] {
9667
- justify-content: center;
9668
- }
9669
-
9670
- .xpl-table-header {
9671
- display: contents;
9181
+ .dark .xpl-table-header > *:first-child {
9182
+ border-color: var(--xpl-color-gray-600);
9672
9183
  }
9673
9184
 
9674
9185
  .xpl-table-header-cell {
9675
9186
  display: inline-flex;
9676
9187
  align-items: center;
9188
+ justify-content: center;
9677
9189
  overflow: hidden;
9678
9190
  text-overflow: ellipsis;
9679
9191
  white-space: nowrap;
9680
- }
9681
-
9682
- .xpl-table-header-cell {
9683
- font-size: var(--xpl-size-font-title-5);
9684
- font-weight: var(--xpl-font-weight-medium);
9685
- line-height: 1.4286;
9686
- }
9687
-
9688
- .xpl-table-header-cell {
9689
-
9690
- /* Top edge comes from the outer `.xpl-table` host border; cells only draw inner grid lines. */
9691
- border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
9692
- border-right: var(--xpl-border-small) solid var(--xpl-border-default);
9693
- min-width: var(--xpl-size-300);
9694
- min-height: var(--xpl-size-350);
9695
- background-color: var(--xpl-background-surface-subtlest);
9696
- color: var(--xpl-text-subdued);
9192
+ padding: 0px;
9193
+ height: 3.5rem;
9194
+ min-width: 3rem;
9195
+ border-bottom-width: 1px;
9196
+ border-right-width: 1px;
9197
+ border-top-width: 1px;
9198
+ border-color: var(--xpl-color-gray-400);
9697
9199
 
9698
- /* Figma <header-cell> “Label”: 18px × 16px; checkbox column: 20px × 16px; icon column: 18px × 14px */
9699
- padding: calc(var(--xpl-space-16) + var(--xpl-space-2)) var(--xpl-space-16);
9200
+ background-color: var(--xpl-color-background-lm);
9201
+ font-size: var(--xpl-size-font-title-5);
9202
+ font-weight: var(--xpl-font-weight-normal);
9203
+ color: var(--xpl-color-text-secondary-lm);
9700
9204
  }
9701
9205
 
9702
- .xpl-table-header-cell.xpl-table-header-cell--checkbox {
9703
- padding: calc(var(--xpl-space-16) + var(--xpl-space-4)) var(--xpl-space-16);
9704
- }
9705
-
9706
- .xpl-table-header-cell.xpl-table-header-cell--icon {
9707
- padding: calc(var(--xpl-space-16) + var(--xpl-space-2))
9708
- calc(var(--xpl-space-12) + var(--xpl-space-2));
9709
- }
9710
-
9711
- .xpl-table-header-cell.xpl-table-header-cell--empty {
9712
- padding: 0;
9713
- }
9714
-
9715
9206
  .xpl-table-header-cell .xpl-checkbox-radio-container {
9716
- margin-bottom: 0px;
9207
+ margin-bottom: 0.25rem;
9717
9208
  }
9718
9209
 
9719
9210
  .xpl-table-header-cell .xpl-checkbox-radio-container .xpl-label {
9720
9211
  padding: 0px;
9721
9212
  }
9722
9213
 
9723
- .xpl-table-header-cell.xpl-table-header-cell--align-left {
9724
- justify-content: flex-start;
9725
- text-align: left;
9726
- }
9727
-
9728
- .xpl-table-header-cell.xpl-table-header-cell--align-right {
9729
- justify-content: flex-end;
9730
- text-align: right;
9731
- }
9214
+ .xpl-table-header-cell .header-icon {
9215
+ color: var(--xpl-color-text-reverse-dm);
9216
+ }
9732
9217
 
9733
- .xpl-table-header-cell.xpl-table-header-cell--align-center {
9734
- justify-content: center;
9735
- text-align: center;
9218
+ .xpl-table-header-cell.non-sortable {
9219
+ padding: 1rem;
9736
9220
  }
9737
9221
 
9738
- /* Managed reorder column (empty header; compositional `row-reorderable`) */
9739
-
9740
- .xpl-table-header-cell[data-xpl-row-reorder-managed] {
9222
+ .xpl-table-header-cell.sortable {
9223
+ margin: 0px;
9224
+ display: flex;
9225
+ height: 3.5rem;
9226
+ width: 100%;
9227
+ align-items: center;
9741
9228
  justify-content: center;
9229
+ background-image: none;
9230
+ padding: 0px;
9742
9231
  }
9743
9232
 
9744
- .xpl-table-header-cell.xpl-table-header-cell--sortable {
9745
- padding: 0;
9746
- }
9747
-
9748
- .xpl-table-header-cell .xpl-table-header-cell__sort {
9749
- display: inline-flex;
9233
+ .xpl-table-header-cell.sortable button {
9234
+ display: flex;
9750
9235
  width: 100%;
9751
- min-width: 0px;
9752
9236
  cursor: pointer;
9753
9237
  align-items: center;
9754
- gap: 0.5rem;
9755
- border-width: 0px;
9756
- background-color: transparent;
9757
-
9758
- padding: var(--xpl-space-12) var(--xpl-space-16);
9759
- color: inherit;
9760
- font: inherit;
9761
- font-family: inherit;
9762
- text-align: inherit;
9763
- }
9764
-
9765
- .xpl-table-header-cell .xpl-table-header-cell__sort:focus-visible {
9766
- border-radius: var(--xpl-border-radius-small);
9767
- outline: 2px solid var(--xpl-border-focus);
9768
- outline-offset: 2px;
9769
- }
9770
-
9771
- .xpl-table-header-cell .xpl-table-header-cell__text {
9772
- min-width: 0px;
9773
- flex: 1 1 0%;
9774
- overflow: hidden;
9775
- text-overflow: ellipsis;
9776
- white-space: nowrap;
9777
- }
9778
-
9779
- .xpl-table-header-cell .xpl-table-header-cell__sort-icon {
9780
- flex-shrink: 0;
9781
- }
9782
-
9783
- .xpl-table-header-cell.xpl-table-header-cell--align-left .xpl-table-header-cell__sort {
9784
- justify-content: flex-start;
9785
- text-align: left;
9786
- }
9787
-
9788
- .xpl-table-header-cell.xpl-table-header-cell--align-right .xpl-table-header-cell__sort {
9789
- justify-content: flex-end;
9790
- text-align: right;
9791
- }
9792
-
9793
- .xpl-table-header-cell.xpl-table-header-cell--align-center .xpl-table-header-cell__sort {
9794
9238
  justify-content: center;
9795
- text-align: center;
9796
- }
9797
-
9798
- /* Legacy `<table>` thead may use the same icon class names outside `xpl-table-header-cell`. */
9799
-
9800
- .xpl-table-header-cell__sort-icon {
9801
- flex-shrink: 0;
9802
- }
9803
-
9804
- .xpl-table-header-cell__sort-icon--default {
9805
- color: var(--xpl-text-subdued);
9806
- }
9807
-
9808
- .xpl-table-header-cell__sort-icon--active {
9809
- color: var(--xpl-icon-information);
9810
- }
9811
-
9812
- .xpl-table-row {
9813
- display: contents;
9814
- }
9815
-
9816
- /*
9817
- * Compositional **body** rows only: `display: contents` is overridden so each row is one grid item on
9818
- * `.xpl-table` spanning all columns, with `subgrid` aligning cells to the same tracks as header/footer.
9819
- * This gives the row host a real layout box so `draggable` works like `xpl-list-item` (native drag image).
9820
- * Header/footer rows stay `contents` (unchanged). Requires `grid-template-columns: subgrid` support
9821
- * (Chrome ≥117, Firefox ≥71, Safari ≥16); older engines keep the base `contents` rule only.
9822
- */
9823
-
9824
- @supports (grid-template-columns: subgrid) {
9825
- .xpl-table:not(.xpl-table--legacy) .xpl-table-body > xpl-table-row.xpl-table-row,
9826
- .xpl-table:not(.xpl-table--legacy) .xpl-table-body > .xpl-table-row.xpl-table-row {
9827
- display: grid;
9828
- grid-column: 1 / -1;
9829
- grid-template-columns: subgrid;
9830
- align-items: stretch;
9831
- min-width: 0;
9832
- }
9833
- }
9834
-
9835
- /* Compositional row reorder (`row-reorderable`): overlapping drag/drop/disabled selectors. */
9836
-
9837
- /* stylelint-disable no-descending-specificity -- intentional visual stacking for DnD feedback */
9838
-
9839
- /* Figma row “Disabled”: background/surface/subtlest */
9840
-
9841
- .xpl-table .xpl-table-body > xpl-table-row.xpl-table-row--disabled .xpl-table-cell,
9842
- .xpl-table .xpl-table-body > .xpl-table-row.xpl-table-row--disabled > .xpl-table-cell {
9843
- background-color: var(--xpl-background-surface-subtlest);
9844
- color: var(--xpl-text-disabled);
9845
- cursor: not-allowed;
9846
- }
9847
-
9848
- /* Pointer drag: mirrors xpl-list `.xpl-list-item__wrapper.dragging` (list-item.css). */
9849
-
9850
- .xpl-table .xpl-table-body > xpl-table-row.xpl-table-row--dragging .xpl-table-cell,
9851
- .xpl-table .xpl-table-body > .xpl-table-row.xpl-table-row--dragging > .xpl-table-cell {
9852
- opacity: var(--xpl-opacity-75);
9853
- background-color: var(--xpl-background-surface-subtle);
9239
+ border-style: none;
9240
+ background-image: none;
9241
+ padding: 1rem;
9854
9242
  }
9855
9243
 
9856
- /* List parity: smooth transition when row-reorderable drag / drop target classes toggle (list-item.css). */
9857
-
9858
- .xpl-table--row-reorderable .xpl-table-body > xpl-table-row .xpl-table-cell,
9859
- .xpl-table--row-reorderable .xpl-table-body > .xpl-table-row > .xpl-table-cell {
9860
- transition-property: opacity,background-color,border-color,box-shadow;
9861
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
9862
- transition-duration: 150ms;
9863
- transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
9244
+ .xpl-table-header-cell.sortable button .sort-icon {
9245
+ padding-left: 0.5rem;
9864
9246
  }
9865
9247
 
9866
- /*
9867
- * Reorder grip — Figma Apollo-Web “States” (table cell rows): Resting / Selected / Focused / Disabled.
9868
- * Focus: native `:focus-visible` on the grip button (`--xpl-border-focus`, matches border/focus in spec).
9869
- * Keyboard reorder: `--keyboard-mode` ring (same token as list reorder).
9870
- */
9248
+ .xpl-table-header-cell.sortable button .sort-icon--sorted {
9249
+ color: var(--xpl-color-action-primary-lm);
9250
+ }
9871
9251
 
9872
- .xpl-table__row-drag-handle.xpl-table__row-drag-handle--keyboard-mode {
9873
- outline-color: var(--xpl-border-focus);
9874
- outline-width: 2px;
9252
+ .xpl-table-header-cell.sortable button:focus {
9253
+ outline: 2px solid transparent;
9875
9254
  outline-offset: 2px;
9876
- }
9877
-
9878
- /* Selected row: information-surface grip tint (Figma / Foundation `--xpl-icon-information`). */
9879
-
9880
- .xpl-table
9881
- .xpl-table-body
9882
- > xpl-table-row.xpl-table-row--selected:not(.xpl-table-row--disabled)
9883
- .xpl-table__row-drag-handle:not(:disabled),
9884
- .xpl-table
9885
- .xpl-table-body
9886
- > .xpl-table-row.xpl-table-row--selected:not(.xpl-table-row--disabled)
9887
- .xpl-table__row-drag-handle:not(:disabled) {
9888
- color: var(--xpl-icon-information);
9889
- }
9890
-
9891
- /* Figma row “Selected”: background/surface/information (descendant cell; lower specificity first) */
9892
9255
 
9893
- .xpl-table
9894
- .xpl-table-body
9895
- > xpl-table-row.xpl-table-row--selected:not(.xpl-table-row--disabled)
9896
- .xpl-table-cell {
9897
- background-color: var(--xpl-background-surface-information);
9256
+ box-shadow: inset 0 0 0 1px var(--xpl-color-purple-700);
9898
9257
  }
9899
9258
 
9900
- /* Selected row with class-based row host (direct child cells) */
9901
-
9902
- .xpl-table
9903
- .xpl-table-body
9904
- > .xpl-table-row.xpl-table-row--selected:not(.xpl-table-row--disabled)
9905
- > .xpl-table-cell {
9906
- background-color: var(--xpl-background-surface-information);
9907
- }
9908
-
9909
- /*
9910
- * Drop target: one continuous outline for the row (not per-cell inset rings, which drew vertical seams).
9911
- * Edge segments: first cell = L (left + top + bottom), middle = horizontal rails only, last = Γ (right + top + bottom).
9912
- */
9259
+ .dark .xpl-table-header-cell {
9260
+ border-color: var(--xpl-color-gray-600);
9913
9261
 
9914
- .xpl-table .xpl-table-body > xpl-table-row.xpl-table-row--drag-over .xpl-table-cell:only-child,
9915
- .xpl-table .xpl-table-body > .xpl-table-row.xpl-table-row--drag-over > .xpl-table-cell:only-child {
9916
- box-shadow:
9917
- inset var(--xpl-border-small) 0 0 0 var(--xpl-border-focus),
9918
- inset calc(-1 * var(--xpl-border-small)) 0 0 0 var(--xpl-border-focus),
9919
- inset 0 var(--xpl-border-small) 0 0 var(--xpl-border-focus),
9920
- inset 0 calc(-1 * var(--xpl-border-small)) 0 0 var(--xpl-border-focus);
9921
- }
9922
-
9923
- .xpl-table
9924
- .xpl-table-body
9925
- > xpl-table-row.xpl-table-row--drag-over
9926
- .xpl-table-cell:first-child:not(:only-child),
9927
- .xpl-table
9928
- .xpl-table-body
9929
- > .xpl-table-row.xpl-table-row--drag-over
9930
- > .xpl-table-cell:first-child:not(:only-child) {
9931
- box-shadow:
9932
- inset var(--xpl-border-small) 0 0 0 var(--xpl-border-focus),
9933
- inset 0 var(--xpl-border-small) 0 0 var(--xpl-border-focus),
9934
- inset 0 calc(-1 * var(--xpl-border-small)) 0 0 var(--xpl-border-focus);
9935
- }
9936
-
9937
- .xpl-table
9938
- .xpl-table-body
9939
- > xpl-table-row.xpl-table-row--drag-over
9940
- .xpl-table-cell:last-child:not(:only-child),
9941
- .xpl-table
9942
- .xpl-table-body
9943
- > .xpl-table-row.xpl-table-row--drag-over
9944
- > .xpl-table-cell:last-child:not(:only-child) {
9945
- box-shadow:
9946
- inset calc(-1 * var(--xpl-border-small)) 0 0 0 var(--xpl-border-focus),
9947
- inset 0 var(--xpl-border-small) 0 0 var(--xpl-border-focus),
9948
- inset 0 calc(-1 * var(--xpl-border-small)) 0 0 var(--xpl-border-focus);
9949
- }
9950
-
9951
- .xpl-table
9952
- .xpl-table-body
9953
- > xpl-table-row.xpl-table-row--drag-over
9954
- .xpl-table-cell:not(:first-child, :last-child),
9955
- .xpl-table
9956
- .xpl-table-body
9957
- > .xpl-table-row.xpl-table-row--drag-over
9958
- > .xpl-table-cell:not(:first-child, :last-child) {
9959
- box-shadow:
9960
- inset 0 var(--xpl-border-small) 0 0 var(--xpl-border-focus),
9961
- inset 0 calc(-1 * var(--xpl-border-small)) 0 0 var(--xpl-border-focus);
9262
+ background-color: var(--xpl-color-background-2-dm);
9263
+ color: var(--xpl-color-text-secondary-dm);
9962
9264
  }
9963
9265
 
9964
- /* stylelint-enable no-descending-specificity */
9965
-
9966
- /*
9967
- * Striped zebra + selected emphasis: rules intentionally overlap; order is visual priority.
9968
- */
9969
-
9970
- /* stylelint-disable no-descending-specificity */
9971
-
9972
- .xpl-table--striped
9973
- .xpl-table-body
9974
- > xpl-table-row:nth-child(even):not(.xpl-table-row--selected, .xpl-table-row--disabled)
9975
- .xpl-table-cell,
9976
- .xpl-table--striped
9977
- .xpl-table-body
9978
- > .xpl-table-row:nth-child(even):not(.xpl-table-row--selected, .xpl-table-row--disabled)
9979
- > .xpl-table-cell {
9980
- background-color: var(--xpl-background-surface-subtlest);
9981
- }
9266
+ .dark .xpl-table-header-cell .header-icon {
9267
+ color: var(--xpl-color-text-reverse-lm);
9268
+ }
9982
9269
 
9983
- .xpl-table--striped
9984
- .xpl-table-body
9985
- > xpl-table-row.xpl-table-row--selected:not(.xpl-table-row--disabled)
9986
- .xpl-table-cell,
9987
- .xpl-table--striped
9988
- .xpl-table-body
9989
- > .xpl-table-row.xpl-table-row--selected:not(.xpl-table-row--disabled)
9990
- > .xpl-table-cell {
9991
- background-color: var(--xpl-background-surface-information-bold);
9992
- }
9270
+ .dark .xpl-table-header-cell .sortable .sort-icon--sorted {
9271
+ color: var(--xpl-color-action-primary-dm);
9272
+ }
9993
9273
 
9994
- /* stylelint-enable no-descending-specificity */
9274
+ .dark .xpl-table-header-cell .sortable:focus {
9275
+ box-shadow: inset 0 0 0 1px var(--xpl-color-purple-500);
9276
+ }
9995
9277
 
9996
9278
  .xpl-tab {
9997
9279
  display: block;
@@ -10849,71 +10131,58 @@ span.xpl-placeholder--hidden,
10849
10131
  transform: translateX(12px);
10850
10132
  }
10851
10133
 
10134
+ /* stylelint-disable color-no-hex, function-disallowed-list -- TODO: migrate to var(--xpl-*) tokens (see TECH_DEBT.md) */
10135
+
10852
10136
  .xpl-toolbar .toolbar {
10137
+ margin-bottom: 0.5rem;
10853
10138
  display: flex;
10854
- width: 100%;
10139
+ height: 3.5rem;
10855
10140
  align-items: center;
10141
+ border-top-width: 1px;
10142
+ border-bottom-width: 1px;
10143
+ --tw-border-opacity: 1;
10144
+ border-color: rgb(106 109 125 / var(--tw-border-opacity, 1));
10145
+ padding-left: 1.5rem;
10146
+ padding-right: 1.5rem;
10147
+ padding-top: 0.75rem;
10148
+ padding-bottom: 0.75rem;
10856
10149
 
10857
- background-color: var(--xpl-background-surface-subtlest);
10858
- border-top: var(--xpl-border-small) solid var(--xpl-border-default);
10859
- border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
10860
- padding: var(--xpl-space-12) var(--xpl-space-24);
10861
- gap: var(--xpl-space-16);
10150
+ background-color: var(--xpl-color-foreground-dm);
10862
10151
  box-shadow:
10863
- 0 4px 6px 0 var(--xpl-background-surface-transparent-10),
10864
- 0 2px 4px 0 var(--xpl-background-surface-transparent-5);
10152
+ 0 1px 3px 0 rgb(0 0 0 / 0.1),
10153
+ 0 1px 2px 0 rgb(0 0 0 / 0.06);
10865
10154
  }
10866
10155
 
10867
10156
  .xpl-toolbar .toolbar .selected-item-count {
10157
+ margin-right: 1.5rem;
10868
10158
  display: flex;
10869
10159
  align-items: center;
10160
+ justify-content: center;
10870
10161
  white-space: nowrap;
10162
+ border-right-width: 1px;
10163
+ --tw-border-opacity: 1;
10164
+ border-color: rgb(225 226 232 / var(--tw-border-opacity, 1));
10165
+ padding-top: 0.25rem;
10166
+ padding-bottom: 0.25rem;
10167
+ padding-right: 1.5rem;
10871
10168
 
10872
- color: var(--xpl-text-default);
10873
- font-size: var(--xpl-font-size-title-5);
10874
- font-weight: var(--xpl-font-weight-medium);
10875
- padding-right: var(--xpl-space-16);
10876
- border-right: var(--xpl-border-small) solid var(--xpl-border-default);
10169
+ color: var(--xpl-color-text-reverse-lm);
10170
+ font-size: var(--xpl-size-font-title-5);
10877
10171
  }
10878
10172
 
10879
10173
  .xpl-toolbar .toolbar .actions {
10880
10174
  display: flex;
10881
- flex: 1 1 0%;
10882
-
10883
- gap: var(--xpl-space-16);
10884
- }
10885
-
10886
- .xpl-toolbar .toolbar .actions [slot="actions-right"]:first-child {
10887
- margin-left: auto;
10175
+ width: 100%;
10888
10176
  }
10889
10177
 
10890
- /*
10891
- * Figma XPL-Dynamic-Table-Toolbar: inverse bar on light canvas (xpl-table selection chrome only).
10892
- * Standalone `xpl-toolbar` keeps the default subtlest bar above.
10893
- */
10894
-
10895
- .xpl-table__toolbar.xpl-toolbar .toolbar {
10896
- background-color: var(--xpl-background-surface-inverse-on-light);
10897
- border-top-color: var(--xpl-border-strong);
10898
- border-bottom-color: var(--xpl-border-strong);
10178
+ .xpl-toolbar .toolbar .actions [slot="actions-left"] {
10179
+ margin-right: 1rem;
10899
10180
  }
10900
10181
 
10901
- .xpl-table__toolbar.xpl-toolbar .toolbar .selected-item-count {
10902
- color: var(--xpl-text-inverse);
10903
- border-right-color: var(--xpl-border-inverse);
10904
- }
10905
-
10906
- .dark .xpl-table__toolbar.xpl-toolbar .toolbar {
10907
- background-color: var(--xpl-background-surface-subtlest);
10908
- border-top-color: var(--xpl-border-default);
10909
- border-bottom-color: var(--xpl-border-default);
10182
+ .xpl-toolbar .toolbar .actions [slot="actions-right"] {
10183
+ margin-left: 1rem;
10910
10184
  }
10911
10185
 
10912
- .dark .xpl-table__toolbar.xpl-toolbar .toolbar .selected-item-count {
10913
- color: var(--xpl-text-default);
10914
- border-right-color: var(--xpl-border-default);
10915
- }
10916
-
10917
10186
  .xpl-toolbar.hidden {
10918
10187
  display: none;
10919
10188
  }