@sylwellsoftware/fray 0.4.0 → 0.6.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 (50) hide show
  1. package/README.md +51 -27
  2. package/colors/README.md +28 -13
  3. package/colors/gray/colors.css +54 -26
  4. package/colors/green/colors.css +54 -26
  5. package/colors/iceblue/colors.css +54 -26
  6. package/colors/ocean/colors.css +54 -26
  7. package/colors/orange/colors.css +54 -26
  8. package/colors/purple/colors.css +54 -26
  9. package/colors/red/colors.css +54 -26
  10. package/colors/yellow/colors.css +54 -26
  11. package/dist/Components/data/descriptionList.d.ts.map +1 -1
  12. package/dist/Components/data/listview/listview.d.ts.map +1 -1
  13. package/dist/Components/data/table/DataTable.d.ts.map +1 -1
  14. package/dist/Components/data/table/FilterPanel.d.ts.map +1 -1
  15. package/dist/Components/data/table/TableHeaderCell.d.ts.map +1 -1
  16. package/dist/Components/data/treeview/treeview.d.ts.map +1 -1
  17. package/dist/Components/dialog/dialog.d.ts.map +1 -1
  18. package/dist/Components/layout/panel.d.ts +0 -1
  19. package/dist/Components/layout/panel.d.ts.map +1 -1
  20. package/dist/Components/layout/sidebar.d.ts +0 -1
  21. package/dist/Components/layout/sidebar.d.ts.map +1 -1
  22. package/dist/Components/layout/tabpanel/tabline.d.ts.map +1 -1
  23. package/dist/Components/layout/tabpanel/tabpanel.d.ts.map +1 -1
  24. package/dist/Components/lineinputs/checkbox/Checkbox.d.ts.map +1 -1
  25. package/dist/Components/lineinputs/dropdown.d.ts.map +1 -1
  26. package/dist/Components/lineinputs/textbox.d.ts.map +1 -1
  27. package/dist/Components/lineinputs/toggle.d.ts.map +1 -1
  28. package/dist/Components/menu/toolbar.d.ts +0 -1
  29. package/dist/Components/menu/toolbar.d.ts.map +1 -1
  30. package/dist/Components/status/progressBar.d.ts.map +1 -1
  31. package/dist/Components/theme/stylesheetPicker.d.ts.map +1 -1
  32. package/dist/index.js +1226 -1421
  33. package/dist/index.js.map +1 -1
  34. package/dist/{jsx-dev-runtime-pzseD2Sz.js → jsx-dev-runtime-CqunwZ8j.js} +404 -486
  35. package/dist/jsx-dev-runtime-CqunwZ8j.js.map +1 -0
  36. package/dist/jsx-dev-runtime.js +1 -1
  37. package/dist/jsx-runtime.js +1 -1
  38. package/dist/styling/baseStyleDefinitions.d.ts +0 -82
  39. package/dist/styling/baseStyleDefinitions.d.ts.map +1 -1
  40. package/dist/styling/theme.d.ts +3 -3
  41. package/dist/styling/theme.d.ts.map +1 -1
  42. package/package.json +3 -3
  43. package/styles/structural.css +72 -413
  44. package/themes/README.md +68 -66
  45. package/themes/dark.css +48 -1
  46. package/themes/java/theme.css +410 -135
  47. package/themes/light.css +48 -1
  48. package/themes/minimal/theme.css +408 -125
  49. package/themes/shiny/theme.css +484 -294
  50. package/dist/jsx-dev-runtime-pzseD2Sz.js.map +0 -1
@@ -1,314 +1,504 @@
1
1
  @charset "utf-8";
2
2
 
3
- :where(:root), [data-fray-theme="shiny"] {
4
- color-scheme: light;
5
- --fray-font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
6
- --fray-font-size: 0.875rem;
7
- --fray-line-height: 1.25;
8
- --fray-control-min-height: 2rem;
9
- --fray-space-xs: 0.25rem;
10
- --fray-space-sm: 0.5rem;
11
- --fray-space-md: 1rem;
12
- --fray-space-lg: 1.5rem;
13
- --fray-radius-sm: 0.2rem;
14
- --fray-radius-md: 0.35rem;
15
- --fray-radius-lg: 0.55rem;
16
- --fray-motion-fast: 120ms;
17
-
18
- --fray-shiny-primary-gradient: linear-gradient(
19
- to bottom,
20
- color-mix(in srgb, var(--fray-color-primary) 52%, var(--fray-color-highlight)) 0%,
21
- var(--fray-color-primary) 55%,
22
- var(--fray-color-primary-active) 100%
23
- );
24
- --fray-shiny-surface-gradient: linear-gradient(
25
- to bottom,
26
- color-mix(in srgb, var(--fray-color-surface-raised) 92%, var(--fray-color-highlight)) 0%,
27
- var(--fray-color-surface-muted) 62%,
28
- var(--fray-color-surface-inset) 100%
29
- );
30
- --fray-shiny-highlight: radial-gradient(
31
- 145% 90% at 35% 0%,
32
- color-mix(in srgb, var(--fray-color-highlight) 62%, transparent),
33
- transparent 58%
34
- );
35
-
36
- --fray-ui-background: var(--fray-color-surface);
37
- --fray-ui-color: var(--fray-color-text);
38
- --fray-ui-border: 1px solid color-mix(in srgb, var(--fray-color-border-strong) 72%, var(--fray-color-highlight));
39
- --fray-ui-shadow: 0 2px 6px color-mix(in srgb, var(--fray-color-shadow) 38%, transparent);
40
- --fray-focus-ring: 0 0 0 2px color-mix(in srgb, var(--fray-color-focus) 58%, transparent);
41
-
42
- --fray-panel-background: var(--fray-color-surface);
43
- --fray-panel-color: var(--fray-color-text);
44
- --fray-panel-border: 1px solid var(--fray-color-border);
45
- --fray-panel-shadow: 0 2px 8px color-mix(in srgb, var(--fray-color-shadow) 34%, transparent);
46
- --fray-panel-radius: var(--fray-radius-lg);
47
- --fray-dialog-shadow: 0 1.25rem 4rem color-mix(in srgb, var(--fray-color-shadow) 48%, transparent);
48
- --fray-dialog-backdrop-background: color-mix(in srgb, var(--fray-color-shadow) 58%, transparent);
49
-
50
- --fray-header-background: var(--fray-shiny-primary-gradient);
51
- --fray-header-color: var(--fray-color-on-primary);
52
- --fray-header-border: 1px solid color-mix(in srgb, var(--fray-color-primary-active) 70%, var(--fray-color-highlight));
53
- --fray-header-shadow: 0 2px 4px color-mix(in srgb, var(--fray-color-shadow) 42%, transparent);
54
- --fray-section-header-background: var(--fray-header-background);
55
- --fray-panel-header-background: var(--fray-header-background);
56
- --fray-table-header-background: var(--fray-shiny-surface-gradient);
57
- --fray-dialog-header-background: var(--fray-header-background);
58
-
59
- --fray-button-background: var(--fray-shiny-surface-gradient);
60
- --fray-button-background-hover: linear-gradient(
61
- to bottom,
62
- color-mix(in srgb, var(--fray-color-primary-soft) 60%, var(--fray-color-highlight)),
63
- var(--fray-color-primary-soft)
64
- );
65
- --fray-button-background-active: var(--fray-shiny-primary-gradient);
66
- --fray-button-background-disabled: color-mix(in srgb, var(--fray-color-disabled) 82%, transparent);
67
- --fray-button-color: var(--fray-color-text);
68
- --fray-button-border: 1px solid color-mix(in srgb, var(--fray-color-border-strong) 65%, var(--fray-color-highlight));
69
- --fray-button-shadow: 0 1px 2px color-mix(in srgb, var(--fray-color-shadow) 48%, transparent), inset 0 1px 0 color-mix(in srgb, var(--fray-color-highlight) 72%, transparent);
70
- --fray-button-shadow-active: inset 0 2px 3px color-mix(in srgb, var(--fray-color-shadow) 45%, transparent);
71
- --fray-toggle-button-background: transparent;
72
- --fray-tab-button-background: var(--fray-shiny-surface-gradient);
73
- --fray-dropdown-trigger-background: var(--fray-shiny-primary-gradient);
74
-
75
- --fray-input-background: var(--fray-color-surface-raised);
76
- --fray-input-color: var(--fray-color-text);
77
- --fray-input-border: 1px solid var(--fray-color-border-strong);
78
- --fray-input-shadow: inset 1px 1px 3px color-mix(in srgb, var(--fray-color-shadow) 22%, transparent);
79
- --fray-input-background-disabled: var(--fray-color-disabled);
80
- --fray-input-color-disabled: var(--fray-color-on-disabled);
81
-
82
- --fray-selection-background: var(--fray-shiny-primary-gradient);
83
- --fray-selection-color: var(--fray-color-on-primary);
84
- --fray-row-hover-background: var(--fray-color-primary-soft);
85
- --fray-table-row-background: var(--fray-color-surface);
86
- --fray-table-row-alt-background: var(--fray-color-surface-muted);
87
- --fray-checkbox-box-background: linear-gradient(to bottom, var(--fray-color-surface-raised), var(--fray-color-surface-inset));
88
- --fray-checkbox-box-background-checked: var(--fray-shiny-primary-gradient);
89
- --fray-checkbox-box-border: 1px solid var(--fray-color-border-strong);
90
- --fray-checkbox-symbol-color: var(--fray-color-on-primary);
91
- --fray-radio-background: transparent;
92
- --fray-radio-background-checked: transparent;
93
- --fray-toolbar-background: var(--fray-shiny-surface-gradient);
94
- --fray-toolbar-color: var(--fray-color-text);
95
- --fray-toolbar-border: 1px solid color-mix(in srgb, var(--fray-color-border) 75%, var(--fray-color-highlight));
96
- --fray-toolbar-shadow: var(--fray-ui-shadow);
97
- --fray-tabline-background: var(--fray-color-surface-muted);
98
- --fray-tab-active-background: var(--fray-color-surface);
99
- --fray-progress-track-background: linear-gradient(to bottom, var(--fray-color-surface-inset), var(--fray-color-surface-raised));
100
- --fray-progress-value-background: var(--fray-shiny-primary-gradient);
101
- --fray-working-background-image: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--fray-color-shadow) 8%, transparent) 0 0.7rem, color-mix(in srgb, var(--fray-color-highlight) 28%, transparent) 0.7rem 1.4rem);
102
-
103
- --base-font-size: var(--fray-font-size);
104
- --ui-font-size: var(--fray-font-size);
105
- --ui-padding: var(--fray-space-sm);
106
- --ui-padding-h: var(--fray-space-sm);
107
- --ui-padding-v: var(--fray-space-xs);
108
- --ui-border-radius: var(--fray-radius-md);
109
- --ui-text-color: var(--fray-ui-color);
110
- --ui-muted-text-color: var(--fray-color-text-muted);
111
- --ui-border-color: var(--fray-color-border);
112
- --ui-input-bg: var(--fray-input-background);
113
- --ui-input-border: var(--fray-input-border);
114
- --ui-input-bg-disabled: var(--fray-input-background-disabled);
115
- --ui-input-border-disabled: 1px solid var(--fray-color-border);
116
- --ui-input-text-color-disabled: var(--fray-input-color-disabled);
117
- --ui-accent-color: var(--fray-color-primary);
118
- --ui-accent-color-highlight: var(--fray-color-primary-soft);
119
- --input-width: 15rem;
120
- --input-shadow: var(--fray-input-shadow);
121
- --button-background: var(--fray-button-background);
122
- --button-background-hover: var(--fray-button-background-hover);
123
- --button-background-disabled: var(--fray-button-background-disabled);
124
- --button-border: var(--fray-button-border);
125
- --button-border-disabled: 1px solid var(--fray-color-border);
126
- --button-shadow: var(--fray-button-shadow);
127
- --button-color: var(--fray-button-color);
128
- --toggle-selected-bg: var(--fray-selection-background);
129
- --toggle-selected-text: var(--fray-selection-color);
130
- --panel-bg: var(--fray-panel-background);
131
- --panel-border: var(--fray-panel-border);
132
- --panel-radius: var(--fray-panel-radius);
133
- --panel-shadow: var(--fray-panel-shadow);
134
- --panel-color: var(--fray-panel-color);
135
- --panel-padding: var(--fray-space-md);
136
- --toolbar-bg: var(--fray-toolbar-background);
137
- --toolbar-border: var(--fray-toolbar-border);
138
- --toolbar-radius: var(--fray-radius-md);
139
- --toolbar-shadow: var(--fray-toolbar-shadow);
140
- --toolbar-color: var(--fray-toolbar-color);
141
- --sectionheader-bg: var(--fray-section-header-background, var(--fray-header-background));
142
- --sectionheader-shadow: var(--fray-header-shadow);
143
- --sectionheader-color: var(--fray-header-color);
144
- --tabline-bg: var(--fray-tabline-background);
145
- --tab-bg-active: var(--fray-tab-active-background);
146
- --error-color: var(--fray-color-error);
147
- --cbx-o-border: var(--fray-checkbox-box-border);
148
- --cbx-border-radius: var(--fray-radius-sm);
149
- --spacing-small: var(--fray-space-sm);
150
- --spacing-medium: var(--fray-space-md);
151
- --noselect-user-select: none;
152
- --noselect-cursor: default;
153
- }
3
+ @layer theme {
4
+ :where(:root:not([data-theme]), [data-theme="shiny"]) {
5
+ color-scheme: light;
6
+ --font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
7
+ --font-size: 0.875rem;
8
+ --line-height: 1.25;
9
+ --control-min-height: 2rem;
10
+ --space-xs: 0.25rem;
11
+ --space-sm: 0.5rem;
12
+ --space-md: 1rem;
13
+ --space-lg: 1.5rem;
14
+ --radius-sm: 0.2rem;
15
+ --radius-md: 0.35rem;
16
+ --radius-lg: 0.55rem;
17
+ --motion-fast: 120ms;
154
18
 
155
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
156
- button[data-fray-component="button"],
157
- [role="tab"],
158
- [role="radio"],
159
- [role="checkbox"]
160
- ) {
161
- position: relative;
162
- isolation: isolate;
163
- overflow: hidden;
164
- transition: filter var(--fray-motion-fast), transform var(--fray-motion-fast);
165
- }
19
+ --shiny-primary-gradient: linear-gradient(to bottom, var(--palette-primary-300), var(--palette-primary) 55%, var(--palette-primary-700));
20
+ --shiny-surface-gradient: linear-gradient(to bottom, var(--palette-light), var(--palette-neutral-100) 62%, var(--palette-neutral-200));
21
+ --shiny-highlight: radial-gradient(145% 90% at 35% 0%, color-mix(in oklch, var(--palette-light) 62%, transparent), transparent 58%);
166
22
 
167
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
168
- button[data-fray-component="button"],
169
- [role="tab"],
170
- [role="radio"],
171
- [role="checkbox"]
172
- )::before {
173
- content: "";
174
- position: absolute;
175
- inset: 1px;
176
- z-index: -1;
177
- border-radius: inherit;
178
- background: var(--fray-shiny-highlight);
179
- pointer-events: none;
180
- }
23
+ --ui-background: var(--palette-neutral-50);
24
+ --ui-color: var(--palette-neutral-950);
25
+ --ui-border: 1px solid var(--palette-neutral-300);
26
+ --ui-shadow: 0 2px 6px color-mix(in oklch, var(--palette-dark) 38%, transparent);
27
+ --focus-ring: 0 0 0 2px var(--palette-primary-400);
28
+ --focus-color: var(--palette-primary);
29
+ --error-color: var(--palette-red);
30
+ --error-contrast: var(--palette-contrast-light);
31
+ --success-color: var(--palette-green);
181
32
 
182
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
183
- button[data-fray-component="button"],
184
- [role="tab"],
185
- [role="radio"],
186
- [role="checkbox"]
187
- ):active {
188
- transform: translateY(1px);
189
- box-shadow: var(--fray-button-shadow-active);
190
- }
33
+ --panel-background: var(--palette-neutral-50);
34
+ --panel-color: var(--palette-neutral-950);
35
+ --panel-border: 1px solid var(--palette-neutral-300);
36
+ --panel-shadow: 0 2px 8px color-mix(in oklch, var(--palette-dark) 34%, transparent);
37
+ --panel-radius: var(--radius-md);
38
+ --dialog-shadow: 0 1.25rem 4rem color-mix(in oklch, var(--palette-dark) 35%, transparent);
39
+ --dialog-backdrop-background: color-mix(in oklch, var(--palette-dark) 55%, transparent);
191
40
 
192
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
193
- [data-fray-component="panel"] > [data-part="header"],
194
- dialog[data-fray-component="dialog"] > [data-part="header"],
195
- th[data-fray-component="table-header-cell"]
196
- ) {
197
- position: relative;
198
- isolation: isolate;
199
- overflow: hidden;
200
- }
41
+ --header-background: var(--shiny-primary-gradient);
42
+ --header-color: var(--palette-contrast-light);
43
+ --header-border: 0 solid transparent;
44
+ --header-shadow: 0 2px 4px color-mix(in oklch, var(--palette-dark) 42%, transparent);
45
+ --section-header-background: var(--header-background);
46
+ --section-header-color: var(--header-color);
47
+ --section-header-border: var(--header-border);
48
+ --section-header-shadow: var(--header-shadow);
49
+ --panel-header-background: var(--section-header-background);
50
+ --panel-header-color: var(--section-header-color);
51
+ --table-header-background: var(--palette-neutral-100);
52
+ --table-header-color: var(--header-color);
53
+ --dialog-header-background: var(--section-header-background);
54
+ --dialog-header-color: var(--section-header-color);
201
55
 
202
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
203
- [data-fray-component="panel"] > [data-part="header"],
204
- dialog[data-fray-component="dialog"] > [data-part="header"],
205
- th[data-fray-component="table-header-cell"]
206
- )::after {
207
- content: "";
208
- position: absolute;
209
- inset: 0;
210
- z-index: -1;
211
- background: var(--fray-shiny-highlight);
212
- border: 1px solid color-mix(in srgb, var(--fray-color-highlight) 22%, transparent);
213
- pointer-events: none;
214
- }
56
+ --button-background: var(--shiny-surface-gradient);
57
+ --button-background-hover: linear-gradient(to bottom, var(--palette-primary-50), var(--palette-primary-100));
58
+ --button-background-active: var(--shiny-primary-gradient);
59
+ --button-background-disabled: var(--palette-neutral-200);
60
+ --button-color: var(--palette-neutral-950);
61
+ --button-border: 1px solid var(--palette-neutral-500);
62
+ --button-shadow: 0 1px 2px color-mix(in oklch, var(--palette-dark) 48%, transparent), inset 0 1px 0 color-mix(in oklch, var(--palette-light) 72%, transparent);
63
+ --button-shadow-active: inset 0 2px 3px color-mix(in oklch, var(--palette-dark) 45%, transparent);
64
+ --toggle-button-background: var(--button-background);
65
+ --toggle-button-background-checked: var(--selection-background);
66
+ --tab-button-background: var(--button-background);
67
+ --tab-button-background-active: var(--tab-active-background);
68
+ --menu-button-background: var(--button-background);
69
+ --dropdown-trigger-background: var(--button-background);
70
+ --table-header-button-background: var(--button-background);
215
71
 
216
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) [data-fray-component="checkbox"] [data-part="symbol"] {
217
- position: relative;
218
- color: var(--fray-checkbox-symbol-color);
219
- background: var(--fray-checkbox-box-background);
220
- box-shadow: inset 1px 1px 2px color-mix(in srgb, var(--fray-color-shadow) 24%, transparent), 0 1px 2px color-mix(in srgb, var(--fray-color-shadow) 42%, transparent);
221
- overflow: hidden;
222
- }
72
+ --input-background: var(--palette-light);
73
+ --input-color: var(--palette-neutral-950);
74
+ --input-border: 1px solid var(--palette-neutral-500);
75
+ --input-shadow: none;
76
+ --input-background-disabled: var(--palette-neutral-200);
77
+ --input-color-disabled: var(--palette-neutral-700);
223
78
 
224
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) [data-fray-component="checkbox"] [aria-checked="true"] [data-part="symbol"] {
225
- background: var(--fray-checkbox-box-background-checked);
226
- }
79
+ --selection-background: var(--palette-primary);
80
+ --selection-color: var(--palette-contrast-light);
81
+ --row-hover-background: var(--palette-primary-100);
82
+ --table-row-background: var(--palette-neutral-50);
83
+ --table-row-alt-background: var(--palette-neutral-100);
84
+ --checkbox-box-background: var(--input-background);
85
+ --checkbox-box-background-checked: var(--selection-background);
86
+ --checkbox-box-border: var(--input-border);
87
+ --checkbox-symbol-color: var(--selection-color);
88
+ --radio-background: var(--button-background);
89
+ --radio-background-checked: var(--selection-background);
90
+ --toolbar-background: var(--shiny-surface-gradient);
91
+ --toolbar-color: var(--palette-neutral-950);
92
+ --toolbar-border: 0 solid transparent;
93
+ --toolbar-shadow: none;
94
+ --tabline-background: var(--palette-neutral-100);
95
+ --tab-active-background: var(--palette-neutral-50);
96
+ --progress-track-background: var(--palette-neutral-200);
97
+ --progress-value-background: var(--shiny-primary-gradient);
98
+ --working-background-image: linear-gradient(-45deg, transparent 25%, color-mix(in oklch, var(--palette-light) 35%, transparent) 25% 50%, transparent 50% 75%, color-mix(in oklch, var(--palette-light) 35%, transparent) 75%);
227
99
 
228
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) [data-fray-component="checkbox"] [data-part="symbol"]::before {
229
- content: "";
230
- position: absolute;
231
- inset: 1px;
232
- border-radius: inherit;
233
- background: var(--fray-shiny-highlight);
234
- pointer-events: none;
235
- }
100
+ --colored-base: var(--palette-primary);
101
+ --colored-light: var(--palette-primary-light);
102
+ --colored-dark: var(--palette-primary-dark);
103
+ --colored-contrast: var(--palette-contrast-light);
236
104
 
237
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) [data-fray-component="dropdown"] > select,
238
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where([data-fray-component="theme-picker"], [data-fray-component="color-picker"]) > select {
239
- appearance: none;
240
- padding-inline-end: 2.25rem;
241
- }
105
+ --base-font-size: var(--font-size);
106
+ --ui-font-size: var(--font-size);
107
+ --ui-padding: var(--space-sm);
108
+ --ui-padding-h: var(--space-sm);
109
+ --ui-padding-v: var(--space-xs);
110
+ --ui-border-radius: var(--radius-md);
111
+ --ui-text-color: var(--ui-color);
112
+ --ui-muted-text-color: var(--palette-neutral-700);
113
+ --ui-border-color: var(--palette-neutral-300);
114
+ --ui-input-bg: var(--input-background);
115
+ --ui-input-border: var(--input-border);
116
+ --ui-input-bg-disabled: var(--input-background-disabled);
117
+ --ui-input-border-disabled: 1px solid var(--palette-neutral-300);
118
+ --ui-input-text-color-disabled: var(--input-color-disabled);
119
+ --ui-accent-color: var(--palette-primary);
120
+ --ui-accent-color-highlight: var(--palette-primary-100);
121
+ --input-width: 15rem;
122
+ --button-border-disabled: 1px solid var(--palette-neutral-300);
123
+ --toggle-selected-bg: var(--selection-background);
124
+ --toggle-selected-text: var(--selection-color);
125
+ --panel-bg: var(--panel-background);
126
+ --panel-padding: var(--space-md);
127
+ --toolbar-bg: var(--toolbar-background);
128
+ --toolbar-radius: var(--radius-md);
129
+ --sectionheader-bg: var(--section-header-background);
130
+ --sectionheader-shadow: var(--section-header-shadow);
131
+ --sectionheader-color: var(--section-header-color);
132
+ --tabline-bg: var(--tabline-background);
133
+ --tab-bg-active: var(--tab-active-background);
134
+ --cbx-o-border: var(--checkbox-box-border);
135
+ --cbx-border-radius: var(--radius-sm);
136
+ --spacing-small: var(--space-sm);
137
+ --spacing-medium: var(--space-md);
138
+ --noselect-user-select: none;
139
+ --noselect-cursor: default;
242
140
 
243
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
244
- [data-fray-component="dropdown"],
245
- [data-fray-component="theme-picker"],
246
- [data-fray-component="color-picker"]
247
- )::after {
248
- content: "⌄";
249
- position: absolute;
250
- inset-block: 1px;
251
- inset-inline-end: 1px;
252
- display: grid;
253
- width: 1.9rem;
254
- place-items: center;
255
- color: var(--fray-color-on-primary);
256
- background: var(--fray-dropdown-trigger-background);
257
- border-inline-start: 1px solid color-mix(in srgb, var(--fray-color-primary-active) 70%, var(--fray-color-highlight));
258
- border-radius: 0 calc(var(--fray-radius-md) - 1px) calc(var(--fray-radius-md) - 1px) 0;
259
- box-shadow: inset 0 1px 0 color-mix(in srgb, var(--fray-color-highlight) 58%, transparent), -1px 0 2px color-mix(in srgb, var(--fray-color-shadow) 28%, transparent);
260
- pointer-events: none;
261
- }
141
+ font-family: var(--font-family);
142
+ font-size: var(--font-size);
143
+ line-height: var(--line-height);
144
+ color: var(--ui-color);
145
+ background: var(--ui-background);
146
+ }
262
147
 
263
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) progress {
264
- overflow: hidden;
265
- border: 0;
266
- border-radius: var(--fray-radius-md);
267
- background: var(--fray-progress-track-background);
268
- box-shadow: inset 1px 1px 3px color-mix(in srgb, var(--fray-color-shadow) 32%, transparent);
269
- }
148
+ @scope (:root:not([data-theme]), [data-theme="shiny"]) to ([data-theme], [data-theme-exclude]) {
270
149
 
271
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) progress::-webkit-progress-bar {
272
- background: var(--fray-progress-track-background);
273
- }
150
+ :where(button, .buttonlike) {
151
+ min-height: var(--control-min-height);
152
+ padding: var(--space-xs) var(--space-sm);
153
+ color: var(--button-color);
154
+ background: var(--button-background);
155
+ border: var(--button-border);
156
+ border-radius: var(--radius-md);
157
+ box-shadow: var(--button-shadow);
158
+ font: inherit;
159
+ cursor: default;
160
+ user-select: none;
161
+ }
274
162
 
275
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) progress::-webkit-progress-value {
276
- background: var(--fray-shiny-highlight), var(--fray-progress-value-background);
277
- }
163
+ :where(button, .buttonlike):hover:not(:disabled, [aria-disabled="true"]) {
164
+ background: var(--button-background-hover);
165
+ }
278
166
 
279
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) progress::-moz-progress-bar {
280
- background: var(--fray-shiny-highlight), var(--fray-progress-value-background);
281
- }
167
+ :where(button, .buttonlike):active:not(:disabled, [aria-disabled="true"]) {
168
+ background: var(--button-background-active);
169
+ box-shadow: var(--button-shadow-active);
170
+ }
282
171
 
283
- @media (forced-colors: active) {
284
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
285
- button[data-fray-component="button"],
286
- [role="tab"],
287
- [role="radio"],
288
- [role="checkbox"],
289
- [data-fray-component="panel"] > [data-part="header"],
290
- dialog[data-fray-component="dialog"] > [data-part="header"],
291
- th[data-fray-component="table-header-cell"]
292
- )::before,
293
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
294
- [data-fray-component="panel"] > [data-part="header"],
295
- dialog[data-fray-component="dialog"] > [data-part="header"],
296
- th[data-fray-component="table-header-cell"]
297
- )::after,
298
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
299
- [data-fray-component="dropdown"],
300
- [data-fray-component="theme-picker"],
301
- [data-fray-component="color-picker"]
302
- )::after {
303
- display: none;
304
- }
172
+ :where(button, .buttonlike):focus-visible,
173
+ :where(input, select, textarea, .inputlike):focus-visible {
174
+ outline: 2px solid transparent;
175
+ outline-offset: 1px;
176
+ box-shadow: var(--focus-ring);
177
+ }
178
+
179
+ :where(button, .buttonlike):disabled,
180
+ :where(.buttonlike[aria-disabled="true"]) {
181
+ color: var(--input-color-disabled);
182
+ background: var(--button-background-disabled);
183
+ cursor: not-allowed;
184
+ pointer-events: none;
185
+ }
186
+
187
+ :where(.buttonshell) {
188
+ border: var(--button-border);
189
+ border-radius: var(--radius-md);
190
+ box-shadow: var(--button-shadow);
191
+ }
192
+
193
+ :where(.buttoninner) {
194
+ padding: var(--space-xs) var(--space-sm);
195
+ color: var(--button-color);
196
+ background: var(--button-background);
197
+ }
198
+
199
+ :where(input, select, textarea, .inputlike) {
200
+ min-height: var(--control-min-height);
201
+ padding: var(--space-xs) var(--space-sm);
202
+ color: var(--input-color);
203
+ background: var(--input-background);
204
+ border: var(--input-border);
205
+ border-radius: var(--radius-md);
206
+ box-shadow: var(--input-shadow);
207
+ box-sizing: border-box;
208
+ font: inherit;
209
+ }
210
+
211
+ :where(input, select, textarea, .inputlike):disabled,
212
+ :where(.inputlike[aria-disabled="true"]) {
213
+ color: var(--input-color-disabled);
214
+ background: var(--input-background-disabled);
215
+ cursor: not-allowed;
216
+ }
217
+
218
+ :where(.inputshell) {
219
+ color: var(--input-color);
220
+ background: var(--input-background);
221
+ border: var(--input-border);
222
+ border-radius: var(--radius-sm);
223
+ box-shadow: var(--input-shadow);
224
+ }
225
+
226
+ :where([role="checkbox"][aria-checked="true"] .inputshell) {
227
+ color: var(--checkbox-symbol-color);
228
+ background: var(--checkbox-box-background-checked);
229
+ }
230
+
231
+ :where(.inputinner) {
232
+ padding: var(--space-xs) var(--space-sm);
233
+ color: var(--input-color);
234
+ background: var(--input-background);
235
+ }
236
+
237
+ :where(.selectshell) { position: relative; }
238
+
239
+ :where(table, textarea, [role="tree"], [role="listbox"], .datacomponentlike) {
240
+ color: var(--ui-color);
241
+ background: var(--ui-background);
242
+ border-color: var(--palette-neutral-300);
243
+ }
244
+
245
+ :where(.datacomponentshell) {
246
+ border: var(--ui-border);
247
+ border-radius: var(--panel-radius);
248
+ box-shadow: var(--ui-shadow);
249
+ }
250
+
251
+ :where(.datacomponentinner) {
252
+ padding: var(--space-sm);
253
+ color: var(--ui-color);
254
+ background: var(--ui-background);
255
+ }
256
+
257
+ :where(header, th, .headerlike) {
258
+ color: var(--header-color);
259
+ background: var(--header-background);
260
+ border: var(--header-border);
261
+ box-shadow: var(--header-shadow);
262
+ }
263
+
264
+ :where(th > button) {
265
+ color: var(--table-header-color);
266
+ background: var(--table-header-button-background);
267
+ }
268
+
269
+ :where(th) {
270
+ color: var(--table-header-color);
271
+ background: var(--table-header-background);
272
+ }
273
+
274
+ :where(dialog > header) {
275
+ color: var(--dialog-header-color);
276
+ background: var(--dialog-header-background);
277
+ }
278
+
279
+ :where(dl > div) { border-block-end: 1px solid var(--ui-border-color); }
280
+ :where(dt) {
281
+ color: var(--ui-muted-text-color);
282
+ font-weight: 600;
283
+ }
284
+
285
+ :where(.headershell) {
286
+ border: var(--header-border);
287
+ box-shadow: var(--header-shadow);
288
+ }
289
+
290
+ :where(.headerinner) {
291
+ padding: var(--space-sm);
292
+ color: var(--header-color);
293
+ background: var(--header-background);
294
+ }
295
+
296
+ :where(.panellike, aside, dialog) {
297
+ color: var(--panel-color);
298
+ background: var(--panel-background);
299
+ border: var(--panel-border);
300
+ border-radius: var(--panel-radius);
301
+ box-shadow: var(--panel-shadow);
302
+ }
303
+
304
+ :where(.panelshell) {
305
+ border: var(--panel-border);
306
+ border-radius: var(--panel-radius);
307
+ box-shadow: var(--panel-shadow);
308
+ }
309
+
310
+ :where(.panelinner) {
311
+ padding: var(--space-md);
312
+ color: var(--panel-color);
313
+ background: var(--panel-background);
314
+ }
315
+
316
+ :where(dialog)::backdrop { background: var(--dialog-backdrop-background); }
317
+ :where(dialog > footer) { border-block-start: 1px solid var(--ui-border-color); }
318
+
319
+ :where([role="toolbar"], .toolbarlike) {
320
+ color: var(--toolbar-color);
321
+ background: var(--toolbar-background);
322
+ border: var(--toolbar-border);
323
+ box-shadow: var(--toolbar-shadow);
324
+ }
325
+
326
+ :where(.toolbarshell) {
327
+ border: var(--toolbar-border);
328
+ border-radius: var(--radius-md);
329
+ box-shadow: var(--toolbar-shadow);
330
+ }
331
+
332
+ :where(.toolbarinner) {
333
+ padding: var(--space-sm);
334
+ color: var(--toolbar-color);
335
+ background: var(--toolbar-background);
336
+ }
337
+
338
+ :where(.coloredlike, .coloredshell) {
339
+ --colored-base: var(--palette-primary);
340
+ --colored-light: var(--palette-primary-light);
341
+ --colored-dark: var(--palette-primary-dark);
342
+ --colored-contrast: var(--palette-contrast-light);
343
+ color: var(--colored-contrast);
344
+ background: var(--colored-base);
345
+ border-color: color-mix(in oklch, var(--colored-dark) 72%, currentColor);
346
+ }
347
+
348
+ :where(.coloredinner) {
349
+ color: var(--colored-contrast);
350
+ background: var(--colored-base);
351
+ }
352
+
353
+ :where([aria-selected="true"], [aria-pressed="true"]) {
354
+ color: var(--selection-color);
355
+ background: var(--selection-background);
356
+ }
357
+
358
+ :where([role="tab"]) {
359
+ background: var(--tab-button-background);
360
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
361
+ }
362
+ :where([role="tab"][aria-selected="true"]) {
363
+ color: var(--button-color);
364
+ background: var(--tab-button-background-active);
365
+ }
366
+ :where([role="radio"]) { background: var(--toggle-button-background); }
367
+ :where([role="radio"][aria-checked="true"]) {
368
+ color: var(--selection-color);
369
+ background: var(--toggle-button-background-checked);
370
+ }
371
+ :where([role="radiogroup"] > [role="radio"]) { border-radius: 0; }
372
+ :where([role="radiogroup"] > [role="radio"]:first-child) {
373
+ border-radius: var(--radius-md) 0 0 var(--radius-md);
374
+ }
375
+ :where([role="radiogroup"] > [role="radio"]:last-child) {
376
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
377
+ }
378
+
379
+ :where([role="option"], [role="treeitem"], tbody tr[tabindex]):hover {
380
+ background: var(--row-hover-background);
381
+ }
382
+
383
+ :where([role="option"], [role="treeitem"], tbody tr[tabindex]):focus-visible {
384
+ outline: 2px solid var(--focus-color);
385
+ outline-offset: -2px;
386
+ }
387
+
388
+ :where(tbody tr:nth-child(odd)) { background: var(--table-row-background); }
389
+ :where(tbody tr:nth-child(even)) { background: var(--table-row-alt-background); }
390
+ :where([role="alert"]) { color: var(--error-color); }
391
+
392
+ :where(progress) {
393
+ color: var(--progress-value-background);
394
+ background: var(--progress-track-background);
395
+ accent-color: var(--palette-primary);
396
+ }
397
+
398
+ @media (prefers-reduced-motion: no-preference) {
399
+ :where(dialog[open]) { animation: theme-dialog-enter var(--motion-fast) ease-out; }
400
+ }
401
+
402
+ @keyframes theme-dialog-enter {
403
+ from { transform: translateY(0.4rem); }
404
+ }
405
+
406
+ @media (forced-colors: active) {
407
+ :where(.coloredlike, .coloredshell, .coloredinner) {
408
+ color: CanvasText;
409
+ background: Canvas;
410
+ border-color: CanvasText;
411
+ forced-color-adjust: auto;
412
+ }
413
+ }
414
+
415
+ :where(button, .buttonlike, [role="tab"], [role="radio"], [role="checkbox"]) {
416
+ position: relative;
417
+ isolation: isolate;
418
+ overflow: hidden;
419
+ transition: filter var(--motion-fast), transform var(--motion-fast);
420
+ }
421
+
422
+ :where(.coloredlike, .coloredshell) {
423
+ background: linear-gradient(135deg, var(--colored-light), var(--colored-base) 55%, var(--colored-dark));
424
+ }
425
+
426
+ :where(.coloredinner) {
427
+ background: color-mix(in oklch, var(--colored-dark) 30%, transparent);
428
+ }
429
+
430
+ :where(button, .buttonlike, [role="tab"], [role="radio"], [role="checkbox"])::before,
431
+ :where(header, th, .headerlike)::after,
432
+ :where(.inputshell)::before {
433
+ content: "";
434
+ position: absolute;
435
+ inset: 1px;
436
+ border-radius: inherit;
437
+ background: var(--shiny-highlight);
438
+ pointer-events: none;
439
+ }
440
+
441
+ :where(button, .buttonlike, [role="tab"], [role="radio"], [role="checkbox"])::before {
442
+ z-index: -1;
443
+ }
444
+
445
+ :where(header, .headerlike) {
446
+ position: relative;
447
+ isolation: isolate;
448
+ overflow: clip;
449
+ }
450
+
451
+ :where(.inputshell) {
452
+ position: relative;
453
+ isolation: isolate;
454
+ overflow: hidden;
455
+ }
456
+
457
+ :where(header, th, .headerlike)::after {
458
+ inset: 0;
459
+ z-index: -1;
460
+ border: 1px solid color-mix(in oklch, var(--palette-light) 22%, transparent);
461
+ }
462
+
463
+ :where(.selectshell) > select {
464
+ appearance: none;
465
+ padding-inline-end: 2.25rem;
466
+ }
467
+
468
+ :where(.selectshell)::after {
469
+ content: "⌄";
470
+ position: absolute;
471
+ inset-block: 1px;
472
+ inset-inline-end: 1px;
473
+ display: grid;
474
+ width: 1.9rem;
475
+ place-items: center;
476
+ color: var(--palette-contrast-light);
477
+ background: var(--dropdown-trigger-background);
478
+ border-inline-start: 1px solid var(--palette-primary-700);
479
+ border-radius: 0 calc(var(--radius-md) - 1px) calc(var(--radius-md) - 1px) 0;
480
+ pointer-events: none;
481
+ }
482
+
483
+ :where(progress) {
484
+ overflow: hidden;
485
+ border: 0;
486
+ border-radius: var(--radius-md);
487
+ box-shadow: inset 1px 1px 3px color-mix(in oklch, var(--palette-dark) 32%, transparent);
488
+ }
489
+
490
+ @media (forced-colors: active) {
491
+ :where(button, .buttonlike, [role="tab"], [role="radio"], [role="checkbox"])::before,
492
+ :where(header, th, .headerlike)::after,
493
+ :where(.inputshell)::before,
494
+ :where(.selectshell)::after {
495
+ display: none;
496
+ }
305
497
 
306
- :where(:root:not([data-fray-theme]), [data-fray-theme="shiny"]) :where(
307
- [data-fray-component="dropdown"],
308
- [data-fray-component="theme-picker"],
309
- [data-fray-component="color-picker"]
310
- ) > select {
311
- appearance: auto;
312
- padding-inline-end: var(--fray-space-sm);
498
+ :where(.selectshell) > select {
499
+ appearance: auto;
500
+ padding-inline-end: var(--space-sm);
501
+ }
502
+ }
313
503
  }
314
504
  }