@almadar/std 3.2.1 → 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 (295) hide show
  1. package/behaviors/exports/atoms/std-async.orb +41 -24
  2. package/behaviors/exports/atoms/std-browse.orb +44 -44
  3. package/behaviors/exports/atoms/std-cache-aside.orb +256 -42
  4. package/behaviors/exports/atoms/std-calendar.orb +770 -0
  5. package/behaviors/exports/atoms/std-circuit-breaker.orb +577 -97
  6. package/behaviors/exports/atoms/std-collision.orb +278 -206
  7. package/behaviors/exports/atoms/std-combat-log.orb +6 -1
  8. package/behaviors/exports/atoms/std-combat.orb +6 -1
  9. package/behaviors/exports/atoms/std-confirmation.orb +212 -7
  10. package/behaviors/exports/atoms/std-dialogue-box.orb +6 -1
  11. package/behaviors/exports/atoms/std-display.orb +1186 -376
  12. package/behaviors/exports/atoms/std-drawer.orb +307 -101
  13. package/behaviors/exports/atoms/std-filter.orb +211 -18
  14. package/behaviors/exports/atoms/std-flip-card.orb +596 -0
  15. package/behaviors/exports/atoms/std-gallery.orb +382 -0
  16. package/behaviors/exports/atoms/std-game-audio.orb +6 -1
  17. package/behaviors/exports/atoms/std-game-canvas2d.orb +6 -1
  18. package/behaviors/exports/atoms/std-game-canvas3d.orb +6 -1
  19. package/behaviors/exports/atoms/std-game-hud.orb +6 -1
  20. package/behaviors/exports/atoms/std-game-menu.orb +6 -1
  21. package/behaviors/exports/atoms/std-game-over-screen.orb +6 -1
  22. package/behaviors/exports/atoms/std-gameflow.orb +100 -5
  23. package/behaviors/exports/atoms/std-input.orb +142 -137
  24. package/behaviors/exports/atoms/std-inventory-panel.orb +6 -1
  25. package/behaviors/exports/atoms/std-isometric-canvas.orb +6 -1
  26. package/behaviors/exports/atoms/std-loading.orb +149 -170
  27. package/behaviors/exports/atoms/std-modal.orb +159 -94
  28. package/behaviors/exports/atoms/std-movement.orb +401 -31
  29. package/behaviors/exports/atoms/std-notification.orb +117 -95
  30. package/behaviors/exports/atoms/std-overworld.orb +44 -16
  31. package/behaviors/exports/atoms/std-pagination.orb +44 -115
  32. package/behaviors/exports/atoms/std-physics2d.orb +6 -1
  33. package/behaviors/exports/atoms/std-platformer-canvas.orb +6 -1
  34. package/behaviors/exports/atoms/std-quest.orb +309 -34
  35. package/behaviors/exports/atoms/std-rate-limiter.orb +410 -157
  36. package/behaviors/exports/atoms/std-rating.orb +328 -0
  37. package/behaviors/exports/atoms/std-score-board.orb +6 -1
  38. package/behaviors/exports/atoms/std-score.orb +252 -11
  39. package/behaviors/exports/atoms/std-search.orb +62 -47
  40. package/behaviors/exports/atoms/std-selection.orb +180 -149
  41. package/behaviors/exports/atoms/std-simulation-canvas.orb +6 -1
  42. package/behaviors/exports/atoms/std-sort.orb +192 -60
  43. package/behaviors/exports/atoms/std-sprite.orb +6 -1
  44. package/behaviors/exports/atoms/std-tabs.orb +25 -15
  45. package/behaviors/exports/atoms/std-text-effects.orb +658 -0
  46. package/behaviors/exports/atoms/std-theme.orb +573 -0
  47. package/behaviors/exports/atoms/std-timer.orb +483 -91
  48. package/behaviors/exports/atoms/std-undo.orb +211 -81
  49. package/behaviors/exports/atoms/std-upload.orb +535 -0
  50. package/behaviors/exports/atoms/std-wizard.orb +677 -240
  51. package/behaviors/exports/molecules/std-builder-game.orb +49 -4
  52. package/behaviors/exports/molecules/std-cart.orb +325 -102
  53. package/behaviors/exports/molecules/std-classifier-game.orb +49 -4
  54. package/behaviors/exports/molecules/std-debugger-game.orb +49 -4
  55. package/behaviors/exports/molecules/std-detail.orb +52 -48
  56. package/behaviors/exports/molecules/std-event-handler-game.orb +49 -4
  57. package/behaviors/exports/molecules/std-form-advanced.orb +654 -0
  58. package/behaviors/exports/molecules/std-geospatial.orb +70 -51
  59. package/behaviors/exports/molecules/std-inventory.orb +92 -53
  60. package/behaviors/exports/molecules/std-list.orb +416 -52
  61. package/behaviors/exports/molecules/std-messaging.orb +41 -49
  62. package/behaviors/exports/molecules/std-negotiator-game.orb +49 -4
  63. package/behaviors/exports/molecules/std-platformer-game.orb +58 -3
  64. package/behaviors/exports/molecules/std-puzzle-game.orb +58 -7
  65. package/behaviors/exports/molecules/std-quiz.orb +1045 -0
  66. package/behaviors/exports/molecules/std-sequencer-game.orb +49 -4
  67. package/behaviors/exports/molecules/std-simulator-game.orb +49 -4
  68. package/behaviors/exports/molecules/std-turn-based-battle.orb +66 -1
  69. package/behaviors/exports/organisms/std-api-gateway.orb +2615 -867
  70. package/behaviors/exports/organisms/std-arcade-game.orb +399 -197
  71. package/behaviors/exports/organisms/std-booking-system.orb +3154 -1305
  72. package/behaviors/exports/organisms/std-cicd-pipeline.orb +2298 -779
  73. package/behaviors/exports/organisms/std-cms.orb +1150 -277
  74. package/behaviors/exports/organisms/std-coding-academy.orb +1222 -533
  75. package/behaviors/exports/organisms/std-crm.orb +2357 -821
  76. package/behaviors/exports/organisms/std-devops-dashboard.orb +4230 -1281
  77. package/behaviors/exports/organisms/std-ecommerce.orb +2660 -1098
  78. package/behaviors/exports/organisms/std-finance-tracker.orb +1749 -737
  79. package/behaviors/exports/organisms/std-healthcare.orb +3593 -1478
  80. package/behaviors/exports/organisms/std-helpdesk.orb +1870 -738
  81. package/behaviors/exports/organisms/std-hr-portal.orb +3290 -1385
  82. package/behaviors/exports/organisms/std-iot-dashboard.orb +2704 -788
  83. package/behaviors/exports/organisms/std-lms.orb +2548 -1192
  84. package/behaviors/exports/organisms/std-logic-training.orb +220 -66
  85. package/behaviors/exports/organisms/std-platformer-app.orb +373 -194
  86. package/behaviors/exports/organisms/std-project-manager.orb +2347 -806
  87. package/behaviors/exports/organisms/std-puzzle-app.orb +240 -95
  88. package/behaviors/exports/organisms/std-realtime-chat.orb +2020 -660
  89. package/behaviors/exports/organisms/std-rpg-game.orb +1303 -740
  90. package/behaviors/exports/organisms/std-social-feed.orb +184 -168
  91. package/behaviors/exports/organisms/std-stem-lab.orb +1223 -512
  92. package/behaviors/exports/organisms/std-strategy-game.orb +1412 -731
  93. package/behaviors/exports/organisms/std-trading-dashboard.orb +1869 -695
  94. package/behaviors/exports/validation-report.json +3 -750
  95. package/behaviors/exports/verify-results.json +13 -0
  96. package/dist/behaviors/exports/atoms/std-async.orb +41 -24
  97. package/dist/behaviors/exports/atoms/std-browse.orb +44 -44
  98. package/dist/behaviors/exports/atoms/std-cache-aside.orb +256 -42
  99. package/dist/behaviors/exports/atoms/std-calendar.orb +770 -0
  100. package/dist/behaviors/exports/atoms/std-circuit-breaker.orb +577 -97
  101. package/dist/behaviors/exports/atoms/std-collision.orb +278 -206
  102. package/dist/behaviors/exports/atoms/std-combat-log.orb +6 -1
  103. package/dist/behaviors/exports/atoms/std-combat.orb +6 -1
  104. package/dist/behaviors/exports/atoms/std-confirmation.orb +212 -7
  105. package/dist/behaviors/exports/atoms/std-dialogue-box.orb +6 -1
  106. package/dist/behaviors/exports/atoms/std-display.orb +1186 -376
  107. package/dist/behaviors/exports/atoms/std-drawer.orb +307 -101
  108. package/dist/behaviors/exports/atoms/std-filter.orb +211 -18
  109. package/dist/behaviors/exports/atoms/std-flip-card.orb +596 -0
  110. package/dist/behaviors/exports/atoms/std-gallery.orb +382 -0
  111. package/dist/behaviors/exports/atoms/std-game-audio.orb +6 -1
  112. package/dist/behaviors/exports/atoms/std-game-canvas2d.orb +6 -1
  113. package/dist/behaviors/exports/atoms/std-game-canvas3d.orb +6 -1
  114. package/dist/behaviors/exports/atoms/std-game-hud.orb +6 -1
  115. package/dist/behaviors/exports/atoms/std-game-menu.orb +6 -1
  116. package/dist/behaviors/exports/atoms/std-game-over-screen.orb +6 -1
  117. package/dist/behaviors/exports/atoms/std-gameflow.orb +100 -5
  118. package/dist/behaviors/exports/atoms/std-input.orb +142 -137
  119. package/dist/behaviors/exports/atoms/std-inventory-panel.orb +6 -1
  120. package/dist/behaviors/exports/atoms/std-isometric-canvas.orb +6 -1
  121. package/dist/behaviors/exports/atoms/std-loading.orb +149 -170
  122. package/dist/behaviors/exports/atoms/std-modal.orb +159 -94
  123. package/dist/behaviors/exports/atoms/std-movement.orb +401 -31
  124. package/dist/behaviors/exports/atoms/std-notification.orb +117 -95
  125. package/dist/behaviors/exports/atoms/std-overworld.orb +44 -16
  126. package/dist/behaviors/exports/atoms/std-pagination.orb +44 -115
  127. package/dist/behaviors/exports/atoms/std-physics2d.orb +6 -1
  128. package/dist/behaviors/exports/atoms/std-platformer-canvas.orb +6 -1
  129. package/dist/behaviors/exports/atoms/std-quest.orb +309 -34
  130. package/dist/behaviors/exports/atoms/std-rate-limiter.orb +410 -157
  131. package/dist/behaviors/exports/atoms/std-rating.orb +328 -0
  132. package/dist/behaviors/exports/atoms/std-score-board.orb +6 -1
  133. package/dist/behaviors/exports/atoms/std-score.orb +252 -11
  134. package/dist/behaviors/exports/atoms/std-search.orb +62 -47
  135. package/dist/behaviors/exports/atoms/std-selection.orb +180 -149
  136. package/dist/behaviors/exports/atoms/std-simulation-canvas.orb +6 -1
  137. package/dist/behaviors/exports/atoms/std-sort.orb +192 -60
  138. package/dist/behaviors/exports/atoms/std-sprite.orb +6 -1
  139. package/dist/behaviors/exports/atoms/std-tabs.orb +25 -15
  140. package/dist/behaviors/exports/atoms/std-text-effects.orb +658 -0
  141. package/dist/behaviors/exports/atoms/std-theme.orb +573 -0
  142. package/dist/behaviors/exports/atoms/std-timer.orb +483 -91
  143. package/dist/behaviors/exports/atoms/std-undo.orb +211 -81
  144. package/dist/behaviors/exports/atoms/std-upload.orb +535 -0
  145. package/dist/behaviors/exports/atoms/std-wizard.orb +677 -240
  146. package/dist/behaviors/exports/molecules/std-builder-game.orb +49 -4
  147. package/dist/behaviors/exports/molecules/std-cart.orb +325 -102
  148. package/dist/behaviors/exports/molecules/std-classifier-game.orb +49 -4
  149. package/dist/behaviors/exports/molecules/std-debugger-game.orb +49 -4
  150. package/dist/behaviors/exports/molecules/std-detail.orb +52 -48
  151. package/dist/behaviors/exports/molecules/std-event-handler-game.orb +49 -4
  152. package/dist/behaviors/exports/molecules/std-form-advanced.orb +654 -0
  153. package/dist/behaviors/exports/molecules/std-geospatial.orb +70 -51
  154. package/dist/behaviors/exports/molecules/std-inventory.orb +92 -53
  155. package/dist/behaviors/exports/molecules/std-list.orb +416 -52
  156. package/dist/behaviors/exports/molecules/std-messaging.orb +41 -49
  157. package/dist/behaviors/exports/molecules/std-negotiator-game.orb +49 -4
  158. package/dist/behaviors/exports/molecules/std-platformer-game.orb +58 -3
  159. package/dist/behaviors/exports/molecules/std-puzzle-game.orb +58 -7
  160. package/dist/behaviors/exports/molecules/std-quiz.orb +1045 -0
  161. package/dist/behaviors/exports/molecules/std-sequencer-game.orb +49 -4
  162. package/dist/behaviors/exports/molecules/std-simulator-game.orb +49 -4
  163. package/dist/behaviors/exports/molecules/std-turn-based-battle.orb +66 -1
  164. package/dist/behaviors/exports/organisms/std-api-gateway.orb +2615 -867
  165. package/dist/behaviors/exports/organisms/std-arcade-game.orb +399 -197
  166. package/dist/behaviors/exports/organisms/std-booking-system.orb +3154 -1305
  167. package/dist/behaviors/exports/organisms/std-cicd-pipeline.orb +2298 -779
  168. package/dist/behaviors/exports/organisms/std-cms.orb +1150 -277
  169. package/dist/behaviors/exports/organisms/std-coding-academy.orb +1222 -533
  170. package/dist/behaviors/exports/organisms/std-crm.orb +2357 -821
  171. package/dist/behaviors/exports/organisms/std-devops-dashboard.orb +4230 -1281
  172. package/dist/behaviors/exports/organisms/std-ecommerce.orb +2660 -1098
  173. package/dist/behaviors/exports/organisms/std-finance-tracker.orb +1749 -737
  174. package/dist/behaviors/exports/organisms/std-healthcare.orb +3593 -1478
  175. package/dist/behaviors/exports/organisms/std-helpdesk.orb +1870 -738
  176. package/dist/behaviors/exports/organisms/std-hr-portal.orb +3290 -1385
  177. package/dist/behaviors/exports/organisms/std-iot-dashboard.orb +2704 -788
  178. package/dist/behaviors/exports/organisms/std-lms.orb +2548 -1192
  179. package/dist/behaviors/exports/organisms/std-logic-training.orb +220 -66
  180. package/dist/behaviors/exports/organisms/std-platformer-app.orb +373 -194
  181. package/dist/behaviors/exports/organisms/std-project-manager.orb +2347 -806
  182. package/dist/behaviors/exports/organisms/std-puzzle-app.orb +240 -95
  183. package/dist/behaviors/exports/organisms/std-realtime-chat.orb +2020 -660
  184. package/dist/behaviors/exports/organisms/std-rpg-game.orb +1303 -740
  185. package/dist/behaviors/exports/organisms/std-social-feed.orb +184 -168
  186. package/dist/behaviors/exports/organisms/std-stem-lab.orb +1223 -512
  187. package/dist/behaviors/exports/organisms/std-strategy-game.orb +1412 -731
  188. package/dist/behaviors/exports/organisms/std-trading-dashboard.orb +1869 -695
  189. package/dist/behaviors/exports/validation-report.json +3 -750
  190. package/dist/behaviors/exports/verify-results.json +13 -0
  191. package/dist/behaviors/functions/index.d.ts +270 -1
  192. package/dist/behaviors/functions/index.js +3811 -1333
  193. package/dist/behaviors/functions/index.js.map +1 -1
  194. package/dist/behaviors/index.d.ts +1 -1
  195. package/dist/behaviors/index.js +3811 -1333
  196. package/dist/behaviors/index.js.map +1 -1
  197. package/dist/exports/atoms/std-async.orb +41 -24
  198. package/dist/exports/atoms/std-browse.orb +44 -44
  199. package/dist/exports/atoms/std-cache-aside.orb +256 -42
  200. package/dist/exports/atoms/std-calendar.orb +770 -0
  201. package/dist/exports/atoms/std-circuit-breaker.orb +577 -97
  202. package/dist/exports/atoms/std-collision.orb +278 -206
  203. package/dist/exports/atoms/std-combat-log.orb +6 -1
  204. package/dist/exports/atoms/std-combat.orb +6 -1
  205. package/dist/exports/atoms/std-confirmation.orb +212 -7
  206. package/dist/exports/atoms/std-dialogue-box.orb +6 -1
  207. package/dist/exports/atoms/std-display.orb +1186 -376
  208. package/dist/exports/atoms/std-drawer.orb +307 -101
  209. package/dist/exports/atoms/std-filter.orb +211 -18
  210. package/dist/exports/atoms/std-flip-card.orb +596 -0
  211. package/dist/exports/atoms/std-gallery.orb +382 -0
  212. package/dist/exports/atoms/std-game-audio.orb +6 -1
  213. package/dist/exports/atoms/std-game-canvas2d.orb +6 -1
  214. package/dist/exports/atoms/std-game-canvas3d.orb +6 -1
  215. package/dist/exports/atoms/std-game-hud.orb +6 -1
  216. package/dist/exports/atoms/std-game-menu.orb +6 -1
  217. package/dist/exports/atoms/std-game-over-screen.orb +6 -1
  218. package/dist/exports/atoms/std-gameflow.orb +100 -5
  219. package/dist/exports/atoms/std-input.orb +142 -137
  220. package/dist/exports/atoms/std-inventory-panel.orb +6 -1
  221. package/dist/exports/atoms/std-isometric-canvas.orb +6 -1
  222. package/dist/exports/atoms/std-loading.orb +149 -170
  223. package/dist/exports/atoms/std-modal.orb +159 -94
  224. package/dist/exports/atoms/std-movement.orb +401 -31
  225. package/dist/exports/atoms/std-notification.orb +117 -95
  226. package/dist/exports/atoms/std-overworld.orb +44 -16
  227. package/dist/exports/atoms/std-pagination.orb +44 -115
  228. package/dist/exports/atoms/std-physics2d.orb +6 -1
  229. package/dist/exports/atoms/std-platformer-canvas.orb +6 -1
  230. package/dist/exports/atoms/std-quest.orb +309 -34
  231. package/dist/exports/atoms/std-rate-limiter.orb +410 -157
  232. package/dist/exports/atoms/std-rating.orb +328 -0
  233. package/dist/exports/atoms/std-score-board.orb +6 -1
  234. package/dist/exports/atoms/std-score.orb +252 -11
  235. package/dist/exports/atoms/std-search.orb +62 -47
  236. package/dist/exports/atoms/std-selection.orb +180 -149
  237. package/dist/exports/atoms/std-simulation-canvas.orb +6 -1
  238. package/dist/exports/atoms/std-sort.orb +192 -60
  239. package/dist/exports/atoms/std-sprite.orb +6 -1
  240. package/dist/exports/atoms/std-tabs.orb +25 -15
  241. package/dist/exports/atoms/std-text-effects.orb +658 -0
  242. package/dist/exports/atoms/std-theme.orb +573 -0
  243. package/dist/exports/atoms/std-timer.orb +483 -91
  244. package/dist/exports/atoms/std-undo.orb +211 -81
  245. package/dist/exports/atoms/std-upload.orb +535 -0
  246. package/dist/exports/atoms/std-wizard.orb +677 -240
  247. package/dist/exports/molecules/std-builder-game.orb +49 -4
  248. package/dist/exports/molecules/std-cart.orb +325 -102
  249. package/dist/exports/molecules/std-classifier-game.orb +49 -4
  250. package/dist/exports/molecules/std-debugger-game.orb +49 -4
  251. package/dist/exports/molecules/std-detail.orb +52 -48
  252. package/dist/exports/molecules/std-event-handler-game.orb +49 -4
  253. package/dist/exports/molecules/std-form-advanced.orb +654 -0
  254. package/dist/exports/molecules/std-geospatial.orb +70 -51
  255. package/dist/exports/molecules/std-inventory.orb +92 -53
  256. package/dist/exports/molecules/std-list.orb +416 -52
  257. package/dist/exports/molecules/std-messaging.orb +41 -49
  258. package/dist/exports/molecules/std-negotiator-game.orb +49 -4
  259. package/dist/exports/molecules/std-platformer-game.orb +58 -3
  260. package/dist/exports/molecules/std-puzzle-game.orb +58 -7
  261. package/dist/exports/molecules/std-quiz.orb +1045 -0
  262. package/dist/exports/molecules/std-sequencer-game.orb +49 -4
  263. package/dist/exports/molecules/std-simulator-game.orb +49 -4
  264. package/dist/exports/molecules/std-turn-based-battle.orb +66 -1
  265. package/dist/exports/organisms/std-api-gateway.orb +2615 -867
  266. package/dist/exports/organisms/std-arcade-game.orb +399 -197
  267. package/dist/exports/organisms/std-booking-system.orb +3154 -1305
  268. package/dist/exports/organisms/std-cicd-pipeline.orb +2298 -779
  269. package/dist/exports/organisms/std-cms.orb +1150 -277
  270. package/dist/exports/organisms/std-coding-academy.orb +1222 -533
  271. package/dist/exports/organisms/std-crm.orb +2357 -821
  272. package/dist/exports/organisms/std-devops-dashboard.orb +4230 -1281
  273. package/dist/exports/organisms/std-ecommerce.orb +2660 -1098
  274. package/dist/exports/organisms/std-finance-tracker.orb +1749 -737
  275. package/dist/exports/organisms/std-healthcare.orb +3593 -1478
  276. package/dist/exports/organisms/std-helpdesk.orb +1870 -738
  277. package/dist/exports/organisms/std-hr-portal.orb +3290 -1385
  278. package/dist/exports/organisms/std-iot-dashboard.orb +2704 -788
  279. package/dist/exports/organisms/std-lms.orb +2548 -1192
  280. package/dist/exports/organisms/std-logic-training.orb +220 -66
  281. package/dist/exports/organisms/std-platformer-app.orb +373 -194
  282. package/dist/exports/organisms/std-project-manager.orb +2347 -806
  283. package/dist/exports/organisms/std-puzzle-app.orb +240 -95
  284. package/dist/exports/organisms/std-realtime-chat.orb +2020 -660
  285. package/dist/exports/organisms/std-rpg-game.orb +1303 -740
  286. package/dist/exports/organisms/std-social-feed.orb +184 -168
  287. package/dist/exports/organisms/std-stem-lab.orb +1223 -512
  288. package/dist/exports/organisms/std-strategy-game.orb +1412 -731
  289. package/dist/exports/organisms/std-trading-dashboard.orb +1869 -695
  290. package/dist/exports/validation-report.json +3 -750
  291. package/dist/exports/verify-results.json +13 -0
  292. package/dist/index.d.ts +1 -1
  293. package/dist/index.js +3808 -1330
  294. package/dist/index.js.map +1 -1
  295. package/package.json +1 -1
@@ -83,134 +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": "@entity.sensorId"
122
+ "label": "Sensor Readings"
146
123
  }
147
124
  ]
148
- }
149
- ]
150
- },
151
- {
152
- "type": "card",
153
- "children": [
125
+ },
154
126
  {
155
127
  "type": "stack",
156
- "direction": "vertical",
157
- "gap": "sm",
128
+ "direction": "horizontal",
129
+ "gap": "md",
130
+ "justify": "space-between",
158
131
  "children": [
159
132
  {
160
- "type": "typography",
161
- "variant": "caption",
162
- "content": "Value"
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
+ ]
163
148
  },
164
149
  {
165
- "type": "typography",
166
- "variant": "h3",
167
- "content": "@entity.value"
150
+ "type": "button",
151
+ "label": "Refresh",
152
+ "event": "REFRESH",
153
+ "variant": "secondary",
154
+ "icon": "refresh-cw"
168
155
  }
169
156
  ]
170
- }
171
- ]
172
- },
173
- {
174
- "type": "card",
175
- "children": [
157
+ },
176
158
  {
177
- "type": "stack",
178
- "direction": "vertical",
179
- "gap": "sm",
159
+ "type": "divider"
160
+ },
161
+ {
162
+ "type": "box",
163
+ "padding": "md",
180
164
  "children": [
181
165
  {
182
- "type": "typography",
183
- "variant": "caption",
184
- "content": "Unit"
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
+ }
268
+ ]
269
+ }
270
+ ]
271
+ },
272
+ {
273
+ "type": "divider"
274
+ },
275
+ {
276
+ "type": "grid",
277
+ "columns": 2,
278
+ "gap": "md",
279
+ "children": [
280
+ {
281
+ "type": "card",
282
+ "children": [
283
+ {
284
+ "type": "typography",
285
+ "variant": "caption",
286
+ "content": "Chart View"
287
+ }
288
+ ]
185
289
  },
186
290
  {
187
- "type": "typography",
188
- "variant": "h3",
189
- "content": "@entity.unit"
291
+ "type": "card",
292
+ "children": [
293
+ {
294
+ "type": "typography",
295
+ "variant": "caption",
296
+ "content": "Graph View"
297
+ }
298
+ ]
190
299
  }
191
300
  ]
192
- }
193
- ]
194
- },
195
- {
196
- "type": "card",
197
- "children": [
301
+ },
198
302
  {
199
- "type": "stack",
200
- "direction": "vertical",
201
- "gap": "sm",
202
- "children": [
303
+ "type": "line-chart",
304
+ "data": [
203
305
  {
204
- "type": "typography",
205
- "variant": "caption",
206
- "content": "Timestamp"
306
+ "date": "Jan",
307
+ "value": 12
207
308
  },
208
309
  {
209
- "type": "typography",
210
- "variant": "h3",
211
- "content": "@entity.timestamp"
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"
212
344
  }
213
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
214
381
  }
215
382
  ]
216
383
  }
@@ -234,134 +401,301 @@
234
401
  "render-ui",
235
402
  "main",
236
403
  {
237
- "type": "stack",
238
- "direction": "vertical",
239
- "gap": "lg",
240
- "children": [
404
+ "type": "dashboard-layout",
405
+ "appName": "IoT Dashboard",
406
+ "navItems": [
241
407
  {
242
- "type": "stack",
243
- "direction": "horizontal",
244
- "gap": "md",
245
- "justify": "space-between",
246
- "children": [
247
- {
248
- "type": "stack",
249
- "direction": "horizontal",
250
- "gap": "md",
251
- "children": [
252
- {
253
- "type": "icon",
254
- "name": "thermometer",
255
- "size": "lg"
256
- },
257
- {
258
- "type": "typography",
259
- "content": "Sensor Readings",
260
- "variant": "h2"
261
- }
262
- ]
263
- },
264
- {
265
- "type": "button",
266
- "label": "Refresh",
267
- "event": "REFRESH",
268
- "variant": "secondary",
269
- "icon": "refresh-cw"
270
- }
271
- ]
408
+ "label": "Sensors",
409
+ "href": "/sensors",
410
+ "icon": "layout-list"
272
411
  },
273
412
  {
274
- "type": "divider"
413
+ "label": "Devices",
414
+ "href": "/devices",
415
+ "icon": "cpu"
275
416
  },
276
417
  {
277
- "type": "simple-grid",
278
- "columns": 3,
418
+ "label": "Alerts",
419
+ "href": "/alerts",
420
+ "icon": "bell"
421
+ }
422
+ ],
423
+ "children": [
424
+ {
425
+ "type": "scaled-diagram",
279
426
  "children": [
280
427
  {
281
- "type": "card",
428
+ "type": "stack",
429
+ "direction": "vertical",
430
+ "gap": "lg",
282
431
  "children": [
283
432
  {
284
- "type": "stack",
285
- "direction": "vertical",
286
- "gap": "sm",
287
- "children": [
433
+ "type": "breadcrumb",
434
+ "items": [
288
435
  {
289
- "type": "typography",
290
- "variant": "caption",
291
- "content": "SensorId"
436
+ "label": "Home",
437
+ "href": "/"
292
438
  },
293
439
  {
294
- "type": "typography",
295
- "variant": "h3",
296
- "content": "@entity.sensorId"
440
+ "label": "Sensor Readings"
297
441
  }
298
442
  ]
299
- }
300
- ]
301
- },
302
- {
303
- "type": "card",
304
- "children": [
443
+ },
305
444
  {
306
445
  "type": "stack",
307
- "direction": "vertical",
308
- "gap": "sm",
446
+ "direction": "horizontal",
447
+ "gap": "md",
448
+ "justify": "space-between",
309
449
  "children": [
310
450
  {
311
- "type": "typography",
312
- "variant": "caption",
313
- "content": "Value"
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
+ ]
314
466
  },
315
467
  {
316
- "type": "typography",
317
- "variant": "h3",
318
- "content": "@entity.value"
468
+ "type": "button",
469
+ "label": "Refresh",
470
+ "event": "REFRESH",
471
+ "variant": "secondary",
472
+ "icon": "refresh-cw"
319
473
  }
320
474
  ]
321
- }
322
- ]
323
- },
324
- {
325
- "type": "card",
326
- "children": [
475
+ },
327
476
  {
328
- "type": "stack",
329
- "direction": "vertical",
330
- "gap": "sm",
477
+ "type": "divider"
478
+ },
479
+ {
480
+ "type": "box",
481
+ "padding": "md",
331
482
  "children": [
332
483
  {
333
- "type": "typography",
334
- "variant": "caption",
335
- "content": "Unit"
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
+ }
586
+ ]
587
+ }
588
+ ]
589
+ },
590
+ {
591
+ "type": "divider"
592
+ },
593
+ {
594
+ "type": "grid",
595
+ "columns": 2,
596
+ "gap": "md",
597
+ "children": [
598
+ {
599
+ "type": "card",
600
+ "children": [
601
+ {
602
+ "type": "typography",
603
+ "variant": "caption",
604
+ "content": "Chart View"
605
+ }
606
+ ]
336
607
  },
337
608
  {
338
- "type": "typography",
339
- "variant": "h3",
340
- "content": "@entity.unit"
609
+ "type": "card",
610
+ "children": [
611
+ {
612
+ "type": "typography",
613
+ "variant": "caption",
614
+ "content": "Graph View"
615
+ }
616
+ ]
341
617
  }
342
618
  ]
343
- }
344
- ]
345
- },
346
- {
347
- "type": "card",
348
- "children": [
619
+ },
349
620
  {
350
- "type": "stack",
351
- "direction": "vertical",
352
- "gap": "sm",
353
- "children": [
621
+ "type": "line-chart",
622
+ "data": [
354
623
  {
355
- "type": "typography",
356
- "variant": "caption",
357
- "content": "Timestamp"
624
+ "date": "Jan",
625
+ "value": 12
358
626
  },
359
627
  {
360
- "type": "typography",
361
- "variant": "h3",
362
- "content": "@entity.timestamp"
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"
363
662
  }
364
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
365
699
  }
366
700
  ]
367
701
  }
@@ -385,134 +719,301 @@
385
719
  "render-ui",
386
720
  "main",
387
721
  {
388
- "type": "stack",
389
- "direction": "vertical",
390
- "gap": "lg",
391
- "children": [
722
+ "type": "dashboard-layout",
723
+ "appName": "IoT Dashboard",
724
+ "navItems": [
392
725
  {
393
- "type": "stack",
394
- "direction": "horizontal",
395
- "gap": "md",
396
- "justify": "space-between",
397
- "children": [
398
- {
399
- "type": "stack",
400
- "direction": "horizontal",
401
- "gap": "md",
402
- "children": [
403
- {
404
- "type": "icon",
405
- "name": "thermometer",
406
- "size": "lg"
407
- },
408
- {
409
- "type": "typography",
410
- "content": "Sensor Readings",
411
- "variant": "h2"
412
- }
413
- ]
414
- },
415
- {
416
- "type": "button",
417
- "label": "Refresh",
418
- "event": "REFRESH",
419
- "variant": "secondary",
420
- "icon": "refresh-cw"
421
- }
422
- ]
726
+ "label": "Sensors",
727
+ "href": "/sensors",
728
+ "icon": "layout-list"
423
729
  },
424
730
  {
425
- "type": "divider"
731
+ "label": "Devices",
732
+ "href": "/devices",
733
+ "icon": "cpu"
426
734
  },
427
735
  {
428
- "type": "simple-grid",
429
- "columns": 3,
736
+ "label": "Alerts",
737
+ "href": "/alerts",
738
+ "icon": "bell"
739
+ }
740
+ ],
741
+ "children": [
742
+ {
743
+ "type": "scaled-diagram",
430
744
  "children": [
431
745
  {
432
- "type": "card",
746
+ "type": "stack",
747
+ "direction": "vertical",
748
+ "gap": "lg",
433
749
  "children": [
434
750
  {
435
- "type": "stack",
436
- "direction": "vertical",
437
- "gap": "sm",
438
- "children": [
751
+ "type": "breadcrumb",
752
+ "items": [
439
753
  {
440
- "type": "typography",
441
- "variant": "caption",
442
- "content": "SensorId"
754
+ "label": "Home",
755
+ "href": "/"
443
756
  },
444
757
  {
445
- "type": "typography",
446
- "variant": "h3",
447
- "content": "@entity.sensorId"
758
+ "label": "Sensor Readings"
448
759
  }
449
760
  ]
450
- }
451
- ]
452
- },
453
- {
454
- "type": "card",
455
- "children": [
761
+ },
456
762
  {
457
763
  "type": "stack",
458
- "direction": "vertical",
459
- "gap": "sm",
764
+ "direction": "horizontal",
765
+ "gap": "md",
766
+ "justify": "space-between",
460
767
  "children": [
461
768
  {
462
- "type": "typography",
463
- "variant": "caption",
464
- "content": "Value"
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
+ ]
465
784
  },
466
785
  {
467
- "type": "typography",
468
- "variant": "h3",
469
- "content": "@entity.value"
786
+ "type": "button",
787
+ "label": "Refresh",
788
+ "event": "REFRESH",
789
+ "variant": "secondary",
790
+ "icon": "refresh-cw"
470
791
  }
471
792
  ]
472
- }
473
- ]
474
- },
475
- {
476
- "type": "card",
477
- "children": [
793
+ },
478
794
  {
479
- "type": "stack",
480
- "direction": "vertical",
481
- "gap": "sm",
795
+ "type": "divider"
796
+ },
797
+ {
798
+ "type": "box",
799
+ "padding": "md",
482
800
  "children": [
483
801
  {
484
- "type": "typography",
485
- "variant": "caption",
486
- "content": "Unit"
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
+ }
904
+ ]
905
+ }
906
+ ]
907
+ },
908
+ {
909
+ "type": "divider"
910
+ },
911
+ {
912
+ "type": "grid",
913
+ "columns": 2,
914
+ "gap": "md",
915
+ "children": [
916
+ {
917
+ "type": "card",
918
+ "children": [
919
+ {
920
+ "type": "typography",
921
+ "variant": "caption",
922
+ "content": "Chart View"
923
+ }
924
+ ]
487
925
  },
488
926
  {
489
- "type": "typography",
490
- "variant": "h3",
491
- "content": "@entity.unit"
927
+ "type": "card",
928
+ "children": [
929
+ {
930
+ "type": "typography",
931
+ "variant": "caption",
932
+ "content": "Graph View"
933
+ }
934
+ ]
492
935
  }
493
936
  ]
494
- }
495
- ]
496
- },
497
- {
498
- "type": "card",
499
- "children": [
937
+ },
500
938
  {
501
- "type": "stack",
502
- "direction": "vertical",
503
- "gap": "sm",
504
- "children": [
939
+ "type": "line-chart",
940
+ "data": [
505
941
  {
506
- "type": "typography",
507
- "variant": "caption",
508
- "content": "Timestamp"
942
+ "date": "Jan",
943
+ "value": 12
509
944
  },
510
945
  {
511
- "type": "typography",
512
- "variant": "h3",
513
- "content": "@entity.timestamp"
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"
514
980
  }
515
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
516
1017
  }
517
1018
  ]
518
1019
  }
@@ -536,134 +1037,301 @@
536
1037
  "render-ui",
537
1038
  "main",
538
1039
  {
539
- "type": "stack",
540
- "direction": "vertical",
541
- "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
+ ],
542
1059
  "children": [
543
1060
  {
544
- "type": "stack",
545
- "direction": "horizontal",
546
- "gap": "md",
547
- "justify": "space-between",
1061
+ "type": "scaled-diagram",
548
1062
  "children": [
549
1063
  {
550
1064
  "type": "stack",
551
- "direction": "horizontal",
552
- "gap": "md",
1065
+ "direction": "vertical",
1066
+ "gap": "lg",
553
1067
  "children": [
554
1068
  {
555
- "type": "icon",
556
- "name": "thermometer",
557
- "size": "lg"
1069
+ "type": "breadcrumb",
1070
+ "items": [
1071
+ {
1072
+ "label": "Home",
1073
+ "href": "/"
1074
+ },
1075
+ {
1076
+ "label": "Sensor Readings"
1077
+ }
1078
+ ]
1079
+ },
1080
+ {
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
+ ]
558
1225
  },
559
1226
  {
560
- "type": "typography",
561
- "content": "Sensor Readings",
562
- "variant": "h2"
563
- }
564
- ]
565
- },
566
- {
567
- "type": "button",
568
- "label": "Refresh",
569
- "event": "REFRESH",
570
- "variant": "secondary",
571
- "icon": "refresh-cw"
572
- }
573
- ]
574
- },
575
- {
576
- "type": "divider"
577
- },
578
- {
579
- "type": "simple-grid",
580
- "columns": 3,
581
- "children": [
582
- {
583
- "type": "card",
584
- "children": [
1227
+ "type": "divider"
1228
+ },
585
1229
  {
586
- "type": "stack",
587
- "direction": "vertical",
588
- "gap": "sm",
1230
+ "type": "grid",
1231
+ "columns": 2,
1232
+ "gap": "md",
589
1233
  "children": [
590
1234
  {
591
- "type": "typography",
592
- "variant": "caption",
593
- "content": "SensorId"
1235
+ "type": "card",
1236
+ "children": [
1237
+ {
1238
+ "type": "typography",
1239
+ "variant": "caption",
1240
+ "content": "Chart View"
1241
+ }
1242
+ ]
594
1243
  },
595
1244
  {
596
- "type": "typography",
597
- "variant": "h3",
598
- "content": "@entity.sensorId"
1245
+ "type": "card",
1246
+ "children": [
1247
+ {
1248
+ "type": "typography",
1249
+ "variant": "caption",
1250
+ "content": "Graph View"
1251
+ }
1252
+ ]
599
1253
  }
600
1254
  ]
601
- }
602
- ]
603
- },
604
- {
605
- "type": "card",
606
- "children": [
1255
+ },
607
1256
  {
608
- "type": "stack",
609
- "direction": "vertical",
610
- "gap": "sm",
611
- "children": [
1257
+ "type": "line-chart",
1258
+ "data": [
612
1259
  {
613
- "type": "typography",
614
- "variant": "caption",
615
- "content": "Value"
1260
+ "date": "Jan",
1261
+ "value": 12
616
1262
  },
617
1263
  {
618
- "type": "typography",
619
- "variant": "h3",
620
- "content": "@entity.value"
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
621
1282
  }
622
- ]
623
- }
624
- ]
625
- },
626
- {
627
- "type": "card",
628
- "children": [
1283
+ ],
1284
+ "xKey": "date",
1285
+ "yKey": "value",
1286
+ "title": "Trend"
1287
+ },
629
1288
  {
630
- "type": "stack",
631
- "direction": "vertical",
632
- "gap": "sm",
633
- "children": [
1289
+ "type": "chart-legend",
1290
+ "items": [
634
1291
  {
635
- "type": "typography",
636
- "variant": "caption",
637
- "content": "Unit"
1292
+ "label": "Current",
1293
+ "color": "primary"
638
1294
  },
639
1295
  {
640
- "type": "typography",
641
- "variant": "h3",
642
- "content": "@entity.unit"
1296
+ "label": "Previous",
1297
+ "color": "muted"
643
1298
  }
644
1299
  ]
645
- }
646
- ]
647
- },
648
- {
649
- "type": "card",
650
- "children": [
1300
+ },
651
1301
  {
652
- "type": "stack",
653
- "direction": "vertical",
654
- "gap": "sm",
655
- "children": [
1302
+ "type": "graph-view",
1303
+ "nodes": [
656
1304
  {
657
- "type": "typography",
658
- "variant": "caption",
659
- "content": "Timestamp"
1305
+ "id": "a",
1306
+ "label": "Start",
1307
+ "x": 50,
1308
+ "y": 100
660
1309
  },
661
1310
  {
662
- "type": "typography",
663
- "variant": "h3",
664
- "content": "@entity.timestamp"
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
665
1321
  }
666
- ]
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
667
1335
  }
668
1336
  ]
669
1337
  }
@@ -687,134 +1355,301 @@
687
1355
  "render-ui",
688
1356
  "main",
689
1357
  {
690
- "type": "stack",
691
- "direction": "vertical",
692
- "gap": "lg",
693
- "children": [
1358
+ "type": "dashboard-layout",
1359
+ "appName": "IoT Dashboard",
1360
+ "navItems": [
694
1361
  {
695
- "type": "stack",
696
- "direction": "horizontal",
697
- "gap": "md",
698
- "justify": "space-between",
699
- "children": [
700
- {
701
- "type": "stack",
702
- "direction": "horizontal",
703
- "gap": "md",
704
- "children": [
705
- {
706
- "type": "icon",
707
- "name": "thermometer",
708
- "size": "lg"
709
- },
710
- {
711
- "type": "typography",
712
- "content": "Sensor Readings",
713
- "variant": "h2"
714
- }
715
- ]
716
- },
717
- {
718
- "type": "button",
719
- "label": "Refresh",
720
- "event": "REFRESH",
721
- "variant": "secondary",
722
- "icon": "refresh-cw"
723
- }
724
- ]
1362
+ "label": "Sensors",
1363
+ "href": "/sensors",
1364
+ "icon": "layout-list"
725
1365
  },
726
1366
  {
727
- "type": "divider"
1367
+ "label": "Devices",
1368
+ "href": "/devices",
1369
+ "icon": "cpu"
728
1370
  },
729
1371
  {
730
- "type": "simple-grid",
731
- "columns": 3,
1372
+ "label": "Alerts",
1373
+ "href": "/alerts",
1374
+ "icon": "bell"
1375
+ }
1376
+ ],
1377
+ "children": [
1378
+ {
1379
+ "type": "scaled-diagram",
732
1380
  "children": [
733
1381
  {
734
- "type": "card",
1382
+ "type": "stack",
1383
+ "direction": "vertical",
1384
+ "gap": "lg",
735
1385
  "children": [
736
1386
  {
737
- "type": "stack",
738
- "direction": "vertical",
739
- "gap": "sm",
740
- "children": [
1387
+ "type": "breadcrumb",
1388
+ "items": [
741
1389
  {
742
- "type": "typography",
743
- "variant": "caption",
744
- "content": "SensorId"
1390
+ "label": "Home",
1391
+ "href": "/"
745
1392
  },
746
1393
  {
747
- "type": "typography",
748
- "variant": "h3",
749
- "content": "@entity.sensorId"
1394
+ "label": "Sensor Readings"
750
1395
  }
751
1396
  ]
752
- }
753
- ]
754
- },
755
- {
756
- "type": "card",
757
- "children": [
1397
+ },
758
1398
  {
759
1399
  "type": "stack",
760
- "direction": "vertical",
761
- "gap": "sm",
1400
+ "direction": "horizontal",
1401
+ "gap": "md",
1402
+ "justify": "space-between",
762
1403
  "children": [
763
1404
  {
764
- "type": "typography",
765
- "variant": "caption",
766
- "content": "Value"
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
+ ]
767
1420
  },
768
1421
  {
769
- "type": "typography",
770
- "variant": "h3",
771
- "content": "@entity.value"
1422
+ "type": "button",
1423
+ "label": "Refresh",
1424
+ "event": "REFRESH",
1425
+ "variant": "secondary",
1426
+ "icon": "refresh-cw"
772
1427
  }
773
1428
  ]
774
- }
775
- ]
776
- },
777
- {
778
- "type": "card",
779
- "children": [
1429
+ },
780
1430
  {
781
- "type": "stack",
782
- "direction": "vertical",
783
- "gap": "sm",
1431
+ "type": "divider"
1432
+ },
1433
+ {
1434
+ "type": "box",
1435
+ "padding": "md",
784
1436
  "children": [
785
1437
  {
786
- "type": "typography",
787
- "variant": "caption",
788
- "content": "Unit"
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
+ }
1540
+ ]
1541
+ }
1542
+ ]
1543
+ },
1544
+ {
1545
+ "type": "divider"
1546
+ },
1547
+ {
1548
+ "type": "grid",
1549
+ "columns": 2,
1550
+ "gap": "md",
1551
+ "children": [
1552
+ {
1553
+ "type": "card",
1554
+ "children": [
1555
+ {
1556
+ "type": "typography",
1557
+ "variant": "caption",
1558
+ "content": "Chart View"
1559
+ }
1560
+ ]
789
1561
  },
790
1562
  {
791
- "type": "typography",
792
- "variant": "h3",
793
- "content": "@entity.unit"
1563
+ "type": "card",
1564
+ "children": [
1565
+ {
1566
+ "type": "typography",
1567
+ "variant": "caption",
1568
+ "content": "Graph View"
1569
+ }
1570
+ ]
794
1571
  }
795
1572
  ]
796
- }
797
- ]
798
- },
799
- {
800
- "type": "card",
801
- "children": [
1573
+ },
802
1574
  {
803
- "type": "stack",
804
- "direction": "vertical",
805
- "gap": "sm",
806
- "children": [
1575
+ "type": "line-chart",
1576
+ "data": [
807
1577
  {
808
- "type": "typography",
809
- "variant": "caption",
810
- "content": "Timestamp"
1578
+ "date": "Jan",
1579
+ "value": 12
811
1580
  },
812
1581
  {
813
- "type": "typography",
814
- "variant": "h3",
815
- "content": "@entity.timestamp"
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"
816
1616
  }
817
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
818
1653
  }
819
1654
  ]
820
1655
  }
@@ -867,11 +1702,16 @@
867
1702
  {
868
1703
  "name": "status",
869
1704
  "type": "string",
870
- "default": "offline"
1705
+ "default": "offline",
1706
+ "values": [
1707
+ "online",
1708
+ "offline",
1709
+ "maintenance"
1710
+ ]
871
1711
  },
872
1712
  {
873
1713
  "name": "lastSeen",
874
- "type": "string"
1714
+ "type": "date"
875
1715
  }
876
1716
  ]
877
1717
  },
@@ -978,131 +1818,138 @@
978
1818
  }
979
1819
  ],
980
1820
  "transitions": [
981
- {
982
- "from": "browsing",
983
- "to": "browsing",
984
- "event": "INIT",
985
- "effects": [
986
- [
987
- "fetch",
988
- "Device"
989
- ],
990
- [
991
- "render-ui",
992
- "main",
993
- {
994
- "type": "stack",
995
- "direction": "vertical",
996
- "gap": "lg",
997
- "children": [
998
- {
999
- "type": "stack",
1000
- "direction": "horizontal",
1001
- "gap": "md",
1002
- "justify": "space-between",
1003
- "children": [
1004
- {
1005
- "type": "stack",
1006
- "direction": "horizontal",
1007
- "gap": "sm",
1008
- "align": "center",
1009
- "children": [
1010
- {
1011
- "type": "icon",
1012
- "name": "cpu",
1013
- "size": "lg"
1014
- },
1015
- {
1016
- "type": "typography",
1017
- "content": "Devices",
1018
- "variant": "h2"
1019
- }
1020
- ]
1021
- },
1022
- {
1023
- "type": "stack",
1024
- "direction": "horizontal",
1025
- "gap": "sm",
1026
- "children": [
1027
- {
1028
- "type": "button",
1029
- "label": "Create Device",
1030
- "event": "CREATE",
1031
- "variant": "primary",
1032
- "icon": "plus"
1033
- }
1034
- ]
1035
- }
1036
- ]
1821
+ {
1822
+ "from": "browsing",
1823
+ "to": "browsing",
1824
+ "event": "INIT",
1825
+ "effects": [
1826
+ [
1827
+ "fetch",
1828
+ "Device"
1829
+ ],
1830
+ [
1831
+ "render-ui",
1832
+ "main",
1833
+ {
1834
+ "type": "dashboard-layout",
1835
+ "appName": "IoT Dashboard",
1836
+ "navItems": [
1837
+ {
1838
+ "label": "Sensors",
1839
+ "href": "/sensors",
1840
+ "icon": "layout-list"
1037
1841
  },
1038
1842
  {
1039
- "type": "divider"
1843
+ "label": "Devices",
1844
+ "href": "/devices",
1845
+ "icon": "cpu"
1040
1846
  },
1041
1847
  {
1042
- "type": "data-grid",
1043
- "entity": "Device",
1044
- "emptyIcon": "inbox",
1045
- "emptyTitle": "No devices yet",
1046
- "emptyDescription": "Create your first device to get started.",
1047
- "itemActions": [
1048
- {
1049
- "label": "View",
1050
- "event": "VIEW"
1051
- },
1052
- {
1053
- "label": "Edit",
1054
- "event": "EDIT"
1055
- },
1056
- {
1057
- "label": "Delete",
1058
- "event": "DELETE",
1059
- "variant": "danger"
1060
- }
1061
- ],
1062
- "className": "transition-shadow hover:shadow-md cursor-pointer",
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",
1063
1859
  "children": [
1064
1860
  {
1065
1861
  "type": "stack",
1066
- "direction": "vertical",
1067
- "gap": "sm",
1862
+ "direction": "horizontal",
1863
+ "gap": "md",
1864
+ "justify": "space-between",
1865
+ "align": "center",
1068
1866
  "children": [
1069
1867
  {
1070
1868
  "type": "stack",
1071
1869
  "direction": "horizontal",
1072
- "justify": "space-between",
1870
+ "gap": "sm",
1073
1871
  "align": "center",
1074
1872
  "children": [
1075
1873
  {
1076
- "type": "stack",
1077
- "direction": "horizontal",
1078
- "gap": "sm",
1079
- "align": "center",
1080
- "children": [
1081
- {
1082
- "type": "icon",
1083
- "name": "cpu",
1084
- "size": "sm"
1085
- },
1086
- {
1087
- "type": "typography",
1088
- "variant": "h4",
1089
- "content": "@entity.name"
1090
- }
1091
- ]
1874
+ "type": "icon",
1875
+ "name": "cpu",
1876
+ "size": "lg"
1092
1877
  },
1093
1878
  {
1094
- "type": "badge",
1095
- "label": "@entity.type"
1879
+ "type": "typography",
1880
+ "content": "Devices",
1881
+ "variant": "h2"
1096
1882
  }
1097
1883
  ]
1098
1884
  },
1099
1885
  {
1100
- "type": "typography",
1101
- "variant": "caption",
1102
- "color": "muted",
1103
- "content": "@entity.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
+ ]
1104
1898
  }
1105
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"
1106
1953
  }
1107
1954
  ]
1108
1955
  }
@@ -1222,6 +2069,135 @@
1222
2069
  "fetch",
1223
2070
  "Device"
1224
2071
  ],
2072
+ [
2073
+ "render-ui",
2074
+ "main",
2075
+ {
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
+ ],
2095
+ "children": [
2096
+ {
2097
+ "type": "stack",
2098
+ "direction": "vertical",
2099
+ "gap": "lg",
2100
+ "className": "max-w-5xl mx-auto w-full",
2101
+ "children": [
2102
+ {
2103
+ "type": "stack",
2104
+ "direction": "horizontal",
2105
+ "gap": "md",
2106
+ "justify": "space-between",
2107
+ "align": "center",
2108
+ "children": [
2109
+ {
2110
+ "type": "stack",
2111
+ "direction": "horizontal",
2112
+ "gap": "sm",
2113
+ "align": "center",
2114
+ "children": [
2115
+ {
2116
+ "type": "icon",
2117
+ "name": "cpu",
2118
+ "size": "lg"
2119
+ },
2120
+ {
2121
+ "type": "typography",
2122
+ "content": "Devices",
2123
+ "variant": "h2"
2124
+ }
2125
+ ]
2126
+ },
2127
+ {
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
+ ]
2140
+ }
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"
2195
+ }
2196
+ ]
2197
+ }
2198
+ ]
2199
+ }
2200
+ ],
1225
2201
  [
1226
2202
  "notify",
1227
2203
  "Device deleted successfully"
@@ -1237,6 +2213,139 @@
1237
2213
  "render-ui",
1238
2214
  "modal",
1239
2215
  null
2216
+ ],
2217
+ [
2218
+ "fetch",
2219
+ "Device"
2220
+ ],
2221
+ [
2222
+ "render-ui",
2223
+ "main",
2224
+ {
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
+ ],
2244
+ "children": [
2245
+ {
2246
+ "type": "stack",
2247
+ "direction": "vertical",
2248
+ "gap": "lg",
2249
+ "className": "max-w-5xl mx-auto w-full",
2250
+ "children": [
2251
+ {
2252
+ "type": "stack",
2253
+ "direction": "horizontal",
2254
+ "gap": "md",
2255
+ "justify": "space-between",
2256
+ "align": "center",
2257
+ "children": [
2258
+ {
2259
+ "type": "stack",
2260
+ "direction": "horizontal",
2261
+ "gap": "sm",
2262
+ "align": "center",
2263
+ "children": [
2264
+ {
2265
+ "type": "icon",
2266
+ "name": "cpu",
2267
+ "size": "lg"
2268
+ },
2269
+ {
2270
+ "type": "typography",
2271
+ "content": "Devices",
2272
+ "variant": "h2"
2273
+ }
2274
+ ]
2275
+ },
2276
+ {
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
+ ]
2289
+ }
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"
2344
+ }
2345
+ ]
2346
+ }
2347
+ ]
2348
+ }
1240
2349
  ]
1241
2350
  ]
1242
2351
  },
@@ -1249,6 +2358,139 @@
1249
2358
  "render-ui",
1250
2359
  "modal",
1251
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"
2377
+ },
2378
+ {
2379
+ "label": "Devices",
2380
+ "href": "/devices",
2381
+ "icon": "cpu"
2382
+ },
2383
+ {
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": [
2396
+ {
2397
+ "type": "stack",
2398
+ "direction": "horizontal",
2399
+ "gap": "md",
2400
+ "justify": "space-between",
2401
+ "align": "center",
2402
+ "children": [
2403
+ {
2404
+ "type": "stack",
2405
+ "direction": "horizontal",
2406
+ "gap": "sm",
2407
+ "align": "center",
2408
+ "children": [
2409
+ {
2410
+ "type": "icon",
2411
+ "name": "cpu",
2412
+ "size": "lg"
2413
+ },
2414
+ {
2415
+ "type": "typography",
2416
+ "content": "Devices",
2417
+ "variant": "h2"
2418
+ }
2419
+ ]
2420
+ },
2421
+ {
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
+ ]
2434
+ }
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"
2489
+ }
2490
+ ]
2491
+ }
2492
+ ]
2493
+ }
1252
2494
  ]
1253
2495
  ]
1254
2496
  }
@@ -1375,6 +2617,11 @@
1375
2617
  "render-ui",
1376
2618
  "modal",
1377
2619
  null
2620
+ ],
2621
+ [
2622
+ "notify",
2623
+ "Cancelled",
2624
+ "info"
1378
2625
  ]
1379
2626
  ]
1380
2627
  },
@@ -1540,6 +2787,11 @@
1540
2787
  "render-ui",
1541
2788
  "modal",
1542
2789
  null
2790
+ ],
2791
+ [
2792
+ "notify",
2793
+ "Cancelled",
2794
+ "info"
1543
2795
  ]
1544
2796
  ]
1545
2797
  },
@@ -1721,7 +2973,7 @@
1721
2973
  {
1722
2974
  "type": "typography",
1723
2975
  "variant": "caption",
1724
- "content": "LastSeen"
2976
+ "content": "Last Seen"
1725
2977
  },
1726
2978
  {
1727
2979
  "type": "typography",
@@ -1768,6 +3020,11 @@
1768
3020
  "render-ui",
1769
3021
  "modal",
1770
3022
  null
3023
+ ],
3024
+ [
3025
+ "notify",
3026
+ "Cancelled",
3027
+ "info"
1771
3028
  ]
1772
3029
  ]
1773
3030
  }
@@ -1825,6 +3082,21 @@
1825
3082
  "name": "acknowledged",
1826
3083
  "type": "boolean",
1827
3084
  "default": false
3085
+ },
3086
+ {
3087
+ "name": "failureCount",
3088
+ "type": "number",
3089
+ "default": 0
3090
+ },
3091
+ {
3092
+ "name": "successCount",
3093
+ "type": "number",
3094
+ "default": 0
3095
+ },
3096
+ {
3097
+ "name": "threshold",
3098
+ "type": "number",
3099
+ "default": 5
1828
3100
  }
1829
3101
  ]
1830
3102
  },
@@ -1882,40 +3154,123 @@
1882
3154
  "render-ui",
1883
3155
  "main",
1884
3156
  {
1885
- "type": "stack",
1886
- "direction": "vertical",
1887
- "gap": "lg",
1888
- "align": "center",
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
+ ],
1889
3176
  "children": [
1890
3177
  {
1891
3178
  "type": "stack",
1892
- "direction": "horizontal",
1893
- "gap": "md",
1894
- "align": "center",
3179
+ "direction": "vertical",
3180
+ "gap": "lg",
1895
3181
  "children": [
1896
3182
  {
1897
- "type": "icon",
1898
- "name": "bell",
1899
- "size": "lg"
3183
+ "type": "stack",
3184
+ "direction": "horizontal",
3185
+ "gap": "md",
3186
+ "align": "center",
3187
+ "justify": "space-between",
3188
+ "children": [
3189
+ {
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
+ ]
3206
+ },
3207
+ {
3208
+ "type": "status-dot",
3209
+ "status": "success",
3210
+ "pulse": false,
3211
+ "label": "Circuit Closed"
3212
+ }
3213
+ ]
1900
3214
  },
1901
3215
  {
1902
- "type": "typography",
1903
- "content": "DeviceAlert",
1904
- "variant": "h2"
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
+ },
3253
+ {
3254
+ "type": "meter",
3255
+ "value": [
3256
+ "object/get",
3257
+ [
3258
+ "array/first",
3259
+ "@entity"
3260
+ ],
3261
+ "failureCount"
3262
+ ],
3263
+ "min": 0,
3264
+ "max": [
3265
+ "object/get",
3266
+ [
3267
+ "array/first",
3268
+ "@entity"
3269
+ ],
3270
+ "threshold"
3271
+ ]
1905
3272
  }
1906
3273
  ]
1907
- },
1908
- {
1909
- "type": "divider"
1910
- },
1911
- {
1912
- "type": "badge",
1913
- "label": "Circuit Closed"
1914
- },
1915
- {
1916
- "type": "typography",
1917
- "content": "Service is healthy. All requests are being processed.",
1918
- "variant": "body"
1919
3274
  }
1920
3275
  ]
1921
3276
  }
@@ -1931,47 +3286,130 @@
1931
3286
  "render-ui",
1932
3287
  "main",
1933
3288
  {
1934
- "type": "stack",
1935
- "direction": "vertical",
1936
- "gap": "lg",
1937
- "align": "center",
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
+ ],
1938
3308
  "children": [
1939
3309
  {
1940
3310
  "type": "stack",
1941
- "direction": "horizontal",
1942
- "gap": "md",
1943
- "align": "center",
3311
+ "direction": "vertical",
3312
+ "gap": "lg",
1944
3313
  "children": [
1945
3314
  {
1946
- "type": "icon",
1947
- "name": "alert-triangle",
1948
- "size": "lg"
3315
+ "type": "stack",
3316
+ "direction": "horizontal",
3317
+ "gap": "md",
3318
+ "align": "center",
3319
+ "justify": "space-between",
3320
+ "children": [
3321
+ {
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
+ ]
3338
+ },
3339
+ {
3340
+ "type": "status-dot",
3341
+ "status": "error",
3342
+ "pulse": true,
3343
+ "label": "Circuit Open"
3344
+ }
3345
+ ]
1949
3346
  },
1950
3347
  {
1951
- "type": "typography",
1952
- "content": "DeviceAlert",
1953
- "variant": "h2"
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
+ },
3385
+ {
3386
+ "type": "meter",
3387
+ "value": [
3388
+ "object/get",
3389
+ [
3390
+ "array/first",
3391
+ "@entity"
3392
+ ],
3393
+ "failureCount"
3394
+ ],
3395
+ "min": 0,
3396
+ "max": [
3397
+ "object/get",
3398
+ [
3399
+ "array/first",
3400
+ "@entity"
3401
+ ],
3402
+ "threshold"
3403
+ ]
3404
+ },
3405
+ {
3406
+ "type": "button",
3407
+ "label": "Reset",
3408
+ "event": "RESET",
3409
+ "variant": "ghost",
3410
+ "icon": "rotate-ccw"
1954
3411
  }
1955
3412
  ]
1956
- },
1957
- {
1958
- "type": "divider"
1959
- },
1960
- {
1961
- "type": "badge",
1962
- "label": "Circuit Open"
1963
- },
1964
- {
1965
- "type": "typography",
1966
- "content": "Circuit is open. Requests are being rejected to prevent cascading failures.",
1967
- "variant": "body"
1968
- },
1969
- {
1970
- "type": "button",
1971
- "label": "Reset",
1972
- "event": "RESET",
1973
- "variant": "ghost",
1974
- "icon": "rotate-ccw"
1975
3413
  }
1976
3414
  ]
1977
3415
  }
@@ -1987,40 +3425,123 @@
1987
3425
  "render-ui",
1988
3426
  "main",
1989
3427
  {
1990
- "type": "stack",
1991
- "direction": "vertical",
1992
- "gap": "lg",
1993
- "align": "center",
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
+ ],
1994
3447
  "children": [
1995
3448
  {
1996
3449
  "type": "stack",
1997
- "direction": "horizontal",
1998
- "gap": "md",
1999
- "align": "center",
3450
+ "direction": "vertical",
3451
+ "gap": "lg",
2000
3452
  "children": [
2001
3453
  {
2002
- "type": "icon",
2003
- "name": "bell",
2004
- "size": "lg"
3454
+ "type": "stack",
3455
+ "direction": "horizontal",
3456
+ "gap": "md",
3457
+ "align": "center",
3458
+ "justify": "space-between",
3459
+ "children": [
3460
+ {
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
+ ]
3477
+ },
3478
+ {
3479
+ "type": "status-dot",
3480
+ "status": "success",
3481
+ "pulse": false,
3482
+ "label": "Circuit Closed"
3483
+ }
3484
+ ]
2005
3485
  },
2006
3486
  {
2007
- "type": "typography",
2008
- "content": "DeviceAlert",
2009
- "variant": "h2"
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
+ },
3524
+ {
3525
+ "type": "meter",
3526
+ "value": [
3527
+ "object/get",
3528
+ [
3529
+ "array/first",
3530
+ "@entity"
3531
+ ],
3532
+ "failureCount"
3533
+ ],
3534
+ "min": 0,
3535
+ "max": [
3536
+ "object/get",
3537
+ [
3538
+ "array/first",
3539
+ "@entity"
3540
+ ],
3541
+ "threshold"
3542
+ ]
2010
3543
  }
2011
3544
  ]
2012
- },
2013
- {
2014
- "type": "divider"
2015
- },
2016
- {
2017
- "type": "badge",
2018
- "label": "Circuit Closed"
2019
- },
2020
- {
2021
- "type": "typography",
2022
- "content": "Service is healthy. All requests are being processed.",
2023
- "variant": "body"
2024
3545
  }
2025
3546
  ]
2026
3547
  }
@@ -2036,40 +3557,103 @@
2036
3557
  "render-ui",
2037
3558
  "main",
2038
3559
  {
2039
- "type": "stack",
2040
- "direction": "vertical",
2041
- "gap": "lg",
2042
- "align": "center",
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
+ ],
2043
3579
  "children": [
2044
3580
  {
2045
3581
  "type": "stack",
2046
- "direction": "horizontal",
2047
- "gap": "md",
2048
- "align": "center",
3582
+ "direction": "vertical",
3583
+ "gap": "lg",
2049
3584
  "children": [
2050
3585
  {
2051
- "type": "icon",
2052
- "name": "activity",
2053
- "size": "lg"
3586
+ "type": "stack",
3587
+ "direction": "horizontal",
3588
+ "gap": "md",
3589
+ "align": "center",
3590
+ "justify": "space-between",
3591
+ "children": [
3592
+ {
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
+ ]
3609
+ },
3610
+ {
3611
+ "type": "status-dot",
3612
+ "status": "warning",
3613
+ "pulse": true,
3614
+ "label": "Circuit Half-Open"
3615
+ }
3616
+ ]
3617
+ },
3618
+ {
3619
+ "type": "divider"
2054
3620
  },
2055
3621
  {
2056
- "type": "typography",
2057
- "content": "DeviceAlert",
2058
- "variant": "h2"
3622
+ "type": "alert",
3623
+ "variant": "warning",
3624
+ "message": "Testing recovery. Limited requests are being allowed through."
3625
+ },
3626
+ {
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
+ }
3654
+ ]
2059
3655
  }
2060
3656
  ]
2061
- },
2062
- {
2063
- "type": "divider"
2064
- },
2065
- {
2066
- "type": "badge",
2067
- "label": "Circuit Half-Open"
2068
- },
2069
- {
2070
- "type": "typography",
2071
- "content": "Testing recovery. Limited requests are being allowed through.",
2072
- "variant": "body"
2073
3657
  }
2074
3658
  ]
2075
3659
  }
@@ -2085,40 +3669,123 @@
2085
3669
  "render-ui",
2086
3670
  "main",
2087
3671
  {
2088
- "type": "stack",
2089
- "direction": "vertical",
2090
- "gap": "lg",
2091
- "align": "center",
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
+ ],
2092
3691
  "children": [
2093
3692
  {
2094
3693
  "type": "stack",
2095
- "direction": "horizontal",
2096
- "gap": "md",
2097
- "align": "center",
3694
+ "direction": "vertical",
3695
+ "gap": "lg",
2098
3696
  "children": [
2099
3697
  {
2100
- "type": "icon",
2101
- "name": "bell",
2102
- "size": "lg"
3698
+ "type": "stack",
3699
+ "direction": "horizontal",
3700
+ "gap": "md",
3701
+ "align": "center",
3702
+ "justify": "space-between",
3703
+ "children": [
3704
+ {
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
+ ]
3721
+ },
3722
+ {
3723
+ "type": "status-dot",
3724
+ "status": "success",
3725
+ "pulse": false,
3726
+ "label": "Circuit Closed"
3727
+ }
3728
+ ]
2103
3729
  },
2104
3730
  {
2105
- "type": "typography",
2106
- "content": "DeviceAlert",
2107
- "variant": "h2"
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
+ },
3768
+ {
3769
+ "type": "meter",
3770
+ "value": [
3771
+ "object/get",
3772
+ [
3773
+ "array/first",
3774
+ "@entity"
3775
+ ],
3776
+ "failureCount"
3777
+ ],
3778
+ "min": 0,
3779
+ "max": [
3780
+ "object/get",
3781
+ [
3782
+ "array/first",
3783
+ "@entity"
3784
+ ],
3785
+ "threshold"
3786
+ ]
2108
3787
  }
2109
3788
  ]
2110
- },
2111
- {
2112
- "type": "divider"
2113
- },
2114
- {
2115
- "type": "badge",
2116
- "label": "Circuit Closed"
2117
- },
2118
- {
2119
- "type": "typography",
2120
- "content": "Service is healthy. All requests are being processed.",
2121
- "variant": "body"
2122
3789
  }
2123
3790
  ]
2124
3791
  }
@@ -2134,40 +3801,123 @@
2134
3801
  "render-ui",
2135
3802
  "main",
2136
3803
  {
2137
- "type": "stack",
2138
- "direction": "vertical",
2139
- "gap": "lg",
2140
- "align": "center",
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
+ ],
2141
3823
  "children": [
2142
3824
  {
2143
3825
  "type": "stack",
2144
- "direction": "horizontal",
2145
- "gap": "md",
2146
- "align": "center",
3826
+ "direction": "vertical",
3827
+ "gap": "lg",
2147
3828
  "children": [
2148
3829
  {
2149
- "type": "icon",
2150
- "name": "bell",
2151
- "size": "lg"
3830
+ "type": "stack",
3831
+ "direction": "horizontal",
3832
+ "gap": "md",
3833
+ "align": "center",
3834
+ "justify": "space-between",
3835
+ "children": [
3836
+ {
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
+ ]
3853
+ },
3854
+ {
3855
+ "type": "status-dot",
3856
+ "status": "success",
3857
+ "pulse": false,
3858
+ "label": "Circuit Closed"
3859
+ }
3860
+ ]
2152
3861
  },
2153
3862
  {
2154
- "type": "typography",
2155
- "content": "DeviceAlert",
2156
- "variant": "h2"
3863
+ "type": "divider"
3864
+ },
3865
+ {
3866
+ "type": "alert",
3867
+ "variant": "success",
3868
+ "message": "Service is healthy. All requests are being processed."
3869
+ },
3870
+ {
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",
3902
+ "value": [
3903
+ "object/get",
3904
+ [
3905
+ "array/first",
3906
+ "@entity"
3907
+ ],
3908
+ "failureCount"
3909
+ ],
3910
+ "min": 0,
3911
+ "max": [
3912
+ "object/get",
3913
+ [
3914
+ "array/first",
3915
+ "@entity"
3916
+ ],
3917
+ "threshold"
3918
+ ]
2157
3919
  }
2158
3920
  ]
2159
- },
2160
- {
2161
- "type": "divider"
2162
- },
2163
- {
2164
- "type": "badge",
2165
- "label": "Circuit Closed"
2166
- },
2167
- {
2168
- "type": "typography",
2169
- "content": "Service is healthy. All requests are being processed.",
2170
- "variant": "body"
2171
3921
  }
2172
3922
  ]
2173
3923
  }
@@ -2183,47 +3933,130 @@
2183
3933
  "render-ui",
2184
3934
  "main",
2185
3935
  {
2186
- "type": "stack",
2187
- "direction": "vertical",
2188
- "gap": "lg",
2189
- "align": "center",
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
+ ],
2190
3955
  "children": [
2191
3956
  {
2192
3957
  "type": "stack",
2193
- "direction": "horizontal",
2194
- "gap": "md",
2195
- "align": "center",
3958
+ "direction": "vertical",
3959
+ "gap": "lg",
2196
3960
  "children": [
2197
3961
  {
2198
- "type": "icon",
2199
- "name": "alert-triangle",
2200
- "size": "lg"
3962
+ "type": "stack",
3963
+ "direction": "horizontal",
3964
+ "gap": "md",
3965
+ "align": "center",
3966
+ "justify": "space-between",
3967
+ "children": [
3968
+ {
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
+ ]
3985
+ },
3986
+ {
3987
+ "type": "status-dot",
3988
+ "status": "error",
3989
+ "pulse": true,
3990
+ "label": "Circuit Open"
3991
+ }
3992
+ ]
2201
3993
  },
2202
3994
  {
2203
- "type": "typography",
2204
- "content": "DeviceAlert",
2205
- "variant": "h2"
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
+ },
4032
+ {
4033
+ "type": "meter",
4034
+ "value": [
4035
+ "object/get",
4036
+ [
4037
+ "array/first",
4038
+ "@entity"
4039
+ ],
4040
+ "failureCount"
4041
+ ],
4042
+ "min": 0,
4043
+ "max": [
4044
+ "object/get",
4045
+ [
4046
+ "array/first",
4047
+ "@entity"
4048
+ ],
4049
+ "threshold"
4050
+ ]
4051
+ },
4052
+ {
4053
+ "type": "button",
4054
+ "label": "Reset",
4055
+ "event": "RESET",
4056
+ "variant": "ghost",
4057
+ "icon": "rotate-ccw"
2206
4058
  }
2207
4059
  ]
2208
- },
2209
- {
2210
- "type": "divider"
2211
- },
2212
- {
2213
- "type": "badge",
2214
- "label": "Circuit Open"
2215
- },
2216
- {
2217
- "type": "typography",
2218
- "content": "Circuit is open. Requests are being rejected to prevent cascading failures.",
2219
- "variant": "body"
2220
- },
2221
- {
2222
- "type": "button",
2223
- "label": "Reset",
2224
- "event": "RESET",
2225
- "variant": "ghost",
2226
- "icon": "rotate-ccw"
2227
4060
  }
2228
4061
  ]
2229
4062
  }
@@ -2239,40 +4072,123 @@
2239
4072
  "render-ui",
2240
4073
  "main",
2241
4074
  {
2242
- "type": "stack",
2243
- "direction": "vertical",
2244
- "gap": "lg",
2245
- "align": "center",
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
+ ],
2246
4094
  "children": [
2247
4095
  {
2248
4096
  "type": "stack",
2249
- "direction": "horizontal",
2250
- "gap": "md",
2251
- "align": "center",
4097
+ "direction": "vertical",
4098
+ "gap": "lg",
2252
4099
  "children": [
2253
4100
  {
2254
- "type": "icon",
2255
- "name": "bell",
2256
- "size": "lg"
4101
+ "type": "stack",
4102
+ "direction": "horizontal",
4103
+ "gap": "md",
4104
+ "align": "center",
4105
+ "justify": "space-between",
4106
+ "children": [
4107
+ {
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
+ ]
4124
+ },
4125
+ {
4126
+ "type": "status-dot",
4127
+ "status": "success",
4128
+ "pulse": false,
4129
+ "label": "Circuit Closed"
4130
+ }
4131
+ ]
2257
4132
  },
2258
4133
  {
2259
- "type": "typography",
2260
- "content": "DeviceAlert",
2261
- "variant": "h2"
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
+ },
4171
+ {
4172
+ "type": "meter",
4173
+ "value": [
4174
+ "object/get",
4175
+ [
4176
+ "array/first",
4177
+ "@entity"
4178
+ ],
4179
+ "failureCount"
4180
+ ],
4181
+ "min": 0,
4182
+ "max": [
4183
+ "object/get",
4184
+ [
4185
+ "array/first",
4186
+ "@entity"
4187
+ ],
4188
+ "threshold"
4189
+ ]
2262
4190
  }
2263
4191
  ]
2264
- },
2265
- {
2266
- "type": "divider"
2267
- },
2268
- {
2269
- "type": "badge",
2270
- "label": "Circuit Closed"
2271
- },
2272
- {
2273
- "type": "typography",
2274
- "content": "Service is healthy. All requests are being processed.",
2275
- "variant": "body"
2276
4192
  }
2277
4193
  ]
2278
4194
  }