Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
a924d64
Allow code-review-graph refactor/build tools in local settings
claude Jul 11, 2026
5edf012
Bump crossbeam-epoch 0.9.18 -> 0.9.20 (RUSTSEC-2026-0204)
claude Jul 11, 2026
b15ccc0
Quality pass: perf hot-path fixes, dead code removal, dep pruning
claude Jul 11, 2026
a01a006
Promote constant token-scale asserts to const blocks (clippy)
claude Jul 11, 2026
1a59ff3
Drop redundant trim_start before split_whitespace in PDF test (clippy)
claude Jul 11, 2026
10e8ca9
Clear clippy test-target lints in loki-doc-model and loki-ooxml tests
claude Jul 11, 2026
f6105d3
Clear remaining pedantic clippy lints in ooxml/odf test modules
claude Jul 11, 2026
740654c
Add imports for concrete Default types named in test modules
claude Jul 11, 2026
0afff53
Harden format parsers: nesting guard, EMU clamp, UTF-16 check, XXE po…
claude Jul 11, 2026
c44ef0f
Import ODT table-style definitions into the catalog (4a.3 tail)
claude Jul 11, 2026
3198c50
Render paragraph between-borders (fidelity gap #26)
claude Jul 11, 2026
e51c5fc
Make the light theme real: palette tokens, live toggle, shell chrome …
claude Jul 11, 2026
a69024f
Complete 4c UI polish: template browser, blank-doc new-tab, ribbon di…
claude Jul 11, 2026
bed0b53
Share one render FontDataCache across page tiles (6.2, memory F5 / BM-9)
claude Jul 11, 2026
213e795
Drop preserved layouts for inactive tabs; relayout on restore (6.1, m…
claude Jul 11, 2026
e1be62e
Honour w:mirrorMargins end-to-end (fidelity gap #27, plan 5.9)
claude Jul 11, 2026
eb95481
Route spell checking by run language tags (fidelity gap #30, plan 5.9)
claude Jul 11, 2026
efa751e
Balance the last page of multi-page multi-column sections (5.10)
claude Jul 12, 2026
dbbba8c
Emit ODT <style:default-style> on export; wire ODT default-paragraph …
claude Jul 12, 2026
16b4895
Drop unused escape import left by the meta_xml split
claude Jul 12, 2026
9285f3b
Persist the personal spell-check dictionary across restarts (5.10)
claude Jul 12, 2026
474a705
OMML<->MathML: delimiters, n-ary, matrices, accents, limits (5.8)
claude Jul 12, 2026
8be6e13
Mark plan row 7.4 done — security tails landed in 0afff53
claude Jul 12, 2026
4e958ba
Promote the conformance corpus into appthere-conformance (3.7 / B-8, …
claude Jul 12, 2026
9a9efe0
Responsive reflow type scale for Compact viewports (Spec 03 M4, 4a.4)
claude Jul 12, 2026
2172d3c
Touch-size the ribbon tab strip at Compact (Spec 04 M6 / R-14, 4a.5)
claude Jul 12, 2026
4b12435
Export direct cell borders and padding in DOCX and ODT (4a.3)
claude Jul 12, 2026
1a2dfdb
ODF table default-style import + w:cnfStyle region masks (4a.3)
claude Jul 12, 2026
97ae87c
Table-region character formatting, end to end (4a.3)
claude Jul 12, 2026
0531d4f
Record the 4a.3 borders/cnf/char-formatting increments in the plan
claude Jul 12, 2026
d64ae72
Table-style editing UI in the style panel (4a.3 — completes the 4a se…
claude Jul 12, 2026
edb8ee8
Split para.rs: extract public types + builder helpers (7.1, para.rs 1…
claude Jul 12, 2026
5414aa9
Split flow.rs: extract header/footer orchestration (7.1, flow.rs 1100…
claude Jul 12, 2026
8caa542
Split docx/write/document.rs: extract inline/run writers (7.1, 902 → …
claude Jul 12, 2026
f84fee1
Split resolve.rs: extract char-property resolution (7.1, resolve.rs 8…
claude Jul 12, 2026
e54ec64
Split odt/reader/styles.rs: extract style-property parsers (7.1, 759 …
claude Jul 12, 2026
d9ba292
Split docx/reader/document.rs: extract run reading (7.1, 739 → 540)
claude Jul 12, 2026
d617ac5
Split flow_para.rs: extract paragraph page-splitting (7.1, 710 → 522)
claude Jul 12, 2026
2f072b4
Split flow.rs: extract section-finalization helpers (7.1, flow.rs 903…
claude Jul 12, 2026
436d839
Split xlsx/import.rs under the ceiling: extract styles + worksheet pa…
claude Jul 12, 2026
ac29c30
Split xlsx/export.rs under the ceiling: extract XML part generators (…
claude Jul 12, 2026
c4bda77
Split ods/import.rs under the ceiling: extract XML parsing helpers (7…
claude Jul 12, 2026
6f23abe
Split ods/export.rs under the ceiling: extract content.xml generation…
claude Jul 12, 2026
35bfc41
Split odt/reader/document.rs: extract list + TOC readers (7.1, 586 → …
claude Jul 12, 2026
6cdbef9
Split docx/mapper/inline.rs under the ceiling: extract run processing…
claude Jul 12, 2026
2e78c58
Split docx/mapper/document.rs under the ceiling: extract page-layout …
claude Jul 12, 2026
c3b7e49
Split docx/model/paragraph.rs under the ceiling: extract run types (7…
claude Jul 12, 2026
87b4e4a
Split loki-text editing/state.rs under the ceiling: extract apply pat…
claude Jul 12, 2026
6b06643
Split loki-text routes/home.rs under the ceiling: extract template da…
claude Jul 12, 2026
5157bb2
Split docx/mapper/table.rs under the ceiling: extract vMerge resolver…
claude Jul 12, 2026
3768478
Split odt/model/styles.rs under the ceiling: extract property types (…
claude Jul 12, 2026
bce04ff
Split loki-layout incremental.rs under the ceiling: extract diff help…
claude Jul 12, 2026
7843d70
Split loki-layout lib.rs under the ceiling: extract layout entry poin…
claude Jul 12, 2026
571fb25
Split loki-text editor_style.rs under the ceiling: extract picker dat…
claude Jul 12, 2026
c0c66a2
Split loki-vello scene.rs: extract positioned-item painter (7.1, 613 …
claude Jul 12, 2026
d8e5df6
Split loki-vello scene.rs under the ceiling: extract single-page pain…
claude Jul 12, 2026
b93d417
Split loki-renderer page_paint_source.rs under the ceiling (7.1, 314 …
claude Jul 12, 2026
9586c8a
Split loki-odf odt/reader/document.rs under the ceiling (7.1, 367 → 276)
claude Jul 12, 2026
7904aef
Split loki-ooxml docx/import.rs under the ceiling (7.1, 387 → 129)
claude Jul 12, 2026
1157ada
Split loki-odf package.rs under the ceiling (7.1, 410 → 223)
claude Jul 12, 2026
e7f1283
Split loki-ooxml docx/reader/document.rs under the ceiling (7.1, 540 …
claude Jul 12, 2026
ca73246
Split loki-ooxml docx/write/document.rs under the ceiling (7.1, 540 →…
claude Jul 12, 2026
a281c82
Split loki-odf odt/reader/styles.rs under the ceiling (7.1, 599 → 295)
claude Jul 12, 2026
d161d5b
Split loki-layout flow_para.rs under the ceiling (7.1, 522 → 236)
claude Jul 12, 2026
5010c2e
Split loki-layout resolve.rs under the ceiling (7.1, 665 → 194)
claude Jul 12, 2026
e07f17e
Split loki-layout flow.rs under the ceiling (7.1, 721 → 277)
claude Jul 12, 2026
6eae624
Extract tab-stop probe from para.rs layout_paragraph_uncached (7.1 pa…
claude Jul 12, 2026
8d23c7c
Add suppression ratchet (7.3): CI gate for `let _ =` swallows + `#[al…
claude Jul 12, 2026
83a5ef9
7.6 (partial): unused-dependency sweep — remove 3 confirmed-unused deps
claude Jul 12, 2026
1ea11e1
7.5: per-case DOCX/XLSX P0 round-trip tests + fix the gaps they surface
claude Jul 12, 2026
e6cd721
7.2: dedup app-shell tab logic into loki-app-shell (pure, unit-tested)
claude Jul 13, 2026
8981c17
6.5: measure P-3/P-5/P-6; none warrant a fix (re-measure-first gate)
claude Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@
"Bash(claude plugin *)",
"Bash(cp \"/root/.claude/uploads/995af0a3-e865-5b96-b002-e90985880970/cc51b77a-spec01codebaseauditandarchitecture.md\" \"/home/user/loki/docs/adr/spec-01-codebase-audit-and-architecture.md\" && echo \"placed\" && ls -la docs/adr/spec-01-codebase-audit-and-architecture.md)",
"mcp__code-review-graph__list_graph_stats_tool",
"mcp__Claude_Code_Remote__send_later"
"mcp__Claude_Code_Remote__send_later",
"mcp__code-review-graph__refactor_tool",
"mcp__code-review-graph__build_or_update_graph_tool"
]
},
"enableAllProjectMcpServers": true,
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ jobs:
- name: File-ceiling gate (300-line ratchet)
# Spec 01 audit A-2. New files <= 300 lines; baselined debt may not grow.
run: python3 scripts/check-file-ceiling.py
- name: Suppression ratchet (`let _ =` swallows + `#[allow]`)
# Audit Q-3/Q-4. Per-file counts may only shrink; new files start at 0/0.
run: python3 scripts/check-suppressions.py
- name: TODO-format gate (TODO(<topic>) tags)
# Spec 01 audit A-11. No bare TODO / FIXME / HACK / XXX in production code.
run: python3 scripts/check-todo-format.py
Expand Down
14 changes: 11 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ baseline). Three techniques (the third added 2026-07-08):

| File | Current lines | Priority |
|---|---|---|
| `loki-layout/src/para.rs` | 1447 | High |
| `loki-layout/src/para.rs` | 1401 | High |
| `loki-layout/src/flow.rs` | 1202 | High |
| `loki-spreadsheet/src/routes/editor/editor_inner.rs` | 1014 | High |
| `loki-ooxml/src/docx/write/document.rs` | 902 | High |
Expand Down Expand Up @@ -256,7 +256,9 @@ yet reach `0.41`:

None of these are fixable by bumping our own `Cargo.toml` requirements — each is
gated behind an upstream crate release that hasn't caught up to `quick-xml`
0.41 yet. `object_store` is the one with real untrusted-network exposure and is
0.41 yet. Re-checked 2026-07-11: still true — `object_store` 0.14.0 (latest)
still requires `quick-xml ^0.40.1`. (The same pass fixed the unrelated
RUSTSEC-2026-0204 by bumping `crossbeam-epoch` 0.9.18 → 0.9.20 in the lockfile.) `object_store` is the one with real untrusted-network exposure and is
worth re-checking most often. Re-run `cargo audit` (or
`cargo tree -i quick-xml`) periodically and bump `object_store` /
`wayland-scanner`'s dependents the moment a release satisfies `quick-xml
Expand Down Expand Up @@ -472,7 +474,13 @@ Read in any descendant component:
let theme = use_theme();
```

Only `ThemeVariant::Dark` is implemented. Light theme tokens are deferred.
Both variants are implemented (4c.4): `ThemePalette::dark()` / `light()` in
`tokens/palette.rs`; the `COLOR_*` constants remain the dark values, so
unmigrated components render dark under either variant. Components migrate by
reading `use_theme().palette()` (Signal-backed — re-colors live on
`AtThemeContext::toggle`, exposed as the tab-bar theme-toggle button). Shell
chrome (title/tab/status bars, dialogs) is migrated; deep editor surfaces
migrate opportunistically.

### What does NOT belong in `appthere_ui`

Expand Down
52 changes: 6 additions & 46 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 8 additions & 8 deletions appthere-canvas/src/font_cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use std::sync::Arc;
#[derive(Default)]
pub struct FontDataCache {
entries: HashMap<(usize, u32), peniko::FontData>,
coords: HashMap<(usize, u32), Vec<read_fonts::types::F2Dot14>>,
coords: HashMap<(usize, u32), Vec<i16>>,
}

#[cfg(feature = "font-cache")]
Expand All @@ -40,19 +40,19 @@ impl FontDataCache {
})
}

/// Returns the cached normalized coordinates (defaulting to zero) for the font's axes.
pub fn get_coords(
&mut self,
data: &Arc<Vec<u8>>,
font_index: u32,
) -> &[read_fonts::types::F2Dot14] {
/// Returns the cached normalized coordinates (defaulting to zero) for the
/// font's axes, in `F2Dot14` bit representation — the form
/// `DrawGlyphs::normalized_coords` consumes, so per-glyph-run callers need
/// no conversion allocation.
pub fn get_coords(&mut self, data: &Arc<Vec<u8>>, font_index: u32) -> &[i16] {
let key = (Arc::as_ptr(data) as usize, font_index);
self.coords.entry(key).or_insert_with(|| {
if let Ok(font_ref) = read_fonts::FontRef::from_index(data, font_index) {
use read_fonts::TableProvider;
if let Ok(fvar) = font_ref.fvar() {
if let Ok(axes) = fvar.axes() {
return vec![read_fonts::types::F2Dot14::default(); axes.len()];
// Default (all-zero) normalized position on every axis.
return vec![0i16; axes.len()];
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions appthere-conformance/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ sheet-model = ["dep:loki-sheet-model"]

[dependencies]
thiserror = { workspace = true }
# The corpus vocabulary (catalog cases, fixture metadata) serializes into reports.
serde = { version = "1", features = ["derive"] }
# Round-trip the candidate XML through a temp file for `xmllint` validation.
tempfile = "3"
# PNG decode/encode for the visual-goldens differ and heatmap emission.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

//! DOCX acid cases (TEST_PLAN.md §1).

use super::{Format::Docx, TestCase, tc};
use crate::severity::Severity::{P0, P1, P2};
use crate::corpus::Severity::{P0, P1, P2};
use crate::corpus::{Format::Docx, TestCase, tc};

/// The 38 DOCX test cases.
pub(super) const CASES: &[TestCase] = &[
Expand Down
Loading
Loading