diff --git a/src/lib/components/ParagraphDialog.svelte b/src/lib/components/ParagraphDialog.svelte
index c0699c4..d5af9b9 100644
--- a/src/lib/components/ParagraphDialog.svelte
+++ b/src/lib/components/ParagraphDialog.svelte
@@ -24,7 +24,9 @@
const ALIGNS = ['left', 'center', 'right', 'justify'] as const;
- let align = $derived(tick >= 0 && editor ? (ALIGNS.find((a) => editor!.isActive({ textAlign: a })) ?? '') : '');
+ // An unset paragraph renders left, so that's what the box shows; a selection
+ // mixing two alignments still reads '' and leaves it blank.
+ let align = $derived(read('textAlign', 'left'));
let indent = $derived(read('indent', 0));
let indentRight = $derived(read('indentRight', 0));
let indentFirst = $derived(read('indentFirst', 0));
@@ -78,28 +80,28 @@
{#if pane === 'indents'}
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
{:else}
{#each FLOW as f}
@@ -139,7 +141,7 @@
display: flex;
flex-direction: column;
gap: 12px;
- width: 420px;
+ width: 500px;
padding: 18px 20px 16px;
font-family: var(--font-sans);
font-size: 0.85rem;
@@ -165,14 +167,18 @@
.tabs button.active { color: var(--color-text); border-bottom-color: var(--color-primary); }
- .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 16px; }
+ .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 20px; }
+
+ /* Equal columns plus a fixed unit width put every field on the same edge; the
+ label takes the rest and never wraps, so no row grows a second line. */
+ .newline { grid-column: 1; }
.row { display: flex; align-items: center; gap: 8px; }
- .row > span { flex: 1; color: var(--color-text-muted); }
- .row em { font-style: normal; color: var(--color-text-muted); }
+ .row > span { flex: 1; white-space: nowrap; color: var(--color-text-muted); }
+ .row em { width: 1.5em; font-style: normal; color: var(--color-text-muted); }
.row input, .row select {
- width: 72px;
+ width: 76px;
height: 26px;
border: 1px solid var(--color-border);
border-radius: var(--radius);
@@ -182,7 +188,8 @@
font: inherit;
}
- .row select { width: 130px; }
+ /* No unit of its own, so it reaches across the field and unit columns. */
+ .row select { width: calc(84px + 1.5em); }
.row input { text-align: right; }
.flow { display: flex; flex-direction: column; gap: 8px; }
diff --git a/src/lib/components/ribbon/Ribbon.svelte b/src/lib/components/ribbon/Ribbon.svelte
index 186eff9..5a7643e 100644
--- a/src/lib/components/ribbon/Ribbon.svelte
+++ b/src/lib/components/ribbon/Ribbon.svelte
@@ -307,7 +307,7 @@
--color-btn-hover: var(--w-hover);
--font-sans: var(--w-font);
--radius: 3px;
- --toolbar-btn-size: 28px;
+ --toolbar-btn-size: 30px;
flex-shrink: 0;
background: var(--w-chrome);
@@ -317,6 +317,34 @@
user-select: none;
}
+ /* Those pickers frame their trigger for the classic toolbar's tinted island. A
+ ribbon row is borderless icon buttons, so the frame comes off and the hover
+ tint takes over — same 30px box as .rb-icon, so a row reads as one strip. */
+ .ribbon :global(.color-split) {
+ border-color: transparent;
+ background: none;
+ }
+
+ .ribbon :global(.color-split:hover) {
+ border-color: transparent;
+ background: var(--w-hover);
+ }
+
+ .ribbon :global(.color-main) {
+ min-width: 28px;
+ padding: 0 4px;
+ }
+
+ .ribbon :global(.color-chevron) {
+ width: 13px;
+ border-left: none;
+ color: var(--w-text-dim);
+ }
+
+ .ribbon :global(.color-chevron:hover) { background: var(--w-pressed); }
+
+ .ribbon :global(.bp-trigger) { height: 30px; }
+
.ribbon-tabs {
display: flex;
align-items: center;
diff --git a/src/lib/components/ribbon/icons.ts b/src/lib/components/ribbon/icons.ts
index 88d6cbd..413a63b 100644
--- a/src/lib/components/ribbon/icons.ts
+++ b/src/lib/components/ribbon/icons.ts
@@ -38,7 +38,7 @@ export const STROKED = {
superscript: ['M2 12.5 7.5 5.5M2 5.5 7.5 12.5', 'M10.5 5.75a1.5 1.5 0 1 1 2.7.9L10.5 9.5h3'],
subscript: ['M2 10.5 7.5 3.5M2 3.5 7.5 10.5', 'M10.5 9.75a1.5 1.5 0 1 1 2.7.9L10.5 13.5h3'],
clearFormat: ['M5.5 3h7.5', 'M9.25 3 6.5 13', 'M2 9.5 5 12.5M5 9.5 2 12.5'],
- changeCase: ['M1.5 10.5 4 4l2.5 6.5M2.4 8.6h3.2', 'M9 12.25c1.2 0 2-.7 2-1.7V8.4c0-1-.7-1.6-1.9-1.6-.9 0-1.6.3-2 .8M11 7v5.25'],
+ changeCase: ['M2.1 11.5 4.8 4.5l2.7 7M3.05 9.4h3.5', 'M11.8 11.5a2.15 2.15 0 1 0 0-4.3 2.15 2.15 0 0 0 0 4.3z', 'M13.95 7.2v4.3'],
bulletList: ['M6 4h8.5M6 8h8.5M6 12h8.5', 'M2.5 5.2a1.2 1.2 0 1 0 0-2.4 1.2 1.2 0 0 0 0 2.4z', 'M2.5 9.2a1.2 1.2 0 1 0 0-2.4 1.2 1.2 0 0 0 0 2.4z', 'M2.5 13.2a1.2 1.2 0 1 0 0-2.4 1.2 1.2 0 0 0 0 2.4z'],
orderedList: ['M6 4h8.5M6 8h8.5M6 12h8.5', 'M1.6 2.6h.9v2.6M1.4 5.2h1.6', 'M1.3 7.1c.2-.4.6-.5 1-.4.5.1.7.6.4 1L1.4 9.4h1.7', 'M1.4 10.9h1.5l-.9 1.1c.6 0 1 .3 1 .8s-.4.8-1 .8c-.4 0-.8-.1-1-.4'],
@@ -52,7 +52,7 @@ export const STROKED = {
lineSpacing: ['M6.5 4h8M6.5 8h8M6.5 12h8', 'M3 4.5 3 11.5', 'M1.6 5.9 3 4.5l1.4 1.4', 'M1.6 10.1 3 11.5l1.4-1.4'],
pilcrow: ['M9 2.5v11', 'M12 2.5v11', 'M9 2.5H6.75a2.75 2.75 0 0 0 0 5.5H9'],
borders: ['M2.25 2.25h11.5v11.5H2.25z', 'M8 2.25v11.5M2.25 8h11.5'],
- highlighter: ['M5.5 9.5 10 5l3 3-4.5 4.5H5.5z', 'M9.25 3.25 12.75 6.75', 'M2.5 13.5h4'],
+ highlighter: ['M6.5 12.5 3.5 9.5 9.5 3.5 12.5 6.5z', 'M8 5 11 8'],
shading: ['M4 8.5 8.5 4l4 4-4.5 4.5a1.4 1.4 0 0 1-2 0L4 10.5a1.4 1.4 0 0 1 0-2z', 'M6.5 2 8.5 4', 'M2.5 13.5h11'],
rowAbove: ['M1.5 9h13v5.5h-13z', 'M1.5 11.75h13', 'M8 1.5v5M5.5 4h5'],
diff --git a/src/styles/global.css b/src/styles/global.css
index e27ce44..e0f2a79 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -394,7 +394,7 @@
.rb-combo {
display: flex;
align-items: stretch;
- height: 28px;
+ height: 30px;
border: 1px solid var(--w-border-strong);
border-radius: 3px;
background: var(--w-surface);