@capillaryjs/capillary-ui 1.1.0 → 1.3.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 (95) hide show
  1. package/CHANGELOG.md +117 -2
  2. package/README.md +196 -35
  3. package/colors/README.md +53 -3
  4. package/colors/gray/colors.css +4 -2
  5. package/colors/green/colors.css +4 -2
  6. package/colors/iceblue/colors.css +4 -2
  7. package/colors/ocean/colors.css +4 -2
  8. package/colors/orange/colors.css +4 -2
  9. package/colors/purple/colors.css +4 -2
  10. package/colors/red/colors.css +7 -3
  11. package/colors/yellow/colors.css +8 -4
  12. package/dist/Components/app/app.d.ts +3 -3
  13. package/dist/Components/app/app.d.ts.map +1 -1
  14. package/dist/Components/component.d.ts +24 -3
  15. package/dist/Components/component.d.ts.map +1 -1
  16. package/dist/Components/data/descriptionList.d.ts.map +1 -1
  17. package/dist/Components/data/listview/listview.d.ts.map +1 -1
  18. package/dist/Components/data/table/DataTable.d.ts +8 -0
  19. package/dist/Components/data/table/DataTable.d.ts.map +1 -1
  20. package/dist/Components/data/table/FilterPanel.d.ts.map +1 -1
  21. package/dist/Components/data/table/TableHeader.d.ts +2 -0
  22. package/dist/Components/data/table/TableHeader.d.ts.map +1 -1
  23. package/dist/Components/data/table/TableHeaderCell.d.ts +18 -0
  24. package/dist/Components/data/table/TableHeaderCell.d.ts.map +1 -1
  25. package/dist/Components/data/table/tableDataSource.d.ts +6 -0
  26. package/dist/Components/data/table/tableDataSource.d.ts.map +1 -1
  27. package/dist/Components/data/treeview/treeview.d.ts.map +1 -1
  28. package/dist/Components/layout/groupBox.d.ts.map +1 -1
  29. package/dist/Components/layout/header.d.ts.map +1 -1
  30. package/dist/Components/layout/layout.d.ts +2 -2
  31. package/dist/Components/layout/layout.d.ts.map +1 -1
  32. package/dist/Components/layout/layoutTraits.d.ts +6 -0
  33. package/dist/Components/layout/layoutTraits.d.ts.map +1 -1
  34. package/dist/Components/layout/optionGroup.d.ts.map +1 -1
  35. package/dist/Components/layout/optionsBox.d.ts +2 -1
  36. package/dist/Components/layout/optionsBox.d.ts.map +1 -1
  37. package/dist/Components/layout/splitView.d.ts +2 -0
  38. package/dist/Components/layout/splitView.d.ts.map +1 -1
  39. package/dist/Components/lineinputs/CheckableControl.d.ts +2 -2
  40. package/dist/Components/lineinputs/CheckableControl.d.ts.map +1 -1
  41. package/dist/Components/lineinputs/LabeledInputControl.d.ts +2 -2
  42. package/dist/Components/lineinputs/LabeledInputControl.d.ts.map +1 -1
  43. package/dist/Components/lineinputs/LineControl.d.ts +7 -0
  44. package/dist/Components/lineinputs/LineControl.d.ts.map +1 -0
  45. package/dist/Components/lineinputs/SelectControl.d.ts.map +1 -1
  46. package/dist/Components/lineinputs/checkbox/Checkbox.d.ts +9 -3
  47. package/dist/Components/lineinputs/checkbox/Checkbox.d.ts.map +1 -1
  48. package/dist/Components/lineinputs/checkbox/QuadCheckbox.d.ts +1 -0
  49. package/dist/Components/lineinputs/checkbox/QuadCheckbox.d.ts.map +1 -1
  50. package/dist/Components/lineinputs/checkbox/TriCheckbox.d.ts +1 -0
  51. package/dist/Components/lineinputs/checkbox/TriCheckbox.d.ts.map +1 -1
  52. package/dist/Components/lineinputs/datetime/TemporalInput.d.ts.map +1 -1
  53. package/dist/Components/lineinputs/dropdown.d.ts +4 -2
  54. package/dist/Components/lineinputs/dropdown.d.ts.map +1 -1
  55. package/dist/Components/lineinputs/radio.d.ts +9 -4
  56. package/dist/Components/lineinputs/radio.d.ts.map +1 -1
  57. package/dist/Components/lineinputs/requiredPresentation.d.ts +21 -0
  58. package/dist/Components/lineinputs/requiredPresentation.d.ts.map +1 -0
  59. package/dist/Components/lineinputs/textbox.d.ts.map +1 -1
  60. package/dist/Components/lineinputs/toggle.d.ts +4 -2
  61. package/dist/Components/lineinputs/toggle.d.ts.map +1 -1
  62. package/dist/Components/menu/button.d.ts +2 -2
  63. package/dist/Components/menu/button.d.ts.map +1 -1
  64. package/dist/Components/status/progressBar.d.ts +2 -2
  65. package/dist/Components/status/progressBar.d.ts.map +1 -1
  66. package/dist/Components/status/statusPresentation.d.ts.map +1 -1
  67. package/dist/Components/theme/stylesheetPicker.d.ts +2 -1
  68. package/dist/Components/theme/stylesheetPicker.d.ts.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +2697 -2079
  72. package/dist/index.js.map +1 -1
  73. package/dist/jsx-dev-runtime.js +3 -3
  74. package/dist/jsx-runtime-Ba-uafjl.js +1631 -0
  75. package/dist/jsx-runtime-Ba-uafjl.js.map +1 -0
  76. package/dist/jsx-runtime.js +2 -2
  77. package/dist/localization.d.ts +1 -1
  78. package/dist/localization.d.ts.map +1 -1
  79. package/dist/routing/RouteOutlet.d.ts.map +1 -1
  80. package/dist/runtime.d.ts +4 -0
  81. package/dist/runtime.d.ts.map +1 -1
  82. package/dist/styling/theme.d.ts +1 -1
  83. package/dist/styling/theme.d.ts.map +1 -1
  84. package/docs/application-composition-guide.md +22 -5
  85. package/package.json +3 -3
  86. package/styles/structural.css +704 -158
  87. package/themes/README.md +9 -2
  88. package/themes/base.css +114 -18
  89. package/themes/capillary/theme.css +300 -0
  90. package/themes/shiny/theme.css +33 -15
  91. package/themes/soft/theme.css +37 -0
  92. package/themes/white/theme.css +52 -0
  93. package/dist/jsx-dev-runtime-D3UnwrKT.js +0 -1362
  94. package/dist/jsx-dev-runtime-D3UnwrKT.js.map +0 -1
  95. package/themes/java/theme.css +0 -21
package/themes/README.md CHANGED
@@ -25,9 +25,11 @@ Published themes are:
25
25
 
26
26
  | Theme | Appearance capability | Intent |
27
27
  | --- | --- | --- |
28
- | `minimal` | Adaptive (`light`, `dark`, or system) | Restrained platform-oriented treatment |
29
- | `java` | Light | Desktop control treatment inspired by classic Java interfaces |
28
+ | `capillary` | Light | Bright, compact card treatment with restrained elevation and palette-primary selection |
30
29
  | `shiny` | Light | Gloss, depth, and chromed graphical surfaces |
30
+ | `soft` | Light | Soft, rounded treatment |
31
+ | `white` | Light | Airy, rounded treatment |
32
+ | `minimal` | Adaptive (`light`, `dark`, or system) | Restrained platform-oriented treatment |
31
33
 
32
34
  Custom properties are the primary instrument. A theme declares them on `:root`
33
35
  inside `@layer theme`, and `color-scheme` is the only ordinary property that
@@ -78,6 +80,11 @@ Themes still must not `@import`, must not declare `--palette-*` anchors, which
78
80
  belong to `colors/<name>/colors.css`, and must not restate a value already set
79
81
  by `base.css`.
80
82
 
83
+ Theme chrome that establishes a surface, text, border, or fill must derive from
84
+ the appropriate palette role or a shared UI role. Literal black and white may
85
+ remain in translucent gloss and shadow overlays: those effects are deliberately
86
+ neutral and must not tint the underlying palette-derived surface.
87
+
81
88
  `capillaryUiThemeVariableCatalog` is the machine-readable public contract. Its
82
89
  fallback chain runs from palette roles through global UI roles and shared
83
90
  families, then to optional component-specific roles. A small theme can
package/themes/base.css CHANGED
@@ -10,9 +10,15 @@
10
10
  --palette-contrast-dark: var(--palette-dark);
11
11
  --palette-light-clear: color-mix(in srgb, var(--palette-light) 0%, transparent);
12
12
  --palette-light-faint: color-mix(in srgb, var(--palette-light) 8%, transparent);
13
- --palette-red: #b3261e;
14
- --palette-green: #287a3c;
13
+ /* Semantic status colors; distinct from the neutral tonal ramp below. */
14
+ --palette-status-negative: #b3261e;
15
+ --palette-status-positive: #287a3c;
16
+ --palette-status-neutral: #64748b;
15
17
  --palette-primary-500: #2989d8;
18
+ /* 0 removes primary hue from the three muted chrome surfaces; 1 retains
19
+ their calibrated palette tint. Palette files may choose a value in
20
+ this inclusive range without affecting the accent ramp. */
21
+ --palette-primary-surface-saturation: 1;
16
22
  --palette-secondary-500: #7137a8;
17
23
  --palette-neutral-500: #7892aa;
18
24
 
@@ -38,6 +44,20 @@
38
44
  --palette-primary-light: var(--palette-primary-200);
39
45
  --palette-primary-dark: var(--palette-primary-800);
40
46
 
47
+ /* Muted surface tones, separate from the potentially saturated accent ramp.
48
+ Desaturate the primary, then tint with the light endpoint in sRGB.
49
+ The rational weights/hue offsets preserve Ice blue's historical
50
+ #f5f7f8 / #ebeff3 / #d7dee3 exactly; see colors/README.md. */
51
+ --palette-primary-surface-light: color-mix(in srgb,
52
+ hsl(from var(--palette-primary-500) calc(h - 248 / 35) calc(s * 759 / 2975 * var(--palette-primary-surface-saturation)) l) calc(100% * 17 / 253),
53
+ var(--palette-light));
54
+ --palette-primary-surface-medium: color-mix(in srgb,
55
+ hsl(from var(--palette-primary-500) calc(h + 102 / 35) calc(s * 253 / 700 * var(--palette-primary-surface-saturation)) l) calc(100% * 32 / 253),
56
+ var(--palette-light));
57
+ --palette-primary-surface-dark: color-mix(in srgb,
58
+ hsl(from var(--palette-primary-500) calc(h - 73 / 35) calc(s * 759 / 2975 * var(--palette-primary-surface-saturation)) l) calc(100% * 68 / 253),
59
+ var(--palette-light));
60
+
41
61
  --palette-secondary-50: color-mix(in oklch, var(--palette-secondary-500) 8%, var(--palette-secondary-light-mix));
42
62
  --palette-secondary-100: color-mix(in oklch, var(--palette-secondary-500) 16%, var(--palette-secondary-light-mix));
43
63
  --palette-secondary-200: color-mix(in oklch, var(--palette-secondary-500) 32%, var(--palette-secondary-light-mix));
@@ -74,6 +94,8 @@
74
94
  --font-size: 12px;
75
95
  --line-height: normal;
76
96
  --control-min-height: 2em;
97
+ --control-row-min-height: 0px;
98
+ --control-row-padding-block: .25em;
77
99
  --space-xs: 0px;
78
100
  --space-sm: 6px;
79
101
  --space-md: 1rem;
@@ -91,9 +113,19 @@
91
113
  --ui-shadow: none;
92
114
  --focus-ring: 0 0 0 1px var(--ui-accent-color-highlight);
93
115
  --focus-color: var(--ui-accent-color);
94
- --error-color: var(--palette-red, #b3261e);
116
+ --negative-color: var(--palette-status-negative, #b3261e);
117
+ --positive-color: var(--palette-status-positive, #287a3c);
118
+ --neutral-status-color: var(--palette-status-neutral, #64748b);
119
+ --error-color: var(--negative-color);
95
120
  --error-contrast: var(--palette-contrast-light, #fff);
96
- --success-color: #080;
121
+ /* Error state needs a lightness and spatial signal as well as a hue. This
122
+ * stays distinguishable when a palette primary is also red. */
123
+ --error-control-border: color-mix(in oklch, var(--error-color) 76%, var(--palette-dark));
124
+ --error-control-underlay: color-mix(in srgb, var(--error-color) 20%, transparent);
125
+ --error-control-shadow: 0 0 0 3px var(--error-control-underlay);
126
+ --error-icon-border: none;
127
+ --error-icon-shadow: 0 1px 2px color-mix(in srgb, var(--palette-dark) 24%, transparent);
128
+ --success-color: var(--positive-color);
97
129
 
98
130
  /* Layout components */
99
131
  --panel-background: var(--palette-neutral-50);
@@ -102,8 +134,20 @@
102
134
  --panel-shadow: none;
103
135
  --panel-radius: var(--radius-md);
104
136
 
105
- /* Explicit island modifier; non-island themes keep its layout neutral. */
137
+ /* Floating table-filter surface. It inherits ordinary panel chrome by
138
+ * default, while themes can make this compact elevated surface distinct. */
139
+ --filter-panel-background: var(--panel-background);
140
+ --filter-panel-color: var(--panel-color);
141
+ --filter-panel-border: var(--panel-border);
142
+ --filter-panel-shadow: var(--panel-shadow);
143
+ --filter-panel-radius: var(--panel-radius);
144
+ --filter-panel-padding: 8px;
145
+ --filter-panel-min-width: 180px;
146
+
147
+ /* Explicit surfaces; managed layouts own shared gutters and the perimeter. */
106
148
  --island-margin: 1rem;
149
+ --island-gap: 1rem;
150
+ --island-inset: var(--island-gap);
107
151
  --island-padding: 0;
108
152
  --island-background: var(--panel-background);
109
153
  --island-border: var(--panel-border);
@@ -138,6 +182,13 @@
138
182
  --section-header-border: var(--header-border);
139
183
  --section-header-shadow: var(--header-shadow);
140
184
  --section-header-font-size: 1rem;
185
+ --section-header-font-weight: bold;
186
+ --groupbox-section-header-color: var(--section-header-color);
187
+ --groupbox-section-separator: 1px solid var(--ui-border-color);
188
+ --groupbox-column-header-color: var(--ui-color);
189
+ --groupbox-column-separator: 1px solid var(--ui-border-color);
190
+ /* Inner GroupBox content rhythm is deliberately separate from island gutters. */
191
+ --groupbox-content-gap: 2px;
141
192
 
142
193
  --toolbar-background: var(--palette-neutral-100);
143
194
  --toolbar-color: var(--palette-neutral-950);
@@ -150,8 +201,17 @@
150
201
  --input-color: var(--text-color);
151
202
  --input-border: 1px solid #aaa;
152
203
  --input-shadow: none;
204
+ /* A missing required value is actionable but not yet a validation error. */
205
+ --required-color: var(--negative-color);
206
+ --required-indicator-background: transparent;
207
+ --required-indicator-color: var(--negative-color);
153
208
  --input-background-disabled: var(--ui-medium-bg-color);
154
209
  --input-color-disabled: #777;
210
+ /* Read-only values remain readable and focusable; they are not disabled. */
211
+ --input-background-readonly: var(--ui-primary-bg-color);
212
+ --input-color-readonly: var(--input-color);
213
+ --input-border-readonly: var(--input-border);
214
+ --input-shadow-readonly: var(--input-shadow);
155
215
  --dropdown-appearance: none;
156
216
  --dropdown-padding-inline-end: 1.75em;
157
217
  --dropdown-select-background: transparent;
@@ -160,20 +220,27 @@
160
220
  --dropdown-underlay-content: "";
161
221
  --dropdown-underlay-background: var(--input-background);
162
222
  --dropdown-underlay-background-disabled: var(--input-background-disabled);
223
+ --dropdown-underlay-background-readonly: var(--input-background-readonly);
163
224
  --dropdown-underlay-border: var(--input-border);
164
225
  --dropdown-underlay-border-disabled: var(--ui-input-border-disabled);
226
+ --dropdown-underlay-border-readonly: var(--input-border-readonly);
165
227
  --dropdown-underlay-shadow: var(--input-shadow);
228
+ --dropdown-underlay-shadow-readonly: var(--input-shadow-readonly);
166
229
  --dropdown-underlay-start-radius: var(--ui-border-radius);
167
230
  --dropdown-trigger-content: '\25BE';
168
231
  --dropdown-trigger-width: calc(var(--dd-btn-width) - 1px);
169
232
  --dropdown-trigger-color: var(--button-color);
233
+ --dropdown-trigger-color-readonly: var(--input-color-readonly);
170
234
  --dropdown-trigger-background: var(--button-background);
171
235
  --dropdown-trigger-background-hover: var(--button-background-hover);
172
236
  --dropdown-trigger-background-disabled: var(--button-background-disabled);
237
+ --dropdown-trigger-background-readonly: var(--input-background-readonly);
173
238
  --dropdown-trigger-border: var(--button-border);
174
239
  --dropdown-trigger-border-disabled: var(--button-border-disabled);
240
+ --dropdown-trigger-border-readonly: var(--input-border-readonly);
175
241
  --dropdown-trigger-end-radius: var(--ui-border-radius);
176
242
  --dropdown-trigger-shadow: var(--button-shadow);
243
+ --dropdown-trigger-shadow-readonly: var(--input-shadow-readonly);
177
244
  --dropdown-trigger-shadow-hover: var(--button-shadow);
178
245
 
179
246
  /* Action components */
@@ -192,18 +259,46 @@
192
259
  --selection-background: var(--palette-primary);
193
260
  --selection-color: var(--palette-contrast-light);
194
261
  --checkbox-box-background: var(--input-background);
262
+ --checkbox-box-background-readonly: var(--input-background-readonly);
195
263
  --checkbox-box-background-checked: var(--selection-background);
196
264
  --checkbox-box-border: var(--input-border);
265
+ --checkbox-box-border-readonly: var(--input-border-readonly);
266
+ --checkbox-box-border-checked: var(--checkbox-box-border);
267
+ --checkbox-box-size: 1em;
268
+ --checkbox-box-radius: var(--radius-sm);
197
269
  --checkbox-box-shadow: none;
270
+ --checkbox-box-shadow-readonly: var(--input-shadow-readonly);
198
271
  --checkbox-box-shadow-checked: var(--checkbox-box-shadow);
199
272
  --checkbox-symbol-color: var(--selection-color);
273
+ --checkbox-negative-background: var(--palette-status-negative);
274
+ --checkbox-negative-color: var(--palette-contrast-light);
275
+ --checkbox-negative-border: var(--checkbox-box-border-checked);
276
+ --checkbox-negative-shadow: var(--checkbox-box-shadow-checked);
277
+ --checkbox-positive-background: var(--palette-status-positive);
278
+ --checkbox-positive-color: var(--palette-contrast-light);
279
+ --checkbox-positive-border: var(--checkbox-box-border-checked);
280
+ --checkbox-positive-shadow: var(--checkbox-box-shadow-checked);
281
+ --checkbox-neutral-background: var(--palette-status-neutral);
282
+ --checkbox-neutral-color: var(--palette-contrast-light);
283
+ --checkbox-neutral-border: var(--checkbox-box-border-checked);
284
+ --checkbox-neutral-shadow: var(--checkbox-box-shadow-checked);
285
+ --radio-box-background-checked: var(--checkbox-box-background-checked);
286
+ --radio-box-border-checked: var(--checkbox-box-border-checked);
287
+ --radio-box-shadow-checked: var(--checkbox-box-shadow-checked);
288
+ --radio-symbol-color: var(--checkbox-symbol-color);
289
+ --radio-symbol-size: .4em;
290
+ --radio-group-gap: 0px;
200
291
  --checkable-label-color-disabled: #aaa;
292
+ --checkable-label-color-readonly: var(--input-color-readonly);
201
293
  --toggle-button-background: var(--button-background);
294
+ --toggle-button-background-readonly: var(--input-background-readonly);
202
295
  --toggle-button-background-checked: var(--palette-primary-700);
203
296
  --toggle-button-border-checked: var(--button-border);
297
+ --toggle-button-border-readonly: var(--input-border-readonly);
204
298
  --toggle-button-selected-inline-overlap: 0;
205
299
  --toggle-button-selected-z-index: 0;
206
300
  --toggle-button-shadow: none;
301
+ --toggle-button-shadow-readonly: none;
207
302
  --toggle-button-shadow-checked: none;
208
303
  --toggle-group-shadow: none;
209
304
  --toggle-inactive-shared-border-color: var(--palette-neutral-500);
@@ -280,6 +375,7 @@
280
375
  --ui-padding: 8px;
281
376
  --ui-padding-h: 8px;
282
377
  --ui-padding-v: 0px;
378
+ --ui-control-padding: 0 5px;
283
379
  --ui-margin: 1px;
284
380
  --ui-border-radius: 3px;
285
381
  --ui-text-color: var(--ui-color);
@@ -294,9 +390,9 @@
294
390
  --ui-input-text-color-disabled: #777;
295
391
  --ui-accent-color: var(--ui-select-bg-dark);
296
392
  --ui-accent-color-highlight: var(--primary-color-l90);
297
- --ui-primary-bg-color: #f5f7f8;
298
- --ui-medium-bg-color: #ebeff3;
299
- --ui-dark-bg-color: #d7dee3;
393
+ --ui-primary-bg-color: var(--palette-primary-surface-light);
394
+ --ui-medium-bg-color: var(--palette-primary-surface-medium);
395
+ --ui-dark-bg-color: var(--palette-primary-surface-dark);
300
396
  --ui-dark2-bg-color: var(--palette-neutral-400);
301
397
  --text-color: var(--palette-neutral-950);
302
398
  --primary-color-l90: var(--palette-primary-200);
@@ -308,17 +404,17 @@
308
404
  --input-width: 15em;
309
405
  --groupbox-preferred-width: 15rem;
310
406
  --button-border-disabled: #777;
311
- --error-text-color-light: #fcc;
312
- --error-text-color-dark: #800;
313
- --error-border-color: #f00;
314
- --error-bg: #faa;
315
- --error-bg-translucent: #f002;
407
+ --error-text-color-light: color-mix(in oklch, var(--negative-color) 24%, var(--palette-light));
408
+ --error-text-color-dark: color-mix(in oklch, var(--negative-color) 58%, var(--palette-dark));
409
+ --error-border-color: var(--negative-color);
410
+ --error-bg: color-mix(in oklch, var(--negative-color) 32%, var(--palette-light));
411
+ --error-bg-translucent: color-mix(in srgb, var(--negative-color) 13%, transparent);
316
412
  --error-bg-neutral: #fff;
317
- --success-text-color-light: #bfb;
318
- --success-text-color-dark: #b00;
319
- --success-border-color: #0b0;
320
- --success-bg: #beb;
321
- --success-bg-translucent: #0f02;
413
+ --success-text-color-light: color-mix(in oklch, var(--positive-color) 24%, var(--palette-light));
414
+ --success-text-color-dark: color-mix(in oklch, var(--positive-color) 58%, var(--palette-dark));
415
+ --success-border-color: var(--positive-color);
416
+ --success-bg: color-mix(in oklch, var(--positive-color) 32%, var(--palette-light));
417
+ --success-bg-translucent: color-mix(in srgb, var(--positive-color) 13%, transparent);
322
418
  --success-bg-neutral: #fff;
323
419
  --icon-filter-hue: 205deg;
324
420
  --icon-filter: brightness(1) opacity(.7) hue-rotate(var(--icon-filter-hue)) saturate(.75);
@@ -0,0 +1,300 @@
1
+ @charset "utf-8";
2
+
3
+ /* The restrained, card-oriented Capillary treatment. */
4
+ @layer theme {
5
+ :root {
6
+ color-scheme: only light;
7
+ --ui-control-padding: 6px 5px;
8
+ --control-row-padding-block: 0em;
9
+ /* Reserve one row for the roomiest native temporal body without changing
10
+ * the theme's painted input, button, checkbox or radio geometry. */
11
+ --control-row-min-height: 2.75em;
12
+ --font-family: Arial, Helvetica, sans-serif;
13
+ --radius-sm: 6px;
14
+ --radius-md: 10px;
15
+ --radius-lg: 18px;
16
+ --ui-border-radius: 9px;
17
+ --application-background: color-mix(in oklch, var(--palette-neutral-100) 52%, var(--palette-light));
18
+ --ui-background: color-mix(in oklch, var(--palette-neutral-100) 34%, var(--palette-light));
19
+ --ui-color: var(--palette-neutral-900);
20
+ --ui-border: 1px solid color-mix(in srgb, var(--palette-dark) 16%, var(--palette-light));
21
+ --ui-shadow: 0 0.4rem 1.25rem color-mix(in srgb, var(--palette-dark) 12%, transparent);
22
+ --focus-ring: 0 0 0 2px color-mix(in oklch, var(--palette-primary) 36%, var(--palette-light));
23
+ --focus-color: var(--palette-primary);
24
+ --panel-background: linear-gradient(to bottom, #fafafa, #eee);
25
+ --panel-color: var(--ui-color);
26
+ --panel-border: 1px solid color-mix(in srgb, var(--palette-dark) 15%, var(--palette-light));
27
+ --panel-shadow:
28
+ inset 0 1px 0 color-mix(in srgb, var(--palette-light) 96%, transparent),
29
+ inset 0 -1px 0 color-mix(in srgb, var(--palette-dark) 8%, transparent),
30
+ 0 0.125rem 0.4rem color-mix(in srgb, var(--palette-dark) 10%, transparent);
31
+ --panel-radius: var(--radius-lg);
32
+ --filter-panel-radius: var(--radius-md);
33
+ --filter-panel-padding: 0.65rem 0.75rem;
34
+ --filter-panel-shadow:
35
+ inset 0 1px 0 color-mix(in srgb, var(--palette-light) 96%, transparent),
36
+ inset 0 -1px 0 color-mix(in srgb, var(--palette-dark) 8%, transparent),
37
+ 0 0.3rem 0.85rem color-mix(in srgb, var(--palette-dark) 16%, transparent);
38
+ --island-padding: .5rem;
39
+ --header-background: transparent;
40
+ --header-color: var(--palette-primary-500);
41
+ --section-header-background: transparent;
42
+ --section-header-color: var(--palette-primary-500);
43
+ --section-header-font-size: 1.2rem;
44
+ --section-header-font-weight: 700;
45
+
46
+ --groupbox-section-font-size: 1.05rem;
47
+ --groupbox-section-header-color: var(--palette-primary-500);
48
+ --groupbox-section-separator: 0 solid transparent;
49
+ --groupbox-column-separator: 1px solid color-mix(in srgb, var(--palette-dark) 13%, var(--palette-light));
50
+ --groupbox-content-gap: 0rem;
51
+
52
+ --toolbar-background: unset;
53
+ --toolbar-color: var(--ui-color);
54
+ --toolbar-border: unset;
55
+ --toolbar-shadow: unset;
56
+
57
+ --input-background: #fefefe;
58
+ --input-color: var(--ui-color);
59
+ --input-border: 1px solid color-mix(in srgb, var(--palette-dark) 18%, var(--palette-light));
60
+ --input-shadow: inset 0 1px 1px color-mix(in srgb, var(--palette-dark) 8%, transparent), 0 1px 2px color-mix(in srgb, var(--palette-dark) 7%, transparent);
61
+ --input-background-disabled: var(--palette-neutral-100);
62
+ --input-color-disabled: var(--palette-neutral-500);
63
+ /* Keep the dropdown chevron on the input surface rather than making it a
64
+ * second, button-like segment. */
65
+ --dropdown-trigger-width: 1.75em;
66
+ --dropdown-trigger-color: color-mix(in srgb, var(--palette-dark) 58%, var(--palette-light));
67
+ --dropdown-trigger-background: transparent;
68
+ --dropdown-trigger-background-hover: transparent;
69
+ --dropdown-trigger-background-disabled: transparent;
70
+ --dropdown-trigger-border: 0 solid transparent;
71
+ --dropdown-trigger-border-disabled: 0 solid transparent;
72
+ --dropdown-trigger-shadow: none;
73
+ --dropdown-trigger-shadow-hover: none;
74
+ --button-background: linear-gradient(to bottom, var(--palette-light), color-mix(in srgb, var(--palette-dark) 5%, var(--palette-light)));
75
+ --button-background-hover: linear-gradient(to bottom, var(--palette-light), color-mix(in srgb, var(--palette-dark) 9%, var(--palette-light)));
76
+ --capillary-active-background: radial-gradient(120% 85% at 40% 5%, #fff7, #fff0 55%), linear-gradient(to bottom, var(--palette-primary-700), var(--palette-primary) 62%, var(--palette-primary-400));
77
+ --capillary-active-border: 1px solid color-mix(in srgb, var(--palette-primary-700) 72%, var(--palette-dark));
78
+ --capillary-active-shadow: inset 0 1px 0 #fff4, inset 0 -1px 0 color-mix(in srgb, var(--palette-primary-700) 38%, transparent), 0 1px 2px color-mix(in srgb, var(--palette-dark) 14%, transparent);
79
+ --button-background-active: var(--capillary-active-background);
80
+ --button-background-disabled: var(--palette-neutral-100);
81
+ --button-color: var(--ui-color);
82
+ --button-border: 1px solid color-mix(in srgb, var(--palette-dark) 18%, var(--palette-light));
83
+ --button-border-disabled: 1px solid color-mix(in srgb, var(--palette-dark) 9%, var(--palette-light));
84
+ --button-shadow: 0 1px 2px color-mix(in srgb, var(--palette-dark) 12%, transparent);
85
+ --button-shadow-active: var(--capillary-active-shadow);
86
+ --checkbox-box-background: var(--palette-light);
87
+ --checkbox-box-background-checked: var(--capillary-active-background);
88
+ --checkbox-box-border-checked: var(--palette-primary-500);
89
+ --checkbox-box-radius: 3px;
90
+ --checkbox-box-size: 1rem;
91
+ --checkbox-box-shadow: var(--input-shadow);
92
+ --checkbox-box-shadow-checked: var(--capillary-active-shadow);
93
+ --checkbox-negative-background: radial-gradient(120% 85% at 40% 5%, #fff6, #fff0 55%), linear-gradient(to bottom, color-mix(in srgb, var(--palette-status-negative) 84%, var(--palette-dark)), var(--palette-status-negative));
94
+ --checkbox-negative-border: 1px solid color-mix(in srgb, var(--palette-status-negative) 72%, var(--palette-dark));
95
+ --checkbox-negative-shadow: inset 0 1px 0 #fff4, inset 0 -1px 0 color-mix(in srgb, var(--palette-status-negative) 38%, transparent), 0 1px 2px color-mix(in srgb, var(--palette-dark) 14%, transparent);
96
+ --checkbox-positive-background: radial-gradient(120% 85% at 40% 5%, #fff6, #fff0 55%), linear-gradient(to bottom, color-mix(in srgb, var(--palette-status-positive) 84%, var(--palette-dark)), var(--palette-status-positive));
97
+ --checkbox-positive-border: 1px solid color-mix(in srgb, var(--palette-status-positive) 72%, var(--palette-dark));
98
+ --checkbox-positive-shadow: inset 0 1px 0 #fff4, inset 0 -1px 0 color-mix(in srgb, var(--palette-status-positive) 38%, transparent), 0 1px 2px color-mix(in srgb, var(--palette-dark) 14%, transparent);
99
+ --checkbox-neutral-background: radial-gradient(120% 85% at 40% 5%, #fff6, #fff0 55%), linear-gradient(to bottom, color-mix(in srgb, var(--palette-status-neutral) 84%, var(--palette-dark)), var(--palette-status-neutral));
100
+ --checkbox-neutral-border: 1px solid color-mix(in srgb, var(--palette-status-neutral) 72%, var(--palette-dark));
101
+ --checkbox-neutral-shadow: inset 0 1px 0 #fff4, inset 0 -1px 0 color-mix(in srgb, var(--palette-status-neutral) 38%, transparent), 0 1px 2px color-mix(in srgb, var(--palette-dark) 14%, transparent);
102
+ --radio-box-background-checked: var(--checkbox-box-background);
103
+ --radio-box-border-checked: 1px solid var(--palette-primary);
104
+ --radio-box-shadow-checked: var(--checkbox-box-shadow);
105
+ --radio-symbol-color: var(--palette-primary);
106
+ --radio-symbol-size: 0.5em;
107
+
108
+ --toggle-button-background-checked: var(--capillary-active-background);
109
+ --toggle-button-border-checked: var(--palette-primary-50);
110
+ --toggle-button-selected-inline-overlap: -1px;
111
+ --toggle-button-selected-z-index: 1;
112
+ --toggle-button-shadow-checked: var(--capillary-active-shadow);
113
+ --toggle-group-shadow: var(--button-shadow);
114
+ --toggle-inactive-shared-border-color: transparent;
115
+ --toggle-inactive-separator-background: #ddd;
116
+ --toggle-inactive-separator-block-inset: 0.35rem;
117
+
118
+ --tabline-background: transparent;
119
+ --tab-active-background: var(--palette-light);
120
+ --tab-button-background: color-mix(in oklch, var(--palette-light) 78%, var(--ui-primary-bg-color));
121
+ --tab-button-background-active: var(--palette-light);
122
+ --tab-button-shadow: none;
123
+ --tab-button-shadow-active: 0 -1px 0 var(--palette-primary), var(--button-shadow);
124
+ --table-header-background: color-mix(in oklch, var(--palette-light) 74%, var(--ui-primary-bg-color));
125
+ --table-header-color: var(--ui-color);
126
+ --table-row-background: var(--palette-light);
127
+ --table-row-alt-background: color-mix(in oklch, var(--palette-light) 78%, var(--ui-primary-bg-color));
128
+ --row-hover-background: color-mix(in oklch, var(--palette-primary-100) 45%, var(--palette-light));
129
+ --navigation-bar-background: unset;
130
+ --navigation-bar-border: unset;
131
+ --navigation-bar-shadow: unset;
132
+ --navigation-link-color: var(--ui-color);
133
+ --navigation-link-color-hover: var(--palette-primary-700);
134
+ --navigation-link-color-active: var(--palette-contrast-light);
135
+ --navigation-link-color-current: var(--palette-contrast-light);
136
+ --navigation-link-background-hover: color-mix(in oklch, var(--palette-primary-100) 54%, var(--palette-light));
137
+ --navigation-link-background-active: var(--palette-primary);
138
+ --navigation-link-background-current: var(--palette-primary);
139
+ --progress-track-background: color-mix(in oklch, var(--palette-light) 58%, var(--ui-dark-bg-color));
140
+ --progress-track-color: var(--ui-color);
141
+ --progress-track-shadow: inset 0 1px 2px color-mix(in oklch, var(--palette-dark) 12%, transparent);
142
+ --progress-value-background: linear-gradient(to bottom, var(--palette-primary-400), var(--palette-primary));
143
+ --progress-value-shadow: inset 0 1px 1px color-mix(in oklch, var(--palette-light) 35%, transparent);
144
+ --colored-shadow:
145
+ inset 0 1px 0 color-mix(in srgb, var(--palette-light) 52%, transparent),
146
+ inset 0 -1px 0 color-mix(in srgb, var(--c1, var(--colored-dark)) 42%, transparent),
147
+ 0 0.125rem 0.3rem color-mix(in srgb, var(--palette-dark) 16%, transparent);
148
+ --block-graph-block-border: 1px solid color-mix(in srgb,
149
+ var(--c1, var(--colored-dark)) 68%, var(--palette-light));
150
+ --block-graph-block-radius: var(--radius-sm);
151
+ }
152
+ }
153
+
154
+ cap-button > button[aria-pressed="true"] {
155
+ color: var(--palette-contrast-light);
156
+ background: var(--button-background-active);
157
+ border-color: var(--palette-primary);
158
+ }
159
+
160
+ cap-button > button:active:not(:disabled, [aria-disabled="true"]) {
161
+ color: var(--palette-contrast-light);
162
+ }
163
+
164
+ /* The shared select shell normally divides the underlay and trigger. Capillary
165
+ * uses one continuous input surface; the chevron is only an overlay. */
166
+ cap-dropdown > cap-selectshell::after {
167
+ border-radius: var(--ui-border-radius);
168
+ }
169
+
170
+ /* Section GroupBoxes form the first-level card hierarchy. Nested control
171
+ * GroupBoxes stay flat so their separators continue to organize the card body. */
172
+ cap-groupbox.cap-groupbox-section:not(cap-groupbox cap-groupbox) {
173
+ padding: 0.75rem 1rem 0;
174
+ border: var(--panel-border);
175
+ border-radius: var(--radius-lg);
176
+ background: var(--panel-background);
177
+ box-shadow: var(--panel-shadow);
178
+ }
179
+
180
+
181
+ :root {
182
+ --application-background:
183
+
184
+
185
+ /*
186
+ * Fold 1:
187
+ * tall fold rising from lower-left toward upper-middle
188
+ */
189
+ radial-gradient(
190
+ 130% 185% at 145% 118%,
191
+ rgb(255 255 255 / 0.00) 0%,
192
+ rgb(255 255 255 / 0.02) 18%,
193
+ rgb(255 255 255 / 0.05) 32%,
194
+ rgb(255 255 255 / 0.09) 44%,
195
+ rgb(255 255 255 / 0.14) 52%,
196
+ rgb(255 255 255 / 0.20) calc(58% - 2px),
197
+ rgb(255 255 255 / 0.96) calc(58% - 1px),
198
+ rgb(255 255 255 / 0.99) 58%,
199
+ rgb(255 255 255 / 0.00) calc(58% + 2px)
200
+ ),
201
+
202
+ radial-gradient(
203
+ 160% 115% at 95% 118%,
204
+ rgb(255 255 255 / 0.00) 0%,
205
+ rgb(255 255 255 / 0.02) 18%,
206
+ rgb(255 255 255 / 0.05) 32%,
207
+ rgb(255 255 255 / 0.09) 44%,
208
+ rgb(255 255 255 / 0.14) 52%,
209
+ rgb(255 255 255 / 0.20) calc(58% - 2px),
210
+ rgb(255 255 255 / 0.96) calc(58% - 1px),
211
+ rgb(255 255 255 / 0.99) 58%,
212
+ rgb(255 255 255 / 0.00) calc(58% + 2px)
213
+ ),
214
+
215
+
216
+ /*
217
+ * Fold 2:
218
+ * broad sweep across the lower-middle
219
+ */
220
+ radial-gradient(
221
+ 130% 210% at -48% 82%,
222
+ rgb(255 255 255 / 0.00) 0%,
223
+ rgb(255 255 255 / 0.02) 24%,
224
+ rgb(255 255 255 / 0.05) 40%,
225
+ rgb(255 255 255 / 0.09) 52%,
226
+ rgb(255 255 255 / 0.14) 60%,
227
+ rgb(255 255 255 / 0.20) calc(66% - 2px),
228
+ rgb(255 255 255 / 0.82) calc(66% - 1px),
229
+ rgb(255 255 255 / 0.88) 66%,
230
+ rgb(255 255 255 / 0.00) calc(66% + 2px)
231
+ ),
232
+
233
+ /*
234
+ * Fold 3:
235
+ * subtle top-right fold
236
+ */
237
+ radial-gradient(
238
+ 125% 155% at 138% -28%,
239
+ rgb(255 255 255 / 0.00) 0%,
240
+ rgb(255 255 255 / 0.01) 24%,
241
+ rgb(255 255 255 / 0.03) 38%,
242
+ rgb(255 255 255 / 0.07) 48%,
243
+ rgb(255 255 255 / 0.12) 54%,
244
+ rgb(255 255 255 / 0.20) calc(57% - 2px),
245
+ rgb(255 255 255 / 0.55) calc(57% - 1px),
246
+ rgb(255 255 255 / 0.62) 57%,
247
+ rgb(255 255 255 / 0.00) calc(57% + 2px)
248
+ ),
249
+
250
+
251
+ radial-gradient(
252
+ 125% 155% at 0% -25%,
253
+ rgb(255 255 255 / 0.00) 0%,
254
+ rgb(255 255 255 / 0.01) 24%,
255
+ rgb(255 255 255 / 0.03) 38%,
256
+ rgb(255 255 255 / 0.07) 48%,
257
+ rgb(255 255 255 / 0.12) 54%,
258
+ rgb(255 255 255 / 0.20) calc(57% - 2px),
259
+ rgb(255 255 255 / 0.55) calc(57% - 1px),
260
+ rgb(255 255 255 / 0.62) 57%,
261
+ rgb(255 255 255 / 0.00) calc(57% + 2px)
262
+ ),
263
+
264
+ /*
265
+ * very subtle overall lighting
266
+ */
267
+ linear-gradient(
268
+ 135deg,
269
+ rgb(255 255 255 / 0.06) 0%,
270
+ transparent 42%,
271
+ rgb(0 0 0 / 0.025) 100%
272
+ ),
273
+
274
+ #cfcfcf;
275
+
276
+ background-attachment: local;
277
+ }
278
+
279
+ html {
280
+ min-height: 100vh;
281
+ height: 100%;
282
+ }
283
+
284
+ body {
285
+ background: var(--application-background) no-repeat;
286
+ min-height: 100vh;
287
+ height: 100%;
288
+ }
289
+
290
+ cap-app {
291
+ background: none;
292
+ }
293
+
294
+ cap-listview,
295
+ cap-treeview,
296
+ cap-datatable {
297
+ border: var(--input-border);
298
+ box-shadow: var(--input-shadow);
299
+ border-radius: var(--ui-border-radius);
300
+ }