The Workshop Kit
The widgets the Muntin Method is built with.
Each widget is a small, composable, learn-by-doing primitive — a palette picker, a drag-rank list, a live preview frame. Every Method lesson is a composition of these. Open one to see it run; lift it into a new product when you build the next one.
Every widget
For Method authors
Every widget exports a tiny module at /tools/_shared/workshop/<tag>.js. The contract is small — mount(rootEl, state, deps), optional serialize, optional validate. The widget engine at /assets/js/workshop-widget.js discovers, hydrates, debounces, and broadcasts. To compose a new lesson, drop a <section class="course-widget" data-widget="..."> for each widget you want on the page. The engine does the rest.
The widget renderer is responsible for one thing: turning a state object into UI and committing changes back via deps.commit(patch). State lives in MuntinContext (a localStorage namespace shared with every Muntin tool), so any widget's output is automatically available to any other widget on the page — or on any other page in the suite.
A scaffolder ships at scripts/new-workshop-widget.mjs — run it to stub a new widget, its demo page, and a parity check entry. The Method's success depends on widgets staying small, composable, and consistent.