TRMNLPicker#trmnl:change

Event fired when picker state changes

TRMNLPicker#trmnl:change

Type: CustomEvent

Properties
detail (Object) : Event details
  • detail.origin string

    What triggered the change: 'constructor', 'form', or 'setParams'

  • detail.screenClasses Array<string>

    Array of CSS classes for Framework CSS rendering

  • detail.model Object

    Current model object with name, label, width, height, kind, css properties

  • detail.palette Object

    Current palette object with id, name, framework_class properties

  • detail.isPortrait boolean

    Portrait orientation flag

  • detail.isDarkMode boolean

    Dark mode flag

  • detail.width number

    Current width of the screen in pixels

  • detail.height number

    Current height of the screen in pixels

Example
picker.formElement.addEventListener('trmnl:change', (event) => {
  const { origin, screenClasses, model, palette } = event.detail
  console.log(`Changed via ${origin}`)
  console.log('Classes:', screenClasses)
})

TRMNLPicker

TRMNLPicker - Vanilla JS library for TRMNL device and palette selection

Provides a reactive picker component that manages device models, color palettes, orientation, and display mode. Emits 'trmnl:change' events with current state and CSS classes for rendering.

View a live demo →

Note: Using the constructor directly is not recommended. Use the static TRMNLPicker.create method instead, which automatically fetches models and palettes from the TRMNL API if not provided.

new TRMNLPicker(formIdOrElement: (string | Element), options: Object)
Parameters
formIdOrElement ((string | Element)) Form element ID or DOM element reference
options (Object) Configuration options
Name Description
options.models Array<Object> Array of model objects from TRMNL API
options.palettes Array<Object> Array of palette objects from TRMNL API
options.localStorageKey string? Optional key for persisting state to localStorage
Example
// HTML Structure - Required form with data-* attributes
// <form id="picker-form">
//   <!-- Required: Model selector -->
//   <select data-model-select></select>
//
//   <!-- Required: Palette selector -->
//   <select data-palette-select></select>
//
//   <!-- Optional: Orientation toggle -->
//   <button type="button" data-orientation-toggle>
//     <span data-orientation-text>Landscape</span>
//   </button>
//
//   <!-- Optional: Dark mode toggle -->
//   <button type="button" data-dark-mode-toggle>
//     <span data-dark-mode-text>Light Mode</span>
//   </button>
//
//   <!-- Optional: Reset button -->
//   <button type="button" data-reset-button>Reset</button>
// </form>

// Create with element ID
const picker = new TRMNLPicker('picker-form', { models, palettes })

// Create with DOM element
const element = document.getElementById('picker-form')
const picker = new TRMNLPicker(element, { models, palettes })

// Listen for changes
picker.formElement.addEventListener('trmnl:change', (event) => {
  console.log(event.detail.screenClasses)
})
Static Members
create(formId, options, formIdOrElement)

Create a TRMNLPicker instance, fetching data from TRMNL API if not provided

Automatically caches API responses in localStorage for 24 hours to reduce network requests.

create(formId: any, options: Object, formIdOrElement: (string | Element)): Promise<TRMNLPicker>
Parameters
formId (any)
options (Object = {}) Configuration options
Name Description
options.models Array<Object>? Optional models array (fetched from API if not provided)
options.palettes Array<Object>? Optional palettes array (fetched from API if not provided)
options.localStorageKey string? Optional key for state persistence
formIdOrElement ((string | Element)) Form element ID or DOM element
Returns
Promise<TRMNLPicker>: Promise resolving to picker instance
Throws
  • Error: If API fetch fails when models or palettes are not provided
Example
// Fetch models and palettes from API (or use cached data if available)
const picker = await TRMNLPicker.create('screen-picker')

// Provide your own data
const picker = await TRMNLPicker.create('screen-picker', { models, palettes })
Instance Members
params

Get current picker parameters (serializable state)

params
Returns
Object: Current parameters for persistence or API calls
Returns
string: return.modelName - Selected model name
Returns
string: return.paletteId - Selected palette ID
Returns
boolean: return.isPortrait - Portrait orientation flag
Returns
boolean: return.isDarkMode - Dark mode flag
Example
const params = picker.params
// { modelName: 'og_plus', paletteId: '123', isPortrait: false, isDarkMode: false }

// Can be used to restore state later
localStorage.setItem('picker-state', JSON.stringify(picker.params))
setParams(params)

Update picker configuration programmatically

setParams(params: Object)
Parameters
params (Object) Configuration object (all fields optional)
Name Description
params.modelName string? Model name to select
params.paletteId string? Palette ID to select
params.isPortrait boolean? Portrait orientation
params.isDarkMode boolean? Dark mode enabled
Throws
  • Error: If params is not an object
Example
// Update single parameter
picker.setParams({ isDarkMode: true })

// Update multiple parameters
picker.setParams({
  modelName: 'og_plus',
  paletteId: '123',
  isPortrait: true
})

// Note: Changing model resets palette to first valid palette of that model
state

Get complete picker state including full model and palette objects

state
Returns
{model: Object, palette: Object, isPortrait: boolean, isDarkMode: boolean, screenClasses: Array<string>, width: number, height: number}: State object containing model (full model object from API), palette (full palette object from API), isPortrait flag, and isDarkMode flag
Example
const state = picker.state
// {
//   model: { name: 'og_plus', label: 'OG+', width: 800, height: 480, ... },
//   palette: { id: '123', name: 'Black', framework_class: 'screen--1bit', ... },
//   isPortrait: false,
//   isDarkMode: false,
//   screenClasses: ['screen', 'screen--1bit', 'screen--v2', 'screen--md', 'screen--1x'],
//   width: 800,
//   height: 480
// }
destroy()

Clean up event listeners and references

destroy()