clapton 0.0.17 → 0.0.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -7
  3. data/lib/clapton/javascripts/dist/client.js +14 -4
  4. data/lib/clapton/javascripts/dist/components-for-test.js +54 -45
  5. data/lib/clapton/javascripts/dist/components.js +54 -45
  6. data/lib/clapton/javascripts/src/channel/clapton-channel.js +1 -1
  7. data/lib/clapton/javascripts/src/client.ts +11 -2
  8. data/lib/clapton/javascripts/src/components/block-quote.spec.ts +6 -6
  9. data/lib/clapton/javascripts/src/components/block-quote.ts +2 -2
  10. data/lib/clapton/javascripts/src/components/bold.spec.ts +3 -3
  11. data/lib/clapton/javascripts/src/components/bold.ts +2 -2
  12. data/lib/clapton/javascripts/src/components/box.spec.ts +6 -6
  13. data/lib/clapton/javascripts/src/components/box.ts +2 -2
  14. data/lib/clapton/javascripts/src/components/button.spec.ts +5 -5
  15. data/lib/clapton/javascripts/src/components/button.ts +2 -2
  16. data/lib/clapton/javascripts/src/components/checkbox.spec.ts +3 -3
  17. data/lib/clapton/javascripts/src/components/checkbox.ts +1 -1
  18. data/lib/clapton/javascripts/src/components/code.spec.ts +6 -6
  19. data/lib/clapton/javascripts/src/components/code.ts +2 -2
  20. data/lib/clapton/javascripts/src/components/component.ts +12 -4
  21. data/lib/clapton/javascripts/src/components/datetime-field.spec.ts +3 -3
  22. data/lib/clapton/javascripts/src/components/datetime-field.ts +1 -1
  23. data/lib/clapton/javascripts/src/components/element.spec.ts +6 -6
  24. data/lib/clapton/javascripts/src/components/element.ts +2 -2
  25. data/lib/clapton/javascripts/src/components/embed.spec.ts +1 -1
  26. data/lib/clapton/javascripts/src/components/embed.ts +1 -1
  27. data/lib/clapton/javascripts/src/components/emphasis.spec.ts +6 -6
  28. data/lib/clapton/javascripts/src/components/emphasis.ts +2 -2
  29. data/lib/clapton/javascripts/src/components/form.spec.ts +6 -6
  30. data/lib/clapton/javascripts/src/components/form.ts +2 -2
  31. data/lib/clapton/javascripts/src/components/heading.spec.ts +6 -6
  32. data/lib/clapton/javascripts/src/components/heading.ts +2 -2
  33. data/lib/clapton/javascripts/src/components/image.spec.ts +2 -2
  34. data/lib/clapton/javascripts/src/components/image.ts +1 -1
  35. data/lib/clapton/javascripts/src/components/link.spec.ts +6 -6
  36. data/lib/clapton/javascripts/src/components/link.ts +2 -2
  37. data/lib/clapton/javascripts/src/components/list-item.spec.ts +6 -6
  38. data/lib/clapton/javascripts/src/components/list-item.ts +2 -2
  39. data/lib/clapton/javascripts/src/components/list.spec.ts +6 -6
  40. data/lib/clapton/javascripts/src/components/list.ts +2 -2
  41. data/lib/clapton/javascripts/src/components/ordered-list.spec.ts +6 -6
  42. data/lib/clapton/javascripts/src/components/ordered-list.ts +2 -2
  43. data/lib/clapton/javascripts/src/components/paragraph.spec.ts +6 -6
  44. data/lib/clapton/javascripts/src/components/paragraph.ts +2 -2
  45. data/lib/clapton/javascripts/src/components/presets.ts +1 -1
  46. data/lib/clapton/javascripts/src/components/quote.spec.ts +6 -6
  47. data/lib/clapton/javascripts/src/components/quote.ts +2 -2
  48. data/lib/clapton/javascripts/src/components/radio-button.spec.ts +3 -3
  49. data/lib/clapton/javascripts/src/components/radio-button.ts +1 -1
  50. data/lib/clapton/javascripts/src/components/select.spec.ts +6 -6
  51. data/lib/clapton/javascripts/src/components/select.ts +2 -2
  52. data/lib/clapton/javascripts/src/components/span.spec.ts +6 -6
  53. data/lib/clapton/javascripts/src/components/span.ts +2 -2
  54. data/lib/clapton/javascripts/src/components/text-area.spec.ts +3 -3
  55. data/lib/clapton/javascripts/src/components/text-area.ts +1 -1
  56. data/lib/clapton/javascripts/src/components/text-field.spec.ts +3 -3
  57. data/lib/clapton/javascripts/src/components/text-field.ts +1 -1
  58. data/lib/clapton/javascripts/src/components/text.spec.ts +2 -2
  59. data/lib/clapton/javascripts/src/components/text.ts +1 -1
  60. data/lib/clapton/javascripts/src/dom/update-component.ts +1 -1
  61. data/lib/clapton/test_helper/base.rb +1 -1
  62. data/lib/clapton/version.rb +1 -1
  63. data/lib/rails/generators/clapton_generator.rb +2 -0
  64. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f88a3c4f18d2b7b88414e36366129851c5edf38ce1fdefb0ff17b81a34ff1f1
4
- data.tar.gz: 7fa52de397a29a416b48cdc1a50d291618546ba38e0adf014b2907c57eff6982
3
+ metadata.gz: eef5820604c561e4e740eb50620f88cfc0b9466517ad9e3f5da364a1d923356d
4
+ data.tar.gz: a1ce6f1bbc737affe77cdf3cb8370722c6fb169c6b4b386bb17fa53ed3799f47
5
5
  SHA512:
6
- metadata.gz: 55b858f91dc9bef90d79e8ea714ece958e85af9dacb2e6d99a1f3e79e146f2c612c8536d615b21b8fe6d87b3a31f7acfb07f5f9d0c3650f91b3bc0eb57d3b7d6
7
- data.tar.gz: 9c2f938f18a19c296bc3d2c2ea513ca8f1f964266c377d00e28c8a51676fbf4dae33c9ef42d5b2a97ba15159e2496bbf4480e54ccd605c030446c19a2835c6c3
6
+ metadata.gz: b36f22c1f26313d9aabe6e67844df736302c92b4f42805b09be40dca60b3ddab9c8a7b40a70dbab3c55ee7baa9ec508820342d4f4e296b16ca053721cff598ad
7
+ data.tar.gz: dd95168998ca12d46b7eb164698f918b6a8f0575e7a8be435a2943054a4a0407209758a834514719c11f496424ec29a1bcb4701a0d05ceb625e35b07d468789b
data/README.md CHANGED
@@ -34,14 +34,14 @@ To use a Clapton component in your view:
34
34
  # app/components/task_list_component.rb
35
35
  class TaskListComponent < Clapton::Component
36
36
  def render
37
+ box = c.box
37
38
  @state.tasks.each do |task|
38
- @root.add(TaskItemComponent.new(id: task[:id], title: task[:title], due: task[:due], done: task[:done]))
39
+ box.add(TaskItemComponent.new(id: task[:id], title: task[:title], due: task[:due], done: task[:done]))
39
40
  end
40
41
  btn = c.button
41
42
  btn.add(c.text("Add Task"))
42
43
  btn.add_action(:click, :TaskListState, :add_task)
43
- @root.add(btn)
44
- @root.render
44
+ box.add(btn)
45
45
  end
46
46
  end
47
47
 
@@ -51,6 +51,7 @@ end
51
51
  # app/components/task_item_component.rb
52
52
  class TaskItemComponent < Clapton::Component
53
53
  def render
54
+ box = c.box
54
55
  btn = c.button
55
56
  btn.add(c.text(@state.done ? "✅" : "🟩"))
56
57
  btn.add_action(:click, :TaskListState, :toggle_done)
@@ -61,8 +62,7 @@ class TaskItemComponent < Clapton::Component
61
62
  dt = c.datetime(@state, :due)
62
63
  dt.add_action(:input, :TaskListState, :update_due)
63
64
 
64
- @root.add(btn).add(tf).add(dt)
65
- @root.render
65
+ box.add(btn).add(tf).add(dt)
66
66
  end
67
67
  end
68
68
 
@@ -171,8 +171,8 @@ The `render` event is a special event that is triggered when the component is re
171
171
  class TaskListComponent < Clapton::Component
172
172
  def render
173
173
  # ...
174
- @root.add_action(:render, :TaskListState, :add_empty_task, debounce: 500)
175
- @root.render
174
+ box = c.box
175
+ box.add_action(:render, :TaskListState, :add_empty_task, debounce: 500)
176
176
  end
177
177
  end
178
178
  ```
@@ -349,6 +349,18 @@ module ApplicationCable
349
349
  end
350
350
  ```
351
351
 
352
+ ### Events
353
+
354
+ #### clapton:render
355
+
356
+ The `clapton:render` event is a custom event that is triggered when the component is rendered.
357
+
358
+ ```javascript
359
+ document.addEventListener("clapton:render", () => {
360
+ console.log("clapton:render");
361
+ });
362
+ ```
363
+
352
364
  ### Testing
353
365
 
354
366
  #### RSpec
@@ -1291,7 +1291,7 @@ const updateComponent = async (component, state, property, target) => {
1291
1291
  const module = await import(`${componentName}`);
1292
1292
  const ComponentClass = module[componentName];
1293
1293
  const instance = new ComponentClass(state, component.dataset.id);
1294
- morphdom(component, instance.render);
1294
+ morphdom(component, instance.renderWrapper);
1295
1295
  };
1296
1296
 
1297
1297
  const initializeInputs = () => {
@@ -1324,7 +1324,7 @@ const claptonChannel = consumer.subscriptions.create("Clapton::ClaptonChannel",
1324
1324
  const component = document.querySelector(`[data-id="${data.component.id}"]`);
1325
1325
  const module = await import(`${data.component.name}`);
1326
1326
  const instance = new module[data.component.name](data.state, data.component.id, errors);
1327
- morphdom(component, instance.render, {
1327
+ morphdom(component, instance.renderWrapper, {
1328
1328
  onBeforeElUpdated: (_fromEl, toEl) => {
1329
1329
  toEl.setAttribute("data-set-event-handler", "true");
1330
1330
  return true;
@@ -1424,17 +1424,27 @@ const initializeComponents = async () => {
1424
1424
  }
1425
1425
  };
1426
1426
  const createAndAppendComponent = async (component, element) => {
1427
+ if (!element) {
1428
+ return;
1429
+ }
1427
1430
  const componentDom = document.createElement('div');
1428
1431
  const module = await import(`${component.component}`);
1429
1432
  const instance = new module[component.component](component.state);
1430
- componentDom.innerHTML = instance.render;
1433
+ componentDom.innerHTML = instance.renderWrapper;
1431
1434
  const firstChild = componentDom.firstChild;
1432
1435
  if (firstChild) {
1433
- element.appendChild(firstChild);
1436
+ if (element.children.length > 0) {
1437
+ element.appendChild(firstChild);
1438
+ }
1439
+ else {
1440
+ element.outerHTML = firstChild.outerHTML;
1441
+ }
1434
1442
  }
1435
1443
  };
1436
1444
  document.addEventListener("DOMContentLoaded", async () => {
1437
1445
  await initializeComponents();
1438
1446
  initializeActions();
1439
1447
  initializeInputs();
1448
+ const event = new Event('clapton:render');
1449
+ document.dispatchEvent(event);
1440
1450
  });
@@ -48,8 +48,8 @@ var Clapton = (function (exports) {
48
48
  this.children = [];
49
49
  this.attributes = attributes;
50
50
  }
51
- get render() {
52
- return `<blockquote ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</blockquote>`;
51
+ get renderWrapper() {
52
+ return `<blockquote ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</blockquote>`;
53
53
  }
54
54
  add(child) {
55
55
  this.children.push(child);
@@ -66,8 +66,8 @@ var Clapton = (function (exports) {
66
66
  this.children.push(child);
67
67
  return this;
68
68
  }
69
- get render() {
70
- return `<div ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</div>`;
69
+ get renderWrapper() {
70
+ return `<div ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</div>`;
71
71
  }
72
72
  add_action(eventType, stateName, fnName, options = {}) {
73
73
  this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${eventType}->${stateName}#${fnName}@${options.debounce || 0}`;
@@ -80,8 +80,8 @@ var Clapton = (function (exports) {
80
80
  this.children = [];
81
81
  this.attributes = attributes;
82
82
  }
83
- get render() {
84
- return `<strong ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</strong>`;
83
+ get renderWrapper() {
84
+ return `<strong ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</strong>`;
85
85
  }
86
86
  add(child) {
87
87
  this.children.push(child);
@@ -98,8 +98,8 @@ var Clapton = (function (exports) {
98
98
  this.children.push(child);
99
99
  return this;
100
100
  }
101
- get render() {
102
- return `<button ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</button>`;
101
+ get renderWrapper() {
102
+ return `<button ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</button>`;
103
103
  }
104
104
  add_action(event, klass, fn, options = {}) {
105
105
  this.attributes["data-action"] = `${this.attributes["data-action"] || ""} ${event}->${klass}#${fn}@${options.debounce || 0}`;
@@ -114,7 +114,7 @@ var Clapton = (function (exports) {
114
114
  this.attribute = attribute;
115
115
  this.attributes["data-attribute"] = attribute;
116
116
  }
117
- get render() {
117
+ get renderWrapper() {
118
118
  return `<input type='checkbox' ${htmlAttributes(this.attributes)} value='${this.state[this.attribute] || ""}'/>`;
119
119
  }
120
120
  add_action(event, klass, fn, options = {}) {
@@ -128,8 +128,8 @@ var Clapton = (function (exports) {
128
128
  this.children = [];
129
129
  this.attributes = attributes;
130
130
  }
131
- get render() {
132
- return `<code ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</code>`;
131
+ get renderWrapper() {
132
+ return `<code ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</code>`;
133
133
  }
134
134
  add(child) {
135
135
  this.children.push(child);
@@ -145,7 +145,7 @@ var Clapton = (function (exports) {
145
145
  this.attributes = attributes;
146
146
  this.attributes["data-attribute"] = attribute;
147
147
  }
148
- get render() {
148
+ get renderWrapper() {
149
149
  const value = this.state[this.attribute] ? this.datetime_local_value(this.state[this.attribute]) : "";
150
150
  return `<input type='datetime-local' ${htmlAttributes(this.attributes)} value='${value}'/>`;
151
151
  }
@@ -185,8 +185,8 @@ var Clapton = (function (exports) {
185
185
  this.type = type;
186
186
  this.attributes = attributes;
187
187
  }
188
- get render() {
189
- return `<${this.type} ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</${this.type}>`;
188
+ get renderWrapper() {
189
+ return `<${this.type} ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</${this.type}>`;
190
190
  }
191
191
  add(child) {
192
192
  this.children.push(child);
@@ -198,7 +198,7 @@ var Clapton = (function (exports) {
198
198
  constructor(html) {
199
199
  this.html = html;
200
200
  }
201
- get render() {
201
+ get renderWrapper() {
202
202
  return this.html;
203
203
  }
204
204
  }
@@ -208,8 +208,8 @@ var Clapton = (function (exports) {
208
208
  this.children = [];
209
209
  this.attributes = attributes;
210
210
  }
211
- get render() {
212
- return `<em ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</em>`;
211
+ get renderWrapper() {
212
+ return `<em ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</em>`;
213
213
  }
214
214
  add(child) {
215
215
  this.children.push(child);
@@ -222,8 +222,8 @@ var Clapton = (function (exports) {
222
222
  this.children = [];
223
223
  this.attributes = attributes;
224
224
  }
225
- get render() {
226
- return `<form ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</form>`;
225
+ get renderWrapper() {
226
+ return `<form ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</form>`;
227
227
  }
228
228
  add(child) {
229
229
  this.children.push(child);
@@ -237,8 +237,8 @@ var Clapton = (function (exports) {
237
237
  this.level = level;
238
238
  this.attributes = attributes;
239
239
  }
240
- get render() {
241
- return `<h${this.level} ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</h${this.level}>`;
240
+ get renderWrapper() {
241
+ return `<h${this.level} ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</h${this.level}>`;
242
242
  }
243
243
  add(child) {
244
244
  this.children.push(child);
@@ -253,7 +253,7 @@ var Clapton = (function (exports) {
253
253
  this.src = src;
254
254
  this.alt = alt;
255
255
  }
256
- get render() {
256
+ get renderWrapper() {
257
257
  return `<img src='${this.src}' alt='${this.alt}' ${htmlAttributes(this.attributes)}/>`;
258
258
  }
259
259
  }
@@ -264,8 +264,8 @@ var Clapton = (function (exports) {
264
264
  this.attributes = attributes;
265
265
  this.href = href;
266
266
  }
267
- get render() {
268
- return `<a href='${this.href}' ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</a>`;
267
+ get renderWrapper() {
268
+ return `<a href='${this.href}' ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</a>`;
269
269
  }
270
270
  add(child) {
271
271
  this.children.push(child);
@@ -282,8 +282,8 @@ var Clapton = (function (exports) {
282
282
  this.children.push(child);
283
283
  return this;
284
284
  }
285
- get render() {
286
- return `<li ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</li>`;
285
+ get renderWrapper() {
286
+ return `<li ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</li>`;
287
287
  }
288
288
  }
289
289
 
@@ -296,8 +296,8 @@ var Clapton = (function (exports) {
296
296
  this.children.push(child);
297
297
  return this;
298
298
  }
299
- get render() {
300
- return `<ul ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</ul>`;
299
+ get renderWrapper() {
300
+ return `<ul ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</ul>`;
301
301
  }
302
302
  }
303
303
 
@@ -310,8 +310,8 @@ var Clapton = (function (exports) {
310
310
  this.children.push(child);
311
311
  return this;
312
312
  }
313
- get render() {
314
- return `<ol ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</ol>`;
313
+ get renderWrapper() {
314
+ return `<ol ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</ol>`;
315
315
  }
316
316
  }
317
317
 
@@ -320,8 +320,8 @@ var Clapton = (function (exports) {
320
320
  this.children = [];
321
321
  this.attributes = attributes;
322
322
  }
323
- get render() {
324
- return `<p ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</p>`;
323
+ get renderWrapper() {
324
+ return `<p ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</p>`;
325
325
  }
326
326
  add(child) {
327
327
  this.children.push(child);
@@ -334,8 +334,8 @@ var Clapton = (function (exports) {
334
334
  this.children = [];
335
335
  this.attributes = attributes;
336
336
  }
337
- get render() {
338
- return `<q ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</q>`;
337
+ get renderWrapper() {
338
+ return `<q ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</q>`;
339
339
  }
340
340
  add(child) {
341
341
  this.children.push(child);
@@ -350,7 +350,7 @@ var Clapton = (function (exports) {
350
350
  this.attribute = attribute;
351
351
  this.attributes["data-attribute"] = attribute;
352
352
  }
353
- get render() {
353
+ get renderWrapper() {
354
354
  return `<input type='radio' ${htmlAttributes(this.attributes)} value='${this.state[this.attribute] || ""}'/>`;
355
355
  }
356
356
  add_action(event, klass, fn, options = {}) {
@@ -367,8 +367,8 @@ var Clapton = (function (exports) {
367
367
  this.attribute = attribute;
368
368
  this.attributes = attributes;
369
369
  }
370
- get render() {
371
- 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.render).join("")}</select>`;
370
+ get renderWrapper() {
371
+ 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>`;
372
372
  }
373
373
  }
374
374
 
@@ -377,8 +377,8 @@ var Clapton = (function (exports) {
377
377
  this.children = [];
378
378
  this.attributes = attributes;
379
379
  }
380
- get render() {
381
- return `<span ${htmlAttributes(this.attributes)}>${this.children.map(child => child.render).join("")}</span>`;
380
+ get renderWrapper() {
381
+ return `<span ${htmlAttributes(this.attributes)}>${this.children.map(child => child.renderWrapper).join("")}</span>`;
382
382
  }
383
383
  add(child) {
384
384
  this.children.push(child);
@@ -393,7 +393,7 @@ var Clapton = (function (exports) {
393
393
  this.attribute = attribute;
394
394
  this.attributes["data-attribute"] = attribute;
395
395
  }
396
- get render() {
396
+ get renderWrapper() {
397
397
  return `<input type='text' ${htmlAttributes(this.attributes)} value='${this.state[this.attribute] || ""}'/>`;
398
398
  }
399
399
  add_action(event, klass, fn, options = {}) {
@@ -406,7 +406,7 @@ var Clapton = (function (exports) {
406
406
  constructor(value) {
407
407
  this.value = value;
408
408
  }
409
- get render() {
409
+ get renderWrapper() {
410
410
  return this.value;
411
411
  }
412
412
  }
@@ -418,7 +418,7 @@ var Clapton = (function (exports) {
418
418
  this.attribute = attribute;
419
419
  this.attributes["data-attribute"] = attribute;
420
420
  }
421
- get render() {
421
+ get renderWrapper() {
422
422
  return `<textarea ${htmlAttributes(this.attributes)}>${this.state[this.attribute] || ""}</textarea>`;
423
423
  }
424
424
  add_action(event, klass, fn, options = {}) {
@@ -469,7 +469,7 @@ var Clapton = (function (exports) {
469
469
  return new Clapton.Heading(props[0], props[1]);
470
470
  }
471
471
  img(...props) {
472
- return new Clapton.Image(props[0], props[1]);
472
+ return new Clapton.Image(props[0], props[1], props[2]);
473
473
  }
474
474
  a(...props) {
475
475
  return new Clapton.Link(props[0], props[1]);
@@ -514,11 +514,20 @@ var Clapton = (function (exports) {
514
514
  this._state = state;
515
515
  this.id = id;
516
516
  this._errors = errors;
517
- this._root = new Box({ data: { component: this.constructor.name, state: JSON.stringify(this._state), id: this.id, errors: this._errors } });
518
517
  this._c = new Presets();
519
518
  }
520
519
  get render() {
521
- return this._root.render;
520
+ return new Box({});
521
+ }
522
+ get renderWrapper() {
523
+ const root = this.render;
524
+ if (root.attributes) {
525
+ root.attributes = { ...root.attributes, data: { ...root.attributes.data, component: this.constructor.name, state: JSON.stringify(this._state), id: this.id, errors: this._errors } };
526
+ }
527
+ else {
528
+ root.attributes = { data: { component: this.constructor.name, state: JSON.stringify(this._state), id: this.id, errors: this._errors } };
529
+ }
530
+ return root.renderWrapper;
522
531
  }
523
532
  }
524
533