@zvndev/yable-themes 0.1.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.
@@ -0,0 +1,299 @@
1
+ /* ============================================================================
2
+ @zvndev/yable-themes — Design Tokens
3
+ CSS custom properties for the entire YableTables design system.
4
+ Override these to customize any visual property.
5
+
6
+ Token Map (for createTheme() theme builder):
7
+ bg -> --yable-bg
8
+ bgHeader -> --yable-bg-header
9
+ bgFooter -> --yable-bg-footer
10
+ bgRow -> --yable-bg-row
11
+ bgRowAlt -> --yable-bg-row-alt
12
+ bgRowHover -> --yable-bg-row-hover
13
+ bgRowSelected -> --yable-bg-row-selected
14
+ bgCellEditing -> --yable-bg-cell-editing
15
+ bgPinned -> --yable-bg-pinned
16
+ bgRowDragOver -> --yable-bg-row-drag-over
17
+ textPrimary -> --yable-text-primary
18
+ textSecondary -> --yable-text-secondary
19
+ textTertiary -> --yable-text-tertiary
20
+ textHeader -> --yable-text-header
21
+ borderColor -> --yable-border-color
22
+ borderColorStrong -> --yable-border-color-strong
23
+ accent -> --yable-accent
24
+ accentHover -> --yable-accent-hover
25
+ accentLight -> --yable-accent-light
26
+ accentText -> --yable-accent-text
27
+ focusRing -> --yable-focus-ring
28
+ ============================================================================ */
29
+
30
+ :root {
31
+ /* ── Surface Colors ────────────────────────────────────────────────────── */
32
+ --yable-bg: #ffffff;
33
+ --yable-bg-header: #fafafa;
34
+ --yable-bg-footer: #fafafa;
35
+ --yable-bg-row: transparent;
36
+ --yable-bg-row-alt: rgba(0, 0, 0, 0.015);
37
+ --yable-bg-row-hover: rgba(0, 0, 0, 0.02);
38
+ --yable-bg-row-selected: rgba(37, 99, 235, 0.06);
39
+ --yable-bg-row-expanded: rgba(0, 0, 0, 0.01);
40
+ --yable-bg-cell-editing: #ffffff;
41
+ --yable-bg-pinned: #fdfdfd;
42
+ --yable-bg-row-drag-over: rgba(37, 99, 235, 0.08);
43
+
44
+ /* ── Text Colors ───────────────────────────────────────────────────────── */
45
+ --yable-text-primary: #18181b;
46
+ --yable-text-secondary: #71717a;
47
+ --yable-text-tertiary: #a1a1aa;
48
+ --yable-text-header: #3f3f46;
49
+ --yable-text-disabled: #d4d4d8;
50
+ --yable-text-link: #2563eb;
51
+ --yable-text-placeholder: #a1a1aa;
52
+
53
+ /* ── Border ────────────────────────────────────────────────────────────── */
54
+ --yable-border-color: #e4e4e7;
55
+ --yable-border-color-strong: #d4d4d8;
56
+ --yable-border-width: 1px;
57
+ --yable-border-radius: 6px;
58
+ --yable-border-radius-sm: 4px;
59
+ --yable-border-radius-lg: 10px;
60
+
61
+ /* ── Spacing ───────────────────────────────────────────────────────────── */
62
+ --yable-cell-padding-x: 14px;
63
+ --yable-cell-padding-y: 10px;
64
+ --yable-header-padding-x: 14px;
65
+ --yable-header-padding-y: 11px;
66
+
67
+ /* ── Async commit / cell status (Task #10) ───────────────────────────── */
68
+ --yable-cell-pending-opacity: 0.65;
69
+ --yable-cell-pending-cursor: progress;
70
+ --yable-cell-error-border-color: #f87171;
71
+ --yable-cell-error-bg: rgba(248, 113, 113, 0.08);
72
+ --yable-cell-error-icon-color: #f87171;
73
+ --yable-cell-conflict-border-color: #fbbf24;
74
+ --yable-cell-conflict-bg: rgba(251, 191, 36, 0.10);
75
+ --yable-cell-conflict-icon-color: #fbbf24;
76
+ --yable-cell-status-badge-size: 18px;
77
+
78
+ /* ── Typography ────────────────────────────────────────────────────────── */
79
+ --yable-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
80
+ --yable-font-size: 13px;
81
+ --yable-font-size-sm: 12px;
82
+ --yable-font-size-header: 12px;
83
+ --yable-font-weight-normal: 400;
84
+ --yable-font-weight-medium: 500;
85
+ --yable-font-weight-semibold: 600;
86
+ --yable-line-height: 1.5;
87
+
88
+ /* ── Sizing ────────────────────────────────────────────────────────────── */
89
+ --yable-row-height: auto;
90
+ --yable-row-min-height: 40px;
91
+ --yable-header-height: auto;
92
+ --yable-header-min-height: 40px;
93
+ --yable-resize-handle-width: 4px;
94
+ --yable-resize-handle-color: transparent;
95
+ --yable-resize-handle-color-active: var(--yable-accent);
96
+
97
+ /* ── Accent / Interactive ──────────────────────────────────────────────── */
98
+ --yable-accent: #2563eb;
99
+ --yable-accent-hover: #1d4ed8;
100
+ --yable-accent-light: rgba(37, 99, 235, 0.06);
101
+ --yable-accent-text: #ffffff;
102
+
103
+ /* ── Focus ─────────────────────────────────────────────────────────────── */
104
+ --yable-focus-ring: 0 0 0 2px var(--yable-bg), 0 0 0 4px var(--yable-accent);
105
+
106
+ /* ── Shadows ───────────────────────────────────────────────────────────── */
107
+ --yable-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
108
+ --yable-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.08);
109
+ --yable-shadow-pinned: 4px 0 8px -2px rgba(0, 0, 0, 0.06);
110
+
111
+ /* ── Scrollbar ─────────────────────────────────────────────────────────── */
112
+ --yable-scrollbar-thumb: rgba(0, 0, 0, 0.15);
113
+ --yable-scrollbar-track: transparent;
114
+
115
+ /* ── Transitions ───────────────────────────────────────────────────────── */
116
+ --yable-transition-fast: 100ms ease;
117
+ --yable-transition: 150ms ease;
118
+ --yable-transition-slow: 250ms ease;
119
+
120
+ /* ── Form Controls (in-cell) ───────────────────────────────────────────── */
121
+ --yable-input-bg: transparent;
122
+ --yable-input-bg-hover: rgba(0, 0, 0, 0.03);
123
+ --yable-input-bg-focus: #ffffff;
124
+ --yable-input-border: #d4d4d8;
125
+ --yable-input-border-hover: #a1a1aa;
126
+ --yable-input-border-focus: var(--yable-accent);
127
+ --yable-input-border-radius: 4px;
128
+ --yable-input-height: 28px;
129
+ --yable-input-padding-x: 8px;
130
+ --yable-input-font-size: var(--yable-font-size);
131
+ --yable-input-shadow-focus: 0 0 0 2px var(--yable-accent-light);
132
+
133
+ /* ── Checkbox / Toggle ─────────────────────────────────────────────────── */
134
+ --yable-checkbox-size: 16px;
135
+ --yable-checkbox-border: #d4d4d8;
136
+ --yable-checkbox-bg: #ffffff;
137
+ --yable-checkbox-bg-checked: var(--yable-accent);
138
+ --yable-checkbox-border-checked: var(--yable-accent);
139
+ --yable-checkbox-checkmark: #ffffff;
140
+ --yable-checkbox-radius: 3px;
141
+
142
+ /* ── Pagination ────────────────────────────────────────────────────────── */
143
+ --yable-pagination-gap: 4px;
144
+ --yable-pagination-button-size: 32px;
145
+ --yable-pagination-button-radius: 6px;
146
+ --yable-pagination-button-bg: transparent;
147
+ --yable-pagination-button-bg-hover: rgba(0, 0, 0, 0.04);
148
+ --yable-pagination-button-bg-active: var(--yable-accent);
149
+ --yable-pagination-button-text: var(--yable-text-secondary);
150
+ --yable-pagination-button-text-active: var(--yable-accent-text);
151
+
152
+ /* ── Sort Indicator ────────────────────────────────────────────────────── */
153
+ --yable-sort-icon-size: 14px;
154
+ --yable-sort-icon-color: var(--yable-text-tertiary);
155
+ --yable-sort-icon-color-active: var(--yable-text-primary);
156
+
157
+ /* ── Selection ─────────────────────────────────────────────────────────── */
158
+ --yable-selection-border-color: var(--yable-accent);
159
+
160
+ /* ── Empty / Loading State ─────────────────────────────────────────────── */
161
+ --yable-empty-padding: 48px;
162
+ --yable-empty-text-color: var(--yable-text-tertiary);
163
+ --yable-loading-shimmer: linear-gradient(
164
+ 90deg,
165
+ rgba(0, 0, 0, 0.03) 25%,
166
+ rgba(0, 0, 0, 0.06) 37%,
167
+ rgba(0, 0, 0, 0.03) 63%
168
+ );
169
+
170
+ /* ── Z-Index Layers ────────────────────────────────────────────────────── */
171
+ --yable-z-header: 10;
172
+ --yable-z-pinned: 20;
173
+ --yable-z-resize: 30;
174
+ --yable-z-overlay: 40;
175
+ --yable-z-tooltip: 9999;
176
+ --yable-z-context-menu: 9999;
177
+
178
+ /* ── Cell Flash ──────────────────────────────────────────────────────── */
179
+ --yable-flash-up-color: rgba(34, 197, 94, 0.25);
180
+ --yable-flash-down-color: rgba(239, 68, 68, 0.25);
181
+ --yable-flash-change-color: rgba(59, 130, 246, 0.2);
182
+ --yable-flash-duration: 700ms;
183
+ }
184
+
185
+ /* ── Dark Mode (auto via prefers-color-scheme) ───────────────────────────── */
186
+ @media (prefers-color-scheme: dark) {
187
+ :root:not([data-yable-theme="light"]) {
188
+ --yable-bg: #09090b;
189
+ --yable-bg-header: #18181b;
190
+ --yable-bg-footer: #18181b;
191
+ --yable-bg-row: transparent;
192
+ --yable-bg-row-alt: rgba(255, 255, 255, 0.02);
193
+ --yable-bg-row-hover: rgba(255, 255, 255, 0.03);
194
+ --yable-bg-row-selected: rgba(59, 130, 246, 0.1);
195
+ --yable-bg-row-expanded: rgba(255, 255, 255, 0.02);
196
+ --yable-bg-cell-editing: #1c1c1f;
197
+ --yable-bg-pinned: #111113;
198
+ --yable-bg-row-drag-over: rgba(59, 130, 246, 0.12);
199
+
200
+ --yable-text-primary: #fafafa;
201
+ --yable-text-secondary: #a1a1aa;
202
+ --yable-text-tertiary: #71717a;
203
+ --yable-text-header: #d4d4d8;
204
+ --yable-text-disabled: #3f3f46;
205
+ --yable-text-link: #60a5fa;
206
+ --yable-text-placeholder: #52525b;
207
+
208
+ --yable-border-color: #27272a;
209
+ --yable-border-color-strong: #3f3f46;
210
+
211
+ --yable-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
212
+ --yable-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.5);
213
+ --yable-shadow-pinned: 4px 0 8px -2px rgba(0, 0, 0, 0.3);
214
+
215
+ --yable-accent: #3b82f6;
216
+ --yable-accent-hover: #60a5fa;
217
+ --yable-accent-light: rgba(59, 130, 246, 0.12);
218
+
219
+ --yable-focus-ring: 0 0 0 2px var(--yable-bg), 0 0 0 4px var(--yable-accent);
220
+
221
+ --yable-scrollbar-thumb: rgba(255, 255, 255, 0.15);
222
+ --yable-scrollbar-track: transparent;
223
+
224
+ --yable-input-bg: transparent;
225
+ --yable-input-bg-hover: rgba(255, 255, 255, 0.04);
226
+ --yable-input-bg-focus: #1c1c1f;
227
+ --yable-input-border: #3f3f46;
228
+ --yable-input-border-hover: #52525b;
229
+
230
+ --yable-checkbox-border: #3f3f46;
231
+ --yable-checkbox-bg: #27272a;
232
+
233
+ --yable-pagination-button-bg-hover: rgba(255, 255, 255, 0.06);
234
+
235
+ --yable-loading-shimmer: linear-gradient(
236
+ 90deg,
237
+ rgba(255, 255, 255, 0.03) 25%,
238
+ rgba(255, 255, 255, 0.06) 37%,
239
+ rgba(255, 255, 255, 0.03) 63%
240
+ );
241
+ }
242
+ }
243
+
244
+ /* ── Dark Mode (manual override) ─────────────────────────────────────────── */
245
+ [data-yable-theme="dark"] {
246
+ --yable-bg: #09090b;
247
+ --yable-bg-header: #18181b;
248
+ --yable-bg-footer: #18181b;
249
+ --yable-bg-row: transparent;
250
+ --yable-bg-row-alt: rgba(255, 255, 255, 0.02);
251
+ --yable-bg-row-hover: rgba(255, 255, 255, 0.03);
252
+ --yable-bg-row-selected: rgba(59, 130, 246, 0.1);
253
+ --yable-bg-row-expanded: rgba(255, 255, 255, 0.02);
254
+ --yable-bg-cell-editing: #1c1c1f;
255
+ --yable-bg-pinned: #111113;
256
+ --yable-bg-row-drag-over: rgba(59, 130, 246, 0.12);
257
+
258
+ --yable-text-primary: #fafafa;
259
+ --yable-text-secondary: #a1a1aa;
260
+ --yable-text-tertiary: #71717a;
261
+ --yable-text-header: #d4d4d8;
262
+ --yable-text-disabled: #3f3f46;
263
+ --yable-text-link: #60a5fa;
264
+ --yable-text-placeholder: #52525b;
265
+
266
+ --yable-border-color: #27272a;
267
+ --yable-border-color-strong: #3f3f46;
268
+
269
+ --yable-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
270
+ --yable-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.5);
271
+ --yable-shadow-pinned: 4px 0 8px -2px rgba(0, 0, 0, 0.3);
272
+
273
+ --yable-accent: #3b82f6;
274
+ --yable-accent-hover: #60a5fa;
275
+ --yable-accent-light: rgba(59, 130, 246, 0.12);
276
+
277
+ --yable-focus-ring: 0 0 0 2px var(--yable-bg), 0 0 0 4px var(--yable-accent);
278
+
279
+ --yable-scrollbar-thumb: rgba(255, 255, 255, 0.15);
280
+ --yable-scrollbar-track: transparent;
281
+
282
+ --yable-input-bg: transparent;
283
+ --yable-input-bg-hover: rgba(255, 255, 255, 0.04);
284
+ --yable-input-bg-focus: #1c1c1f;
285
+ --yable-input-border: #3f3f46;
286
+ --yable-input-border-hover: #52525b;
287
+
288
+ --yable-checkbox-border: #3f3f46;
289
+ --yable-checkbox-bg: #27272a;
290
+
291
+ --yable-pagination-button-bg-hover: rgba(255, 255, 255, 0.06);
292
+
293
+ --yable-loading-shimmer: linear-gradient(
294
+ 90deg,
295
+ rgba(255, 255, 255, 0.03) 25%,
296
+ rgba(255, 255, 255, 0.06) 37%,
297
+ rgba(255, 255, 255, 0.03) 63%
298
+ );
299
+ }