@almadar/std 3.2.2 → 3.2.3

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 (199) hide show
  1. package/behaviors/exports/atoms/std-browse.orb +38 -45
  2. package/behaviors/exports/atoms/std-calendar.orb +770 -0
  3. package/behaviors/exports/atoms/std-display.orb +1175 -510
  4. package/behaviors/exports/atoms/std-drawer.orb +235 -133
  5. package/behaviors/exports/atoms/std-flip-card.orb +596 -0
  6. package/behaviors/exports/atoms/std-gallery.orb +382 -0
  7. package/behaviors/exports/atoms/std-loading.orb +131 -103
  8. package/behaviors/exports/atoms/std-modal.orb +5 -24
  9. package/behaviors/exports/atoms/std-notification.orb +71 -0
  10. package/behaviors/exports/atoms/std-pagination.orb +32 -40
  11. package/behaviors/exports/atoms/std-rating.orb +328 -0
  12. package/behaviors/exports/atoms/std-score.orb +41 -0
  13. package/behaviors/exports/atoms/std-search.orb +44 -30
  14. package/behaviors/exports/atoms/std-selection.orb +26 -34
  15. package/behaviors/exports/atoms/std-sort.orb +82 -60
  16. package/behaviors/exports/atoms/std-text-effects.orb +658 -0
  17. package/behaviors/exports/atoms/std-theme.orb +573 -0
  18. package/behaviors/exports/atoms/std-upload.orb +535 -0
  19. package/behaviors/exports/atoms/std-wizard.orb +664 -224
  20. package/behaviors/exports/molecules/std-builder-game.orb +43 -3
  21. package/behaviors/exports/molecules/std-cart.orb +319 -101
  22. package/behaviors/exports/molecules/std-classifier-game.orb +43 -3
  23. package/behaviors/exports/molecules/std-debugger-game.orb +43 -3
  24. package/behaviors/exports/molecules/std-detail.orb +46 -49
  25. package/behaviors/exports/molecules/std-event-handler-game.orb +43 -3
  26. package/behaviors/exports/molecules/std-form-advanced.orb +654 -0
  27. package/behaviors/exports/molecules/std-geospatial.orb +48 -48
  28. package/behaviors/exports/molecules/std-inventory.orb +70 -50
  29. package/behaviors/exports/molecules/std-list.orb +174 -197
  30. package/behaviors/exports/molecules/std-messaging.orb +35 -50
  31. package/behaviors/exports/molecules/std-negotiator-game.orb +43 -3
  32. package/behaviors/exports/molecules/std-platformer-game.orb +18 -2
  33. package/behaviors/exports/molecules/std-puzzle-game.orb +32 -6
  34. package/behaviors/exports/molecules/std-quiz.orb +1045 -0
  35. package/behaviors/exports/molecules/std-sequencer-game.orb +43 -3
  36. package/behaviors/exports/molecules/std-simulator-game.orb +43 -3
  37. package/behaviors/exports/molecules/std-turn-based-battle.orb +26 -0
  38. package/behaviors/exports/organisms/std-api-gateway.orb +2326 -1320
  39. package/behaviors/exports/organisms/std-arcade-game.orb +377 -265
  40. package/behaviors/exports/organisms/std-booking-system.orb +3144 -1855
  41. package/behaviors/exports/organisms/std-cicd-pipeline.orb +2107 -1122
  42. package/behaviors/exports/organisms/std-cms.orb +929 -822
  43. package/behaviors/exports/organisms/std-coding-academy.orb +1347 -458
  44. package/behaviors/exports/organisms/std-crm.orb +2302 -1282
  45. package/behaviors/exports/organisms/std-devops-dashboard.orb +3902 -2005
  46. package/behaviors/exports/organisms/std-ecommerce.orb +2432 -1630
  47. package/behaviors/exports/organisms/std-finance-tracker.orb +1674 -846
  48. package/behaviors/exports/organisms/std-healthcare.orb +3545 -1992
  49. package/behaviors/exports/organisms/std-helpdesk.orb +1853 -940
  50. package/behaviors/exports/organisms/std-hr-portal.orb +3249 -1939
  51. package/behaviors/exports/organisms/std-iot-dashboard.orb +2422 -1418
  52. package/behaviors/exports/organisms/std-lms.orb +2495 -1435
  53. package/behaviors/exports/organisms/std-logic-training.orb +220 -66
  54. package/behaviors/exports/organisms/std-platformer-app.orb +345 -214
  55. package/behaviors/exports/organisms/std-project-manager.orb +2217 -1190
  56. package/behaviors/exports/organisms/std-puzzle-app.orb +228 -103
  57. package/behaviors/exports/organisms/std-realtime-chat.orb +1887 -1051
  58. package/behaviors/exports/organisms/std-rpg-game.orb +1170 -948
  59. package/behaviors/exports/organisms/std-social-feed.orb +184 -172
  60. package/behaviors/exports/organisms/std-stem-lab.orb +1308 -482
  61. package/behaviors/exports/organisms/std-strategy-game.orb +1520 -696
  62. package/behaviors/exports/organisms/std-trading-dashboard.orb +1884 -904
  63. package/behaviors/exports/validation-report.json +0 -747
  64. package/dist/behaviors/exports/atoms/std-browse.orb +38 -45
  65. package/dist/behaviors/exports/atoms/std-calendar.orb +770 -0
  66. package/dist/behaviors/exports/atoms/std-display.orb +1175 -510
  67. package/dist/behaviors/exports/atoms/std-drawer.orb +235 -133
  68. package/dist/behaviors/exports/atoms/std-flip-card.orb +596 -0
  69. package/dist/behaviors/exports/atoms/std-gallery.orb +382 -0
  70. package/dist/behaviors/exports/atoms/std-loading.orb +131 -103
  71. package/dist/behaviors/exports/atoms/std-modal.orb +5 -24
  72. package/dist/behaviors/exports/atoms/std-notification.orb +71 -0
  73. package/dist/behaviors/exports/atoms/std-pagination.orb +32 -40
  74. package/dist/behaviors/exports/atoms/std-rating.orb +328 -0
  75. package/dist/behaviors/exports/atoms/std-score.orb +41 -0
  76. package/dist/behaviors/exports/atoms/std-search.orb +44 -30
  77. package/dist/behaviors/exports/atoms/std-selection.orb +26 -34
  78. package/dist/behaviors/exports/atoms/std-sort.orb +82 -60
  79. package/dist/behaviors/exports/atoms/std-text-effects.orb +658 -0
  80. package/dist/behaviors/exports/atoms/std-theme.orb +573 -0
  81. package/dist/behaviors/exports/atoms/std-upload.orb +535 -0
  82. package/dist/behaviors/exports/atoms/std-wizard.orb +664 -224
  83. package/dist/behaviors/exports/molecules/std-builder-game.orb +43 -3
  84. package/dist/behaviors/exports/molecules/std-cart.orb +319 -101
  85. package/dist/behaviors/exports/molecules/std-classifier-game.orb +43 -3
  86. package/dist/behaviors/exports/molecules/std-debugger-game.orb +43 -3
  87. package/dist/behaviors/exports/molecules/std-detail.orb +46 -49
  88. package/dist/behaviors/exports/molecules/std-event-handler-game.orb +43 -3
  89. package/dist/behaviors/exports/molecules/std-form-advanced.orb +654 -0
  90. package/dist/behaviors/exports/molecules/std-geospatial.orb +48 -48
  91. package/dist/behaviors/exports/molecules/std-inventory.orb +70 -50
  92. package/dist/behaviors/exports/molecules/std-list.orb +174 -197
  93. package/dist/behaviors/exports/molecules/std-messaging.orb +35 -50
  94. package/dist/behaviors/exports/molecules/std-negotiator-game.orb +43 -3
  95. package/dist/behaviors/exports/molecules/std-platformer-game.orb +18 -2
  96. package/dist/behaviors/exports/molecules/std-puzzle-game.orb +32 -6
  97. package/dist/behaviors/exports/molecules/std-quiz.orb +1045 -0
  98. package/dist/behaviors/exports/molecules/std-sequencer-game.orb +43 -3
  99. package/dist/behaviors/exports/molecules/std-simulator-game.orb +43 -3
  100. package/dist/behaviors/exports/molecules/std-turn-based-battle.orb +26 -0
  101. package/dist/behaviors/exports/organisms/std-api-gateway.orb +2326 -1320
  102. package/dist/behaviors/exports/organisms/std-arcade-game.orb +377 -265
  103. package/dist/behaviors/exports/organisms/std-booking-system.orb +3144 -1855
  104. package/dist/behaviors/exports/organisms/std-cicd-pipeline.orb +2107 -1122
  105. package/dist/behaviors/exports/organisms/std-cms.orb +929 -822
  106. package/dist/behaviors/exports/organisms/std-coding-academy.orb +1347 -458
  107. package/dist/behaviors/exports/organisms/std-crm.orb +2302 -1282
  108. package/dist/behaviors/exports/organisms/std-devops-dashboard.orb +3902 -2005
  109. package/dist/behaviors/exports/organisms/std-ecommerce.orb +2432 -1630
  110. package/dist/behaviors/exports/organisms/std-finance-tracker.orb +1674 -846
  111. package/dist/behaviors/exports/organisms/std-healthcare.orb +3545 -1992
  112. package/dist/behaviors/exports/organisms/std-helpdesk.orb +1853 -940
  113. package/dist/behaviors/exports/organisms/std-hr-portal.orb +3249 -1939
  114. package/dist/behaviors/exports/organisms/std-iot-dashboard.orb +2422 -1418
  115. package/dist/behaviors/exports/organisms/std-lms.orb +2495 -1435
  116. package/dist/behaviors/exports/organisms/std-logic-training.orb +220 -66
  117. package/dist/behaviors/exports/organisms/std-platformer-app.orb +345 -214
  118. package/dist/behaviors/exports/organisms/std-project-manager.orb +2217 -1190
  119. package/dist/behaviors/exports/organisms/std-puzzle-app.orb +228 -103
  120. package/dist/behaviors/exports/organisms/std-realtime-chat.orb +1887 -1051
  121. package/dist/behaviors/exports/organisms/std-rpg-game.orb +1170 -948
  122. package/dist/behaviors/exports/organisms/std-social-feed.orb +184 -172
  123. package/dist/behaviors/exports/organisms/std-stem-lab.orb +1308 -482
  124. package/dist/behaviors/exports/organisms/std-strategy-game.orb +1520 -696
  125. package/dist/behaviors/exports/organisms/std-trading-dashboard.orb +1884 -904
  126. package/dist/behaviors/exports/validation-report.json +0 -747
  127. package/dist/behaviors/functions/index.d.ts +270 -1
  128. package/dist/behaviors/functions/index.js +3163 -807
  129. package/dist/behaviors/functions/index.js.map +1 -1
  130. package/dist/behaviors/index.d.ts +1 -1
  131. package/dist/behaviors/index.js +3164 -808
  132. package/dist/behaviors/index.js.map +1 -1
  133. package/dist/exports/atoms/std-browse.orb +38 -45
  134. package/dist/exports/atoms/std-calendar.orb +770 -0
  135. package/dist/exports/atoms/std-display.orb +1175 -510
  136. package/dist/exports/atoms/std-drawer.orb +235 -133
  137. package/dist/exports/atoms/std-flip-card.orb +596 -0
  138. package/dist/exports/atoms/std-gallery.orb +382 -0
  139. package/dist/exports/atoms/std-loading.orb +131 -103
  140. package/dist/exports/atoms/std-modal.orb +5 -24
  141. package/dist/exports/atoms/std-notification.orb +71 -0
  142. package/dist/exports/atoms/std-pagination.orb +32 -40
  143. package/dist/exports/atoms/std-rating.orb +328 -0
  144. package/dist/exports/atoms/std-score.orb +41 -0
  145. package/dist/exports/atoms/std-search.orb +44 -30
  146. package/dist/exports/atoms/std-selection.orb +26 -34
  147. package/dist/exports/atoms/std-sort.orb +82 -60
  148. package/dist/exports/atoms/std-text-effects.orb +658 -0
  149. package/dist/exports/atoms/std-theme.orb +573 -0
  150. package/dist/exports/atoms/std-upload.orb +535 -0
  151. package/dist/exports/atoms/std-wizard.orb +664 -224
  152. package/dist/exports/molecules/std-builder-game.orb +43 -3
  153. package/dist/exports/molecules/std-cart.orb +319 -101
  154. package/dist/exports/molecules/std-classifier-game.orb +43 -3
  155. package/dist/exports/molecules/std-debugger-game.orb +43 -3
  156. package/dist/exports/molecules/std-detail.orb +46 -49
  157. package/dist/exports/molecules/std-event-handler-game.orb +43 -3
  158. package/dist/exports/molecules/std-form-advanced.orb +654 -0
  159. package/dist/exports/molecules/std-geospatial.orb +48 -48
  160. package/dist/exports/molecules/std-inventory.orb +70 -50
  161. package/dist/exports/molecules/std-list.orb +174 -197
  162. package/dist/exports/molecules/std-messaging.orb +35 -50
  163. package/dist/exports/molecules/std-negotiator-game.orb +43 -3
  164. package/dist/exports/molecules/std-platformer-game.orb +18 -2
  165. package/dist/exports/molecules/std-puzzle-game.orb +32 -6
  166. package/dist/exports/molecules/std-quiz.orb +1045 -0
  167. package/dist/exports/molecules/std-sequencer-game.orb +43 -3
  168. package/dist/exports/molecules/std-simulator-game.orb +43 -3
  169. package/dist/exports/molecules/std-turn-based-battle.orb +26 -0
  170. package/dist/exports/organisms/std-api-gateway.orb +2326 -1320
  171. package/dist/exports/organisms/std-arcade-game.orb +377 -265
  172. package/dist/exports/organisms/std-booking-system.orb +3144 -1855
  173. package/dist/exports/organisms/std-cicd-pipeline.orb +2107 -1122
  174. package/dist/exports/organisms/std-cms.orb +929 -822
  175. package/dist/exports/organisms/std-coding-academy.orb +1347 -458
  176. package/dist/exports/organisms/std-crm.orb +2302 -1282
  177. package/dist/exports/organisms/std-devops-dashboard.orb +3902 -2005
  178. package/dist/exports/organisms/std-ecommerce.orb +2432 -1630
  179. package/dist/exports/organisms/std-finance-tracker.orb +1674 -846
  180. package/dist/exports/organisms/std-healthcare.orb +3545 -1992
  181. package/dist/exports/organisms/std-helpdesk.orb +1853 -940
  182. package/dist/exports/organisms/std-hr-portal.orb +3249 -1939
  183. package/dist/exports/organisms/std-iot-dashboard.orb +2422 -1418
  184. package/dist/exports/organisms/std-lms.orb +2495 -1435
  185. package/dist/exports/organisms/std-logic-training.orb +220 -66
  186. package/dist/exports/organisms/std-platformer-app.orb +345 -214
  187. package/dist/exports/organisms/std-project-manager.orb +2217 -1190
  188. package/dist/exports/organisms/std-puzzle-app.orb +228 -103
  189. package/dist/exports/organisms/std-realtime-chat.orb +1887 -1051
  190. package/dist/exports/organisms/std-rpg-game.orb +1170 -948
  191. package/dist/exports/organisms/std-social-feed.orb +184 -172
  192. package/dist/exports/organisms/std-stem-lab.orb +1308 -482
  193. package/dist/exports/organisms/std-strategy-game.orb +1520 -696
  194. package/dist/exports/organisms/std-trading-dashboard.orb +1884 -904
  195. package/dist/exports/validation-report.json +0 -747
  196. package/dist/index.d.ts +1 -1
  197. package/dist/index.js +3166 -810
  198. package/dist/index.js.map +1 -1
  199. package/package.json +1 -1
@@ -83,145 +83,301 @@
83
83
  "render-ui",
84
84
  "main",
85
85
  {
86
- "type": "stack",
87
- "direction": "vertical",
88
- "gap": "lg",
89
- "children": [
86
+ "type": "dashboard-layout",
87
+ "appName": "IoT Dashboard",
88
+ "navItems": [
90
89
  {
91
- "type": "stack",
92
- "direction": "horizontal",
93
- "gap": "md",
94
- "justify": "space-between",
95
- "children": [
96
- {
97
- "type": "stack",
98
- "direction": "horizontal",
99
- "gap": "md",
100
- "children": [
101
- {
102
- "type": "icon",
103
- "name": "thermometer",
104
- "size": "lg"
105
- },
106
- {
107
- "type": "typography",
108
- "content": "Sensor Readings",
109
- "variant": "h2"
110
- }
111
- ]
112
- },
113
- {
114
- "type": "button",
115
- "label": "Refresh",
116
- "event": "REFRESH",
117
- "variant": "secondary",
118
- "icon": "refresh-cw"
119
- }
120
- ]
90
+ "label": "Sensors",
91
+ "href": "/sensors",
92
+ "icon": "layout-list"
121
93
  },
122
94
  {
123
- "type": "divider"
95
+ "label": "Devices",
96
+ "href": "/devices",
97
+ "icon": "cpu"
124
98
  },
125
99
  {
126
- "type": "simple-grid",
127
- "columns": 3,
100
+ "label": "Alerts",
101
+ "href": "/alerts",
102
+ "icon": "bell"
103
+ }
104
+ ],
105
+ "children": [
106
+ {
107
+ "type": "scaled-diagram",
128
108
  "children": [
129
109
  {
130
- "type": "card",
110
+ "type": "stack",
111
+ "direction": "vertical",
112
+ "gap": "lg",
131
113
  "children": [
132
114
  {
133
- "type": "stack",
134
- "direction": "vertical",
135
- "gap": "sm",
136
- "children": [
115
+ "type": "breadcrumb",
116
+ "items": [
137
117
  {
138
- "type": "typography",
139
- "variant": "caption",
140
- "content": "SensorId"
118
+ "label": "Home",
119
+ "href": "/"
141
120
  },
142
121
  {
143
- "type": "typography",
144
- "variant": "h3",
145
- "content": [
146
- "object/get",
147
- [
148
- "array/first",
149
- "@entity"
150
- ],
151
- "sensorId"
152
- ]
122
+ "label": "Sensor Readings"
153
123
  }
154
124
  ]
155
- }
156
- ]
157
- },
158
- {
159
- "type": "stat-display",
160
- "label": "Value",
161
- "value": [
162
- "object/get",
163
- [
164
- "array/first",
165
- "@entity"
166
- ],
167
- "value"
168
- ]
169
- },
170
- {
171
- "type": "card",
172
- "children": [
125
+ },
173
126
  {
174
127
  "type": "stack",
175
- "direction": "vertical",
176
- "gap": "sm",
128
+ "direction": "horizontal",
129
+ "gap": "md",
130
+ "justify": "space-between",
177
131
  "children": [
178
132
  {
179
- "type": "typography",
180
- "variant": "caption",
181
- "content": "Unit"
133
+ "type": "stack",
134
+ "direction": "horizontal",
135
+ "gap": "md",
136
+ "children": [
137
+ {
138
+ "type": "icon",
139
+ "name": "thermometer",
140
+ "size": "lg"
141
+ },
142
+ {
143
+ "type": "typography",
144
+ "content": "Sensor Readings",
145
+ "variant": "h2"
146
+ }
147
+ ]
182
148
  },
183
149
  {
184
- "type": "typography",
185
- "variant": "h3",
186
- "content": [
187
- "object/get",
188
- [
189
- "array/first",
190
- "@entity"
191
- ],
192
- "unit"
150
+ "type": "button",
151
+ "label": "Refresh",
152
+ "event": "REFRESH",
153
+ "variant": "secondary",
154
+ "icon": "refresh-cw"
155
+ }
156
+ ]
157
+ },
158
+ {
159
+ "type": "divider"
160
+ },
161
+ {
162
+ "type": "box",
163
+ "padding": "md",
164
+ "children": [
165
+ {
166
+ "type": "simple-grid",
167
+ "columns": 3,
168
+ "children": [
169
+ {
170
+ "type": "card",
171
+ "children": [
172
+ {
173
+ "type": "stack",
174
+ "direction": "vertical",
175
+ "gap": "sm",
176
+ "children": [
177
+ {
178
+ "type": "typography",
179
+ "variant": "caption",
180
+ "content": "SensorId"
181
+ },
182
+ {
183
+ "type": "typography",
184
+ "variant": "h3",
185
+ "content": [
186
+ "object/get",
187
+ [
188
+ "array/first",
189
+ "@entity"
190
+ ],
191
+ "sensorId"
192
+ ]
193
+ }
194
+ ]
195
+ }
196
+ ]
197
+ },
198
+ {
199
+ "type": "stat-display",
200
+ "label": "Value",
201
+ "value": [
202
+ "object/get",
203
+ [
204
+ "array/first",
205
+ "@entity"
206
+ ],
207
+ "value"
208
+ ]
209
+ },
210
+ {
211
+ "type": "card",
212
+ "children": [
213
+ {
214
+ "type": "stack",
215
+ "direction": "vertical",
216
+ "gap": "sm",
217
+ "children": [
218
+ {
219
+ "type": "typography",
220
+ "variant": "caption",
221
+ "content": "Unit"
222
+ },
223
+ {
224
+ "type": "typography",
225
+ "variant": "h3",
226
+ "content": [
227
+ "object/get",
228
+ [
229
+ "array/first",
230
+ "@entity"
231
+ ],
232
+ "unit"
233
+ ]
234
+ }
235
+ ]
236
+ }
237
+ ]
238
+ },
239
+ {
240
+ "type": "card",
241
+ "children": [
242
+ {
243
+ "type": "stack",
244
+ "direction": "vertical",
245
+ "gap": "sm",
246
+ "children": [
247
+ {
248
+ "type": "typography",
249
+ "variant": "caption",
250
+ "content": "Timestamp"
251
+ },
252
+ {
253
+ "type": "typography",
254
+ "variant": "h3",
255
+ "content": [
256
+ "object/get",
257
+ [
258
+ "array/first",
259
+ "@entity"
260
+ ],
261
+ "timestamp"
262
+ ]
263
+ }
264
+ ]
265
+ }
266
+ ]
267
+ }
193
268
  ]
194
269
  }
195
270
  ]
196
- }
197
- ]
198
- },
199
- {
200
- "type": "card",
201
- "children": [
271
+ },
202
272
  {
203
- "type": "stack",
204
- "direction": "vertical",
205
- "gap": "sm",
273
+ "type": "divider"
274
+ },
275
+ {
276
+ "type": "grid",
277
+ "columns": 2,
278
+ "gap": "md",
206
279
  "children": [
207
280
  {
208
- "type": "typography",
209
- "variant": "caption",
210
- "content": "Timestamp"
281
+ "type": "card",
282
+ "children": [
283
+ {
284
+ "type": "typography",
285
+ "variant": "caption",
286
+ "content": "Chart View"
287
+ }
288
+ ]
211
289
  },
212
290
  {
213
- "type": "typography",
214
- "variant": "h3",
215
- "content": [
216
- "object/get",
217
- [
218
- "array/first",
219
- "@entity"
220
- ],
221
- "timestamp"
291
+ "type": "card",
292
+ "children": [
293
+ {
294
+ "type": "typography",
295
+ "variant": "caption",
296
+ "content": "Graph View"
297
+ }
222
298
  ]
223
299
  }
224
300
  ]
301
+ },
302
+ {
303
+ "type": "line-chart",
304
+ "data": [
305
+ {
306
+ "date": "Jan",
307
+ "value": 12
308
+ },
309
+ {
310
+ "date": "Feb",
311
+ "value": 19
312
+ },
313
+ {
314
+ "date": "Mar",
315
+ "value": 15
316
+ },
317
+ {
318
+ "date": "Apr",
319
+ "value": 25
320
+ },
321
+ {
322
+ "date": "May",
323
+ "value": 22
324
+ },
325
+ {
326
+ "date": "Jun",
327
+ "value": 30
328
+ }
329
+ ],
330
+ "xKey": "date",
331
+ "yKey": "value",
332
+ "title": "Trend"
333
+ },
334
+ {
335
+ "type": "chart-legend",
336
+ "items": [
337
+ {
338
+ "label": "Current",
339
+ "color": "primary"
340
+ },
341
+ {
342
+ "label": "Previous",
343
+ "color": "muted"
344
+ }
345
+ ]
346
+ },
347
+ {
348
+ "type": "graph-view",
349
+ "nodes": [
350
+ {
351
+ "id": "a",
352
+ "label": "Start",
353
+ "x": 50,
354
+ "y": 100
355
+ },
356
+ {
357
+ "id": "b",
358
+ "label": "Process",
359
+ "x": 200,
360
+ "y": 50
361
+ },
362
+ {
363
+ "id": "c",
364
+ "label": "End",
365
+ "x": 350,
366
+ "y": 100
367
+ }
368
+ ],
369
+ "edges": [
370
+ {
371
+ "from": "a",
372
+ "to": "b"
373
+ },
374
+ {
375
+ "from": "b",
376
+ "to": "c"
377
+ }
378
+ ],
379
+ "width": 400,
380
+ "height": 200
225
381
  }
226
382
  ]
227
383
  }
@@ -245,145 +401,301 @@
245
401
  "render-ui",
246
402
  "main",
247
403
  {
248
- "type": "stack",
249
- "direction": "vertical",
250
- "gap": "lg",
251
- "children": [
404
+ "type": "dashboard-layout",
405
+ "appName": "IoT Dashboard",
406
+ "navItems": [
252
407
  {
253
- "type": "stack",
254
- "direction": "horizontal",
255
- "gap": "md",
256
- "justify": "space-between",
257
- "children": [
258
- {
259
- "type": "stack",
260
- "direction": "horizontal",
261
- "gap": "md",
262
- "children": [
263
- {
264
- "type": "icon",
265
- "name": "thermometer",
266
- "size": "lg"
267
- },
268
- {
269
- "type": "typography",
270
- "content": "Sensor Readings",
271
- "variant": "h2"
272
- }
273
- ]
274
- },
275
- {
276
- "type": "button",
277
- "label": "Refresh",
278
- "event": "REFRESH",
279
- "variant": "secondary",
280
- "icon": "refresh-cw"
281
- }
282
- ]
408
+ "label": "Sensors",
409
+ "href": "/sensors",
410
+ "icon": "layout-list"
283
411
  },
284
412
  {
285
- "type": "divider"
413
+ "label": "Devices",
414
+ "href": "/devices",
415
+ "icon": "cpu"
286
416
  },
287
417
  {
288
- "type": "simple-grid",
289
- "columns": 3,
418
+ "label": "Alerts",
419
+ "href": "/alerts",
420
+ "icon": "bell"
421
+ }
422
+ ],
423
+ "children": [
424
+ {
425
+ "type": "scaled-diagram",
290
426
  "children": [
291
427
  {
292
- "type": "card",
428
+ "type": "stack",
429
+ "direction": "vertical",
430
+ "gap": "lg",
293
431
  "children": [
294
432
  {
295
- "type": "stack",
296
- "direction": "vertical",
297
- "gap": "sm",
298
- "children": [
433
+ "type": "breadcrumb",
434
+ "items": [
299
435
  {
300
- "type": "typography",
301
- "variant": "caption",
302
- "content": "SensorId"
436
+ "label": "Home",
437
+ "href": "/"
303
438
  },
304
439
  {
305
- "type": "typography",
306
- "variant": "h3",
307
- "content": [
308
- "object/get",
309
- [
310
- "array/first",
311
- "@entity"
312
- ],
313
- "sensorId"
314
- ]
440
+ "label": "Sensor Readings"
315
441
  }
316
442
  ]
317
- }
318
- ]
319
- },
320
- {
321
- "type": "stat-display",
322
- "label": "Value",
323
- "value": [
324
- "object/get",
325
- [
326
- "array/first",
327
- "@entity"
328
- ],
329
- "value"
330
- ]
331
- },
332
- {
333
- "type": "card",
334
- "children": [
443
+ },
335
444
  {
336
445
  "type": "stack",
337
- "direction": "vertical",
338
- "gap": "sm",
446
+ "direction": "horizontal",
447
+ "gap": "md",
448
+ "justify": "space-between",
339
449
  "children": [
340
450
  {
341
- "type": "typography",
342
- "variant": "caption",
343
- "content": "Unit"
451
+ "type": "stack",
452
+ "direction": "horizontal",
453
+ "gap": "md",
454
+ "children": [
455
+ {
456
+ "type": "icon",
457
+ "name": "thermometer",
458
+ "size": "lg"
459
+ },
460
+ {
461
+ "type": "typography",
462
+ "content": "Sensor Readings",
463
+ "variant": "h2"
464
+ }
465
+ ]
344
466
  },
345
467
  {
346
- "type": "typography",
347
- "variant": "h3",
348
- "content": [
349
- "object/get",
350
- [
351
- "array/first",
352
- "@entity"
353
- ],
354
- "unit"
468
+ "type": "button",
469
+ "label": "Refresh",
470
+ "event": "REFRESH",
471
+ "variant": "secondary",
472
+ "icon": "refresh-cw"
473
+ }
474
+ ]
475
+ },
476
+ {
477
+ "type": "divider"
478
+ },
479
+ {
480
+ "type": "box",
481
+ "padding": "md",
482
+ "children": [
483
+ {
484
+ "type": "simple-grid",
485
+ "columns": 3,
486
+ "children": [
487
+ {
488
+ "type": "card",
489
+ "children": [
490
+ {
491
+ "type": "stack",
492
+ "direction": "vertical",
493
+ "gap": "sm",
494
+ "children": [
495
+ {
496
+ "type": "typography",
497
+ "variant": "caption",
498
+ "content": "SensorId"
499
+ },
500
+ {
501
+ "type": "typography",
502
+ "variant": "h3",
503
+ "content": [
504
+ "object/get",
505
+ [
506
+ "array/first",
507
+ "@entity"
508
+ ],
509
+ "sensorId"
510
+ ]
511
+ }
512
+ ]
513
+ }
514
+ ]
515
+ },
516
+ {
517
+ "type": "stat-display",
518
+ "label": "Value",
519
+ "value": [
520
+ "object/get",
521
+ [
522
+ "array/first",
523
+ "@entity"
524
+ ],
525
+ "value"
526
+ ]
527
+ },
528
+ {
529
+ "type": "card",
530
+ "children": [
531
+ {
532
+ "type": "stack",
533
+ "direction": "vertical",
534
+ "gap": "sm",
535
+ "children": [
536
+ {
537
+ "type": "typography",
538
+ "variant": "caption",
539
+ "content": "Unit"
540
+ },
541
+ {
542
+ "type": "typography",
543
+ "variant": "h3",
544
+ "content": [
545
+ "object/get",
546
+ [
547
+ "array/first",
548
+ "@entity"
549
+ ],
550
+ "unit"
551
+ ]
552
+ }
553
+ ]
554
+ }
555
+ ]
556
+ },
557
+ {
558
+ "type": "card",
559
+ "children": [
560
+ {
561
+ "type": "stack",
562
+ "direction": "vertical",
563
+ "gap": "sm",
564
+ "children": [
565
+ {
566
+ "type": "typography",
567
+ "variant": "caption",
568
+ "content": "Timestamp"
569
+ },
570
+ {
571
+ "type": "typography",
572
+ "variant": "h3",
573
+ "content": [
574
+ "object/get",
575
+ [
576
+ "array/first",
577
+ "@entity"
578
+ ],
579
+ "timestamp"
580
+ ]
581
+ }
582
+ ]
583
+ }
584
+ ]
585
+ }
355
586
  ]
356
587
  }
357
588
  ]
358
- }
359
- ]
360
- },
361
- {
362
- "type": "card",
363
- "children": [
589
+ },
364
590
  {
365
- "type": "stack",
366
- "direction": "vertical",
367
- "gap": "sm",
591
+ "type": "divider"
592
+ },
593
+ {
594
+ "type": "grid",
595
+ "columns": 2,
596
+ "gap": "md",
368
597
  "children": [
369
598
  {
370
- "type": "typography",
371
- "variant": "caption",
372
- "content": "Timestamp"
599
+ "type": "card",
600
+ "children": [
601
+ {
602
+ "type": "typography",
603
+ "variant": "caption",
604
+ "content": "Chart View"
605
+ }
606
+ ]
373
607
  },
374
608
  {
375
- "type": "typography",
376
- "variant": "h3",
377
- "content": [
378
- "object/get",
379
- [
380
- "array/first",
381
- "@entity"
382
- ],
383
- "timestamp"
609
+ "type": "card",
610
+ "children": [
611
+ {
612
+ "type": "typography",
613
+ "variant": "caption",
614
+ "content": "Graph View"
615
+ }
384
616
  ]
385
617
  }
386
618
  ]
619
+ },
620
+ {
621
+ "type": "line-chart",
622
+ "data": [
623
+ {
624
+ "date": "Jan",
625
+ "value": 12
626
+ },
627
+ {
628
+ "date": "Feb",
629
+ "value": 19
630
+ },
631
+ {
632
+ "date": "Mar",
633
+ "value": 15
634
+ },
635
+ {
636
+ "date": "Apr",
637
+ "value": 25
638
+ },
639
+ {
640
+ "date": "May",
641
+ "value": 22
642
+ },
643
+ {
644
+ "date": "Jun",
645
+ "value": 30
646
+ }
647
+ ],
648
+ "xKey": "date",
649
+ "yKey": "value",
650
+ "title": "Trend"
651
+ },
652
+ {
653
+ "type": "chart-legend",
654
+ "items": [
655
+ {
656
+ "label": "Current",
657
+ "color": "primary"
658
+ },
659
+ {
660
+ "label": "Previous",
661
+ "color": "muted"
662
+ }
663
+ ]
664
+ },
665
+ {
666
+ "type": "graph-view",
667
+ "nodes": [
668
+ {
669
+ "id": "a",
670
+ "label": "Start",
671
+ "x": 50,
672
+ "y": 100
673
+ },
674
+ {
675
+ "id": "b",
676
+ "label": "Process",
677
+ "x": 200,
678
+ "y": 50
679
+ },
680
+ {
681
+ "id": "c",
682
+ "label": "End",
683
+ "x": 350,
684
+ "y": 100
685
+ }
686
+ ],
687
+ "edges": [
688
+ {
689
+ "from": "a",
690
+ "to": "b"
691
+ },
692
+ {
693
+ "from": "b",
694
+ "to": "c"
695
+ }
696
+ ],
697
+ "width": 400,
698
+ "height": 200
387
699
  }
388
700
  ]
389
701
  }
@@ -407,145 +719,301 @@
407
719
  "render-ui",
408
720
  "main",
409
721
  {
410
- "type": "stack",
411
- "direction": "vertical",
412
- "gap": "lg",
413
- "children": [
722
+ "type": "dashboard-layout",
723
+ "appName": "IoT Dashboard",
724
+ "navItems": [
414
725
  {
415
- "type": "stack",
416
- "direction": "horizontal",
417
- "gap": "md",
418
- "justify": "space-between",
419
- "children": [
420
- {
421
- "type": "stack",
422
- "direction": "horizontal",
423
- "gap": "md",
424
- "children": [
425
- {
426
- "type": "icon",
427
- "name": "thermometer",
428
- "size": "lg"
429
- },
430
- {
431
- "type": "typography",
432
- "content": "Sensor Readings",
433
- "variant": "h2"
434
- }
435
- ]
436
- },
437
- {
438
- "type": "button",
439
- "label": "Refresh",
440
- "event": "REFRESH",
441
- "variant": "secondary",
442
- "icon": "refresh-cw"
443
- }
444
- ]
726
+ "label": "Sensors",
727
+ "href": "/sensors",
728
+ "icon": "layout-list"
445
729
  },
446
730
  {
447
- "type": "divider"
731
+ "label": "Devices",
732
+ "href": "/devices",
733
+ "icon": "cpu"
448
734
  },
449
735
  {
450
- "type": "simple-grid",
451
- "columns": 3,
736
+ "label": "Alerts",
737
+ "href": "/alerts",
738
+ "icon": "bell"
739
+ }
740
+ ],
741
+ "children": [
742
+ {
743
+ "type": "scaled-diagram",
452
744
  "children": [
453
745
  {
454
- "type": "card",
746
+ "type": "stack",
747
+ "direction": "vertical",
748
+ "gap": "lg",
455
749
  "children": [
456
750
  {
457
- "type": "stack",
458
- "direction": "vertical",
459
- "gap": "sm",
460
- "children": [
751
+ "type": "breadcrumb",
752
+ "items": [
461
753
  {
462
- "type": "typography",
463
- "variant": "caption",
464
- "content": "SensorId"
754
+ "label": "Home",
755
+ "href": "/"
465
756
  },
466
757
  {
467
- "type": "typography",
468
- "variant": "h3",
469
- "content": [
470
- "object/get",
471
- [
472
- "array/first",
473
- "@entity"
474
- ],
475
- "sensorId"
476
- ]
758
+ "label": "Sensor Readings"
477
759
  }
478
760
  ]
479
- }
480
- ]
481
- },
482
- {
483
- "type": "stat-display",
484
- "label": "Value",
485
- "value": [
486
- "object/get",
487
- [
488
- "array/first",
489
- "@entity"
490
- ],
491
- "value"
492
- ]
493
- },
494
- {
495
- "type": "card",
496
- "children": [
761
+ },
497
762
  {
498
763
  "type": "stack",
499
- "direction": "vertical",
500
- "gap": "sm",
764
+ "direction": "horizontal",
765
+ "gap": "md",
766
+ "justify": "space-between",
501
767
  "children": [
502
768
  {
503
- "type": "typography",
504
- "variant": "caption",
505
- "content": "Unit"
769
+ "type": "stack",
770
+ "direction": "horizontal",
771
+ "gap": "md",
772
+ "children": [
773
+ {
774
+ "type": "icon",
775
+ "name": "thermometer",
776
+ "size": "lg"
777
+ },
778
+ {
779
+ "type": "typography",
780
+ "content": "Sensor Readings",
781
+ "variant": "h2"
782
+ }
783
+ ]
506
784
  },
507
785
  {
508
- "type": "typography",
509
- "variant": "h3",
510
- "content": [
511
- "object/get",
512
- [
513
- "array/first",
514
- "@entity"
515
- ],
516
- "unit"
786
+ "type": "button",
787
+ "label": "Refresh",
788
+ "event": "REFRESH",
789
+ "variant": "secondary",
790
+ "icon": "refresh-cw"
791
+ }
792
+ ]
793
+ },
794
+ {
795
+ "type": "divider"
796
+ },
797
+ {
798
+ "type": "box",
799
+ "padding": "md",
800
+ "children": [
801
+ {
802
+ "type": "simple-grid",
803
+ "columns": 3,
804
+ "children": [
805
+ {
806
+ "type": "card",
807
+ "children": [
808
+ {
809
+ "type": "stack",
810
+ "direction": "vertical",
811
+ "gap": "sm",
812
+ "children": [
813
+ {
814
+ "type": "typography",
815
+ "variant": "caption",
816
+ "content": "SensorId"
817
+ },
818
+ {
819
+ "type": "typography",
820
+ "variant": "h3",
821
+ "content": [
822
+ "object/get",
823
+ [
824
+ "array/first",
825
+ "@entity"
826
+ ],
827
+ "sensorId"
828
+ ]
829
+ }
830
+ ]
831
+ }
832
+ ]
833
+ },
834
+ {
835
+ "type": "stat-display",
836
+ "label": "Value",
837
+ "value": [
838
+ "object/get",
839
+ [
840
+ "array/first",
841
+ "@entity"
842
+ ],
843
+ "value"
844
+ ]
845
+ },
846
+ {
847
+ "type": "card",
848
+ "children": [
849
+ {
850
+ "type": "stack",
851
+ "direction": "vertical",
852
+ "gap": "sm",
853
+ "children": [
854
+ {
855
+ "type": "typography",
856
+ "variant": "caption",
857
+ "content": "Unit"
858
+ },
859
+ {
860
+ "type": "typography",
861
+ "variant": "h3",
862
+ "content": [
863
+ "object/get",
864
+ [
865
+ "array/first",
866
+ "@entity"
867
+ ],
868
+ "unit"
869
+ ]
870
+ }
871
+ ]
872
+ }
873
+ ]
874
+ },
875
+ {
876
+ "type": "card",
877
+ "children": [
878
+ {
879
+ "type": "stack",
880
+ "direction": "vertical",
881
+ "gap": "sm",
882
+ "children": [
883
+ {
884
+ "type": "typography",
885
+ "variant": "caption",
886
+ "content": "Timestamp"
887
+ },
888
+ {
889
+ "type": "typography",
890
+ "variant": "h3",
891
+ "content": [
892
+ "object/get",
893
+ [
894
+ "array/first",
895
+ "@entity"
896
+ ],
897
+ "timestamp"
898
+ ]
899
+ }
900
+ ]
901
+ }
902
+ ]
903
+ }
517
904
  ]
518
905
  }
519
906
  ]
520
- }
521
- ]
522
- },
523
- {
524
- "type": "card",
525
- "children": [
907
+ },
526
908
  {
527
- "type": "stack",
528
- "direction": "vertical",
529
- "gap": "sm",
909
+ "type": "divider"
910
+ },
911
+ {
912
+ "type": "grid",
913
+ "columns": 2,
914
+ "gap": "md",
530
915
  "children": [
531
916
  {
532
- "type": "typography",
533
- "variant": "caption",
534
- "content": "Timestamp"
917
+ "type": "card",
918
+ "children": [
919
+ {
920
+ "type": "typography",
921
+ "variant": "caption",
922
+ "content": "Chart View"
923
+ }
924
+ ]
535
925
  },
536
926
  {
537
- "type": "typography",
538
- "variant": "h3",
539
- "content": [
540
- "object/get",
541
- [
542
- "array/first",
543
- "@entity"
544
- ],
545
- "timestamp"
927
+ "type": "card",
928
+ "children": [
929
+ {
930
+ "type": "typography",
931
+ "variant": "caption",
932
+ "content": "Graph View"
933
+ }
546
934
  ]
547
935
  }
548
936
  ]
937
+ },
938
+ {
939
+ "type": "line-chart",
940
+ "data": [
941
+ {
942
+ "date": "Jan",
943
+ "value": 12
944
+ },
945
+ {
946
+ "date": "Feb",
947
+ "value": 19
948
+ },
949
+ {
950
+ "date": "Mar",
951
+ "value": 15
952
+ },
953
+ {
954
+ "date": "Apr",
955
+ "value": 25
956
+ },
957
+ {
958
+ "date": "May",
959
+ "value": 22
960
+ },
961
+ {
962
+ "date": "Jun",
963
+ "value": 30
964
+ }
965
+ ],
966
+ "xKey": "date",
967
+ "yKey": "value",
968
+ "title": "Trend"
969
+ },
970
+ {
971
+ "type": "chart-legend",
972
+ "items": [
973
+ {
974
+ "label": "Current",
975
+ "color": "primary"
976
+ },
977
+ {
978
+ "label": "Previous",
979
+ "color": "muted"
980
+ }
981
+ ]
982
+ },
983
+ {
984
+ "type": "graph-view",
985
+ "nodes": [
986
+ {
987
+ "id": "a",
988
+ "label": "Start",
989
+ "x": 50,
990
+ "y": 100
991
+ },
992
+ {
993
+ "id": "b",
994
+ "label": "Process",
995
+ "x": 200,
996
+ "y": 50
997
+ },
998
+ {
999
+ "id": "c",
1000
+ "label": "End",
1001
+ "x": 350,
1002
+ "y": 100
1003
+ }
1004
+ ],
1005
+ "edges": [
1006
+ {
1007
+ "from": "a",
1008
+ "to": "b"
1009
+ },
1010
+ {
1011
+ "from": "b",
1012
+ "to": "c"
1013
+ }
1014
+ ],
1015
+ "width": 400,
1016
+ "height": 200
549
1017
  }
550
1018
  ]
551
1019
  }
@@ -569,145 +1037,301 @@
569
1037
  "render-ui",
570
1038
  "main",
571
1039
  {
572
- "type": "stack",
573
- "direction": "vertical",
574
- "gap": "lg",
1040
+ "type": "dashboard-layout",
1041
+ "appName": "IoT Dashboard",
1042
+ "navItems": [
1043
+ {
1044
+ "label": "Sensors",
1045
+ "href": "/sensors",
1046
+ "icon": "layout-list"
1047
+ },
1048
+ {
1049
+ "label": "Devices",
1050
+ "href": "/devices",
1051
+ "icon": "cpu"
1052
+ },
1053
+ {
1054
+ "label": "Alerts",
1055
+ "href": "/alerts",
1056
+ "icon": "bell"
1057
+ }
1058
+ ],
575
1059
  "children": [
576
1060
  {
577
- "type": "stack",
578
- "direction": "horizontal",
579
- "gap": "md",
580
- "justify": "space-between",
1061
+ "type": "scaled-diagram",
581
1062
  "children": [
582
1063
  {
583
1064
  "type": "stack",
584
- "direction": "horizontal",
585
- "gap": "md",
1065
+ "direction": "vertical",
1066
+ "gap": "lg",
586
1067
  "children": [
587
1068
  {
588
- "type": "icon",
589
- "name": "thermometer",
590
- "size": "lg"
1069
+ "type": "breadcrumb",
1070
+ "items": [
1071
+ {
1072
+ "label": "Home",
1073
+ "href": "/"
1074
+ },
1075
+ {
1076
+ "label": "Sensor Readings"
1077
+ }
1078
+ ]
591
1079
  },
592
1080
  {
593
- "type": "typography",
594
- "content": "Sensor Readings",
595
- "variant": "h2"
596
- }
597
- ]
598
- },
599
- {
600
- "type": "button",
601
- "label": "Refresh",
602
- "event": "REFRESH",
603
- "variant": "secondary",
604
- "icon": "refresh-cw"
605
- }
606
- ]
607
- },
608
- {
609
- "type": "divider"
610
- },
611
- {
612
- "type": "simple-grid",
613
- "columns": 3,
614
- "children": [
615
- {
616
- "type": "card",
617
- "children": [
1081
+ "type": "stack",
1082
+ "direction": "horizontal",
1083
+ "gap": "md",
1084
+ "justify": "space-between",
1085
+ "children": [
1086
+ {
1087
+ "type": "stack",
1088
+ "direction": "horizontal",
1089
+ "gap": "md",
1090
+ "children": [
1091
+ {
1092
+ "type": "icon",
1093
+ "name": "thermometer",
1094
+ "size": "lg"
1095
+ },
1096
+ {
1097
+ "type": "typography",
1098
+ "content": "Sensor Readings",
1099
+ "variant": "h2"
1100
+ }
1101
+ ]
1102
+ },
1103
+ {
1104
+ "type": "button",
1105
+ "label": "Refresh",
1106
+ "event": "REFRESH",
1107
+ "variant": "secondary",
1108
+ "icon": "refresh-cw"
1109
+ }
1110
+ ]
1111
+ },
1112
+ {
1113
+ "type": "divider"
1114
+ },
1115
+ {
1116
+ "type": "box",
1117
+ "padding": "md",
1118
+ "children": [
1119
+ {
1120
+ "type": "simple-grid",
1121
+ "columns": 3,
1122
+ "children": [
1123
+ {
1124
+ "type": "card",
1125
+ "children": [
1126
+ {
1127
+ "type": "stack",
1128
+ "direction": "vertical",
1129
+ "gap": "sm",
1130
+ "children": [
1131
+ {
1132
+ "type": "typography",
1133
+ "variant": "caption",
1134
+ "content": "SensorId"
1135
+ },
1136
+ {
1137
+ "type": "typography",
1138
+ "variant": "h3",
1139
+ "content": [
1140
+ "object/get",
1141
+ [
1142
+ "array/first",
1143
+ "@entity"
1144
+ ],
1145
+ "sensorId"
1146
+ ]
1147
+ }
1148
+ ]
1149
+ }
1150
+ ]
1151
+ },
1152
+ {
1153
+ "type": "stat-display",
1154
+ "label": "Value",
1155
+ "value": [
1156
+ "object/get",
1157
+ [
1158
+ "array/first",
1159
+ "@entity"
1160
+ ],
1161
+ "value"
1162
+ ]
1163
+ },
1164
+ {
1165
+ "type": "card",
1166
+ "children": [
1167
+ {
1168
+ "type": "stack",
1169
+ "direction": "vertical",
1170
+ "gap": "sm",
1171
+ "children": [
1172
+ {
1173
+ "type": "typography",
1174
+ "variant": "caption",
1175
+ "content": "Unit"
1176
+ },
1177
+ {
1178
+ "type": "typography",
1179
+ "variant": "h3",
1180
+ "content": [
1181
+ "object/get",
1182
+ [
1183
+ "array/first",
1184
+ "@entity"
1185
+ ],
1186
+ "unit"
1187
+ ]
1188
+ }
1189
+ ]
1190
+ }
1191
+ ]
1192
+ },
1193
+ {
1194
+ "type": "card",
1195
+ "children": [
1196
+ {
1197
+ "type": "stack",
1198
+ "direction": "vertical",
1199
+ "gap": "sm",
1200
+ "children": [
1201
+ {
1202
+ "type": "typography",
1203
+ "variant": "caption",
1204
+ "content": "Timestamp"
1205
+ },
1206
+ {
1207
+ "type": "typography",
1208
+ "variant": "h3",
1209
+ "content": [
1210
+ "object/get",
1211
+ [
1212
+ "array/first",
1213
+ "@entity"
1214
+ ],
1215
+ "timestamp"
1216
+ ]
1217
+ }
1218
+ ]
1219
+ }
1220
+ ]
1221
+ }
1222
+ ]
1223
+ }
1224
+ ]
1225
+ },
618
1226
  {
619
- "type": "stack",
620
- "direction": "vertical",
621
- "gap": "sm",
1227
+ "type": "divider"
1228
+ },
1229
+ {
1230
+ "type": "grid",
1231
+ "columns": 2,
1232
+ "gap": "md",
622
1233
  "children": [
623
1234
  {
624
- "type": "typography",
625
- "variant": "caption",
626
- "content": "SensorId"
1235
+ "type": "card",
1236
+ "children": [
1237
+ {
1238
+ "type": "typography",
1239
+ "variant": "caption",
1240
+ "content": "Chart View"
1241
+ }
1242
+ ]
627
1243
  },
628
1244
  {
629
- "type": "typography",
630
- "variant": "h3",
631
- "content": [
632
- "object/get",
633
- [
634
- "array/first",
635
- "@entity"
636
- ],
637
- "sensorId"
1245
+ "type": "card",
1246
+ "children": [
1247
+ {
1248
+ "type": "typography",
1249
+ "variant": "caption",
1250
+ "content": "Graph View"
1251
+ }
638
1252
  ]
639
1253
  }
640
1254
  ]
641
- }
642
- ]
643
- },
644
- {
645
- "type": "stat-display",
646
- "label": "Value",
647
- "value": [
648
- "object/get",
649
- [
650
- "array/first",
651
- "@entity"
652
- ],
653
- "value"
654
- ]
655
- },
656
- {
657
- "type": "card",
658
- "children": [
1255
+ },
659
1256
  {
660
- "type": "stack",
661
- "direction": "vertical",
662
- "gap": "sm",
663
- "children": [
1257
+ "type": "line-chart",
1258
+ "data": [
664
1259
  {
665
- "type": "typography",
666
- "variant": "caption",
667
- "content": "Unit"
1260
+ "date": "Jan",
1261
+ "value": 12
668
1262
  },
669
1263
  {
670
- "type": "typography",
671
- "variant": "h3",
672
- "content": [
673
- "object/get",
674
- [
675
- "array/first",
676
- "@entity"
677
- ],
678
- "unit"
679
- ]
1264
+ "date": "Feb",
1265
+ "value": 19
1266
+ },
1267
+ {
1268
+ "date": "Mar",
1269
+ "value": 15
1270
+ },
1271
+ {
1272
+ "date": "Apr",
1273
+ "value": 25
1274
+ },
1275
+ {
1276
+ "date": "May",
1277
+ "value": 22
1278
+ },
1279
+ {
1280
+ "date": "Jun",
1281
+ "value": 30
680
1282
  }
681
- ]
682
- }
683
- ]
684
- },
685
- {
686
- "type": "card",
687
- "children": [
1283
+ ],
1284
+ "xKey": "date",
1285
+ "yKey": "value",
1286
+ "title": "Trend"
1287
+ },
688
1288
  {
689
- "type": "stack",
690
- "direction": "vertical",
691
- "gap": "sm",
692
- "children": [
1289
+ "type": "chart-legend",
1290
+ "items": [
693
1291
  {
694
- "type": "typography",
695
- "variant": "caption",
696
- "content": "Timestamp"
1292
+ "label": "Current",
1293
+ "color": "primary"
697
1294
  },
698
1295
  {
699
- "type": "typography",
700
- "variant": "h3",
701
- "content": [
702
- "object/get",
703
- [
704
- "array/first",
705
- "@entity"
706
- ],
707
- "timestamp"
708
- ]
1296
+ "label": "Previous",
1297
+ "color": "muted"
709
1298
  }
710
1299
  ]
1300
+ },
1301
+ {
1302
+ "type": "graph-view",
1303
+ "nodes": [
1304
+ {
1305
+ "id": "a",
1306
+ "label": "Start",
1307
+ "x": 50,
1308
+ "y": 100
1309
+ },
1310
+ {
1311
+ "id": "b",
1312
+ "label": "Process",
1313
+ "x": 200,
1314
+ "y": 50
1315
+ },
1316
+ {
1317
+ "id": "c",
1318
+ "label": "End",
1319
+ "x": 350,
1320
+ "y": 100
1321
+ }
1322
+ ],
1323
+ "edges": [
1324
+ {
1325
+ "from": "a",
1326
+ "to": "b"
1327
+ },
1328
+ {
1329
+ "from": "b",
1330
+ "to": "c"
1331
+ }
1332
+ ],
1333
+ "width": 400,
1334
+ "height": 200
711
1335
  }
712
1336
  ]
713
1337
  }
@@ -731,145 +1355,301 @@
731
1355
  "render-ui",
732
1356
  "main",
733
1357
  {
734
- "type": "stack",
735
- "direction": "vertical",
736
- "gap": "lg",
737
- "children": [
1358
+ "type": "dashboard-layout",
1359
+ "appName": "IoT Dashboard",
1360
+ "navItems": [
738
1361
  {
739
- "type": "stack",
740
- "direction": "horizontal",
741
- "gap": "md",
742
- "justify": "space-between",
743
- "children": [
744
- {
745
- "type": "stack",
746
- "direction": "horizontal",
747
- "gap": "md",
748
- "children": [
749
- {
750
- "type": "icon",
751
- "name": "thermometer",
752
- "size": "lg"
753
- },
754
- {
755
- "type": "typography",
756
- "content": "Sensor Readings",
757
- "variant": "h2"
758
- }
759
- ]
760
- },
761
- {
762
- "type": "button",
763
- "label": "Refresh",
764
- "event": "REFRESH",
765
- "variant": "secondary",
766
- "icon": "refresh-cw"
767
- }
768
- ]
1362
+ "label": "Sensors",
1363
+ "href": "/sensors",
1364
+ "icon": "layout-list"
769
1365
  },
770
1366
  {
771
- "type": "divider"
1367
+ "label": "Devices",
1368
+ "href": "/devices",
1369
+ "icon": "cpu"
772
1370
  },
773
1371
  {
774
- "type": "simple-grid",
775
- "columns": 3,
1372
+ "label": "Alerts",
1373
+ "href": "/alerts",
1374
+ "icon": "bell"
1375
+ }
1376
+ ],
1377
+ "children": [
1378
+ {
1379
+ "type": "scaled-diagram",
776
1380
  "children": [
777
1381
  {
778
- "type": "card",
1382
+ "type": "stack",
1383
+ "direction": "vertical",
1384
+ "gap": "lg",
779
1385
  "children": [
780
1386
  {
781
- "type": "stack",
782
- "direction": "vertical",
783
- "gap": "sm",
784
- "children": [
1387
+ "type": "breadcrumb",
1388
+ "items": [
785
1389
  {
786
- "type": "typography",
787
- "variant": "caption",
788
- "content": "SensorId"
1390
+ "label": "Home",
1391
+ "href": "/"
789
1392
  },
790
1393
  {
791
- "type": "typography",
792
- "variant": "h3",
793
- "content": [
794
- "object/get",
795
- [
796
- "array/first",
797
- "@entity"
798
- ],
799
- "sensorId"
800
- ]
1394
+ "label": "Sensor Readings"
801
1395
  }
802
1396
  ]
803
- }
804
- ]
805
- },
806
- {
807
- "type": "stat-display",
808
- "label": "Value",
809
- "value": [
810
- "object/get",
811
- [
812
- "array/first",
813
- "@entity"
814
- ],
815
- "value"
816
- ]
817
- },
818
- {
819
- "type": "card",
820
- "children": [
1397
+ },
821
1398
  {
822
1399
  "type": "stack",
823
- "direction": "vertical",
824
- "gap": "sm",
1400
+ "direction": "horizontal",
1401
+ "gap": "md",
1402
+ "justify": "space-between",
825
1403
  "children": [
826
1404
  {
827
- "type": "typography",
828
- "variant": "caption",
829
- "content": "Unit"
1405
+ "type": "stack",
1406
+ "direction": "horizontal",
1407
+ "gap": "md",
1408
+ "children": [
1409
+ {
1410
+ "type": "icon",
1411
+ "name": "thermometer",
1412
+ "size": "lg"
1413
+ },
1414
+ {
1415
+ "type": "typography",
1416
+ "content": "Sensor Readings",
1417
+ "variant": "h2"
1418
+ }
1419
+ ]
830
1420
  },
831
1421
  {
832
- "type": "typography",
833
- "variant": "h3",
834
- "content": [
835
- "object/get",
836
- [
837
- "array/first",
838
- "@entity"
839
- ],
840
- "unit"
1422
+ "type": "button",
1423
+ "label": "Refresh",
1424
+ "event": "REFRESH",
1425
+ "variant": "secondary",
1426
+ "icon": "refresh-cw"
1427
+ }
1428
+ ]
1429
+ },
1430
+ {
1431
+ "type": "divider"
1432
+ },
1433
+ {
1434
+ "type": "box",
1435
+ "padding": "md",
1436
+ "children": [
1437
+ {
1438
+ "type": "simple-grid",
1439
+ "columns": 3,
1440
+ "children": [
1441
+ {
1442
+ "type": "card",
1443
+ "children": [
1444
+ {
1445
+ "type": "stack",
1446
+ "direction": "vertical",
1447
+ "gap": "sm",
1448
+ "children": [
1449
+ {
1450
+ "type": "typography",
1451
+ "variant": "caption",
1452
+ "content": "SensorId"
1453
+ },
1454
+ {
1455
+ "type": "typography",
1456
+ "variant": "h3",
1457
+ "content": [
1458
+ "object/get",
1459
+ [
1460
+ "array/first",
1461
+ "@entity"
1462
+ ],
1463
+ "sensorId"
1464
+ ]
1465
+ }
1466
+ ]
1467
+ }
1468
+ ]
1469
+ },
1470
+ {
1471
+ "type": "stat-display",
1472
+ "label": "Value",
1473
+ "value": [
1474
+ "object/get",
1475
+ [
1476
+ "array/first",
1477
+ "@entity"
1478
+ ],
1479
+ "value"
1480
+ ]
1481
+ },
1482
+ {
1483
+ "type": "card",
1484
+ "children": [
1485
+ {
1486
+ "type": "stack",
1487
+ "direction": "vertical",
1488
+ "gap": "sm",
1489
+ "children": [
1490
+ {
1491
+ "type": "typography",
1492
+ "variant": "caption",
1493
+ "content": "Unit"
1494
+ },
1495
+ {
1496
+ "type": "typography",
1497
+ "variant": "h3",
1498
+ "content": [
1499
+ "object/get",
1500
+ [
1501
+ "array/first",
1502
+ "@entity"
1503
+ ],
1504
+ "unit"
1505
+ ]
1506
+ }
1507
+ ]
1508
+ }
1509
+ ]
1510
+ },
1511
+ {
1512
+ "type": "card",
1513
+ "children": [
1514
+ {
1515
+ "type": "stack",
1516
+ "direction": "vertical",
1517
+ "gap": "sm",
1518
+ "children": [
1519
+ {
1520
+ "type": "typography",
1521
+ "variant": "caption",
1522
+ "content": "Timestamp"
1523
+ },
1524
+ {
1525
+ "type": "typography",
1526
+ "variant": "h3",
1527
+ "content": [
1528
+ "object/get",
1529
+ [
1530
+ "array/first",
1531
+ "@entity"
1532
+ ],
1533
+ "timestamp"
1534
+ ]
1535
+ }
1536
+ ]
1537
+ }
1538
+ ]
1539
+ }
841
1540
  ]
842
1541
  }
843
1542
  ]
844
- }
845
- ]
846
- },
847
- {
848
- "type": "card",
849
- "children": [
1543
+ },
850
1544
  {
851
- "type": "stack",
852
- "direction": "vertical",
853
- "gap": "sm",
1545
+ "type": "divider"
1546
+ },
1547
+ {
1548
+ "type": "grid",
1549
+ "columns": 2,
1550
+ "gap": "md",
854
1551
  "children": [
855
1552
  {
856
- "type": "typography",
857
- "variant": "caption",
858
- "content": "Timestamp"
1553
+ "type": "card",
1554
+ "children": [
1555
+ {
1556
+ "type": "typography",
1557
+ "variant": "caption",
1558
+ "content": "Chart View"
1559
+ }
1560
+ ]
859
1561
  },
860
1562
  {
861
- "type": "typography",
862
- "variant": "h3",
863
- "content": [
864
- "object/get",
865
- [
866
- "array/first",
867
- "@entity"
868
- ],
869
- "timestamp"
1563
+ "type": "card",
1564
+ "children": [
1565
+ {
1566
+ "type": "typography",
1567
+ "variant": "caption",
1568
+ "content": "Graph View"
1569
+ }
870
1570
  ]
871
1571
  }
872
1572
  ]
1573
+ },
1574
+ {
1575
+ "type": "line-chart",
1576
+ "data": [
1577
+ {
1578
+ "date": "Jan",
1579
+ "value": 12
1580
+ },
1581
+ {
1582
+ "date": "Feb",
1583
+ "value": 19
1584
+ },
1585
+ {
1586
+ "date": "Mar",
1587
+ "value": 15
1588
+ },
1589
+ {
1590
+ "date": "Apr",
1591
+ "value": 25
1592
+ },
1593
+ {
1594
+ "date": "May",
1595
+ "value": 22
1596
+ },
1597
+ {
1598
+ "date": "Jun",
1599
+ "value": 30
1600
+ }
1601
+ ],
1602
+ "xKey": "date",
1603
+ "yKey": "value",
1604
+ "title": "Trend"
1605
+ },
1606
+ {
1607
+ "type": "chart-legend",
1608
+ "items": [
1609
+ {
1610
+ "label": "Current",
1611
+ "color": "primary"
1612
+ },
1613
+ {
1614
+ "label": "Previous",
1615
+ "color": "muted"
1616
+ }
1617
+ ]
1618
+ },
1619
+ {
1620
+ "type": "graph-view",
1621
+ "nodes": [
1622
+ {
1623
+ "id": "a",
1624
+ "label": "Start",
1625
+ "x": 50,
1626
+ "y": 100
1627
+ },
1628
+ {
1629
+ "id": "b",
1630
+ "label": "Process",
1631
+ "x": 200,
1632
+ "y": 50
1633
+ },
1634
+ {
1635
+ "id": "c",
1636
+ "label": "End",
1637
+ "x": 350,
1638
+ "y": 100
1639
+ }
1640
+ ],
1641
+ "edges": [
1642
+ {
1643
+ "from": "a",
1644
+ "to": "b"
1645
+ },
1646
+ {
1647
+ "from": "b",
1648
+ "to": "c"
1649
+ }
1650
+ ],
1651
+ "width": 400,
1652
+ "height": 200
873
1653
  }
874
1654
  ]
875
1655
  }
@@ -922,11 +1702,16 @@
922
1702
  {
923
1703
  "name": "status",
924
1704
  "type": "string",
925
- "default": "offline"
1705
+ "default": "offline",
1706
+ "values": [
1707
+ "online",
1708
+ "offline",
1709
+ "maintenance"
1710
+ ]
926
1711
  },
927
1712
  {
928
1713
  "name": "lastSeen",
929
- "type": "string"
1714
+ "type": "date"
930
1715
  }
931
1716
  ]
932
1717
  },
@@ -1046,120 +1831,125 @@
1046
1831
  "render-ui",
1047
1832
  "main",
1048
1833
  {
1049
- "type": "stack",
1050
- "direction": "vertical",
1051
- "gap": "lg",
1052
- "children": [
1834
+ "type": "dashboard-layout",
1835
+ "appName": "IoT Dashboard",
1836
+ "navItems": [
1053
1837
  {
1054
- "type": "stack",
1055
- "direction": "horizontal",
1056
- "gap": "md",
1057
- "justify": "space-between",
1058
- "children": [
1059
- {
1060
- "type": "stack",
1061
- "direction": "horizontal",
1062
- "gap": "sm",
1063
- "align": "center",
1064
- "children": [
1065
- {
1066
- "type": "icon",
1067
- "name": "cpu",
1068
- "size": "lg"
1069
- },
1070
- {
1071
- "type": "typography",
1072
- "content": "Devices",
1073
- "variant": "h2"
1074
- }
1075
- ]
1076
- },
1077
- {
1078
- "type": "stack",
1079
- "direction": "horizontal",
1080
- "gap": "sm",
1081
- "children": [
1082
- {
1083
- "type": "button",
1084
- "label": "Create Device",
1085
- "event": "CREATE",
1086
- "variant": "primary",
1087
- "icon": "plus"
1088
- }
1089
- ]
1090
- }
1091
- ]
1838
+ "label": "Sensors",
1839
+ "href": "/sensors",
1840
+ "icon": "layout-list"
1092
1841
  },
1093
1842
  {
1094
- "type": "divider"
1843
+ "label": "Devices",
1844
+ "href": "/devices",
1845
+ "icon": "cpu"
1095
1846
  },
1096
1847
  {
1097
- "type": "data-grid",
1098
- "entity": "Device",
1099
- "emptyIcon": "inbox",
1100
- "emptyTitle": "No devices yet",
1101
- "emptyDescription": "Create your first device to get started.",
1102
- "itemActions": [
1103
- {
1104
- "label": "View",
1105
- "event": "VIEW"
1106
- },
1107
- {
1108
- "label": "Edit",
1109
- "event": "EDIT"
1110
- },
1111
- {
1112
- "label": "Delete",
1113
- "event": "DELETE",
1114
- "variant": "danger"
1115
- }
1116
- ],
1117
- "className": "transition-shadow hover:shadow-md cursor-pointer",
1118
- "renderItem": [
1119
- "fn",
1120
- "item",
1848
+ "label": "Alerts",
1849
+ "href": "/alerts",
1850
+ "icon": "bell"
1851
+ }
1852
+ ],
1853
+ "children": [
1854
+ {
1855
+ "type": "stack",
1856
+ "direction": "vertical",
1857
+ "gap": "lg",
1858
+ "className": "max-w-5xl mx-auto w-full",
1859
+ "children": [
1121
1860
  {
1122
1861
  "type": "stack",
1123
- "direction": "vertical",
1124
- "gap": "sm",
1862
+ "direction": "horizontal",
1863
+ "gap": "md",
1864
+ "justify": "space-between",
1865
+ "align": "center",
1125
1866
  "children": [
1126
1867
  {
1127
1868
  "type": "stack",
1128
1869
  "direction": "horizontal",
1129
- "justify": "space-between",
1870
+ "gap": "sm",
1130
1871
  "align": "center",
1131
1872
  "children": [
1132
1873
  {
1133
- "type": "stack",
1134
- "direction": "horizontal",
1135
- "gap": "sm",
1136
- "align": "center",
1137
- "children": [
1138
- {
1139
- "type": "icon",
1140
- "name": "cpu",
1141
- "size": "sm"
1142
- },
1143
- {
1144
- "type": "typography",
1145
- "variant": "h4",
1146
- "content": "@item.name"
1147
- }
1148
- ]
1874
+ "type": "icon",
1875
+ "name": "cpu",
1876
+ "size": "lg"
1149
1877
  },
1150
1878
  {
1151
- "type": "badge",
1152
- "label": "@item.type"
1879
+ "type": "typography",
1880
+ "content": "Devices",
1881
+ "variant": "h2"
1153
1882
  }
1154
1883
  ]
1155
1884
  },
1156
1885
  {
1157
- "type": "typography",
1158
- "variant": "caption",
1159
- "color": "muted",
1160
- "content": "@item.status"
1886
+ "type": "stack",
1887
+ "direction": "horizontal",
1888
+ "gap": "sm",
1889
+ "children": [
1890
+ {
1891
+ "type": "button",
1892
+ "label": "Create Device",
1893
+ "event": "CREATE",
1894
+ "variant": "primary",
1895
+ "icon": "plus"
1896
+ }
1897
+ ]
1161
1898
  }
1162
1899
  ]
1900
+ },
1901
+ {
1902
+ "type": "divider"
1903
+ },
1904
+ {
1905
+ "type": "data-grid",
1906
+ "entity": "Device",
1907
+ "emptyIcon": "inbox",
1908
+ "emptyTitle": "No devices registered",
1909
+ "emptyDescription": "Connect a device to start monitoring.",
1910
+ "itemActions": [
1911
+ {
1912
+ "label": "View",
1913
+ "event": "VIEW",
1914
+ "variant": "ghost",
1915
+ "size": "sm"
1916
+ },
1917
+ {
1918
+ "label": "Edit",
1919
+ "event": "EDIT",
1920
+ "variant": "ghost",
1921
+ "size": "sm"
1922
+ },
1923
+ {
1924
+ "label": "Delete",
1925
+ "event": "DELETE",
1926
+ "variant": "danger",
1927
+ "size": "sm"
1928
+ }
1929
+ ],
1930
+ "columns": [
1931
+ {
1932
+ "name": "name",
1933
+ "variant": "h3",
1934
+ "icon": "cpu"
1935
+ },
1936
+ {
1937
+ "name": "status",
1938
+ "variant": "badge"
1939
+ },
1940
+ {
1941
+ "name": "type",
1942
+ "variant": "body"
1943
+ },
1944
+ {
1945
+ "name": "lastSeen",
1946
+ "label": "Last Seen",
1947
+ "variant": "caption",
1948
+ "format": "date"
1949
+ }
1950
+ ],
1951
+ "cols": 3,
1952
+ "gap": "md"
1163
1953
  }
1164
1954
  ]
1165
1955
  }
@@ -1283,120 +2073,125 @@
1283
2073
  "render-ui",
1284
2074
  "main",
1285
2075
  {
1286
- "type": "stack",
1287
- "direction": "vertical",
1288
- "gap": "lg",
2076
+ "type": "dashboard-layout",
2077
+ "appName": "IoT Dashboard",
2078
+ "navItems": [
2079
+ {
2080
+ "label": "Sensors",
2081
+ "href": "/sensors",
2082
+ "icon": "layout-list"
2083
+ },
2084
+ {
2085
+ "label": "Devices",
2086
+ "href": "/devices",
2087
+ "icon": "cpu"
2088
+ },
2089
+ {
2090
+ "label": "Alerts",
2091
+ "href": "/alerts",
2092
+ "icon": "bell"
2093
+ }
2094
+ ],
1289
2095
  "children": [
1290
2096
  {
1291
2097
  "type": "stack",
1292
- "direction": "horizontal",
1293
- "gap": "md",
1294
- "justify": "space-between",
2098
+ "direction": "vertical",
2099
+ "gap": "lg",
2100
+ "className": "max-w-5xl mx-auto w-full",
1295
2101
  "children": [
1296
2102
  {
1297
2103
  "type": "stack",
1298
2104
  "direction": "horizontal",
1299
- "gap": "sm",
2105
+ "gap": "md",
2106
+ "justify": "space-between",
1300
2107
  "align": "center",
1301
- "children": [
1302
- {
1303
- "type": "icon",
1304
- "name": "cpu",
1305
- "size": "lg"
1306
- },
1307
- {
1308
- "type": "typography",
1309
- "content": "Devices",
1310
- "variant": "h2"
1311
- }
1312
- ]
1313
- },
1314
- {
1315
- "type": "stack",
1316
- "direction": "horizontal",
1317
- "gap": "sm",
1318
- "children": [
1319
- {
1320
- "type": "button",
1321
- "label": "Create Device",
1322
- "event": "CREATE",
1323
- "variant": "primary",
1324
- "icon": "plus"
1325
- }
1326
- ]
1327
- }
1328
- ]
1329
- },
1330
- {
1331
- "type": "divider"
1332
- },
1333
- {
1334
- "type": "data-grid",
1335
- "entity": "Device",
1336
- "emptyIcon": "inbox",
1337
- "emptyTitle": "No devices yet",
1338
- "emptyDescription": "Create your first device to get started.",
1339
- "itemActions": [
1340
- {
1341
- "label": "View",
1342
- "event": "VIEW"
1343
- },
1344
- {
1345
- "label": "Edit",
1346
- "event": "EDIT"
1347
- },
1348
- {
1349
- "label": "Delete",
1350
- "event": "DELETE",
1351
- "variant": "danger"
1352
- }
1353
- ],
1354
- "className": "transition-shadow hover:shadow-md cursor-pointer",
1355
- "renderItem": [
1356
- "fn",
1357
- "item",
1358
- {
1359
- "type": "stack",
1360
- "direction": "vertical",
1361
- "gap": "sm",
1362
2108
  "children": [
1363
2109
  {
1364
2110
  "type": "stack",
1365
2111
  "direction": "horizontal",
1366
- "justify": "space-between",
2112
+ "gap": "sm",
1367
2113
  "align": "center",
1368
2114
  "children": [
1369
2115
  {
1370
- "type": "stack",
1371
- "direction": "horizontal",
1372
- "gap": "sm",
1373
- "align": "center",
1374
- "children": [
1375
- {
1376
- "type": "icon",
1377
- "name": "cpu",
1378
- "size": "sm"
1379
- },
1380
- {
1381
- "type": "typography",
1382
- "variant": "h4",
1383
- "content": "@item.name"
1384
- }
1385
- ]
2116
+ "type": "icon",
2117
+ "name": "cpu",
2118
+ "size": "lg"
1386
2119
  },
1387
2120
  {
1388
- "type": "badge",
1389
- "label": "@item.type"
2121
+ "type": "typography",
2122
+ "content": "Devices",
2123
+ "variant": "h2"
1390
2124
  }
1391
2125
  ]
1392
2126
  },
1393
2127
  {
1394
- "type": "typography",
1395
- "variant": "caption",
1396
- "color": "muted",
1397
- "content": "@item.status"
2128
+ "type": "stack",
2129
+ "direction": "horizontal",
2130
+ "gap": "sm",
2131
+ "children": [
2132
+ {
2133
+ "type": "button",
2134
+ "label": "Create Device",
2135
+ "event": "CREATE",
2136
+ "variant": "primary",
2137
+ "icon": "plus"
2138
+ }
2139
+ ]
1398
2140
  }
1399
2141
  ]
2142
+ },
2143
+ {
2144
+ "type": "divider"
2145
+ },
2146
+ {
2147
+ "type": "data-grid",
2148
+ "entity": "Device",
2149
+ "emptyIcon": "inbox",
2150
+ "emptyTitle": "No devices registered",
2151
+ "emptyDescription": "Connect a device to start monitoring.",
2152
+ "itemActions": [
2153
+ {
2154
+ "label": "View",
2155
+ "event": "VIEW",
2156
+ "variant": "ghost",
2157
+ "size": "sm"
2158
+ },
2159
+ {
2160
+ "label": "Edit",
2161
+ "event": "EDIT",
2162
+ "variant": "ghost",
2163
+ "size": "sm"
2164
+ },
2165
+ {
2166
+ "label": "Delete",
2167
+ "event": "DELETE",
2168
+ "variant": "danger",
2169
+ "size": "sm"
2170
+ }
2171
+ ],
2172
+ "columns": [
2173
+ {
2174
+ "name": "name",
2175
+ "variant": "h3",
2176
+ "icon": "cpu"
2177
+ },
2178
+ {
2179
+ "name": "status",
2180
+ "variant": "badge"
2181
+ },
2182
+ {
2183
+ "name": "type",
2184
+ "variant": "body"
2185
+ },
2186
+ {
2187
+ "name": "lastSeen",
2188
+ "label": "Last Seen",
2189
+ "variant": "caption",
2190
+ "format": "date"
2191
+ }
2192
+ ],
2193
+ "cols": 3,
2194
+ "gap": "md"
1400
2195
  }
1401
2196
  ]
1402
2197
  }
@@ -1427,120 +2222,125 @@
1427
2222
  "render-ui",
1428
2223
  "main",
1429
2224
  {
1430
- "type": "stack",
1431
- "direction": "vertical",
1432
- "gap": "lg",
2225
+ "type": "dashboard-layout",
2226
+ "appName": "IoT Dashboard",
2227
+ "navItems": [
2228
+ {
2229
+ "label": "Sensors",
2230
+ "href": "/sensors",
2231
+ "icon": "layout-list"
2232
+ },
2233
+ {
2234
+ "label": "Devices",
2235
+ "href": "/devices",
2236
+ "icon": "cpu"
2237
+ },
2238
+ {
2239
+ "label": "Alerts",
2240
+ "href": "/alerts",
2241
+ "icon": "bell"
2242
+ }
2243
+ ],
1433
2244
  "children": [
1434
2245
  {
1435
2246
  "type": "stack",
1436
- "direction": "horizontal",
1437
- "gap": "md",
1438
- "justify": "space-between",
2247
+ "direction": "vertical",
2248
+ "gap": "lg",
2249
+ "className": "max-w-5xl mx-auto w-full",
1439
2250
  "children": [
1440
2251
  {
1441
2252
  "type": "stack",
1442
2253
  "direction": "horizontal",
1443
- "gap": "sm",
2254
+ "gap": "md",
2255
+ "justify": "space-between",
1444
2256
  "align": "center",
1445
- "children": [
1446
- {
1447
- "type": "icon",
1448
- "name": "cpu",
1449
- "size": "lg"
1450
- },
1451
- {
1452
- "type": "typography",
1453
- "content": "Devices",
1454
- "variant": "h2"
1455
- }
1456
- ]
1457
- },
1458
- {
1459
- "type": "stack",
1460
- "direction": "horizontal",
1461
- "gap": "sm",
1462
- "children": [
1463
- {
1464
- "type": "button",
1465
- "label": "Create Device",
1466
- "event": "CREATE",
1467
- "variant": "primary",
1468
- "icon": "plus"
1469
- }
1470
- ]
1471
- }
1472
- ]
1473
- },
1474
- {
1475
- "type": "divider"
1476
- },
1477
- {
1478
- "type": "data-grid",
1479
- "entity": "Device",
1480
- "emptyIcon": "inbox",
1481
- "emptyTitle": "No devices yet",
1482
- "emptyDescription": "Create your first device to get started.",
1483
- "itemActions": [
1484
- {
1485
- "label": "View",
1486
- "event": "VIEW"
1487
- },
1488
- {
1489
- "label": "Edit",
1490
- "event": "EDIT"
1491
- },
1492
- {
1493
- "label": "Delete",
1494
- "event": "DELETE",
1495
- "variant": "danger"
1496
- }
1497
- ],
1498
- "className": "transition-shadow hover:shadow-md cursor-pointer",
1499
- "renderItem": [
1500
- "fn",
1501
- "item",
1502
- {
1503
- "type": "stack",
1504
- "direction": "vertical",
1505
- "gap": "sm",
1506
2257
  "children": [
1507
2258
  {
1508
2259
  "type": "stack",
1509
2260
  "direction": "horizontal",
1510
- "justify": "space-between",
2261
+ "gap": "sm",
1511
2262
  "align": "center",
1512
2263
  "children": [
1513
2264
  {
1514
- "type": "stack",
1515
- "direction": "horizontal",
1516
- "gap": "sm",
1517
- "align": "center",
1518
- "children": [
1519
- {
1520
- "type": "icon",
1521
- "name": "cpu",
1522
- "size": "sm"
1523
- },
1524
- {
1525
- "type": "typography",
1526
- "variant": "h4",
1527
- "content": "@item.name"
1528
- }
1529
- ]
2265
+ "type": "icon",
2266
+ "name": "cpu",
2267
+ "size": "lg"
1530
2268
  },
1531
2269
  {
1532
- "type": "badge",
1533
- "label": "@item.type"
2270
+ "type": "typography",
2271
+ "content": "Devices",
2272
+ "variant": "h2"
1534
2273
  }
1535
2274
  ]
1536
2275
  },
1537
2276
  {
1538
- "type": "typography",
1539
- "variant": "caption",
1540
- "color": "muted",
1541
- "content": "@item.status"
2277
+ "type": "stack",
2278
+ "direction": "horizontal",
2279
+ "gap": "sm",
2280
+ "children": [
2281
+ {
2282
+ "type": "button",
2283
+ "label": "Create Device",
2284
+ "event": "CREATE",
2285
+ "variant": "primary",
2286
+ "icon": "plus"
2287
+ }
2288
+ ]
1542
2289
  }
1543
2290
  ]
2291
+ },
2292
+ {
2293
+ "type": "divider"
2294
+ },
2295
+ {
2296
+ "type": "data-grid",
2297
+ "entity": "Device",
2298
+ "emptyIcon": "inbox",
2299
+ "emptyTitle": "No devices registered",
2300
+ "emptyDescription": "Connect a device to start monitoring.",
2301
+ "itemActions": [
2302
+ {
2303
+ "label": "View",
2304
+ "event": "VIEW",
2305
+ "variant": "ghost",
2306
+ "size": "sm"
2307
+ },
2308
+ {
2309
+ "label": "Edit",
2310
+ "event": "EDIT",
2311
+ "variant": "ghost",
2312
+ "size": "sm"
2313
+ },
2314
+ {
2315
+ "label": "Delete",
2316
+ "event": "DELETE",
2317
+ "variant": "danger",
2318
+ "size": "sm"
2319
+ }
2320
+ ],
2321
+ "columns": [
2322
+ {
2323
+ "name": "name",
2324
+ "variant": "h3",
2325
+ "icon": "cpu"
2326
+ },
2327
+ {
2328
+ "name": "status",
2329
+ "variant": "badge"
2330
+ },
2331
+ {
2332
+ "name": "type",
2333
+ "variant": "body"
2334
+ },
2335
+ {
2336
+ "name": "lastSeen",
2337
+ "label": "Last Seen",
2338
+ "variant": "caption",
2339
+ "format": "date"
2340
+ }
2341
+ ],
2342
+ "cols": 3,
2343
+ "gap": "md"
1544
2344
  }
1545
2345
  ]
1546
2346
  }
@@ -1554,133 +2354,138 @@
1554
2354
  "to": "browsing",
1555
2355
  "event": "CLOSE",
1556
2356
  "effects": [
1557
- [
1558
- "render-ui",
1559
- "modal",
1560
- null
1561
- ],
1562
- [
1563
- "fetch",
1564
- "Device"
1565
- ],
1566
- [
1567
- "render-ui",
1568
- "main",
1569
- {
1570
- "type": "stack",
1571
- "direction": "vertical",
1572
- "gap": "lg",
1573
- "children": [
1574
- {
1575
- "type": "stack",
1576
- "direction": "horizontal",
1577
- "gap": "md",
1578
- "justify": "space-between",
1579
- "children": [
1580
- {
1581
- "type": "stack",
1582
- "direction": "horizontal",
1583
- "gap": "sm",
1584
- "align": "center",
1585
- "children": [
1586
- {
1587
- "type": "icon",
1588
- "name": "cpu",
1589
- "size": "lg"
1590
- },
1591
- {
1592
- "type": "typography",
1593
- "content": "Devices",
1594
- "variant": "h2"
1595
- }
1596
- ]
1597
- },
1598
- {
1599
- "type": "stack",
1600
- "direction": "horizontal",
1601
- "gap": "sm",
1602
- "children": [
1603
- {
1604
- "type": "button",
1605
- "label": "Create Device",
1606
- "event": "CREATE",
1607
- "variant": "primary",
1608
- "icon": "plus"
1609
- }
1610
- ]
1611
- }
1612
- ]
2357
+ [
2358
+ "render-ui",
2359
+ "modal",
2360
+ null
2361
+ ],
2362
+ [
2363
+ "fetch",
2364
+ "Device"
2365
+ ],
2366
+ [
2367
+ "render-ui",
2368
+ "main",
2369
+ {
2370
+ "type": "dashboard-layout",
2371
+ "appName": "IoT Dashboard",
2372
+ "navItems": [
2373
+ {
2374
+ "label": "Sensors",
2375
+ "href": "/sensors",
2376
+ "icon": "layout-list"
1613
2377
  },
1614
2378
  {
1615
- "type": "divider"
2379
+ "label": "Devices",
2380
+ "href": "/devices",
2381
+ "icon": "cpu"
1616
2382
  },
1617
2383
  {
1618
- "type": "data-grid",
1619
- "entity": "Device",
1620
- "emptyIcon": "inbox",
1621
- "emptyTitle": "No devices yet",
1622
- "emptyDescription": "Create your first device to get started.",
1623
- "itemActions": [
1624
- {
1625
- "label": "View",
1626
- "event": "VIEW"
1627
- },
1628
- {
1629
- "label": "Edit",
1630
- "event": "EDIT"
1631
- },
1632
- {
1633
- "label": "Delete",
1634
- "event": "DELETE",
1635
- "variant": "danger"
1636
- }
1637
- ],
1638
- "className": "transition-shadow hover:shadow-md cursor-pointer",
1639
- "renderItem": [
1640
- "fn",
1641
- "item",
2384
+ "label": "Alerts",
2385
+ "href": "/alerts",
2386
+ "icon": "bell"
2387
+ }
2388
+ ],
2389
+ "children": [
2390
+ {
2391
+ "type": "stack",
2392
+ "direction": "vertical",
2393
+ "gap": "lg",
2394
+ "className": "max-w-5xl mx-auto w-full",
2395
+ "children": [
1642
2396
  {
1643
2397
  "type": "stack",
1644
- "direction": "vertical",
1645
- "gap": "sm",
2398
+ "direction": "horizontal",
2399
+ "gap": "md",
2400
+ "justify": "space-between",
2401
+ "align": "center",
1646
2402
  "children": [
1647
2403
  {
1648
2404
  "type": "stack",
1649
2405
  "direction": "horizontal",
1650
- "justify": "space-between",
2406
+ "gap": "sm",
1651
2407
  "align": "center",
1652
2408
  "children": [
1653
2409
  {
1654
- "type": "stack",
1655
- "direction": "horizontal",
1656
- "gap": "sm",
1657
- "align": "center",
1658
- "children": [
1659
- {
1660
- "type": "icon",
1661
- "name": "cpu",
1662
- "size": "sm"
1663
- },
1664
- {
1665
- "type": "typography",
1666
- "variant": "h4",
1667
- "content": "@item.name"
1668
- }
1669
- ]
2410
+ "type": "icon",
2411
+ "name": "cpu",
2412
+ "size": "lg"
1670
2413
  },
1671
2414
  {
1672
- "type": "badge",
1673
- "label": "@item.type"
2415
+ "type": "typography",
2416
+ "content": "Devices",
2417
+ "variant": "h2"
1674
2418
  }
1675
2419
  ]
1676
2420
  },
1677
2421
  {
1678
- "type": "typography",
1679
- "variant": "caption",
1680
- "color": "muted",
1681
- "content": "@item.status"
2422
+ "type": "stack",
2423
+ "direction": "horizontal",
2424
+ "gap": "sm",
2425
+ "children": [
2426
+ {
2427
+ "type": "button",
2428
+ "label": "Create Device",
2429
+ "event": "CREATE",
2430
+ "variant": "primary",
2431
+ "icon": "plus"
2432
+ }
2433
+ ]
1682
2434
  }
1683
2435
  ]
2436
+ },
2437
+ {
2438
+ "type": "divider"
2439
+ },
2440
+ {
2441
+ "type": "data-grid",
2442
+ "entity": "Device",
2443
+ "emptyIcon": "inbox",
2444
+ "emptyTitle": "No devices registered",
2445
+ "emptyDescription": "Connect a device to start monitoring.",
2446
+ "itemActions": [
2447
+ {
2448
+ "label": "View",
2449
+ "event": "VIEW",
2450
+ "variant": "ghost",
2451
+ "size": "sm"
2452
+ },
2453
+ {
2454
+ "label": "Edit",
2455
+ "event": "EDIT",
2456
+ "variant": "ghost",
2457
+ "size": "sm"
2458
+ },
2459
+ {
2460
+ "label": "Delete",
2461
+ "event": "DELETE",
2462
+ "variant": "danger",
2463
+ "size": "sm"
2464
+ }
2465
+ ],
2466
+ "columns": [
2467
+ {
2468
+ "name": "name",
2469
+ "variant": "h3",
2470
+ "icon": "cpu"
2471
+ },
2472
+ {
2473
+ "name": "status",
2474
+ "variant": "badge"
2475
+ },
2476
+ {
2477
+ "name": "type",
2478
+ "variant": "body"
2479
+ },
2480
+ {
2481
+ "name": "lastSeen",
2482
+ "label": "Last Seen",
2483
+ "variant": "caption",
2484
+ "format": "date"
2485
+ }
2486
+ ],
2487
+ "cols": 3,
2488
+ "gap": "md"
1684
2489
  }
1685
2490
  ]
1686
2491
  }
@@ -1812,6 +2617,11 @@
1812
2617
  "render-ui",
1813
2618
  "modal",
1814
2619
  null
2620
+ ],
2621
+ [
2622
+ "notify",
2623
+ "Cancelled",
2624
+ "info"
1815
2625
  ]
1816
2626
  ]
1817
2627
  },
@@ -1977,6 +2787,11 @@
1977
2787
  "render-ui",
1978
2788
  "modal",
1979
2789
  null
2790
+ ],
2791
+ [
2792
+ "notify",
2793
+ "Cancelled",
2794
+ "info"
1980
2795
  ]
1981
2796
  ]
1982
2797
  },
@@ -2158,7 +2973,7 @@
2158
2973
  {
2159
2974
  "type": "typography",
2160
2975
  "variant": "caption",
2161
- "content": "LastSeen"
2976
+ "content": "Last Seen"
2162
2977
  },
2163
2978
  {
2164
2979
  "type": "typography",
@@ -2205,6 +3020,11 @@
2205
3020
  "render-ui",
2206
3021
  "modal",
2207
3022
  null
3023
+ ],
3024
+ [
3025
+ "notify",
3026
+ "Cancelled",
3027
+ "info"
2208
3028
  ]
2209
3029
  ]
2210
3030
  }
@@ -2334,58 +3154,104 @@
2334
3154
  "render-ui",
2335
3155
  "main",
2336
3156
  {
2337
- "type": "stack",
2338
- "direction": "vertical",
2339
- "gap": "lg",
3157
+ "type": "dashboard-layout",
3158
+ "appName": "IoT Dashboard",
3159
+ "navItems": [
3160
+ {
3161
+ "label": "Sensors",
3162
+ "href": "/sensors",
3163
+ "icon": "layout-list"
3164
+ },
3165
+ {
3166
+ "label": "Devices",
3167
+ "href": "/devices",
3168
+ "icon": "cpu"
3169
+ },
3170
+ {
3171
+ "label": "Alerts",
3172
+ "href": "/alerts",
3173
+ "icon": "bell"
3174
+ }
3175
+ ],
2340
3176
  "children": [
2341
3177
  {
2342
3178
  "type": "stack",
2343
- "direction": "horizontal",
2344
- "gap": "md",
2345
- "align": "center",
2346
- "justify": "space-between",
3179
+ "direction": "vertical",
3180
+ "gap": "lg",
2347
3181
  "children": [
2348
3182
  {
2349
3183
  "type": "stack",
2350
3184
  "direction": "horizontal",
2351
3185
  "gap": "md",
2352
3186
  "align": "center",
3187
+ "justify": "space-between",
2353
3188
  "children": [
2354
3189
  {
2355
- "type": "icon",
2356
- "name": "bell",
2357
- "size": "lg"
3190
+ "type": "stack",
3191
+ "direction": "horizontal",
3192
+ "gap": "md",
3193
+ "align": "center",
3194
+ "children": [
3195
+ {
3196
+ "type": "icon",
3197
+ "name": "bell",
3198
+ "size": "lg"
3199
+ },
3200
+ {
3201
+ "type": "typography",
3202
+ "content": "DeviceAlert",
3203
+ "variant": "h2"
3204
+ }
3205
+ ]
2358
3206
  },
2359
3207
  {
2360
- "type": "typography",
2361
- "content": "DeviceAlert",
2362
- "variant": "h2"
3208
+ "type": "status-dot",
3209
+ "status": "success",
3210
+ "pulse": false,
3211
+ "label": "Circuit Closed"
2363
3212
  }
2364
3213
  ]
2365
3214
  },
2366
3215
  {
2367
- "type": "status-dot",
2368
- "status": "success",
2369
- "pulse": false,
2370
- "label": "Circuit Closed"
2371
- }
2372
- ]
2373
- },
2374
- {
2375
- "type": "divider"
2376
- },
2377
- {
2378
- "type": "alert",
2379
- "variant": "success",
2380
- "message": "Service is healthy. All requests are being processed."
2381
- },
2382
- {
2383
- "type": "simple-grid",
2384
- "columns": 2,
2385
- "children": [
3216
+ "type": "divider"
3217
+ },
3218
+ {
3219
+ "type": "alert",
3220
+ "variant": "success",
3221
+ "message": "Service is healthy. All requests are being processed."
3222
+ },
3223
+ {
3224
+ "type": "simple-grid",
3225
+ "columns": 2,
3226
+ "children": [
3227
+ {
3228
+ "type": "stat-display",
3229
+ "label": "Failures",
3230
+ "value": [
3231
+ "object/get",
3232
+ [
3233
+ "array/first",
3234
+ "@entity"
3235
+ ],
3236
+ "failureCount"
3237
+ ]
3238
+ },
3239
+ {
3240
+ "type": "stat-display",
3241
+ "label": "Successes",
3242
+ "value": [
3243
+ "object/get",
3244
+ [
3245
+ "array/first",
3246
+ "@entity"
3247
+ ],
3248
+ "successCount"
3249
+ ]
3250
+ }
3251
+ ]
3252
+ },
2386
3253
  {
2387
- "type": "stat-display",
2388
- "label": "Failures",
3254
+ "type": "meter",
2389
3255
  "value": [
2390
3256
  "object/get",
2391
3257
  [
@@ -2393,41 +3259,18 @@
2393
3259
  "@entity"
2394
3260
  ],
2395
3261
  "failureCount"
2396
- ]
2397
- },
2398
- {
2399
- "type": "stat-display",
2400
- "label": "Successes",
2401
- "value": [
3262
+ ],
3263
+ "min": 0,
3264
+ "max": [
2402
3265
  "object/get",
2403
3266
  [
2404
3267
  "array/first",
2405
3268
  "@entity"
2406
3269
  ],
2407
- "successCount"
3270
+ "threshold"
2408
3271
  ]
2409
3272
  }
2410
3273
  ]
2411
- },
2412
- {
2413
- "type": "meter",
2414
- "value": [
2415
- "object/get",
2416
- [
2417
- "array/first",
2418
- "@entity"
2419
- ],
2420
- "failureCount"
2421
- ],
2422
- "min": 0,
2423
- "max": [
2424
- "object/get",
2425
- [
2426
- "array/first",
2427
- "@entity"
2428
- ],
2429
- "threshold"
2430
- ]
2431
3274
  }
2432
3275
  ]
2433
3276
  }
@@ -2443,58 +3286,104 @@
2443
3286
  "render-ui",
2444
3287
  "main",
2445
3288
  {
2446
- "type": "stack",
2447
- "direction": "vertical",
2448
- "gap": "lg",
3289
+ "type": "dashboard-layout",
3290
+ "appName": "IoT Dashboard",
3291
+ "navItems": [
3292
+ {
3293
+ "label": "Sensors",
3294
+ "href": "/sensors",
3295
+ "icon": "layout-list"
3296
+ },
3297
+ {
3298
+ "label": "Devices",
3299
+ "href": "/devices",
3300
+ "icon": "cpu"
3301
+ },
3302
+ {
3303
+ "label": "Alerts",
3304
+ "href": "/alerts",
3305
+ "icon": "bell"
3306
+ }
3307
+ ],
2449
3308
  "children": [
2450
3309
  {
2451
3310
  "type": "stack",
2452
- "direction": "horizontal",
2453
- "gap": "md",
2454
- "align": "center",
2455
- "justify": "space-between",
3311
+ "direction": "vertical",
3312
+ "gap": "lg",
2456
3313
  "children": [
2457
3314
  {
2458
3315
  "type": "stack",
2459
3316
  "direction": "horizontal",
2460
3317
  "gap": "md",
2461
3318
  "align": "center",
3319
+ "justify": "space-between",
2462
3320
  "children": [
2463
3321
  {
2464
- "type": "icon",
2465
- "name": "alert-triangle",
2466
- "size": "lg"
3322
+ "type": "stack",
3323
+ "direction": "horizontal",
3324
+ "gap": "md",
3325
+ "align": "center",
3326
+ "children": [
3327
+ {
3328
+ "type": "icon",
3329
+ "name": "alert-triangle",
3330
+ "size": "lg"
3331
+ },
3332
+ {
3333
+ "type": "typography",
3334
+ "content": "DeviceAlert",
3335
+ "variant": "h2"
3336
+ }
3337
+ ]
2467
3338
  },
2468
3339
  {
2469
- "type": "typography",
2470
- "content": "DeviceAlert",
2471
- "variant": "h2"
3340
+ "type": "status-dot",
3341
+ "status": "error",
3342
+ "pulse": true,
3343
+ "label": "Circuit Open"
2472
3344
  }
2473
3345
  ]
2474
3346
  },
2475
3347
  {
2476
- "type": "status-dot",
2477
- "status": "error",
2478
- "pulse": true,
2479
- "label": "Circuit Open"
2480
- }
2481
- ]
2482
- },
2483
- {
2484
- "type": "divider"
2485
- },
2486
- {
2487
- "type": "alert",
2488
- "variant": "danger",
2489
- "message": "Circuit is open. Requests are being rejected to prevent cascading failures."
2490
- },
2491
- {
2492
- "type": "simple-grid",
2493
- "columns": 2,
2494
- "children": [
3348
+ "type": "divider"
3349
+ },
3350
+ {
3351
+ "type": "alert",
3352
+ "variant": "danger",
3353
+ "message": "Circuit is open. Requests are being rejected to prevent cascading failures."
3354
+ },
3355
+ {
3356
+ "type": "simple-grid",
3357
+ "columns": 2,
3358
+ "children": [
3359
+ {
3360
+ "type": "stat-display",
3361
+ "label": "Failures",
3362
+ "value": [
3363
+ "object/get",
3364
+ [
3365
+ "array/first",
3366
+ "@entity"
3367
+ ],
3368
+ "failureCount"
3369
+ ]
3370
+ },
3371
+ {
3372
+ "type": "stat-display",
3373
+ "label": "Successes",
3374
+ "value": [
3375
+ "object/get",
3376
+ [
3377
+ "array/first",
3378
+ "@entity"
3379
+ ],
3380
+ "successCount"
3381
+ ]
3382
+ }
3383
+ ]
3384
+ },
2495
3385
  {
2496
- "type": "stat-display",
2497
- "label": "Failures",
3386
+ "type": "meter",
2498
3387
  "value": [
2499
3388
  "object/get",
2500
3389
  [
@@ -2502,48 +3391,25 @@
2502
3391
  "@entity"
2503
3392
  ],
2504
3393
  "failureCount"
2505
- ]
2506
- },
2507
- {
2508
- "type": "stat-display",
2509
- "label": "Successes",
2510
- "value": [
3394
+ ],
3395
+ "min": 0,
3396
+ "max": [
2511
3397
  "object/get",
2512
3398
  [
2513
3399
  "array/first",
2514
3400
  "@entity"
2515
3401
  ],
2516
- "successCount"
3402
+ "threshold"
2517
3403
  ]
3404
+ },
3405
+ {
3406
+ "type": "button",
3407
+ "label": "Reset",
3408
+ "event": "RESET",
3409
+ "variant": "ghost",
3410
+ "icon": "rotate-ccw"
2518
3411
  }
2519
3412
  ]
2520
- },
2521
- {
2522
- "type": "meter",
2523
- "value": [
2524
- "object/get",
2525
- [
2526
- "array/first",
2527
- "@entity"
2528
- ],
2529
- "failureCount"
2530
- ],
2531
- "min": 0,
2532
- "max": [
2533
- "object/get",
2534
- [
2535
- "array/first",
2536
- "@entity"
2537
- ],
2538
- "threshold"
2539
- ]
2540
- },
2541
- {
2542
- "type": "button",
2543
- "label": "Reset",
2544
- "event": "RESET",
2545
- "variant": "ghost",
2546
- "icon": "rotate-ccw"
2547
3413
  }
2548
3414
  ]
2549
3415
  }
@@ -2559,58 +3425,104 @@
2559
3425
  "render-ui",
2560
3426
  "main",
2561
3427
  {
2562
- "type": "stack",
2563
- "direction": "vertical",
2564
- "gap": "lg",
3428
+ "type": "dashboard-layout",
3429
+ "appName": "IoT Dashboard",
3430
+ "navItems": [
3431
+ {
3432
+ "label": "Sensors",
3433
+ "href": "/sensors",
3434
+ "icon": "layout-list"
3435
+ },
3436
+ {
3437
+ "label": "Devices",
3438
+ "href": "/devices",
3439
+ "icon": "cpu"
3440
+ },
3441
+ {
3442
+ "label": "Alerts",
3443
+ "href": "/alerts",
3444
+ "icon": "bell"
3445
+ }
3446
+ ],
2565
3447
  "children": [
2566
3448
  {
2567
3449
  "type": "stack",
2568
- "direction": "horizontal",
2569
- "gap": "md",
2570
- "align": "center",
2571
- "justify": "space-between",
3450
+ "direction": "vertical",
3451
+ "gap": "lg",
2572
3452
  "children": [
2573
3453
  {
2574
3454
  "type": "stack",
2575
3455
  "direction": "horizontal",
2576
3456
  "gap": "md",
2577
3457
  "align": "center",
3458
+ "justify": "space-between",
2578
3459
  "children": [
2579
3460
  {
2580
- "type": "icon",
2581
- "name": "bell",
2582
- "size": "lg"
3461
+ "type": "stack",
3462
+ "direction": "horizontal",
3463
+ "gap": "md",
3464
+ "align": "center",
3465
+ "children": [
3466
+ {
3467
+ "type": "icon",
3468
+ "name": "bell",
3469
+ "size": "lg"
3470
+ },
3471
+ {
3472
+ "type": "typography",
3473
+ "content": "DeviceAlert",
3474
+ "variant": "h2"
3475
+ }
3476
+ ]
2583
3477
  },
2584
3478
  {
2585
- "type": "typography",
2586
- "content": "DeviceAlert",
2587
- "variant": "h2"
3479
+ "type": "status-dot",
3480
+ "status": "success",
3481
+ "pulse": false,
3482
+ "label": "Circuit Closed"
2588
3483
  }
2589
3484
  ]
2590
3485
  },
2591
3486
  {
2592
- "type": "status-dot",
2593
- "status": "success",
2594
- "pulse": false,
2595
- "label": "Circuit Closed"
2596
- }
2597
- ]
2598
- },
2599
- {
2600
- "type": "divider"
2601
- },
2602
- {
2603
- "type": "alert",
2604
- "variant": "success",
2605
- "message": "Service is healthy. All requests are being processed."
2606
- },
2607
- {
2608
- "type": "simple-grid",
2609
- "columns": 2,
2610
- "children": [
3487
+ "type": "divider"
3488
+ },
3489
+ {
3490
+ "type": "alert",
3491
+ "variant": "success",
3492
+ "message": "Service is healthy. All requests are being processed."
3493
+ },
3494
+ {
3495
+ "type": "simple-grid",
3496
+ "columns": 2,
3497
+ "children": [
3498
+ {
3499
+ "type": "stat-display",
3500
+ "label": "Failures",
3501
+ "value": [
3502
+ "object/get",
3503
+ [
3504
+ "array/first",
3505
+ "@entity"
3506
+ ],
3507
+ "failureCount"
3508
+ ]
3509
+ },
3510
+ {
3511
+ "type": "stat-display",
3512
+ "label": "Successes",
3513
+ "value": [
3514
+ "object/get",
3515
+ [
3516
+ "array/first",
3517
+ "@entity"
3518
+ ],
3519
+ "successCount"
3520
+ ]
3521
+ }
3522
+ ]
3523
+ },
2611
3524
  {
2612
- "type": "stat-display",
2613
- "label": "Failures",
3525
+ "type": "meter",
2614
3526
  "value": [
2615
3527
  "object/get",
2616
3528
  [
@@ -2618,41 +3530,18 @@
2618
3530
  "@entity"
2619
3531
  ],
2620
3532
  "failureCount"
2621
- ]
2622
- },
2623
- {
2624
- "type": "stat-display",
2625
- "label": "Successes",
2626
- "value": [
3533
+ ],
3534
+ "min": 0,
3535
+ "max": [
2627
3536
  "object/get",
2628
3537
  [
2629
3538
  "array/first",
2630
3539
  "@entity"
2631
3540
  ],
2632
- "successCount"
3541
+ "threshold"
2633
3542
  ]
2634
3543
  }
2635
3544
  ]
2636
- },
2637
- {
2638
- "type": "meter",
2639
- "value": [
2640
- "object/get",
2641
- [
2642
- "array/first",
2643
- "@entity"
2644
- ],
2645
- "failureCount"
2646
- ],
2647
- "min": 0,
2648
- "max": [
2649
- "object/get",
2650
- [
2651
- "array/first",
2652
- "@entity"
2653
- ],
2654
- "threshold"
2655
- ]
2656
3545
  }
2657
3546
  ]
2658
3547
  }
@@ -2668,77 +3557,100 @@
2668
3557
  "render-ui",
2669
3558
  "main",
2670
3559
  {
2671
- "type": "stack",
2672
- "direction": "vertical",
2673
- "gap": "lg",
3560
+ "type": "dashboard-layout",
3561
+ "appName": "IoT Dashboard",
3562
+ "navItems": [
3563
+ {
3564
+ "label": "Sensors",
3565
+ "href": "/sensors",
3566
+ "icon": "layout-list"
3567
+ },
3568
+ {
3569
+ "label": "Devices",
3570
+ "href": "/devices",
3571
+ "icon": "cpu"
3572
+ },
3573
+ {
3574
+ "label": "Alerts",
3575
+ "href": "/alerts",
3576
+ "icon": "bell"
3577
+ }
3578
+ ],
2674
3579
  "children": [
2675
3580
  {
2676
3581
  "type": "stack",
2677
- "direction": "horizontal",
2678
- "gap": "md",
2679
- "align": "center",
2680
- "justify": "space-between",
3582
+ "direction": "vertical",
3583
+ "gap": "lg",
2681
3584
  "children": [
2682
3585
  {
2683
3586
  "type": "stack",
2684
3587
  "direction": "horizontal",
2685
3588
  "gap": "md",
2686
3589
  "align": "center",
3590
+ "justify": "space-between",
2687
3591
  "children": [
2688
3592
  {
2689
- "type": "icon",
2690
- "name": "activity",
2691
- "size": "lg"
3593
+ "type": "stack",
3594
+ "direction": "horizontal",
3595
+ "gap": "md",
3596
+ "align": "center",
3597
+ "children": [
3598
+ {
3599
+ "type": "icon",
3600
+ "name": "activity",
3601
+ "size": "lg"
3602
+ },
3603
+ {
3604
+ "type": "typography",
3605
+ "content": "DeviceAlert",
3606
+ "variant": "h2"
3607
+ }
3608
+ ]
2692
3609
  },
2693
3610
  {
2694
- "type": "typography",
2695
- "content": "DeviceAlert",
2696
- "variant": "h2"
3611
+ "type": "status-dot",
3612
+ "status": "warning",
3613
+ "pulse": true,
3614
+ "label": "Circuit Half-Open"
2697
3615
  }
2698
3616
  ]
2699
3617
  },
2700
3618
  {
2701
- "type": "status-dot",
2702
- "status": "warning",
2703
- "pulse": true,
2704
- "label": "Circuit Half-Open"
2705
- }
2706
- ]
2707
- },
2708
- {
2709
- "type": "divider"
2710
- },
2711
- {
2712
- "type": "alert",
2713
- "variant": "warning",
2714
- "message": "Testing recovery. Limited requests are being allowed through."
2715
- },
2716
- {
2717
- "type": "simple-grid",
2718
- "columns": 2,
2719
- "children": [
3619
+ "type": "divider"
3620
+ },
2720
3621
  {
2721
- "type": "stat-display",
2722
- "label": "Failures",
2723
- "value": [
2724
- "object/get",
2725
- [
2726
- "array/first",
2727
- "@entity"
2728
- ],
2729
- "failureCount"
2730
- ]
3622
+ "type": "alert",
3623
+ "variant": "warning",
3624
+ "message": "Testing recovery. Limited requests are being allowed through."
2731
3625
  },
2732
3626
  {
2733
- "type": "stat-display",
2734
- "label": "Successes",
2735
- "value": [
2736
- "object/get",
2737
- [
2738
- "array/first",
2739
- "@entity"
2740
- ],
2741
- "successCount"
3627
+ "type": "simple-grid",
3628
+ "columns": 2,
3629
+ "children": [
3630
+ {
3631
+ "type": "stat-display",
3632
+ "label": "Failures",
3633
+ "value": [
3634
+ "object/get",
3635
+ [
3636
+ "array/first",
3637
+ "@entity"
3638
+ ],
3639
+ "failureCount"
3640
+ ]
3641
+ },
3642
+ {
3643
+ "type": "stat-display",
3644
+ "label": "Successes",
3645
+ "value": [
3646
+ "object/get",
3647
+ [
3648
+ "array/first",
3649
+ "@entity"
3650
+ ],
3651
+ "successCount"
3652
+ ]
3653
+ }
2742
3654
  ]
2743
3655
  }
2744
3656
  ]
@@ -2757,58 +3669,104 @@
2757
3669
  "render-ui",
2758
3670
  "main",
2759
3671
  {
2760
- "type": "stack",
2761
- "direction": "vertical",
2762
- "gap": "lg",
3672
+ "type": "dashboard-layout",
3673
+ "appName": "IoT Dashboard",
3674
+ "navItems": [
3675
+ {
3676
+ "label": "Sensors",
3677
+ "href": "/sensors",
3678
+ "icon": "layout-list"
3679
+ },
3680
+ {
3681
+ "label": "Devices",
3682
+ "href": "/devices",
3683
+ "icon": "cpu"
3684
+ },
3685
+ {
3686
+ "label": "Alerts",
3687
+ "href": "/alerts",
3688
+ "icon": "bell"
3689
+ }
3690
+ ],
2763
3691
  "children": [
2764
3692
  {
2765
3693
  "type": "stack",
2766
- "direction": "horizontal",
2767
- "gap": "md",
2768
- "align": "center",
2769
- "justify": "space-between",
3694
+ "direction": "vertical",
3695
+ "gap": "lg",
2770
3696
  "children": [
2771
3697
  {
2772
3698
  "type": "stack",
2773
3699
  "direction": "horizontal",
2774
3700
  "gap": "md",
2775
3701
  "align": "center",
3702
+ "justify": "space-between",
2776
3703
  "children": [
2777
3704
  {
2778
- "type": "icon",
2779
- "name": "bell",
2780
- "size": "lg"
3705
+ "type": "stack",
3706
+ "direction": "horizontal",
3707
+ "gap": "md",
3708
+ "align": "center",
3709
+ "children": [
3710
+ {
3711
+ "type": "icon",
3712
+ "name": "bell",
3713
+ "size": "lg"
3714
+ },
3715
+ {
3716
+ "type": "typography",
3717
+ "content": "DeviceAlert",
3718
+ "variant": "h2"
3719
+ }
3720
+ ]
2781
3721
  },
2782
3722
  {
2783
- "type": "typography",
2784
- "content": "DeviceAlert",
2785
- "variant": "h2"
3723
+ "type": "status-dot",
3724
+ "status": "success",
3725
+ "pulse": false,
3726
+ "label": "Circuit Closed"
2786
3727
  }
2787
3728
  ]
2788
3729
  },
2789
3730
  {
2790
- "type": "status-dot",
2791
- "status": "success",
2792
- "pulse": false,
2793
- "label": "Circuit Closed"
2794
- }
2795
- ]
2796
- },
2797
- {
2798
- "type": "divider"
2799
- },
2800
- {
2801
- "type": "alert",
2802
- "variant": "success",
2803
- "message": "Service is healthy. All requests are being processed."
2804
- },
2805
- {
2806
- "type": "simple-grid",
2807
- "columns": 2,
2808
- "children": [
3731
+ "type": "divider"
3732
+ },
3733
+ {
3734
+ "type": "alert",
3735
+ "variant": "success",
3736
+ "message": "Service is healthy. All requests are being processed."
3737
+ },
3738
+ {
3739
+ "type": "simple-grid",
3740
+ "columns": 2,
3741
+ "children": [
3742
+ {
3743
+ "type": "stat-display",
3744
+ "label": "Failures",
3745
+ "value": [
3746
+ "object/get",
3747
+ [
3748
+ "array/first",
3749
+ "@entity"
3750
+ ],
3751
+ "failureCount"
3752
+ ]
3753
+ },
3754
+ {
3755
+ "type": "stat-display",
3756
+ "label": "Successes",
3757
+ "value": [
3758
+ "object/get",
3759
+ [
3760
+ "array/first",
3761
+ "@entity"
3762
+ ],
3763
+ "successCount"
3764
+ ]
3765
+ }
3766
+ ]
3767
+ },
2809
3768
  {
2810
- "type": "stat-display",
2811
- "label": "Failures",
3769
+ "type": "meter",
2812
3770
  "value": [
2813
3771
  "object/get",
2814
3772
  [
@@ -2816,41 +3774,18 @@
2816
3774
  "@entity"
2817
3775
  ],
2818
3776
  "failureCount"
2819
- ]
2820
- },
2821
- {
2822
- "type": "stat-display",
2823
- "label": "Successes",
2824
- "value": [
3777
+ ],
3778
+ "min": 0,
3779
+ "max": [
2825
3780
  "object/get",
2826
3781
  [
2827
3782
  "array/first",
2828
3783
  "@entity"
2829
3784
  ],
2830
- "successCount"
3785
+ "threshold"
2831
3786
  ]
2832
3787
  }
2833
3788
  ]
2834
- },
2835
- {
2836
- "type": "meter",
2837
- "value": [
2838
- "object/get",
2839
- [
2840
- "array/first",
2841
- "@entity"
2842
- ],
2843
- "failureCount"
2844
- ],
2845
- "min": 0,
2846
- "max": [
2847
- "object/get",
2848
- [
2849
- "array/first",
2850
- "@entity"
2851
- ],
2852
- "threshold"
2853
- ]
2854
3789
  }
2855
3790
  ]
2856
3791
  }
@@ -2866,58 +3801,104 @@
2866
3801
  "render-ui",
2867
3802
  "main",
2868
3803
  {
2869
- "type": "stack",
2870
- "direction": "vertical",
2871
- "gap": "lg",
3804
+ "type": "dashboard-layout",
3805
+ "appName": "IoT Dashboard",
3806
+ "navItems": [
3807
+ {
3808
+ "label": "Sensors",
3809
+ "href": "/sensors",
3810
+ "icon": "layout-list"
3811
+ },
3812
+ {
3813
+ "label": "Devices",
3814
+ "href": "/devices",
3815
+ "icon": "cpu"
3816
+ },
3817
+ {
3818
+ "label": "Alerts",
3819
+ "href": "/alerts",
3820
+ "icon": "bell"
3821
+ }
3822
+ ],
2872
3823
  "children": [
2873
3824
  {
2874
3825
  "type": "stack",
2875
- "direction": "horizontal",
2876
- "gap": "md",
2877
- "align": "center",
2878
- "justify": "space-between",
3826
+ "direction": "vertical",
3827
+ "gap": "lg",
2879
3828
  "children": [
2880
3829
  {
2881
3830
  "type": "stack",
2882
3831
  "direction": "horizontal",
2883
3832
  "gap": "md",
2884
3833
  "align": "center",
3834
+ "justify": "space-between",
2885
3835
  "children": [
2886
3836
  {
2887
- "type": "icon",
2888
- "name": "bell",
2889
- "size": "lg"
3837
+ "type": "stack",
3838
+ "direction": "horizontal",
3839
+ "gap": "md",
3840
+ "align": "center",
3841
+ "children": [
3842
+ {
3843
+ "type": "icon",
3844
+ "name": "bell",
3845
+ "size": "lg"
3846
+ },
3847
+ {
3848
+ "type": "typography",
3849
+ "content": "DeviceAlert",
3850
+ "variant": "h2"
3851
+ }
3852
+ ]
2890
3853
  },
2891
3854
  {
2892
- "type": "typography",
2893
- "content": "DeviceAlert",
2894
- "variant": "h2"
3855
+ "type": "status-dot",
3856
+ "status": "success",
3857
+ "pulse": false,
3858
+ "label": "Circuit Closed"
2895
3859
  }
2896
3860
  ]
2897
3861
  },
2898
3862
  {
2899
- "type": "status-dot",
2900
- "status": "success",
2901
- "pulse": false,
2902
- "label": "Circuit Closed"
2903
- }
2904
- ]
2905
- },
2906
- {
2907
- "type": "divider"
2908
- },
2909
- {
2910
- "type": "alert",
2911
- "variant": "success",
2912
- "message": "Service is healthy. All requests are being processed."
2913
- },
2914
- {
2915
- "type": "simple-grid",
2916
- "columns": 2,
2917
- "children": [
3863
+ "type": "divider"
3864
+ },
3865
+ {
3866
+ "type": "alert",
3867
+ "variant": "success",
3868
+ "message": "Service is healthy. All requests are being processed."
3869
+ },
2918
3870
  {
2919
- "type": "stat-display",
2920
- "label": "Failures",
3871
+ "type": "simple-grid",
3872
+ "columns": 2,
3873
+ "children": [
3874
+ {
3875
+ "type": "stat-display",
3876
+ "label": "Failures",
3877
+ "value": [
3878
+ "object/get",
3879
+ [
3880
+ "array/first",
3881
+ "@entity"
3882
+ ],
3883
+ "failureCount"
3884
+ ]
3885
+ },
3886
+ {
3887
+ "type": "stat-display",
3888
+ "label": "Successes",
3889
+ "value": [
3890
+ "object/get",
3891
+ [
3892
+ "array/first",
3893
+ "@entity"
3894
+ ],
3895
+ "successCount"
3896
+ ]
3897
+ }
3898
+ ]
3899
+ },
3900
+ {
3901
+ "type": "meter",
2921
3902
  "value": [
2922
3903
  "object/get",
2923
3904
  [
@@ -2925,41 +3906,18 @@
2925
3906
  "@entity"
2926
3907
  ],
2927
3908
  "failureCount"
2928
- ]
2929
- },
2930
- {
2931
- "type": "stat-display",
2932
- "label": "Successes",
2933
- "value": [
3909
+ ],
3910
+ "min": 0,
3911
+ "max": [
2934
3912
  "object/get",
2935
3913
  [
2936
3914
  "array/first",
2937
3915
  "@entity"
2938
3916
  ],
2939
- "successCount"
3917
+ "threshold"
2940
3918
  ]
2941
3919
  }
2942
3920
  ]
2943
- },
2944
- {
2945
- "type": "meter",
2946
- "value": [
2947
- "object/get",
2948
- [
2949
- "array/first",
2950
- "@entity"
2951
- ],
2952
- "failureCount"
2953
- ],
2954
- "min": 0,
2955
- "max": [
2956
- "object/get",
2957
- [
2958
- "array/first",
2959
- "@entity"
2960
- ],
2961
- "threshold"
2962
- ]
2963
3921
  }
2964
3922
  ]
2965
3923
  }
@@ -2975,58 +3933,104 @@
2975
3933
  "render-ui",
2976
3934
  "main",
2977
3935
  {
2978
- "type": "stack",
2979
- "direction": "vertical",
2980
- "gap": "lg",
3936
+ "type": "dashboard-layout",
3937
+ "appName": "IoT Dashboard",
3938
+ "navItems": [
3939
+ {
3940
+ "label": "Sensors",
3941
+ "href": "/sensors",
3942
+ "icon": "layout-list"
3943
+ },
3944
+ {
3945
+ "label": "Devices",
3946
+ "href": "/devices",
3947
+ "icon": "cpu"
3948
+ },
3949
+ {
3950
+ "label": "Alerts",
3951
+ "href": "/alerts",
3952
+ "icon": "bell"
3953
+ }
3954
+ ],
2981
3955
  "children": [
2982
3956
  {
2983
3957
  "type": "stack",
2984
- "direction": "horizontal",
2985
- "gap": "md",
2986
- "align": "center",
2987
- "justify": "space-between",
3958
+ "direction": "vertical",
3959
+ "gap": "lg",
2988
3960
  "children": [
2989
3961
  {
2990
3962
  "type": "stack",
2991
3963
  "direction": "horizontal",
2992
3964
  "gap": "md",
2993
3965
  "align": "center",
3966
+ "justify": "space-between",
2994
3967
  "children": [
2995
3968
  {
2996
- "type": "icon",
2997
- "name": "alert-triangle",
2998
- "size": "lg"
3969
+ "type": "stack",
3970
+ "direction": "horizontal",
3971
+ "gap": "md",
3972
+ "align": "center",
3973
+ "children": [
3974
+ {
3975
+ "type": "icon",
3976
+ "name": "alert-triangle",
3977
+ "size": "lg"
3978
+ },
3979
+ {
3980
+ "type": "typography",
3981
+ "content": "DeviceAlert",
3982
+ "variant": "h2"
3983
+ }
3984
+ ]
2999
3985
  },
3000
3986
  {
3001
- "type": "typography",
3002
- "content": "DeviceAlert",
3003
- "variant": "h2"
3987
+ "type": "status-dot",
3988
+ "status": "error",
3989
+ "pulse": true,
3990
+ "label": "Circuit Open"
3004
3991
  }
3005
3992
  ]
3006
3993
  },
3007
3994
  {
3008
- "type": "status-dot",
3009
- "status": "error",
3010
- "pulse": true,
3011
- "label": "Circuit Open"
3012
- }
3013
- ]
3014
- },
3015
- {
3016
- "type": "divider"
3017
- },
3018
- {
3019
- "type": "alert",
3020
- "variant": "danger",
3021
- "message": "Circuit is open. Requests are being rejected to prevent cascading failures."
3022
- },
3023
- {
3024
- "type": "simple-grid",
3025
- "columns": 2,
3026
- "children": [
3995
+ "type": "divider"
3996
+ },
3997
+ {
3998
+ "type": "alert",
3999
+ "variant": "danger",
4000
+ "message": "Circuit is open. Requests are being rejected to prevent cascading failures."
4001
+ },
4002
+ {
4003
+ "type": "simple-grid",
4004
+ "columns": 2,
4005
+ "children": [
4006
+ {
4007
+ "type": "stat-display",
4008
+ "label": "Failures",
4009
+ "value": [
4010
+ "object/get",
4011
+ [
4012
+ "array/first",
4013
+ "@entity"
4014
+ ],
4015
+ "failureCount"
4016
+ ]
4017
+ },
4018
+ {
4019
+ "type": "stat-display",
4020
+ "label": "Successes",
4021
+ "value": [
4022
+ "object/get",
4023
+ [
4024
+ "array/first",
4025
+ "@entity"
4026
+ ],
4027
+ "successCount"
4028
+ ]
4029
+ }
4030
+ ]
4031
+ },
3027
4032
  {
3028
- "type": "stat-display",
3029
- "label": "Failures",
4033
+ "type": "meter",
3030
4034
  "value": [
3031
4035
  "object/get",
3032
4036
  [
@@ -3034,48 +4038,25 @@
3034
4038
  "@entity"
3035
4039
  ],
3036
4040
  "failureCount"
3037
- ]
3038
- },
3039
- {
3040
- "type": "stat-display",
3041
- "label": "Successes",
3042
- "value": [
4041
+ ],
4042
+ "min": 0,
4043
+ "max": [
3043
4044
  "object/get",
3044
4045
  [
3045
4046
  "array/first",
3046
4047
  "@entity"
3047
4048
  ],
3048
- "successCount"
4049
+ "threshold"
3049
4050
  ]
4051
+ },
4052
+ {
4053
+ "type": "button",
4054
+ "label": "Reset",
4055
+ "event": "RESET",
4056
+ "variant": "ghost",
4057
+ "icon": "rotate-ccw"
3050
4058
  }
3051
4059
  ]
3052
- },
3053
- {
3054
- "type": "meter",
3055
- "value": [
3056
- "object/get",
3057
- [
3058
- "array/first",
3059
- "@entity"
3060
- ],
3061
- "failureCount"
3062
- ],
3063
- "min": 0,
3064
- "max": [
3065
- "object/get",
3066
- [
3067
- "array/first",
3068
- "@entity"
3069
- ],
3070
- "threshold"
3071
- ]
3072
- },
3073
- {
3074
- "type": "button",
3075
- "label": "Reset",
3076
- "event": "RESET",
3077
- "variant": "ghost",
3078
- "icon": "rotate-ccw"
3079
4060
  }
3080
4061
  ]
3081
4062
  }
@@ -3091,58 +4072,104 @@
3091
4072
  "render-ui",
3092
4073
  "main",
3093
4074
  {
3094
- "type": "stack",
3095
- "direction": "vertical",
3096
- "gap": "lg",
4075
+ "type": "dashboard-layout",
4076
+ "appName": "IoT Dashboard",
4077
+ "navItems": [
4078
+ {
4079
+ "label": "Sensors",
4080
+ "href": "/sensors",
4081
+ "icon": "layout-list"
4082
+ },
4083
+ {
4084
+ "label": "Devices",
4085
+ "href": "/devices",
4086
+ "icon": "cpu"
4087
+ },
4088
+ {
4089
+ "label": "Alerts",
4090
+ "href": "/alerts",
4091
+ "icon": "bell"
4092
+ }
4093
+ ],
3097
4094
  "children": [
3098
4095
  {
3099
4096
  "type": "stack",
3100
- "direction": "horizontal",
3101
- "gap": "md",
3102
- "align": "center",
3103
- "justify": "space-between",
4097
+ "direction": "vertical",
4098
+ "gap": "lg",
3104
4099
  "children": [
3105
4100
  {
3106
4101
  "type": "stack",
3107
4102
  "direction": "horizontal",
3108
4103
  "gap": "md",
3109
4104
  "align": "center",
4105
+ "justify": "space-between",
3110
4106
  "children": [
3111
4107
  {
3112
- "type": "icon",
3113
- "name": "bell",
3114
- "size": "lg"
4108
+ "type": "stack",
4109
+ "direction": "horizontal",
4110
+ "gap": "md",
4111
+ "align": "center",
4112
+ "children": [
4113
+ {
4114
+ "type": "icon",
4115
+ "name": "bell",
4116
+ "size": "lg"
4117
+ },
4118
+ {
4119
+ "type": "typography",
4120
+ "content": "DeviceAlert",
4121
+ "variant": "h2"
4122
+ }
4123
+ ]
3115
4124
  },
3116
4125
  {
3117
- "type": "typography",
3118
- "content": "DeviceAlert",
3119
- "variant": "h2"
4126
+ "type": "status-dot",
4127
+ "status": "success",
4128
+ "pulse": false,
4129
+ "label": "Circuit Closed"
3120
4130
  }
3121
4131
  ]
3122
4132
  },
3123
4133
  {
3124
- "type": "status-dot",
3125
- "status": "success",
3126
- "pulse": false,
3127
- "label": "Circuit Closed"
3128
- }
3129
- ]
3130
- },
3131
- {
3132
- "type": "divider"
3133
- },
3134
- {
3135
- "type": "alert",
3136
- "variant": "success",
3137
- "message": "Service is healthy. All requests are being processed."
3138
- },
3139
- {
3140
- "type": "simple-grid",
3141
- "columns": 2,
3142
- "children": [
4134
+ "type": "divider"
4135
+ },
4136
+ {
4137
+ "type": "alert",
4138
+ "variant": "success",
4139
+ "message": "Service is healthy. All requests are being processed."
4140
+ },
4141
+ {
4142
+ "type": "simple-grid",
4143
+ "columns": 2,
4144
+ "children": [
4145
+ {
4146
+ "type": "stat-display",
4147
+ "label": "Failures",
4148
+ "value": [
4149
+ "object/get",
4150
+ [
4151
+ "array/first",
4152
+ "@entity"
4153
+ ],
4154
+ "failureCount"
4155
+ ]
4156
+ },
4157
+ {
4158
+ "type": "stat-display",
4159
+ "label": "Successes",
4160
+ "value": [
4161
+ "object/get",
4162
+ [
4163
+ "array/first",
4164
+ "@entity"
4165
+ ],
4166
+ "successCount"
4167
+ ]
4168
+ }
4169
+ ]
4170
+ },
3143
4171
  {
3144
- "type": "stat-display",
3145
- "label": "Failures",
4172
+ "type": "meter",
3146
4173
  "value": [
3147
4174
  "object/get",
3148
4175
  [
@@ -3150,41 +4177,18 @@
3150
4177
  "@entity"
3151
4178
  ],
3152
4179
  "failureCount"
3153
- ]
3154
- },
3155
- {
3156
- "type": "stat-display",
3157
- "label": "Successes",
3158
- "value": [
4180
+ ],
4181
+ "min": 0,
4182
+ "max": [
3159
4183
  "object/get",
3160
4184
  [
3161
4185
  "array/first",
3162
4186
  "@entity"
3163
4187
  ],
3164
- "successCount"
4188
+ "threshold"
3165
4189
  ]
3166
4190
  }
3167
4191
  ]
3168
- },
3169
- {
3170
- "type": "meter",
3171
- "value": [
3172
- "object/get",
3173
- [
3174
- "array/first",
3175
- "@entity"
3176
- ],
3177
- "failureCount"
3178
- ],
3179
- "min": 0,
3180
- "max": [
3181
- "object/get",
3182
- [
3183
- "array/first",
3184
- "@entity"
3185
- ],
3186
- "threshold"
3187
- ]
3188
4192
  }
3189
4193
  ]
3190
4194
  }