PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.10
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.10
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
← All changes | assets/css/my-wordpress.css +646 -137 1.1.11.1.10 View file →
@@ -846,9 +846,9 @@
846 846 font-size: 11px;
847 847 font-weight: 600;
848 848 text-transform: uppercase;
849 849 letter-spacing: 0.04em;
850 - background: rgba( 34, 113, 177, 0.12 );
850 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 12%, transparent );
851 851 color: var( --wp-admin-theme-color, #2271b1 );
852 852 }
853 853
854 854 .os-my-wordpress__user-links {
@@ -951,9 +951,9 @@
951 951 .os-my-wordpress__user-spark-bar {
952 952 background: linear-gradient(
953 953 180deg,
954 954 var( --wp-admin-theme-color, #2271b1 ) 0%,
955 - rgba( 34, 113, 177, 0.55 ) 100%
955 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 55%, transparent ) 100%
956 956 );
957 957 border-radius: 3px 3px 0 0;
958 958 min-height: 2px;
959 959 transition: height 0.3s ease;
@@ -1087,9 +1087,9 @@
1087 1087 }
1088 1088
1089 1089 .os-my-wordpress__term-icon--category {
1090 1090 background: linear-gradient( 135deg, var( --os-ui-accent, #2271b1 ) 0%, var( --os-ui-accent-strong, #135e96 ) 100% );
1091 - box-shadow: 0 4px 12px rgba( 34, 113, 177, 0.32 );
1091 + box-shadow: 0 4px 12px color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 32%, transparent );
1092 1092 }
1093 1093
1094 1094 .os-my-wordpress__term-icon--tag {
1095 1095 background: linear-gradient( 135deg, #7c3aed 0%, #5b21b6 100% );
@@ -1096,9 +1096,9 @@
1096 1096 box-shadow: 0 4px 12px rgba( 124, 58, 237, 0.32 );
1097 1097 }
1098 1098
1099 1099 .os-my-wordpress__user-role--category {
1100 - background: rgba( 34, 113, 177, 0.12 );
1100 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 12%, transparent );
1101 1101 color: var( --os-ui-accent-strong, #135e96 );
1102 1102 }
1103 1103
1104 1104 .os-my-wordpress__user-role--tag {
@@ -1158,9 +1158,9 @@
1158 1158 * for users with moderate_comments.
1159 1159 * --------------------------------------------------------------- */
1160 1160
1161 1161 .os-my-wordpress__comment-status--approved {
1162 - background: rgba( 34, 113, 177, 0.12 );
1162 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 12%, transparent );
1163 1163 color: var( --os-ui-accent-strong, #135e96 );
1164 1164 }
1165 1165
1166 1166 .os-my-wordpress__comment-status--pending {
@@ -1191,9 +1191,9 @@
1191 1191 .os-my-wordpress__comment-quote {
1192 1192 margin: 0 0 16px;
1193 1193 padding: 10px 14px;
1194 1194 border-left: 3px solid var( --wp-admin-theme-color, #2271b1 );
1195 - background: rgba( 34, 113, 177, 0.06 );
1195 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 6%, transparent );
1196 1196 border-radius: 0 6px 6px 0;
1197 1197 font-size: 13px;
1198 1198 }
1199 1199
@@ -1336,10 +1336,10 @@
1336 1336 border-radius: 50%;
1337 1337 overflow: hidden;
1338 1338 background: linear-gradient(
1339 1339 135deg,
1340 - rgba( 34, 113, 177, 0.18 ),
1341 - rgba( 34, 113, 177, 0.04 )
1340 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 18%, transparent ),
1341 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 4%, transparent )
1342 1342 );
1343 1343 box-shadow:
1344 1344 inset 0 0 0 1px rgba( 0, 0, 0, 0.08 ),
1345 1345 0 2px 6px rgba( 0, 0, 0, 0.08 );
@@ -1460,10 +1460,10 @@
1460 1460 padding: 24px;
1461 1461 border-radius: 16px;
1462 1462 background: linear-gradient(
1463 1463 135deg,
1464 - rgba( 34, 113, 177, 0.10 ) 0%,
1465 - rgba( 34, 113, 177, 0.02 ) 60%,
1464 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, transparent ) 0%,
1465 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 2%, transparent ) 60%,
1466 1466 transparent 100%
1467 1467 );
1468 1468 border: 1px solid var( --os-ui-border, #dcdcde );
1469 1469 }
@@ -1478,10 +1478,10 @@
1478 1478 inset 0 0 0 2px rgba( 255, 255, 255, 0.8 ),
1479 1479 0 6px 24px rgba( 0, 0, 0, 0.14 );
1480 1480 background: linear-gradient(
1481 1481 135deg,
1482 - rgba( 34, 113, 177, 0.18 ),
1483 - rgba( 34, 113, 177, 0.04 )
1482 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 18%, transparent ),
1483 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 4%, transparent )
1484 1484 );
1485 1485 display: inline-flex;
1486 1486 align-items: center;
1487 1487 justify-content: center;
@@ -1613,17 +1613,17 @@
1613 1613 background: var( --os-ui-hover, rgba( 0, 0, 0, 0.06 ) );
1614 1614 }
1615 1615
1616 1616 .os-my-wordpress__footprint-cell--l1 {
1617 - background: rgba( 34, 113, 177, 0.25 );
1617 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 25%, transparent );
1618 1618 }
1619 1619
1620 1620 .os-my-wordpress__footprint-cell--l2 {
1621 - background: rgba( 34, 113, 177, 0.5 );
1621 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 50%, transparent );
1622 1622 }
1623 1623
1624 1624 .os-my-wordpress__footprint-cell--l3 {
1625 - background: rgba( 34, 113, 177, 0.75 );
1625 + background: color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 75%, transparent );
1626 1626 }
1627 1627
1628 1628 .os-my-wordpress__footprint-cell--l4 {
1629 1629 background: var( --wp-admin-theme-color, #2271b1 );
@@ -1693,9 +1693,9 @@
1693 1693 .os-my-wordpress__footprint-bar {
1694 1694 background: linear-gradient(
1695 1695 180deg,
1696 1696 var( --wp-admin-theme-color, #2271b1 ) 0%,
1697 - rgba( 34, 113, 177, 0.55 ) 100%
1697 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 55%, transparent ) 100%
1698 1698 );
1699 1699 border-radius: 3px 3px 0 0;
1700 1700 min-height: 2px;
1701 1701 transition: opacity 0.2s ease;
@@ -1727,10 +1727,10 @@
1727 1727 text-align: center;
1728 1728 padding: 20px 24px;
1729 1729 background: linear-gradient(
1730 1730 135deg,
1731 - rgba( 34, 113, 177, 0.10 ),
1732 - rgba( 34, 113, 177, 0.02 )
1731 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 10%, transparent ),
1732 + color-mix( in srgb, var( --wp-admin-theme-color, #2271b1 ) 2%, transparent )
1733 1733 );
1734 1734 }
1735 1735
1736 1736 .os-my-wordpress__footprint-callout-label {
@@ -2155,17 +2155,8 @@
2155 2155 overflow: hidden;
2156 2156 box-sizing: border-box;
2157 2157 }
2158 2158
2159 -/* The framework is opt-in but the section is always listed, so with
2160 - the option off the surface paints inert rather than vanishing.
2161 - Only the sidebar dims: the detail pane holds the empty state
2162 - explaining why, and the one button that undoes it — dimming the way
2163 - out along with everything else is how a disabled screen becomes a
2164 - dead end. */
2165 -.dm-agents.is-disabled .dm-agents__sidebar {
2166 - opacity: 0.6;
2167 -}
2168 2159
2169 2160 /* Section-level loading — same scale curve as the My WordPress
2170 2161 preview loader and the window-loading overlay, instead of the bare
2171 2162 48px component default. */
@@ -2180,103 +2171,8 @@
2180 2171 .dm-agents__loading os-spinner {
2181 2172 --os-ui-spinner-size: clamp( 96px, 14vw, 192px );
2182 2173 }
2183 2174
2184 -.dm-agents__layout {
2185 - display: flex;
2186 - flex: 1;
2187 - min-height: 0;
2188 - gap: 12px;
2189 -}
2190 -
2191 -/* Sidebar column: a fixed "Create agent" header over the scrolling
2192 - list. The button used to be the list's last child, which put it out
2193 - of reach on any site with enough agents to need it. */
2194 -.dm-agents__sidebar {
2195 - display: flex;
2196 - flex-direction: column;
2197 - flex: 0 0 260px;
2198 - /* `min-width: auto` on a flex item resolves to its min-content
2199 - width, and the rows carry long `white-space: nowrap` descriptions
2200 - — without this the column ignores its 260px basis and eats the
2201 - detail pane. The scroll container used to be this item, whose
2202 - non-visible overflow zeroed the minimum for free. */
2203 - min-width: 0;
2204 - min-height: 0;
2205 - border-inline-end: 1px solid var( --os-border, rgba( 0, 0, 0, 0.08 ) );
2206 -}
2207 -
2208 -.dm-agents__list-toolbar {
2209 - flex: none;
2210 - display: flex;
2211 - padding-block-end: 8px;
2212 - padding-inline-end: 8px;
2213 -}
2214 -
2215 -.dm-agents__list-toolbar .dm-agents__create {
2216 - flex: 1;
2217 -}
2218 -
2219 -.dm-agents__list {
2220 - display: flex;
2221 - flex-direction: column;
2222 - gap: 4px;
2223 - flex: 1;
2224 - min-height: 0;
2225 - overflow-y: auto;
2226 - padding-inline-end: 4px;
2227 -}
2228 -
2229 -.dm-agents__row {
2230 - display: flex;
2231 - align-items: center;
2232 - gap: 8px;
2233 - padding: 8px;
2234 - border-radius: 8px;
2235 - cursor: pointer;
2236 -}
2237 -
2238 -.dm-agents__row:hover {
2239 - background: var( --os-hover, rgba( 0, 0, 0, 0.06 ) );
2240 -}
2241 -
2242 -.dm-agents__row.is-selected {
2243 - background: var( --os-selected, rgba( 0, 0, 0, 0.1 ) );
2244 -}
2245 -
2246 -.dm-agents__row-avatar {
2247 - width: 32px;
2248 - height: 32px;
2249 - border-radius: 50%;
2250 - /* Placeholder behind the avatar image while it loads — follows the
2251 - palette so it isn't a white disc on a dark station. */
2252 - background: var( --os-ui-surface-elevated, #fff );
2253 - flex: none;
2254 -}
2255 -
2256 -.dm-agents__row-text {
2257 - display: flex;
2258 - flex-direction: column;
2259 - min-width: 0;
2260 - flex: 1;
2261 -}
2262 -
2263 -.dm-agents__row-name {
2264 - font-weight: 600;
2265 - white-space: nowrap;
2266 - overflow: hidden;
2267 - text-overflow: ellipsis;
2268 -}
2269 -
2270 -.dm-agents__row-desc {
2271 - font-size: 12px;
2272 - opacity: 0.65;
2273 - white-space: nowrap;
2274 - overflow: hidden;
2275 - text-overflow: ellipsis;
2276 -}
2277 -
2278 -
2279 2175 .dm-agents__detail {
2280 2176 flex: 1;
2281 2177 min-width: 0;
2282 2178 overflow-y: auto;
@@ -2385,31 +2281,156 @@
2385 2281 font-size: 12px;
2386 2282 opacity: 0.7;
2387 2283 }
2388 2284
2285 +/* Role first: least privilege is the decision, so the control holds
2286 + the mockup's width instead of stretching into a landing strip. */
2287 +.dm-agents__role-select {
2288 + max-width: 280px;
2289 +}
2290 +
2291 +/* The ability filter. Sized like the role select rather than the
2292 + full pane: it sits above a list of rules, and a search box as wide
2293 + as the rules reads as another one of them. */
2294 +.dm-agents__ability-search {
2295 + display: block;
2296 + max-width: 320px;
2297 + margin: 12px 0 4px;
2298 +}
2299 +
2300 +/* Each category is a native disclosure. `<details>` because the
2301 + behaviour is exactly what it is for: keyboard, screen-reader
2302 + semantics and the open/closed state all arrive for free, and the
2303 + only thing left to write is the costume. */
2304 +.dm-agents__ability-group {
2305 + border-bottom: 1px solid var( --os-border, rgba( 0, 0, 0, 0.08 ) );
2306 +}
2307 +
2308 +.dm-agents__ability-group:last-of-type {
2309 + border-bottom: 0;
2310 +}
2311 +
2389 2312 .dm-agents__category {
2390 - margin: 8px 0 0;
2391 - font-size: 12px;
2313 + margin: 18px 0 2px;
2314 + font-family: var( --os-ui-font-mono, ui-monospace, monospace );
2315 + font-size: 11px;
2316 + font-weight: 500;
2392 2317 text-transform: uppercase;
2393 - letter-spacing: 0.04em;
2394 - opacity: 0.6;
2318 + letter-spacing: 0.08em;
2319 + color: var( --os-ui-fg-muted, #646970 );
2395 2320 }
2396 2321
2322 +/* A `<summary>` is a button, so it gets a button's affordances: a
2323 + pointer, a hover, and a focus ring that is visible on the dark
2324 + surface the section is drawn on. */
2325 +summary.dm-agents__category {
2326 + display: flex;
2327 + align-items: center;
2328 + gap: 8px;
2329 + margin: 0;
2330 + padding: 10px 0;
2331 + cursor: pointer;
2332 + list-style: none;
2333 + user-select: none;
2334 +}
2335 +
2336 +summary.dm-agents__category::-webkit-details-marker {
2337 + display: none;
2338 +}
2339 +
2340 +/* The marker is drawn here rather than left to the UA so it can be
2341 + the same triangle in every browser and turn with the disclosure.
2342 + Rotation only: a transform, so opening a group of forty rows
2343 + costs no layout. */
2344 +summary.dm-agents__category::before {
2345 + content: '';
2346 + flex: none;
2347 + width: 0;
2348 + height: 0;
2349 + border-inline-start: 5px solid currentcolor;
2350 + border-block: 4px solid transparent;
2351 + transition: transform 120ms ease;
2352 +}
2353 +
2354 +.dm-agents__ability-group[ open ] > summary.dm-agents__category::before {
2355 + transform: rotate( 90deg );
2356 +}
2357 +
2358 +@media ( prefers-reduced-motion: reduce ) {
2359 + summary.dm-agents__category::before {
2360 + transition: none;
2361 + }
2362 +}
2363 +
2364 +summary.dm-agents__category:hover {
2365 + color: var( --os-ui-fg, #1e1e1e );
2366 +}
2367 +
2368 +summary.dm-agents__category:focus-visible {
2369 + outline: 2px solid var( --os-ui-accent, #3858e9 );
2370 + outline-offset: 2px;
2371 + border-radius: 4px;
2372 +}
2373 +
2374 +.dm-agents__category-name {
2375 + flex: 1 1 auto;
2376 +}
2377 +
2378 +/* "3 of 12" when some are ticked, otherwise just the size of the
2379 + group. The count is why a closed group is still informative:
2380 + collapsing must not hide the fact that something in there is
2381 + switched on. */
2382 +.dm-agents__category-count {
2383 + flex: none;
2384 + font-variant-numeric: tabular-nums;
2385 + opacity: 0.75;
2386 +}
2387 +
2388 +/* One ability per row, ruled like the mockup: tick and name on the
2389 + left, badge on the right, the description indented under the name
2390 + (the checkbox column is the control's own 26px). */
2397 2391 .dm-agents__ability {
2398 2392 display: grid;
2399 2393 grid-template-columns: 1fr auto;
2400 - gap: 2px 8px;
2401 - align-items: center;
2402 - padding: 4px 0;
2394 + gap: 2px 10px;
2395 + align-items: start;
2396 + padding: 11px 0;
2397 + border-bottom: 1px solid var( --os-border, rgba( 0, 0, 0, 0.08 ) );
2403 2398 }
2404 2399
2400 +.dm-agents__ability:last-of-type {
2401 + border-bottom: 0;
2402 +}
2403 +
2405 2404 .dm-agents__ability-desc {
2406 2405 grid-column: 1 / -1;
2407 2406 margin: 0;
2408 - font-size: 12px;
2409 - opacity: 0.6;
2407 + padding-inline-start: 26px;
2408 + font-size: 12.5px;
2409 + color: var( --os-ui-fg-muted, #646970 );
2410 2410 }
2411 2411
2412 +/* Access badges in the instrument voice. The palette's own warning
2413 + tokens carry the pale-yellow "can modify"; all this changes is the
2414 + costume: mono, uppercase, an outline instead of a wash. */
2415 +.dm-agents__ability os-badge {
2416 + --os-ui-badge-font: 500 10px/1.6 var( --os-ui-font-mono, ui-monospace, monospace );
2417 + --os-ui-badge-dot-size: 0;
2418 + --os-ui-badge-gap: 0;
2419 + --os-ui-badge-padding: 3px 8px;
2420 + --os-ui-badge-bg: transparent;
2421 + --os-ui-badge-border: 1px solid var( --os-border, rgba( 0, 0, 0, 0.12 ) );
2422 + text-transform: uppercase;
2423 + letter-spacing: 0.06em;
2424 + white-space: nowrap;
2425 + margin-top: 2px;
2426 +}
2427 +
2428 +.dm-agents__ability os-badge[ tone='warning' ] {
2429 + --os-ui-badge-border: 1px solid
2430 + var( --os-ui-warning-border, rgba( 154, 103, 0, 0.4 ) );
2431 +}
2432 +
2412 2433 .dm-agents__trigger {
2413 2434 border: 1px solid var( --os-border, rgba( 0, 0, 0, 0.08 ) );
2414 2435 border-radius: 8px;
2415 2436 padding: 8px 10px;
@@ -2423,15 +2444,12 @@
2423 2444 align-items: center;
2424 2445 gap: 8px;
2425 2446 }
2426 2447
2427 -.dm-agents__trigger-summary {
2428 - flex: 1;
2448 +.dm-agents__trigger-desc {
2449 + margin: 0;
2429 2450 font-size: 12px;
2430 - opacity: 0.65;
2431 - white-space: nowrap;
2432 - overflow: hidden;
2433 - text-overflow: ellipsis;
2451 + opacity: 0.75;
2434 2452 }
2435 2453
2436 2454 .dm-agents__trigger-config {
2437 2455 display: flex;
@@ -2441,5 +2459,496 @@
2441 2459
2442 2460 .dm-agents__actions {
2443 2461 display: flex;
2444 2462 gap: 8px;
2463 + align-items: center;
2464 + flex-wrap: wrap;
2465 + margin-block-start: 12px;
2466 +}
2467 +
2468 +/* ---------------------------------------------------------------------
2469 + The cast
2470 + ------------------------------------------------------------------ */
2471 +
2472 +/* One view at a time: the grid, an agent, or the wizard. A sidebar of
2473 + faces next to a detail form would leave neither enough room, and the
2474 + whole point of the grid is that the faces are big enough to tell
2475 + apart. */
2476 +.dm-agents__view {
2477 + display: flex;
2478 + flex-direction: column;
2479 + flex: 1;
2480 + min-height: 0;
2481 + overflow-y: auto;
2482 + gap: 12px;
2483 +}
2484 +
2485 +.dm-agents__cast-head {
2486 + display: flex;
2487 + align-items: baseline;
2488 + gap: 8px;
2489 +}
2490 +
2491 +.dm-agents__cast-head h3 {
2492 + margin: 0;
2493 +}
2494 +
2495 +.dm-agents__cast-count {
2496 + font-family: var( --os-ui-font-mono, ui-monospace, monospace );
2497 + font-size: 12px;
2498 + color: var( --os-ui-fg-muted, #646970 );
2499 +}
2500 +
2501 +.dm-agents__cast {
2502 + display: grid;
2503 + gap: 16px;
2504 + grid-template-columns: repeat( auto-fill, minmax( 288px, 1fr ) );
2505 + align-content: start;
2506 +}
2507 +
2508 +/* The card reacts like the mockup's: a lift and a brighter edge.
2509 + Transform and border-color only — both cheap, and the same pair the
2510 + mockup transitions. Document styles win over the component's own
2511 + :host rules, which is the sanctioned way to restyle a host. */
2512 +.dm-agents__cast-card,
2513 +.dm-agents__cast-new {
2514 + --os-ui-card-padding: 20px 18px 16px;
2515 + transition: border-color 0.18s ease, transform 0.18s ease;
2516 +}
2517 +
2518 +.dm-agents__cast-card:hover,
2519 +.dm-agents__cast-card:focus-within {
2520 + border-color: var( --os-ui-border-strong, #8c8f94 );
2521 + transform: translateY( -2px );
2522 +}
2523 +
2524 +/* The dashed door, same as the mockup's crew-new card. */
2525 +.dm-agents__cast-new {
2526 + border-style: dashed;
2527 + --os-ui-card-bg: var( --os-ui-surface-subtle, transparent );
2528 +}
2529 +
2530 +/* The crew breathes. Transform only, staggered so five faces do not
2531 + bob in lockstep, and gone entirely under reduced motion. */
2532 +@media ( prefers-reduced-motion: no-preference ) {
2533 + .dm-agents__cast-card .dm-agents__cast-face {
2534 + animation: dm-agents-bob 6s ease-in-out infinite;
2535 + }
2536 + .dm-agents__cast-card:nth-child( 2n ) .dm-agents__cast-face {
2537 + animation-duration: 7.2s;
2538 + animation-delay: -1.4s;
2539 + }
2540 + .dm-agents__cast-card:nth-child( 3n ) .dm-agents__cast-face {
2541 + animation-duration: 6.6s;
2542 + animation-delay: -2.8s;
2543 + }
2544 +}
2545 +
2546 +@keyframes dm-agents-bob {
2547 + 0%,
2548 + 100% {
2549 + transform: translateY( 0 );
2550 + }
2551 + 50% {
2552 + transform: translateY( -4px );
2553 + }
2554 +}
2555 +
2556 +/* The column lives on a wrapper we own, not on the host: the slotted
2557 + children sit inside the card's own container, so a flex rule on the
2558 + host never reaches them and the role badges land wherever the
2559 + description's line count leaves them. */
2560 +.dm-agents__cast-inner {
2561 + display: flex;
2562 + flex-direction: column;
2563 + align-items: center;
2564 + text-align: center;
2565 + gap: 2px;
2566 + height: 100%;
2567 +}
2568 +
2569 +/* The faces are the loud part of this surface, and deliberately so:
2570 + agent identity is the one place the station spends the mesh budget
2571 + on something other than a hero CTA. A cast has to be legible at a
2572 + glance, which is exactly what a flat accent cannot do. */
2573 +.dm-agents__cast-face {
2574 + width: 118px;
2575 + height: 118px;
2576 + margin: -10px 0 6px;
2577 + flex: none;
2578 +}
2579 +
2580 +.dm-agents__cast-name {
2581 + font-size: 17px;
2582 + font-weight: 600;
2583 + color: var( --os-ui-fg, #1d2327 );
2584 +}
2585 +
2586 +/* The voice line, in the instrument register: this is metadata about
2587 + the agent, not prose from it. */
2588 +.dm-agents__cast-vibes {
2589 + font-family: var( --os-ui-font-mono, ui-monospace, monospace );
2590 + font-size: 11.5px;
2591 + color: var( --os-ui-accent-strong, #2271b1 );
2592 +}
2593 +
2594 +.dm-agents__cast-good {
2595 + font-size: 13px;
2596 + color: var( --os-ui-fg-muted, #646970 );
2597 + margin-block: 4px 14px;
2598 + flex: 1;
2599 +}
2600 +
2601 +/* The role pill in the instrument voice: mono, uppercase, no status
2602 + dot — this is a fact about the agent, not a state to monitor. The
2603 + custom properties are the component's own theming hooks; the
2604 + inherited text properties flow into its shadow label. */
2605 +.dm-agents__cast-card os-badge {
2606 + --os-ui-badge-font: 500 11px/1.6 var( --os-ui-font-mono, ui-monospace, monospace );
2607 + --os-ui-badge-dot-size: 0;
2608 + --os-ui-badge-gap: 0;
2609 + --os-ui-badge-padding: 3px 10px;
2610 + text-transform: uppercase;
2611 + letter-spacing: 0.08em;
2612 +}
2613 +
2614 +/* The framework-off bar: the section's status and its one action, on
2615 + one line above the crew it would hire. It is deliberately not an
2616 + `os-empty-state` — that block is centred, icon-led and paragraph-
2617 + shaped, which is exactly the wall of text the cast replaced, and at
2618 + five cards tall it would push the button that undoes the situation
2619 + off the bottom of the window. `flex: none` because `.dm-agents__view`
2620 + is a scrolling flex column and the bar must not absorb the slack. */
2621 +.dm-agents__off-head {
2622 + display: flex;
2623 + align-items: center;
2624 + justify-content: space-between;
2625 + flex-wrap: wrap;
2626 + flex: none;
2627 + gap: 8px 16px;
2628 + padding: 12px 14px;
2629 + border-radius: 10px;
2630 + background: var( --os-ui-surface-elevated, #fff );
2631 + border: 1px solid var( --os-border, rgba( 0, 0, 0, 0.08 ) );
2632 +}
2633 +
2634 +.dm-agents__off-copy {
2635 + min-width: 0;
2636 +}
2637 +
2638 +.dm-agents__off-copy h3 {
2639 + margin: 0;
2640 +}
2641 +
2642 +.dm-agents__off-copy p {
2643 + margin: 2px 0 0;
2644 + font-size: 13px;
2645 + color: var( --os-ui-fg-muted, #646970 );
2646 +}
2647 +
2648 +/* The cast the site would get, drawn while the framework is off.
2649 + Dimmed as a whole rather than desaturated: the five hues ARE the
2650 + argument this state is making, and a greyscale filter would flatten
2651 + the crew into five identical blobs on the way to saying "not yet".
2652 + Opacity says inactive and leaves the faces telling each other apart.
2653 +
2654 + `pointer-events` is belt and braces — the cards are rendered without
2655 + `interactive` and without a click handler, so there is nothing to
2656 + press. It exists so a hover state cannot promise otherwise. */
2657 +.dm-agents__cast--preview {
2658 + opacity: 0.6;
2659 + pointer-events: none;
2660 +}
2661 +
2662 +.dm-agents__cast-new .dm-agents__cast-plus {
2663 + display: grid;
2664 + place-items: center;
2665 + width: 118px;
2666 + height: 118px;
2667 + margin: -10px 0 6px;
2668 + border-radius: 50%;
2669 + border: 1.5px dashed var( --os-ui-border-strong, #8c8f94 );
2670 + font-size: 30px;
2671 + font-weight: 300;
2672 + line-height: 1;
2673 + color: var( --os-ui-fg-muted, #646970 );
2674 +}
2675 +
2676 +/* ---------------------------------------------------------------------
2677 + The wizard
2678 + ------------------------------------------------------------------ */
2679 +
2680 +.dm-agents__wizard {
2681 + display: flex;
2682 + flex-direction: column;
2683 + gap: 10px;
2684 +}
2685 +
2686 +.dm-agents__wiz-head {
2687 + display: flex;
2688 + align-items: center;
2689 + justify-content: space-between;
2690 + gap: 8px 12px;
2691 + flex-wrap: wrap;
2692 +}
2693 +
2694 +.dm-agents__wiz-head h3 {
2695 + margin: 0;
2696 +}
2697 +
2698 +/* The trail wears the instrument voice: mono uppercase labels, 22px
2699 + dots, a thin rule between stations. All of it goes through the
2700 + component's own theming hooks; the host elements live in this light
2701 + DOM, so the per-state overrides below can select them directly. */
2702 +.dm-agents__trail {
2703 + margin-block: 6px 14px;
2704 + --os-ui-steps-gap: 10px;
2705 + --os-ui-step-gap: 7px;
2706 + --os-ui-step-chip-size: 22px;
2707 + --os-ui-step-chip-font-size: 11px;
2708 + --os-ui-step-chip-family: var( --os-ui-font-mono, ui-monospace, monospace );
2709 + --os-ui-step-title-size: 11px;
2710 + --os-ui-step-title-family: var( --os-ui-font-mono, ui-monospace, monospace );
2711 + --os-ui-step-title-transform: uppercase;
2712 + --os-ui-step-title-spacing: 0.08em;
2713 +}
2714 +
2715 +/* A station you have not reached is an outline, not a filled dot: the
2716 + mesh chip is where you ARE, and it only reads that way if it is the
2717 + only one lit. */
2718 +.dm-agents__trail os-step:not( [ done ] ):not( [ current ] ) {
2719 + --os-ui-step-chip-bg: transparent;
2720 + --os-ui-step-chip-border: 1px solid var( --os-ui-border-strong, #8c8f94 );
2721 + --os-ui-step-chip-fg: var( --os-ui-fg-muted, #646970 );
2722 +}
2723 +
2724 +/* Done is quiet: a filled tick on the elevated surface, muted like its
2725 + label. It reads as history, not as a second highlight. */
2726 +.dm-agents__trail os-step[ done ] {
2727 + --os-ui-step-chip-done-bg: var( --os-ui-surface-elevated, #f0f0f1 );
2728 + --os-ui-step-chip-fg: var( --os-ui-fg-muted, #646970 );
2729 +}
2730 +
2731 +.dm-agents__wiz-heading {
2732 + margin: 12px 0 2px;
2733 + font-size: 16px;
2734 + font-weight: 600;
2735 + color: var( --os-ui-fg, #1d2327 );
2736 +}
2737 +
2738 +/* The door. Five complete agents already ship with the plugin, and
2739 + until now the create flow showed them to nobody. */
2740 +.dm-agents__starters {
2741 + display: grid;
2742 + gap: 12px;
2743 + grid-template-columns: repeat( auto-fill, minmax( 148px, 1fr ) );
2744 + margin-block: 8px 16px;
2745 +}
2746 +
2747 +.dm-agents__starter {
2748 + display: flex;
2749 + flex-direction: column;
2750 + align-items: center;
2751 + text-align: center;
2752 + gap: 3px;
2753 + --os-ui-card-padding: 16px 14px;
2754 + --os-ui-card-radius: 10px;
2755 + --os-ui-card-bg: var( --os-ui-surface-subtle, transparent );
2756 + transition: border-color 0.18s ease;
2757 +}
2758 +
2759 +.dm-agents__starter:hover,
2760 +.dm-agents__starter:focus-within {
2761 + border-color: var( --os-ui-border-strong, #8c8f94 );
2762 +}
2763 +
2764 +.dm-agents__starter-face {
2765 + width: 76px;
2766 + height: 76px;
2767 + margin: -8px 0 4px;
2768 + flex: none;
2769 +}
2770 +
2771 +.dm-agents__starter-name {
2772 + font-size: 14px;
2773 + font-weight: 500;
2774 + color: var( --os-ui-fg, #1d2327 );
2775 +}
2776 +
2777 +.dm-agents__starter-vibes {
2778 + font-family: var( --os-ui-font-mono, ui-monospace, monospace );
2779 + font-size: 11.5px;
2780 + color: var( --os-ui-fg-muted, #646970 );
2781 +}
2782 +
2783 +/* Meet: the portrait beside the fields, so the thing being named is
2784 + visible while it is being named. */
2785 +.dm-agents__meet {
2786 + display: grid;
2787 + gap: 20px;
2788 + grid-template-columns: 220px 1fr;
2789 + align-items: start;
2790 +}
2791 +
2792 +/* The character card. Sunken rather than subtle: the portrait is the
2793 + hero of this step, and the mockup floats it on the darkest surface
2794 + so the face's own glow does the framing. */
2795 +.dm-agents__portrait {
2796 + display: flex;
2797 + flex-direction: column;
2798 + align-items: center;
2799 + gap: 10px;
2800 + padding: 20px 14px 14px;
2801 + border: 1px solid var( --os-border, rgba( 0, 0, 0, 0.08 ) );
2802 + border-radius: var( --os-ui-card-radius, 10px );
2803 + background: var( --os-ui-surface-sunken, #f6f7f7 );
2804 +}
2805 +
2806 +.dm-agents__portrait-face {
2807 + width: 176px;
2808 + height: 176px;
2809 + max-width: 100%;
2810 + margin-top: -12px;
2811 +}
2812 +
2813 +/* What this face is, in two words. */
2814 +.dm-agents__portrait-chips {
2815 + display: flex;
2816 + gap: 6px;
2817 + flex-wrap: wrap;
2818 + justify-content: center;
2819 +}
2820 +
2821 +.dm-agents__faces {
2822 + display: grid;
2823 + grid-template-columns: repeat( 6, 1fr );
2824 + gap: 2px;
2825 + width: 100%;
2826 +}
2827 +
2828 +.dm-agents__face-pick {
2829 + display: grid;
2830 + place-items: center;
2831 + padding: 2px;
2832 + border: 1px solid transparent;
2833 + border-radius: 8px;
2834 + background: none;
2835 + cursor: pointer;
2836 +}
2837 +
2838 +.dm-agents__face-pick img {
2839 + width: 100%;
2840 + height: auto;
2841 + display: block;
2842 +}
2843 +
2844 +.dm-agents__face-pick:hover {
2845 + border-color: var( --os-ui-border-strong, #8c8f94 );
2846 +}
2847 +
2848 +.dm-agents__face-pick.is-picked {
2849 + border-color: var( --os-ui-accent, #2271b1 );
2850 +}
2851 +
2852 +.dm-agents__face-pick:focus-visible {
2853 + outline: var( --os-ui-focus-ring, 2px solid #2271b1 );
2854 + outline-offset: 1px;
2855 +}
2856 +
2857 +.dm-agents__meet-fields {
2858 + display: flex;
2859 + flex-direction: column;
2860 + gap: 10px;
2861 + min-width: 0;
2862 +}
2863 +
2864 +/* Launch: one card, the brand's card radius, floating on the darkest
2865 + surface like the portrait it echoes. */
2866 +.dm-agents__summary {
2867 + display: grid;
2868 + grid-template-columns: 106px 1fr;
2869 + gap: 18px;
2870 + align-items: start;
2871 + --os-ui-card-padding: 18px;
2872 + --os-ui-card-radius: 10px;
2873 + --os-ui-card-bg: var( --os-ui-surface-sunken, #f6f7f7 );
2874 +}
2875 +
2876 +.dm-agents__summary-face {
2877 + width: 106px;
2878 + height: 106px;
2879 + flex: none;
2880 +}
2881 +
2882 +.dm-agents__summary-text h4 {
2883 + margin: 0 0 2px;
2884 + font-size: 17px;
2885 +}
2886 +
2887 +.dm-agents__summary-vibes {
2888 + font-family: var( --os-ui-font-mono, ui-monospace, monospace );
2889 + font-size: 11.5px;
2890 + color: var( --os-ui-accent-strong, #2271b1 );
2891 + margin: 0 0 6px;
2892 +}
2893 +
2894 +.dm-agents__summary-desc {
2895 + margin: 0;
2896 + font-size: 13px;
2897 + color: var( --os-ui-fg-muted, #646970 );
2898 +}
2899 +
2900 +.dm-agents__chips {
2901 + display: flex;
2902 + flex-wrap: wrap;
2903 + gap: 6px;
2904 + margin-block-start: 10px;
2905 +}
2906 +
2907 +/* What the agent will actually be told, under the chips. Clamped: a
2908 + summary card quotes the instructions, it does not host them. */
2909 +.dm-agents__summary-instr {
2910 + margin: 10px 0 0;
2911 + font-size: 13px;
2912 + color: var( --os-ui-fg-muted, #646970 );
2913 + display: -webkit-box;
2914 + -webkit-line-clamp: 3;
2915 + -webkit-box-orient: vertical;
2916 + overflow: hidden;
2917 +}
2918 +
2919 +/* Identity chips — role, abilities, silhouette, hue — all wear the
2920 + instrument voice: these are facts about the character, stamped
2921 + rather than said. */
2922 +.dm-agents__chips os-chip,
2923 +.dm-agents__portrait-chips os-chip {
2924 + --os-ui-chip-font-size: 10.5px;
2925 + --os-ui-chip-font-weight: 500;
2926 + --os-ui-chip-bg: transparent;
2927 + --os-ui-chip-fg: var( --os-ui-fg-muted, #646970 );
2928 + --os-ui-chip-border: 1px solid var( --os-border, rgba( 0, 0, 0, 0.12 ) );
2929 + font-family: var( --os-ui-font-mono, ui-monospace, monospace );
2930 + text-transform: uppercase;
2931 + letter-spacing: 0.06em;
2932 +}
2933 +
2934 +.dm-agents__spacer {
2935 + flex: 1;
2936 +}
2937 +
2938 +@media ( max-width: 640px ) {
2939 + .dm-agents__meet,
2940 + .dm-agents__summary {
2941 + grid-template-columns: 1fr;
2942 + }
2943 + .dm-agents__portrait-face {
2944 + width: 128px;
2945 + height: 128px;
2946 + }
2947 +}
2948 +
2949 +/* The way back to the grid. The window's own breadcrumb goes UP to the
2950 + folder, which is a different journey: this one returns to the cast. */
2951 +.dm-agents__back {
2952 + align-self: flex-start;
2953 + margin-block-end: 4px;
2445 2954 }