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