Skip to content

Changelog

curveo edited this page May 19, 2026 · 10 revisions

Changelog


v1.1

Polish release - shared UI workflows and safer rebuilds

Patch notes

  • Tooltips now wrap long text and clamp to the current GUI bounds instead of clipping outside the screen.
  • Tooltips inside <virtual-list> rows are redrawn after the list scissor is disabled, so row tooltips are no longer clipped by the list viewport.
  • TesseraScreen no longer toggles the debug overlay on plain I. The keyboard debug toggle is opt-in with -Dtesseraui.debug.hotkey=true and Ctrl+Alt+I.

Added

  • TesseraRenderContext.setInputText(id, value) updates persisted input text, cursor, selection and scroll in one call.
  • <virtual-list> parent fallback - row bindings now fall back to the parent model when no per-row key exists, so global keys like {{ s.items }} work inside rows.
  • <hr> separator rendering - <hr> renders as a 1 px separator by default and can be styled through border-color, background, color, height, and opacity.

Improved

  • README install examples now point to the 1.1 jar and the license badge matches LGPL-3.0.
  • Release documentation now calls out the state-management helpers used by rebuild-heavy screens.

v1.0

Initial release — full feature set

Bug fixes

  • <badge> layout width - badges now report their measured text width before render, preventing overlaps when several badges are placed in the same row.

  • <item-slot> CSS styling - background, :hover { background: ... } and border-color are applied to the TesseraItemSlot widget.

  • v-if / v-show bare expressionsv-if="count > 0" évalue correctement. Les expressions nues sans {{ }} étaient toujours vraies.

  • String comparisonstatus == 'ready' fait une comparaison string. Les deux côtés étaient convertis en double et tout comparait à 0 == 0.

  • RHS model resolutiona == b avec deux clés modèle compare les valeurs résolues.

  • Quote-aware operator parsing — un opérateur dans un littéral quoté (status == 'a > b') n'est plus interprété comme opérateur de comparaison.

  • Clé absente — une clé absente du modèle vaut "", pas 0. missing == 0 retourne false.

  • Commentaires CSS multilignes/* ... */ sur plusieurs lignes correctement supprimés.

  • rgba() alpha clamping — les valeurs hors [0, 1] sont clampées au lieu de wrapper.

  • margin-top: auto cascade — une règle plus spécifique peut réinitialiser auto en valeur px.

  • Transition memory leak — les transitions n'étaient jamais supprimées après leur fin.

  • Couleur transparente animable0x00000000 est maintenant une valeur cible valide pour les animations.

  • DragContext.render() safety — position et shader color restaurés via try/finally.

  • VirtualList.mouseScrolled() — scroll consommé uniquement si la liste a réellement bougé.

  • <virtual-list v-for> prefixed bindings — les rows acceptent maintenant la syntaxe documentée {{ row.name }} / onclick="{{ row.action }}" avec des clés modèle row.name.0, tout en conservant la compatibilité avec les clés nues {{ name }}.

  • Hot Reload double activationactivate() ne spawne plus plusieurs threads watcher.

  • Hot Reload path traversal — les resourceId contenant ../ hors assets/ lèvent une SecurityException.

  • Templates HTML UTF-8 BOM — le parser tolère un BOM initial et le renderer renvoie une erreur lisible si un template n'a pas de root.

  • Inputs persistantsTesseraRenderContext conserve texte, curseur et focus entre rebuilds pour les inputs avec id.

  • Input autocompleteTesseraInput et <input> supportent suggestions / autocomplete, navigation Up/Down, acceptation Enter/Tab.

  • Input state cleanupTesseraRenderContext expose clearInput, clearInputsWithPrefix et clearInputsMatching.

  • <virtual-list> — cache borné autour de la fenêtre visible, rows focus conservées, forwarding clavier pour les inputs en row.

  • <badge> — fond par défaut transparent au lieu d'un style visuel imposé.

Core pipeline

  • TesseraRenderContext — per-screen transient state for rebuild-safe inputs
  • TesseraTemplateRenderer — HTML → widget tree pipeline
  • TesseraCssParser — CSS parser with full selector support
  • TesseraModel — flat key-value data binding with {{ }} expressions
  • TesseraScreen base class with automatic event wiring
  • TesseraTemplate — resource-location based template loading
  • TesseraHotReload — cache invalidation and disk-watch for development
  • TesseraPalette — copper-patina design system

Layout

  • Shared CSS from HTML — <link rel="stylesheet" href="...">

  • Flexbox engine — flex-grow, flex-shrink, flex-basis, flex-wrap

  • justify-content, align-items, align-self, margin-top: auto

  • gap, padding, margin, width, height, min/max-width/height

  • Grid layout — <grid cols="N"> and grid-template-columns

  • position: absolute with top, left, right, bottom offsets

  • overflow: hidden, box-sizing, z-index, order

  • calc() expressions for width and height

Visual styling

  • background, border, border-color, border-radius, opacity
  • color, font-size, font-weight, text-align, text-decoration, white-space
  • corner-dot-size, corner-dot-color
  • Pseudo-states: :hover, :active, :focus, :disabled, :nth-child
  • CSS variables — :root { --var: value; } and var(--name)
  • @media (min-width / max-width) queries

CSS Animations

  • transition — smooth hover interpolation for background, border-color, color
  • @keyframes — named animations with from, %, to stops
  • animationduration, easing, delay, iterations, alternate
  • TesseraEasing — cubic-Bézier easing (Newton-Raphson + bisection)
  • TesseraAnimationEngine — per-widget animation state via WeakHashMap

Widgets

  • TesseraPanel, TesseraLabel, TesseraButton
  • TesseraInput, TesseraTextArea
  • TesseraCheckbox, TesseraSlider, TesseraDropdown
  • TesseraBadge, TesseraIcon
  • TesseraTabPanel — tabbed container
  • TesseraVirtualList — efficient scrolling list (visible rows only)
  • TesseraItemSlot, TesseraItemGrid, TesseraInventoryPicker

HTML tags

<col>, <row>, <grid>, <div>, <section>, <article>, <main>, <nav>, <header>, <footer>, <label>, <button>, <input>, <textarea>, <checkbox>, <slider>, <select>, <option>, <h1><h6>, <p>, <span>, <strong>, <b>, <em>, <i>, <a>, <badge>, <ul>, <ol>, <li>, <hr>, <tabs>, <tab>, <virtual-list>, <table>, <thead>, <tbody>, <tfoot>, <tr>, <td>, <th>, <img>, <icon>, <item-slot>, <link>

Data binding & directives

  • {{ expr }} — inline expressions with ternary, string concatenation, t:key translations
  • v-for="item in list" — repeat element for each model entry
  • v-if="expr" — conditional rendering
  • v-show="expr" — conditional visibility (preserves layout space)
  • data-i18n="key" — Minecraft i18n translation binding
  • {{ t:key }} — inline translation syntax

Component system

  • <template name="..."> — define reusable components
  • <slot> / <slot name="..."> — named and default slot injection
  • TesseraComponentRegistry — global component store

Drag and Drop

  • draggable="true" and drag-payload HTML attributes
  • TesseraDropZoneaccepts(), onDrop(), dropBounds()
  • Drag ghost rendered by renderTesseraOverlays()

Clone this wiki locally