Living list of what ships, what is on a side branch, and what is on the roadmap. The README only carries a top-level checklist; this file is the detailed one and is meant to be edited as decisions are made.
Legend: [x] shipped on master · [~] on a side branch, not yet merged ·
[ ] planned · [?] not committed to (idea / under discussion).
- Text — static and reactive (
Supplier<String>) - Button — click handler in
Style - Image — texture by
Identifier, optional explicit texture size - Row / Column — flex-style containers, lambda or vararg children
- VScroll / HScroll — scroll containers
- TextField —
State<String>bidir, placeholder, filter, max length, onSubmit, blinking caret - TextArea — multi-line, Tab cycle focus, filter / max length
- Pagination —
State<Integer>page, sibling count, optional click handler - ProgressBar —
State<Double>andDoubleSupplieroverloads, label format - Slider — int / double / float / long / short, vertical flag, keyboard support, hover highlight, rounded corners
- Accordion — multi-open and single-open variants, header style, optional
State<Set<Integer>>/State<Integer> - ComboBox — searchable popup
- SelectList — single / multi select, scrollable
- Calendar — date picker, custom day style
- ColorPicker — square + hue strip, optional alpha, configurable pad size
- Skeleton — placeholder with shimmer animation
- Spinner — circular dot rotation, configurable size / color / period
- Tooltip — hover-delayed popup, multi-line, edge-flip, custom style
- Toast — global stack (info/success/warning/error/custom), slide-in / fade-out
- PlayerRender — wraps
InventoryScreen.drawEntity, cursor-tracked rotation or fixed front view, supplier-based for live entity swap - Chart — LineChart / BarChart / PieChart, multi-series, reactive suppliers, hover tooltip, configurable axis / legend / value formatter
- Tween — easing, duration, repeat, onComplete
- Spring — default / snappy / bouncy / strong presets, physics-based
- ColorTween — ARGB interpolation
- FadeIn / FadeOut
- SlideIn (Direction)
- Loop / Yoyo — animation modifiers
- State<T> — reactive primitive with
map,combine,bindBidirectional,dispose(memory-leak-safe) - Subscription — auto-disposed at component detach
- Focus management —
requestFocus, Tab cycling, key/char dispatch - Popup click handlers — outside-click intercept for combo boxes / pickers
- DynamicComponent — re-render on state change without rebuilding the tree
- AnimatedComponent — driven by tween / spring
- Style.borderRadius — wired through every component that paints a rect
-
ModdingLibClient.Networking— Fabric-side typed client↔server channel, mirrors Spigot'sModdingLibApi. Single shared codec registration; per-(pluginId, action)dispatch. Multiple downstream mods can register handlers without colliding.ModdingLibClient.Networking.register("myplugin", "shop.list", json -> { /* runs on render thread */ }); ModdingLibClient.Networking.send("myplugin", "shop.buy", payload);
- DebugOverlay — bounds + names of all components in tree
-
[~] Video —
feature/video-player, kept as a checkpoint- Phase 1 —
VideoPlayer(FFmpeg / JavaCPP) +VideoComponent - Phase 1.5 — async open with skeleton placeholder
- Phase 2.1 — audio decode via OpenAL
- Phase 2.2 — A/V sync via audio master clock
- Phase 3a — loop
- Phase 3b — seek (
-5s/+5s/ restart, refresh while paused,lastPublishedPtsNanosfor reliable currentTime) - Phase 3c — perf (native memcpy via access widener
NativeImage.pointer) - Phase 3d — hardware decode probe (deferred, low priority)
- Phase 1 —
-
[~] Multi-module split + client↔server channel —
feature/multi-module-split- Repo split into
:common/:fabric/:spigotGradle modules so the mod and the server plugin share a single source of truth for the wire format without dragging each other's runtime deps along. :common— pure-JavaEnveloperecord (plugin id + player UUID + action- JSON body),
VarIntscodec (Minecraft-style VarInt + length-prefixed UTF-8 strings) so a buffer produced on Fabric is byte-identical on Spigot.
- JSON body),
:spigot— Bukkit plugin exposingModdingLibApi(register(pluginId, action, handler)/send(player, pluginId, action, payload)) on top of aPluginMessageListener. Hides the byte codec, the channel name, the per-player rate limiter, and the main-thread hop. Anti-spoof check onenvelope.playerUuidvs the connection's own UUID.:fabric— existing mod, now depending on:commonvia Loom'sincludeso the protocol classes ship inside the mod jar without a separate runtime dep.- CI publishes all three artifacts (
moddinglib-common,moddinglib,moddinglib-spigot) to GitHub Packages and attaches the three jars to the GitHub Release.
- Repo split into
User-picked next items, in priority order:
- Gradient paints —
Style.background(Paint)/textFill(Paint)withPaint.LinearGradient(angle + multi-stop),Paint.RadialGradient,Paint.ConicGradient. Backwards-compatible:backgroundColor(int)keeps working. Per-glyph color sampling for gradient text, withboldrendered via vanilla double-draw. - Custom fonts —
Style.font(Identifier)forwarding to Minecraft's resource-pack font system (TTF supported natively by MC). API only: the user supplies the TTF and theassets/<modid>/font/X.jsonprovider in their own resource pack. - Markdown renderer — basic CommonMark subset (headings, bold/italic, links, code, lists, hr). Use case: changelogs, in-game help.
- Virtualized list — render only the rows in the viewport; works with
Supplier<Integer> rowCount+IntFunction<UIComponent> rowFactory. Required once lists exceed a few hundred items. - In-game UI editor — drag-and-drop screen designer that emits
Components.X(...)source. Big chunk of work but very high payoff for downstream modders. - Devmode — hot-reload screens, perf overlay, component inspector (React DevTools-ish). Pairs naturally with the editor above.
- [?] Modal / Dialog — backdrop, focus trap, ESC-to-close. Currently simulated by stacking containers; a first-class component would simplify a lot.
- [?] Drag & drop — drag source, drop target, ghost preview. Useful for inventory-like screens, list reordering.
- [?] Context menu — right-click / long-press popover, sub-menus.
- [?] Tabs — currently emulated with
DynamicComponent+State<Integer>. - [?] Tree view — collapsible hierarchy, selection. File-explorer style.
- [?] Form validation — chainable validators on a
State<T>, error binding. - [?] Theme provider — light / dark / custom palette injected via context.
- [~] Channel communication — typed client↔server networking. See the
multi-module split entry above; both Spigot (
ModdingLibApi) and Fabric (ModdingLibClient.Networking) facades are complete on the side branch, pending merge to master. - [?] Config system — JSON / TOML auto-save, hot reload in dev, versioned migrations. Used by every mod.
- [?] Persistent storage — per-world / per-player KV wrapper (NBT or JSON), typed.
- [?] Command framework — DSL on top of Brigadier, typed parsing, autocompletion.
- [?] Event bus — typed publish / subscribe,
State<T>bridge. - [?] Tick scheduler —
runIn(20).cancel(),runEvery(...), async-to-main hop. - [?] HTTP client — wrapper used internally by the video player; could be exposed.
- [?] Asset loader — dynamic textures / sounds from URL with disk cache.
- [?] Permission system — feature-level permissions on top of op-levels.
- [?] Irregular family (light / heavy) — spec to be clarified before implementation.
- This file is hand-maintained. When a feature ships on master, move it
from a roadmap section to the matching shipped section and check it off
in
README.md's top-level list. - The
feature/*branches are kept around as recovery points; they are not stale by default.