clapton 0.0.24 → 0.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -113
  3. data/app/channels/clapton/clapton_channel.rb +4 -0
  4. data/lib/clapton/javascripts/dist/c-for-test.js +124 -268
  5. data/lib/clapton/javascripts/dist/c.js +124 -268
  6. data/lib/clapton/javascripts/dist/client.js +6 -31
  7. data/lib/clapton/javascripts/dist/components-for-test.js +73 -245
  8. data/lib/clapton/javascripts/dist/components.js +72 -241
  9. data/lib/clapton/javascripts/src/actions/handle-action.ts +3 -2
  10. data/lib/clapton/javascripts/src/c-base.ts +57 -30
  11. data/lib/clapton/javascripts/src/channel/clapton-channel.js +3 -2
  12. data/lib/clapton/javascripts/src/client.ts +0 -3
  13. data/lib/clapton/javascripts/src/components/{box.ts → base.ts} +6 -8
  14. data/lib/clapton/javascripts/src/components/block-quote.spec.ts +1 -1
  15. data/lib/clapton/javascripts/src/components/block-quote.ts +2 -14
  16. data/lib/clapton/javascripts/src/components/bold.ts +2 -14
  17. data/lib/clapton/javascripts/src/components/button.ts +2 -19
  18. data/lib/clapton/javascripts/src/components/code.ts +2 -14
  19. data/lib/clapton/javascripts/src/components/component.ts +2 -2
  20. data/lib/clapton/javascripts/src/components/{box.spec.ts → div.spec.ts} +8 -8
  21. data/lib/clapton/javascripts/src/components/div.ts +8 -0
  22. data/lib/clapton/javascripts/src/components/element.ts +3 -9
  23. data/lib/clapton/javascripts/src/components/emphasis.ts +2 -14
  24. data/lib/clapton/javascripts/src/components/form.ts +2 -14
  25. data/lib/clapton/javascripts/src/components/heading.ts +4 -10
  26. data/lib/clapton/javascripts/src/components/image.spec.ts +2 -2
  27. data/lib/clapton/javascripts/src/components/image.ts +3 -14
  28. data/lib/clapton/javascripts/src/components/input.spec.ts +16 -0
  29. data/lib/clapton/javascripts/src/components/{datetime-field.ts → input.ts} +13 -11
  30. data/lib/clapton/javascripts/src/components/link.spec.ts +6 -6
  31. data/lib/clapton/javascripts/src/components/link.ts +3 -16
  32. data/lib/clapton/javascripts/src/components/list-item.ts +2 -14
  33. data/lib/clapton/javascripts/src/components/list.ts +2 -14
  34. data/lib/clapton/javascripts/src/components/ordered-list.ts +2 -14
  35. data/lib/clapton/javascripts/src/components/paragraph.ts +2 -14
  36. data/lib/clapton/javascripts/src/components/quote.ts +2 -14
  37. data/lib/clapton/javascripts/src/components/select.ts +3 -5
  38. data/lib/clapton/javascripts/src/components/span.ts +2 -14
  39. data/lib/clapton/javascripts/src/components/text-area.ts +4 -9
  40. data/lib/clapton/javascripts/src/components-for-test.ts +3 -6
  41. data/lib/clapton/javascripts/src/components.ts +3 -6
  42. data/lib/clapton/test_helper/base.rb +4 -4
  43. data/lib/clapton/version.rb +1 -1
  44. metadata +7 -16
  45. data/lib/clapton/javascripts/dist/c +0 -559
  46. data/lib/clapton/javascripts/dist/c-base.js +0 -589
  47. data/lib/clapton/javascripts/src/components/checkbox.spec.ts +0 -16
  48. data/lib/clapton/javascripts/src/components/checkbox.ts +0 -23
  49. data/lib/clapton/javascripts/src/components/datetime-field.spec.ts +0 -16
  50. data/lib/clapton/javascripts/src/components/radio-button.spec.ts +0 -16
  51. data/lib/clapton/javascripts/src/components/radio-button.ts +0 -23
  52. data/lib/clapton/javascripts/src/components/text-field.spec.ts +0 -16
  53. data/lib/clapton/javascripts/src/components/text-field.ts +0 -23
  54. data/lib/clapton/javascripts/src/dom/update-component.ts +0 -11
  55. data/lib/clapton/javascripts/src/inputs/initialize-inputs.ts +0 -16
@@ -40,21 +40,7 @@ const escapeHtml = (unsafe) => {
40
40
  .replace(/'/g, "'");
41
41
  };
42
42
 
43
- class BlockQuote {
44
- constructor(attributes = {}) {
45
- this.children = [];
46
- this.attributes = attributes;
47
- }
48
- get renderWrapper() {
49
- return `<blockquote ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</blockquote>`;
50
- }
51
- add(child) {
52
- this.children.push(child);
53
- return this;
54
- }
55
- }
56
-
57
- class Box {
43
+ class Base {
58
44
  constructor(attributes = {}) {
59
45
  this.children = [];
60
46
  this.attributes = attributes;
@@ -63,132 +49,54 @@ class Box {
63
49
  this.children.push(child);
64
50
  return this;
65
51
  }
66
- get renderWrapper() {
67
- return `<div ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</div>`;
68
- }
69
52
  add_action(eventType, stateName, fnName, options = {}) {
70
53
  this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${eventType}->${stateName}#${fnName}@${options.debounce || 0}`;
71
54
  return this;
72
55
  }
56
+ get renderWrapper() {
57
+ return "";
58
+ }
73
59
  }
74
60
 
75
- class Button {
76
- constructor(attributes = {}) {
77
- this.attributes = attributes;
78
- this.children = [];
79
- }
80
- add(child) {
81
- this.children.push(child);
82
- return this;
83
- }
61
+ class BlockQuote extends Base {
84
62
  get renderWrapper() {
85
- return `<button ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</button>`;
86
- }
87
- add_action(event, klass, fn, options = {}) {
88
- this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${event}->${klass}#${fn}@${options.debounce || 0}`;
89
- return this;
63
+ return `<blockquote ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</blockquote>`;
90
64
  }
91
65
  }
92
66
 
93
- class Bold {
94
- constructor(attributes = {}) {
95
- this.children = [];
96
- this.attributes = attributes;
97
- }
67
+ class Div extends Base {
98
68
  get renderWrapper() {
99
- return `<strong ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</strong>`;
100
- }
101
- add(child) {
102
- this.children.push(child);
103
- return this;
69
+ return `<div ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</div>`;
104
70
  }
105
71
  }
106
72
 
107
- class Checkbox {
108
- constructor(state, attribute, attributes = {}) {
109
- this.state = state;
110
- this.attributes = attributes;
111
- this.attribute = attribute;
112
- this.attributes["data-attribute"] = attribute;
113
- }
73
+ class Button extends Base {
114
74
  get renderWrapper() {
115
- return `<input type='checkbox' ${htmlAttributes(this.attributes)} value='${this.state[this.attribute] || ""}'/>`;
116
- }
117
- add_action(event, klass, fn, options = {}) {
118
- this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${event}->${klass}#${fn}@${options.debounce || 0}`;
119
- return this;
75
+ return `<button ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</button>`;
120
76
  }
121
77
  }
122
78
 
123
- class Code {
124
- constructor(attributes = {}) {
125
- this.children = [];
126
- this.attributes = attributes;
127
- }
79
+ class Bold extends Base {
128
80
  get renderWrapper() {
129
- return `<code ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</code>`;
130
- }
131
- add(child) {
132
- this.children.push(child);
133
- return this;
81
+ return `<strong ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</strong>`;
134
82
  }
135
83
  }
136
84
 
137
- class DateTimeField {
138
- constructor(state, attribute, attributes = {}) {
139
- this.attributes = {};
140
- this.state = state;
141
- this.attribute = attribute;
142
- this.attributes = attributes;
143
- this.attributes["data-attribute"] = attribute;
144
- }
85
+ class Code extends Base {
145
86
  get renderWrapper() {
146
- const value = this.state[this.attribute] ? this.datetime_local_value(this.state[this.attribute]) : "";
147
- return `<input type='datetime-local' ${htmlAttributes(this.attributes)} value='${value}'/>`;
148
- }
149
- add_action(event, klass, fn, options = {}) {
150
- this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${event}->${klass}#${fn}@${options.debounce || 0}`;
151
- return this;
152
- }
153
- datetime_local_value(value) {
154
- if (!value) {
155
- return "";
156
- }
157
- const date = new Date(value);
158
- date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
159
- let month = date.getMonth() + 1;
160
- let day = date.getDate();
161
- let hours = date.getHours();
162
- let minutes = date.getMinutes();
163
- if (month < 10) {
164
- month = `0${month}`;
165
- }
166
- if (day < 10) {
167
- day = `0${day}`;
168
- }
169
- if (hours < 10) {
170
- hours = `0${hours}`;
171
- }
172
- if (minutes < 10) {
173
- minutes = `0${minutes}`;
174
- }
175
- return `${date.getFullYear()}-${month}-${day}T${hours}:${minutes}`;
87
+ return `<code ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</code>`;
176
88
  }
177
89
  }
178
90
 
179
- class Element {
91
+ class Element extends Base {
180
92
  constructor(type, attributes = {}) {
93
+ super(attributes);
181
94
  this.children = [];
182
95
  this.type = type;
183
- this.attributes = attributes;
184
96
  }
185
97
  get renderWrapper() {
186
98
  return `<${this.type} ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</${this.type}>`;
187
99
  }
188
- add(child) {
189
- this.children.push(child);
190
- return this;
191
- }
192
100
  }
193
101
 
194
102
  class Embed {
@@ -200,187 +108,86 @@ class Embed {
200
108
  }
201
109
  }
202
110
 
203
- class Emphasis {
204
- constructor(attributes = {}) {
205
- this.children = [];
206
- this.attributes = attributes;
207
- }
111
+ class Emphasis extends Base {
208
112
  get renderWrapper() {
209
113
  return `<em ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</em>`;
210
114
  }
211
- add(child) {
212
- this.children.push(child);
213
- return this;
214
- }
215
115
  }
216
116
 
217
- class Form {
218
- constructor(attributes = {}) {
219
- this.children = [];
220
- this.attributes = attributes;
221
- }
117
+ class Form extends Base {
222
118
  get renderWrapper() {
223
119
  return `<form ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</form>`;
224
120
  }
225
- add(child) {
226
- this.children.push(child);
227
- return this;
228
- }
229
121
  }
230
122
 
231
- class Heading {
123
+ class Heading extends Base {
232
124
  constructor(level, attributes = {}) {
233
- this.children = [];
125
+ super(attributes);
234
126
  this.level = level;
235
- this.attributes = attributes;
236
127
  }
237
128
  get renderWrapper() {
238
129
  return `<h${this.level} ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</h${this.level}>`;
239
130
  }
240
- add(child) {
241
- this.children.push(child);
242
- return this;
243
- }
244
131
  }
245
132
 
246
- class Image {
247
- constructor(src, alt, attributes = {}) {
248
- this.children = [];
249
- this.attributes = attributes;
250
- this.src = src;
251
- this.alt = alt;
252
- }
133
+ class Image extends Base {
253
134
  get renderWrapper() {
254
- return `<img src='${this.src}' alt='${this.alt}' ${htmlAttributes(this.attributes)}/>`;
135
+ return `<img ${htmlAttributes(this.attributes)}/>`;
255
136
  }
256
137
  }
257
138
 
258
- class Link {
259
- constructor(href, attributes = {}) {
260
- this.children = [];
261
- this.attributes = attributes;
262
- this.href = href;
263
- }
139
+ class Link extends Base {
264
140
  get renderWrapper() {
265
- return `<a href='${this.href}' ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</a>`;
266
- }
267
- add(child) {
268
- this.children.push(child);
269
- return this;
141
+ return `<a ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</a>`;
270
142
  }
271
143
  }
272
144
 
273
- class ListItem {
274
- constructor(attributes = {}) {
275
- this.children = [];
276
- this.attributes = attributes;
277
- }
278
- add(child) {
279
- this.children.push(child);
280
- return this;
281
- }
145
+ class ListItem extends Base {
282
146
  get renderWrapper() {
283
147
  return `<li ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</li>`;
284
148
  }
285
149
  }
286
150
 
287
- class List {
288
- constructor(attributes = {}) {
289
- this.children = [];
290
- this.attributes = attributes;
291
- }
292
- add(child) {
293
- this.children.push(child);
294
- return this;
295
- }
151
+ class List extends Base {
296
152
  get renderWrapper() {
297
153
  return `<ul ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</ul>`;
298
154
  }
299
155
  }
300
156
 
301
- class OrderedList {
302
- constructor(attributes = {}) {
303
- this.children = [];
304
- this.attributes = attributes;
305
- }
306
- add(child) {
307
- this.children.push(child);
308
- return this;
309
- }
157
+ class OrderedList extends Base {
310
158
  get renderWrapper() {
311
159
  return `<ol ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</ol>`;
312
160
  }
313
161
  }
314
162
 
315
- class Paragraph {
316
- constructor(attributes = {}) {
317
- this.children = [];
318
- this.attributes = attributes;
319
- }
163
+ class Paragraph extends Base {
320
164
  get renderWrapper() {
321
165
  return `<p ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</p>`;
322
166
  }
323
- add(child) {
324
- this.children.push(child);
325
- return this;
326
- }
327
167
  }
328
168
 
329
- class Quote {
330
- constructor(attributes = {}) {
331
- this.children = [];
332
- this.attributes = attributes;
333
- }
169
+ class Quote extends Base {
334
170
  get renderWrapper() {
335
171
  return `<q ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</q>`;
336
172
  }
337
- add(child) {
338
- this.children.push(child);
339
- return this;
340
- }
341
173
  }
342
174
 
343
- class RadioButton {
344
- constructor(state, attribute, attributes = {}) {
345
- this.state = state;
346
- this.attributes = attributes;
347
- this.attribute = attribute;
348
- this.attributes["data-attribute"] = attribute;
349
- }
350
- get renderWrapper() {
351
- return `<input type='radio' ${htmlAttributes(this.attributes)} value='${this.state[this.attribute] || ""}'/>`;
352
- }
353
- add_action(event, klass, fn, options = {}) {
354
- this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${event}->${klass}#${fn}@${options.debounce || 0}`;
355
- return this;
356
- }
357
- }
358
-
359
- class Select {
175
+ class Select extends Base {
360
176
  constructor(options = [], state, attribute, attributes = {}) {
361
- this.children = [];
177
+ super(attributes);
362
178
  this.options = options;
363
179
  this.state = state;
364
180
  this.attribute = attribute;
365
- this.attributes = attributes;
366
181
  }
367
182
  get renderWrapper() {
368
183
  return `<select ${htmlAttributes(this.attributes)}>${this.options.map(option => `<option value='${option.value}'${option.value === this.state[this.attribute] ? " selected" : ""}>${option.text}</option>`).join("")}${this.children.map(child => child.renderWrapper).join("")}</select>`;
369
184
  }
370
185
  }
371
186
 
372
- class Span {
373
- constructor(attributes = {}) {
374
- this.children = [];
375
- this.attributes = attributes;
376
- }
187
+ class Span extends Base {
377
188
  get renderWrapper() {
378
189
  return `<span ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</span>`;
379
190
  }
380
- add(child) {
381
- this.children.push(child);
382
- return this;
383
- }
384
191
  }
385
192
 
386
193
  class Component {
@@ -390,7 +197,7 @@ class Component {
390
197
  this._errors = errors;
391
198
  }
392
199
  get render() {
393
- return new Box({});
200
+ return new Div({});
394
201
  }
395
202
  get renderWrapper() {
396
203
  const root = this.render;
@@ -425,19 +232,47 @@ class Component {
425
232
  }
426
233
  Component._effects = [];
427
234
 
428
- class TextField {
235
+ class Input extends Base {
429
236
  constructor(state, attribute, attributes = {}) {
430
- this.state = state;
431
- this.attributes = attributes;
237
+ super(attributes);
432
238
  this.attribute = attribute;
239
+ this.state = state;
433
240
  this.attributes["data-attribute"] = attribute;
241
+ this.attributes["data-id"] = Math.random().toString(36).substring(2, 10);
434
242
  }
435
243
  get renderWrapper() {
436
- return `<input type='text' ${htmlAttributes(this.attributes)} value='${this.state[this.attribute] || ""}'/>`;
244
+ let value = this.state[this.attribute];
245
+ if (!this.attributes.type) {
246
+ this.attributes.type = "text";
247
+ }
248
+ if (this.attributes.type === "datetime-local" && value) {
249
+ value = this.datetime_local_value(value);
250
+ }
251
+ return `<input ${htmlAttributes(this.attributes)} value='${value || ""}'/>`;
437
252
  }
438
- add_action(event, klass, fn, options = {}) {
439
- this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${event}->${klass}#${fn}@${options.debounce || 0}`;
440
- return this;
253
+ datetime_local_value(value) {
254
+ if (!value) {
255
+ return "";
256
+ }
257
+ const date = new Date(value);
258
+ date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
259
+ let month = date.getMonth() + 1;
260
+ let day = date.getDate();
261
+ let hours = date.getHours();
262
+ let minutes = date.getMinutes();
263
+ if (month < 10) {
264
+ month = `0${month}`;
265
+ }
266
+ if (day < 10) {
267
+ day = `0${day}`;
268
+ }
269
+ if (hours < 10) {
270
+ hours = `0${hours}`;
271
+ }
272
+ if (minutes < 10) {
273
+ minutes = `0${minutes}`;
274
+ }
275
+ return `${date.getFullYear()}-${month}-${day}T${hours}:${minutes}`;
441
276
  }
442
277
  }
443
278
 
@@ -450,31 +285,27 @@ class Text {
450
285
  }
451
286
  }
452
287
 
453
- class TextArea {
288
+ class TextArea extends Base {
454
289
  constructor(state, attribute, attributes = {}) {
455
- this.state = state;
456
- this.attributes = attributes;
290
+ super(attributes);
457
291
  this.attribute = attribute;
292
+ this.state = state;
458
293
  this.attributes["data-attribute"] = attribute;
459
294
  }
460
295
  get renderWrapper() {
461
296
  return `<textarea ${htmlAttributes(this.attributes)}>${this.state[this.attribute] || ""}</textarea>`;
462
297
  }
463
- add_action(event, klass, fn, options = {}) {
464
- this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${event}->${klass}#${fn}@${options.debounce || 0}`;
465
- return this;
466
- }
467
298
  }
468
299
 
469
300
  const Clapton = {
470
- Box, Component, Text, TextField, Button, DateTimeField, BlockQuote, Checkbox, Code, Element, Emphasis, Form, Heading, Image, Link, List, ListItem, OrderedList, Paragraph, Quote, RadioButton, Select, Span, Embed, Bold, TextArea
301
+ Div, Component, Text, Input, Button, BlockQuote, Code, Element, Emphasis, Form, Heading, Image, Link, List, ListItem, OrderedList, Paragraph, Quote, Select, Span, Embed, Bold, TextArea
471
302
  };
472
303
 
473
- const bq = (...props) => {
304
+ const blockquote = (...props) => {
474
305
  return new Clapton.BlockQuote(...props);
475
306
  };
476
- const box = (...props) => {
477
- return new Clapton.Box(...props);
307
+ const div = (...props) => {
308
+ return new Clapton.Div(...props);
478
309
  };
479
310
  const b = (...props) => {
480
311
  return new Clapton.Bold(...props);
@@ -482,15 +313,9 @@ const b = (...props) => {
482
313
  const button = (...props) => {
483
314
  return new Clapton.Button(...props);
484
315
  };
485
- const check = (...props) => {
486
- return new Clapton.Checkbox(props[0], props[1], props[2]);
487
- };
488
316
  const code = (...props) => {
489
317
  return new Clapton.Code(...props);
490
318
  };
491
- const datetime = (...props) => {
492
- return new Clapton.DateTimeField(props[0], props[1], props[2]);
493
- };
494
319
  const el = (...props) => {
495
320
  return new Clapton.Element(props[0], props[1]);
496
321
  };
@@ -503,14 +328,29 @@ const em = (...props) => {
503
328
  const form = (...props) => {
504
329
  return new Clapton.Form(...props);
505
330
  };
506
- const h = (...props) => {
507
- return new Clapton.Heading(props[0], props[1]);
331
+ const h1 = (...props) => {
332
+ return new Clapton.Heading(1, props[1]);
333
+ };
334
+ const h2 = (...props) => {
335
+ return new Clapton.Heading(2, props[1]);
336
+ };
337
+ const h3 = (...props) => {
338
+ return new Clapton.Heading(3, props[1]);
339
+ };
340
+ const h4 = (...props) => {
341
+ return new Clapton.Heading(4, props[1]);
342
+ };
343
+ const h5 = (...props) => {
344
+ return new Clapton.Heading(5, props[1]);
345
+ };
346
+ const h6 = (...props) => {
347
+ return new Clapton.Heading(6, props[1]);
508
348
  };
509
349
  const img = (...props) => {
510
- return new Clapton.Image(props[0], props[1], props[2]);
350
+ return new Clapton.Image(props[0]);
511
351
  };
512
352
  const a = (...props) => {
513
- return new Clapton.Link(props[0], props[1]);
353
+ return new Clapton.Link(props[0]);
514
354
  };
515
355
  const li = (...props) => {
516
356
  return new Clapton.ListItem(...props);
@@ -527,9 +367,6 @@ const p = (...props) => {
527
367
  const q = (...props) => {
528
368
  return new Clapton.Quote(...props);
529
369
  };
530
- const radio = (...props) => {
531
- return new Clapton.RadioButton(props[0], props[1], props[2]);
532
- };
533
370
  const select = (...props) => {
534
371
  return new Clapton.Select(props[0], props[1], props[2]);
535
372
  };
@@ -540,7 +377,7 @@ const textarea = (...props) => {
540
377
  return new Clapton.TextArea(props[0], props[1], props[2]);
541
378
  };
542
379
  const input = (...props) => {
543
- return new Clapton.TextField(props[0], props[1], props[2]);
380
+ return new Clapton.Input(props[0], props[1], props[2]);
544
381
  };
545
382
  const text = (...props) => {
546
383
  return new Clapton.Text(props[0]);
@@ -548,19 +385,19 @@ const text = (...props) => {
548
385
  const c = (name, ...props) => {
549
386
  switch (name) {
550
387
  case "bq":
551
- return bq(...props);
388
+ return blockquote(...props);
552
389
  case "box":
553
- return box(...props);
390
+ return div(...props);
391
+ case "blockquote":
392
+ return blockquote(...props);
393
+ case "div":
394
+ return div(...props);
554
395
  case "b":
555
396
  return b(...props);
556
397
  case "button":
557
398
  return button(...props);
558
- case "check":
559
- return check(...props);
560
399
  case "code":
561
400
  return code(...props);
562
- case "datetime":
563
- return datetime(...props);
564
401
  case "el":
565
402
  return el(...props);
566
403
  case "embed":
@@ -570,7 +407,19 @@ const c = (name, ...props) => {
570
407
  case "form":
571
408
  return form(...props);
572
409
  case "h":
573
- return h(...props);
410
+ return h1(...props);
411
+ case "h1":
412
+ return h1(...props);
413
+ case "h2":
414
+ return h2(...props);
415
+ case "h3":
416
+ return h3(...props);
417
+ case "h4":
418
+ return h4(...props);
419
+ case "h5":
420
+ return h5(...props);
421
+ case "h6":
422
+ return h6(...props);
574
423
  case "img":
575
424
  return img(...props);
576
425
  case "a":
@@ -585,8 +434,6 @@ const c = (name, ...props) => {
585
434
  return p(...props);
586
435
  case "q":
587
436
  return q(...props);
588
- case "radio":
589
- return radio(...props);
590
437
  case "select":
591
438
  return select(...props);
592
439
  case "span":
@@ -597,8 +444,17 @@ const c = (name, ...props) => {
597
444
  return input(...props);
598
445
  case "text":
599
446
  return text(...props);
447
+ case "radio":
448
+ props[3].type = "radio";
449
+ return input(...props);
450
+ case "datetime":
451
+ props[3].type = "datetime-local";
452
+ return input(...props);
453
+ case "check":
454
+ props[3].type = "checkbox";
455
+ return input(...props);
600
456
  default:
601
- return new Clapton.Component(...props);
457
+ return new Clapton.Element(name, ...props);
602
458
  }
603
459
  };
604
460
 
@@ -1285,32 +1285,6 @@ function getConfig(name) {
1285
1285
  }
1286
1286
  }
1287
1287
 
1288
- const updateComponent = async (component, state, property, target) => {
1289
- state[property] = target.value;
1290
- const componentName = component.dataset.component;
1291
- const module = await import(`${componentName}`);
1292
- const ComponentClass = module[componentName];
1293
- const instance = new ComponentClass(state, component.dataset.id);
1294
- morphdom(component, instance.renderWrapper);
1295
- instance.runEffects();
1296
- };
1297
-
1298
- const initializeInputs = () => {
1299
- const inputElements = document.querySelectorAll("[data-attribute]");
1300
- inputElements.forEach((element) => {
1301
- const attribute = element.getAttribute("data-attribute");
1302
- const component = element.closest(`[data-component]`);
1303
- const state = JSON.parse(component.getAttribute("data-state") || "{}");
1304
- if (!attribute || !component)
1305
- return;
1306
- if (element.tagName === "INPUT") {
1307
- element.addEventListener("input", async (event) => {
1308
- await updateComponent(component, state, attribute, event.target);
1309
- });
1310
- }
1311
- });
1312
- };
1313
-
1314
1288
  const consumer = createConsumer();
1315
1289
 
1316
1290
  const claptonChannel = consumer.subscriptions.create("Clapton::ClaptonChannel", {
@@ -1327,12 +1301,14 @@ const claptonChannel = consumer.subscriptions.create("Clapton::ClaptonChannel",
1327
1301
  const instance = new module[data.component.name](data.state, data.component.id, errors);
1328
1302
  morphdom(component, instance.renderWrapper, {
1329
1303
  onBeforeElUpdated: (_fromEl, toEl) => {
1304
+ if (_fromEl.dataset.id === data.focus) {
1305
+ return false;
1306
+ }
1330
1307
  toEl.setAttribute("data-set-event-handler", "true");
1331
1308
  return true;
1332
1309
  }
1333
1310
  });
1334
1311
 
1335
- initializeInputs();
1336
1312
  initializeActions();
1337
1313
  instance.runEffects();
1338
1314
  }
@@ -1352,7 +1328,7 @@ const handleAction = async (target, stateName, fn) => {
1352
1328
  const attribute = target.dataset.attribute;
1353
1329
  if (attribute) {
1354
1330
  const state = JSON.parse(component.dataset.state || "{}");
1355
- if (target.tagName === "INPUT") {
1331
+ if (target.dataset.attribute) {
1356
1332
  state[attribute] = target.value;
1357
1333
  component.dataset.state = JSON.stringify(state);
1358
1334
  }
@@ -1368,7 +1344,8 @@ const handleAction = async (target, stateName, fn) => {
1368
1344
  action: fn,
1369
1345
  attributes: JSON.parse(targetComponent.dataset.state || "{}"),
1370
1346
  },
1371
- params: JSON.parse(component.dataset.state || "{}")
1347
+ params: JSON.parse(component.dataset.state || "{}"),
1348
+ focus: target.dataset.id,
1372
1349
  }
1373
1350
  });
1374
1351
  };
@@ -1447,14 +1424,12 @@ const createAndAppendComponent = async (component, element) => {
1447
1424
  document.addEventListener("DOMContentLoaded", async () => {
1448
1425
  await initializeComponents();
1449
1426
  initializeActions();
1450
- initializeInputs();
1451
1427
  const event = new Event('clapton:render');
1452
1428
  document.dispatchEvent(event);
1453
1429
  });
1454
1430
  document.addEventListener("turbo:render", async () => {
1455
1431
  await initializeComponents();
1456
1432
  initializeActions();
1457
- initializeInputs();
1458
1433
  const event = new Event('clapton:render');
1459
1434
  document.dispatchEvent(event);
1460
1435
  });