@dumiflex/wp-kit 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +5 -0
  3. package/package.json +4 -3
  4. package/src/Avatar.vue +1 -1
  5. package/src/Banner.vue +4 -4
  6. package/src/Button.vue +73 -44
  7. package/src/Checkbox.vue +201 -63
  8. package/src/Chip.vue +5 -2
  9. package/src/CodeBlock.vue +33 -6
  10. package/src/ColorField.vue +60 -6
  11. package/src/Combobox.vue +10 -14
  12. package/src/ConfirmModal.vue +12 -22
  13. package/src/ContextMenu.vue +11 -30
  14. package/src/CopyButton.vue +1 -1
  15. package/src/DataTable.vue +3 -4
  16. package/src/DatePicker.vue +1 -1
  17. package/src/Disclosure.vue +2 -1
  18. package/src/Drawer.vue +2 -2
  19. package/src/DropZone.vue +2 -2
  20. package/src/HsvPicker.vue +2 -2
  21. package/src/IconPicker.vue +1 -1
  22. package/src/ImageGrid.vue +17 -15
  23. package/src/Lightbox.vue +6 -3
  24. package/src/LoadingMark.vue +93 -51
  25. package/src/Modal.vue +109 -44
  26. package/src/ModalShell.vue +26 -5
  27. package/src/Pagination.vue +4 -4
  28. package/src/Popover.vue +68 -12
  29. package/src/RadioGroup.vue +5 -4
  30. package/src/SearchInput.vue +1 -1
  31. package/src/Select.vue +53 -158
  32. package/src/Skeleton.vue +21 -5
  33. package/src/Slider.vue +166 -55
  34. package/src/SortableList.vue +1 -1
  35. package/src/TagInput.vue +1 -1
  36. package/src/Timeline.vue +2 -2
  37. package/src/WorkingLine.vue +320 -0
  38. package/src/WpIconButton.vue +3 -2
  39. package/src/WpImageZoom.vue +7 -7
  40. package/src/WpSegmented.vue +3 -1
  41. package/src/WpSwitch.vue +1 -1
  42. package/src/WpTabs.vue +1 -1
  43. package/src/_modal-motion.css +1 -1
  44. package/src/button.css +8 -6
  45. package/src/floating.ts +5 -0
  46. package/src/highlight.ts +199 -0
  47. package/src/hsv.ts +1 -1
  48. package/src/loading-mark-motion.ts +249 -0
  49. package/src/menu.css +51 -0
  50. package/src/motion.css +73 -0
  51. package/src/slider-math.ts +45 -1
  52. package/src/theme/looks.css +6 -19
  53. package/src/theme/tokens.css +12 -1108
  54. package/src/tokens.ts +8 -3
  55. package/src/tooltip.css +8 -5
  56. package/src/useDialogFocus.ts +11 -2
  57. package/src/CloseButton.vue +0 -69
  58. package/src/ColorPicker.vue +0 -201
  59. package/src/ConfirmDialog.vue +0 -165
  60. package/src/RangeSlider.vue +0 -183
  61. package/src/Toggle.vue +0 -36
  62. package/src/WpButton.vue +0 -75
  63. package/src/WpCheck.vue +0 -104
  64. package/src/_skeleton.css +0 -50
@@ -548,17 +548,7 @@ input, textarea, select { font: inherit; }
548
548
  /* Active-row gradient strip lives in AppSidebar.vue scoped CSS (presence selector). */
549
549
  .wp-nav__icon { width: 16px; flex: 0 0 16px; display: grid; place-items: center; color: inherit; }
550
550
  .wp-nav__label { flex: 1; white-space: nowrap; }
551
- .wp-nav__badge {
552
- font-size: 9.5px;
553
- letter-spacing: 0.04em;
554
- text-transform: uppercase;
555
- padding: 1.5px 6px;
556
- border-radius: var(--wp-radius-cap, 999px);
557
- background: var(--wp-bg-3);
558
- color: var(--wp-text-dim);
559
- border: 1px solid var(--wp-border);
560
- font-weight: 600;
561
- }
551
+
562
552
  .wp-nav__ext { color: var(--wp-text-dim); width: 12px; }
563
553
 
564
554
  /* ---------- Content area ---------- */
@@ -827,7 +817,7 @@ input, textarea, select { font: inherit; }
827
817
  user-select: none;
828
818
  }
829
819
  .wp-input-group__icon { padding-left: 10px; }
830
- .wp-input-group__icon .pi { font-size: 13px; line-height: 1; }
820
+ .wp-input-group__icon .pi { font-size: 14px; line-height: 1; }
831
821
  .wp-input-group__affix { font-family: var(--wp-font-mono); font-size: 12.5px; }
832
822
  .wp-input-group__affix--prefix { padding-left: 10px; }
833
823
  .wp-input-group__affix--suffix { padding-right: 10px; }
@@ -903,7 +893,6 @@ input, textarea, select { font: inherit; }
903
893
  .wp-chip__close:hover { opacity: 1; background: none; }
904
894
  .wp-chip__close:focus-visible { outline: 2px solid var(--wp-accent-500); outline-offset: 1px; border-radius: min(2px, var(--wp-radius-cap, 999px)); opacity: 1; }
905
895
 
906
-
907
896
  /* ---------- DataTable ---------- */
908
897
  .wp-table-wrap {
909
898
  background: var(--wp-bg-1);
@@ -995,27 +984,6 @@ input, textarea, select { font: inherit; }
995
984
 
996
985
  .wp-row-skel:hover td { background: transparent; }
997
986
  .wp-row-skel td { vertical-align: middle; }
998
- .wp-skel-bar {
999
- display: block;
1000
- height: 10px;
1001
- border-radius: min(5px, var(--wp-radius-cap, 999px));
1002
- background: linear-gradient(
1003
- 90deg,
1004
- var(--wp-bg-3) 0%,
1005
- var(--wp-bg-4) 50%,
1006
- var(--wp-bg-3) 100%
1007
- );
1008
- background-size: 200% 100%;
1009
- animation: wp-skel-pulse 1.4s ease-in-out infinite;
1010
- opacity: 0.55;
1011
- }
1012
- @keyframes wp-skel-pulse {
1013
- 0% { background-position: 100% 50%; }
1014
- 100% { background-position: -100% 50%; }
1015
- }
1016
- @media (prefers-reduced-motion: reduce) {
1017
- .wp-skel-bar { animation: none; }
1018
- }
1019
987
  .wp-table .wp-row-expand {
1020
988
  background: var(--wp-bg-2);
1021
989
  padding: 12px 16px 14px 56px;
@@ -1031,25 +999,9 @@ input, textarea, select { font: inherit; }
1031
999
  }
1032
1000
 
1033
1001
  /* ---------- List-row chrome (used by all 6 list screens) ---------- */
1034
- .wp-tag-chip {
1035
- font-size: 10px;
1036
- padding: 2px 8px;
1037
- background: var(--wp-bg-3);
1038
- color: var(--wp-text-muted);
1039
- border-radius: var(--wp-radius-cap, 999px);
1040
- letter-spacing: 0.02em;
1041
- transition: background-color 0.12s ease, border-color 0.12s ease, color 0.12s ease;
1042
- }
1043
- .wp-tag-chip:hover { background: var(--wp-bg-4); color: var(--wp-text); }
1002
+
1044
1003
  /* Active state defined globally so scoped view files can use color-mix and this
1045
1004
  serves as the rgba fallback when color-mix is unsupported (old Chromium). */
1046
- .wp-tag-chip[data-active="true"] {
1047
- background: rgba(99, 102, 241, 0.22);
1048
- background: color-mix(in oklab, var(--wp-accent-500) 22%, transparent);
1049
- border-color: rgba(99, 102, 241, 0.45);
1050
- border-color: color-mix(in oklab, var(--wp-accent-500) 45%, transparent);
1051
- color: var(--wp-accent-text);
1052
- }
1053
1005
 
1054
1006
  .wp-id {
1055
1007
  font-family: var(--wp-font-mono);
@@ -1060,11 +1012,6 @@ input, textarea, select { font: inherit; }
1060
1012
  }
1061
1013
  .wp-id:hover { color: var(--wp-text-muted); }
1062
1014
 
1063
- .wp-fav-toggle {
1064
- display: flex; align-items: center; gap: 8px;
1065
- font-size: 13px; color: var(--wp-text); cursor: pointer;
1066
- }
1067
-
1068
1015
  .wp-row-name {
1069
1016
  display: flex; flex-direction: column; gap: 1px;
1070
1017
  }
@@ -1147,40 +1094,6 @@ input, textarea, select { font: inherit; }
1147
1094
  border-color: color-mix(in oklab, var(--wp-kind-derivation) 32%, transparent);
1148
1095
  }
1149
1096
 
1150
- /* Syntax-color tint for filter-panel toggle chips. Lets the
1151
- * Wildcards filter pills (Uses nested refs / Has inline / Referenced
1152
- * by others) match the colored pills in the body's Syntax column —
1153
- * users learn one color set for both surfaces. Same hue tokens as
1154
- * `.wp-syntax-pill--*` above; tint depth tuned for the chip shape
1155
- * (border-only at rest, full fill when active). */
1156
- .wp-chip--toggle.wp-chip--syntax-ref {
1157
- border-color: color-mix(in oklab, var(--wp-kind-ref) 35%, transparent);
1158
- color: var(--wp-kind-ref);
1159
- }
1160
- .wp-chip--toggle.wp-chip--syntax-ref[data-active] {
1161
- background: color-mix(in oklab, var(--wp-kind-ref) 22%, transparent);
1162
- border-color: color-mix(in oklab, var(--wp-kind-ref) 45%, transparent);
1163
- color: var(--wp-kind-ref);
1164
- }
1165
- .wp-chip--toggle.wp-chip--syntax-in {
1166
- border-color: color-mix(in oklab, var(--wp-accent-500) 35%, transparent);
1167
- color: var(--wp-accent-text);
1168
- }
1169
- .wp-chip--toggle.wp-chip--syntax-in[data-active] {
1170
- background: color-mix(in oklab, var(--wp-accent-500) 22%, transparent);
1171
- border-color: color-mix(in oklab, var(--wp-accent-500) 45%, transparent);
1172
- color: var(--wp-accent-text);
1173
- }
1174
- .wp-chip--toggle.wp-chip--syntax-dp {
1175
- border-color: color-mix(in oklab, var(--wp-kind-derivation) 35%, transparent);
1176
- color: var(--wp-kind-derivation);
1177
- }
1178
- .wp-chip--toggle.wp-chip--syntax-dp[data-active] {
1179
- background: color-mix(in oklab, var(--wp-kind-derivation) 22%, transparent);
1180
- border-color: color-mix(in oklab, var(--wp-kind-derivation) 45%, transparent);
1181
- color: var(--wp-kind-derivation);
1182
- }
1183
-
1184
1097
  /* Light-mode pill overrides — token cascade handles color; adjust tint depth for near-white surface */
1185
1098
  .wp-theme-light .wp-syntax-pill--ref {
1186
1099
  /* --wp-kind-ref → fuchsia-800 (#86198f) in light; --wp-kind-ref-bg → 13% tint */
@@ -1200,9 +1113,7 @@ input, textarea, select { font: inherit; }
1200
1113
  border-color: color-mix(in oklab, var(--wp-kind-derivation) 45%, transparent);
1201
1114
  }
1202
1115
 
1203
- /* ── Light-mode overrides: buttons, chips, tags, links ── */
1204
- /* Danger button hover: white text fails on light tint; swap to dark-red label */
1205
-
1116
+ /* ── Light-mode overrides: chips ── */
1206
1117
  /* Tone chips: swap light text for dark text, slightly stronger tint.
1207
1118
  * Colors route through status tokens which flip to -700/-800 shades in light mode. */
1208
1119
  .wp-theme-light .wp-chip--accent {
@@ -1214,69 +1125,6 @@ input, textarea, select { font: inherit; }
1214
1125
  .wp-theme-light .wp-chip--warn { color: var(--wp-warn); background: color-mix(in oklab, var(--wp-warn) 14%, transparent); border-color: color-mix(in oklab, var(--wp-warn) 42%, transparent); }
1215
1126
  .wp-theme-light .wp-chip--danger { color: var(--wp-danger); background: color-mix(in oklab, var(--wp-danger) 14%, transparent); border-color: color-mix(in oklab, var(--wp-danger) 42%, transparent); }
1216
1127
  .wp-theme-light .wp-chip--info { color: var(--wp-info); background: color-mix(in oklab, var(--wp-info) 14%, transparent); border-color: color-mix(in oklab, var(--wp-info) 42%, transparent); }
1217
- /* Tag chip active: color auto-adapts (--wp-accent-text → dark purple in light mode) */
1218
- .wp-theme-light .wp-tag-chip[data-active="true"] {
1219
- background: rgba(99, 102, 241, 0.16);
1220
- border-color: rgba(99, 102, 241, 0.42);
1221
- }
1222
- /* Missing wildcard ref link: --wp-danger flips to red-700 in light */
1223
- .wp-theme-light .wp-syntax-link--missing,
1224
- .wp-theme-light .wp-syntax-link--missing:hover {
1225
- color: var(--wp-danger);
1226
- border-color: color-mix(in oklab, var(--wp-danger) 42%, transparent);
1227
- background: color-mix(in oklab, var(--wp-danger) 12%, transparent);
1228
- }
1229
-
1230
- /* Reference graph block inside row-expand */
1231
- .wp-syntax-graph {
1232
- margin-top: 12px;
1233
- padding-top: 10px;
1234
- border-top: 1px dashed var(--wp-border);
1235
- display: flex;
1236
- flex-direction: column;
1237
- gap: 6px;
1238
- font-size: 12px;
1239
- }
1240
- .wp-syntax-graph__row {
1241
- display: flex;
1242
- flex-wrap: wrap;
1243
- align-items: center;
1244
- gap: 6px;
1245
- }
1246
- .wp-syntax-graph__row .pi { font-size: 11px; opacity: 0.7; }
1247
- .wp-syntax-link {
1248
- appearance: none;
1249
- background: var(--wp-bg-3);
1250
- border: 1px solid var(--wp-border);
1251
- color: var(--wp-text-dim);
1252
- font: inherit;
1253
- padding: 1px 8px;
1254
- border-radius: var(--wp-radius-cap, 999px);
1255
- cursor: pointer;
1256
- transition: color 120ms, background 120ms, border-color 120ms;
1257
- }
1258
- .wp-syntax-link:hover {
1259
- color: var(--wp-accent-text);
1260
- border-color: rgba(99, 102, 241, 0.45);
1261
- border-color: color-mix(in oklab, var(--wp-accent-500) 45%, transparent);
1262
- background: rgba(99, 102, 241, 0.12);
1263
- background: color-mix(in oklab, var(--wp-accent-500) 12%, var(--wp-bg-3));
1264
- }
1265
- .wp-syntax-link--missing {
1266
- /* audit-exempt: red-400 (#f87171) is lighter than --wp-danger for dark-bg legibility;
1267
- * light-mode override above uses var(--wp-danger) which flips to red-700. */
1268
- color: #f87171;
1269
- border-color: color-mix(in oklab, #f87171 38%, transparent);
1270
- background: color-mix(in oklab, #f87171 14%, transparent);
1271
- font-family: var(--wp-font-mono);
1272
- cursor: default;
1273
- }
1274
- .wp-syntax-link--missing:hover {
1275
- color: #f87171; /* audit-exempt: see above */
1276
- border-color: color-mix(in oklab, #f87171 38%, transparent);
1277
- background: color-mix(in oklab, #f87171 14%, transparent);
1278
- }
1279
-
1280
1128
  .wp-id {
1281
1129
  font-family: var(--wp-font-mono);
1282
1130
  font-size: 10.5px;
@@ -1285,11 +1133,7 @@ input, textarea, select { font: inherit; }
1285
1133
  }
1286
1134
 
1287
1135
  /* ---------- Toolbar ---------- */
1288
- .wp-toolbar {
1289
- display: flex; align-items: center; gap: 8px;
1290
- flex-wrap: wrap;
1291
- }
1292
- .wp-toolbar__search { flex: 1; min-width: 220px; max-width: 320px; }
1136
+
1293
1137
  .wp-toolbar__count { font-size: 11.5px; color: var(--wp-text-dim); margin-left: auto; }
1294
1138
 
1295
1139
  /* ---------- Pagination ---------- */
@@ -1316,119 +1160,6 @@ input, textarea, select { font: inherit; }
1316
1160
  text-align: center;
1317
1161
  }
1318
1162
 
1319
- /* ---------- Rule card (Derivation editor) ---------- */
1320
- .wp-rule {
1321
- background: var(--wp-bg-2);
1322
- border: 1px solid var(--wp-border);
1323
- border-radius: var(--wp-radius-md);
1324
- padding: 10px 12px;
1325
- display: flex; flex-direction: column; gap: 8px;
1326
- }
1327
- .wp-rule__head {
1328
- display: flex; align-items: center; gap: 8px;
1329
- }
1330
- .wp-rule__num {
1331
- font-family: var(--wp-font-mono);
1332
- font-size: 10.5px;
1333
- font-weight: 600;
1334
- letter-spacing: 0.05em;
1335
- padding: 2px 8px;
1336
- border-radius: min(4px, var(--wp-radius-cap, 999px));
1337
- background: color-mix(in oklab, var(--wp-accent-500) 18%, transparent);
1338
- color: var(--wp-accent-text);
1339
- }
1340
- .wp-rule__index { font-size: 11px; color: var(--wp-text-dim); font-variant-numeric: tabular-nums; }
1341
- .wp-rule__row {
1342
- display: grid;
1343
- grid-template-columns: 64px 1fr;
1344
- gap: 10px;
1345
- align-items: center;
1346
- }
1347
- .wp-rule__label {
1348
- font-size: 11.5px;
1349
- color: var(--wp-text-muted);
1350
- text-transform: uppercase;
1351
- letter-spacing: 0.04em;
1352
- font-weight: 500;
1353
- }
1354
- .wp-rule__cond {
1355
- display: flex;
1356
- flex-wrap: wrap;
1357
- gap: 8px;
1358
- align-items: center;
1359
- }
1360
- .wp-rule--else {
1361
- margin-top: 12px;
1362
- border-style: dashed;
1363
- background: transparent;
1364
- }
1365
- .wp-rule--else[data-active="true"] {
1366
- background: var(--wp-bg-2);
1367
- border-style: solid;
1368
- }
1369
- .wp-rule--else .wp-rule__num {
1370
- background: color-mix(in oklab, var(--wp-warn) 18%, transparent);
1371
- color: var(--wp-warn);
1372
- }
1373
-
1374
- /* Group rule (independent rule with its own IF/ELIF/ELSE branches) */
1375
- .wp-rule--group {
1376
- border: 1px solid var(--wp-border-strong);
1377
- background: var(--wp-bg-1);
1378
- padding: 12px;
1379
- }
1380
- .wp-rule--group .wp-rule__num {
1381
- background: color-mix(in oklab, var(--wp-accent-500) 24%, transparent);
1382
- }
1383
- .wp-rule__branches {
1384
- display: flex;
1385
- flex-direction: column;
1386
- gap: 8px;
1387
- margin-top: 4px;
1388
- padding-left: 10px;
1389
- border-left: 2px solid color-mix(in oklab, var(--wp-accent-500) 30%, transparent);
1390
- }
1391
- .wp-branch {
1392
- background: var(--wp-bg-2);
1393
- border: 1px solid var(--wp-border);
1394
- border-radius: min(8px, var(--wp-radius-cap, 999px));
1395
- padding: 10px 12px;
1396
- display: flex; flex-direction: column; gap: 8px;
1397
- }
1398
- .wp-branch__head {
1399
- display: flex; align-items: center; gap: 8px;
1400
- }
1401
- .wp-branch__tag {
1402
- font-family: var(--wp-font-mono);
1403
- font-size: 10px;
1404
- font-weight: 700;
1405
- letter-spacing: 0.06em;
1406
- padding: 2px 7px;
1407
- border-radius: min(4px, var(--wp-radius-cap, 999px));
1408
- text-transform: uppercase;
1409
- }
1410
- .wp-branch__tag[data-kind="if"] {
1411
- background: color-mix(in oklab, var(--wp-accent-500) 22%, transparent);
1412
- color: var(--wp-accent-text);
1413
- }
1414
- .wp-branch__tag[data-kind="elif"] {
1415
- background: color-mix(in oklab, var(--wp-info, #60a5fa) 22%, transparent);
1416
- color: var(--wp-info, #60a5fa);
1417
- }
1418
- .wp-branch__tag[data-kind="else"] {
1419
- background: color-mix(in oklab, var(--wp-warn) 22%, transparent);
1420
- color: var(--wp-warn);
1421
- }
1422
- .wp-branch--else {
1423
- border-style: dashed;
1424
- }
1425
- .wp-rule__addbar {
1426
- display: flex;
1427
- gap: 6px;
1428
- margin-top: 8px;
1429
- padding-left: 12px;
1430
- }
1431
-
1432
1163
  /* ---------- Hero ----------
1433
1164
  * A page header with the logo or an icon. Plain surface: Orbit has no
1434
1165
  * decorative gradients. */
@@ -1502,29 +1233,6 @@ input, textarea, select { font: inherit; }
1502
1233
  .wp-list__row:hover { background: var(--wp-bg-3); }
1503
1234
  .wp-list__row + .wp-list__row { border-top: 1px solid var(--wp-border); border-radius: 0; }
1504
1235
 
1505
- /* ---------- Empty state ---------- */
1506
- .wp-empty {
1507
- display: flex; flex-direction: column; align-items: center; justify-content: center;
1508
- text-align: center;
1509
- padding: 48px 24px;
1510
- color: var(--wp-text-muted);
1511
- gap: 10px;
1512
- }
1513
- .wp-empty__icon {
1514
- width: 56px; height: 56px;
1515
- border-radius: min(14px, var(--wp-radius-cap, 999px));
1516
- background: var(--wp-bg-2);
1517
- border: 1px solid var(--wp-border);
1518
- display: grid; place-items: center;
1519
- color: var(--wp-text-dim);
1520
- font-size: 22px;
1521
- }
1522
-
1523
- /* `.wp-empty--card` (full-width dashed empty state) lived alongside the
1524
- community sub-screens. It moved to the feat/community-tab branch with
1525
- them; main has no remaining consumer. Re-introduce here when another
1526
- surface needs it. */
1527
-
1528
1236
  /* Compact dashed-card empty placeholder used inside editor cards
1529
1237
  (DerivationEditor rules list, ConstraintEditor matrix/exceptions,
1530
1238
  PipelineSteps step list). Single-line muted text in a softly-bordered box. */
@@ -1564,6 +1272,11 @@ input, textarea, select { font: inherit; }
1564
1272
  * every list page that imports Button.vue can wear the modifier
1565
1273
  * class without crossing :deep() boundaries. */
1566
1274
  .wp-refresh-btn--spin .pi-refresh {
1275
+ /* The arrow's circle is not the middle of its em box: PrimeIcons draws it
1276
+ * centred at (512, 360) on a 1024 grid whose box runs 960 → -64, so its
1277
+ * centre sits 58.56% down. Turning on the box centre made it wobble. */
1278
+ line-height: 1;
1279
+ transform-origin: 50% 58.56%;
1567
1280
  animation: wp-refresh-spin 0.9s linear infinite;
1568
1281
  }
1569
1282
  @keyframes wp-refresh-spin {
@@ -1592,145 +1305,6 @@ input, textarea, select { font: inherit; }
1592
1305
  display: contents;
1593
1306
  }
1594
1307
 
1595
- /* ---------- Toggle ----------
1596
- Toggle.vue wraps the shared WpSwitch; its look lives in
1597
- kit/WpSwitch.vue (one sheet for canvas + manager). */
1598
-
1599
- /* ---------- Checkbox ----------
1600
- Canonical geometry matches the wildcard pool's per-option box
1601
- (`.opt__check` in OptionRow.vue: 14px, 1.5px soft border, 3px radius, sunk
1602
- into `--wp-bg`). This is THE checkbox look for the whole app; the only
1603
- opt-outs are the custom toggle BUTTONS (internal flag, seed-lock).
1604
-
1605
- Markup-agnostic on purpose: works for both the shared ui/Checkbox.vue
1606
- `<button data-checked>` and bare `<span role="checkbox" aria-checked>`
1607
- used inline in the size-sensitive embed tree (which avoids importing the
1608
- component to stay within the bundle budget). On-state fill stays at
1609
- accent-600 for the white-tick contrast audit. */
1610
- .wp-check {
1611
- width: 14px; height: 14px;
1612
- /* A visible edge on the empty box: the hairline border tokens vanished on
1613
- * a dark row, so nobody saw that list rows can be selected. */
1614
- border: 1.5px solid color-mix(in srgb, var(--wp-text-dim) 70%, transparent);
1615
- border-radius: min(3px, var(--wp-radius-cap, 999px));
1616
- background: var(--wp-bg);
1617
- display: inline-flex; align-items: center; justify-content: center;
1618
- padding: 0; margin: 0;
1619
- cursor: pointer;
1620
- flex-shrink: 0;
1621
- color: transparent;
1622
- transition: background .12s, border-color .12s, color .12s;
1623
- line-height: 0;
1624
- }
1625
- .wp-check[data-checked="true"],
1626
- .wp-check[aria-checked="true"] {
1627
- background: var(--wp-accent-600);
1628
- border-color: var(--wp-accent-500);
1629
- color: #fff; /* audit-exempt: white checkmark on accent-600 background ≥4.5:1 both themes */
1630
- }
1631
- /* Indeterminate (tri-state) — must look visually distinct from an empty box.
1632
- The base .wp-check sets color: transparent, so the dash SVG (stroke="currentColor")
1633
- would be invisible without flipping color here. Mirrors the checked-state fill so
1634
- a section-checkbox with a partial selection is unmistakably "some, not none, not all".
1635
- Visibility contract: see src/manager/components/ui/Checkbox.vue (indeterminate prop)
1636
- and src/manager/__tests__/ui/Checkbox.test.ts (data-indeterminate assertions). */
1637
- .wp-check[data-indeterminate="true"] {
1638
- background: var(--wp-accent-600);
1639
- border-color: var(--wp-accent-500);
1640
- color: #fff; /* audit-exempt: white dash on accent-600 background ≥4.5:1 both themes */
1641
- }
1642
- .wp-check svg { width: 9px; height: 9px; display: block; pointer-events: none; }
1643
- .wp-check:not(:disabled, [aria-disabled="true"], [data-checked="true"], [aria-checked="true"], [data-indeterminate="true"]):hover {
1644
- border-color: var(--wp-accent-500);
1645
- }
1646
- /* Disabled: grey, not dim purple, so a ticked disabled box no longer reads
1647
- * as a live one in dark mode. */
1648
- .wp-check:disabled,
1649
- .wp-check[aria-disabled="true"] {
1650
- cursor: not-allowed;
1651
- background: var(--wp-bg-3);
1652
- border-color: var(--wp-border);
1653
- opacity: 0.6;
1654
- }
1655
- .wp-check:disabled[data-checked="true"],
1656
- .wp-check:disabled[data-indeterminate="true"],
1657
- .wp-check[aria-disabled="true"][aria-checked="true"] {
1658
- background: var(--wp-text-dim);
1659
- border-color: var(--wp-text-dim);
1660
- color: var(--wp-bg-1);
1661
- }
1662
- .wp-checkbox.is-disabled { cursor: not-allowed; }
1663
- .wp-checkbox.is-disabled .wp-checkbox__label { opacity: 0.5; }
1664
- .wp-check:focus-visible { outline: none; box-shadow: var(--wp-focus-ring); }
1665
-
1666
- /* Inline checkbox wrapper (label + box) — min-height fills canonical hit-target. */
1667
- .wp-checkbox {
1668
- display: inline-flex; align-items: center; gap: 8px;
1669
- min-height: var(--wp-input-h);
1670
- cursor: pointer;
1671
- user-select: none;
1672
- font-size: 12.5px;
1673
- color: var(--wp-text);
1674
- }
1675
- /* Box-only checkbox inside a row or a <label> that already gives the hit
1676
- target (AI result lists, file lists): no 32px min-height, so it sits on
1677
- the row's text line. */
1678
- .wp-checkbox--inline { min-height: 0; flex: none; }
1679
- /* Field checkbox (`<Checkbox field>`): an input-height box in a form grid.
1680
- The label fills the box so a click anywhere toggles once (the label
1681
- toggles, the box toggles, nothing else does). */
1682
- .wp-checkbox--field {
1683
- display: flex;
1684
- width: 100%;
1685
- height: var(--wp-input-h);
1686
- gap: 0;
1687
- background: var(--wp-bg-2);
1688
- border: 1px solid var(--wp-border);
1689
- border-radius: var(--wp-radius-sm);
1690
- transition: border-color .12s;
1691
- }
1692
- .wp-checkbox--field:hover { border-color: var(--wp-border-strong); }
1693
- .wp-checkbox--field:focus-within { border-color: var(--wp-accent-500); }
1694
- .wp-checkbox--field .wp-check { margin-left: 10px; }
1695
- .wp-checkbox--field .wp-checkbox__label {
1696
- flex: 1;
1697
- align-self: stretch;
1698
- display: flex;
1699
- align-items: center;
1700
- padding: 0 10px 0 8px;
1701
- white-space: nowrap;
1702
- overflow: hidden;
1703
- text-overflow: ellipsis;
1704
- }
1705
-
1706
- /* ---------- Radio ----------
1707
- Native <input type="radio" class="wp-radio"> drawn to match .wp-check:
1708
- same 14px box, soft border and accent-600 fill, round. Stays a real
1709
- radio so name-grouping, arrow keys and v-model keep working. */
1710
- .wp-radio {
1711
- appearance: none; -webkit-appearance: none;
1712
- width: 14px; height: 14px; margin: 0; flex-shrink: 0;
1713
- border: 1.5px solid var(--wp-border-strong);
1714
- border-radius: 50%; /* round: a radio is round in every look */
1715
- background: var(--wp-bg);
1716
- display: inline-grid; place-items: center;
1717
- cursor: pointer;
1718
- transition: background .12s, border-color .12s;
1719
- }
1720
- .wp-radio::before {
1721
- content: ""; width: 6px; height: 6px; border-radius: 50%; /* round: radio dot */
1722
- background: #fff; /* audit-exempt: white dot on accent-600 fill ≥4.5:1 both themes */
1723
- transform: scale(0); transition: transform .12s;
1724
- }
1725
- .wp-radio:checked { background: var(--wp-accent-600); border-color: var(--wp-accent-500); }
1726
- .wp-radio:checked::before { transform: scale(1); }
1727
- .wp-radio:disabled { opacity: 0.6; cursor: not-allowed; background: var(--wp-bg-3); border-color: var(--wp-border); }
1728
- .wp-radio:disabled:checked { background: var(--wp-text-dim); border-color: var(--wp-text-dim); }
1729
- .wp-radio:disabled:checked::before { background: var(--wp-bg-1); }
1730
- label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim); }
1731
- .wp-radio:focus-visible { outline: none; box-shadow: var(--wp-focus-ring); }
1732
- .wp-checkbox__label { color: var(--wp-text); }
1733
-
1734
1308
  /* ---------- Star (favorite) ---------- */
1735
1309
  .wp-star { color: var(--wp-text-dim); cursor: pointer; transition: color .12s, transform .1s; background: none; border: none; padding: 4px; line-height: 0; }
1736
1310
  .wp-star:hover { color: var(--wp-warn); }
@@ -1738,19 +1312,6 @@ label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim)
1738
1312
 
1739
1313
  /* ---------- Tabs ---------- */
1740
1314
  .wp-tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--wp-border); }
1741
- .wp-tab {
1742
- padding: 8px 12px;
1743
- background: none; border: none;
1744
- color: var(--wp-text-muted);
1745
- font-size: 12.5px;
1746
- cursor: pointer;
1747
- border-bottom: 2px solid transparent;
1748
- margin-bottom: -1px;
1749
- display: inline-flex; align-items: center; gap: 6px;
1750
- font-weight: 500;
1751
- }
1752
- .wp-tab:hover { color: var(--wp-text); }
1753
- .wp-tab[data-active="true"] { color: var(--wp-text); border-bottom-color: var(--wp-accent-400); }
1754
1315
 
1755
1316
  /* ---------- Code-ish snippet display ---------- */
1756
1317
  .wp-snippet {
@@ -1785,116 +1346,9 @@ label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim)
1785
1346
  .wp-mono { font-family: var(--wp-font-mono); }
1786
1347
  .wp-muted { color: var(--wp-text-muted); }
1787
1348
  .wp-dim { color: var(--wp-text-dim); }
1788
- .wp-divider { height: 1px; background: var(--wp-border); margin: 4px 0; }
1789
-
1790
- /* ---------- Token autocomplete popup ---------- */
1791
- .wp-autocomplete {
1792
- position: absolute;
1793
- top: calc(100% + 4px);
1794
- left: 0; right: 0;
1795
- z-index: 50;
1796
- background: var(--wp-bg-2);
1797
- border: 1px solid var(--wp-border-strong);
1798
- border-radius: min(8px, var(--wp-radius-cap, 999px));
1799
- box-shadow: var(--wp-shadow-md);
1800
- overflow: hidden;
1801
- max-height: 280px;
1802
- display: flex; flex-direction: column;
1803
- animation: wp-fade-in .1s ease-out;
1804
- }
1805
- .wp-autocomplete[data-flip] {
1806
- top: auto;
1807
- bottom: calc(100% + 4px);
1808
- }
1809
- .wp-autocomplete__head {
1810
- display: flex; align-items: center;
1811
- padding: 6px 10px;
1812
- font-size: 11px;
1813
- border-bottom: 1px solid var(--wp-border);
1814
- background: var(--wp-bg-3);
1815
- color: var(--wp-text-dim);
1816
- }
1817
- .wp-autocomplete__item {
1818
- display: flex; align-items: center; gap: 12px;
1819
- padding: 7px 10px;
1820
- background: transparent;
1821
- border: none;
1822
- text-align: left;
1823
- cursor: pointer;
1824
- color: var(--wp-text);
1825
- font-size: 12.5px;
1826
- font-family: var(--wp-font-mono);
1827
- }
1828
- .wp-autocomplete__item[data-active="true"] {
1829
- background: color-mix(in oklab, var(--wp-accent-600) 22%, transparent);
1830
- }
1831
- .wp-autocomplete__label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1832
- .wp-autocomplete__hint { font-size: 11px; color: var(--wp-text-dim); font-family: var(--wp-font); }
1833
1349
 
1834
- /* ---------- Custom select popup ---------- */
1835
- .wp-select-wrap { position: relative; display: inline-block; width: 100%; }
1836
-
1837
- /* Menu teleported to <body>; position/top/left provided via inline style from JS. */
1838
- .wp-select__menu {
1839
- background: var(--wp-bg-3);
1840
- border: 1px solid var(--wp-border-strong);
1841
- border-radius: min(7px, var(--wp-radius-cap, 999px));
1842
- box-shadow: var(--wp-shadow-md);
1843
- z-index: 9999;
1844
- padding: 4px;
1845
- max-height: 240px;
1846
- overflow: auto;
1847
- list-style: none;
1848
- margin: 0;
1849
- }
1850
- .wp-select__option {
1851
- display: flex; align-items: center; gap: 6px;
1852
- padding: 6px 8px;
1853
- border-radius: min(6px, var(--wp-radius-cap, 999px));
1854
- color: var(--wp-text-muted);
1855
- cursor: pointer;
1856
- font-size: 12.5px;
1857
- user-select: none;
1858
- }
1859
- .wp-select__option:hover {
1860
- background: var(--wp-bg-4);
1861
- color: var(--wp-text);
1862
- }
1863
- .wp-select__option[data-active="true"] {
1864
- background: rgba(99, 102, 241, 0.20);
1865
- background: color-mix(in oklab, var(--wp-accent-500) 20%, transparent);
1866
- color: var(--wp-text);
1867
- }
1868
- .wp-select__option[data-selected="true"] {
1869
- background: rgba(99, 102, 241, 0.18);
1870
- background: color-mix(in oklab, var(--wp-accent-500) 18%, transparent);
1871
- color: var(--wp-text);
1872
- }
1873
- /* Dot + label wrapper inside trigger button */
1874
- .wp-select__label-wrap {
1875
- display: flex; align-items: center; gap: 6px;
1876
- flex: 1; min-width: 0; overflow: hidden;
1877
- }
1878
- /* Color dot — rendered in both trigger and option list */
1879
- .wp-select__dot {
1880
- width: 8px; height: 8px;
1881
- border-radius: 50%; /* round: colour dot */
1882
- flex-shrink: 0;
1883
- display: inline-block;
1884
- }
1885
- /* Label text inside trigger — must be a flex item (not inline) for ellipsis to work */
1886
- .wp-select__label-text,
1887
- .wp-select__placeholder {
1888
- flex: 1; min-width: 0;
1889
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
1890
- }
1891
- /* Option label text — no truncation; menu grows to fit widest option */
1892
- .wp-select__option-label {
1893
- flex: 1;
1894
- white-space: nowrap;
1895
- }
1896
- .wp-select__placeholder { color: var(--wp-text-dim); }
1897
- .wp-select__chevron { color: var(--wp-text-dim); font-size: 11px; margin-left: 6px; flex-shrink: 0; }
1350
+ /* The custom select (trigger, list, options) styles itself: Select.vue, with
1351
+ * the shared menu look from menu.css. */
1898
1352
 
1899
1353
  /* ---------- Color picker (categories) ---------- */
1900
1354
  .wp-color-picker {
@@ -1931,103 +1385,6 @@ label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim)
1931
1385
  box-shadow: 0 0 0 2px var(--wp-bg-1), 0 0 0 4px var(--wp-accent-500);
1932
1386
  }
1933
1387
 
1934
- /* ---------- Constraint rule matrix ---------- */
1935
- .wp-matrix {
1936
- border-collapse: separate; border-spacing: 4px;
1937
- font-size: 12px;
1938
- }
1939
- .wp-matrix__corner {
1940
- padding: 0 8px; text-align: left;
1941
- color: var(--wp-text-dim);
1942
- font-weight: 500; font-size: 10.5px;
1943
- text-transform: uppercase; letter-spacing: .05em;
1944
- display: flex; flex-direction: column; gap: 2px;
1945
- }
1946
- .wp-matrix__col-h {
1947
- padding: 0 8px; color: var(--wp-text-muted);
1948
- font-weight: 500; white-space: nowrap;
1949
- }
1950
- .wp-matrix__row-h {
1951
- padding: 0 8px; color: var(--wp-text-muted);
1952
- white-space: nowrap; text-align: left;
1953
- }
1954
- .wp-matrix-cell {
1955
- display: inline-flex; align-items: center; justify-content: center; gap: 3px;
1956
- min-width: 56px; height: 30px; padding: 0 8px;
1957
- border-radius: min(6px, var(--wp-radius-cap, 999px)); cursor: pointer;
1958
- border: 1px solid var(--wp-border);
1959
- font-family: var(--wp-font);
1960
- transition: background .12s, border-color .12s, transform .04s;
1961
- }
1962
- .wp-matrix-cell:hover { transform: translateY(-1px); }
1963
- .wp-matrix-cell[data-mode="allow"] { min-width: 36px; padding: 0 6px; }
1964
- .wp-matrix-cell[data-mode="exclude"] { min-width: 36px; padding: 0 6px; }
1965
- .wp-matrix-cell__icon { font-size: 14px; font-weight: 600; line-height: 1; }
1966
- .wp-matrix-cell__factor {
1967
- font-family: var(--wp-font-mono);
1968
- font-size: 10.5px; font-weight: 500;
1969
- opacity: 0.85;
1970
- }
1971
- .wp-matrix-cell__tune {
1972
- position: absolute; top: -6px; right: -6px;
1973
- width: 18px; height: 18px;
1974
- border-radius: min(50%, var(--wp-radius-cap, 999px));
1975
- display: grid; place-items: center;
1976
- background: var(--wp-bg-1);
1977
- border: 1px solid var(--wp-border-strong);
1978
- color: var(--wp-text-muted);
1979
- cursor: pointer; padding: 0;
1980
- font-size: 9px;
1981
- box-shadow: var(--wp-shadow-sm);
1982
- transition: color .12s, border-color .12s, background .12s;
1983
- }
1984
- .wp-matrix-cell__tune:hover {
1985
- color: var(--wp-accent-text);
1986
- border-color: var(--wp-accent-500);
1987
- background: var(--wp-bg-2);
1988
- }
1989
-
1990
- /* ---------- Tune popover (matrix factor fine-tune) ---------- */
1991
- .wp-tune-pop {
1992
- z-index: 200;
1993
- background: var(--wp-bg-1);
1994
- border: 1px solid var(--wp-border-strong);
1995
- border-radius: min(10px, var(--wp-radius-cap, 999px));
1996
- padding: 10px 12px;
1997
- box-shadow: var(--wp-shadow-md, 0 12px 28px rgba(0,0,0,.35));
1998
- display: flex; flex-direction: column; gap: 8px;
1999
- }
2000
- .wp-matrix-cell-wrap {
2001
- position: relative;
2002
- display: inline-block;
2003
- }
2004
- .wp-tune-pop__head {
2005
- display: flex; justify-content: space-between; align-items: center;
2006
- }
2007
- .wp-tune-pop__row {
2008
- display: grid; grid-template-columns: 80px 1fr; gap: 8px; align-items: center;
2009
- }
2010
- .wp-tune-pop__presets {
2011
- display: flex; gap: 4px; flex-wrap: wrap; justify-content: flex-end;
2012
- }
2013
- .wp-chip-btn {
2014
- padding: 3px 7px;
2015
- border-radius: var(--wp-radius-cap, 999px);
2016
- border: 1px solid var(--wp-border);
2017
- background: var(--wp-bg-2);
2018
- color: var(--wp-text-muted);
2019
- font-size: 10.5px;
2020
- font-family: var(--wp-font-mono);
2021
- cursor: pointer;
2022
- transition: background .12s, color .12s, border-color .12s;
2023
- }
2024
- .wp-chip-btn:hover { background: var(--wp-bg-3); color: var(--wp-text); }
2025
- .wp-chip-btn[data-active="true"] {
2026
- background: color-mix(in oklab, var(--wp-accent-500) 18%, transparent);
2027
- color: var(--wp-accent-text-strong);
2028
- border-color: color-mix(in oklab, var(--wp-accent-500) 40%, transparent);
2029
- }
2030
-
2031
1388
  /* native range styled to match */
2032
1389
  .wp-range {
2033
1390
  width: 100%;
@@ -2199,364 +1556,6 @@ label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim)
2199
1556
  font-size: 12px;
2200
1557
  }
2201
1558
 
2202
- /* Token properties popover (for $var chips) */
2203
- .wp-tokenprops {
2204
- position: fixed;
2205
- z-index: 200;
2206
- width: 320px;
2207
- background: var(--wp-bg-1);
2208
- border: 1px solid var(--wp-border-strong);
2209
- border-radius: min(10px, var(--wp-radius-cap, 999px));
2210
- box-shadow: var(--wp-shadow-md, 0 12px 28px rgba(0,0,0,.4));
2211
- padding: 12px;
2212
- display: flex;
2213
- flex-direction: column;
2214
- gap: 10px;
2215
- }
2216
- .wp-tokenprops__head {
2217
- display: flex; align-items: center; gap: 6px;
2218
- padding-bottom: 8px;
2219
- border-bottom: 1px solid var(--wp-border);
2220
- }
2221
- .wp-tokenprops__name {
2222
- font-family: var(--wp-font-mono);
2223
- font-size: 13px;
2224
- color: var(--wp-accent-text);
2225
- font-weight: 500;
2226
- }
2227
- .wp-tokenprops__type {
2228
- margin-left: auto;
2229
- font-size: 10.5px;
2230
- color: var(--wp-text-dim);
2231
- text-transform: uppercase;
2232
- letter-spacing: 0.5px;
2233
- }
2234
- .wp-tokenprops__row {
2235
- display: grid;
2236
- grid-template-columns: 86px 1fr;
2237
- gap: 8px;
2238
- align-items: center;
2239
- }
2240
- .wp-tokenprops__label {
2241
- font-size: 11.5px;
2242
- color: var(--wp-text-muted);
2243
- }
2244
- .wp-tokenprops__output {
2245
- font-family: var(--wp-font-mono);
2246
- font-size: 11.5px;
2247
- background: var(--wp-bg-2);
2248
- border: 1px solid var(--wp-border);
2249
- border-radius: min(6px, var(--wp-radius-cap, 999px));
2250
- padding: 6px 8px;
2251
- color: var(--wp-text);
2252
- word-break: break-all;
2253
- line-height: 1.5;
2254
- }
2255
- .wp-tokenprops__legend {
2256
- font-size: 10.5px;
2257
- color: var(--wp-text-dim);
2258
- display: flex;
2259
- align-items: center;
2260
- gap: 4px;
2261
- }
2262
-
2263
-
2264
- /* ===================== PIPELINES ===================== */
2265
-
2266
- /* Stack of step rows in the pipeline editor */
2267
- .wp-pl-stack {
2268
- display: flex;
2269
- flex-direction: column;
2270
- gap: 6px;
2271
- }
2272
-
2273
- /* `.wp-pl-empty` removed: PipelineSteps now uses the canonical
2274
- `.wp-empty-card` class for its empty placeholder. */
2275
-
2276
- /* ---------- Step row ---------- */
2277
- .wp-pl-row {
2278
- display: grid;
2279
- grid-template-columns: 22px 22px 32px 1fr auto;
2280
- align-items: center;
2281
- gap: 10px;
2282
- padding: 8px 10px;
2283
- background: var(--wp-bg2);
2284
- border: 1px solid var(--wp-border);
2285
- border-left: 3px solid var(--step-color, var(--wp-accent-500));
2286
- border-radius: var(--wp-radius-md);
2287
- transition: border-color 120ms ease, background 120ms ease, transform 120ms ease, opacity 120ms ease;
2288
- }
2289
- .wp-pl-row:hover {
2290
- border-color: var(--wp-border-strong);
2291
- background: var(--wp-bg3);
2292
- }
2293
- .wp-pl-row[data-drag-over] {
2294
- border-top-color: var(--wp-accent-500);
2295
- box-shadow: 0 -2px 0 var(--wp-accent-500);
2296
- }
2297
- .wp-pl-row[data-disabled] { opacity: 0.5; }
2298
- .wp-pl-row[data-disabled] .wp-pl-row__name select { text-decoration: line-through; }
2299
-
2300
- /* drag handle */
2301
- .wp-pl-row__handle {
2302
- display: flex; align-items: center; justify-content: center;
2303
- width: 22px; height: 22px;
2304
- color: var(--wp-text-dim);
2305
- cursor: grab;
2306
- border-radius: min(4px, var(--wp-radius-cap, 999px));
2307
- user-select: none;
2308
- }
2309
- .wp-pl-row__handle:hover { color: var(--wp-text); background: var(--wp-bg-hover); }
2310
- .wp-pl-row__handle:active { cursor: grabbing; }
2311
-
2312
- /* enable/disable toggle */
2313
- .wp-pl-row__toggle {
2314
- width: 22px; height: 22px;
2315
- display: flex; align-items: center; justify-content: center;
2316
- border: 1px solid var(--wp-border);
2317
- background: var(--wp-bg);
2318
- border-radius: min(4px, var(--wp-radius-cap, 999px));
2319
- color: var(--wp-text-muted);
2320
- cursor: pointer;
2321
- padding: 0;
2322
- transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
2323
- }
2324
- .wp-pl-row__toggle:hover { background: var(--wp-bg-hover); color: var(--wp-text); border-color: var(--wp-border-strong); }
2325
-
2326
- /* kind icon (color tinted by --step-color) */
2327
- .wp-pl-row__icon {
2328
- width: 32px; height: 32px;
2329
- border-radius: var(--wp-radius-sm);
2330
- display: flex; align-items: center; justify-content: center;
2331
- background: color-mix(in oklab, var(--step-color, var(--wp-accent-500)) 16%, var(--wp-bg3));
2332
- color: var(--step-color, var(--wp-accent-300));
2333
- flex-shrink: 0;
2334
- }
2335
-
2336
- /* main column */
2337
- .wp-pl-row__main {
2338
- min-width: 0;
2339
- display: flex;
2340
- flex-direction: column;
2341
- gap: 2px;
2342
- }
2343
- .wp-pl-row__top {
2344
- display: flex; align-items: center; gap: 8px;
2345
- font-size: 11px;
2346
- text-transform: uppercase;
2347
- letter-spacing: 0.04em;
2348
- color: var(--wp-text-muted);
2349
- font-weight: 500;
2350
- }
2351
- .wp-pl-row__kind { color: var(--step-color, var(--wp-text-muted)); }
2352
- .wp-pl-row__index {
2353
- margin-left: auto;
2354
- font-family: var(--wp-font-mono);
2355
- font-size: 10.5px;
2356
- letter-spacing: 0;
2357
- padding: 1px 5px;
2358
- border-radius: min(3px, var(--wp-radius-cap, 999px));
2359
- background: var(--wp-bg);
2360
- border: 1px solid var(--wp-border);
2361
- color: var(--wp-text-dim);
2362
- }
2363
- .wp-pl-row__name {
2364
- display: flex;
2365
- align-items: center;
2366
- min-width: 0;
2367
- }
2368
- .wp-pl-row__sub {
2369
- font-size: 11.5px;
2370
- color: var(--wp-text-muted);
2371
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
2372
- }
2373
-
2374
- /* `.wp-pl-row__refselect` styles intentionally removed.
2375
- Earlier the pipeline ref-select was a native <select> styled here
2376
- to look like inline text. We now route through the shared `Select`
2377
- component (see `components/ui/Select.vue`), which already brings
2378
- its own height (`--wp-input-h-sm`, 24px at Comfortable) + chevron + focus ring.
2379
- The leftover `height: 26px; overflow: hidden` rule was clipping the
2380
- new trigger by ~2px at the bottom, which read as a "cut" border on
2381
- the pipeline row. The scoped block in PipelineSteps.vue keeps the
2382
- only two rules still needed (`flex: 1; min-width: 0`). */
2383
-
2384
- /* row actions */
2385
- .wp-pl-row__actions {
2386
- display: flex;
2387
- align-items: center;
2388
- gap: 2px;
2389
- }
2390
- .wp-pl-row__act {
2391
- width: 26px; height: 26px;
2392
- display: flex; align-items: center; justify-content: center;
2393
- background: transparent;
2394
- border: 1px solid transparent;
2395
- border-radius: min(4px, var(--wp-radius-cap, 999px));
2396
- color: var(--wp-text-muted);
2397
- cursor: pointer;
2398
- font-size: 12px;
2399
- padding: 0;
2400
- transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
2401
- }
2402
- .wp-pl-row__act:hover {
2403
- background: var(--wp-bg-hover);
2404
- color: var(--wp-text);
2405
- border-color: var(--wp-border);
2406
- }
2407
- .wp-pl-row__act--danger:hover {
2408
- background: color-mix(in oklab, var(--wp-danger) 16%, transparent);
2409
- color: var(--wp-danger-text);
2410
- border-color: color-mix(in oklab, var(--wp-danger) 30%, transparent);
2411
- }
2412
-
2413
- /* add-step button */
2414
- .wp-pl-add {
2415
- display: flex;
2416
- align-items: center;
2417
- justify-content: center;
2418
- gap: 8px;
2419
- padding: 12px;
2420
- width: 100%;
2421
- border: 1px dashed var(--wp-border-strong);
2422
- border-radius: var(--wp-radius-md);
2423
- background: transparent;
2424
- color: var(--wp-text-muted);
2425
- font-size: 12.5px;
2426
- font-weight: 500;
2427
- text-transform: uppercase;
2428
- letter-spacing: 0.06em;
2429
- cursor: pointer;
2430
- margin-top: 4px;
2431
- transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
2432
- }
2433
- .wp-pl-add:hover {
2434
- border-style: solid;
2435
- border-color: var(--wp-accent-500);
2436
- color: var(--wp-accent-text);
2437
- background: color-mix(in oklab, var(--wp-accent-500) 7%, transparent);
2438
- }
2439
- .wp-pl-add .pi { font-size: 11px; }
2440
-
2441
- /* ---------- Module picker tabs ---------- */
2442
- .wp-pl-tab {
2443
- display: inline-flex;
2444
- align-items: center;
2445
- gap: 6px;
2446
- padding: 6px 10px;
2447
- background: var(--wp-bg2);
2448
- border: 1px solid var(--wp-border);
2449
- border-radius: var(--wp-radius-sm);
2450
- color: var(--wp-text-muted);
2451
- font-size: 12px;
2452
- font-weight: 500;
2453
- cursor: pointer;
2454
- transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
2455
- }
2456
- .wp-pl-tab:hover {
2457
- background: var(--wp-bg3);
2458
- color: var(--wp-text);
2459
- border-color: var(--wp-border-strong);
2460
- }
2461
- .wp-pl-tab[data-active] {
2462
- background: color-mix(in oklab, var(--tab-color, var(--wp-accent-500)) 14%, var(--wp-bg2));
2463
- border-color: color-mix(in oklab, var(--tab-color, var(--wp-accent-500)) 50%, transparent);
2464
- color: var(--tab-color, var(--wp-accent-text));
2465
- }
2466
- .wp-pl-tab__count {
2467
- font-family: var(--wp-font-mono);
2468
- font-size: 10.5px;
2469
- padding: 0 5px;
2470
- border-radius: var(--wp-radius-cap, 999px);
2471
- background: var(--wp-bg);
2472
- border: 1px solid var(--wp-border);
2473
- color: var(--wp-text-dim);
2474
- min-width: 18px;
2475
- text-align: center;
2476
- }
2477
-
2478
- /* picker rows */
2479
- .wp-pl-pickrow {
2480
- display: flex;
2481
- align-items: center;
2482
- gap: 10px;
2483
- padding: 9px 12px;
2484
- background: var(--wp-bg2);
2485
- border: none;
2486
- cursor: pointer;
2487
- text-align: left;
2488
- width: 100%;
2489
- font-size: 13px;
2490
- color: var(--wp-text);
2491
- transition: background 120ms ease;
2492
- }
2493
- .wp-pl-pickrow:hover {
2494
- background: var(--wp-bg3);
2495
- }
2496
- .wp-pl-pickrow__icon {
2497
- width: 28px; height: 28px;
2498
- border-radius: var(--wp-radius-sm);
2499
- display: flex; align-items: center; justify-content: center;
2500
- flex-shrink: 0;
2501
- }
2502
-
2503
- /* ---------- Resolution preview flow ---------- */
2504
- .wp-pl-flow {
2505
- display: flex;
2506
- flex-direction: column;
2507
- gap: 4px;
2508
- }
2509
- .wp-pl-flow__step {
2510
- display: flex;
2511
- flex-direction: column;
2512
- gap: 4px;
2513
- padding: 10px 12px;
2514
- background: var(--wp-bg);
2515
- border: 1px solid var(--wp-border);
2516
- border-left: 3px solid var(--step-color, var(--wp-accent-500));
2517
- border-radius: var(--wp-radius-md);
2518
- position: relative;
2519
- }
2520
- .wp-pl-flow__step + .wp-pl-flow__step::before {
2521
- content: "";
2522
- position: absolute;
2523
- top: -5px;
2524
- left: 18px;
2525
- width: 1px;
2526
- height: 6px;
2527
- background: var(--wp-border-strong);
2528
- }
2529
- .wp-pl-flow__head {
2530
- display: flex; align-items: center; gap: 8px;
2531
- color: var(--wp-text);
2532
- }
2533
- .wp-pl-flow__idx {
2534
- font-family: var(--wp-font-mono);
2535
- font-size: 10.5px;
2536
- padding: 1px 5px;
2537
- border-radius: min(3px, var(--wp-radius-cap, 999px));
2538
- background: var(--wp-bg2);
2539
- border: 1px solid var(--wp-border);
2540
- color: var(--wp-text-dim);
2541
- }
2542
- .wp-pl-flow__adds {
2543
- display: flex;
2544
- flex-direction: column;
2545
- gap: 2px;
2546
- padding-left: 30px;
2547
- }
2548
- .wp-pl-flow__binding {
2549
- display: flex;
2550
- align-items: baseline;
2551
- gap: 6px;
2552
- font-size: 12px;
2553
- line-height: 1.4;
2554
- }
2555
- .wp-pl-flow__binding > span:last-child {
2556
- color: var(--wp-text);
2557
- word-break: break-word;
2558
- }
2559
-
2560
1559
  /* ---------- Modal (simple, used by picker) ---------- */
2561
1560
  .wp-modal__backdrop,
2562
1561
  .wp-modal-backdrop {
@@ -2618,7 +1617,6 @@ label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim)
2618
1617
  background: var(--wp-bg);
2619
1618
  }
2620
1619
 
2621
-
2622
1620
  /* ---------- Picker modal sizing & layout ---------- */
2623
1621
  .wp-modal--picker {
2624
1622
  width: 560px;
@@ -2628,91 +1626,6 @@ label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim)
2628
1626
  flex-direction: column;
2629
1627
  }
2630
1628
 
2631
- .wp-pl-picker__body {
2632
- display: flex;
2633
- flex-direction: column;
2634
- gap: 10px;
2635
- min-height: 0;
2636
- }
2637
-
2638
- /* tabs row — wraps on narrow widths instead of forcing horizontal scroll */
2639
- .wp-pl-picker__tabs {
2640
- display: flex;
2641
- flex-wrap: wrap;
2642
- gap: 4px;
2643
- }
2644
- .wp-pl-tab {
2645
- flex: 0 1 auto;
2646
- min-width: 0;
2647
- }
2648
- .wp-pl-tab__label {
2649
- white-space: nowrap;
2650
- overflow: hidden;
2651
- text-overflow: ellipsis;
2652
- min-width: 0;
2653
- }
2654
-
2655
- /* picker list */
2656
- .wp-pl-picker__list {
2657
- overflow-y: auto;
2658
- overflow-x: hidden;
2659
- border: 1px solid var(--wp-border);
2660
- border-radius: min(8px, var(--wp-radius-cap, 999px));
2661
- background: var(--wp-bg);
2662
- flex: 1;
2663
- min-height: 200px;
2664
- display: flex;
2665
- flex-direction: column;
2666
- }
2667
- .wp-pl-pickrow {
2668
- display: flex;
2669
- align-items: center;
2670
- gap: 10px;
2671
- padding: 9px 12px;
2672
- background: var(--wp-bg2);
2673
- border: none;
2674
- border-bottom: 1px solid var(--wp-border);
2675
- cursor: pointer;
2676
- text-align: left;
2677
- width: 100%;
2678
- font-size: 13px;
2679
- color: var(--wp-text);
2680
- transition: background 120ms ease;
2681
- min-width: 0;
2682
- }
2683
- .wp-pl-pickrow:last-child { border-bottom: none; }
2684
- .wp-pl-pickrow:hover { background: var(--wp-bg3); }
2685
- .wp-pl-pickrow__icon {
2686
- width: 28px; height: 28px;
2687
- border-radius: var(--wp-radius-sm);
2688
- display: flex; align-items: center; justify-content: center;
2689
- flex-shrink: 0;
2690
- }
2691
- .wp-pl-pickrow__main {
2692
- flex: 1;
2693
- min-width: 0;
2694
- display: flex;
2695
- flex-direction: column;
2696
- gap: 1px;
2697
- overflow: hidden;
2698
- }
2699
- .wp-pl-pickrow__name {
2700
- font-weight: 500;
2701
- font-size: 13px;
2702
- color: var(--wp-text);
2703
- white-space: nowrap;
2704
- overflow: hidden;
2705
- text-overflow: ellipsis;
2706
- }
2707
- .wp-pl-pickrow__id {
2708
- font-size: 11px;
2709
- font-family: var(--wp-font-mono);
2710
- color: var(--wp-text-muted);
2711
- white-space: nowrap;
2712
- overflow: hidden;
2713
- text-overflow: ellipsis;
2714
- }
2715
-
2716
1629
  /* shrink modal padding on narrow viewports */
2717
1630
  @media (max-width: 640px) {
2718
1631
  .wp-modal-backdrop { padding: 12px; }
@@ -2722,15 +1635,6 @@ label:has(> .wp-radio:disabled) { cursor: not-allowed; color: var(--wp-text-dim)
2722
1635
  }
2723
1636
  }
2724
1637
 
2725
-
2726
- /* In picker modal, give the search bar a bit more breathing room. */
2727
- .wp-pl-picker__body .wp-input-group {
2728
- flex-shrink: 0;
2729
- height: 38px;
2730
- min-height: 38px;
2731
- }
2732
- .wp-pl-picker__body .wp-pl-picker__tabs { flex-shrink: 0; }
2733
-
2734
1638
  /* ---------- Module-kind palette (icon + bg pairs) ----------
2735
1639
  Source: docs/design-handoff/wildcard-pipeline/project/data.jsx KIND_META.
2736
1640
  Dark-theme values (bright, high-chroma) — all pass WCAG AA on dark surfaces.