diff --git a/Cargo.lock b/Cargo.lock
index 2c828da..bd2e6ba 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2674,7 +2674,7 @@ dependencies = [
[[package]]
name = "rustpad"
-version = "0.2.90"
+version = "0.2.91"
dependencies = [
"argon2",
"aws-config",
diff --git a/Cargo.toml b/Cargo.toml
index c0a517b..d146c32 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "rustpad"
-version = "0.2.90"
+version = "0.2.91"
edition = "2024"
rust-version = "1.94"
description = "Collaborative Markdown notepad built with Axum, WebSockets and SQLite, PostgreSQL and MySQL"
diff --git a/PERFORMANCE_TEST_RESULTS.md b/PERFORMANCE_TEST_RESULTS.md
deleted file mode 100644
index 7a779e1..0000000
--- a/PERFORMANCE_TEST_RESULTS.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Rustpad 0.2.88 — wyniki testów wydajności
-
-Zmiana: w `src/websocket/pad.rs` i `src/websocket/mod.rs` ograniczono sprawdzanie dostępu przy przychodzących zdarzeniach broadcast do najwyżej jednego sprawdzenia na sekundę na połączenie. Kontrola cykliczna i zdarzenia zmiany hasła pozostają aktywne. W zestawie pozostają optymalizacje renderowania z poprzedniej iteracji.
-
-## Symulacja deterministyczna (Node.js)
-
-Założenia: 10 s, 2 edycje/s na użytkownika, każda edycja rozsyłana do wszystkich N odbiorców (w tym nadawcy), bez rzeczywistej sieci, bazy danych, WebSocket czy renderowania. Symulacja porównuje liczby sprawdzeń dostępu, a **nie** rzeczywistą przepustowość ani opóźnienia Rustpada.
-
-| Użytkownicy | Dostawy zdarzeń | Sprawdzenia przed | Sprawdzenia po | Redukcja |
-|---:|---:|---:|---:|---:|
-| 5 | 500 | 500 | 50 | 90,00% |
-| 100 | 200 000 | 200 000 | 1 000 | 99,50% |
-| 300 | 1 800 000 | 1 800 000 | 3 000 | 99,83% |
-| 500 | 5 000 000 | 5 000 000 | 5 000 | 99,90% |
-
-Uruchomienie: `node tests/broadcast-load-simulation.mjs`.
-
-## Testy
-
-- `node tests/feature-smoke-test.mjs` — PASS
-- `node tests/mention-autocomplete-test.mjs` — PASS
-- `node tests/mention-navigation-test.mjs` — PASS
-- `node --check static/js/*.js` (osobno dla plików) — PASS
-- `cargo test` — NIEURUCHOMIONY (brak Rust/cargo w środowisku)
-- Test end-to-end z setkami aktywnych przeglądarek i prawdziwym WebSocket/PostgreSQL — NIEURUCHOMIONY.
-
-## Ograniczenia
-
-Nie można zagwarantować płynnej pracy kilkuset użytkowników bez testu na docelowym sprzęcie i bazie. Każdy zapis nadal przechodzi przez serializację zmian i trwałe utrwalenie w bazie; duża liczba operacji może nasycić bazę i sieć. Zmiana odświeżania uprawnień może wydłużyć wykrycie odwołania dostępu w trakcie ciągłego broadcastu do około 1 sekundy; istniejący timer kontroli okresowej pozostaje. Wersja 0.2.88 jest wydaniem z nową poprawką na życzenie użytkownika i nie należy jej mylić z wcześniej wydaną paczką 0.2.88.
diff --git a/lang/en.json b/lang/en.json
index d009f0b..5e3f3e3 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -938,6 +938,9 @@
"workspace.noteDeletedTitle": "Note deleted",
"workspace.noteName.placeholder": "Note name",
"workspace.noteProtect": "Protect this note from deletion",
+ "workspace.noteProtection.explain": "When enabled, collaborators can edit but cannot delete or archive the note or remove its files. The note creator or workspace owner can still do so. This does not require a password.",
+ "workspace.noteProtection.archiveEnabled": "Archiving is enabled: authorized deletion moves the note, its history and files to Archived notes. The workspace owner can restore it.",
+ "workspace.noteProtection.archiveDisabled": "Archiving is disabled: authorized deletion permanently removes the note and its files. Enable archiving in Workspace settings if recovery is important.",
"workspace.notes.copy": "Select a note or create a new one.",
"workspace.notesView": "Notes view",
"workspace.pagination": "Notes pagination",
@@ -1013,6 +1016,8 @@
"files.less": "Less",
"files.noMatchesHelp": "Try a different file name or type.",
"files.link": "Link",
- "files.markdown": "Markdown"
+ "files.markdown": "Markdown",
+ "home.account.loading": "Checking your account...",
+ "home.account.retry": "Reload page"
}
-}
\ No newline at end of file
+}
diff --git a/lang/pl.json b/lang/pl.json
index 21e4f16..afaf730 100644
--- a/lang/pl.json
+++ b/lang/pl.json
@@ -938,6 +938,9 @@
"workspace.noteDeletedTitle": "Notatka usunięta",
"workspace.noteName.placeholder": "Nazwa notatki",
"workspace.noteProtect": "Chroń tę notatkę przed usunięciem",
+ "workspace.noteProtection.explain": "Po włączeniu współedytujący mogą edytować notatkę, ale nie mogą jej usuwać ani archiwizować, ani usuwać załączników. Nadal może to zrobić twórca notatki lub właściciel workspace. To nie jest ochrona hasłem.",
+ "workspace.noteProtection.archiveEnabled": "Archiwizacja włączona: dozwolone usunięcie przenosi notatkę, jej historię i pliki do archiwum. Właściciel workspace może ją przywrócić.",
+ "workspace.noteProtection.archiveDisabled": "Archiwizacja wyłączona: dozwolone usunięcie trwale usuwa notatkę i jej pliki. Włącz archiwizację w ustawieniach workspace, jeśli przywracanie jest ważne.",
"workspace.notes.copy": "Wybierz notatkę albo utwórz nową.",
"workspace.notesView": "Widok notatek",
"workspace.pagination": "Paginacja notatek",
@@ -1013,6 +1016,8 @@
"files.less": "Mniej",
"files.noMatchesHelp": "Spróbuj innej nazwy pliku lub typu.",
"files.link": "Link",
- "files.markdown": "Markdown"
+ "files.markdown": "Markdown",
+ "home.account.loading": "Sprawdzanie konta...",
+ "home.account.retry": "Odśwież stronę"
}
}
\ No newline at end of file
diff --git a/src/assets.rs b/src/assets.rs
index 0e84e41..ad9e9e6 100644
--- a/src/assets.rs
+++ b/src/assets.rs
@@ -48,6 +48,7 @@ const MODULES: &[&str] = &[
"theme",
"url-state",
"vendor-libs",
+ "virtual-editor-layers",
"security",
"select",
];
@@ -73,8 +74,18 @@ pub fn render_html(
urls.stylesheet("styles"),
urls.stylesheet_path("libs/rustpad-player/player.css"),
);
+ let show_note_loader = matches!(entrypoint, "pad" | "note");
let html = template
- .replace("__APP_THEME_BOOTSTRAP__", &format!("{}{}", theme_bootstrap(), language_bootstrap()))
+ .replace(
+ "__APP_THEME_BOOTSTRAP__",
+ &format!(
+ "{}{}{}",
+ theme_bootstrap(),
+ language_bootstrap(),
+ if show_note_loader { loading_bootstrap() } else { String::new() }
+ ),
+ )
+ .replace("__APP_LOADING_OVERLAY__", if show_note_loader { loading_overlay() } else { "" })
.replace("__APP_STYLESHEET__", &app_stylesheets)
.replace("__APP_IMPORT_MAP__", &urls.import_map())
.replace("__APP_ENTRYPOINT__", &urls.entrypoint(entrypoint))
@@ -101,6 +112,39 @@ pub fn render_html(
response
}
+fn loading_bootstrap() -> String {
+ // Embedded critical CSS and controller are available before the external assets.
+ format!(
+ "",
+ include_str!("../static/css/boot-loading.css"),
+ include_str!("../static/js/boot-loading.js"),
+ )
+}
+
+fn loading_overlay() -> &'static str {
+ r#"
+
+
+ RustPad
+
+
Loading…
+
Preparing the interface
+
+
0 of 5 stages completed
+
+ Interface
+ Language
+ Editor
+ Access
+ Note
+
+
Reload page
+
+
"#
+}
+
pub fn theme_bootstrap() -> &'static str {
r#""#
}
@@ -154,13 +198,16 @@ impl<'a> AssetUrls<'a> {
}
fn stylesheet_path(&self, path: &str) -> String {
- format!(r#" "#, self.url(path))
+ format!(
+ r#" "#,
+ self.url(path)
+ )
}
fn entrypoint(&self, name: &str) -> String {
let entrypoint = self.url(&format!("js/{name}.js"));
format!(
- r#""#,
+ r#""#,
escape_js_string(&entrypoint)
)
}
diff --git a/src/config/mod.rs b/src/config/mod.rs
index f99a89d..c710f4f 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -174,7 +174,7 @@ impl Config {
"GUEST_UPLOAD_MAX_SIZE_MB",
guest_upload_max_size_mb,
)?,
- asset_version: env!("CARGO_PKG_VERSION").to_owned(),
+ asset_version: format!("{}-ui3", env!("CARGO_PKG_VERSION")),
http_compression: values.bool("HTTP_COMPRESSION", false)?,
asset_cache_max_age_seconds: values
.nonnegative_u64("ASSET_CACHE_MAX_AGE_SECONDS", 600)?,
@@ -241,10 +241,7 @@ fn multipart_body_limit_bytes(
file_limit.saturating_add(1024 * 1024)
}
-fn megabytes_to_bytes(
- name: &str,
- megabytes: u64,
-) -> Result> {
+fn megabytes_to_bytes(name: &str, megabytes: u64) -> Result> {
let bytes = megabytes
.checked_mul(1024 * 1024)
.ok_or_else(|| format!("{name} is too large"))?;
diff --git a/static/css/boot-loading.css b/static/css/boot-loading.css
new file mode 100644
index 0000000..a90ae5e
--- /dev/null
+++ b/static/css/boot-loading.css
@@ -0,0 +1,240 @@
+#app-boot-overlay {
+ --boot-bg: #0b0d11;
+ --boot-panel: #151922;
+ --boot-border: #343c49;
+ --boot-text: #f4f6f8;
+ --boot-muted: #abb5c3;
+ --boot-accent: #a99ef8;
+ --boot-brand-start: #f0aa74;
+ --boot-brand-mid: #cf633d;
+ --boot-brand-end: #8f3827;
+ position: fixed;
+ inset: 0;
+ z-index: 2147483647;
+ display: grid;
+ place-items: center;
+ padding: 24px;
+ background: var(--boot-bg);
+ color: var(--boot-text);
+ font: 500 14px/1.5 Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif;
+ text-align: center;
+ opacity: 1;
+ visibility: visible !important;
+ transition: opacity .18s ease;
+}
+
+:root[data-theme=light] #app-boot-overlay {
+ --boot-bg: #f7f4ee;
+ --boot-panel: #fffdf9;
+ --boot-border: #cbc3b8;
+ --boot-text: #29251f;
+ --boot-muted: #625a50;
+ --boot-accent: #6251bf;
+ --boot-brand-start: #c9794e;
+ --boot-brand-mid: #ae5d3c;
+ --boot-brand-end: #7c3d2c;
+}
+
+#app-boot-overlay.is-ready {
+ opacity: 0;
+ pointer-events: none;
+}
+
+#app-boot-overlay .app-boot-card {
+ width: min(100%, 390px);
+}
+
+#app-boot-overlay .app-boot-brand {
+ position: relative;
+ display: inline-block;
+ max-width: 100%;
+ margin: 0 auto 25px;
+ padding: 0 8px 11px;
+ line-height: 1;
+}
+
+#app-boot-overlay .app-boot-wordmark {
+ position: relative;
+ display: block;
+ white-space: nowrap;
+ font-size: calc(clamp(42px, 10vw, 57px));
+ font-weight: 800;
+ letter-spacing: -.035em;
+ line-height: 1.13;
+ background: linear-gradient(110deg,
+ var(--live-gradient-start, var(--boot-brand-start)) 0,
+ var(--live-gradient-mid, var(--boot-brand-mid)) 48%,
+ var(--live-gradient-end, var(--boot-brand-end)) 100%);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ -webkit-text-fill-color: transparent;
+ animation: app-boot-wordmark-breathe 2.8s ease-in-out infinite;
+}
+
+#app-boot-overlay .app-boot-wordmark:after {
+ content: "RustPad";
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ background: linear-gradient(100deg,
+ transparent 35%, hsla(0, 0%, 100%, .7) 50%, transparent 65%);
+ background-size: 250% 100%;
+ background-position: 100%;
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ -webkit-text-fill-color: transparent;
+ animation: app-boot-wordmark-shine 3.1s ease-in-out infinite;
+}
+
+#app-boot-overlay .app-boot-brand:after {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ left: 12%;
+ width: 76%;
+ height: 2px;
+ border-radius: 50px;
+ background: linear-gradient(90deg, transparent, var(--boot-accent), transparent);
+ opacity: .75;
+ transform: scaleX(.35);
+ animation: app-boot-brand-underline 2.8s ease-in-out infinite;
+}
+
+#app-boot-overlay h2 {
+ margin: 0 0 9px;
+ font-size: 21px;
+ font-weight: 720;
+ letter-spacing: -.035em;
+ color: var(--boot-text);
+}
+
+#app-boot-overlay #app-boot-stage {
+ margin: 0 0 23px;
+ color: var(--boot-muted);
+ min-height: 22px;
+}
+
+#app-boot-overlay .app-boot-track {
+ height: 6px;
+ overflow: hidden;
+ border-radius: 100px;
+ background: var(--boot-border);
+}
+
+#app-boot-overlay #app-boot-progress-fill {
+ height: 100%;
+ width: 0;
+ background: var(--boot-accent);
+ border-radius: inherit;
+ transition: width .14s ease;
+}
+
+#app-boot-overlay #app-boot-count {
+ margin: 10px 0 18px;
+ font-size: 12px;
+ color: var(--boot-muted);
+ overflow-wrap: anywhere;
+}
+
+#app-boot-overlay .app-boot-steps {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 7px;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+#app-boot-overlay .app-boot-steps li {
+ padding: 4px 8px;
+ border: 1px solid var(--boot-border);
+ border-radius: 7px;
+ font-size: 10px;
+ color: var(--boot-muted);
+ background: var(--boot-panel);
+}
+
+#app-boot-overlay .app-boot-steps li[data-status=done] {
+ color: var(--boot-accent);
+ border-color: var(--boot-accent);
+}
+
+#app-boot-overlay .app-boot-steps li[data-status=active] {
+ color: var(--boot-text);
+}
+
+#app-boot-overlay #app-boot-retry {
+ margin-top: 18px;
+ padding: 10px 18px;
+ border: 1px solid var(--boot-accent);
+ border-radius: 8px;
+ background: var(--boot-panel);
+ color: var(--boot-text);
+ cursor: pointer;
+}
+
+#app-boot-overlay #app-boot-retry[hidden] {
+ display: none;
+}
+
+@keyframes app-boot-wordmark-breathe {
+
+ 0%,
+ to {
+ transform: translateY(0);
+ }
+
+ 50% {
+ transform: translateY(-2px);
+ }
+}
+
+@keyframes app-boot-wordmark-shine {
+
+ 0%,
+ 20% {
+ background-position: 100%;
+ }
+
+ 70%,
+ to {
+ background-position: -100%;
+ }
+}
+
+@keyframes app-boot-brand-underline {
+
+ 0%,
+ to {
+ transform: scaleX(.35);
+ opacity: .4;
+ }
+
+ 50% {
+ transform: scaleX(1);
+ opacity: .85;
+ }
+}
+
+#app-boot-overlay.has-error .app-boot-brand:after,
+#app-boot-overlay.has-error .app-boot-wordmark,
+#app-boot-overlay.has-error .app-boot-wordmark:after {
+ animation: none;
+}
+
+@media(prefers-reduced-motion:reduce) {
+
+ #app-boot-overlay,
+ #app-boot-overlay #app-boot-progress-fill {
+ transition: none;
+ }
+
+ #app-boot-overlay .app-boot-brand:after,
+ #app-boot-overlay .app-boot-wordmark,
+ #app-boot-overlay .app-boot-wordmark:after {
+ animation: none;
+ }
+}
\ No newline at end of file
diff --git a/static/css/styles.css b/static/css/styles.css
index ea59e28..02c37ad 100644
--- a/static/css/styles.css
+++ b/static/css/styles.css
@@ -1,16 +1,7 @@
-/*
- * Copyright (C) 2026 Mateusz Gruszczynski @linuxiarz.pl
- * Source-Available Code / Dual-Licensed.
- *
- * Free for non-commercial and evaluation use under terms of BSL/GPLv3.
- * Commercial or production use requires a valid paid license.
- * See LICENSE file in repository root for details.
- */
-
:root,
-:root[data-theme="dark"] {
+:root[data-theme=dark] {
color-scheme: dark;
- font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif;
font-synthesis: none;
background: #0b0d11;
color: #f4f6f8;
@@ -87,8 +78,8 @@
--danger-button-text: #fff4f5;
--danger-subtle-bg: rgba(255, 123, 145, .08);
--danger-subtle-hover: rgba(255, 123, 145, .14);
- --theme-contrast: white;
- --theme-shadow-mix: black;
+ --theme-contrast: #fff;
+ --theme-shadow-mix: #000;
--accent: #7561e0;
--accent-hover: #6955cb;
@@ -127,27 +118,27 @@
--live-gradient-end: #8f3827;
--select-arrow: #9aa3b2;
- --wash-faint: rgba(255, 255, 255, .015);
- --wash-soft: rgba(255, 255, 255, .02);
- --wash-subtle: rgba(255, 255, 255, .025);
- --wash-medium: rgba(255, 255, 255, .04);
- --wash-hover: rgba(255, 255, 255, .07);
- --wash-border: rgba(255, 255, 255, .12);
- --wash-strong: rgba(255, 255, 255, .75);
+ --wash-faint: hsla(0, 0%, 100%, .015);
+ --wash-soft: hsla(0, 0%, 100%, .02);
+ --wash-subtle: hsla(0, 0%, 100%, .025);
+ --wash-medium: hsla(0, 0%, 100%, .04);
+ --wash-hover: hsla(0, 0%, 100%, .07);
+ --wash-border: hsla(0, 0%, 100%, .12);
+ --wash-strong: hsla(0, 0%, 100%, .75);
--accent-a08: rgba(124, 104, 238, .08);
--accent-a25: rgba(124, 104, 238, .25);
--accent-a30: rgba(124, 104, 238, .3);
--accent-a35: rgba(124, 104, 238, .35);
- --focus-ring: rgb(117 103 219 / .18);
+ --focus-ring: rgba(117, 103, 219, .18);
--danger-a45: rgba(255, 123, 145, .45);
--live-border: rgba(195, 91, 54, .28);
--shadow-28: rgba(0, 0, 0, .28);
- --shadow-38: rgb(0 0 0 / 38%);
+ --shadow-38: rgba(0, 0, 0, .38);
--shadow-40: rgba(0, 0, 0, .4);
- --shadow-45: rgb(0 0 0 / 45%);
- --shadow-58: rgb(0 0 0 / .58);
- --overlay-68: rgb(0 0 0 / .68);
+ --shadow-45: rgba(0, 0, 0, .45);
+ --shadow-58: rgba(0, 0, 0, .58);
+ --overlay-68: rgba(0, 0, 0, .68);
--overlay-72: rgba(4, 6, 10, .72);
--overlay-78: rgba(4, 6, 9, .78);
--overlay-82: rgba(4, 6, 9, .82);
@@ -157,7 +148,7 @@
--top-header-control-height: 34px;
}
-:root[data-theme="light"] {
+:root[data-theme=light] {
color-scheme: light;
background: #f7f4ee;
color: #29251f;
@@ -233,7 +224,7 @@
--danger-button-text: #7f2836;
--danger-subtle-bg: #f7e7e6;
--danger-subtle-hover: #efd4d4;
- --theme-contrast: black;
+ --theme-contrast: #000;
--theme-shadow-mix: #6c6258;
--accent: #6859b5;
@@ -260,7 +251,7 @@
--status-info-border: #56759c;
--status-warning-border: #a27831;
--status-danger-border: #a54b55;
- --status-success-bg: rgba(61, 121, 88, .10);
+ --status-success-bg: rgba(61, 121, 88, .1);
--status-info-bg: rgba(68, 103, 148, .09);
--status-warning-bg: rgba(155, 112, 35, .11);
--status-danger-bg: rgba(155, 52, 67, .09);
@@ -281,24 +272,24 @@
--wash-border: rgba(49, 43, 36, .13);
--wash-strong: rgba(49, 43, 36, .56);
--accent-a08: rgba(104, 89, 181, .08);
- --accent-a25: rgba(104, 89, 181, .20);
+ --accent-a25: rgba(104, 89, 181, .2);
--accent-a30: rgba(104, 89, 181, .24);
--accent-a35: rgba(104, 89, 181, .28);
- --focus-ring: rgb(104 89 181 / .17);
- --danger-a45: rgba(155, 52, 67, .30);
+ --focus-ring: rgba(104, 89, 181, .17);
+ --danger-a45: rgba(155, 52, 67, .3);
--live-border: rgba(174, 93, 60, .23);
- --shadow-28: rgba(73, 61, 48, .10);
- --shadow-38: rgb(73 61 48 / 14%);
+ --shadow-28: rgba(73, 61, 48, .1);
+ --shadow-38: rgba(73, 61, 48, .14);
--shadow-40: rgba(73, 61, 48, .16);
- --shadow-45: rgb(73 61 48 / 18%);
- --shadow-58: rgb(73 61 48 / .22);
- --overlay-68: rgb(47 42 36 / .44);
+ --shadow-45: rgba(73, 61, 48, .18);
+ --shadow-58: rgba(73, 61, 48, .22);
+ --overlay-68: rgba(47, 42, 36, .44);
--overlay-72: rgba(47, 42, 36, .48);
--overlay-78: rgba(47, 42, 36, .52);
--overlay-82: rgba(47, 42, 36, .56);
--glass-92: rgba(255, 253, 249, .94);
- --glass-toolbar: rgba(255, 253, 249, .90);
+ --glass-toolbar: rgba(255, 253, 249, .9);
}
* {
@@ -324,8 +315,8 @@ textarea {
font: inherit;
}
-button,
a,
+button,
input,
select,
textarea {
@@ -365,7 +356,7 @@ a {
}
.site-header {
- width: min(720px, calc(100% - 32px));
+ width: min(720px, 100% - 32px);
min-height: var(--top-header-height);
margin: 0 auto;
display: flex;
@@ -374,7 +365,7 @@ a {
}
.home-layout {
- width: min(520px, calc(100% - 32px));
+ width: min(520px, 100% - 32px);
margin: 0 auto;
padding: 72px 0;
}
@@ -385,7 +376,7 @@ a {
.home-intro h1 {
margin: 0;
- font-size: clamp(2rem, 7vw, 3rem);
+ font-size: calc(clamp(2rem, 7vw, 3rem));
letter-spacing: -.04em;
}
@@ -422,17 +413,17 @@ a {
font-weight: 750;
}
-.label-row,
-.field-meta {
+.field-meta,
+.label-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
-.label-row span,
+.field small,
.field-meta,
-.field small {
+.label-row span {
color: var(--muted-2);
font-size: .73rem;
}
@@ -445,8 +436,8 @@ select {
color: var(--text);
}
-select option,
-select optgroup {
+select optgroup,
+select option {
background: var(--control-bg);
color: var(--text);
}
@@ -506,9 +497,9 @@ textarea:focus {
color: var(--danger);
}
+.inline-button,
.primary-button,
-.secondary-button,
-.inline-button {
+.secondary-button {
display: inline-flex;
align-items: center;
justify-content: center;
@@ -570,9 +561,9 @@ textarea:focus {
}
.app-header .secondary-button,
-.public-header .secondary-button,
.pad-page .header-actions>.secondary-button,
-.pad-page .page-settings>summary.secondary-button {
+.pad-page .page-settings>summary.secondary-button,
+.public-header .secondary-button {
min-height: var(--top-header-control-height);
padding-inline: 10px;
}
@@ -624,7 +615,7 @@ textarea:focus {
transition: color .15s ease, text-shadow .15s ease, transform .15s ease;
}
-.favorite-toggle:not([aria-pressed="true"]):hover {
+.favorite-toggle:not([aria-pressed=true]):hover {
color: var(--text);
}
@@ -633,7 +624,7 @@ textarea:focus {
text-shadow: 0 0 8px color-mix(in srgb, var(--accent) 45%, transparent);
}
-.favorite-toggle[aria-pressed="true"] {
+.favorite-toggle[aria-pressed=true] {
color: var(--accent);
text-shadow: 0 0 8px color-mix(in srgb, var(--accent) 55%, transparent);
transform: scale(1.08);
@@ -650,8 +641,8 @@ textarea:focus {
outline: none;
}
-.document-heading--copy:hover,
-.document-heading--copy:focus-visible {
+.document-heading--copy:focus-visible,
+.document-heading--copy:hover {
background: color-mix(in srgb, var(--accent) 10%, transparent);
box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 10%, transparent);
}
@@ -711,7 +702,7 @@ textarea:focus {
left: 50%;
z-index: 18;
display: flex;
- width: min(520px, calc(100% - 32px));
+ width: min(520px, 100% - 32px);
box-sizing: border-box;
align-items: center;
gap: 12px;
@@ -728,7 +719,7 @@ textarea:focus {
.connection-notice.is-visible {
opacity: 1;
- transform: translate(-50%, 0) scale(1);
+ transform: translate(-50%) scale(1);
}
.connection-notice.is-error {
@@ -806,7 +797,7 @@ textarea:focus {
@keyframes connection-pulse {
0%,
- 100% {
+ to {
transform: scaleY(.45);
opacity: .48;
}
@@ -950,7 +941,7 @@ textarea:focus {
backdrop-filter: blur(10px);
}
-.pad-page.toolbar-collapsed .editor-toolbar> :not(.toolbar-collapse-toggle):not(.view-switch) {
+.pad-page.toolbar-collapsed .editor-toolbar>:not(.toolbar-collapse-toggle):not(.view-switch) {
display: none !important;
}
@@ -1316,8 +1307,8 @@ textarea::selection {
background: var(--surface-card);
}
-.history-calendar__month-head,
-.history-archive__selected-head {
+.history-archive__selected-head,
+.history-calendar__month-head {
display: flex;
align-items: baseline;
justify-content: space-between;
@@ -1325,19 +1316,19 @@ textarea::selection {
margin-bottom: 8px;
}
-.history-calendar__month-head strong,
-.history-archive__selected-head strong {
+.history-archive__selected-head strong,
+.history-calendar__month-head strong {
font-size: .78rem;
}
-.history-calendar__month-head span,
-.history-archive__selected-head span {
+.history-archive__selected-head span,
+.history-calendar__month-head span {
color: var(--muted-2);
font-size: .64rem;
}
-.history-calendar__weekdays,
-.history-calendar__days {
+.history-calendar__days,
+.history-calendar__weekdays {
display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr));
gap: 4px;
@@ -1426,7 +1417,7 @@ button.history-calendar__day {
padding: 13px 0;
}
-.revision::after {
+.revision:after {
content: "";
position: absolute;
top: 25px;
@@ -1436,7 +1427,7 @@ button.history-calendar__day {
background: var(--border);
}
-.revision:last-child::after {
+.revision:last-child:after {
display: none;
}
@@ -1481,7 +1472,7 @@ button.history-calendar__day {
}
dialog {
- width: min(420px, calc(100% - 24px));
+ width: min(420px, 100% - 24px);
padding: 0;
border: 0;
background: transparent;
@@ -1521,8 +1512,8 @@ dialog::backdrop {
bottom: 20px;
z-index: 100;
display: flex;
- width: min(390px, calc(100vw - 32px));
- max-height: min(720px, calc(100dvh - 40px));
+ width: calc(min(390px, 100vw - 32px));
+ max-height: calc(min(720px, 100dvh - 40px));
flex-direction: column;
gap: 10px;
pointer-events: none;
@@ -1677,7 +1668,7 @@ dialog::backdrop {
}
@keyframes toast-countdown {
- from {
+ 0% {
transform: scaleX(1);
}
@@ -1686,12 +1677,12 @@ dialog::backdrop {
}
}
-@media (max-width: 520px) {
+@media(max-width:520px) {
.toast-region {
right: 10px;
bottom: calc(10px + env(safe-area-inset-bottom, 0px));
left: auto;
- width: min(300px, calc(100vw - 20px));
+ width: calc(min(300px, 100vw - 20px));
max-height: calc(100dvh - 20px);
gap: 7px;
}
@@ -1739,8 +1730,8 @@ dialog::backdrop {
gap: 6px;
}
- .upload-toast__filename,
- .upload-toast__error {
+ .upload-toast__error,
+ .upload-toast__filename {
font-size: .67rem;
}
@@ -1765,7 +1756,7 @@ dialog::backdrop {
}
}
-@media (prefers-reduced-motion: reduce) {
+@media(prefers-reduced-motion:reduce) {
.toast-card {
transition-duration: .01ms;
}
@@ -1781,7 +1772,7 @@ dialog::backdrop {
.error-page h1 {
margin: 0;
- font-size: clamp(2rem, 6vw, 4rem);
+ font-size: calc(clamp(2rem, 6vw, 4rem));
letter-spacing: -.05em;
}
@@ -1789,7 +1780,7 @@ dialog::backdrop {
color: var(--muted);
}
-@media (max-width: 980px) {
+@media(max-width:980px) {
.app-header {
align-items: flex-start;
min-height: auto;
@@ -1818,10 +1809,10 @@ dialog::backdrop {
}
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
- .site-header,
- .home-layout {
+ .home-layout,
+ .site-header {
width: min(100% - 24px, 520px);
}
@@ -1843,14 +1834,14 @@ dialog::backdrop {
}
.app-header .secondary-button,
- .public-header .secondary-button,
- .pad-page .page-settings>summary.secondary-button {
+ .pad-page .page-settings>summary.secondary-button,
+ .public-header .secondary-button {
min-height: 36px;
}
}
-@media (max-width: 480px) {
+@media(max-width:480px) {
.create-panel {
padding: 20px;
}
@@ -1877,7 +1868,7 @@ dialog::backdrop {
}
.workspace-page {
- width: min(1100px, calc(100% - 32px));
+ width: min(1100px, 100% - 32px);
margin: 0 auto;
padding: 44px 0 80px;
}
@@ -1962,7 +1953,7 @@ dialog::backdrop {
}
.error-card h1 {
- font-size: clamp(1.8rem, 6vw, 3rem);
+ font-size: calc(clamp(1.8rem, 6vw, 3rem));
}
.error-card>p:not(.error-code) {
@@ -1978,7 +1969,7 @@ dialog::backdrop {
margin-top: 24px;
}
-@media (max-width: 480px) {
+@media(max-width:480px) {
.error-card {
padding: 24px 18px;
}
@@ -1993,7 +1984,7 @@ dialog::backdrop {
}
.home-layout--wide {
- width: min(1040px, calc(100% - 32px));
+ width: min(1040px, 100% - 32px);
}
.create-grid {
@@ -2027,7 +2018,7 @@ dialog::backdrop {
width: 100%;
}
-@media (max-width: 760px) {
+@media(max-width:760px) {
.home-layout--wide {
width: min(100% - 24px, 560px);
}
@@ -2042,7 +2033,6 @@ dialog::backdrop {
grid-template-columns: auto minmax(0, 1fr);
min-height: 0;
overflow: hidden;
- background: var(--surface-inset);
}
.line-gutter {
@@ -2093,7 +2083,7 @@ dialog::backdrop {
position: relative;
display: inline-flex;
align-items: center;
- gap: 0.35rem;
+ gap: .35rem;
}
.user-chip {
@@ -2109,8 +2099,8 @@ dialog::backdrop {
font-size: .78rem;
}
-.user-chip:hover,
-.user-chip:focus-visible {
+.user-chip:focus-visible,
+.user-chip:hover {
background: var(--surface-2);
outline: none;
}
@@ -2186,7 +2176,6 @@ dialog::backdrop {
background: var(--code-bg);
color: var(--code-text);
font: .72rem/1.5 ui-monospace, monospace;
- white-space: pre-wrap;
}
.revision button+button {
@@ -2201,7 +2190,7 @@ dialog::backdrop {
background: var(--surface-deep);
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.line-gutter {
width: 48px;
padding-top: 18px;
@@ -2247,7 +2236,7 @@ dialog::backdrop {
align-items: center;
justify-content: space-between;
min-height: var(--top-header-height);
- padding: 0 max(20px, calc((100vw - 900px) / 2));
+ padding: 0 calc(max(20px, 50vw - 450px));
border-bottom: 1px solid var(--border);
background: var(--glass-92);
backdrop-filter: blur(12px);
@@ -2261,7 +2250,7 @@ dialog::backdrop {
.public-document>h1 {
margin: 0;
- font-size: clamp(2rem, 6vw, 4rem);
+ font-size: calc(clamp(2rem, 6vw, 4rem));
line-height: 1.08;
}
@@ -2287,7 +2276,7 @@ dialog::backdrop {
padding-left: 32px;
}
-@media (max-width: 600px) {
+@media(max-width:600px) {
.public-document {
padding-top: 32px;
}
@@ -2348,18 +2337,18 @@ dialog::backdrop {
.home-header {
background: transparent;
- width: min(1040px, calc(100% - 32px));
+ width: min(1040px, 100% - 32px);
border-bottom-color: var(--live-border);
}
.home-brand {
- background: linear-gradient(110deg, var(--live-gradient-start) 0%, var(--live-gradient-mid) 48%, var(--live-gradient-end) 100%);
+ background: linear-gradient(110deg, var(--live-gradient-start) 0, var(--live-gradient-mid) 48%, var(--live-gradient-end) 100%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
-@media (max-width: 760px) {
+@media(max-width:760px) {
.home-footer {
width: min(100% - 24px, 560px);
margin-bottom: 20px;
@@ -2386,8 +2375,8 @@ dialog::backdrop {
position: absolute;
right: calc(var(--editor-rendered-font-size, 14px) * .57);
box-sizing: border-box;
- max-width: min(calc(var(--editor-rendered-font-size, 14px) * 12.8571), 45%);
- max-height: calc(var(--editor-line-height, 29px) - 2px);
+ max-width: min(var(--editor-rendered-font-size, 14px) * 12.8571, 45%);
+ max-height: calc(-2px + var(--editor-line-height, 29px));
overflow: hidden;
padding: .14em .5em;
border: 1px solid color-mix(in srgb, var(--owner) 62%, transparent);
@@ -2404,7 +2393,7 @@ dialog::backdrop {
left: 0;
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.line-gutter {
width: 42px;
}
@@ -2420,7 +2409,6 @@ dialog::backdrop {
}
.owner-labels {
- z-index: 4;
top: 0;
bottom: 0;
height: auto;
@@ -2453,28 +2441,28 @@ dialog::backdrop {
font-size: .74rem;
}
-.editor-workspace-font-system textarea,
-.editor-workspace-font-system .preview {
+.editor-workspace-font-system .preview,
+.editor-workspace-font-system textarea {
font-family: Inter, ui-sans-serif, system-ui, sans-serif;
}
-.editor-workspace-font-serif textarea,
-.editor-workspace-font-serif .preview {
- font-family: ui-serif, Georgia, Cambria, "Times New Roman", serif;
+.editor-workspace-font-serif .preview,
+.editor-workspace-font-serif textarea {
+ font-family: ui-serif, Georgia, Cambria, Times New Roman, serif;
}
-.editor-workspace-font-arial textarea,
-.editor-workspace-font-arial .preview {
+.editor-workspace-font-arial .preview,
+.editor-workspace-font-arial textarea {
font-family: Arial, Helvetica, sans-serif;
}
-.editor-workspace-font-georgia textarea,
-.editor-workspace-font-georgia .preview {
- font-family: Georgia, "Times New Roman", serif;
+.editor-workspace-font-georgia .preview,
+.editor-workspace-font-georgia textarea {
+ font-family: Georgia, Times New Roman, serif;
}
-.editor-workspace-font-mono textarea,
-.editor-workspace-font-mono .preview {
+.editor-workspace-font-mono .preview,
+.editor-workspace-font-mono textarea {
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
}
@@ -2489,20 +2477,20 @@ dialog::backdrop {
font-size: .68rem;
}
-.compact-editor textarea,
-.compact-editor .preview {
+.compact-editor .preview,
+.compact-editor textarea {
padding-top: 14px;
padding-bottom: 14px;
- font-size: calc(var(--editor-font-size, 18px) - 2px);
+ font-size: calc(-2px + var(--editor-font-size, 18px));
line-height: 1.45;
}
-.workspace textarea,
-.workspace .preview {
+.workspace .preview,
+.workspace textarea {
font-size: var(--editor-font-size, 18px);
}
-@media (max-width: 900px) {
+@media(max-width:900px) {
.editor-controls {
order: 3;
width: 100%;
@@ -2533,11 +2521,11 @@ dialog::backdrop {
}
.compact-editor .line-gutter {
- font-size: calc(var(--editor-font-size, 18px) - 2px);
+ font-size: calc(-2px + var(--editor-font-size, 18px));
}
.image-editor-dialog {
- width: min(920px, calc(100% - 28px));
+ width: min(920px, 100% - 28px);
max-width: none;
padding: 0;
border: 1px solid var(--border);
@@ -2630,7 +2618,7 @@ dialog::backdrop {
font-weight: 600;
}
-.image-editor-controls input[type="range"] {
+.image-editor-controls input[type=range] {
height: 40px;
min-height: 40px;
margin: 0;
@@ -2644,14 +2632,14 @@ dialog::backdrop {
cursor: pointer;
}
-.image-editor-controls input[type="range"]::-webkit-slider-runnable-track {
+.image-editor-controls input[type=range]::-webkit-slider-runnable-track {
height: 5px;
border: 1px solid var(--border-strong);
border-radius: 999px;
background: var(--surface-strong-2);
}
-.image-editor-controls input[type="range"]::-webkit-slider-thumb {
+.image-editor-controls input[type=range]::-webkit-slider-thumb {
width: 17px;
height: 17px;
margin-top: -7px;
@@ -2664,29 +2652,29 @@ dialog::backdrop {
transition: transform .12s ease, background-color .12s ease;
}
-.image-editor-controls input[type="range"]:hover::-webkit-slider-thumb {
+.image-editor-controls input[type=range]:hover::-webkit-slider-thumb {
background: var(--accent-hover);
transform: scale(1.08);
}
-.image-editor-controls input[type="range"]:focus-visible::-webkit-slider-thumb {
+.image-editor-controls input[type=range]:focus-visible::-webkit-slider-thumb {
box-shadow: 0 0 0 1px var(--accent-border), 0 0 0 4px var(--focus-ring);
}
-.image-editor-controls input[type="range"]::-moz-range-track {
+.image-editor-controls input[type=range]::-moz-range-track {
height: 5px;
border: 1px solid var(--border-strong);
border-radius: 999px;
background: var(--surface-strong-2);
}
-.image-editor-controls input[type="range"]::-moz-range-progress {
+.image-editor-controls input[type=range]::-moz-range-progress {
height: 5px;
border-radius: 999px;
background: var(--accent);
}
-.image-editor-controls input[type="range"]::-moz-range-thumb {
+.image-editor-controls input[type=range]::-moz-range-thumb {
width: 13px;
height: 13px;
border: 2px solid var(--surface-panel);
@@ -2696,22 +2684,22 @@ dialog::backdrop {
transition: transform .12s ease, background-color .12s ease;
}
-.image-editor-controls input[type="range"]:hover::-moz-range-thumb {
+.image-editor-controls input[type=range]:hover::-moz-range-thumb {
background: var(--accent-hover);
transform: scale(1.08);
}
-.image-editor-controls input[type="range"]:focus-visible::-moz-range-thumb {
+.image-editor-controls input[type=range]:focus-visible::-moz-range-thumb {
box-shadow: 0 0 0 1px var(--accent-border), 0 0 0 4px var(--focus-ring);
}
-.image-editor-controls input[type="range"]:disabled {
+.image-editor-controls input[type=range]:disabled {
cursor: not-allowed;
opacity: .45;
}
-.image-editor-controls input[type="range"]:disabled::-webkit-slider-thumb,
-.image-editor-controls input[type="range"]:disabled::-moz-range-thumb {
+.image-editor-controls input[type=range]:disabled::-moz-range-thumb,
+.image-editor-controls input[type=range]:disabled::-webkit-slider-thumb {
background: var(--muted-2);
box-shadow: 0 0 0 1px var(--border-strong);
transform: none;
@@ -2723,7 +2711,7 @@ dialog::backdrop {
gap: 10px;
}
-@media (max-width: 680px) {
+@media(max-width:680px) {
.image-editor-controls {
grid-template-columns: 1fr;
}
@@ -2734,11 +2722,11 @@ dialog::backdrop {
}
.public-header {
- padding-inline: max(20px, calc((100vw - 1180px) / 2));
+ padding-inline: calc(max(20px, 50vw - 590px));
}
.public-document {
- width: min(1180px, calc(100% - 32px));
+ width: min(1180px, 100% - 32px);
}
.public-page.public-full-width .public-header {
@@ -2751,7 +2739,7 @@ dialog::backdrop {
}
.public-content {
- padding: clamp(24px, 4vw, 52px);
+ padding: calc(clamp(24px, 4vw, 52px));
}
.preview {
@@ -2859,8 +2847,8 @@ dialog::backdrop {
cursor: pointer;
}
-.image-alias-tools button:hover,
-.image-alias-tools button.active {
+.image-alias-tools button.active,
+.image-alias-tools button:hover {
border-color: var(--accent);
background: color-mix(in srgb, var(--accent) 12%, transparent);
}
@@ -2897,7 +2885,7 @@ dialog::backdrop {
user-select: none;
}
-@media (max-width: 680px) {
+@media(max-width:680px) {
.image-alias-tools {
top: 4px;
right: 4px;
@@ -2963,7 +2951,7 @@ dialog::backdrop {
transition: color .15s ease, text-shadow .15s ease, transform .15s ease;
}
-.note-favorite-button:not([aria-pressed="true"]):hover {
+.note-favorite-button:not([aria-pressed=true]):hover {
color: var(--text);
}
@@ -2972,7 +2960,7 @@ dialog::backdrop {
text-shadow: 0 0 8px color-mix(in srgb, var(--accent) 45%, transparent);
}
-.note-favorite-button[aria-pressed="true"] {
+.note-favorite-button[aria-pressed=true] {
color: var(--accent);
text-shadow: 0 0 8px color-mix(in srgb, var(--accent) 55%, transparent);
transform: scale(1.08);
@@ -2983,8 +2971,8 @@ dialog::backdrop {
cursor: wait;
}
-.protect-badge,
-.file-flag {
+.file-flag,
+.protect-badge {
display: inline-flex;
padding: 3px 7px;
border: 1px solid var(--border-strong);
@@ -3026,6 +3014,26 @@ dialog::backdrop {
min-height: auto;
}
+.note-protection-help {
+ margin: 4px 0 12px;
+ padding: 10px 12px;
+ border-left: 2px solid var(--accent-border);
+ border-radius: 0 8px 8px 0;
+ background: var(--wash-subtle);
+ color: var(--text-secondary);
+ font-size: .76rem;
+ line-height: 1.5;
+}
+
+.note-protection-help p {
+ margin: 0;
+}
+
+.note-protection-help p+p {
+ margin-top: 8px;
+ color: var(--muted);
+}
+
.footer-link {
border: 0;
background: transparent;
@@ -3037,14 +3045,14 @@ dialog::backdrop {
}
.files-dialog {
- width: min(940px, calc(100% - 28px));
+ width: min(940px, 100% - 28px);
overflow: hidden;
}
.files-panel {
grid-template-rows: auto auto minmax(0, 1fr);
min-height: 0;
- height: min(650px, calc(100dvh - 28px));
+ height: calc(min(650px, 100dvh - 28px));
max-height: calc(100dvh - 28px);
gap: 14px;
}
@@ -3081,9 +3089,9 @@ dialog::backdrop {
flex: 0 0 auto;
}
+.files-head-actions .danger-button,
.files-head-actions .primary-button,
-.files-head-actions .secondary-button,
-.files-head-actions .danger-button {
+.files-head-actions .secondary-button {
width: auto;
}
@@ -3171,7 +3179,7 @@ dialog::backdrop {
font-size: .7rem;
}
-.file-meta>span:not(.file-flag)+span:not(.file-flag)::before {
+.file-meta>span:not(.file-flag)+span:not(.file-flag):before {
content: "·";
margin-right: 8px;
color: var(--border-strong);
@@ -3201,13 +3209,13 @@ dialog::backdrop {
min-width: 102px;
}
-.file-more-button[aria-expanded="true"] {
+.file-more-button[aria-expanded=true] {
border-color: var(--border-strong);
background: var(--surface-2);
}
.file-secondary-actions {
- grid-column: 1 / -1;
+ grid-column: 1/-1;
display: grid;
gap: 8px;
padding-top: 9px;
@@ -3268,7 +3276,7 @@ dialog::backdrop {
color: var(--text);
}
-.file-secondary-actions [data-show-file-code][aria-pressed="true"] {
+.file-secondary-actions [data-show-file-code][aria-pressed=true] {
border-color: var(--border-strong);
background: var(--surface-2);
}
@@ -3307,9 +3315,9 @@ dialog::backdrop {
line-height: 1.5;
}
+.files-state .danger-button,
.files-state .primary-button,
-.files-state .secondary-button,
-.files-state .danger-button {
+.files-state .secondary-button {
margin-top: 14px;
}
@@ -3360,7 +3368,7 @@ dialog::backdrop {
}
@keyframes file-skeleton-pulse {
- from {
+ 0% {
background-position: 100% 0;
}
@@ -3388,11 +3396,11 @@ dialog::backdrop {
@keyframes ui-spinner-rotate {
to {
- transform: rotate(360deg);
+ transform: rotate(1turn);
}
}
-@media (prefers-reduced-motion: reduce) {
+@media(prefers-reduced-motion:reduce) {
.file-row,
.file-skeleton,
@@ -3402,9 +3410,9 @@ dialog::backdrop {
}
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.files-panel {
- height: min(720px, calc(100dvh - 18px));
+ height: calc(min(720px, 100dvh - 18px));
padding: 14px;
}
@@ -3420,9 +3428,9 @@ dialog::backdrop {
gap: 6px;
}
+ .files-head-actions .danger-button,
.files-head-actions .primary-button,
- .files-head-actions .secondary-button,
- .files-head-actions .danger-button {
+ .files-head-actions .secondary-button {
padding-inline: 9px;
}
@@ -3455,7 +3463,7 @@ dialog::backdrop {
}
.video-insert-dialog {
- width: min(560px, calc(100vw - 24px));
+ width: calc(min(560px, 100vw - 24px));
max-width: 560px;
}
@@ -3477,9 +3485,9 @@ dialog::backdrop {
gap: 18px;
}
-.video-insert-dialog__panel h2,
+.video-insert-dialog__panel .dialog-copy,
.video-insert-dialog__panel .eyebrow,
-.video-insert-dialog__panel .dialog-copy {
+.video-insert-dialog__panel h2 {
margin: 0;
}
@@ -3517,7 +3525,7 @@ dialog::backdrop {
color: var(--text-secondary);
}
-@media (max-width: 600px) {
+@media(max-width:600px) {
.video-choice-actions {
grid-template-columns: minmax(0, 1fr);
}
@@ -3593,7 +3601,7 @@ dialog::backdrop {
}
.workspace-password-card>.form-message {
- grid-column: 1 / -1;
+ grid-column: 1/-1;
margin: 0;
font-size: .72rem;
}
@@ -3621,15 +3629,15 @@ dialog::backdrop {
.workspace-settings-card__copy {
display: grid;
gap: 2px;
- grid-column: 1 / -1;
+ grid-column: 1/-1;
}
.workspace-settings-card__copy strong {
font-size: .82rem;
}
-.workspace-settings-card__copy small,
-.workspace-settings-card>.form-message {
+.workspace-settings-card>.form-message,
+.workspace-settings-card__copy small {
color: var(--muted);
font-size: .72rem;
}
@@ -3650,7 +3658,7 @@ dialog::backdrop {
}
.workspace-settings-card>.form-message {
- grid-column: 1 / -1;
+ grid-column: 1/-1;
margin: 0;
}
@@ -3659,12 +3667,12 @@ dialog::backdrop {
}
.archived-notes-dialog {
- width: min(620px, calc(100% - 24px));
+ width: min(620px, 100% - 24px);
}
.archived-notes-panel {
grid-template-rows: auto minmax(0, 1fr);
- max-height: min(78dvh, 720px);
+ max-height: calc(min(78dvh, 720px));
overflow: hidden;
}
@@ -3714,8 +3722,8 @@ dialog::backdrop {
white-space: nowrap;
}
-.archived-note-card__copy span,
-.archived-note-card__copy small {
+.archived-note-card__copy small,
+.archived-note-card__copy span {
color: var(--muted);
font-size: .74rem;
}
@@ -3785,8 +3793,8 @@ dialog::backdrop {
border-collapse: collapse;
}
-.notes-table th,
-.notes-table td {
+.notes-table td,
+.notes-table th {
padding: 13px 15px;
border-bottom: 1px solid var(--border);
text-align: left;
@@ -3856,7 +3864,7 @@ dialog::backdrop {
border-radius: 6px;
}
-@media (max-width: 700px) {
+@media(max-width:700px) {
.workspace-top {
align-items: flex-start;
flex-direction: column;
@@ -3932,10 +3940,10 @@ dialog::backdrop {
min-height: 1.32em;
}
-.preview-source-line::before {
+.preview-source-line:before {
content: attr(data-source-line);
position: absolute;
- top: var(--preview-line-top, 0px);
+ top: var(--preview-line-top, 0);
left: var(--preview-line-left, -50px);
width: 32px;
color: var(--gutter-text);
@@ -3952,7 +3960,7 @@ dialog::backdrop {
-webkit-user-select: text;
}
-.preview-editable[contenteditable="true"] {
+.preview-editable[contenteditable=true] {
caret-color: auto;
}
@@ -3979,8 +3987,8 @@ dialog::backdrop {
margin: .3em 0;
}
-.markdown-body ul,
-.markdown-body ol {
+.markdown-body ol,
+.markdown-body ul {
margin: .22em 0;
}
@@ -3992,7 +4000,7 @@ dialog::backdrop {
padding-left: 24px;
}
-.hide-preview-line-numbers .preview-source-line::before {
+.hide-preview-line-numbers .preview-source-line:before {
display: none;
}
@@ -4006,8 +4014,8 @@ dialog::backdrop {
border-collapse: collapse;
}
-.markdown-body th,
-.markdown-body td {
+.markdown-body td,
+.markdown-body th {
padding: .55em .7em;
border: 1px solid var(--border);
vertical-align: top;
@@ -4078,7 +4086,7 @@ dialog::backdrop {
border-color: var(--accent);
background-color: var(--accent);
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M2 6.5 4.7 9 10 3'/%3E%3C/svg%3E");
- background-position: center;
+ background-position: 50%;
background-repeat: no-repeat;
background-size: .78em .78em;
}
@@ -4109,8 +4117,8 @@ dialog::backdrop {
opacity: .6;
}
-.markdown-body .task-list-item>ul,
-.markdown-body .task-list-item>ol {
+.markdown-body .task-list-item>ol,
+.markdown-body .task-list-item>ul {
min-width: 0;
}
@@ -4159,7 +4167,7 @@ dialog::backdrop {
font-size: .82rem;
}
-@media (max-width: 520px) {
+@media(max-width:520px) {
.shortcut-grid {
grid-template-columns: 1fr;
gap: 5px;
@@ -4221,7 +4229,7 @@ dialog::backdrop {
z-index: 55;
left: 0;
bottom: calc(100% + 9px);
- width: min(400px, calc(100vw - 24px));
+ width: calc(min(400px, 100vw - 24px));
padding: 12px;
border: 1px solid var(--border-strong);
border-radius: 10px;
@@ -4254,7 +4262,7 @@ dialog::backdrop {
}
.connection-diagnostics-grid__wide {
- grid-column: 1 / -1;
+ grid-column: 1/-1;
}
.connection-diagnostics-grid dt {
@@ -4276,15 +4284,15 @@ dialog::backdrop {
line-height: 1.35;
}
-:is(.connection-details, .mobile-connection-details):is(.is-quality-excellent, .is-quality-good) [data-connection-diagnostic="quality"] {
+:is(.connection-details, .mobile-connection-details):is(.is-quality-excellent, .is-quality-good) [data-connection-diagnostic=quality] {
color: var(--success);
}
-:is(.connection-details, .mobile-connection-details).is-quality-degraded [data-connection-diagnostic="quality"] {
+:is(.connection-details, .mobile-connection-details).is-quality-degraded [data-connection-diagnostic=quality] {
color: var(--warning);
}
-:is(.connection-details, .mobile-connection-details).is-quality-poor [data-connection-diagnostic="quality"] {
+:is(.connection-details, .mobile-connection-details).is-quality-poor [data-connection-diagnostic=quality] {
color: var(--danger);
}
@@ -4347,13 +4355,13 @@ dialog::backdrop {
}
.hljs-keyword,
-.hljs-selector-tag,
-.hljs-literal {
+.hljs-literal,
+.hljs-selector-tag {
color: var(--syntax-keyword);
}
-.hljs-string,
-.hljs-attr {
+.hljs-attr,
+.hljs-string {
color: var(--syntax-string);
}
@@ -4371,7 +4379,7 @@ dialog::backdrop {
pointer-events: auto;
}
-@media (max-width:720px) {
+@media(max-width:720px) {
.footer-left,
.footer-right {
@@ -4447,7 +4455,7 @@ dialog::backdrop {
}
.home-footer {
- width: min(1040px, calc(100% - 32px));
+ width: min(1040px, 100% - 32px);
margin: auto auto 24px;
padding-top: 24px;
color: var(--muted);
@@ -4463,6 +4471,106 @@ dialog::backdrop {
border-top: 1px solid var(--border);
}
+.home-footer__account-slot {
+ position: relative;
+ display: flex;
+ flex: 1 1 auto;
+ align-items: center;
+ min-width: 0;
+ min-height: 52px;
+}
+
+.home-footer__account-pending {
+ position: absolute;
+ inset: 0 auto 0 0;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ width: min(100%, 270px);
+ pointer-events: none;
+ opacity: 1;
+ transition: opacity .18s ease, visibility .18s;
+}
+
+.home-footer__loading-action,
+.home-footer__loading-line {
+ display: block;
+ height: 13px;
+ flex: 0 1 135px;
+ border-radius: 6px;
+ background: var(--surface-2);
+ box-shadow: inset 0 0 0 1px var(--border);
+ animation: home-account-wait 1.4s ease-in-out infinite;
+}
+
+.home-footer__loading-action {
+ flex: 0 0 82px;
+ height: 34px;
+ border-radius: 8px;
+ animation-delay: .15s;
+}
+
+.home-footer__account-slot[data-state=error] .home-footer__account-pending,
+.home-footer__account-slot[data-state=ready] .home-footer__account-pending {
+ opacity: 0;
+ visibility: hidden;
+}
+
+.home-footer__account-slot[data-state=ready]>.home-footer__account:not([hidden]) {
+ animation: home-account-reveal .25s ease-out both;
+}
+
+@keyframes home-account-wait {
+
+ 0%,
+ to {
+ opacity: .45;
+ }
+
+ 50% {
+ opacity: .85;
+ }
+}
+
+@keyframes home-account-reveal {
+ 0% {
+ opacity: 0;
+ transform: translateY(5px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@media(prefers-reduced-motion:reduce) {
+
+ .home-footer__account-slot[data-state=ready]>.home-footer__account:not([hidden]),
+ .home-footer__loading-action,
+ .home-footer__loading-line {
+ animation: none;
+ }
+
+ .home-footer__account-pending {
+ transition: none;
+ }
+}
+
+@media(max-width:600px) {
+ .home-footer__account-slot {
+ width: 100%;
+ min-height: 52px;
+ justify-content: center;
+ }
+
+ .home-footer__account-pending {
+ inset: 0;
+ justify-content: center;
+ margin: auto;
+ }
+}
+
.home-footer__account {
display: inline-flex;
min-width: 0;
@@ -4474,7 +4582,7 @@ dialog::backdrop {
.home-footer__user {
display: grid;
min-width: 0;
- max-width: min(360px, 42vw);
+ max-width: calc(min(360px, 42vw));
gap: 2px;
color: var(--text);
font-weight: 600;
@@ -4528,7 +4636,7 @@ dialog::backdrop {
}
.app-dialog {
- width: min(440px, calc(100% - 28px));
+ width: min(440px, 100% - 28px);
padding: 0;
border: 0;
background: transparent;
@@ -4548,24 +4656,24 @@ dialog::backdrop {
}
#profile-dialog {
- width: min(820px, calc(100% - 32px));
+ width: min(820px, 100% - 32px);
max-width: 820px;
- max-height: min(90dvh, 760px);
+ max-height: calc(min(90dvh, 760px));
}
#profile-dialog .identity-panel {
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: 20px;
- max-height: min(90dvh, 760px);
+ max-height: calc(min(90dvh, 760px));
overflow-y: auto;
scrollbar-gutter: stable;
}
-#profile-dialog .identity-panel__header,
+#profile-dialog .form-message,
#profile-dialog .identity-fields,
-#profile-dialog .profile-actions,
-#profile-dialog .form-message {
- grid-column: 1 / -1;
+#profile-dialog .identity-panel__header,
+#profile-dialog .profile-actions {
+ grid-column: 1/-1;
}
#profile-dialog .identity-fields {
@@ -4574,21 +4682,21 @@ dialog::backdrop {
column-gap: 18px;
}
-#profile-dialog .profile-theme-field,
#profile-dialog .profile-language-field,
-#profile-dialog .profile-suggestion {
- grid-column: 1 / -1;
+#profile-dialog .profile-suggestion,
+#profile-dialog .profile-theme-field {
+ grid-column: 1/-1;
}
#profile-dialog,
-#profile-dialog .identity-panel,
#profile-dialog .identity-fields,
#profile-dialog .identity-fields>*,
+#profile-dialog .identity-panel,
#profile-dialog .profile-actions,
-#profile-dialog .profile-theme-field,
#profile-dialog .profile-language-field,
-#profile-dialog .theme-options,
-#profile-dialog .theme-option {
+#profile-dialog .profile-theme-field,
+#profile-dialog .theme-option,
+#profile-dialog .theme-options {
min-width: 0;
box-sizing: border-box;
}
@@ -4597,7 +4705,7 @@ dialog::backdrop {
overflow-x: hidden;
}
-#profile-dialog .identity-fields input:not([type="radio"]):not([type="checkbox"]),
+#profile-dialog .identity-fields input:not([type=radio]):not([type=checkbox]),
#profile-dialog .identity-fields select,
#profile-dialog .identity-fields textarea {
width: 100%;
@@ -4606,11 +4714,11 @@ dialog::backdrop {
box-sizing: border-box;
}
+#profile-dialog .profile-actions button,
#profile-dialog .theme-option,
-#profile-dialog .theme-option span,
-#profile-dialog .theme-option strong,
#profile-dialog .theme-option small,
-#profile-dialog .profile-actions button {
+#profile-dialog .theme-option span,
+#profile-dialog .theme-option strong {
overflow-wrap: anywhere;
}
@@ -4717,7 +4825,7 @@ dialog::backdrop {
color: var(--success-soft);
}
-@media (max-width: 600px) {
+@media(max-width:600px) {
.home-footer__inner {
align-items: stretch;
flex-direction: column;
@@ -4763,16 +4871,16 @@ dialog::backdrop {
padding-right: 36px;
}
- #profile-dialog .identity-panel,
#profile-dialog .identity-fields,
+ #profile-dialog .identity-panel,
#profile-dialog .profile-actions,
#profile-dialog .theme-options {
grid-template-columns: minmax(0, 1fr);
}
+ #profile-dialog .form-message,
#profile-dialog .identity-fields>*,
- #profile-dialog .profile-actions,
- #profile-dialog .form-message {
+ #profile-dialog .profile-actions {
grid-column: 1;
}
@@ -4787,11 +4895,11 @@ dialog::backdrop {
}
}
-.home-footer__account[hidden],
+.auth-panel[hidden],
.footer-action[hidden],
-.identity-links [hidden],
+.home-footer__account[hidden],
.identity-fields [hidden],
-.auth-panel[hidden] {
+.identity-links [hidden] {
display: none !important;
}
@@ -4806,8 +4914,8 @@ dialog::backdrop {
margin-top: 4px;
}
-.secondary-button,
-.danger-button {
+.danger-button,
+.secondary-button {
min-height: 42px;
padding: 0 16px;
border: 1px solid var(--border);
@@ -4846,7 +4954,7 @@ dialog::backdrop {
}
#resources-dialog {
- width: min(760px, calc(100% - 28px));
+ width: min(760px, 100% - 28px);
max-width: 760px;
}
@@ -4942,8 +5050,8 @@ dialog::backdrop {
transition: color .15s ease, text-shadow .15s ease, transform .15s ease;
}
-.resource-favorite-remove:hover,
-.resource-favorite-remove:focus-visible {
+.resource-favorite-remove:focus-visible,
+.resource-favorite-remove:hover {
background: transparent;
color: var(--accent);
text-shadow: 0 0 10px color-mix(in srgb, var(--accent) 70%, transparent);
@@ -4966,7 +5074,7 @@ dialog::backdrop {
border-radius: 10px;
}
-.resource-row> :first-child {
+.resource-row>:first-child {
min-width: 0;
}
@@ -5058,8 +5166,8 @@ dialog::backdrop {
cursor: pointer;
}
-.resource-password-menu__item:hover,
-.resource-password-menu__item:focus-visible {
+.resource-password-menu__item:focus-visible,
+.resource-password-menu__item:hover {
background: var(--surface-3);
}
@@ -5067,8 +5175,8 @@ dialog::backdrop {
color: var(--danger);
}
-.resource-password-menu__item--danger:hover,
-.resource-password-menu__item--danger:focus-visible {
+.resource-password-menu__item--danger:focus-visible,
+.resource-password-menu__item--danger:hover {
background: var(--danger-subtle-bg);
}
@@ -5140,12 +5248,11 @@ dialog::backdrop {
.line-gutter {
position: relative;
- z-index: 5;
flex: none;
}
-.preview,
-.editor-shell textarea {
+.editor-shell textarea,
+.preview {
scrollbar-gutter: stable;
}
@@ -5172,11 +5279,11 @@ dialog::backdrop {
padding: .35em .8em .7em;
}
-.markdown-details__content> :first-child {
+.markdown-details__content>:first-child {
margin-top: 0;
}
-.markdown-details__content> :last-child {
+.markdown-details__content>:last-child {
margin-bottom: 0;
}
@@ -5209,8 +5316,8 @@ dialog::backdrop {
}
.pad-page .editor-column,
-.pad-page .preview-column,
-.pad-page .editor-shell {
+.pad-page .editor-shell,
+.pad-page .preview-column {
min-height: 0;
overflow: hidden;
}
@@ -5229,13 +5336,13 @@ dialog::backdrop {
background: var(--surface);
}
-@media (max-width: 980px) {
+@media(max-width:980px) {
.pad-page .editor-layout {
height: auto;
}
}
-.markdown-details__content .preview-source-line::before {
+.markdown-details__content .preview-source-line:before {
display: none;
}
@@ -5284,8 +5391,8 @@ dialog::backdrop {
z-index: 40;
display: grid;
grid-template-columns: 150px minmax(280px, 380px);
- width: min(560px, calc(100vw - 24px));
- max-height: min(430px, 70vh);
+ width: calc(min(560px, 100vw - 24px));
+ max-height: calc(min(430px, 70vh));
overflow: hidden;
border: 1px solid var(--border);
border-radius: 10px;
@@ -5300,8 +5407,8 @@ dialog::backdrop {
border-right: 1px solid var(--border);
}
-.room-users strong,
-.room-chat__head strong {
+.room-chat__head strong,
+.room-users strong {
display: block;
margin-bottom: 8px;
font-size: .75rem;
@@ -5396,7 +5503,7 @@ dialog::backdrop {
cursor: pointer;
}
-@media (max-width: 700px) {
+@media(max-width:700px) {
.room-popover {
grid-template-columns: 1fr;
left: auto;
@@ -5519,8 +5626,8 @@ dialog::backdrop {
border-top: 0;
}
-.share-list-row strong,
-.share-list-row small {
+.share-list-row small,
+.share-list-row strong {
display: block;
overflow-wrap: anywhere;
}
@@ -5539,8 +5646,8 @@ dialog::backdrop {
grid-template-columns: minmax(170px, 1fr) minmax(130px, auto) 100px auto auto auto;
}
-.share-link-row input,
-.share-link-row .app-select--field {
+.share-link-row .app-select--field,
+.share-link-row input {
min-width: 0;
}
@@ -5549,12 +5656,12 @@ dialog::backdrop {
color: var(--muted);
}
-@media (max-width:800px) {
+@media(max-width:800px) {
.share-form-grid,
.share-link-form,
- .share-list-row,
- .share-link-row {
+ .share-link-row,
+ .share-list-row {
grid-template-columns: 1fr;
align-items: stretch;
}
@@ -5569,9 +5676,9 @@ dialog::backdrop {
}
.share-dialog {
- width: min(900px, calc(100% - 28px));
+ width: min(900px, 100% - 28px);
max-width: 900px;
- max-height: min(88dvh, 860px);
+ max-height: calc(min(88dvh, 860px));
padding: 0;
overflow: hidden;
}
@@ -5584,7 +5691,7 @@ dialog::backdrop {
.share-dialog .share-panel {
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto;
- max-height: min(88dvh, 860px);
+ max-height: calc(min(88dvh, 860px));
gap: 0;
}
@@ -5669,8 +5776,8 @@ dialog::backdrop {
height: 42px;
}
-.share-dialog input[type="text"],
-.share-dialog input[type="number"] {
+.share-dialog input[type=number],
+.share-dialog input[type=text] {
min-height: 42px;
border-radius: 8px;
padding: 0 12px;
@@ -5731,8 +5838,8 @@ dialog::backdrop {
font-weight: 700;
}
-.share-list-identity>div,
-.share-link-info {
+.share-link-info,
+.share-list-identity>div {
min-width: 0;
}
@@ -5747,7 +5854,7 @@ dialog::backdrop {
padding: 7px 11px;
}
-@media (max-width: 800px) {
+@media(max-width:800px) {
.share-dialog {
width: calc(100% - 16px);
max-height: calc(100dvh - 16px);
@@ -5847,7 +5954,7 @@ dialog::backdrop {
background: color-mix(in srgb, var(--accent) 4%, transparent);
}
-@media (max-width: 640px) {
+@media(max-width:640px) {
#resources-dialog {
width: calc(100% - 12px);
}
@@ -5895,8 +6002,8 @@ dialog::backdrop {
gap: 4px;
}
- .resource-actions>button,
.resource-actions>.resource-password-menu,
+ .resource-actions>button,
.resource-password-menu>summary {
width: 100%;
min-width: 0;
@@ -5922,7 +6029,7 @@ dialog::backdrop {
}
}
-@media (max-width: 640px) {
+@media(max-width:640px) {
.share-dialog,
.share-dialog .share-panel,
@@ -5948,11 +6055,11 @@ dialog::backdrop {
border-radius: 8px;
}
-.markdown-body .markdown-alert> :first-child {
+.markdown-body .markdown-alert>:first-child {
margin-top: 0;
}
-.markdown-body .markdown-alert> :last-child {
+.markdown-body .markdown-alert>:last-child {
margin-bottom: 0;
}
@@ -5990,7 +6097,7 @@ dialog::backdrop {
white-space: pre;
}
-.markdown-body pre.code-with-lines .code-line::before {
+.markdown-body pre.code-with-lines .code-line:before {
content: attr(data-line);
position: absolute;
left: 0;
@@ -6039,12 +6146,12 @@ dialog::backdrop {
margin-left: 0;
}
-.markdown-body ul,
-.markdown-body ol {
+.markdown-body ol,
+.markdown-body ul {
padding-left: 1.75em;
}
-.markdown-body .list-source-line::before {
+.markdown-body .list-source-line:before {
right: auto;
}
@@ -6058,7 +6165,7 @@ dialog::backdrop {
list-style: none;
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.pad-page .editor-shell {
grid-template-columns: 38px minmax(0, 1fr);
min-width: 0;
@@ -6119,7 +6226,7 @@ dialog::backdrop {
top: calc(100% + 8px);
left: 0;
z-index: 40;
- width: min(360px, calc(100vw - 24px));
+ width: calc(min(360px, 100vw - 24px));
padding: 10px;
border: 1px solid var(--border-strong);
border-radius: 10px;
@@ -6182,7 +6289,7 @@ dialog::backdrop {
font-size: 1rem;
}
-.editor-toolbar .emoji-category[aria-pressed="true"] {
+.editor-toolbar .emoji-category[aria-pressed=true] {
border-color: var(--border-strong);
background: var(--surface-2);
}
@@ -6204,8 +6311,8 @@ dialog::backdrop {
line-height: 1;
}
-.editor-toolbar .emoji-item:hover,
-.editor-toolbar .emoji-item:focus-visible {
+.editor-toolbar .emoji-item:focus-visible,
+.editor-toolbar .emoji-item:hover {
border-color: var(--border);
background: var(--surface-2);
transform: scale(1.08);
@@ -6218,7 +6325,7 @@ dialog::backdrop {
font-size: .82rem;
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.emoji-picker-panel {
position: fixed;
left: 12px;
@@ -6230,7 +6337,7 @@ dialog::backdrop {
.emoji-grid {
grid-template-columns: repeat(7, minmax(0, 1fr));
- max-height: min(45vh, 320px);
+ max-height: calc(min(45vh, 320px));
}
}
@@ -6264,16 +6371,13 @@ dialog::backdrop {
color: var(--warning, var(--warning-muted)) !important;
}
-@media (max-width: 800px) {
+@media(max-width:800px) {
.share-link-inline {
grid-template-columns: 1fr;
}
}
.editor-column-label {
- display: flex;
- align-items: center;
- justify-content: space-between;
gap: 10px;
}
@@ -6281,7 +6385,6 @@ dialog::backdrop {
position: absolute;
z-index: 1;
inset: 0 0 0 48px;
- overflow: hidden;
padding: 24px;
color: transparent;
font: inherit;
@@ -6300,15 +6403,13 @@ dialog::backdrop {
.editor-shell textarea {
position: relative;
- z-index: 3;
- background: transparent;
}
.hide-editor-line-numbers .authorship-layer {
left: 0;
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.authorship-layer {
left: 42px;
}
@@ -6318,7 +6419,6 @@ dialog::backdrop {
}
}
-/* The author labels scroll as one layer; clipping still belongs to .owner-labels. */
.owner-labels-canvas {
position: absolute;
inset: 0;
@@ -6329,7 +6429,7 @@ dialog::backdrop {
position: absolute;
right: calc(var(--editor-rendered-font-size, 14px) * .57);
display: flex;
- max-width: min(calc(var(--editor-rendered-font-size, 14px) * 30), 70%);
+ max-width: min(var(--editor-rendered-font-size, 14px) * 30, 70%);
gap: calc(var(--editor-rendered-font-size, 14px) * .2857);
overflow: hidden;
transform: translateY(-50%);
@@ -6350,9 +6450,9 @@ dialog::backdrop {
}
.action-button,
+.danger-button,
.primary-button,
-.secondary-button,
-.danger-button {
+.secondary-button {
display: inline-flex;
align-items: center;
justify-content: center;
@@ -6437,7 +6537,7 @@ dialog::backdrop {
margin-left: auto;
}
-.profile-color-field input[type="color"] {
+.profile-color-field input[type=color] {
width: 100%;
min-height: 42px;
padding: 4px;
@@ -6474,7 +6574,7 @@ dialog::backdrop {
}
.profile-language-control:hover,
-.profile-language-control[data-open="true"] {
+.profile-language-control[data-open=true] {
border-color: var(--accent-border);
background: var(--surface-3);
}
@@ -6484,8 +6584,8 @@ dialog::backdrop {
box-shadow: 0 0 0 3px var(--focus-ring), inset 0 1px 0 var(--wash-soft);
}
-.profile-language-control__icon,
-.profile-language-control__chevron {
+.profile-language-control__chevron,
+.profile-language-control__icon {
width: 18px;
height: 18px;
fill: none;
@@ -6503,7 +6603,7 @@ dialog::backdrop {
transition: transform .16s ease;
}
-.profile-language-control[data-open="true"] .profile-language-control__chevron {
+.profile-language-control[data-open=true] .profile-language-control__chevron {
transform: rotate(180deg);
}
@@ -6539,7 +6639,7 @@ dialog::backdrop {
right: -1px;
display: grid;
gap: 2px;
- max-height: min(260px, 42dvh);
+ max-height: calc(min(260px, 42dvh));
padding: 4px;
overflow-y: auto;
border: 1px solid var(--border-strong);
@@ -6573,14 +6673,14 @@ dialog::backdrop {
transition: border-color .12s ease, background-color .12s ease, color .12s ease;
}
-.profile-language-option:hover,
-.profile-language-option:focus-visible {
+.profile-language-option:focus-visible,
+.profile-language-option:hover {
border-color: var(--border-strong);
outline: 0;
background: var(--surface-hover);
}
-.profile-language-option[aria-selected="true"] {
+.profile-language-option[aria-selected=true] {
border-color: var(--accent-a35);
background: var(--accent-soft);
}
@@ -6596,7 +6696,7 @@ dialog::backdrop {
font-weight: 900;
}
-.profile-language-option[aria-selected="true"] .profile-language-option__check {
+.profile-language-option[aria-selected=true] .profile-language-option__check {
background: var(--accent-a25);
}
@@ -6608,8 +6708,8 @@ dialog::backdrop {
overflow: hidden;
}
-.profile-language-option__copy strong,
-.profile-language-option__copy small {
+.profile-language-option__copy small,
+.profile-language-option__copy strong {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -6691,9 +6791,9 @@ dialog::backdrop {
accent-color: var(--accent);
}
+.theme-option small,
.theme-option span,
-.theme-option strong,
-.theme-option small {
+.theme-option strong {
display: block;
min-width: 0;
}
@@ -6710,13 +6810,13 @@ dialog::backdrop {
line-height: 1.35;
}
-@media (max-width: 520px) {
+@media(max-width:520px) {
.theme-options {
grid-template-columns: 1fr;
}
}
-@media (min-width: 1500px) and (max-width: 1699px) {
+@media(min-width:1500px) and (max-width:1699px) {
.pad-page .editor-toolbar {
flex-wrap: nowrap;
overflow: visible;
@@ -6745,7 +6845,7 @@ dialog::backdrop {
}
}
-@media (max-width: 1499px) {
+@media(max-width:1499px) {
.pad-page {
display: flex;
flex-direction: column;
@@ -6809,15 +6909,15 @@ dialog::backdrop {
transition: transform .18s ease, opacity .18s ease;
}
- .pad-page .header-menu-toggle[aria-expanded="true"] span:nth-child(1) {
+ .pad-page .header-menu-toggle[aria-expanded=true] span:first-child {
transform: translateY(7px) rotate(45deg);
}
- .pad-page .header-menu-toggle[aria-expanded="true"] span:nth-child(2) {
+ .pad-page .header-menu-toggle[aria-expanded=true] span:nth-child(2) {
opacity: 0;
}
- .pad-page .header-menu-toggle[aria-expanded="true"] span:nth-child(3) {
+ .pad-page .header-menu-toggle[aria-expanded=true] span:nth-child(3) {
transform: translateY(-7px) rotate(-45deg);
}
@@ -6827,8 +6927,8 @@ dialog::backdrop {
right: 0;
z-index: 20;
display: none;
- width: min(320px, calc(100vw - 20px));
- max-height: min(70dvh, 520px);
+ width: calc(min(320px, 100vw - 20px));
+ max-height: calc(min(70dvh, 520px));
align-items: stretch;
flex-direction: column;
gap: 8px;
@@ -6905,8 +7005,8 @@ dialog::backdrop {
}
.pad-page .editor-controls,
- .pad-page .toolbar-action,
.pad-page .line-toggle,
+ .pad-page .toolbar-action,
.pad-page .toolbar-fill {
display: none;
}
@@ -6952,9 +7052,9 @@ dialog::backdrop {
white-space: nowrap;
}
- .pad-page textarea,
+ .pad-page .authorship-layer,
.pad-page .preview,
- .pad-page .authorship-layer {
+ .pad-page textarea {
padding: 16px;
}
@@ -6978,7 +7078,7 @@ dialog::backdrop {
}
}
-@media (max-width: 760px) {
+@media(max-width:760px) {
.connection-notice {
top: 76px;
width: calc(100% - 20px);
@@ -7007,7 +7107,7 @@ dialog::backdrop {
min-width: 62px;
}
- .pad-page .view-switch button[data-view="split"] {
+ .pad-page .view-switch button[data-view=split] {
display: none;
}
@@ -7041,7 +7141,7 @@ dialog::backdrop {
}
}
-@media (prefers-reduced-motion: reduce) {
+@media(prefers-reduced-motion:reduce) {
.connection-notice,
.connection-notice__signal span {
@@ -7050,13 +7150,13 @@ dialog::backdrop {
}
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.pad-page #save-state {
display: none;
}
}
-@media (max-width: 520px) {
+@media(max-width:520px) {
.pad-page .app-header {
padding-inline: 10px;
}
@@ -7088,14 +7188,14 @@ dialog::backdrop {
padding-inline: 8px;
}
- .pad-page textarea,
+ .pad-page .authorship-layer,
.pad-page .preview,
- .pad-page .authorship-layer {
+ .pad-page textarea {
padding: 12px;
}
}
-@media (min-width: 1921px) {
+@media(min-width:1921px) {
.pad-page .workspace.view-split {
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
}
@@ -7132,7 +7232,7 @@ dialog::backdrop {
display: none;
}
-@media (max-width: 1499px) {
+@media(max-width:1499px) {
.pad-page .mobile-editor-bubble {
position: fixed;
right: 10px;
@@ -7150,7 +7250,7 @@ dialog::backdrop {
box-shadow: 0 8px 24px var(--shadow-28);
}
- .pad-page .mobile-editor-bubble::before {
+ .pad-page .mobile-editor-bubble:before {
position: absolute;
z-index: -1;
inset: 0;
@@ -7161,8 +7261,8 @@ dialog::backdrop {
pointer-events: none;
}
- .mobile-editor-bubble>button,
- .mobile-editor-bubble>.mobile-color-button {
+ .mobile-editor-bubble>.mobile-color-button,
+ .mobile-editor-bubble>button {
display: inline-grid;
width: 34px;
height: 34px;
@@ -7183,7 +7283,7 @@ dialog::backdrop {
cursor: pointer;
}
- .mobile-color-button input[type="color"] {
+ .mobile-color-button input[type=color] {
position: absolute;
inset: 0;
width: 100%;
@@ -7240,7 +7340,7 @@ dialog::backdrop {
right: 12px;
bottom: calc(64px + env(safe-area-inset-bottom, 0px));
left: auto;
- width: min(400px, calc(100vw - 24px));
+ width: calc(min(400px, 100vw - 24px));
max-height: calc(100dvh - 88px);
overflow-y: auto;
overscroll-behavior: contain;
@@ -7252,7 +7352,7 @@ dialog::backdrop {
}
}
-@media (max-width: 1499px) {
+@media(max-width:1499px) {
.pad-page .mobile-editor-bubble {
user-select: none;
}
@@ -7267,8 +7367,8 @@ dialog::backdrop {
bottom: calc(72px + env(safe-area-inset-bottom, 0px));
left: auto;
z-index: 60;
- width: min(560px, calc(100vw - 24px));
- max-height: min(560px, calc(100dvh - 96px));
+ width: calc(min(560px, 100vw - 24px));
+ max-height: calc(min(560px, 100dvh - 96px));
}
.pad-page .mobile-editor-bubble.is-dragging {
@@ -7374,7 +7474,7 @@ dialog::backdrop {
font: 600 11px/1.3 system-ui, sans-serif;
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.editor-column-label {
align-items: center;
}
@@ -7423,7 +7523,7 @@ dialog::backdrop {
isolation: isolate;
}
-.pad-page .editor-shell::before {
+.pad-page .editor-shell:before {
position: absolute;
z-index: 0;
inset: 0;
@@ -7460,7 +7560,7 @@ dialog::backdrop {
line-height: 1.45;
}
-.pad-page .editor-shell::after {
+.pad-page .editor-shell:after {
position: absolute;
z-index: 6;
top: 0;
@@ -7479,12 +7579,12 @@ dialog::backdrop {
border-right: 0;
}
-.pad-page.hide-editor-line-numbers .editor-shell::after {
+.pad-page.hide-editor-line-numbers .editor-shell:after {
display: none;
}
-@media (max-width: 720px) {
- .pad-page .editor-shell::after {
+@media(max-width:720px) {
+ .pad-page .editor-shell:after {
left: 38px;
}
}
@@ -7608,16 +7708,16 @@ dialog::backdrop {
background: var(--border);
}
-.page-settings-menu .public-task-toggle,
-.mobile-editor-options__panel .mobile-option-check {
+.mobile-editor-options__panel .mobile-option-check,
+.page-settings-menu .public-task-toggle {
min-height: 30px;
padding: 5px 7px;
border-radius: 6px;
background: var(--surface-card);
}
-.page-settings-menu .public-task-toggle:hover,
-.mobile-editor-options__panel .mobile-option-check:hover {
+.mobile-editor-options__panel .mobile-option-check:hover,
+.page-settings-menu .public-task-toggle:hover {
background: var(--surface-hover);
}
@@ -7642,8 +7742,6 @@ dialog::backdrop {
.authorship-controls {
display: inline-flex;
- align-items: center;
- gap: 7px;
}
.authorship-layer {
@@ -7669,11 +7767,10 @@ dialog::backdrop {
}
.share-link-row .share-link-inline {
- width: 100%;
text-align: left;
}
-@media (max-width: 800px) {
+@media(max-width:800px) {
.share-link-row .share-link-info {
justify-self: stretch;
width: 100%;
@@ -7725,7 +7822,7 @@ dialog::backdrop {
transition: .15s ease;
}
-.switch-control__track::after {
+.switch-control__track:after {
content: "";
position: absolute;
width: 10px;
@@ -7742,7 +7839,7 @@ dialog::backdrop {
background: color-mix(in srgb, var(--accent) 28%, var(--surface-strong, var(--surface-strong-2)));
}
-.switch-control input:checked+.switch-control__track::after {
+.switch-control input:checked+.switch-control__track:after {
transform: translateX(14px);
background: var(--accent);
}
@@ -7750,7 +7847,6 @@ dialog::backdrop {
.share-link-row .share-link-info {
margin-top: 8px;
justify-self: start;
- text-align: left;
}
.preview-editable--source {
@@ -7781,7 +7877,7 @@ dialog::backdrop {
}
.share-link-row .share-link-info {
- grid-column: 1 / -1;
+ grid-column: 1/-1;
width: 100%;
justify-self: stretch;
text-align: left;
@@ -7807,7 +7903,7 @@ dialog::backdrop {
width: min(100%, 520px);
}
-@media (max-width: 800px) {
+@media(max-width:800px) {
.share-link-row {
grid-template-columns: 1fr;
}
@@ -7877,7 +7973,7 @@ dialog::backdrop {
transform: translateX(180%);
}
- 100% {
+ to {
transform: translateX(420%);
}
}
@@ -7958,8 +8054,8 @@ dialog::backdrop {
pointer-events: auto;
}
-.line-links-enabled .line-number-button:hover,
-.line-links-enabled .line-number-button:focus-visible {
+.line-links-enabled .line-number-button:focus-visible,
+.line-links-enabled .line-number-button:hover {
background: color-mix(in srgb, var(--accent) 14%, transparent);
color: var(--text);
outline: none;
@@ -7976,7 +8072,7 @@ dialog::backdrop {
color: var(--text);
}
-@media (max-width: 1499px) {
+@media(max-width:1499px) {
.mobile-editor-options {
position: relative;
flex: 0 0 auto;
@@ -8010,7 +8106,7 @@ dialog::backdrop {
bottom: calc(64px + env(safe-area-inset-bottom, 0px));
left: auto;
display: grid;
- width: min(360px, calc(100vw - 24px));
+ width: calc(min(360px, 100vw - 24px));
max-height: calc(100dvh - 88px);
gap: 5px;
padding: 12px;
@@ -8071,54 +8167,54 @@ dialog::backdrop {
color: var(--accent-text-strong);
}
+.pad-page .editor-toolbar :is(button, summary, select):focus-visible,
.pad-page .header-actions>.secondary-button:focus-visible,
-.pad-page .page-settings>summary.secondary-button:focus-visible,
.pad-page .page-settings-action:focus-visible,
-.pad-page .editor-toolbar :is(button, summary, select):focus-visible {
+.pad-page .page-settings>summary.secondary-button:focus-visible {
outline: 2px solid var(--focus);
outline-offset: 2px;
}
-.pad-page .editor-toolbar .toolbar-group>button,
+.pad-page .editor-toolbar .toolbar-action,
.pad-page .editor-toolbar .toolbar-group>.emoji-picker>summary,
.pad-page .editor-toolbar .toolbar-group>.markdown-more>summary,
-.pad-page .editor-toolbar .toolbar-action {
+.pad-page .editor-toolbar .toolbar-group>button {
border-color: var(--toolbar-action-border);
background: var(--toolbar-action-bg);
color: var(--toolbar-action-text);
box-shadow: inset 0 1px 0 var(--wash-medium);
}
-.pad-page .editor-toolbar .toolbar-group>button:hover,
+.pad-page .editor-toolbar .toolbar-action:hover,
.pad-page .editor-toolbar .toolbar-group>.emoji-picker>summary:hover,
-.pad-page .editor-toolbar .toolbar-group>.markdown-more>summary:hover,
.pad-page .editor-toolbar .toolbar-group>.emoji-picker[open]>summary,
+.pad-page .editor-toolbar .toolbar-group>.markdown-more>summary:hover,
.pad-page .editor-toolbar .toolbar-group>.markdown-more[open]>summary,
-.pad-page .editor-toolbar .toolbar-action:hover {
+.pad-page .editor-toolbar .toolbar-group>button:hover {
border-color: color-mix(in srgb, var(--accent) 48%, var(--toolbar-action-border));
background: var(--toolbar-action-hover);
color: var(--text);
filter: none;
}
-.pad-page .editor-toolbar .toolbar-group>button:active,
+.pad-page .editor-toolbar .toolbar-action:active,
.pad-page .editor-toolbar .toolbar-group>.emoji-picker>summary:active,
.pad-page .editor-toolbar .toolbar-group>.markdown-more>summary:active,
-.pad-page .editor-toolbar .toolbar-action:active {
+.pad-page .editor-toolbar .toolbar-group>button:active {
box-shadow: inset 0 1px 3px var(--shadow-28);
transform: translateY(1px);
}
+.pad-page .authorship-layer,
.pad-page .editor-column,
.pad-page .editor-shell,
-.pad-page .editor-shell::before,
-.pad-page .authorship-layer,
+.pad-page .editor-shell:before,
.pad-page .line-gutter {
background: var(--editor-canvas) !important;
}
-.pad-page .preview-column,
-.pad-page .preview {
+.pad-page .preview,
+.pad-page .preview-column {
background: var(--preview-canvas);
}
@@ -8186,14 +8282,14 @@ dialog::backdrop {
color: var(--text-heading);
}
-.resource-brand__kind:hover,
.resource-brand__kind:focus-visible,
-.resource-brand__logo:hover,
-.resource-brand__logo:focus-visible {
+.resource-brand__kind:hover,
+.resource-brand__logo:focus-visible,
+.resource-brand__logo:hover {
color: var(--link-hover);
}
-@media (max-width: 520px) {
+@media(max-width:520px) {
.resource-brand {
min-width: 70px;
}
@@ -8213,22 +8309,22 @@ dialog::backdrop {
scrollbar-color: var(--border-strong) var(--surface-inset);
}
-*::-webkit-scrollbar {
+::-webkit-scrollbar {
width: 10px;
height: 10px;
}
-*::-webkit-scrollbar-track {
+::-webkit-scrollbar-track {
background: var(--surface-inset);
}
-*::-webkit-scrollbar-thumb {
+::-webkit-scrollbar-thumb {
border: 2px solid var(--surface-inset);
border-radius: 999px;
background: var(--border-strong);
}
-*::-webkit-scrollbar-thumb:hover {
+::-webkit-scrollbar-thumb:hover {
background: var(--muted-2);
}
@@ -8302,7 +8398,7 @@ dialog::backdrop {
cursor: not-allowed;
}
-@media (max-width: 620px) {
+@media(max-width:620px) {
.pagination {
justify-content: space-between;
}
@@ -8336,7 +8432,7 @@ dialog::backdrop {
flex: 0 0 auto;
}
-@media (max-width: 1699px) {
+@media(max-width:1699px) {
.pad-page :is(#mode-toggle, .view-switch) .control-label-full {
display: none;
}
@@ -8358,7 +8454,7 @@ dialog::backdrop {
}
}
-@media (max-width: 760px) and (orientation: portrait) {
+@media(max-width:760px) and (orientation:portrait) {
.pad-page .editor-toolbar {
grid-template-columns: minmax(0, 1fr) auto auto auto;
width: 100%;
@@ -8370,7 +8466,7 @@ dialog::backdrop {
}
.pad-page .view-switch button,
- .pad-page .view-switch button[data-view="split"] {
+ .pad-page .view-switch button[data-view=split] {
display: inline-flex;
width: 34px;
min-width: 34px;
@@ -8408,12 +8504,12 @@ dialog::backdrop {
grid-template-columns: 12px minmax(0, 1fr);
}
+.revision time,
.revision>div,
.revision__meta,
.revision__meta strong,
-.revision time,
-.revision__snippet,
-.revision__preview {
+.revision__preview,
+.revision__snippet {
min-width: 0;
max-width: 100%;
}
@@ -8422,10 +8518,10 @@ dialog::backdrop {
flex-wrap: wrap;
}
-.revision__meta strong,
.revision time,
-.revision__snippet,
-.revision__preview {
+.revision__meta strong,
+.revision__preview,
+.revision__snippet {
overflow-wrap: anywhere;
word-break: break-word;
}
@@ -8440,9 +8536,9 @@ dialog::backdrop {
white-space: pre-wrap;
}
-.history-header>div,
.history-header h2,
.history-header p,
+.history-header>div,
.history-list .empty,
.history-list .error {
min-width: 0;
@@ -8559,7 +8655,7 @@ dialog::backdrop {
display: none;
}
-@media (max-width: 760px) {
+@media(max-width:760px) {
.pad-page .toolbar-group {
grid-column: 1;
grid-row: 1;
@@ -8577,7 +8673,7 @@ dialog::backdrop {
.pad-page .mobile-upload-button {
display: inline-flex;
- grid-column: 1 / -1;
+ grid-column: 1/-1;
grid-row: 2;
width: 100%;
min-height: 1vh;
@@ -8605,7 +8701,7 @@ dialog::backdrop {
}
}
-@media (max-width: 760px) and (orientation: portrait) {
+@media(max-width:760px) and (orientation:portrait) {
.pad-page #mode-toggle {
grid-column: 2;
grid-row: 1;
@@ -8631,12 +8727,12 @@ dialog::backdrop {
}
.public-page.hide-preview-line-numbers.line-links-enabled .public-content {
- padding-left: clamp(24px, 4vw, 52px);
+ padding-left: calc(clamp(24px, 4vw, 52px));
}
.public-content .public-permalink {
position: absolute;
- top: var(--preview-line-top, 0px);
+ top: var(--preview-line-top, 0);
left: var(--preview-line-left, -50px);
z-index: 3;
display: none;
@@ -8661,24 +8757,24 @@ dialog::backdrop {
display: block;
}
-.public-page.line-links-enabled .public-content .preview-source-line::before {
+.public-page.line-links-enabled .public-content .preview-source-line:before {
transition: opacity .1s ease;
}
-.public-page.line-links-enabled .public-content .preview-source-line:hover::before,
-.public-page.line-links-enabled .public-content .preview-source-line:focus-within::before {
+.public-page.line-links-enabled .public-content .preview-source-line:focus-within:before,
+.public-page.line-links-enabled .public-content .preview-source-line:hover:before {
opacity: 0;
}
-.public-page.line-links-enabled .public-content .preview-source-line:hover>.public-permalink,
.public-page.line-links-enabled .public-content .preview-source-line:focus-within>.public-permalink,
+.public-page.line-links-enabled .public-content .preview-source-line:hover>.public-permalink,
.public-page.line-links-enabled .public-content .public-permalink:focus-visible {
opacity: 1;
transform: translateX(0);
}
-.public-page.line-links-enabled .public-content .public-permalink:hover,
-.public-page.line-links-enabled .public-content .public-permalink:focus-visible {
+.public-page.line-links-enabled .public-content .public-permalink:focus-visible,
+.public-page.line-links-enabled .public-content .public-permalink:hover {
background: color-mix(in srgb, var(--accent) 14%, transparent);
color: var(--text);
outline: none;
@@ -8697,19 +8793,18 @@ dialog::backdrop {
box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 24%, transparent);
}
-@media (hover: none),
-(pointer: coarse) {
+@media(hover:none), (pointer:coarse) {
.public-page.line-links-enabled .public-content .public-permalink {
opacity: .62;
transform: none;
}
- .public-page.line-links-enabled .public-content .preview-source-line::before {
+ .public-page.line-links-enabled .public-content .preview-source-line:before {
opacity: 0;
}
}
-@media (prefers-reduced-motion: reduce) {
+@media(prefers-reduced-motion:reduce) {
.public-page .public-content {
transition: none;
}
@@ -8747,8 +8842,8 @@ dialog::backdrop {
transition: transform .18s ease;
}
-.pad-page .navbar-collapse-toggle>span::before,
-.pad-page .navbar-collapse-toggle>span::after {
+.pad-page .navbar-collapse-toggle>span:after,
+.pad-page .navbar-collapse-toggle>span:before {
content: "";
position: absolute;
top: 3px;
@@ -8758,23 +8853,23 @@ dialog::backdrop {
background: currentColor;
}
-.pad-page .navbar-collapse-toggle>span::before {
+.pad-page .navbar-collapse-toggle>span:before {
left: 0;
transform: rotate(-36deg);
transform-origin: right center;
}
-.pad-page .navbar-collapse-toggle>span::after {
+.pad-page .navbar-collapse-toggle>span:after {
right: 0;
transform: rotate(36deg);
transform-origin: left center;
}
.pad-page .app-header:hover+.navbar-collapse-toggle,
-.pad-page .navbar-collapse-toggle:hover,
.pad-page .navbar-collapse-toggle:focus-visible,
-.pad-page.navbar-collapsed .navbar-collapse-toggle:hover,
-.pad-page.navbar-collapsed .navbar-collapse-toggle:focus-visible {
+.pad-page .navbar-collapse-toggle:hover,
+.pad-page.navbar-collapsed .navbar-collapse-toggle:focus-visible,
+.pad-page.navbar-collapsed .navbar-collapse-toggle:hover {
width: 32px;
color: var(--text);
opacity: 1;
@@ -8799,8 +8894,7 @@ dialog::backdrop {
flex: 1 1 0;
}
-@media (hover: none),
-(pointer: coarse) {
+@media(hover:none), (pointer:coarse) {
.pad-page .navbar-collapse-toggle {
width: 32px;
color: var(--text);
@@ -8847,8 +8941,8 @@ dialog::backdrop {
}
.app-select-trigger:hover,
-.app-select[open]>.app-select-trigger,
-.app-select.is-open>.app-select-trigger {
+.app-select.is-open>.app-select-trigger,
+.app-select[open]>.app-select-trigger {
border-color: var(--border-strong);
background: var(--surface-3);
color: var(--text);
@@ -8906,8 +9000,8 @@ dialog::backdrop {
transition: transform .14s ease;
}
-.app-select[open] .app-select-trigger__chevron,
-.app-select.is-open .app-select-trigger__chevron {
+.app-select.is-open .app-select-trigger__chevron,
+.app-select[open] .app-select-trigger__chevron {
transform: rotate(180deg);
}
@@ -8919,7 +9013,7 @@ dialog::backdrop {
display: grid;
width: max-content;
min-width: 164px;
- max-width: min(260px, calc(100vw - 24px));
+ max-width: calc(min(260px, 100vw - 24px));
gap: 2px;
padding: 5px;
border: 1px solid var(--border-strong);
@@ -8951,14 +9045,14 @@ dialog::backdrop {
text-align: left;
}
-.app-select-option:hover,
-.app-select-option:focus-visible {
+.app-select-option:focus-visible,
+.app-select-option:hover {
border-color: var(--border-strong);
outline: 0;
background: var(--surface-hover);
}
-.app-select-option[aria-selected="true"] {
+.app-select-option[aria-selected=true] {
border-color: var(--accent-a35);
background: var(--accent-soft);
}
@@ -9045,28 +9139,28 @@ dialog::backdrop {
left: 0;
z-index: 10000;
min-width: 0;
- max-height: min(320px, calc(100dvh - 16px));
+ max-height: calc(min(320px, 100dvh - 16px));
overflow: auto;
overscroll-behavior: contain;
}
.app-select-menu--portal .app-select-option__copy {
- max-width: min(320px, calc(100vw - 72px));
+ max-width: calc(min(320px, 100vw - 72px));
}
.home-header {
justify-content: space-between;
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.app-select--header>.app-select-trigger {
min-width: 36px;
height: 34px;
padding-inline: 8px;
}
- .app-select--header.app-select--theme .app-select-trigger__value,
- .app-select--header .app-select-trigger__chevron {
+ .app-select--header .app-select-trigger__chevron,
+ .app-select--header.app-select--theme .app-select-trigger__value {
display: none;
}
@@ -9082,7 +9176,7 @@ dialog::backdrop {
}
}
-@media (max-width: 520px) {
+@media(max-width:520px) {
.header-preferences {
gap: 4px;
}
@@ -9117,7 +9211,7 @@ dialog::backdrop {
}
#pdf-export-dialog {
- width: min(520px, calc(100% - 28px));
+ width: min(520px, 100% - 28px);
max-width: 520px;
}
@@ -9126,9 +9220,9 @@ dialog::backdrop {
gap: 16px;
}
-.pdf-export-panel h2,
.pdf-export-panel .dialog-copy,
-.pdf-export-panel .pdf-export-help {
+.pdf-export-panel .pdf-export-help,
+.pdf-export-panel h2 {
margin: 0;
}
@@ -9147,8 +9241,8 @@ dialog::backdrop {
font-weight: 650;
}
-.pdf-export-fields .app-select-input,
-.pdf-export-fields .app-select {
+.pdf-export-fields .app-select,
+.pdf-export-fields .app-select-input {
width: 100%;
}
@@ -9157,8 +9251,8 @@ dialog::backdrop {
gap: 9px;
}
-.pdf-export-title-toggle,
-.pdf-export-color-toggle {
+.pdf-export-color-toggle,
+.pdf-export-title-toggle {
width: fit-content;
}
@@ -9179,7 +9273,7 @@ dialog::backdrop {
margin: 0;
}
-@media (max-width: 560px) {
+@media(max-width:560px) {
.pdf-export-fields {
grid-template-columns: 1fr;
}
@@ -9215,9 +9309,9 @@ dialog::backdrop {
vertical-align: middle;
}
-.markdown-body :is(h1, h2, h3, h4, h5, h6):hover>.heading-permalink,
+.markdown-body .heading-permalink:focus-visible,
.markdown-body .heading-permalink:hover,
-.markdown-body .heading-permalink:focus-visible {
+.markdown-body :is(h1, h2, h3, h4, h5, h6):hover>.heading-permalink {
opacity: 1;
color: var(--accent);
}
@@ -9226,13 +9320,13 @@ dialog::backdrop {
position: absolute;
z-index: 30;
box-sizing: border-box;
- width: min(290px, calc(100% - 12px));
+ width: min(290px, 100% - 12px);
max-height: min(300px, 75%);
overflow: auto;
border: 1px solid var(--border);
border-radius: 10px;
background: var(--surface-card);
- box-shadow: 0 14px 36px rgb(0 0 0 / .25);
+ box-shadow: 0 14px 36px rgba(0, 0, 0, .25);
color: var(--text);
font: 500 13px/1.4 system-ui, sans-serif;
overscroll-behavior: contain;
@@ -9262,7 +9356,7 @@ dialog::backdrop {
}
.mention-suggestions__option:hover,
-.mention-suggestions__option[aria-selected="true"] {
+.mention-suggestions__option[aria-selected=true] {
background: var(--accent-a15, color-mix(in srgb, var(--accent) 15%, transparent));
}
@@ -9356,7 +9450,7 @@ dialog::backdrop {
background: color-mix(in srgb, var(--owner) 32%, var(--surface-inset));
}
-@media (max-width: 720px) {
+@media(max-width:720px) {
.mentioned-users {
padding: 7px 8px;
}
@@ -9384,4 +9478,38 @@ dialog::backdrop {
.workspace:not(.view-preview) .mentioned-users--preview {
display: none;
+}
+
+.line-gutter .line-gutter-virtual-spacer,
+.line-gutter .line-gutter-virtual-window {
+ box-sizing: border-box;
+ padding-right: 0;
+}
+
+.workspace-startup-error {
+ max-width: 780px;
+ margin: 2rem auto;
+ padding: 1.2rem 1.5rem;
+ border: 1px solid var(--border, currentColor);
+ border-radius: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1rem;
+}
+
+.workspace-startup-error[hidden] {
+ display: none;
+}
+
+.workspace-startup-error p {
+ margin: 0;
+}
+
+@media(max-width:560px) {
+ .workspace-startup-error {
+ margin: 1rem;
+ flex-direction: column;
+ align-items: stretch;
+ }
}
\ No newline at end of file
diff --git a/static/editor.html b/static/editor.html
index a5c1b83..852ffc5 100644
--- a/static/editor.html
+++ b/static/editor.html
@@ -13,6 +13,7 @@
+ __APP_LOADING_OVERLAY__