Roadmap
Implementation reality, partial areas, and the next hardening priorities for JOG V2.
Generated from
doc/roadmap.md. Edit the source file, then rerunnode jog-docs/scripts/sync-docs.mjs.
JOG V2 Roadmap
Status
This roadmap tracks implementation reality, not aspiration. Update it whenever framework work lands.
Current Direction
JOG should optimize for one narrow product lane:
- browser-based internal tools
- line-of-business applications
- form-heavy and CRUD-heavy workflows
- desktop-style shells with tabs, dialogs, status chrome, and predictable state flow
That means the next phase is not broad control expansion for its own sake. The next phase is making shell layout dependable, shipping stronger data-heavy primitives, improving state leverage, and closing the keyboard and accessibility gap.
Implemented
Runtime and Core
- application boot with
Application.Run(page) - dirty-control scheduling through microtasks
- state-driven DOM updates
- lifecycle guard against updating disposed controls
- store subscription cleanup during control disposal
- modal overlay support
- window z-order management
- base document style reset for full-viewport page rendering
- follow-up viewport layout pass after app mount so fill-based shells can settle against measured browser dimensions
- page-level flow layout for direct child controls, with windows and dialogs remaining absolute
- narrow
Filllayout flag for stretching workspace content inside shell layouts Fillno longer overrides dock-managed child width and height with raw100%sizing, which keeps page shells and split workspaces inside their containersDockPanelnow supports container and docked-childGapspacing so shells can reserve chrome separation without manual margin glueWorkspaceShellnow provides explicit header, sidebar, and content slots for common page-shell compositionWorkspaceShellnow also exposesSidebarLayoutfor shell-owned responsive sidebar sizing and collapse rules- container child-structure changes now also dirty parent layout so docked shells reflow after tab and workspace mutations
- control-level invalid state and error text
- application diagnostics with debug logging and tree dump
- public theme API with global and per-application token overrides
- built-in theme presets for selected control types
- first-pass public third-party control registration API through
JOG.RegisterControl() - first-pass third-party compatibility checks against
JOG.Version - first-pass public extension lifecycle hooks on
Component,Control,Container,Window, andDialog - package-scoped third-party style-block registration through
JOG.RegisterStyleBlock() - registry inspection helpers through
JOG.GetRegisteredControl(),JOG.ListRegisteredControls(), andJOG.DumpRegisteredControls() - narrow browser text file helpers through
JOG.Browser.OpenTextFile()andJOG.Browser.SaveTextFile() - zero-dependency Node test runner for core runtime regression checks
- minified browser distribution build at
dist/JOG.min.js - starter release bundle at
dist/starter/
Base Types
ComponentControlContainerPage
Layout
PanelDockPanelWorkspaceShellSplitPanelStackPanelRepeaterSectionPanelSectionPanelresponsive title and body-padding overridesGrid
Controls
MenuBarToolBarStatusBarPageHeaderTabControlDataGridDataGridview-level sorting and filteringLabelValidationMessageValidationSummaryButtonTextBoxTextAreaCheckBoxRadioButtonDropDownListListBox
State and Binding
StoreCollectionFormStateLabel.BindTextValidationMessage.BindMessageValidationSummary.BindSummaryValidationSummary.BindErrorsTextBox.BindTextTextArea.BindTextCheckBox.BindCheckedRadioButton.BindSelectedValueDropDownList.BindSelectedValueListBox.BindSelectedValueBindVisible(store, key, transform)BindEnabled(store, key, transform)SetError(message)ClearError()BindError(store, key)Store.Derive(key, dependencyKeys, compute)Collection.BindStore(store, key, eventKeys, compute)Repeater.BindCollection(collection, renderer)- collection row identity, selection, dirty tracking, and derived summary definitions
Windows and Dialogs
- draggable windows
- resizable windows with edge and corner handles
- close button support
- close-on-escape support
- modal dialogs
- stacked modal overlay behavior across multiple visible dialogs
- window lifecycle hooks with
OnLoad,OnShow,OnHide, andOnClose - configurable close button label
- scrollable window and dialog content panes so oversized dialog bodies stay reachable inside the window shell
Example Apps
- bare-bones hello world example
- simple example app
- notepad example with multi-document tabs and browser file open/save flows
- notepad now uses fill-based tab workspace composition without manual viewport resize math
- notepad shell now reflows correctly after document tab open and close operations
- notepad now uses runtime-managed browser file open and save helpers instead of direct picker and fallback DOM glue
- notepad now reports file-operation failures through a JOG dialog instead of browser
alert()UI - notepad shell now uses dock gap spacing instead of manual menu and status bar margins
- customer admin example
- customer admin now demonstrates a
SplitPanelleft-nav-plus-content workspace - customer admin now uses
PageHeaderinstead of a manual fixed-height title panel - customer admin now uses
WorkspaceShellinstead of wiring the page-shell header and fill region manually - customer admin shell no longer overflows on the right edge
- customer admin shell now uses dock gap spacing instead of manual header margin coordination
- customer admin edit dialog now starts hidden correctly and uses a larger scrollable window body
- form demo with grid layout
- form demo with breakpoint-aware responsive grid layout
- form demo validation and inline error feedback
- form demo validation summary with reusable binding helpers
- form demo now uses derived store summary wiring instead of manual summary subscription glue
- form demo now uses
FormStatefor validation orchestration - form demo checkbox and radio-group invalid-state feedback
- opportunity board sample with CRM-style add, edit, and delete flows
- opportunity board migrated to
CollectionplusDataGrid - opportunity board now uses collection-to-store binding helpers for board metrics and command-state wiring
- opportunity board now uses
FormStatefor editor validation orchestration - opportunity board now uses
Repeaterfor collection-backed sidebar account rows - opportunity board now uses
PageHeaderinstead of a manual fixed-height title panel - opportunity board now uses
WorkspaceShellinstead of wiring the page-shell header, sidebar, and fill region manually - opportunity board now uses shell-owned sidebar layout wiring instead of placing responsive sidebar sizing on the sidebar control itself
- opportunity board now demonstrates first-pass resizable
DataGridcolumns - opportunity board now demonstrates
DataGridfiltering and sortable headers - opportunity board now demonstrates a bounded flexible
DataGridnotes column for wider datasets - opportunity editor dialog with breakpoint-aware responsive grid layout
- opportunity board shell with responsive dock and stack behavior
- opportunity board shell now uses dock gap spacing instead of manual header and sidebar margin coordination
- opportunity board now demonstrates responsive
SectionPaneltitle and padding changes - opportunity board use of built-in theme presets
- third-party controls demo with a registered primitive
AcmeJOG.TagPicker - weather window planner with seeded Philippine site forecasts, responsive workspace composition, LeafletJOG site-marker map selection, Open-Meteo city/town search plus coordinate-based location setup, a scrollable sortable and filterable
DataGrid, editable safe/caution/no-go policy thresholds, optional Open-Meteo refresh that retains the last usable data when a request fails, a ChartJOG rain-probability view, three Flatpickr-backed forecast-versus-historical comparison charts for temperature, precipitation, and maximum wind, per-site LexicalJOG session notes, and plain-text briefing export throughJOG.Browser.SaveTextFile() AcmeJOG.TagPickernow demonstrates first-pass keyboard selection and radio-group accessibility semantics- third-party controls demo with a registered composite
AcmeJOG.InspectorCard - third-party dialog sample with
AcmeJOG.CommandPaletteDialog, proving a custom floating shell through the publicWindowhelper - third-party controls demo with a second package, including
BeaconJOG.ViewSwitchandBeaconJOG.MetricCard - third-party controls demo now also includes
ChartJOG.BarChart, a bundled Chart.js wrapper that follows a JOG collection-oriented control contract with array-backed items, optional horizontal bars, and point-click events - third-party controls demo now also includes
FlatpickrJOG.DatePicker, a bundled popup date-picker wrapper around Flatpickr that follows the JOG input-control contract with canonical string values - third-party controls demo now also includes
LexicalJOG.LexicalPlainTextBoxandLexicalJOG.LexicalRichTextBox, bundled Lexical wrappers that persist editor state as JSON while following the JOG input-control contract - the third-party controls demo now also proves the current recommended validation pattern for third-party inputs by combining
BindError(),FormState.Watch(...),ValidationSummary.BindErrors(...), and invalid-control focus across the Flatpickr and Lexical wrappers
Tests
- Node test runner at
test/run-v2-tests.js - baseline coverage for store, collection, container rules, diagnostics, error binding, lifecycle guards, responsive grid breakpoints, responsive dock, dock-gap shell spacing, workspace-shell slot behavior, split, stack, section, and page-header behavior, browser text file helper flows, theme preset classes, richer window resize behavior, modal stacking, window lifecycle events, third-party registration, third-party compatibility checks, third-party diagnostics, third-party primitive and composite sample controls, data-grid rendering, fill-based tab workspaces, shell relayout after tab mutations, dock-managed fill behavior, scrollable dialog content panes, and example-level integration flows including customer selection, dialog close branches, form reset behavior, and the opportunity board grid flow
- baseline coverage now also includes modal focus trap behavior and focus restoration across single and nested dialogs
- repeatable browser render benchmark at
v2/examples/render-benchmark.html, served throughnpm run benchmark:render; it records median mount, update, and filter timings for JOGDataGridagainst an equivalent raw-DOM grid
Partial
Window System
- modal stacking, drag, resize, and lifecycle hooks are working
- window and dialog content panes now scroll internally when body content exceeds the available height
- broader keyboard-first dialog behavior still needs hardening
- the window system is usable, but not yet production-grade from an accessibility standpoint
Layout
Gridnow has breakpoint-based responsive track and placement overridesStackPanelnow has breakpoint-based orientation and spacing overridesDockPanelnow supports responsive shell and child layout changes through inheritedResponsiveLayoutDockPanelnow supports gap-driven shell spacing at both the container and docked-child levelWorkspaceShellnow covers the common header plus sidebar plus content shell pattern without manual child-order coordinationSplitPanelnow supports first-pane and second-pane sizing plus breakpoint-based orientation changesSectionPanelnow supports a dedicated responsive helper surface for title and body-padding changes- shell layout is substantially more dependable than it was before this hardening pass, but app code still owns deeper multi-pane workspace composition decisions
- the framework still lacks deeper workspace management beyond
WorkspaceShell,DockPanel, andSplitPanel WorkspaceShellstill lacks convenience helpers for common sidebar sizing and shell-region sizing patterns, so apps still set widths and responsive collapse behavior directly on child controlsWorkspaceShell.SidebarLayoutnow covers the repeated sidebar dock, size, and gap pattern, but deeper multi-pane workspace composition still belongs to app code
Shell Controls
MenuBarexists as a first minimal shell control with flat clickable itemsToolBarexists as a first minimal shell container for command controlsStatusBarexists as a first minimal shell container for status contentPageHeaderexists as a narrow shell primitive for page title and subtitle chromeTabControlexists as a first minimal tabbed container with explicitTabPagechildren- nested menus, accelerators, and keyboard navigation are not implemented yet
- toolbar overflow, separators, richer status conventions, closable tabs, and drag reordering are not implemented yet
- shell controls are proving the concept, but still need more depth before they can carry a long-lived business app without custom glue
Events
- shorthand aliases still exist alongside the preferred
OnXstyle
API Contract
- the runtime, examples, and current developer docs now center the authoring model around
new, property assignment,Add,OnX, andApplication.Run(page) - the developer guide now also includes an explicit control-authoring decision path for composite controls, third-party wrappers, and new low-level controls so contributors do not have to infer the workflow from the spec docs alone
- the developer guide now also includes a standalone third-party package repo layout and starter checklist so package authors have a concrete setup model outside this monorepo
- the repo now also includes draft public-preview release notes and a draft pinned “Start here” discussion so the launch work has concrete copy, not just checklist items
- older rationale documents still contain outdated or broader examples, including
Click(listener)-first guidance and older future-control framing - the public contract needs to be reconciled so contributors have one canonical programming model
Third-Party Extensibility
- JOG now exposes a first-pass public extension contract through
JOG.RegisterControl(),JOG.RegisterStyleBlock(),JOG.DefineControlProperty(), and public lifecycle hooks on the base classes - duplicate control registration and incompatible JOG version ranges are rejected cleanly
- diagnostics and tree dumps now include registered third-party control names and package versions
- the
AcmeJOG.Controls.jsandBeaconJOG.Controls.jssample packages now prove multiple primitive and composite third-party controls built outsidev2/runtime/JOG.js ChartJOG.Controls.jsnow proves the same extension contract against an external visualization library with collection-driven redraws and projected chart interaction eventsFlatpickrJOG.Controls.jsnow proves the same extension contract against a popup-oriented external input library instead of only editor-style or pure-JOG controlsLexicalJOG.Controls.jsnow proves that the same extension contract can wrap an external editor library behind a JOG-native input control surfaceLeafletJOG.Controls.jsnow proves that the same extension contract can wrap an interactive map with explicit viewport state, marker projection, layout invalidation, and disposal- third-party
RaiseEvent(..., extras)payloads now preserve package-specific event fields onJOG.EventArgs, which keeps external wrappers compatible with the shared event contract without exposing private runtime state - the repo now has three concrete external-library adapter examples, which makes the shell-plus-adapter wrapper pattern concrete across visualization, popup-input, and editor categories instead of treating Lexical as a one-off
ThirdPartyJOG.Helpers.jsnow extracts the shared internal wrapper bridge for value sync, collection binding, explicit store binding, and detached-popup theme propagation so new external-library packages do not start from a blank file- the sample primitive control now covers first-pass keyboard interaction, but richer accessibility coverage and broader package tooling still need hardening before the extension model should be treated as long-term stable
- a concrete design spec now exists for a Lexical-based proof control in doc/lexical-control-spec.md, starting with a
LexicalPlainTextBoxthird-party input wrapper - the first Lexical stage is now implemented as a bundled plain-text control with JSON persistence, JOG validation integration, a
BindPlainText()helper for plain-text-first form wiring, first-pass editable-host accessibility state for invalid and read-only transitions, and empty-state semantics that treat whitespace-only content as empty - the next Lexical stage is now also implemented as a bundled rich-text control with the same JSON
Valuecontract, plain-text convenience helpers, and a narrow inline formatting surface throughFormatText(),ToggleBold(),ToggleItalic(), andToggleUnderline() - the third-party demo now shows both app-level command patterns for the Lexical rich-text wrapper: a
ToolBarrow using convenience toggles and a plain button row usingFormatText(formatType)directly - the main Lexical post-MVP work now is selection-state reporting, active-toolbar-state wiring, richer block-format commands, and deeper real-browser accessibility verification
Styling
- framework injects built-in styles
- public theme API exists for global and per-application token overrides
- built-in theme presets now exist for selected control types
- arbitrary per-control style objects are still not implemented
Packaging
- release packaging is direct browser script usage, not npm runtime installation
- GitHub Releases are the primary intended distribution channel for built browser artifacts
- GitHub Release asset upload is automated for published releases
- npm packaging is intentionally deferred unless the current release artifact flow proves insufficient
- if npm packaging is revisited later, the first pass should stay narrow: publish a thin core runtime package first, keep the browser-global JOG model working, and treat external-library wrapper packages as optional follow-on packages rather than pulling Chart.js, Flatpickr, or Lexical into the core runtime package
- minified distribution output exists, but there is no broader package-manager or CDN distribution story yet
Validation
- control-level validation exists
- error-state binding from store to control now exists
- page-level visibility and label text can now bind directly to store keys
- first-class validation display controls now exist for inline messages and summary blocks
- validation summaries can now derive their own message directly from multiple field error keys
- radio-group invalid styling can now be applied at the row-container level
FormStatenow covers the repeated pattern where app code wants store-driven field errors, one summary key, and revalidation watches without hand-written subscription glue- app code still owns the validation rules and explicit save timing
State and Data
- explicit store binding is working well for single-record forms
Collectionnow covers row identity, selection, update patterns, dirty tracking, deleted-row tracking, and derived summariesStore.Derive()now covers explicit store-to-store derived keysRepeater.BindCollection()now covers first-pass collection-backed repeated UICollection.BindStore()now covers explicit collection-to-store derived page stateDataGridnow covers columns, rows, single selection, basic formatting, dirty-row styling, row commands, and first-pass mouse resizing for pixel-width columnsDataGridnow also covers view-level sorting, filter text, filter predicates, and per-column overflow modesDataGridnow also covers first-pass inline editing for text, textarea, and select cells, including committing the current edit when the user moves directly into another editable cellDataGridcolumn resizing now honors per-column minimum and maximum pixel widthsDataGridnow also honorsminWidthplusmaxWidthon flexible columns so wider boards can keep one bounded narrative column without fixing every track in pixels- app code still owns persistence and keyboard-heavy interaction behavior
- sorting and filtering now stay view-local to the grid and do not mutate the bound collection
- collection-to-control binding is still explicit, but the new helpers now cover a large share of repeated summary, selection, command-state, validation-summary, and simple repeated-row glue
- resized column widths currently persist only in memory for the lifetime of the grid instance
- the initial data-grid sprint goal is met at a credible first-pass level, but not yet at a production-depth level
Next Priorities
- Shell and layout hardening
- DataGrid depth and behavior hardening
- Third-party control hardening
- Accessibility and keyboard model
- Deeper shell-control behavior
- Browser-level interaction verification
1. Shell And Layout Hardening
- keep making shell layout boring and dependable across more than the current examples
- reduce the remaining multi-pane sizing and deeper workspace-composition glue in app code
- keep tightening the higher-level shell primitives now that header plus sidebar plus content composition is runtime-managed
- keep hardening container interactions so tab, split, and dialog-heavy shells stay stable without manual coordination
2. DataGrid Depth And Behavior Hardening
- harden column sizing and layout behavior for wider datasets
- keep resized column widths in memory only for now, then later decide whether apps need hooks for saved views or per-user persistence
- keep
TreeViewbehind deeperDataGridmaturity unless a concrete app need pulls it forward
3. Third-Party Control Hardening
- keep the new registration and lifecycle contract narrow, documented, and free of private-runtime leakage
- harden the accessibility and keyboard quality bar for custom primitive controls before calling the contract stable
- keep proving the docs with real third-party packages outside
v2/runtime/JOG.js, not just one sample package - keep the new
GetWindowShell()helper narrow and stable rather than opening broader DOM escape hatches for floating shells - add any missing metadata or diagnostics hooks that third-party authors uncover while building real packages
Remaining From Initial Data Scope
- persistence of collection mutations remains app-owned
- keyboard-first and accessibility-grade grid behavior remains unfinished
4. Accessibility And Keyboard Model
- add keyboard navigation for
MenuBar - add keyboard navigation for
TabControl - review control labeling and semantics
- treat accessibility as framework completeness, not deferred polish
5. Deeper Shell-Control Behavior
- add menu hierarchy and better command behavior where appropriate
- add toolbar overflow and separators
- add stronger status-bar conventions
- add closable and reorderable tabs when the underlying shell behavior is stable
6. Browser-Level Interaction Verification
- keep the zero-dependency Node suite for fast regression coverage
- add lightweight real-browser verification for focus order, keyboard flows, modal correctness, and pointer interaction edge cases
Deferred
- tree view
- arbitrary per-control style objects
- npm package publishing unless the release artifact workflow later proves insufficient
- broad browser-service abstractions beyond focused runtime helpers such as file picking
Documentation Rule
When a feature lands:
- update
doc/developer-guide.md - update
doc/api-reference.md - update this roadmap
Do that in the same change as the code.