@dumiflex/wp-kit 0.3.0 → 0.4.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 (128) hide show
  1. package/CHANGELOG.md +77 -51
  2. package/LICENSE +674 -674
  3. package/README.md +73 -76
  4. package/package.json +78 -77
  5. package/src/Avatar.vue +83 -83
  6. package/src/Badge.vue +97 -97
  7. package/src/Banner.vue +118 -118
  8. package/src/BookmarkButton.vue +27 -27
  9. package/src/BundleMeta.vue +51 -51
  10. package/src/Button.vue +103 -103
  11. package/src/Card.vue +68 -68
  12. package/src/Checkbox.vue +109 -107
  13. package/src/Chip.vue +163 -97
  14. package/src/ChoiceCards.vue +133 -133
  15. package/src/CloseButton.vue +69 -69
  16. package/src/CodeBlock.vue +119 -119
  17. package/src/ColorField.vue +188 -206
  18. package/src/ColorPicker.vue +201 -201
  19. package/src/Combobox.vue +331 -334
  20. package/src/ConfirmDialog.vue +165 -163
  21. package/src/ConfirmModal.vue +147 -147
  22. package/src/ConstraintMatrixPreview.vue +708 -708
  23. package/src/ContextMenu.vue +386 -379
  24. package/src/CopyButton.vue +156 -156
  25. package/src/DataTable.vue +292 -292
  26. package/src/DatePicker.vue +234 -234
  27. package/src/DescriptionList.vue +73 -73
  28. package/src/DiffView.vue +68 -68
  29. package/src/Disclosure.vue +166 -166
  30. package/src/DragHandle.vue +49 -49
  31. package/src/Drawer.vue +131 -131
  32. package/src/DropZone.vue +196 -196
  33. package/src/DropdownMenu.vue +72 -72
  34. package/src/EmptyState.vue +111 -111
  35. package/src/Field.vue +28 -28
  36. package/src/HsvPicker.vue +208 -208
  37. package/src/Icon.vue +39 -39
  38. package/src/IconPicker.vue +209 -209
  39. package/src/ImageGrid.vue +125 -125
  40. package/src/InlineEdit.vue +183 -183
  41. package/src/Input.vue +99 -99
  42. package/src/Kbd.vue +56 -56
  43. package/src/Lightbox.vue +173 -173
  44. package/src/ListFilter.vue +85 -85
  45. package/src/ListRow.vue +204 -204
  46. package/src/LoadingMark.vue +175 -161
  47. package/src/Logo.vue +60 -60
  48. package/src/Modal.vue +78 -76
  49. package/src/ModalShell.vue +109 -107
  50. package/src/Pagination.vue +106 -106
  51. package/src/Popover.vue +180 -171
  52. package/src/PostCard.vue +210 -211
  53. package/src/ProgressBar.vue +90 -90
  54. package/src/RadioGroup.vue +177 -177
  55. package/src/RangeSlider.vue +183 -183
  56. package/src/RelativeDate.vue +35 -35
  57. package/src/ResizeHandle.vue +143 -143
  58. package/src/SearchInput.vue +192 -199
  59. package/src/Select.vue +644 -641
  60. package/src/Separator.vue +54 -54
  61. package/src/Skeleton.vue +82 -82
  62. package/src/Slider.vue +198 -198
  63. package/src/SortableList.vue +260 -260
  64. package/src/SplitPane.vue +68 -68
  65. package/src/StarButton.vue +40 -40
  66. package/src/Stepper.vue +141 -141
  67. package/src/SupportLinks.vue +93 -93
  68. package/src/TagInput.vue +297 -300
  69. package/src/Textarea.vue +57 -57
  70. package/src/Timeline.vue +92 -92
  71. package/src/ToastCard.vue +119 -119
  72. package/src/ToastHost.vue +40 -40
  73. package/src/Toggle.vue +36 -36
  74. package/src/TokenizedValue.vue +310 -310
  75. package/src/Toolbar.vue +110 -110
  76. package/src/VirtualList.vue +87 -87
  77. package/src/VisuallyHidden.vue +29 -29
  78. package/src/WpButton.vue +75 -75
  79. package/src/WpCheck.vue +104 -102
  80. package/src/WpIconButton.vue +107 -107
  81. package/src/WpImageZoom.vue +544 -544
  82. package/src/WpNumber.vue +178 -183
  83. package/src/WpSegmented.vue +175 -175
  84. package/src/WpSelect.vue +93 -89
  85. package/src/WpSwitch.vue +163 -163
  86. package/src/WpTabs.vue +188 -188
  87. package/src/_modal-motion.css +33 -33
  88. package/src/_skeleton.css +50 -50
  89. package/src/axis-color.ts +42 -42
  90. package/src/button.css +169 -169
  91. package/src/calendar.ts +59 -59
  92. package/src/clipboard.ts +50 -50
  93. package/src/colour-presets.ts +12 -12
  94. package/src/diff.ts +51 -51
  95. package/src/drop-zone.ts +41 -41
  96. package/src/field.css +50 -0
  97. package/src/flip.ts +237 -237
  98. package/src/floating-layer.ts +48 -0
  99. package/src/floating.ts +99 -99
  100. package/src/hsv.ts +100 -100
  101. package/src/icon-catalog.ts +52 -52
  102. package/src/image-zoom.ts +93 -93
  103. package/src/kind-colour.ts +28 -0
  104. package/src/logo-paths.ts +21 -21
  105. package/src/matrix-axis.ts +91 -91
  106. package/src/pagination.ts +27 -27
  107. package/src/platform-keys.ts +29 -29
  108. package/src/rich-tokenize.ts +357 -357
  109. package/src/select-types.ts +32 -32
  110. package/src/slider-math.ts +45 -45
  111. package/src/sortable.ts +22 -22
  112. package/src/theme/fonts/OFL-Fraunces.txt +93 -93
  113. package/src/theme/fonts/OFL-JetBrainsMono.txt +93 -93
  114. package/src/theme/fonts/OFL-Manrope.txt +93 -93
  115. package/src/theme/looks.css +428 -428
  116. package/src/theme/palettes.css +254 -254
  117. package/src/theme/tokens.css +2896 -2894
  118. package/src/tokens.ts +56 -56
  119. package/src/tooltip.css +43 -43
  120. package/src/tooltip.ts +146 -146
  121. package/src/useDialogFocus.ts +73 -73
  122. package/src/useGrowableField.ts +357 -357
  123. package/src/useModalKeyShield.ts +116 -116
  124. package/src/useToast.ts +48 -48
  125. package/src/wp-logo.svg +14 -14
  126. package/src/ChipToggle.vue +0 -92
  127. package/src/KindChip.vue +0 -53
  128. package/src/RatingBadge.vue +0 -42
@@ -1,428 +1,428 @@
1
- /* =========================================================
2
- Looks — `data-wp-look` on <html> (tweaksStore.setLook).
3
-
4
- A look is everything that is not colour: corner radius, type, borders vs
5
- shadows, density and how a selected state is drawn. Any look works with
6
- any colour theme (styles/themes.css), because these rules only read
7
- colour tokens and never set one. Orbit is tokens.css itself.
8
-
9
- Most of a look is the radius / font / height tokens. The rest is a few rules
10
- per look on the shared pieces (buttons, inputs, cards, chips, nav,
11
- segmented, tabs, checkboxes, tables). `html[data-wp-look=x] .wp-btn` (0,2,1)
12
- beats a scoped `.wp-btn[data-v-…]` (0,2,0), so no component has to know
13
- about looks. A new shared piece that should follow the looks gets its
14
- rule here.
15
-
16
- Fonts: Manrope (Soft) and Fraunces (Editorial headings) are OFL variable
17
- latin subsets from Fontsource (licences beside them in fonts/). A browser
18
- only downloads an @font-face when a rendered element uses its family, so a
19
- look's font costs nothing until that look is picked.
20
- ========================================================= */
21
-
22
- @font-face {
23
- font-family: "Manrope";
24
- font-style: normal;
25
- font-weight: 200 800;
26
- font-display: swap;
27
- src: url("./fonts/manrope-latin-wght-normal.woff2") format("woff2-variations"),
28
- url("./fonts/manrope-latin-wght-normal.woff2") format("woff2");
29
- }
30
- @font-face {
31
- font-family: "Fraunces";
32
- font-style: normal;
33
- font-weight: 100 900;
34
- font-display: swap;
35
- src: url("./fonts/fraunces-latin-wght-normal.woff2") format("woff2-variations"),
36
- url("./fonts/fraunces-latin-wght-normal.woff2") format("woff2");
37
- }
38
- @font-face {
39
- font-family: "JetBrains Mono";
40
- font-style: normal;
41
- font-weight: 100 900;
42
- font-display: swap;
43
- src: url("./fonts/jetbrains-mono-latin.woff2") format("woff2-variations"),
44
- url("./fonts/jetbrains-mono-latin.woff2") format("woff2");
45
- }
46
-
47
- /* --wp-radius-cap: the roundest a corner may get in this look. Fixed radii
48
- in components are written min(Npx, var(--wp-radius-cap, 999px)) and
49
- pills var(--wp-radius-cap, 999px), so Orbit draws them as authored and a
50
- square look squares them without a rule per component. Circles (50%)
51
- stay circles. The theme audit (scripts/theme-audit) fails on a corner
52
- rounder than the cap. */
53
- html[data-wp-look="crisp"] { --wp-radius-cap: 4px; }
54
- html[data-wp-look="terminal"],
55
- html[data-wp-look="tui"] { --wp-radius-cap: 0px; }
56
-
57
- /* Heading face; a look may swap it without touching body text. */
58
- html.wp-manager { --wp-font-head: var(--wp-font); }
59
- .wp-page__title, .wp-card__title { font-family: var(--wp-font-head); }
60
-
61
- /* ================= Crisp: square, outlined, ruled ================= */
62
- html[data-wp-look="crisp"] {
63
- --wp-radius-sm: 2px;
64
- --wp-radius: 3px;
65
- --wp-radius-lg: 4px;
66
- --wp-radius-xl: 4px;
67
- }
68
- html[data-wp-look="crisp"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg, .wp-nav, .wp-chip, .wp-check, .wp-topbar__icon-btn) { border-radius: 2px; }
69
- html[data-wp-look="crisp"] .wp-btn--secondary { background: transparent; border-color: var(--wp-border-strong); }
70
- html[data-wp-look="crisp"] .wp-btn--secondary:hover { background: var(--wp-bg-3); }
71
- html[data-wp-look="crisp"] :is(.wp-input, .wp-select, .wp-textarea, .wp-input-group, .wp-cselect__field) { border-color: var(--wp-border-strong); }
72
- html[data-wp-look="crisp"] :is(.wp-card, .wp-table-wrap) { border-color: var(--wp-border-strong); }
73
- html[data-wp-look="crisp"] .wp-chip { background: transparent; }
74
- html[data-wp-look="crisp"] .wp-nav[data-active] {
75
- background: transparent;
76
- border-color: var(--wp-accent-500);
77
- font-weight: 600;
78
- }
79
- html[data-wp-look="crisp"] .wp-nav[data-active]::before { display: none; }
80
- html[data-wp-look="crisp"] .wp-settings__section-link[data-active="true"] {
81
- background: transparent;
82
- box-shadow: inset 0 0 0 1px var(--wp-accent-500);
83
- }
84
- html[data-wp-look="crisp"] .wp-segmented { border-color: var(--wp-border-strong); background: transparent; }
85
- html[data-wp-look="crisp"] .wp-segmented__opt { border-radius: 1px; }
86
- html[data-wp-look="crisp"] .wp-segmented__opt[data-active="true"] {
87
- background: color-mix(in oklab, var(--wp-accent-500) 16%, transparent);
88
- box-shadow: inset 0 0 0 1px var(--wp-accent-500);
89
- color: var(--wp-accent-text);
90
- }
91
- html[data-wp-look="crisp"] :is(.wp-table thead th, .wp-sidebar__section, .wp-field__label) {
92
- font-family: var(--wp-font-mono);
93
- letter-spacing: 0;
94
- }
95
- html[data-wp-look="crisp"] .wp-page__title { font-size: 18px; font-weight: 700; letter-spacing: 0; }
96
-
97
- /* ================= Soft: pills, no outlines, lifted cards ================= */
98
- html[data-wp-look="soft"] {
99
- --wp-font: "Manrope", "Inter", ui-sans-serif, system-ui, sans-serif;
100
- --wp-radius-sm: 10px;
101
- --wp-radius: 14px;
102
- --wp-radius-lg: 18px;
103
- --wp-radius-xl: 22px;
104
- }
105
- html[data-wp-look="soft"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg) { border-radius: 999px; padding-inline: 16px; }
106
- html[data-wp-look="soft"] .wp-btn--icon { padding-inline: 0; }
107
- html[data-wp-look="soft"] .wp-btn--secondary { border-color: transparent; }
108
- html[data-wp-look="soft"] .wp-btn--primary {
109
- box-shadow: 0 4px 14px color-mix(in oklab, var(--wp-accent-600) 35%, transparent);
110
- }
111
- html[data-wp-look="soft"] :is(.wp-input, .wp-select, .wp-textarea, .wp-input-group, .wp-cselect__field) {
112
- border-color: transparent;
113
- background: var(--wp-bg-3);
114
- }
115
- html[data-wp-look="soft"] .wp-input-group .wp-input { background: transparent; }
116
- html[data-wp-look="soft"] :is(.wp-card, .wp-table-wrap) {
117
- border-color: transparent;
118
- box-shadow: var(--wp-shadow-md);
119
- }
120
- html[data-wp-look="soft"] :is(.wp-topbar, .wp-sidebar) { border-color: transparent; background: var(--wp-bg); }
121
- html[data-wp-look="soft"] .wp-chip { border-color: transparent; }
122
- html[data-wp-look="soft"] .wp-nav { border-radius: 999px; padding-inline: 14px; }
123
- html[data-wp-look="soft"] .wp-nav[data-active] {
124
- background: var(--wp-accent-600);
125
- border-color: transparent;
126
- color: #fff; /* audit-exempt: white on accent-600, 4.5:1+ in every theme */
127
- }
128
- html[data-wp-look="soft"] .wp-nav[data-active]::before { display: none; }
129
- html[data-wp-look="soft"] .wp-settings__section-link { border-radius: 999px; padding-inline: 14px; }
130
- html[data-wp-look="soft"] .wp-settings__section-link[data-active="true"] {
131
- background: var(--wp-accent-600);
132
- color: #fff; /* audit-exempt: white on accent-600 */
133
- }
134
- html[data-wp-look="soft"] .wp-segmented { border-color: transparent; border-radius: 999px; background: var(--wp-bg-3); }
135
- html[data-wp-look="soft"] .wp-segmented__opt { border-radius: 999px; }
136
- html[data-wp-look="soft"] .wp-segmented__opt[data-active="true"] {
137
- background: var(--wp-accent-600);
138
- box-shadow: none;
139
- color: #fff; /* audit-exempt: white on accent-600 */
140
- }
141
- html[data-wp-look="soft"] .wp-segmented__opt[data-active="true"] .pi { color: inherit; }
142
- html[data-wp-look="soft"] .wp-check { border-radius: 6px; }
143
- html[data-wp-look="soft"] .wp-page__title { font-size: 22px; font-weight: 700; }
144
-
145
- /* ================= Terminal: mono, zero radius, dashed ================= */
146
- html[data-wp-look="terminal"] {
147
- --wp-font: var(--wp-font-mono);
148
- --wp-radius-sm: 0px;
149
- --wp-radius: 0px;
150
- --wp-radius-lg: 0px;
151
- --wp-radius-xl: 0px;
152
- }
153
- html[data-wp-look="terminal"] body { font-size: 12.5px; }
154
- html[data-wp-look="terminal"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg, .wp-nav, .wp-chip, .wp-check, .wp-segmented, .wp-segmented__opt, .wp-topbar__icon-btn, .wp-nav__count) { border-radius: 0; }
155
- html[data-wp-look="terminal"] :is(.wp-card, .wp-table-wrap, .wp-input-group--readonly) { border-style: dashed; border-color: var(--wp-border-strong); }
156
- html[data-wp-look="terminal"] .wp-card__header { border-bottom-style: dashed; }
157
- html[data-wp-look="terminal"] .wp-table tbody tr:not(:last-child) td { border-bottom-style: dashed; }
158
- html[data-wp-look="terminal"] .wp-topbar { border-bottom-style: dashed; }
159
- html[data-wp-look="terminal"] .wp-sidebar { border-right-style: dashed; }
160
- html[data-wp-look="terminal"] .wp-btn--primary {
161
- background: color-mix(in oklab, var(--wp-accent-500) 14%, transparent);
162
- border-color: var(--wp-accent-text);
163
- color: var(--wp-accent-text);
164
- }
165
- html[data-wp-look="terminal"] .wp-btn--primary:hover {
166
- background: color-mix(in oklab, var(--wp-accent-500) 24%, transparent);
167
- border-color: var(--wp-accent-text-strong);
168
- }
169
- html[data-wp-look="terminal"] .wp-btn--secondary { background: transparent; border-color: var(--wp-border-strong); }
170
- html[data-wp-look="terminal"] .wp-chip { background: transparent; }
171
- html[data-wp-look="terminal"] .wp-nav[data-active] {
172
- background: transparent;
173
- border-color: transparent;
174
- color: var(--wp-accent-text);
175
- font-weight: 600;
176
- }
177
- html[data-wp-look="terminal"] .wp-nav[data-active]::before {
178
- content: ">";
179
- width: auto;
180
- top: 50%;
181
- bottom: auto;
182
- left: 0;
183
- transform: translateY(-50%);
184
- background: none;
185
- color: var(--wp-accent-text);
186
- font-weight: 700;
187
- }
188
- html[data-wp-look="terminal"] .wp-sidebar__section { text-transform: none; letter-spacing: 0; }
189
- html[data-wp-look="terminal"] .wp-sidebar__section::before { content: "# "; }
190
- html[data-wp-look="terminal"] .wp-settings__section-link[data-active="true"] { background: transparent; }
191
- html[data-wp-look="terminal"] .wp-settings__section-link[data-active="true"]::before { content: ">"; margin-right: -4px; font-weight: 700; }
192
- html[data-wp-look="terminal"] .wp-segmented { border-color: transparent; background: transparent; gap: 4px; }
193
- html[data-wp-look="terminal"] .wp-segmented__opt[data-active="true"] {
194
- background: transparent;
195
- box-shadow: inset 0 0 0 1px var(--wp-accent-text);
196
- color: var(--wp-accent-text);
197
- }
198
- html[data-wp-look="terminal"] .wp-tabset__tab[data-active="true"] { border-bottom-style: dashed; }
199
- /* A switch that is on reads like the outlined primary button: a tinted
200
- track ruled in accent text, not a solid fill. The knob squares with the
201
- track through --wp-radius-cap. */
202
- html[data-wp-look="terminal"] .wp-switch[aria-checked="true"] .wp-switch__track {
203
- background: color-mix(in oklab, var(--wp-accent-500) 14%, transparent);
204
- border-color: var(--wp-accent-text);
205
- }
206
- html[data-wp-look="terminal"] .wp-switch[aria-checked="true"] .wp-switch__knob { background: var(--wp-accent-text); }
207
- html[data-wp-look="terminal"] .wp-page__title { font-size: 17px; font-weight: 600; letter-spacing: 0; }
208
-
209
- /* ================= Editorial: serif headings, open, underlined ================= */
210
- html[data-wp-look="editorial"] {
211
- --wp-font-head: "Fraunces", Georgia, "Times New Roman", serif;
212
- --wp-radius-sm: 4px;
213
- --wp-radius: 4px;
214
- --wp-radius-lg: 6px;
215
- }
216
- html[data-wp-look="editorial"] .wp-page__title { font-size: 28px; line-height: 1.2; font-weight: 500; letter-spacing: -0.01em; }
217
- html[data-wp-look="editorial"] .wp-card__title { font-size: 16px; font-weight: 500; letter-spacing: 0; }
218
- html[data-wp-look="editorial"] .wp-content { padding-inline: 36px; --wp-content-px: 36px; }
219
- html[data-wp-look="editorial"] :is(.wp-topbar, .wp-sidebar) { background: var(--wp-bg); }
220
- html[data-wp-look="editorial"] .wp-card {
221
- background: transparent;
222
- border: 0;
223
- border-top: 1px solid var(--wp-text);
224
- border-radius: 0;
225
- }
226
- html[data-wp-look="editorial"] .wp-card__header { padding-inline: 0; }
227
- html[data-wp-look="editorial"] .wp-card__body { padding-inline: 0; }
228
- html[data-wp-look="editorial"] .wp-table-wrap { background: transparent; border: 0; border-radius: 0; }
229
- html[data-wp-look="editorial"] .wp-table thead th {
230
- background: transparent;
231
- border-bottom-color: var(--wp-text);
232
- text-transform: none;
233
- letter-spacing: 0;
234
- font-size: 12px;
235
- }
236
- html[data-wp-look="editorial"] .wp-nav[data-active] { background: transparent; border-color: transparent; font-weight: 600; }
237
- html[data-wp-look="editorial"] .wp-nav[data-active]::before { display: none; }
238
- html[data-wp-look="editorial"] .wp-settings__section-link[data-active="true"] {
239
- background: transparent;
240
- color: var(--wp-text);
241
- text-decoration: underline;
242
- text-decoration-color: var(--wp-accent-500);
243
- text-decoration-thickness: 2px;
244
- text-underline-offset: 5px;
245
- }
246
- html[data-wp-look="editorial"] .wp-nav[data-active] .wp-nav__label {
247
- text-decoration: underline;
248
- text-decoration-color: var(--wp-accent-500);
249
- text-decoration-thickness: 2px;
250
- text-underline-offset: 5px;
251
- }
252
- html[data-wp-look="editorial"] .wp-btn--secondary { background: transparent; border-color: transparent; text-decoration: underline; text-underline-offset: 3px; }
253
- html[data-wp-look="editorial"] .wp-btn--secondary:hover { background: var(--wp-bg-3); }
254
- html[data-wp-look="editorial"] .wp-segmented { background: transparent; border: 0; border-radius: 0; gap: 14px; padding-inline: 0; box-shadow: inset 0 -1px 0 var(--wp-border); }
255
- html[data-wp-look="editorial"] .wp-segmented__opt { padding-inline: 0; border-radius: 0; }
256
- html[data-wp-look="editorial"] .wp-segmented__opt:hover:not(:disabled) { background: transparent; }
257
- html[data-wp-look="editorial"] .wp-segmented__opt[data-active="true"] {
258
- background: transparent;
259
- box-shadow: inset 0 -2px 0 var(--wp-accent-500);
260
- }
261
- html[data-wp-look="editorial"] .wp-sidebar__section { text-transform: none; letter-spacing: 0; font-size: 11px; font-style: italic; }
262
-
263
- /* ================= Compact: tight rows, small type ================= */
264
- html[data-wp-look="compact"] {
265
- --wp-radius-sm: 3px;
266
- --wp-radius: 4px;
267
- --wp-radius-lg: 5px;
268
- --wp-radius-xl: 6px;
269
- --wp-control-h-md-base: 28px;
270
- --wp-control-h-lg-base: 32px;
271
- --wp-topbar-h: 40px;
272
- }
273
- html[data-wp-look="compact"] body { font-size: 12.5px; }
274
- html[data-wp-look="compact"] :is(.wp-btn, .wp-nav, .wp-topbar__icon-btn) { border-radius: 4px; }
275
- html[data-wp-look="compact"] .wp-btn { font-size: 12px; padding-inline: 10px; }
276
- html[data-wp-look="compact"] .wp-btn--icon { padding-inline: 0; }
277
- html[data-wp-look="compact"] .wp-nav { padding: 5px 8px; font-size: 12.5px; }
278
- html[data-wp-look="compact"] .wp-content { padding: 12px 16px 28px; --wp-content-px: 16px; }
279
- html[data-wp-look="compact"] .wp-page__title { font-size: 16px; }
280
- html[data-wp-look="compact"] .wp-card__header { padding: 8px 10px; }
281
- html[data-wp-look="compact"] .wp-card__body { padding: 10px; }
282
- html[data-wp-look="compact"] .wp-table thead th { padding: 6px 10px; }
283
- html[data-wp-look="compact"] .wp-table tbody td { padding: 5px 10px; font-size: 12px; }
284
- html[data-wp-look="compact"] .wp-table tbody tr:nth-child(even) td { background: var(--wp-bg-2); }
285
- html[data-wp-look="compact"] .wp-table tbody tr:hover td { background: var(--wp-bg-3); }
286
-
287
- /* ================= TUI: boxed panels, inverse selection, [x] ================= */
288
- html[data-wp-look="tui"] {
289
- --wp-font: var(--wp-font-mono);
290
- --wp-radius-sm: 0px;
291
- --wp-radius: 0px;
292
- --wp-radius-lg: 0px;
293
- --wp-radius-xl: 0px;
294
- --wp-topbar-h: 40px;
295
- }
296
- html[data-wp-look="tui"] body { font-size: 12.5px; }
297
- html[data-wp-look="tui"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg, .wp-nav, .wp-chip, .wp-segmented, .wp-segmented__opt, .wp-topbar__icon-btn, .wp-nav__count, .wp-tabset__tab) { border-radius: 0; }
298
- html[data-wp-look="tui"] .wp-topbar { background: var(--wp-bg-3); border-bottom-color: var(--wp-border-strong); }
299
- html[data-wp-look="tui"] .wp-sidebar {
300
- margin: 8px 0 8px 8px;
301
- border: 1px solid var(--wp-border-strong);
302
- background: transparent;
303
- }
304
- html[data-wp-look="tui"] :is(.wp-card, .wp-table-wrap) { border-color: var(--wp-border-strong); background: transparent; }
305
- html[data-wp-look="tui"] .wp-card__header { background: var(--wp-bg-3); border-bottom-color: var(--wp-border-strong); padding-block: 6px; }
306
- html[data-wp-look="tui"] .wp-card__title { color: var(--wp-accent-text); font-weight: 700; }
307
- html[data-wp-look="tui"] .wp-table thead th { background: var(--wp-bg-3); border-bottom-color: var(--wp-border-strong); text-transform: none; letter-spacing: 0; }
308
- html[data-wp-look="tui"] .wp-table tbody td { border-bottom: 0; padding-block: 5px; }
309
- html[data-wp-look="tui"] .wp-table tbody tr:hover td { background: var(--wp-bg-3); }
310
- html[data-wp-look="tui"] .wp-nav { padding-block: 4px; }
311
- html[data-wp-look="tui"] .wp-nav[data-active],
312
- html[data-wp-look="tui"] .wp-segmented__opt[data-active="true"],
313
- html[data-wp-look="tui"] .wp-tabset__tab[data-active="true"],
314
- html[data-wp-look="tui"] .wp-settings__section-link[data-active="true"],
315
- html[data-wp-look="tui"] .wp-trr__row[data-active="true"],
316
- html[data-wp-look="tui"] .wp-pack__steps li[data-on] {
317
- background: var(--wp-accent-600);
318
- border-color: transparent;
319
- box-shadow: none;
320
- color: #fff; /* audit-exempt: white on accent-600, 4.5:1+ in every theme */
321
- }
322
- html[data-wp-look="tui"] :is(.wp-nav[data-active], .wp-segmented__opt[data-active="true"], .wp-tabset__tab[data-active="true"], .wp-settings__section-link[data-active="true"], .wp-trr__row[data-active="true"], .wp-pack__steps li[data-on]) :is(.pi, *) { color: inherit; }
323
- html[data-wp-look="tui"] .wp-nav[data-active]::before { display: none; }
324
- /* A count on an inverse tab or nav row reads on the accent fill, not as an
325
- accent chip on it (3:1 before). */
326
- html[data-wp-look="tui"] :is(.wp-tabset__tab[data-active="true"] .wp-tabset__count, .wp-nav[data-active] .wp-nav__count) {
327
- background: color-mix(in oklab, #fff 18%, transparent); /* audit-exempt: lightens the accent fill under white text */
328
- color: inherit;
329
- }
330
- html[data-wp-look="tui"] .wp-sidebar__section { text-transform: none; letter-spacing: 0; color: var(--wp-accent-text); }
331
- html[data-wp-look="tui"] .wp-segmented { border-color: transparent; background: transparent; gap: 6px; }
332
- html[data-wp-look="tui"] .wp-tabset__tab { padding-inline: 8px; }
333
- /* Buttons read [ Save ]; an icon-only or link button stays as it is. */
334
- html[data-wp-look="tui"] .wp-btn { border-color: transparent; }
335
- html[data-wp-look="tui"] .wp-btn--secondary { background: transparent; }
336
- html[data-wp-look="tui"] .wp-btn--secondary:hover { background: var(--wp-bg-3); }
337
- html[data-wp-look="tui"] .wp-btn:not(.wp-btn--icon, .wp-btn--link) .wp-btn__label::before { content: "[ "; }
338
- html[data-wp-look="tui"] .wp-btn:not(.wp-btn--icon, .wp-btn--link) .wp-btn__label::after { content: " ]"; }
339
- html[data-wp-look="tui"] :is(.wp-input, .wp-select, .wp-textarea, .wp-input-group, .wp-cselect__field) {
340
- border-color: var(--wp-border-strong);
341
- background: var(--wp-bg);
342
- }
343
- html[data-wp-look="tui"] .wp-input-group .wp-input { background: transparent; }
344
- /* Checkboxes read [ ] / [x]; the drawn tick hides. */
345
- html[data-wp-look="tui"] .wp-check {
346
- width: auto;
347
- min-width: 3ch;
348
- border: 0;
349
- border-radius: 0;
350
- background: transparent;
351
- color: var(--wp-text-muted);
352
- font-family: var(--wp-font-mono);
353
- font-size: 12px;
354
- line-height: 1;
355
- }
356
- /* State comes from aria-checked or, on a decorative box (aria-hidden, no
357
- role), data-checked / data-indeterminate. Nothing may set an inline
358
- display on the tick: it would beat this rule and draw both marks. */
359
- html[data-wp-look="tui"] .wp-check svg { display: none; }
360
- html[data-wp-look="tui"] .wp-check::before { content: "[ ]"; }
361
- html[data-wp-look="tui"] .wp-check:is([aria-checked="true"], [data-checked="true"])::before { content: "[x]"; color: var(--wp-accent-text); }
362
- html[data-wp-look="tui"] .wp-check:is([aria-checked="mixed"], [data-indeterminate="true"]):not([data-checked="true"])::before { content: "[-]"; color: var(--wp-accent-text); }
363
- html[data-wp-look="tui"] .wp-page__title { font-size: 16px; font-weight: 700; letter-spacing: 0; }
364
- /* Radios read ( ) / (*) beside the [ ] / [x] checkboxes; the drawn dot
365
- hides. RadioGroup marks the picked option on the row (data-checked), the
366
- plain .wp-radio is a real input (:checked). */
367
- html[data-wp-look="tui"] .wp-radio-group__opt .wp-radio-group__dot,
368
- html[data-wp-look="tui"] .wp-radio {
369
- width: auto;
370
- min-width: 3ch;
371
- height: auto;
372
- border: 0;
373
- border-radius: 0;
374
- background: transparent;
375
- color: var(--wp-text-muted);
376
- font-family: var(--wp-font-mono);
377
- font-size: 12px;
378
- line-height: 16px;
379
- }
380
- html[data-wp-look="tui"] .wp-radio-group__opt[data-checked] .wp-radio-group__dot::after { display: none; }
381
- html[data-wp-look="tui"] .wp-radio-group__dot::before { content: "( )"; }
382
- html[data-wp-look="tui"] .wp-radio-group__opt[data-checked] .wp-radio-group__dot::before { content: "(*)"; color: var(--wp-accent-text); }
383
- html[data-wp-look="tui"] .wp-radio-group__opt[aria-disabled="true"][data-checked] .wp-radio-group__dot::before { color: var(--wp-text-dim); }
384
- html[data-wp-look="tui"] .wp-radio::before,
385
- html[data-wp-look="tui"] .wp-radio:disabled::before {
386
- content: "( )";
387
- width: auto;
388
- height: auto;
389
- border-radius: 0;
390
- background: transparent;
391
- transform: none;
392
- }
393
- html[data-wp-look="tui"] .wp-radio:checked::before { content: "(*)"; color: var(--wp-accent-text); }
394
- html[data-wp-look="tui"] .wp-radio:disabled:checked::before { content: "(*)"; color: var(--wp-text-dim); }
395
- html[data-wp-look="tui"] .wp-radio:checked,
396
- html[data-wp-look="tui"] .wp-radio:disabled:checked { background: transparent; }
397
-
398
- /* ================= Canvas previews ignore the look =================
399
- The canvas keeps ComfyUI's ground in every look (only the accent follows
400
- the manager), so the Settings › Canvas live preview draws canvas pieces
401
- with the canvas's own corners and type, not the manager look's. */
402
- html.wp-manager .wp-pg-mockup {
403
- --wp-radius-cap: 999px;
404
- --wp-radius-sm: 6px;
405
- --wp-radius: 8px;
406
- --wp-radius-lg: 12px;
407
- --wp-radius-xl: 16px;
408
- --wp-font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
409
- font-family: var(--wp-font);
410
- }
411
-
412
- /* ---------- PostCard in each look ----------
413
- * The card draws its own box (src/PostCard.vue), so the looks restyle it like
414
- * a .wp-card: firmer, softer, dashed, ruled, tighter or boxed. */
415
- html[data-wp-look="crisp"] .wp-post-card { border-color: var(--wp-border-strong); }
416
- html[data-wp-look="soft"] .wp-post-card { border-color: transparent; box-shadow: var(--wp-shadow-md); }
417
- html[data-wp-look="terminal"] .wp-post-card { border-style: dashed; border-color: var(--wp-border-strong); }
418
- html[data-wp-look="editorial"] .wp-post-card {
419
- background: transparent;
420
- border: 0;
421
- border-top: 1px solid var(--wp-text);
422
- border-radius: 0;
423
- }
424
- html[data-wp-look="editorial"] .wp-post-card:hover { transform: none; box-shadow: none; }
425
- html[data-wp-look="editorial"] .wp-post-card__slug { font-family: var(--wp-font-head, var(--wp-font)); font-size: 16px; }
426
- html[data-wp-look="compact"] .wp-post-card { padding: 12px 14px; gap: 8px; }
427
- html[data-wp-look="tui"] .wp-post-card { border-color: var(--wp-border-strong); background: transparent; }
428
- html[data-wp-look="tui"] .wp-post-card:hover { transform: none; box-shadow: none; background: var(--wp-bg-2); }
1
+ /* =========================================================
2
+ Looks — `data-wp-look` on <html> (tweaksStore.setLook).
3
+
4
+ A look is everything that is not colour: corner radius, type, borders vs
5
+ shadows, density and how a selected state is drawn. Any look works with
6
+ any colour theme (styles/themes.css), because these rules only read
7
+ colour tokens and never set one. Orbit is tokens.css itself.
8
+
9
+ Most of a look is the radius / font / height tokens. The rest is a few rules
10
+ per look on the shared pieces (buttons, inputs, cards, chips, nav,
11
+ segmented, tabs, checkboxes, tables). `html[data-wp-look=x] .wp-btn` (0,2,1)
12
+ beats a scoped `.wp-btn[data-v-…]` (0,2,0), so no component has to know
13
+ about looks. A new shared piece that should follow the looks gets its
14
+ rule here.
15
+
16
+ Fonts: Manrope (Soft) and Fraunces (Editorial headings) are OFL variable
17
+ latin subsets from Fontsource (licences beside them in fonts/). A browser
18
+ only downloads an @font-face when a rendered element uses its family, so a
19
+ look's font costs nothing until that look is picked.
20
+ ========================================================= */
21
+
22
+ @font-face {
23
+ font-family: "Manrope";
24
+ font-style: normal;
25
+ font-weight: 200 800;
26
+ font-display: swap;
27
+ src: url("./fonts/manrope-latin-wght-normal.woff2") format("woff2-variations"),
28
+ url("./fonts/manrope-latin-wght-normal.woff2") format("woff2");
29
+ }
30
+ @font-face {
31
+ font-family: "Fraunces";
32
+ font-style: normal;
33
+ font-weight: 100 900;
34
+ font-display: swap;
35
+ src: url("./fonts/fraunces-latin-wght-normal.woff2") format("woff2-variations"),
36
+ url("./fonts/fraunces-latin-wght-normal.woff2") format("woff2");
37
+ }
38
+ @font-face {
39
+ font-family: "JetBrains Mono";
40
+ font-style: normal;
41
+ font-weight: 100 900;
42
+ font-display: swap;
43
+ src: url("./fonts/jetbrains-mono-latin.woff2") format("woff2-variations"),
44
+ url("./fonts/jetbrains-mono-latin.woff2") format("woff2");
45
+ }
46
+
47
+ /* --wp-radius-cap: the roundest a corner may get in this look. Fixed radii
48
+ in components are written min(Npx, var(--wp-radius-cap, 999px)) and
49
+ pills var(--wp-radius-cap, 999px), so Orbit draws them as authored and a
50
+ square look squares them without a rule per component. Circles (50%)
51
+ stay circles. The theme audit (scripts/theme-audit) fails on a corner
52
+ rounder than the cap. */
53
+ html[data-wp-look="crisp"] { --wp-radius-cap: 4px; }
54
+ html[data-wp-look="terminal"],
55
+ html[data-wp-look="tui"] { --wp-radius-cap: 0px; }
56
+
57
+ /* Heading face; a look may swap it without touching body text. */
58
+ html.wp-manager { --wp-font-head: var(--wp-font); }
59
+ .wp-page__title, .wp-card__title { font-family: var(--wp-font-head); }
60
+
61
+ /* ================= Crisp: square, outlined, ruled ================= */
62
+ html[data-wp-look="crisp"] {
63
+ --wp-radius-sm: 2px;
64
+ --wp-radius: 3px;
65
+ --wp-radius-lg: 4px;
66
+ --wp-radius-xl: 4px;
67
+ }
68
+ html[data-wp-look="crisp"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg, .wp-nav, .wp-chip, .wp-check, .wp-topbar__icon-btn) { border-radius: 2px; }
69
+ html[data-wp-look="crisp"] .wp-btn--secondary { background: transparent; border-color: var(--wp-border-strong); }
70
+ html[data-wp-look="crisp"] .wp-btn--secondary:hover { background: var(--wp-bg-3); }
71
+ html[data-wp-look="crisp"] :is(.wp-input, .wp-select, .wp-textarea, .wp-input-group, .wp-cselect__field) { border-color: var(--wp-border-strong); }
72
+ html[data-wp-look="crisp"] :is(.wp-card, .wp-table-wrap) { border-color: var(--wp-border-strong); }
73
+ html[data-wp-look="crisp"] .wp-chip { background: transparent; }
74
+ html[data-wp-look="crisp"] .wp-nav[data-active] {
75
+ background: transparent;
76
+ border-color: var(--wp-accent-500);
77
+ font-weight: 600;
78
+ }
79
+ html[data-wp-look="crisp"] .wp-nav[data-active]::before { display: none; }
80
+ html[data-wp-look="crisp"] .wp-settings__section-link[data-active="true"] {
81
+ background: transparent;
82
+ box-shadow: inset 0 0 0 1px var(--wp-accent-500);
83
+ }
84
+ html[data-wp-look="crisp"] .wp-segmented { border-color: var(--wp-border-strong); background: transparent; }
85
+ html[data-wp-look="crisp"] .wp-segmented__opt { border-radius: 1px; }
86
+ html[data-wp-look="crisp"] .wp-segmented__opt[data-active="true"] {
87
+ background: color-mix(in oklab, var(--wp-accent-500) 16%, transparent);
88
+ box-shadow: inset 0 0 0 1px var(--wp-accent-500);
89
+ color: var(--wp-accent-text);
90
+ }
91
+ html[data-wp-look="crisp"] :is(.wp-table thead th, .wp-sidebar__section, .wp-field__label) {
92
+ font-family: var(--wp-font-mono);
93
+ letter-spacing: 0;
94
+ }
95
+ html[data-wp-look="crisp"] .wp-page__title { font-size: 18px; font-weight: 700; letter-spacing: 0; }
96
+
97
+ /* ================= Soft: pills, no outlines, lifted cards ================= */
98
+ html[data-wp-look="soft"] {
99
+ --wp-font: "Manrope", "Inter", ui-sans-serif, system-ui, sans-serif;
100
+ --wp-radius-sm: 10px;
101
+ --wp-radius: 14px;
102
+ --wp-radius-lg: 18px;
103
+ --wp-radius-xl: 22px;
104
+ }
105
+ html[data-wp-look="soft"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg) { border-radius: 999px; padding-inline: 16px; }
106
+ html[data-wp-look="soft"] .wp-btn--icon { padding-inline: 0; }
107
+ html[data-wp-look="soft"] .wp-btn--secondary { border-color: transparent; }
108
+ html[data-wp-look="soft"] .wp-btn--primary {
109
+ box-shadow: 0 4px 14px color-mix(in oklab, var(--wp-accent-600) 35%, transparent);
110
+ }
111
+ html[data-wp-look="soft"] :is(.wp-input, .wp-select, .wp-textarea, .wp-input-group, .wp-cselect__field) {
112
+ border-color: transparent;
113
+ background: var(--wp-bg-3);
114
+ }
115
+ html[data-wp-look="soft"] .wp-input-group .wp-input { background: transparent; }
116
+ html[data-wp-look="soft"] :is(.wp-card, .wp-table-wrap) {
117
+ border-color: transparent;
118
+ box-shadow: var(--wp-shadow-md);
119
+ }
120
+ html[data-wp-look="soft"] :is(.wp-topbar, .wp-sidebar) { border-color: transparent; background: var(--wp-bg); }
121
+ html[data-wp-look="soft"] .wp-chip { border-color: transparent; }
122
+ html[data-wp-look="soft"] .wp-nav { border-radius: 999px; padding-inline: 14px; }
123
+ html[data-wp-look="soft"] .wp-nav[data-active] {
124
+ background: var(--wp-accent-600);
125
+ border-color: transparent;
126
+ color: #fff; /* audit-exempt: white on accent-600, 4.5:1+ in every theme */
127
+ }
128
+ html[data-wp-look="soft"] .wp-nav[data-active]::before { display: none; }
129
+ html[data-wp-look="soft"] .wp-settings__section-link { border-radius: 999px; padding-inline: 14px; }
130
+ html[data-wp-look="soft"] .wp-settings__section-link[data-active="true"] {
131
+ background: var(--wp-accent-600);
132
+ color: #fff; /* audit-exempt: white on accent-600 */
133
+ }
134
+ html[data-wp-look="soft"] .wp-segmented { border-color: transparent; border-radius: 999px; background: var(--wp-bg-3); }
135
+ html[data-wp-look="soft"] .wp-segmented__opt { border-radius: 999px; }
136
+ html[data-wp-look="soft"] .wp-segmented__opt[data-active="true"] {
137
+ background: var(--wp-accent-600);
138
+ box-shadow: none;
139
+ color: #fff; /* audit-exempt: white on accent-600 */
140
+ }
141
+ html[data-wp-look="soft"] .wp-segmented__opt[data-active="true"] .pi { color: inherit; }
142
+ html[data-wp-look="soft"] .wp-check { border-radius: 6px; }
143
+ html[data-wp-look="soft"] .wp-page__title { font-size: 22px; font-weight: 700; }
144
+
145
+ /* ================= Terminal: mono, zero radius, dashed ================= */
146
+ html[data-wp-look="terminal"] {
147
+ --wp-font: var(--wp-font-mono);
148
+ --wp-radius-sm: 0px;
149
+ --wp-radius: 0px;
150
+ --wp-radius-lg: 0px;
151
+ --wp-radius-xl: 0px;
152
+ }
153
+ html[data-wp-look="terminal"] body { font-size: 12.5px; }
154
+ html[data-wp-look="terminal"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg, .wp-nav, .wp-chip, .wp-check, .wp-segmented, .wp-segmented__opt, .wp-topbar__icon-btn, .wp-nav__count) { border-radius: 0; }
155
+ html[data-wp-look="terminal"] :is(.wp-card, .wp-table-wrap, .wp-input-group--readonly) { border-style: dashed; border-color: var(--wp-border-strong); }
156
+ html[data-wp-look="terminal"] .wp-card__header { border-bottom-style: dashed; }
157
+ html[data-wp-look="terminal"] .wp-table tbody tr:not(:last-child) td { border-bottom-style: dashed; }
158
+ html[data-wp-look="terminal"] .wp-topbar { border-bottom-style: dashed; }
159
+ html[data-wp-look="terminal"] .wp-sidebar { border-right-style: dashed; }
160
+ html[data-wp-look="terminal"] .wp-btn--primary {
161
+ background: color-mix(in oklab, var(--wp-accent-500) 14%, transparent);
162
+ border-color: var(--wp-accent-text);
163
+ color: var(--wp-accent-text);
164
+ }
165
+ html[data-wp-look="terminal"] .wp-btn--primary:hover {
166
+ background: color-mix(in oklab, var(--wp-accent-500) 24%, transparent);
167
+ border-color: var(--wp-accent-text-strong);
168
+ }
169
+ html[data-wp-look="terminal"] .wp-btn--secondary { background: transparent; border-color: var(--wp-border-strong); }
170
+ html[data-wp-look="terminal"] .wp-chip { background: transparent; }
171
+ html[data-wp-look="terminal"] .wp-nav[data-active] {
172
+ background: transparent;
173
+ border-color: transparent;
174
+ color: var(--wp-accent-text);
175
+ font-weight: 600;
176
+ }
177
+ html[data-wp-look="terminal"] .wp-nav[data-active]::before {
178
+ content: ">";
179
+ width: auto;
180
+ top: 50%;
181
+ bottom: auto;
182
+ left: 0;
183
+ transform: translateY(-50%);
184
+ background: none;
185
+ color: var(--wp-accent-text);
186
+ font-weight: 700;
187
+ }
188
+ html[data-wp-look="terminal"] .wp-sidebar__section { text-transform: none; letter-spacing: 0; }
189
+ html[data-wp-look="terminal"] .wp-sidebar__section::before { content: "# "; }
190
+ html[data-wp-look="terminal"] .wp-settings__section-link[data-active="true"] { background: transparent; }
191
+ html[data-wp-look="terminal"] .wp-settings__section-link[data-active="true"]::before { content: ">"; margin-right: -4px; font-weight: 700; }
192
+ html[data-wp-look="terminal"] .wp-segmented { border-color: transparent; background: transparent; gap: 4px; }
193
+ html[data-wp-look="terminal"] .wp-segmented__opt[data-active="true"] {
194
+ background: transparent;
195
+ box-shadow: inset 0 0 0 1px var(--wp-accent-text);
196
+ color: var(--wp-accent-text);
197
+ }
198
+ html[data-wp-look="terminal"] .wp-tabset__tab[data-active="true"] { border-bottom-style: dashed; }
199
+ /* A switch that is on reads like the outlined primary button: a tinted
200
+ track ruled in accent text, not a solid fill. The knob squares with the
201
+ track through --wp-radius-cap. */
202
+ html[data-wp-look="terminal"] .wp-switch[aria-checked="true"] .wp-switch__track {
203
+ background: color-mix(in oklab, var(--wp-accent-500) 14%, transparent);
204
+ border-color: var(--wp-accent-text);
205
+ }
206
+ html[data-wp-look="terminal"] .wp-switch[aria-checked="true"] .wp-switch__knob { background: var(--wp-accent-text); }
207
+ html[data-wp-look="terminal"] .wp-page__title { font-size: 17px; font-weight: 600; letter-spacing: 0; }
208
+
209
+ /* ================= Editorial: serif headings, open, underlined ================= */
210
+ html[data-wp-look="editorial"] {
211
+ --wp-font-head: "Fraunces", Georgia, "Times New Roman", serif;
212
+ --wp-radius-sm: 4px;
213
+ --wp-radius: 4px;
214
+ --wp-radius-lg: 6px;
215
+ }
216
+ html[data-wp-look="editorial"] .wp-page__title { font-size: 28px; line-height: 1.2; font-weight: 500; letter-spacing: -0.01em; }
217
+ html[data-wp-look="editorial"] .wp-card__title { font-size: 16px; font-weight: 500; letter-spacing: 0; }
218
+ html[data-wp-look="editorial"] .wp-content { padding-inline: 36px; --wp-content-px: 36px; }
219
+ html[data-wp-look="editorial"] :is(.wp-topbar, .wp-sidebar) { background: var(--wp-bg); }
220
+ html[data-wp-look="editorial"] .wp-card {
221
+ background: transparent;
222
+ border: 0;
223
+ border-top: 1px solid var(--wp-text);
224
+ border-radius: 0;
225
+ }
226
+ html[data-wp-look="editorial"] .wp-card__header { padding-inline: 0; }
227
+ html[data-wp-look="editorial"] .wp-card__body { padding-inline: 0; }
228
+ html[data-wp-look="editorial"] .wp-table-wrap { background: transparent; border: 0; border-radius: 0; }
229
+ html[data-wp-look="editorial"] .wp-table thead th {
230
+ background: transparent;
231
+ border-bottom-color: var(--wp-text);
232
+ text-transform: none;
233
+ letter-spacing: 0;
234
+ font-size: 12px;
235
+ }
236
+ html[data-wp-look="editorial"] .wp-nav[data-active] { background: transparent; border-color: transparent; font-weight: 600; }
237
+ html[data-wp-look="editorial"] .wp-nav[data-active]::before { display: none; }
238
+ html[data-wp-look="editorial"] .wp-settings__section-link[data-active="true"] {
239
+ background: transparent;
240
+ color: var(--wp-text);
241
+ text-decoration: underline;
242
+ text-decoration-color: var(--wp-accent-500);
243
+ text-decoration-thickness: 2px;
244
+ text-underline-offset: 5px;
245
+ }
246
+ html[data-wp-look="editorial"] .wp-nav[data-active] .wp-nav__label {
247
+ text-decoration: underline;
248
+ text-decoration-color: var(--wp-accent-500);
249
+ text-decoration-thickness: 2px;
250
+ text-underline-offset: 5px;
251
+ }
252
+ html[data-wp-look="editorial"] .wp-btn--secondary { background: transparent; border-color: transparent; text-decoration: underline; text-underline-offset: 3px; }
253
+ html[data-wp-look="editorial"] .wp-btn--secondary:hover { background: var(--wp-bg-3); }
254
+ html[data-wp-look="editorial"] .wp-segmented { background: transparent; border: 0; border-radius: 0; gap: 14px; padding-inline: 0; box-shadow: inset 0 -1px 0 var(--wp-border); }
255
+ html[data-wp-look="editorial"] .wp-segmented__opt { padding-inline: 0; border-radius: 0; }
256
+ html[data-wp-look="editorial"] .wp-segmented__opt:hover:not(:disabled) { background: transparent; }
257
+ html[data-wp-look="editorial"] .wp-segmented__opt[data-active="true"] {
258
+ background: transparent;
259
+ box-shadow: inset 0 -2px 0 var(--wp-accent-500);
260
+ }
261
+ html[data-wp-look="editorial"] .wp-sidebar__section { text-transform: none; letter-spacing: 0; font-size: 11px; font-style: italic; }
262
+
263
+ /* ================= Compact: tight rows, small type ================= */
264
+ html[data-wp-look="compact"] {
265
+ --wp-radius-sm: 3px;
266
+ --wp-radius: 4px;
267
+ --wp-radius-lg: 5px;
268
+ --wp-radius-xl: 6px;
269
+ --wp-control-h-md-base: 28px;
270
+ --wp-control-h-lg-base: 32px;
271
+ --wp-topbar-h: 40px;
272
+ }
273
+ html[data-wp-look="compact"] body { font-size: 12.5px; }
274
+ html[data-wp-look="compact"] :is(.wp-btn, .wp-nav, .wp-topbar__icon-btn) { border-radius: 4px; }
275
+ html[data-wp-look="compact"] .wp-btn { font-size: 12px; padding-inline: 10px; }
276
+ html[data-wp-look="compact"] .wp-btn--icon { padding-inline: 0; }
277
+ html[data-wp-look="compact"] .wp-nav { padding: 5px 8px; font-size: 12.5px; }
278
+ html[data-wp-look="compact"] .wp-content { padding: 12px 16px 28px; --wp-content-px: 16px; }
279
+ html[data-wp-look="compact"] .wp-page__title { font-size: 16px; }
280
+ html[data-wp-look="compact"] .wp-card__header { padding: 8px 10px; }
281
+ html[data-wp-look="compact"] .wp-card__body { padding: 10px; }
282
+ html[data-wp-look="compact"] .wp-table thead th { padding: 6px 10px; }
283
+ html[data-wp-look="compact"] .wp-table tbody td { padding: 5px 10px; font-size: 12px; }
284
+ html[data-wp-look="compact"] .wp-table tbody tr:nth-child(even) td { background: var(--wp-bg-2); }
285
+ html[data-wp-look="compact"] .wp-table tbody tr:hover td { background: var(--wp-bg-3); }
286
+
287
+ /* ================= TUI: boxed panels, inverse selection, [x] ================= */
288
+ html[data-wp-look="tui"] {
289
+ --wp-font: var(--wp-font-mono);
290
+ --wp-radius-sm: 0px;
291
+ --wp-radius: 0px;
292
+ --wp-radius-lg: 0px;
293
+ --wp-radius-xl: 0px;
294
+ --wp-topbar-h: 40px;
295
+ }
296
+ html[data-wp-look="tui"] body { font-size: 12.5px; }
297
+ html[data-wp-look="tui"] :is(.wp-btn, .wp-btn--sm, .wp-btn--lg, .wp-nav, .wp-chip, .wp-segmented, .wp-segmented__opt, .wp-topbar__icon-btn, .wp-nav__count, .wp-tabset__tab) { border-radius: 0; }
298
+ html[data-wp-look="tui"] .wp-topbar { background: var(--wp-bg-3); border-bottom-color: var(--wp-border-strong); }
299
+ html[data-wp-look="tui"] .wp-sidebar {
300
+ margin: 8px 0 8px 8px;
301
+ border: 1px solid var(--wp-border-strong);
302
+ background: transparent;
303
+ }
304
+ html[data-wp-look="tui"] :is(.wp-card, .wp-table-wrap) { border-color: var(--wp-border-strong); background: transparent; }
305
+ html[data-wp-look="tui"] .wp-card__header { background: var(--wp-bg-3); border-bottom-color: var(--wp-border-strong); padding-block: 6px; }
306
+ html[data-wp-look="tui"] .wp-card__title { color: var(--wp-accent-text); font-weight: 700; }
307
+ html[data-wp-look="tui"] .wp-table thead th { background: var(--wp-bg-3); border-bottom-color: var(--wp-border-strong); text-transform: none; letter-spacing: 0; }
308
+ html[data-wp-look="tui"] .wp-table tbody td { border-bottom: 0; padding-block: 5px; }
309
+ html[data-wp-look="tui"] .wp-table tbody tr:hover td { background: var(--wp-bg-3); }
310
+ html[data-wp-look="tui"] .wp-nav { padding-block: 4px; }
311
+ html[data-wp-look="tui"] .wp-nav[data-active],
312
+ html[data-wp-look="tui"] .wp-segmented__opt[data-active="true"],
313
+ html[data-wp-look="tui"] .wp-tabset__tab[data-active="true"],
314
+ html[data-wp-look="tui"] .wp-settings__section-link[data-active="true"],
315
+ html[data-wp-look="tui"] .wp-trr__row[data-active="true"],
316
+ html[data-wp-look="tui"] .wp-pack__steps li[data-on] {
317
+ background: var(--wp-accent-600);
318
+ border-color: transparent;
319
+ box-shadow: none;
320
+ color: #fff; /* audit-exempt: white on accent-600, 4.5:1+ in every theme */
321
+ }
322
+ html[data-wp-look="tui"] :is(.wp-nav[data-active], .wp-segmented__opt[data-active="true"], .wp-tabset__tab[data-active="true"], .wp-settings__section-link[data-active="true"], .wp-trr__row[data-active="true"], .wp-pack__steps li[data-on]) :is(.pi, *) { color: inherit; }
323
+ html[data-wp-look="tui"] .wp-nav[data-active]::before { display: none; }
324
+ /* A count on an inverse tab or nav row reads on the accent fill, not as an
325
+ accent chip on it (3:1 before). */
326
+ html[data-wp-look="tui"] :is(.wp-tabset__tab[data-active="true"] .wp-tabset__count, .wp-nav[data-active] .wp-nav__count) {
327
+ background: color-mix(in oklab, #fff 18%, transparent); /* audit-exempt: lightens the accent fill under white text */
328
+ color: inherit;
329
+ }
330
+ html[data-wp-look="tui"] .wp-sidebar__section { text-transform: none; letter-spacing: 0; color: var(--wp-accent-text); }
331
+ html[data-wp-look="tui"] .wp-segmented { border-color: transparent; background: transparent; gap: 6px; }
332
+ html[data-wp-look="tui"] .wp-tabset__tab { padding-inline: 8px; }
333
+ /* Buttons read [ Save ]; an icon-only or link button stays as it is. */
334
+ html[data-wp-look="tui"] .wp-btn { border-color: transparent; }
335
+ html[data-wp-look="tui"] .wp-btn--secondary { background: transparent; }
336
+ html[data-wp-look="tui"] .wp-btn--secondary:hover { background: var(--wp-bg-3); }
337
+ html[data-wp-look="tui"] .wp-btn:not(.wp-btn--icon, .wp-btn--link) .wp-btn__label::before { content: "[ "; }
338
+ html[data-wp-look="tui"] .wp-btn:not(.wp-btn--icon, .wp-btn--link) .wp-btn__label::after { content: " ]"; }
339
+ html[data-wp-look="tui"] :is(.wp-input, .wp-select, .wp-textarea, .wp-input-group, .wp-cselect__field) {
340
+ border-color: var(--wp-border-strong);
341
+ background: var(--wp-bg);
342
+ }
343
+ html[data-wp-look="tui"] .wp-input-group .wp-input { background: transparent; }
344
+ /* Checkboxes read [ ] / [x]; the drawn tick hides. */
345
+ html[data-wp-look="tui"] .wp-check {
346
+ width: auto;
347
+ min-width: 3ch;
348
+ border: 0;
349
+ border-radius: 0;
350
+ background: transparent;
351
+ color: var(--wp-text-muted);
352
+ font-family: var(--wp-font-mono);
353
+ font-size: 12px;
354
+ line-height: 1;
355
+ }
356
+ /* State comes from aria-checked or, on a decorative box (aria-hidden, no
357
+ role), data-checked / data-indeterminate. Nothing may set an inline
358
+ display on the tick: it would beat this rule and draw both marks. */
359
+ html[data-wp-look="tui"] .wp-check svg { display: none; }
360
+ html[data-wp-look="tui"] .wp-check::before { content: "[ ]"; }
361
+ html[data-wp-look="tui"] .wp-check:is([aria-checked="true"], [data-checked="true"])::before { content: "[x]"; color: var(--wp-accent-text); }
362
+ html[data-wp-look="tui"] .wp-check:is([aria-checked="mixed"], [data-indeterminate="true"]):not([data-checked="true"])::before { content: "[-]"; color: var(--wp-accent-text); }
363
+ html[data-wp-look="tui"] .wp-page__title { font-size: 16px; font-weight: 700; letter-spacing: 0; }
364
+ /* Radios read ( ) / (*) beside the [ ] / [x] checkboxes; the drawn dot
365
+ hides. RadioGroup marks the picked option on the row (data-checked), the
366
+ plain .wp-radio is a real input (:checked). */
367
+ html[data-wp-look="tui"] .wp-radio-group__opt .wp-radio-group__dot,
368
+ html[data-wp-look="tui"] .wp-radio {
369
+ width: auto;
370
+ min-width: 3ch;
371
+ height: auto;
372
+ border: 0;
373
+ border-radius: 0;
374
+ background: transparent;
375
+ color: var(--wp-text-muted);
376
+ font-family: var(--wp-font-mono);
377
+ font-size: 12px;
378
+ line-height: 16px;
379
+ }
380
+ html[data-wp-look="tui"] .wp-radio-group__opt[data-checked] .wp-radio-group__dot::after { display: none; }
381
+ html[data-wp-look="tui"] .wp-radio-group__dot::before { content: "( )"; }
382
+ html[data-wp-look="tui"] .wp-radio-group__opt[data-checked] .wp-radio-group__dot::before { content: "(*)"; color: var(--wp-accent-text); }
383
+ html[data-wp-look="tui"] .wp-radio-group__opt[aria-disabled="true"][data-checked] .wp-radio-group__dot::before { color: var(--wp-text-dim); }
384
+ html[data-wp-look="tui"] .wp-radio::before,
385
+ html[data-wp-look="tui"] .wp-radio:disabled::before {
386
+ content: "( )";
387
+ width: auto;
388
+ height: auto;
389
+ border-radius: 0;
390
+ background: transparent;
391
+ transform: none;
392
+ }
393
+ html[data-wp-look="tui"] .wp-radio:checked::before { content: "(*)"; color: var(--wp-accent-text); }
394
+ html[data-wp-look="tui"] .wp-radio:disabled:checked::before { content: "(*)"; color: var(--wp-text-dim); }
395
+ html[data-wp-look="tui"] .wp-radio:checked,
396
+ html[data-wp-look="tui"] .wp-radio:disabled:checked { background: transparent; }
397
+
398
+ /* ================= Canvas previews ignore the look =================
399
+ The canvas keeps ComfyUI's ground in every look (only the accent follows
400
+ the manager), so the Settings › Canvas live preview draws canvas pieces
401
+ with the canvas's own corners and type, not the manager look's. */
402
+ html.wp-manager .wp-pg-mockup {
403
+ --wp-radius-cap: 999px;
404
+ --wp-radius-sm: 6px;
405
+ --wp-radius: 8px;
406
+ --wp-radius-lg: 12px;
407
+ --wp-radius-xl: 16px;
408
+ --wp-font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
409
+ font-family: var(--wp-font);
410
+ }
411
+
412
+ /* ---------- PostCard in each look ----------
413
+ * The card draws its own box (src/PostCard.vue), so the looks restyle it like
414
+ * a .wp-card: firmer, softer, dashed, ruled, tighter or boxed. */
415
+ html[data-wp-look="crisp"] .wp-post-card { border-color: var(--wp-border-strong); }
416
+ html[data-wp-look="soft"] .wp-post-card { border-color: transparent; box-shadow: var(--wp-shadow-md); }
417
+ html[data-wp-look="terminal"] .wp-post-card { border-style: dashed; border-color: var(--wp-border-strong); }
418
+ html[data-wp-look="editorial"] .wp-post-card {
419
+ background: transparent;
420
+ border: 0;
421
+ border-top: 1px solid var(--wp-text);
422
+ border-radius: 0;
423
+ }
424
+ html[data-wp-look="editorial"] .wp-post-card:hover { transform: none; box-shadow: none; }
425
+ html[data-wp-look="editorial"] .wp-post-card__slug { font-family: var(--wp-font-head, var(--wp-font)); font-size: 16px; }
426
+ html[data-wp-look="compact"] .wp-post-card { padding: 12px 14px; gap: 8px; }
427
+ html[data-wp-look="tui"] .wp-post-card { border-color: var(--wp-border-strong); background: transparent; }
428
+ html[data-wp-look="tui"] .wp-post-card:hover { transform: none; box-shadow: none; background: var(--wp-bg-2); }