PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.12
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.12
1.1.12 1.1.11 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 All 36 releases
← All changes | assets/css/desktop.css +374 -25 1.1.7 → 1.1.12 View file →
@@ -226,17 +226,9 @@
226 226 }
227 227
228 228 body.os-active.os-admin-bar-dynamic #wpadminbar:hover,
229 229 body.os-active.os-admin-bar-dynamic #wpadminbar:focus-within,
230 -body.os-active.os-admin-bar-dynamic #wpadminbar:active,
231 -/*
232 - * …and while the notch is being used. The notch hangs from the same
233 - * edge and steps down to sit under the bar when it appears (see
234 - * notch.css), so letting the bar retract out from over it mid-reach
235 - * would drop the notch back up under the pointer.
236 - */
237 -body.os-active.os-admin-bar-dynamic:has( .os-notch:hover ) #wpadminbar,
238 -body.os-active.os-admin-bar-dynamic:has( .os-notch:focus-visible ) #wpadminbar {
230 +body.os-active.os-admin-bar-dynamic #wpadminbar:active {
239 231 inset-block-start: 0 !important;
240 232 }
241 233
242 234 /*
@@ -359,8 +351,12 @@
359 351 * W inside, so the two columns share an axis. `--os-dock-width`
360 352 * is now set on :root (see settings.ts → apply()) so it reaches
361 353 * siblings of #os-shell like the admin bar.
362 354 */
355 +body.os-active #wpadminbar #wp-admin-bar-menu-toggle {
356 + display: none;
357 +}
358 +
363 359 body.os-active #wpadminbar #wp-admin-bar-wp-logo {
364 360 width: var( --os-dock-width, 56px );
365 361 }
366 362
@@ -828,9 +824,10 @@
828 824 background-image: var(--os-tile-image, none);
829 825 background-repeat: var(--os-tile-image-repeat, no-repeat);
830 826 background-size: var(--os-tile-image-size, auto);
831 827 background-position: var(--os-tile-image-position, center);
832 - color: var(--os-fg, #fff);
828 + /* Also the glyph: silhouette art is masked with `currentColor`. */
829 + color: var(--os-desk-fg, var(--os-fg, #fff));
833 830 cursor: pointer;
834 831 border-radius: 8px;
835 832 transition: background-color 0.15s ease;
836 833 /* Positioning context for `.os-icon__badge`. */
@@ -892,9 +889,9 @@
892 889 .os-icon:focus-visible {
893 890 /* background-COLOR, not the shorthand: the shorthand would reset
894 891 * the ICON_TILE texture declared above, so a themed tile would
895 892 * vanish on hover. */
896 - background-color: rgba(255, 255, 255, 0.12);
893 + background-color: var(--os-icon-hover-bg, rgba(255, 255, 255, 0.12));
897 894 outline: none;
898 895 }
899 896
900 897 .os-icon:focus-visible {
@@ -918,12 +915,20 @@
918 915 max-height: 48px;
919 916 object-fit: contain;
920 917 }
921 918
919 +.os-icon__image {
920 + filter: var(--os-icon-glyph-shadow, none);
921 +}
922 +
922 923 .os-icon__label {
923 924 font-size: 12px;
924 925 text-align: center;
925 - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
926 + background: var(--os-icon-label-bg, transparent);
927 + border-radius: 6px;
928 + /* Inline only: a two-line caption already fills the 96px grid row. */
929 + padding: 0 6px;
930 + text-shadow: var(--os-icon-label-shadow, 0 1px 2px rgba(0, 0, 0, 0.45));
926 931 line-height: 1.2;
927 932 word-break: break-word;
928 933 }
929 934
@@ -1049,10 +1054,12 @@
1049 1054 .os-widgets__card-close {
1050 1055 position: absolute;
1051 1056 top: 6px;
1052 1057 inset-inline-end: 6px;
1053 - width: 22px;
1054 - height: 22px;
1058 + /* 24px is the WCAG 2.2 SC 2.5.8 floor. The glyph inside is unchanged;
1059 + only the target grows. */
1060 + width: 24px;
1061 + height: 24px;
1055 1062 display: flex;
1056 1063 align-items: center;
1057 1064 justify-content: center;
1058 1065 padding: 0;
@@ -1072,8 +1079,21 @@
1072 1079 .os-widgets__card-close:focus-visible {
1073 1080 opacity: 1;
1074 1081 }
1075 1082
1083 +/*
1084 + * The corner close button rests at `opacity: 0` and only the card's
1085 + * hover reveals it, so on touch it is invisible and the widget cannot
1086 + * be dismissed at all. Rest it at the same 0.7 the chrome header's
1087 + * close button uses there, rather than a full 1, so a card that is
1088 + * only being read does not wear a hard × in its corner.
1089 + */
1090 +@media ( hover: none ) {
1091 + .os-widgets__card-close {
1092 + opacity: 0.7;
1093 + }
1094 +}
1095 +
1076 1096 .os-widgets__card-close:hover {
1077 1097 background: var( --os-ui-danger, #d63638 );
1078 1098 color: var( --os-ui-fg-on-accent, #fff );
1079 1099 }
@@ -1137,10 +1157,10 @@
1137 1157 corner-absolute — reset position + always-visible opacity. */
1138 1158 .os-widgets__chrome .os-widgets__card-close {
1139 1159 position: static;
1140 1160 opacity: 0.7;
1141 - width: 20px;
1142 - height: 20px;
1161 + width: 24px;
1162 + height: 24px;
1143 1163 }
1144 1164
1145 1165 .os-widgets__chrome .os-widgets__card-close:hover,
1146 1166 .os-widgets__chrome .os-widgets__card-close:focus-visible {
@@ -1154,9 +1174,10 @@
1154 1174 * expose it (tapping it on a docked card would be a confusing
1155 1175 * no-op). The DOM node stays mounted either way so state flips
1156 1176 * don't rebuild chrome.
1157 1177 *
1158 - * Styling mirrors the inline close button: 20×20 round tile,
1178 + * Styling mirrors the inline close button: 24×24 round tile
1179 + * (the WCAG 2.2 SC 2.5.8 target-size floor),
1159 1180 * dimmed by default, full-opacity on hover / focus. Distinct hover
1160 1181 * color (theme accent, not red) signals "put back" vs. "remove."
1161 1182 */
1162 1183 .os-widgets__card-redock {
@@ -1167,10 +1188,10 @@
1167 1188 border: 0;
1168 1189 background: var( --os-ui-scrim, rgba( 0, 0, 0, 0.55 ) );
1169 1190 color: rgba( 255, 255, 255, 0.75 );
1170 1191 border-radius: 50%;
1171 - width: 20px;
1172 - height: 20px;
1192 + width: 24px;
1193 + height: 24px;
1173 1194 cursor: pointer;
1174 1195 opacity: 0.7;
1175 1196 transition:
1176 1197 opacity 0.15s ease,
@@ -1185,9 +1206,9 @@
1185 1206 .os-widgets__card-redock:hover,
1186 1207 .os-widgets__card-redock:focus-visible {
1187 1208 opacity: 1;
1188 1209 background: var( --wp-admin-theme-color, #2271b1 );
1189 - color: var( --os-ui-fg-on-accent, #fff );
1210 + color: var( --os-ui-accent-ink, var( --os-ui-fg-on-accent, #fff ) );
1190 1211 }
1191 1212
1192 1213 /*
1193 1214 * Floating widgets — absolute-positioned, inline top/left/width/height
@@ -1325,12 +1346,17 @@
1325 1346 align-items: center;
1326 1347 justify-content: center;
1327 1348 gap: 7px;
1328 1349 pointer-events: none;
1329 - background: transparent;
1330 - border: 1px dashed rgba( 255, 255, 255, 0.22 );
1350 + /* `.os-widgets__card`'s glass, to the number: the pill trails a
1351 + stack of those cards. Its dashed edge is what makes it a slot. */
1352 + background: var( --os-widgets-add-bg, transparent );
1353 + backdrop-filter: blur( 18px ) saturate( 140% );
1354 + -webkit-backdrop-filter: blur( 18px ) saturate( 140% );
1355 + box-shadow: 0 8px 28px var( --os-widgets-add-shadow, rgba( 0, 0, 0, 0.35 ) );
1356 + border: 1px dashed var( --os-widgets-add-border, rgba( 255, 255, 255, 0.22 ) );
1331 1357 border-radius: 10px;
1332 - color: rgba( 255, 255, 255, 0.72 );
1358 + color: var( --os-ui-color-text, var( --os-fg, #fff ) );
1333 1359 font: inherit;
1334 1360 font-weight: 500;
1335 1361 cursor: pointer;
1336 1362 opacity: 0;
@@ -1368,10 +1394,10 @@
1368 1394 }
1369 1395
1370 1396 .os-widgets__add:hover {
1371 1397 border-color: rgba( 255, 255, 255, 0.4 );
1372 - background: rgba( 255, 255, 255, 0.06 );
1373 - color: var( --os-ui-fg-on-accent, #fff );
1398 + background: var( --os-widgets-add-bg-hover, rgba( 255, 255, 255, 0.06 ) );
1399 + color: var( --os-fg, #fff );
1374 1400 }
1375 1401
1376 1402 .os-widgets__add:focus-visible {
1377 1403 outline: 2px solid var( --wp-admin-theme-color, #2271b1 );
@@ -1739,5 +1765,328 @@
1739 1765 .os-shell--revealing #os-area,
1740 1766 .os-shell--revealing .os-dock {
1741 1767 transition: none;
1742 1768 }
1769 +}
1770 +
1771 +/* A residency frame follows the window body without scrolling with its contents. */
1772 +.os-mio-residence {
1773 + position: absolute;
1774 + z-index: 50;
1775 + pointer-events: none;
1776 + overflow: hidden;
1777 + container-type: inline-size;
1778 +}
1779 +
1780 +.os-mio-residence[hidden],
1781 +.os-mio-chat-launcher[hidden] {
1782 + display: none;
1783 +}
1784 +
1785 +.os-mio-chat-launcher {
1786 + position: absolute;
1787 + inset-inline-end: 20px;
1788 + inset-block-end: 18px;
1789 + pointer-events: auto;
1790 +}
1791 +
1792 +.os-mio-chat {
1793 + position: absolute;
1794 + inset-inline-end: 16px;
1795 + inset-block-end: 16px;
1796 + inline-size: min(380px, calc(100% - 32px));
1797 + max-block-size: calc(100% - 32px);
1798 + box-sizing: border-box;
1799 + display: flex;
1800 + flex-direction: column;
1801 + gap: 12px;
1802 + padding: 18px;
1803 + pointer-events: auto;
1804 + color: var(--os-mio-chat-fg, #1d2327);
1805 + background: var(--os-mio-chat-bg, #fff);
1806 + border: 1px solid var(--os-mio-chat-border, #c3c4c7);
1807 + border-radius: var(--os-mio-chat-radius, 16px);
1808 + box-shadow: 0 8px 40px var(--os-mio-chat-glow, #00000020);
1809 + animation: os-mio-chat-enter 180ms ease-out;
1810 +}
1811 +
1812 +.os-mio-chat header {
1813 + display: flex;
1814 + align-items: center;
1815 + gap: 12px;
1816 +}
1817 +
1818 +.os-mio-chat header strong {
1819 + letter-spacing: .14em;
1820 +}
1821 +
1822 +.os-mio-chat header span {
1823 + flex: 1;
1824 + font-size: 11px;
1825 + color: var(--os-mio-chat-muted, #646970);
1826 +}
1827 +
1828 +.os-mio-chat__log {
1829 + position: relative;
1830 + min-block-size: 60px;
1831 + max-block-size: 300px;
1832 + overflow: auto;
1833 + overscroll-behavior: contain;
1834 +}
1835 +
1836 +.os-mio-chat__message {
1837 + margin-block: 0 10px;
1838 + padding: 10px 12px;
1839 + line-height: 1.6;
1840 + white-space: pre-wrap;
1841 + overflow-wrap: anywhere;
1842 +}
1843 +
1844 +.os-mio-chat__message--user {
1845 + border-radius: 16px 16px 4px 16px;
1846 + background: var(--os-mio-chat-user-bg, #f0f0f1);
1847 +}
1848 +
1849 +.os-mio-chat__composer {
1850 + display: flex;
1851 + align-items: center;
1852 + gap: 8px;
1853 +}
1854 +
1855 +.os-mio-chat__composer os-textarea {
1856 + flex: 1;
1857 + min-inline-size: 0;
1858 +}
1859 +
1860 +.os-mio-chat__status,
1861 +.os-mio-chat small {
1862 + margin: 0;
1863 + font-size: 11px;
1864 + line-height: 1.5;
1865 + color: var(--os-mio-chat-muted, #646970);
1866 +}
1867 +
1868 +@keyframes os-mio-chat-enter {
1869 + from { opacity: 0; transform: translateY(6px) scale(.98); }
1870 + to { opacity: 1; transform: translateY(0) scale(1); }
1871 +}
1872 +
1873 +@media (prefers-reduced-motion: reduce) {
1874 + .os-mio-chat { animation: none; }
1875 +}
1876 +
1877 +.os-mio-residence > .os-mio { z-index: 0; }
1878 +.os-mio-chat, .os-mio-chat-launcher { z-index: 1; }
1879 +
1880 +.os-mio-chat [hidden] {
1881 + display: none !important;
1882 +}
1883 +
1884 +.os-mio-chat__message--assistant {
1885 + white-space: normal;
1886 +}
1887 +
1888 +.os-mio-chat__message p {
1889 + margin-block: 0 8px;
1890 +}
1891 +
1892 +.os-mio-chat__message ul,
1893 +.os-mio-chat__message ol {
1894 + margin-block: 8px;
1895 + padding-inline-start: 20px;
1896 +}
1897 +
1898 +.os-mio-chat__message a {
1899 + color: inherit;
1900 + text-decoration: underline;
1901 +}
1902 +
1903 +/* Shared MIO chrome: the same portrait with a softly revealed off-state slash. */
1904 +.os-mio-window-toggle svg {
1905 + width: 20px;
1906 + height: 20px;
1907 + overflow: visible;
1908 +}
1909 +
1910 +.os-mio-window-toggle__slash {
1911 + fill: none;
1912 + stroke: currentColor;
1913 + stroke-width: 2.4;
1914 + stroke-linecap: round;
1915 + opacity: 0;
1916 + stroke-dasharray: 26;
1917 + stroke-dashoffset: 26;
1918 + transition: opacity 240ms ease, stroke-dashoffset 240ms ease;
1919 +}
1920 +
1921 +.os-mio-window-toggle[data-mio-disabled="true"] .os-mio-window-toggle__slash {
1922 + opacity: 1;
1923 + stroke-dashoffset: 0;
1924 +}
1925 +
1926 +.os-mio-chat__activity {
1927 + display: flex;
1928 + align-items: center;
1929 + gap: 8px;
1930 + min-height: 18px;
1931 +}
1932 +
1933 +.os-mio-chat__thinking {
1934 + display: inline-flex;
1935 + align-items: center;
1936 + gap: 3px;
1937 + width: 24px;
1938 + flex-shrink: 0;
1939 + opacity: 0;
1940 + color: var(--os-mio-chat-muted, #646970);
1941 + transition: opacity 240ms ease;
1942 +}
1943 +
1944 +.os-mio-chat[data-thinking="true"] .os-mio-chat__thinking {
1945 + opacity: 1;
1946 +}
1947 +
1948 +.os-mio-chat__thinking i {
1949 + width: 4px;
1950 + height: 4px;
1951 + border-radius: 50%;
1952 + background: currentColor;
1953 + animation: os-mio-thinking 1.6s ease-in-out infinite;
1954 + animation-play-state: paused;
1955 +}
1956 +
1957 +.os-mio-chat__thinking i:nth-child(2) { animation-delay: 160ms; }
1958 +.os-mio-chat__thinking i:nth-child(3) { animation-delay: 320ms; }
1959 +.os-mio-chat[data-thinking="true"] .os-mio-chat__thinking i { animation-play-state: running; }
1960 +.os-mio-window-toggle[data-mio-thinking="true"] circle { animation: os-mio-thinking 2.4s ease-in-out infinite; }
1961 +
1962 +@keyframes os-mio-thinking {
1963 + 0%, 100% { opacity: 0.45; }
1964 + 50% { opacity: 1; }
1965 +}
1966 +
1967 +@media (prefers-reduced-motion: reduce) {
1968 + .os-mio-window-toggle__slash,
1969 + .os-mio-chat__thinking { transition: none; }
1970 + .os-mio-chat__thinking i,
1971 + .os-mio-window-toggle[data-mio-thinking="true"] circle { animation: none; }
1972 +}
1973 +
1974 +.os-mio-window-toggle {
1975 + max-inline-size: 30px;
1976 + opacity: 1;
1977 + visibility: visible;
1978 + transition: opacity 180ms ease, max-inline-size 240ms ease, visibility 0s;
1979 +}
1980 +
1981 +.os-mio-window-toggle[data-mio-available="false"] {
1982 + max-inline-size: 0;
1983 + opacity: 0;
1984 + visibility: hidden;
1985 + overflow: hidden;
1986 + pointer-events: none;
1987 + transition: opacity 180ms ease, max-inline-size 240ms ease, visibility 0s 180ms;
1988 +}
1989 +
1990 +@media (prefers-reduced-motion: reduce) {
1991 + .os-mio-window-toggle,
1992 + .os-mio-window-toggle[data-mio-available="false"] { transition: none; }
1993 +}
1994 +
1995 +/* The launcher stays available; the companion only speaks when invited. */
1996 +.os-mio > canvas,
1997 +.os-mio > .os-mio__handle {
1998 + transition: opacity 180ms ease, visibility 180ms;
1999 +}
2000 +
2001 +.os-mio[data-mio-visible="false"] > canvas,
2002 +.os-mio[data-mio-visible="false"] > .os-mio__handle {
2003 + opacity: 0;
2004 + visibility: hidden;
2005 + pointer-events: none;
2006 +}
2007 +
2008 +.os-mio-callout {
2009 + position: absolute;
2010 + z-index: 2;
2011 + display: flex;
2012 + align-items: center;
2013 + gap: 10px;
2014 + max-inline-size: calc(100% - 16px);
2015 + box-sizing: border-box;
2016 + padding-block: 6px;
2017 + padding-inline: 15px 6px;
2018 + border: 1px solid var(--os-mio-callout-border, #d6b8cb);
2019 + border-radius: 22px;
2020 + background: var(--os-mio-callout-bg, #ffe0cf);
2021 + color: var(--os-mio-callout-fg, #382b38);
2022 + box-shadow: 0 4px 16px var(--os-mio-chat-glow, #00000020);
2023 + font-size: 12px;
2024 + line-height: 1.5;
2025 + font-weight: 500;
2026 + pointer-events: auto;
2027 + animation: os-mio-chat-enter 180ms ease-out;
2028 +}
2029 +
2030 +.os-mio-callout os-button::part(button) {
2031 + inline-size: 26px;
2032 + block-size: 26px;
2033 + font-size: 17px;
2034 + line-height: 1;
2035 +}
2036 +
2037 +/* A small rounded tail joins the companion without a second outlined shape. */
2038 +.os-mio-callout::after {
2039 + content: "";
2040 + position: absolute;
2041 + inset-block-end: -4px;
2042 + inset-inline-end: 18px;
2043 + inline-size: 8px;
2044 + block-size: 8px;
2045 + background: inherit;
2046 + border-inline-end: inherit;
2047 + border-block-end: inherit;
2048 + border-end-end-radius: 3px;
2049 + transform: rotate(45deg);
2050 +}
2051 +
2052 +.os-mio-callout[hidden] { display: none; }
2053 +
2054 +@media (prefers-reduced-motion: reduce) {
2055 + .os-mio > canvas,
2056 + .os-mio > .os-mio__handle { transition: none; }
2057 + .os-mio-callout { animation: none; }
2058 +}
2059 +
2060 +/* Response controls belong to their message; all layout follows inline flow. */
2061 +.os-mio-chat__actions {
2062 + display: flex;
2063 + flex-wrap: wrap;
2064 + gap: 8px;
2065 + margin-block-start: 12px;
2066 +}
2067 +
2068 +.os-mio-chat__action {
2069 + display: flex;
2070 + flex-direction: column;
2071 + align-items: flex-start;
2072 + gap: 4px;
2073 + min-inline-size: 0;
2074 + max-inline-size: 100%;
2075 +}
2076 +
2077 +.os-mio-chat__action os-button::part(button) {
2078 + white-space: normal;
2079 + overflow-wrap: anywhere;
2080 +}
2081 +
2082 +.os-mio-chat__action-status {
2083 + font-size: 12px;
2084 + color: var(--os-mio-chat-muted, #646970);
2085 + overflow-wrap: anywhere;
2086 +}
2087 +
2088 +.os-mio-chat__composer os-textarea::part(textarea) {
2089 + white-space: pre-wrap;
2090 + overflow-wrap: anywhere;
2091 + overflow-x: hidden;
1743 2092 }