diff --git a/CLAUDE.md b/CLAUDE.md
index c6042cd..8450be0 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -79,6 +79,22 @@ root → /units (authenticated), /sign_in (unauthenticated)
## JavaScript Conventions
+### Use Stimulus for all JS behavior
+
+This app uses **Hotwire = Turbo + Stimulus**. All JavaScript behavior must be in Stimulus controllers under `app/javascript/controllers/`. Never use:
+- Inline HTML event handlers: `onclick="..."`, `onkeydown="..."`, `ondragstart="..."` etc.
+- Global `window.*` function exports
+- Bare `
+
diff --git a/app/views/measurements/_edit_form.html.erb b/app/views/measurements/_edit_form.html.erb
index 845ef41..a4770f0 100644
--- a/app/views/measurements/_edit_form.html.erb
+++ b/app/views/measurements/_edit_form.html.erb
@@ -1,6 +1,7 @@
<%= tabular_fields_for @readout, form: form_tag do |form| %>
- <%- tag.tr id: row, class: "form", onkeydown: "formProcessKey(event)",
- data: {form: form_tag, hidden_row: hidden_row, link: link} do %>
+ <%- tag.tr id: row, class: "form",
+ data: {controller: 'form', action: 'keydown->form#processKey',
+ form: form_tag, hidden_row: hidden_row, link: link} do %>
<%= @readout.quantity %> |
<%= form.number_field :value, required: true, autofocus: true %>
diff --git a/app/views/measurements/_edit_panel.html.erb b/app/views/measurements/_edit_panel.html.erb
index 20f59b2..dd08eb9 100644
--- a/app/views/measurements/_edit_panel.html.erb
+++ b/app/views/measurements/_edit_panel.html.erb
@@ -6,8 +6,9 @@
id: form_tag do |form| %>
- <%= tag.tr id: row, class: "form", onkeydown: "formProcessKey(event)",
- data: {form: form_tag, hidden_row: hidden_row} do %>
+ <%= tag.tr id: row, class: "form",
+ data: {controller: 'form', action: 'keydown->form#processKey',
+ form: form_tag, hidden_row: hidden_row} do %>
| <%= @readout.quantity %> |
<%= form.number_field :value, required: true, autofocus: true %>
diff --git a/app/views/measurements/_form.html.erb b/app/views/measurements/_form.html.erb
index f8db9f9..732c5ca 100644
--- a/app/views/measurements/_form.html.erb
+++ b/app/views/measurements/_form.html.erb
@@ -1,6 +1,6 @@
<%= tabular_form_with model: Measurement.new, id: :measurement_form,
class: 'topside-area flex vertical center',
- html: {onkeydown: 'formProcessKey(event)'} do |form| %>
+ html: {data: {controller: 'form', action: 'keydown->form#processKey'}} do |form| %>
@@ -17,17 +17,18 @@
<%# TODO: right-click selection; unnecessary with hierarchical tags? %>
+ data-controller="details"
+ data-action="focusout->details#close change->details#change keydown->details#processKey">
-
+
<%= t('.select_quantity') %>
<%= image_button_tag t(:apply), "update", name: nil, disabled: true,
formaction: new_readout_path, formmethod: :get, formnovalidate: true,
- data: {turbo_stream: true} %>
+ data: {turbo_stream: true, details_target: 'submitButton'} %>
- <%= quantities_check_boxes(@quantities) %>
+ <%= quantities_check_boxes(@quantities) %>
@@ -36,10 +37,3 @@
class: 'dangerous', onclick: render_turbo_stream('form_close') %>
<% end %>
-
-
diff --git a/app/views/measurements/index.html.erb b/app/views/measurements/index.html.erb
index 8d5c5b2..7f24cf2 100644
--- a/app/views/measurements/index.html.erb
+++ b/app/views/measurements/index.html.erb
@@ -1,5 +1,5 @@
<%# TODO: show hint when no quantities/units defined %>
- | |