Tootfinder

Opt-in global Mastodon full text search. Join the index!

@aral@mastodon.ar.al
2025-12-11 14:46:51

I love how simple Kitten’s Streaming HTML workflow makes building features like this, especially when using class-based Kitten pages and components :)
#Kitten

Screen capture of the Team schedule interface from the Gaza Verified admin site. It is a table of names and days (Aral, Casey, Joy, Aseel, Fabio And Mondays … Fridays) with checkboxes at each name/day pair. It starts out greyed out. The Unlock to edit button is clicked and the interface comes alive (opacity returns to full and the checkboxes become green and clickable). The person toggles a few checkboxes and clicks the Lock button to lock the interface again and then repeats the process to und…
Screenshot of code (the lines editable=false and the button tag code are highlighted):

class TeamSchedule extends kitten.Component {
  editable = false

  html () {
    return kitten.html`
      <section>
        <h3>Team schedule</h3>
        <button
          name='toggle'
          connect
        >${this.editable ? 'Lock' : 'Unlock to edit'}</button>
        <table id='team-schedule' ${this.editable ? '' : 'inert'}>
          <caption id='caption'>
            <markdown>
              Show…
Screenshot of code, continuation of the same class, starting with the end of the html() method from the previous screenshot and going till the end of the class (the table[inert] style and the onToggle() method are highlighted:

          <style>
            table[inert] {
              opacity: 0.9;
              filter: grayscale(100%);
            }
          </style>
        </table>
      </section>
    `
  }

  onToggle () {
    this.editable = !this.editable
    console.log(this.editable)…
Screenshot of code (the <${TeamSchedule.connectedTo(this)} /> line is highlighted):

export default class InterviewsPage extends kitten.Page {
  html () {
    const today = db.calendar.today
    const futureDays = db.calendar.futureDays
    const pastDays = db.calendar.pastDays

    return kitten.html`
      <${MainLayout} page='/admin/interviews/'>
        <h2>Interviews</h2>

        <${SignUpsSwitch.connectedTo(this)} />
        <${InternalNav} />
        <${TeamSchedule.connectedTo(this)} /…