@einfach-excel/spreadsheet-ui-styles 0.0.0-stage → 0.2.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.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -2
  3. package/features/comment-thread.css +169 -0
  4. package/features/comment-thread.css.d.ts +2 -0
  5. package/features/conditional-format-dialog.css +254 -0
  6. package/features/conditional-format-dialog.css.d.ts +7 -0
  7. package/features/conditional-format-fields.css +10 -0
  8. package/features/conditional-format-fields.css.d.ts +2 -0
  9. package/features/data-validation-dialog.css +197 -0
  10. package/features/data-validation-dialog.css.d.ts +7 -0
  11. package/features/filter-dropdown.css +177 -0
  12. package/features/filter-dropdown.css.d.ts +2 -0
  13. package/features/find-replace-actions.css +13 -0
  14. package/features/find-replace-actions.css.d.ts +2 -0
  15. package/features/find-replace-dialog.css +147 -0
  16. package/features/find-replace-dialog.css.d.ts +2 -0
  17. package/features/find-replace-status-messages.css +19 -0
  18. package/features/find-replace-status-messages.css.d.ts +2 -0
  19. package/features/format-cells-dialog.css +296 -0
  20. package/features/format-cells-dialog.css.d.ts +2 -0
  21. package/features/format-cells-panels.css +154 -0
  22. package/features/format-cells-panels.css.d.ts +2 -0
  23. package/features/go-to-dialog.css +205 -0
  24. package/features/go-to-dialog.css.d.ts +2 -0
  25. package/features/menu-help-dialog.css +82 -0
  26. package/features/name-manager-dialog.css +276 -0
  27. package/features/number-format-dialog.css +147 -0
  28. package/features/number-format-dialog.css.d.ts +2 -0
  29. package/features/page-setup-dialog.css +167 -0
  30. package/features/page-setup-dialog.css.d.ts +3 -0
  31. package/features/paste-special-dialog.css +126 -0
  32. package/features/paste-special-dialog.css.d.ts +7 -0
  33. package/features/print-preview-dialog.css +197 -0
  34. package/features/print-preview-dialog.css.d.ts +3 -0
  35. package/features/protection-unlock-dialog.css +127 -0
  36. package/features/remove-duplicates-dialog.css +165 -0
  37. package/features/remove-duplicates-dialog.css.d.ts +7 -0
  38. package/features/sheet-tab-delete-dialog.css +64 -0
  39. package/features/sheet-tab-delete-dialog.css.d.ts +3 -0
  40. package/features/sort-confirmation-dialog.css +157 -0
  41. package/features/sort-confirmation-dialog.css.d.ts +2 -0
  42. package/features/text-to-columns-dialog.css +246 -0
  43. package/features/text-to-columns-dialog.css.d.ts +2 -0
  44. package/features/toolbar-shell.css +46 -0
  45. package/features/toolbar-shell.css.d.ts +2 -0
  46. package/package.json +40 -3
  47. package/styles/button-states.css +45 -0
  48. package/styles/chrome-tokens.css +124 -0
  49. package/styles/demo-header.css +23 -0
  50. package/styles/demo-two-column.css +115 -0
  51. package/styles/diagnostics.css +127 -0
  52. package/styles/dialog-skin.css +143 -0
  53. package/styles/formula-autocomplete.css +87 -0
  54. package/styles/formula-bar-row.css +51 -0
  55. package/styles/grid-cells.css +254 -0
  56. package/styles/grid-frame.css +268 -0
  57. package/styles/grid-headers.css +99 -0
  58. package/styles/grid-overlays.css +160 -0
  59. package/styles/help-overlay.css +67 -0
  60. package/styles/history-panel.css +127 -0
  61. package/styles/index.css +26 -0
  62. package/styles/locked-edit-feedback.css +45 -0
  63. package/styles/marching-ants.css +18 -0
  64. package/styles/menu-bar.css +97 -0
  65. package/styles/name-box.css +89 -0
  66. package/styles/presence-overlay.css +36 -0
  67. package/styles/shared-context-menu.css +50 -0
  68. package/styles/shared-format-toolbar.css +82 -0
  69. package/styles/shared-sheet-tabs.css +138 -0
  70. package/styles/sheet-tabs.css +98 -0
  71. package/styles/status-bar.css +161 -0
  72. package/styles/toolbar-popovers.css +278 -0
  73. package/styles/toolbar.css +213 -0
@@ -0,0 +1,127 @@
1
+ /* === D. 诊断条 —— 失败操作的可见出口 ================================== */
2
+
3
+ /* 贴在状态栏之上的一条通知流。只有有诊断时才渲染(组件里 <Show> 控制),
4
+ 所以这里不做 `:empty` 隐藏。 */
5
+ .spreadsheet-diagnostics {
6
+ display: flex;
7
+ flex-wrap: wrap;
8
+ align-items: center;
9
+ gap: 6px;
10
+ padding: 4px 8px;
11
+ border-top: 1px solid var(--border);
12
+ background: var(--bg-chrome);
13
+ color: var(--text-default);
14
+ font-family: var(--excel-font);
15
+ font-size: 12px;
16
+ }
17
+
18
+ .spreadsheet-diagnostics-item {
19
+ display: inline-flex;
20
+ align-items: center;
21
+ gap: 6px;
22
+ max-width: 100%;
23
+ padding: 2px 6px;
24
+ border: 1px solid var(--border);
25
+ border-radius: 3px;
26
+ background: var(--bg-default);
27
+ }
28
+
29
+ /* 严重程度只靠颜色区分是不够的(色觉障碍 + 单色打印),所以左侧留一条
30
+ 宽边框,并且文本徽标本身就写着级别。 */
31
+ .spreadsheet-diagnostics-item[data-severity='error'] {
32
+ border-left: 3px solid var(--danger, #c0392b);
33
+ }
34
+
35
+ .spreadsheet-diagnostics-item[data-severity='warning'] {
36
+ border-left: 3px solid var(--warning, #d68910);
37
+ }
38
+
39
+ .spreadsheet-diagnostics-item[data-severity='info'] {
40
+ border-left: 3px solid var(--accent, #2e75b6);
41
+ }
42
+
43
+ .spreadsheet-diagnostics-severity {
44
+ flex: none;
45
+ text-transform: uppercase;
46
+ font-size: 10px;
47
+ letter-spacing: 0.04em;
48
+ opacity: 0.75;
49
+ }
50
+
51
+ /* 视觉上徽标已经在左边显示了一次,读屏再读一次是冗余;但徽标是
52
+ aria-hidden 的,所以给读屏留这一份。 */
53
+ .spreadsheet-diagnostics-severity-sr {
54
+ position: absolute;
55
+ width: 1px;
56
+ height: 1px;
57
+ margin: -1px;
58
+ padding: 0;
59
+ overflow: hidden;
60
+ clip: rect(0, 0, 0, 0);
61
+ white-space: nowrap;
62
+ border: 0;
63
+ }
64
+
65
+ .spreadsheet-diagnostics-message {
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ white-space: nowrap;
69
+ }
70
+
71
+ .spreadsheet-diagnostics-dismiss,
72
+ .spreadsheet-diagnostics-clear {
73
+ flex: none;
74
+ padding: 0 4px;
75
+ border: none;
76
+ background: transparent;
77
+ color: inherit;
78
+ font: inherit;
79
+ line-height: 1;
80
+ cursor: pointer;
81
+ }
82
+
83
+ .spreadsheet-diagnostics-clear {
84
+ margin-left: auto;
85
+ text-decoration: underline;
86
+ }
87
+
88
+ .spreadsheet-diagnostics-dismiss:hover,
89
+ .spreadsheet-diagnostics-clear:hover {
90
+ background: var(--bg-hover);
91
+ }
92
+
93
+ .spreadsheet-diagnostics-overflow {
94
+ opacity: 0.7;
95
+ }
96
+
97
+ /* --- `#SPILL!` 阻塞线索 ---------------------------------------------------
98
+
99
+ 与上面的诊断条**不是**同一个东西:那是日志流(逐条可关、会堆叠),这是随选区
100
+ 变化的一行状态。所以不给 dismiss、不做列表、也不共用 `.spreadsheet-diagnostics`
101
+ 的 class —— 复用会让它继承「可以堆两条」的视觉暗示。 */
102
+ .spreadsheet-spill-blocked {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 6px;
106
+ padding: 4px 8px;
107
+ border-top: 1px solid var(--border);
108
+ border-left: 3px solid var(--warning, #d68910);
109
+ background: var(--bg-chrome);
110
+ color: var(--text-default);
111
+ font-family: var(--excel-font);
112
+ font-size: 12px;
113
+ }
114
+
115
+ /* 错误码本身用等宽,用户在单元格里看到的就是这几个字符,两处要认得出是同一个。 */
116
+ .spreadsheet-spill-blocked-code {
117
+ flex: none;
118
+ font-family: var(--excel-mono-font, ui-monospace, monospace);
119
+ font-weight: 600;
120
+ opacity: 0.85;
121
+ }
122
+
123
+ .spreadsheet-spill-blocked-message {
124
+ overflow: hidden;
125
+ text-overflow: ellipsis;
126
+ white-space: nowrap;
127
+ }
@@ -0,0 +1,143 @@
1
+ /* Office Excel for web modal contract. Feature styles own body layout only. */
2
+
3
+ :is(.vnext-demo, .demo-page)
4
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown) {
5
+ position: fixed;
6
+ top: 50%;
7
+ left: 50%;
8
+ z-index: 1000;
9
+ isolation: isolate;
10
+ display: flex;
11
+ flex-direction: column;
12
+ min-width: 360px;
13
+ max-width: min(720px, calc(100vw - 32px));
14
+ max-height: calc(100vh - 32px);
15
+ padding: 0;
16
+ transform: translate(-50%, -50%);
17
+ overflow: hidden;
18
+ border: 1px solid var(--border);
19
+ border-radius: var(--radius);
20
+ background: var(--bg-surface);
21
+ box-shadow:
22
+ 0 0 0 100vmax var(--dialog-overlay),
23
+ var(--dialog-shadow);
24
+ color: var(--text-default);
25
+ font-family: var(--excel-font);
26
+ font-size: 13px;
27
+ }
28
+
29
+ :is(.vnext-demo, .demo-page)
30
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
31
+ > :is(header, [class$='-header'], [class*='-header ']) {
32
+ box-sizing: border-box;
33
+ display: flex;
34
+ flex: 0 0 var(--dialog-header-h);
35
+ align-items: center;
36
+ min-height: var(--dialog-header-h);
37
+ padding: 0 16px;
38
+ border-bottom: 1px solid var(--border);
39
+ background: var(--bg-surface);
40
+ }
41
+
42
+ :is(.vnext-demo, .demo-page)
43
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
44
+ > :is(header, [class$='-header'], [class*='-header '])
45
+ :is(h1, h2, h3) {
46
+ margin: 0;
47
+ color: var(--text-default);
48
+ font-size: 14px;
49
+ font-weight: 600;
50
+ }
51
+
52
+ :is(.vnext-demo, .demo-page)
53
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
54
+ > :is(
55
+ footer,
56
+ [class$='-footer'],
57
+ [class*='-footer '],
58
+ [class$='-actions'],
59
+ [class*='-actions ']
60
+ ) {
61
+ box-sizing: border-box;
62
+ display: flex;
63
+ flex: 0 0 auto;
64
+ align-items: center;
65
+ justify-content: flex-end;
66
+ gap: 8px;
67
+ padding: 10px 16px;
68
+ border-top: 1px solid var(--border);
69
+ background: var(--bg-surface);
70
+ }
71
+
72
+ :is(.vnext-demo, .demo-page)
73
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
74
+ :where(button, input:not([type='checkbox']):not([type='radio']), select) {
75
+ box-sizing: border-box;
76
+ height: var(--control-h);
77
+ min-height: var(--control-h);
78
+ border: 1px solid var(--border);
79
+ border-radius: var(--control-radius);
80
+ background: var(--bg-surface);
81
+ color: var(--text-default);
82
+ font: inherit;
83
+ }
84
+
85
+ :is(.vnext-demo, .demo-page)
86
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
87
+ :where(button, input, select, textarea):focus-visible {
88
+ border-color: var(--office-blue);
89
+ outline: 2px solid var(--office-blue);
90
+ outline-offset: 1px;
91
+ }
92
+
93
+ :is(.vnext-demo, .demo-page)
94
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
95
+ button:is([data-variant='primary'], [class$='-primary'], [class*='-primary ']) {
96
+ border-color: var(--dialog-primary-bg);
97
+ background: var(--dialog-primary-bg);
98
+ color: var(--text-on-accent);
99
+ }
100
+
101
+ :is(.vnext-demo, .demo-page)
102
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
103
+ button:is([data-variant='primary'], [class$='-primary'], [class*='-primary ']):hover:not(
104
+ :disabled
105
+ ) {
106
+ border-color: var(--dialog-primary-hover);
107
+ background: var(--dialog-primary-hover);
108
+ }
109
+
110
+ :is(.vnext-demo, .demo-page)
111
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
112
+ button:is([data-variant='primary'], [class$='-primary'], [class*='-primary ']):active:not(
113
+ :disabled
114
+ ) {
115
+ border-color: var(--dialog-primary-active);
116
+ background: var(--dialog-primary-active);
117
+ }
118
+
119
+ :is(.vnext-demo, .demo-page)
120
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
121
+ .dialog-close-x {
122
+ position: absolute;
123
+ top: 6px;
124
+ right: 8px;
125
+ display: inline-flex;
126
+ align-items: center;
127
+ justify-content: center;
128
+ width: var(--control-h);
129
+ padding: 0;
130
+ border: 0;
131
+ background: transparent;
132
+ color: var(--text-muted);
133
+ cursor: pointer;
134
+ font-size: 18px;
135
+ line-height: 1;
136
+ }
137
+
138
+ :is(.vnext-demo, .demo-page)
139
+ [role='dialog']:not(.spreadsheet-color-popover):not(.spreadsheet-filter-dropdown)
140
+ .dialog-close-x:hover {
141
+ background: var(--hover);
142
+ color: var(--text-default);
143
+ }
@@ -0,0 +1,87 @@
1
+ /* Formula autocomplete dropdown + signature tooltip. Anchored to the
2
+ active editing input (cell-input or formula-bar-input) via inline
3
+ `position: fixed` set by the component. */
4
+ .spreadsheet-formula-autocomplete {
5
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.08);
6
+ background: var(--bg-surface);
7
+ border: 1px solid var(--border);
8
+ border-radius: 4px;
9
+ font-size: 12px;
10
+ font-family: 'SF Mono', Menlo, monospace;
11
+ max-width: 480px;
12
+ }
13
+
14
+ .spreadsheet-formula-autocomplete-list {
15
+ list-style: none;
16
+ margin: 0;
17
+ padding: 4px 0;
18
+ max-height: 220px;
19
+ overflow-y: auto;
20
+ }
21
+
22
+ .spreadsheet-formula-autocomplete-row {
23
+ display: flex;
24
+ gap: 12px;
25
+ align-items: baseline;
26
+ padding: 4px 10px;
27
+ cursor: pointer;
28
+ white-space: nowrap;
29
+ }
30
+
31
+ .spreadsheet-formula-autocomplete-row-active {
32
+ background: var(--office-blue);
33
+ color: var(--text-on-accent);
34
+ }
35
+
36
+ .spreadsheet-formula-autocomplete-name {
37
+ font-weight: 600;
38
+ color: var(--office-blue-text);
39
+ flex-shrink: 0;
40
+ }
41
+
42
+ .spreadsheet-formula-autocomplete-row-active .spreadsheet-formula-autocomplete-name {
43
+ color: var(--text-on-accent);
44
+ }
45
+
46
+ .spreadsheet-formula-autocomplete-summary {
47
+ color: var(--text-muted);
48
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
49
+ font-size: 11px;
50
+ overflow: hidden;
51
+ text-overflow: ellipsis;
52
+ }
53
+
54
+ .spreadsheet-formula-autocomplete-row-active .spreadsheet-formula-autocomplete-summary {
55
+ color: var(--text-on-accent-soft);
56
+ }
57
+
58
+ .spreadsheet-formula-autocomplete-signature {
59
+ border-top: 1px solid var(--border);
60
+ padding: 4px 10px;
61
+ white-space: nowrap;
62
+ color: var(--text-muted);
63
+ background: var(--bg-chrome-light);
64
+ border-bottom-left-radius: 4px;
65
+ border-bottom-right-radius: 4px;
66
+ }
67
+
68
+ .spreadsheet-formula-autocomplete-signature-name {
69
+ color: var(--office-blue-text);
70
+ font-weight: 600;
71
+ }
72
+
73
+ .spreadsheet-formula-autocomplete-signature-arg {
74
+ color: var(--text-muted);
75
+ }
76
+
77
+ .spreadsheet-formula-autocomplete-signature-arg-active {
78
+ color: var(--office-blue-text);
79
+ font-weight: 700;
80
+ text-decoration: underline;
81
+ }
82
+
83
+ .spreadsheet-formula-autocomplete-signature-paren,
84
+ .spreadsheet-formula-autocomplete-signature-comma {
85
+ color: var(--text-muted);
86
+ }
87
+
@@ -0,0 +1,51 @@
1
+ /* Formula bar — sits above the grid, full width */
2
+ .formula-bar {
3
+ display: flex;
4
+ align-items: stretch;
5
+ gap: 0;
6
+ border: 1px solid #d0d7de;
7
+ background: #fafbfc;
8
+ margin-bottom: 6px;
9
+ font-family: -apple-system, sans-serif;
10
+ font-size: 13px;
11
+ }
12
+ .formula-bar-addr {
13
+ padding: 6px 12px;
14
+ min-width: 60px;
15
+ background: #f0f3f6;
16
+ border-right: 1px solid #d0d7de;
17
+ font-weight: 600;
18
+ font-family: monospace;
19
+ display: flex;
20
+ align-items: center;
21
+ }
22
+ .formula-bar-body {
23
+ flex: 1;
24
+ display: flex;
25
+ flex-direction: column;
26
+ }
27
+ .formula-bar-input {
28
+ flex: 1;
29
+ padding: 6px 12px;
30
+ border: none;
31
+ outline: none;
32
+ background: transparent;
33
+ font-family: monospace;
34
+ font-size: 13px;
35
+ }
36
+ .formula-bar-input:disabled {
37
+ color: #999;
38
+ background: #f6f6f6;
39
+ }
40
+
41
+ .formula-bar-error {
42
+ color: #b42318;
43
+ font-size: 11px;
44
+ line-height: 1.2;
45
+ padding: 2px 12px;
46
+ min-height: 14px;
47
+ white-space: nowrap;
48
+ overflow: hidden;
49
+ text-overflow: ellipsis;
50
+ }
51
+
@@ -0,0 +1,254 @@
1
+ /* Cell baseline */
2
+ .spreadsheet-grid .spreadsheet-grid-cell {
3
+ height: 24px;
4
+ padding: 0 3px;
5
+ border-right: 1px solid var(--gridline);
6
+ border-bottom: 1px solid var(--gridline);
7
+ background: var(--bg-cell);
8
+ color: var(--text-default);
9
+ font-family: var(--cell-font);
10
+ font-size: var(--cell-font-size);
11
+ font-variant-numeric: tabular-nums;
12
+ /* Excel 单元格默认底对齐(不是 UI 表格的垂直居中) */
13
+ vertical-align: bottom;
14
+ }
15
+
16
+ .spreadsheet-grid .spreadsheet-grid-cell.cell-in-range {
17
+ background: var(--select-bg);
18
+ }
19
+
20
+ .spreadsheet-grid .spreadsheet-grid-cell.cell-in-range:hover {
21
+ background: var(--select-bg);
22
+ }
23
+
24
+ /* 活动单元格保持画布底色(Excel 口径),绿色边框由 SVG overlay 绘制。 */
25
+ .spreadsheet-grid .spreadsheet-grid-cell.cell-active {
26
+ background: var(--bg-cell);
27
+ }
28
+
29
+ /* Numeric cells right-align by default (Excel convention) */
30
+ .spreadsheet-grid .spreadsheet-grid-cell.kind-number {
31
+ text-align: right;
32
+ }
33
+
34
+ /* Resize handles — show on hover for usability */
35
+ .spreadsheet-grid .spreadsheet-grid-col-resize-handle {
36
+ position: absolute;
37
+ right: -2px;
38
+ top: 0;
39
+ width: 4px;
40
+ height: 100%;
41
+ cursor: col-resize;
42
+ z-index: 2;
43
+ }
44
+
45
+ .spreadsheet-grid .spreadsheet-grid-col-resize-handle:hover {
46
+ background: var(--office-blue);
47
+ }
48
+
49
+ /* Filter chevron — small triangle on the right when a column has a filter */
50
+ .spreadsheet-grid .spreadsheet-grid-filter-chevron {
51
+ position: absolute;
52
+ right: 4px;
53
+ top: 50%;
54
+ transform: translateY(-50%);
55
+ color: var(--excel-green);
56
+ cursor: pointer;
57
+ }
58
+
59
+ .spreadsheet-filter-dropdown {
60
+ position: fixed;
61
+ top: 300px;
62
+ right: max(24px, calc((100vw - 1280px) / 2 + 40px));
63
+ left: auto;
64
+ transform: none;
65
+ z-index: 500;
66
+ display: block;
67
+ width: 320px;
68
+ min-width: 0;
69
+ max-width: calc(100vw - 48px);
70
+ max-height: min(520px, calc(100vh - 120px));
71
+ overflow: auto;
72
+ padding: 12px;
73
+ border: 1px solid var(--border-strong);
74
+ border-radius: 4px;
75
+ background: var(--bg-surface);
76
+ box-shadow: var(--shadow-popover);
77
+ color: var(--text-default);
78
+ font-size: 12px;
79
+ }
80
+
81
+ .filter-dropdown-header {
82
+ display: flex;
83
+ align-items: flex-start;
84
+ justify-content: space-between;
85
+ gap: 8px;
86
+ padding-bottom: 8px;
87
+ border-bottom: 1px solid var(--border);
88
+ }
89
+
90
+ .filter-dropdown-title {
91
+ font-size: 13px;
92
+ font-weight: 700;
93
+ }
94
+
95
+ .filter-dropdown-subtitle {
96
+ margin-top: 2px;
97
+ color: var(--text-muted);
98
+ }
99
+
100
+ .filter-dropdown-rules {
101
+ display: flex;
102
+ flex-wrap: wrap;
103
+ gap: 4px;
104
+ padding: 8px 0 0;
105
+ }
106
+
107
+ .filter-rule {
108
+ max-width: 100%;
109
+ padding: 2px 6px;
110
+ border: 1px solid var(--border);
111
+ border-radius: 3px;
112
+ background: var(--select-bg);
113
+ color: var(--excel-green-text);
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ white-space: nowrap;
117
+ }
118
+
119
+ .filter-section {
120
+ padding-top: 10px;
121
+ }
122
+
123
+ .filter-section-title {
124
+ margin-bottom: 6px;
125
+ color: var(--text-muted);
126
+ font-weight: 700;
127
+ }
128
+
129
+ .filter-action-row,
130
+ .filter-footer {
131
+ display: flex;
132
+ flex-wrap: wrap;
133
+ gap: 8px;
134
+ }
135
+
136
+ .filter-btn {
137
+ height: 28px;
138
+ padding: 0 10px;
139
+ border: 1px solid var(--border);
140
+ border-radius: 3px;
141
+ background: var(--bg-surface);
142
+ color: var(--text-default);
143
+ font: inherit;
144
+ cursor: pointer;
145
+ }
146
+
147
+ .filter-btn:hover {
148
+ background: var(--bg-chrome);
149
+ }
150
+
151
+ .filter-btn-primary {
152
+ border-color: var(--excel-green);
153
+ background: var(--excel-green);
154
+ color: var(--text-on-accent);
155
+ }
156
+
157
+ .filter-btn-secondary {
158
+ color: var(--text-muted);
159
+ }
160
+
161
+ .filter-search-input,
162
+ .filter-condition-input,
163
+ .filter-condition-select {
164
+ width: 100%;
165
+ height: 28px;
166
+ box-sizing: border-box;
167
+ border: 1px solid var(--border);
168
+ border-radius: 3px;
169
+ padding: 0 8px;
170
+ color: var(--text-default);
171
+ font: inherit;
172
+ }
173
+
174
+ .filter-values-list {
175
+ max-height: 148px;
176
+ margin-top: 6px;
177
+ overflow: auto;
178
+ border: 1px solid var(--border);
179
+ border-radius: 3px;
180
+ }
181
+
182
+ .filter-value-option {
183
+ display: flex;
184
+ align-items: center;
185
+ gap: 6px;
186
+ min-height: 26px;
187
+ padding: 0 8px;
188
+ }
189
+
190
+ .filter-value-option:hover {
191
+ background: var(--bg-chrome);
192
+ }
193
+
194
+ .filter-value-option-all {
195
+ margin-top: 6px;
196
+ border: 1px solid var(--border);
197
+ border-radius: 3px;
198
+ }
199
+
200
+ .filter-empty-values,
201
+ .filter-values-count,
202
+ .filter-error {
203
+ padding: 6px 0;
204
+ color: var(--text-muted);
205
+ }
206
+
207
+ .filter-error {
208
+ color: var(--error-text);
209
+ }
210
+
211
+ .filter-range-row {
212
+ display: grid;
213
+ grid-template-columns: 1fr 1fr;
214
+ gap: 6px;
215
+ margin-top: 6px;
216
+ }
217
+
218
+ .filter-section .filter-condition-input {
219
+ margin-top: 6px;
220
+ }
221
+
222
+ .filter-range-row .filter-condition-input {
223
+ margin-top: 0;
224
+ }
225
+
226
+ .filter-footer {
227
+ align-items: center;
228
+ justify-content: space-between;
229
+ padding-top: 12px;
230
+ margin-top: 2px;
231
+ border-top: 1px solid var(--border);
232
+ }
233
+
234
+ .filter-footer-group {
235
+ display: flex;
236
+ gap: 6px;
237
+ }
238
+
239
+ .vnext-demo [role='dialog'].spreadsheet-filter-dropdown,
240
+ .demo-page [role='dialog'].spreadsheet-filter-dropdown {
241
+ position: fixed;
242
+ top: 220px;
243
+ right: max(24px, calc((100vw - 1280px) / 2 + 40px));
244
+ left: auto;
245
+ transform: none;
246
+ display: block;
247
+ width: 320px;
248
+ min-width: 0;
249
+ max-width: calc(100vw - 48px);
250
+ max-height: calc(100vh - 260px);
251
+ overflow: auto;
252
+ padding: 12px;
253
+ }
254
+