Commit Graph

664 Commits

Author SHA1 Message Date
Martín Lucas Golini
4789bfb5f9 ecode: add configurable screenshot support
Add an unlocked take-screenshot command and expose it under Settings -> Window with a default Print Screen binding.

Allow configuring the screenshot destination, filename pattern, and output format. Save screenshots under the ecode configuration directory by default, notify users after capture, and provide an action to open the result in the integrated image viewer.

Addresses a request in SpartanJ/ecode#950.
2026-08-11 15:43:22 -03:00
Martín Lucas Golini
6df0c0738f Add font size selection to ecode font picker:
Allow UIFontPickerDialog sections to be hidden and make ecode's UI, editor, and terminal font dialogs select both the font and its size.
Keep external fonts selectable across asynchronous font enumeration, including when they share a family name with a system font, and label them as external. Also normalize UILinearLayout weights across visible children so hidden picker columns release their space correctly.
Update font picker previews, size units, menu labels, translations, and lifetime handling.

Addresses SpartanJ/ecode#944.
2026-08-11 12:38:34 -03:00
Martín Lucas Golini
74b0454721 Refactor CSS properties to use dense IDs and bitsets:
Introduce contiguous PropertyId and ShorthandId enums backed by name-to-ID maps, replacing hash-valued property identifiers throughout the style system.
Replace PropertyIdSet's unordered set with a fixed-size bitset, eliminating heap allocations during style state changes while providing deterministic ascending iteration.
Keep name hashes for stylesheet storage and unknown or custom properties, while using dense typed IDs for registered-property lookup and dispatch.
Preserve property aliases and the public Checked compatibility identifier.
Add transaction-end reconciliation for interdependent image sizing properties, deferring percentage-based calculations until their containing block is resolved.
Keep formatting-context-owned sizes intact for table cells and inline content.
Add validation and tests for dense built-in registration, custom IDs, aliases, bitset operations, allocation-free storage, unknown properties, property application order, and image sizing regressions.
2026-08-05 20:53:13 -03:00
Martín Lucas Golini
861b2bc3c4 Fix driver-dependent patterned border rasterization
Snap dotted and dashed border geometry to physical pixels so centered
  patterns cannot begin on ambiguous half-pixel coordinates. This makes
  rectangular dot placement deterministic across llvmpipe and macOS GPU
  drivers.

  Update the old Reddit golden image to use the snapped dot phase.

Optimize compile-time header dependencies

  - Extract lightweight singleton declarations.
  - Remove unnecessary core.hpp, stream, pack, and container includes.
  - Add explicit direct dependencies across system, network, graphics, and syntax headers.
  - Forward-declare stream and pack types where possible.
  - Normalize selected network headers to LF.
2026-08-02 19:20:07 -03:00
Martín Lucas Golini
48b7e7c21f ui: improve HTML inline layout and old Reddit rendering
- implement per-side CSS border styles and patterned rendering
  - preserve rectangular rasterization for thin dotted borders
  - separate CSS and native-widget border defaults
  - correct inline atomic-box and vertical-align baseline layout
  - collapse adjacent block margins in rich-text flow
  - preserve forced line breaks and formatting margins
  - size HTML text inputs from font ascent and descent
  - expose replaced-control text baselines to inline layout
  - enforce single-owner painting for inline backgrounds and borders
  - enable and update the old Reddit visual regression golden
  - add generic layout, border, and form-control regression tests
  - document spec-first HTML work and project build conventions
2026-08-02 17:48:53 -03:00
Martín Lucas Golini
a2ee615553 • Fixed the Reddit inline sibling regression.
The float-aware rich-text layout was resetting curX for every block formatting context, including inline-blocks. That made consecutive action buttons overlap. The reset is now limited to block-level BFCs;
  inline-blocks retain normal cursor advancement.

  Added:

  - An always-on deferred CSS regression covering inline anchors, inline-block siblings, and float exclusions.
  - Strict action-row and title/domain ordering checks in the opt-in Reddit visual smoke test.
  - A small CSS fixture reproducing Reddit’s layout rules.
2026-07-30 19:33:20 -03:00
Martín Lucas Golini
d3ed96919a Fix percentage margin resolution after async HTML layout
Track percentage-based margins in UIHTMLWidget and re-resolve them when
  the containing parent acquires its final size. This prevents margins
  computed against an initial zero-width container from remaining stale
  until the viewport is resized.

  Add regressions covering percentage margin recomputation and the SS64
  footer layout after a deferred stylesheet is loaded.
2026-07-30 19:08:49 -03:00
Martín Lucas Golini
943103869a fix(ui): preserve CSS order for deferred stylesheets
Reserve stylesheet source positions when link elements are encountered
  instead of assigning them when asynchronous loading completes.

  Track the stylesheet and rule ordinals explicitly so deferred external
  styles retain their document order relative to later inline styles.
  Preserve this ordering when extracting marked stylesheet rules.

  Add an SS64 regression test covering heading and button styles after a
  deferred stylesheet finishes loading.
2026-07-30 17:52:27 -03:00
Martín Lucas Golini
9fc385307a Fix percentage-sized inline SVG layout and rendering
Resolve percentage dimensions for HTML-backed widgets after their containing
block has a definite size. Apply the resolution during rich-text, flex, and
grid layout without triggering broad layout invalidation.

Rasterize SVGs using their resolved dimensions when intrinsic width or height
attributes are missing or percentage-based.

Add regression coverage for percentage-sized SVGs and the SS64 navigation
buttons and search icon.
2026-07-30 13:38:36 -03:00
Martín Lucas Golini
935b28c91a Fix HTML input styling and internal control layout
Treat UIHTMLInput as the stable HTML/CSS host while keeping its native
control as an anonymous implementation detail.

Prevent author CSS from matching internal control widgets, avoiding
duplicated backgrounds and other styles. Keep valid input types such as
email intact for attribute selectors while falling back to compatible
native implementations.

Synchronize the internal control with the host content box after layout,
including flex sizing, and preserve intrinsic measurement for size and
font changes. Preserve input state across dynamic type changes and make
hidden transitions reversible.

Also fix border-radius calculations and add regressions for CSS ownership,
anonymous widget isolation, dynamic type changes, input sizing, and the
Causality newsletter form.
2026-07-27 11:17:23 -03:00
Martín Lucas Golini
90f41a64aa Fix HTML viewport sizing and background shorthand parsing
- parse slash-separated background position and size without requiring whitespace
  - recognize custom-property background images following an explicit size
  - resolve root body and html minimum heights against the layout viewport
  - avoid expanding semantic document boxes to the scrollable content extent
  - handle auto margins and percentage offsets correctly for absolute positioning
  - add DuckDuckGo layout and background shorthand regression tests
  - document the Xvfb limitation with multisampled OpenGL contexts
2026-07-27 00:59:39 -03:00
Martín Lucas Golini
0bf2b89970 Handle downscaled LCD glyphs with a dedicated resize path before atlas upload. This preserves row stride and RGB coverage, fixing corrupted icon-font glyphs at small sizes.
Add a golden-image regression test covering scaled subpixel glyphs from the Nonicons font.
2026-07-26 00:23:24 -03:00
Martín Lucas Golini
c0debbee9f Rollback to fix rendering. 2026-07-25 20:26:24 -03:00
Martín Lucas Golini
27a57960f4 SubPixel hinting support. 2026-07-25 18:59:20 -03:00
Martín Lucas Golini
ed46508df4 Merge branch 'feature/resource-shared-ownership' into develop 2026-07-25 01:36:21 -03:00
Martín Lucas Golini
b940407102 ecode: The custom fallback font reused the "fallback-font" resource key, replacing the built-in CJK fallback in FontService.
Fix:

  - User fallback now uses "user-fallback-font".
  - Built-in CJK and custom fallback fonts remain registered together.
  - Added and passed a regression test verifying both fallback resources remain in the chain.

Fixes in premake5.lua:

  - Removed obsolete PRECISE_F32=1; Wasm already provides precise float behavior.
  - Moved ENVIRONMENT=worker,web to final application link options.

Fixed MarkdownView not getting the correct CSS style from the base theme.
2026-07-25 01:36:00 -03:00
Martín Lucas Golini
6351332d9b Closes SpartanJ/ecode#939 2026-07-24 10:48:11 -03:00
Martín Lucas Golini
0a7984b17d Register cmake.in.
Detect as function call something like `name ()` in Vala.
2026-07-17 12:30:18 -03:00
Martín Lucas Golini
41f58374bd Pre register new extensions. 2026-07-17 12:18:41 -03:00
Martín Lucas Golini
95d0a8881a Fix CSS var resolution during style application
Resolve CSS variable values at the points where properties are applied,
inherited, propagated, and used to seed transitions. This prevents raw
var() values from leaking into widget state or transition start/end
values when style attributes, inherited properties, or state-dependent
rules are involved.

Also refresh style definitions when widgets load so selector-dependent
rules are evaluated with the final widget context, and add regression
coverage for inline style vars, inherited vars, parent-state child rules,
tab close opacity, and foreground tint transitions.
2026-07-08 20:48:27 -03:00
Martín Lucas Golini
7c931bf72e Fix again in UIScrollView scroll visibility.
Fix `whitespace: pre`.
2026-07-08 00:14:08 -03:00
Martín Lucas Golini
c9add7047b Fix floated auto-width sizing and line-height text placement
Preserve shrink-to-fit widths for floated HTML boxes whose CSS width is
auto, instead of letting their own block layout expand them back to the
containing block width. This matches the CSS float model and fixes floated
list-item menus where hover boxes were much wider than their content.

Also separate RichText visual font metrics from CSS line-box metrics. Text
runs now keep native font height for drawing while line layout still uses
CSS line-height, allowing the expected half-leading offset for vertically
centered text in block anchors.
2026-07-06 01:42:38 -03:00
Martín Lucas Golini
b192bcde1e Fix stale width being reused during the deferred CSS relayout. This happened when a display was being switched and during the layout change we didn't reset to the initial state. 2026-07-04 20:41:40 -03:00
Martín Lucas Golini
627d22163b Fixed an layout invalidation bug where we were discarding real invalidations.
Allow to defer `<img defer src>` (useful for local tests).
2026-07-04 16:14:47 -03:00
Martín Lucas Golini
d04f4502db Fix minor bug in UIFileDialog text input row selection. 2026-06-15 01:32:28 -03:00
Martín Lucas Golini
ff97358695 This should fix a possible but very implausible heap-use-after-free issue in the LSP client. 2026-06-11 02:16:24 -03:00
Martín Lucas Golini
650bbed0c5 Add MiMo support. 2026-06-11 01:57:57 -03:00
Martín Lucas Golini
788dcc6bf4 Add "defer" to force CSS files to load asynchronously (this will help unit-test some layout issues).
Added `Browser-Like Layout Invalidation Plan`.
Minor changes in HTML example.
Added a couple of examples that I'll use for unit-tests.
2026-06-07 00:32:54 -03:00
Martín Lucas Golini
288950bf34 Image sizing fixes.
Added support for `:where` and `:is`.
2026-06-05 00:18:26 -03:00
Martín Lucas Golini
9bfa128658 Use the new tab position setting for *all* new tabs (SpartanJ/ecode#904). 2026-06-04 16:42:10 -03:00
Martín Lucas Golini
bd2c8991a7 Fix incorrect calculations in grid layout when pixel density != 1. 2026-06-04 13:43:08 -03:00
Martín Lucas Golini
5d0e31e52e Allow to inspect widget style from widget inspector. 2026-06-04 02:00:39 -03:00
Martín Lucas Golini
b72e2c5d0b More grid fixes and fixed a couple of crashes. 2026-06-03 02:07:37 -03:00
Martín Lucas Golini
f8f066c57a Fix infinite loop in flex layouter. 2026-06-02 19:42:50 -03:00
Martín Lucas Golini
2e14b4d0cb Span’s own RichText was using the parent match width while still inheriting text-align: center, so the text was rendered offset inside the correct span box. 2026-06-02 19:09:28 -03:00
Martín Lucas Golini
ad4e4285d6 Grid fixes. 2026-06-02 12:29:37 -03:00
Martín Lucas Golini
afa15f70c0 Grid layout fixes. 2026-06-02 00:43:30 -03:00
Martín Lucas Golini
98837b9cbe Merge remote-tracking branch 'origin/develop' into feature/grid-layout 2026-06-01 16:55:25 -03:00
Martín Lucas Golini
4370a45728 CSS white-space-collapse Support in HTML compatibility layer. 2026-06-01 16:53:45 -03:00
Martín Lucas Golini
46b3fa44f0 Grid layout WIP. 2026-06-01 02:14:00 -03:00
Martín Lucas Golini
37fcf45595 Update reference image in tests to pass unit-tests. 2026-05-31 02:30:36 -03:00
Martín Lucas Golini
0c27b124b5 Merge remote-tracking branch 'origin/develop' into develop 2026-05-31 01:06:34 -03:00
Martín Lucas Golini
7f3d997193 Fix tests. 2026-05-30 20:45:35 -03:00
Martín Lucas Golini
8be05aabdd Initial implementation to support rendering text nodes as anonymous flex items. This does not support wrapping yet. 2026-05-30 02:37:22 -03:00
Martín Lucas Golini
81d5854dc5 Fix SpartanJ/ecode#908. 2026-05-30 01:50:04 -03:00
Martín Lucas Golini
ddfd59e167 More flex improvements. 2026-05-29 21:20:56 -03:00
Martín Lucas Golini
cc0e516edc Nits 2026-05-29 18:17:39 -03:00
Martín Lucas Golini
453eaa03fc Several flex fixes. 2026-05-29 15:48:23 -03:00
Martín Lucas Golini
5305670f46 Fixes. 2026-05-29 03:04:27 -03:00
Martín Lucas Golini
20ef8854fc Flex support WIP. 2026-05-29 02:18:12 -03:00