@almadar/std 14.9.0 → 14.10.0

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 (35) hide show
  1. package/behaviors/registry/app/organisms/std-api-gateway.orb +419 -171
  2. package/behaviors/registry/app/organisms/std-booking-system.orb +760 -620
  3. package/behaviors/registry/app/organisms/std-cicd-pipeline.orb +477 -229
  4. package/behaviors/registry/app/organisms/std-cms.orb +433 -298
  5. package/behaviors/registry/app/organisms/std-crm.orb +355 -215
  6. package/behaviors/registry/app/organisms/std-devops-dashboard.orb +504 -369
  7. package/behaviors/registry/app/organisms/std-finance-tracker.orb +271 -189
  8. package/behaviors/registry/app/organisms/std-healthcare.orb +676 -468
  9. package/behaviors/registry/app/organisms/std-helpdesk.orb +246 -166
  10. package/behaviors/registry/app/organisms/std-hr-portal.orb +534 -399
  11. package/behaviors/registry/app/organisms/std-iot-dashboard.orb +420 -340
  12. package/behaviors/registry/app/organisms/std-lms.orb +462 -378
  13. package/behaviors/registry/app/organisms/std-project-manager.orb +282 -200
  14. package/behaviors/registry/app/organisms/std-realtime-chat.orb +317 -235
  15. package/behaviors/registry/app/organisms/std-social-feed.orb +256 -137
  16. package/behaviors/registry/app/organisms/std-trading-dashboard.orb +342 -218
  17. package/behaviors/registry/core/molecules/std-app-layout.orb +90 -21
  18. package/dist/behaviors/registry/app/organisms/std-api-gateway.orb +419 -171
  19. package/dist/behaviors/registry/app/organisms/std-booking-system.orb +760 -620
  20. package/dist/behaviors/registry/app/organisms/std-cicd-pipeline.orb +477 -229
  21. package/dist/behaviors/registry/app/organisms/std-cms.orb +433 -298
  22. package/dist/behaviors/registry/app/organisms/std-crm.orb +355 -215
  23. package/dist/behaviors/registry/app/organisms/std-devops-dashboard.orb +504 -369
  24. package/dist/behaviors/registry/app/organisms/std-finance-tracker.orb +271 -189
  25. package/dist/behaviors/registry/app/organisms/std-healthcare.orb +676 -468
  26. package/dist/behaviors/registry/app/organisms/std-helpdesk.orb +246 -166
  27. package/dist/behaviors/registry/app/organisms/std-hr-portal.orb +534 -399
  28. package/dist/behaviors/registry/app/organisms/std-iot-dashboard.orb +420 -340
  29. package/dist/behaviors/registry/app/organisms/std-lms.orb +462 -378
  30. package/dist/behaviors/registry/app/organisms/std-project-manager.orb +282 -200
  31. package/dist/behaviors/registry/app/organisms/std-realtime-chat.orb +317 -235
  32. package/dist/behaviors/registry/app/organisms/std-social-feed.orb +256 -137
  33. package/dist/behaviors/registry/app/organisms/std-trading-dashboard.orb +342 -218
  34. package/dist/behaviors/registry/core/molecules/std-app-layout.orb +90 -21
  35. package/package.json +1 -1
@@ -101,28 +101,28 @@
101
101
  "ref": "AppShell.traits.AppLayout",
102
102
  "name": "RouteAppLayout",
103
103
  "config": {
104
+ "contentTrait": "@trait.RouteCatalog",
105
+ "appName": "API Gateway",
106
+ "notifications": [],
104
107
  "navItems": [
105
108
  {
106
109
  "label": "Routes",
107
- "href": "/routes",
108
- "icon": "git-branch"
110
+ "icon": "git-branch",
111
+ "href": "/routes"
109
112
  },
110
113
  {
111
- "href": "/backends",
112
114
  "label": "Backends",
113
- "icon": "server"
115
+ "icon": "server",
116
+ "href": "/backends"
114
117
  },
115
118
  {
119
+ "label": "Analytics",
116
120
  "href": "/analytics",
117
- "icon": "bar-chart-2",
118
- "label": "Analytics"
121
+ "icon": "bar-chart-2"
119
122
  }
120
123
  ],
121
- "notifications": [],
122
124
  "searchEvent": "ROUTE_SEARCH",
123
- "notificationClickEvent": "ROUTE_NOTIFICATIONS_OPEN",
124
- "contentTrait": "@trait.RouteCatalog",
125
- "appName": "API Gateway"
125
+ "notificationClickEvent": "ROUTE_NOTIFICATIONS_OPEN"
126
126
  },
127
127
  "events": {
128
128
  "NOTIFY_CLICK": "ROUTE_NOTIFICATIONS_OPEN",
@@ -209,47 +209,47 @@
209
209
  "render-ui",
210
210
  "main",
211
211
  {
212
- "type": "stack",
212
+ "direction": "vertical",
213
213
  "children": [
214
214
  {
215
- "direction": "horizontal",
216
- "justify": "between",
217
- "gap": "md",
218
- "type": "stack",
215
+ "align": "center",
219
216
  "children": [
220
217
  {
221
218
  "align": "center",
219
+ "type": "stack",
220
+ "direction": "horizontal",
221
+ "gap": "sm",
222
222
  "children": [
223
223
  {
224
- "name": "git-branch",
225
- "type": "icon"
224
+ "type": "icon",
225
+ "name": "git-branch"
226
226
  },
227
227
  {
228
- "variant": "h2",
228
+ "type": "typography",
229
229
  "content": "Routes",
230
- "type": "typography"
230
+ "variant": "h2"
231
231
  }
232
- ],
233
- "gap": "sm",
234
- "direction": "horizontal",
235
- "type": "stack"
232
+ ]
236
233
  },
237
234
  {
238
- "type": "stack",
239
- "direction": "horizontal",
240
235
  "gap": "sm",
241
236
  "children": [
242
237
  {
243
- "variant": "primary",
244
238
  "label": "Create Route",
245
- "icon": "plus",
246
239
  "action": "CREATE",
247
- "type": "button"
240
+ "type": "button",
241
+ "variant": "primary",
242
+ "icon": "plus"
248
243
  }
249
- ]
244
+ ],
245
+ "type": "stack",
246
+ "direction": "horizontal"
250
247
  }
251
248
  ],
252
- "align": "center"
249
+ "direction": "horizontal",
250
+ "type": "stack",
251
+ "justify": "between",
252
+ "gap": "md"
253
253
  },
254
254
  {
255
255
  "type": "divider"
@@ -257,12 +257,12 @@
257
257
  {
258
258
  "direction": "horizontal",
259
259
  "gap": "md",
260
- "align": "center",
261
- "type": "stack",
262
260
  "children": [
263
261
  "@trait.RouteSearch",
264
262
  "@trait.RouteFilter"
265
- ]
263
+ ],
264
+ "type": "stack",
265
+ "align": "center"
266
266
  },
267
267
  "@trait.RouteStats",
268
268
  "@trait.RouteGraphs",
@@ -271,7 +271,7 @@
271
271
  },
272
272
  "@trait.RouteBrowseList"
273
273
  ],
274
- "direction": "vertical",
274
+ "type": "stack",
275
275
  "gap": "lg"
276
276
  }
277
277
  ]
@@ -291,34 +291,34 @@
291
291
  "render-ui",
292
292
  "main",
293
293
  {
294
- "type": "stack",
295
- "align": "center",
296
- "direction": "vertical",
297
- "className": "py-8",
298
294
  "children": [
299
295
  {
300
296
  "name": "bell",
301
297
  "type": "icon"
302
298
  },
303
299
  {
304
- "type": "typography",
305
300
  "variant": "h3",
306
- "content": "No notifications"
301
+ "content": "No notifications",
302
+ "type": "typography"
307
303
  },
308
304
  {
309
- "content": "You're all caught up.",
310
- "variant": "caption",
311
305
  "type": "typography",
312
- "color": "muted"
306
+ "variant": "caption",
307
+ "color": "muted",
308
+ "content": "You're all caught up."
313
309
  },
314
310
  {
315
- "action": "INIT",
311
+ "label": "Back to routes",
316
312
  "type": "button",
317
- "variant": "ghost",
318
- "label": "Back to routes"
313
+ "action": "INIT",
314
+ "variant": "ghost"
319
315
  }
320
316
  ],
321
- "gap": "md"
317
+ "align": "center",
318
+ "type": "stack",
319
+ "gap": "md",
320
+ "direction": "vertical",
321
+ "className": "py-8"
322
322
  }
323
323
  ]
324
324
  ]
@@ -339,29 +339,29 @@
339
339
  "ref": "Filter.traits.FilterTargetFilter",
340
340
  "name": "RouteFilter",
341
341
  "config": {
342
+ "event": "ROUTE_FILTER",
342
343
  "filters": [
343
344
  {
344
- "field": "method",
345
345
  "label": "Method",
346
- "filterType": "select",
346
+ "field": "method",
347
347
  "options": [
348
348
  "GET",
349
349
  "POST",
350
350
  "PUT",
351
351
  "DELETE"
352
- ]
352
+ ],
353
+ "filterType": "select"
353
354
  },
354
355
  {
355
- "field": "status",
356
356
  "options": [
357
357
  "active",
358
358
  "disabled"
359
359
  ],
360
- "filterType": "select",
361
- "label": "Status"
360
+ "field": "status",
361
+ "label": "Status",
362
+ "filterType": "select"
362
363
  }
363
- ],
364
- "event": "ROUTE_FILTER"
364
+ ]
365
365
  }
366
366
  },
367
367
  {
@@ -374,11 +374,12 @@
374
374
  "label": "Total",
375
375
  "icon": "git-branch",
376
376
  "variant": "primary",
377
- "aggregation": "count",
378
- "format": "number"
377
+ "format": "number",
378
+ "aggregation": "count"
379
379
  },
380
380
  {
381
381
  "aggregation": "count",
382
+ "label": "Active",
382
383
  "format": "number",
383
384
  "filter": [
384
385
  "fn",
@@ -389,13 +390,11 @@
389
390
  "active"
390
391
  ]
391
392
  ],
392
- "label": "Active",
393
393
  "variant": "success",
394
394
  "icon": "check-circle"
395
395
  },
396
396
  {
397
- "variant": "warning",
398
- "format": "number",
397
+ "aggregation": "count",
399
398
  "filter": [
400
399
  "fn",
401
400
  "row",
@@ -405,9 +404,10 @@
405
404
  "disabled"
406
405
  ]
407
406
  ],
408
- "aggregation": "count",
409
- "icon": "x-circle",
410
- "label": "Disabled"
407
+ "label": "Disabled",
408
+ "format": "number",
409
+ "variant": "warning",
410
+ "icon": "x-circle"
411
411
  }
412
412
  ]
413
413
  },
@@ -426,13 +426,13 @@
426
426
  "ref": "Graphs.traits.GraphItemGraph",
427
427
  "name": "RouteGraphs",
428
428
  "config": {
429
+ "subtitle": "Distribution across HTTP methods",
430
+ "categoryField": "method",
429
431
  "aggregation": "count",
430
- "showLegend": true,
432
+ "title": "Routes by Method",
431
433
  "chartType": "pie",
432
- "subtitle": "Distribution across HTTP methods",
433
434
  "height": 240.0,
434
- "title": "Routes by Method",
435
- "categoryField": "method"
435
+ "showLegend": true
436
436
  },
437
437
  "listens": [
438
438
  {
@@ -450,49 +450,49 @@
450
450
  "name": "RouteBrowseList",
451
451
  "linkedEntity": "Route",
452
452
  "config": {
453
- "gap": "sm",
453
+ "itemActions": [
454
+ {
455
+ "label": "View",
456
+ "variant": "ghost",
457
+ "event": "VIEW"
458
+ },
459
+ {
460
+ "label": "Edit",
461
+ "variant": "ghost",
462
+ "event": "EDIT"
463
+ },
464
+ {
465
+ "label": "Delete",
466
+ "variant": "danger",
467
+ "event": "DELETE"
468
+ }
469
+ ],
454
470
  "fields": [
455
471
  {
472
+ "name": "path",
456
473
  "variant": "h3",
457
- "icon": "git-branch",
458
- "name": "path"
474
+ "icon": "git-branch"
459
475
  },
460
476
  {
461
477
  "name": "method",
462
478
  "variant": "badge"
463
479
  },
464
480
  {
465
- "variant": "badge",
466
- "name": "status"
481
+ "name": "status",
482
+ "variant": "badge"
467
483
  },
468
484
  {
469
- "name": "target",
470
- "variant": "body"
485
+ "variant": "body",
486
+ "name": "target"
471
487
  },
472
488
  {
473
- "format": "number",
489
+ "name": "hits",
474
490
  "variant": "caption",
475
- "label": "Hits",
476
- "name": "hits"
477
- }
478
- ],
479
- "itemActions": [
480
- {
481
- "label": "View",
482
- "event": "VIEW",
483
- "variant": "ghost"
484
- },
485
- {
486
- "event": "EDIT",
487
- "variant": "ghost",
488
- "label": "Edit"
489
- },
490
- {
491
- "variant": "danger",
492
- "label": "Delete",
493
- "event": "DELETE"
491
+ "format": "number",
492
+ "label": "Hits"
494
493
  }
495
494
  ],
495
+ "gap": "sm",
496
496
  "cols": 1.0
497
497
  },
498
498
  "listens": [
@@ -543,9 +543,9 @@
543
543
  "name": "RouteCreate",
544
544
  "linkedEntity": "Route",
545
545
  "config": {
546
- "mode": "create",
547
546
  "icon": "plus-circle",
548
547
  "title": "New Route",
548
+ "mode": "create",
549
549
  "fields": [
550
550
  "path",
551
551
  "method",
@@ -573,6 +573,7 @@
573
573
  "name": "RouteEdit",
574
574
  "linkedEntity": "Route",
575
575
  "config": {
576
+ "mode": "edit",
576
577
  "title": "Edit Route",
577
578
  "icon": "edit",
578
579
  "fields": [
@@ -581,8 +582,7 @@
581
582
  "status",
582
583
  "target",
583
584
  "rateLimit"
584
- ],
585
- "mode": "edit"
585
+ ]
586
586
  },
587
587
  "events": {
588
588
  "OPEN": "EDIT"
@@ -603,16 +603,16 @@
603
603
  "name": "RouteView",
604
604
  "linkedEntity": "Route",
605
605
  "config": {
606
+ "icon": "eye",
607
+ "title": "View Route",
608
+ "mode": "edit",
606
609
  "fields": [
607
610
  "path",
608
611
  "method",
609
612
  "status",
610
613
  "target",
611
614
  "rateLimit"
612
- ],
613
- "mode": "edit",
614
- "title": "View Route",
615
- "icon": "eye"
615
+ ]
616
616
  },
617
617
  "events": {
618
618
  "OPEN": "VIEW"
@@ -633,10 +633,10 @@
633
633
  "name": "RouteDelete",
634
634
  "linkedEntity": "Route",
635
635
  "config": {
636
+ "icon": "alert-triangle",
636
637
  "confirmLabel": "Delete",
637
- "alertMessage": "This action cannot be undone.",
638
638
  "title": "Delete Route",
639
- "icon": "alert-triangle"
639
+ "alertMessage": "This action cannot be undone."
640
640
  },
641
641
  "events": {
642
642
  "CONFIRM": "CONFIRM_DELETE",
@@ -885,6 +885,10 @@
885
885
  {
886
886
  "name": "BackendOrbital",
887
887
  "uses": [
888
+ {
889
+ "from": "std/behaviors/std-app-layout",
890
+ "as": "AppShell"
891
+ },
888
892
  {
889
893
  "from": "std/behaviors/std-modal",
890
894
  "as": "Modal"
@@ -952,6 +956,39 @@
952
956
  ]
953
957
  },
954
958
  "traits": [
959
+ {
960
+ "ref": "AppShell.traits.AppLayout",
961
+ "name": "BackendAppLayout",
962
+ "linkedEntity": "Backend",
963
+ "config": {
964
+ "searchEvent": "BACKEND_SEARCH",
965
+ "contentTrait": "@trait.BackendCatalog",
966
+ "notificationClickEvent": "BACKEND_NOTIFICATIONS_OPEN",
967
+ "notifications": [],
968
+ "appName": "API Gateway",
969
+ "navItems": [
970
+ {
971
+ "icon": "git-branch",
972
+ "href": "/routes",
973
+ "label": "Routes"
974
+ },
975
+ {
976
+ "label": "Backends",
977
+ "href": "/backends",
978
+ "icon": "server"
979
+ },
980
+ {
981
+ "label": "Analytics",
982
+ "icon": "bar-chart-2",
983
+ "href": "/analytics"
984
+ }
985
+ ]
986
+ },
987
+ "events": {
988
+ "SEARCH": "BACKEND_SEARCH",
989
+ "NOTIFY_CLICK": "BACKEND_NOTIFICATIONS_OPEN"
990
+ }
991
+ },
955
992
  {
956
993
  "name": "BackendCatalog",
957
994
  "category": "interaction",
@@ -967,6 +1004,24 @@
967
1004
  ]
968
1005
  }
969
1006
  ],
1007
+ "listens": [
1008
+ {
1009
+ "event": "BACKEND_SEARCH",
1010
+ "triggers": "BACKEND_SEARCH",
1011
+ "source": {
1012
+ "kind": "trait",
1013
+ "trait": "BackendAppLayout"
1014
+ }
1015
+ },
1016
+ {
1017
+ "event": "BACKEND_NOTIFICATIONS_OPEN",
1018
+ "triggers": "BACKEND_NOTIFICATIONS_OPEN",
1019
+ "source": {
1020
+ "kind": "trait",
1021
+ "trait": "BackendAppLayout"
1022
+ }
1023
+ }
1024
+ ],
970
1025
  "stateMachine": {
971
1026
  "states": [
972
1027
  {
@@ -979,6 +1034,26 @@
979
1034
  "key": "INIT",
980
1035
  "name": "Initialize"
981
1036
  },
1037
+ {
1038
+ "key": "BACKEND_SEARCH",
1039
+ "name": "Backend Search",
1040
+ "payloadSchema": [
1041
+ {
1042
+ "name": "value",
1043
+ "type": "string"
1044
+ }
1045
+ ]
1046
+ },
1047
+ {
1048
+ "key": "BACKEND_NOTIFICATIONS_OPEN",
1049
+ "name": "Backend Notifications Open",
1050
+ "payloadSchema": [
1051
+ {
1052
+ "name": "id",
1053
+ "type": "string"
1054
+ }
1055
+ ]
1056
+ },
982
1057
  {
983
1058
  "key": "CREATE",
984
1059
  "name": "Create"
@@ -994,47 +1069,49 @@
994
1069
  "render-ui",
995
1070
  "main",
996
1071
  {
1072
+ "type": "stack",
997
1073
  "direction": "vertical",
1074
+ "gap": "lg",
998
1075
  "children": [
999
1076
  {
1000
1077
  "align": "center",
1078
+ "direction": "horizontal",
1079
+ "gap": "md",
1080
+ "type": "stack",
1081
+ "justify": "between",
1001
1082
  "children": [
1002
1083
  {
1084
+ "align": "center",
1085
+ "type": "stack",
1086
+ "gap": "sm",
1087
+ "direction": "horizontal",
1003
1088
  "children": [
1004
1089
  {
1005
- "name": "server",
1006
- "type": "icon"
1090
+ "type": "icon",
1091
+ "name": "server"
1007
1092
  },
1008
1093
  {
1009
- "variant": "h2",
1094
+ "type": "typography",
1010
1095
  "content": "Backends",
1011
- "type": "typography"
1096
+ "variant": "h2"
1012
1097
  }
1013
- ],
1014
- "align": "center",
1015
- "gap": "sm",
1016
- "type": "stack",
1017
- "direction": "horizontal"
1098
+ ]
1018
1099
  },
1019
1100
  {
1020
- "type": "stack",
1021
- "direction": "horizontal",
1101
+ "gap": "sm",
1022
1102
  "children": [
1023
1103
  {
1024
- "label": "Create Backend",
1025
1104
  "type": "button",
1026
- "variant": "primary",
1105
+ "action": "CREATE",
1027
1106
  "icon": "plus",
1028
- "action": "CREATE"
1107
+ "variant": "primary",
1108
+ "label": "Create Backend"
1029
1109
  }
1030
1110
  ],
1031
- "gap": "sm"
1111
+ "type": "stack",
1112
+ "direction": "horizontal"
1032
1113
  }
1033
- ],
1034
- "direction": "horizontal",
1035
- "justify": "between",
1036
- "gap": "md",
1037
- "type": "stack"
1114
+ ]
1038
1115
  },
1039
1116
  {
1040
1117
  "type": "divider"
@@ -1044,16 +1121,60 @@
1044
1121
  "type": "divider"
1045
1122
  },
1046
1123
  {
1124
+ "variant": "h3",
1047
1125
  "content": "Service Health",
1048
- "type": "typography",
1049
- "variant": "h3"
1126
+ "type": "typography"
1050
1127
  },
1051
1128
  "@trait.BackendCircuitBreaker",
1052
1129
  "@trait.BackendRateLimiter",
1053
1130
  "@trait.BackendCache"
1131
+ ]
1132
+ }
1133
+ ]
1134
+ ]
1135
+ },
1136
+ {
1137
+ "from": "composing",
1138
+ "to": "composing",
1139
+ "event": "BACKEND_SEARCH"
1140
+ },
1141
+ {
1142
+ "from": "composing",
1143
+ "to": "composing",
1144
+ "event": "BACKEND_NOTIFICATIONS_OPEN",
1145
+ "effects": [
1146
+ [
1147
+ "render-ui",
1148
+ "main",
1149
+ {
1150
+ "gap": "md",
1151
+ "className": "py-8",
1152
+ "children": [
1153
+ {
1154
+ "type": "icon",
1155
+ "name": "bell"
1156
+ },
1157
+ {
1158
+ "type": "typography",
1159
+ "variant": "h3",
1160
+ "content": "No notifications"
1161
+ },
1162
+ {
1163
+ "type": "typography",
1164
+ "color": "muted",
1165
+ "content": "You're all caught up.",
1166
+ "variant": "caption"
1167
+ },
1168
+ {
1169
+ "type": "button",
1170
+ "variant": "ghost",
1171
+ "action": "INIT",
1172
+ "label": "Back to backends"
1173
+ }
1054
1174
  ],
1055
- "gap": "lg",
1056
- "type": "stack"
1175
+ "align": "center",
1176
+ "type": "stack",
1177
+ "direction": "vertical"
1057
1178
  }
1058
1179
  ]
1059
1180
  ]
@@ -1069,32 +1190,30 @@
1069
1190
  "config": {
1070
1191
  "fields": [
1071
1192
  {
1072
- "icon": "server",
1193
+ "variant": "h3",
1073
1194
  "name": "name",
1074
- "variant": "h3"
1195
+ "icon": "server"
1075
1196
  },
1076
1197
  {
1077
- "variant": "body",
1078
- "name": "url"
1198
+ "name": "url",
1199
+ "variant": "body"
1079
1200
  },
1080
1201
  {
1081
- "name": "status",
1082
- "variant": "badge"
1202
+ "variant": "badge",
1203
+ "name": "status"
1083
1204
  },
1084
1205
  {
1085
- "label": "Latency",
1086
1206
  "name": "latency",
1207
+ "label": "Latency",
1087
1208
  "variant": "caption",
1088
1209
  "format": "number"
1089
1210
  }
1090
1211
  ],
1091
- "cols": 1.0,
1092
- "gap": "sm",
1093
1212
  "itemActions": [
1094
1213
  {
1095
- "label": "View",
1214
+ "variant": "ghost",
1096
1215
  "event": "VIEW",
1097
- "variant": "ghost"
1216
+ "label": "View"
1098
1217
  },
1099
1218
  {
1100
1219
  "label": "Edit",
@@ -1102,11 +1221,13 @@
1102
1221
  "variant": "ghost"
1103
1222
  },
1104
1223
  {
1105
- "variant": "danger",
1224
+ "label": "Delete",
1106
1225
  "event": "DELETE",
1107
- "label": "Delete"
1226
+ "variant": "danger"
1108
1227
  }
1109
- ]
1228
+ ],
1229
+ "gap": "sm",
1230
+ "cols": 1.0
1110
1231
  },
1111
1232
  "listens": [
1112
1233
  {
@@ -1152,15 +1273,15 @@
1152
1273
  "name": "BackendCreate",
1153
1274
  "linkedEntity": "Backend",
1154
1275
  "config": {
1155
- "icon": "plus-circle",
1156
- "title": "New Backend",
1157
1276
  "mode": "create",
1277
+ "icon": "plus-circle",
1158
1278
  "fields": [
1159
1279
  "name",
1160
1280
  "url",
1161
1281
  "status",
1162
1282
  "latency"
1163
- ]
1283
+ ],
1284
+ "title": "New Backend"
1164
1285
  },
1165
1286
  "events": {
1166
1287
  "OPEN": "CREATE"
@@ -1181,15 +1302,15 @@
1181
1302
  "name": "BackendEdit",
1182
1303
  "linkedEntity": "Backend",
1183
1304
  "config": {
1184
- "mode": "edit",
1185
- "icon": "edit",
1186
1305
  "title": "Edit Backend",
1306
+ "mode": "edit",
1187
1307
  "fields": [
1188
1308
  "name",
1189
1309
  "url",
1190
1310
  "status",
1191
1311
  "latency"
1192
- ]
1312
+ ],
1313
+ "icon": "edit"
1193
1314
  },
1194
1315
  "events": {
1195
1316
  "OPEN": "EDIT"
@@ -1210,15 +1331,15 @@
1210
1331
  "name": "BackendView",
1211
1332
  "linkedEntity": "Backend",
1212
1333
  "config": {
1334
+ "title": "View Backend",
1335
+ "mode": "edit",
1213
1336
  "fields": [
1214
1337
  "name",
1215
1338
  "url",
1216
1339
  "status",
1217
1340
  "latency"
1218
1341
  ],
1219
- "mode": "edit",
1220
- "icon": "eye",
1221
- "title": "View Backend"
1342
+ "icon": "eye"
1222
1343
  },
1223
1344
  "events": {
1224
1345
  "OPEN": "VIEW"
@@ -1239,10 +1360,10 @@
1239
1360
  "name": "BackendDelete",
1240
1361
  "linkedEntity": "Backend",
1241
1362
  "config": {
1242
- "alertMessage": "This action cannot be undone.",
1363
+ "confirmLabel": "Delete",
1243
1364
  "title": "Delete Backend",
1244
1365
  "icon": "alert-triangle",
1245
- "confirmLabel": "Delete"
1366
+ "alertMessage": "This action cannot be undone."
1246
1367
  },
1247
1368
  "events": {
1248
1369
  "CONFIRM": "CONFIRM_DELETE",
@@ -1448,6 +1569,9 @@
1448
1569
  "name": "BackendsPage",
1449
1570
  "path": "/backends",
1450
1571
  "traits": [
1572
+ {
1573
+ "ref": "BackendAppLayout"
1574
+ },
1451
1575
  {
1452
1576
  "ref": "BackendCatalog"
1453
1577
  },
@@ -1485,6 +1609,10 @@
1485
1609
  {
1486
1610
  "name": "AnalyticsOrbital",
1487
1611
  "uses": [
1612
+ {
1613
+ "from": "std/behaviors/std-app-layout",
1614
+ "as": "AppShell"
1615
+ },
1488
1616
  {
1489
1617
  "from": "std/behaviors/std-browse",
1490
1618
  "as": "Browse"
@@ -1527,20 +1655,53 @@
1527
1655
  ]
1528
1656
  },
1529
1657
  "traits": [
1658
+ {
1659
+ "ref": "AppShell.traits.AppLayout",
1660
+ "name": "AnalyticsAppLayout",
1661
+ "linkedEntity": "AnalyticsRecord",
1662
+ "config": {
1663
+ "contentTrait": "@trait.AnalyticsDisplay",
1664
+ "searchEvent": "ANALYTICS_SEARCH",
1665
+ "navItems": [
1666
+ {
1667
+ "href": "/routes",
1668
+ "label": "Routes",
1669
+ "icon": "git-branch"
1670
+ },
1671
+ {
1672
+ "label": "Backends",
1673
+ "href": "/backends",
1674
+ "icon": "server"
1675
+ },
1676
+ {
1677
+ "href": "/analytics",
1678
+ "label": "Analytics",
1679
+ "icon": "bar-chart-2"
1680
+ }
1681
+ ],
1682
+ "appName": "API Gateway",
1683
+ "notificationClickEvent": "ANALYTICS_NOTIFICATIONS_OPEN",
1684
+ "notifications": []
1685
+ },
1686
+ "events": {
1687
+ "NOTIFY_CLICK": "ANALYTICS_NOTIFICATIONS_OPEN",
1688
+ "SEARCH": "ANALYTICS_SEARCH"
1689
+ }
1690
+ },
1530
1691
  {
1531
1692
  "ref": "Browse.traits.BrowseItemBrowse",
1532
1693
  "name": "AnalyticsBrowseList",
1533
1694
  "linkedEntity": "AnalyticsRecord",
1534
1695
  "config": {
1535
1696
  "pageSize": 100.0,
1536
- "cols": 1.0,
1537
1697
  "displayPageSize": 10.0,
1698
+ "cols": 1.0,
1538
1699
  "fields": [
1539
1700
  {
1540
1701
  "label": "Route",
1541
1702
  "variant": "h4",
1542
- "icon": "bar-chart-2",
1543
- "name": "routePath"
1703
+ "name": "routePath",
1704
+ "icon": "bar-chart-2"
1544
1705
  },
1545
1706
  {
1546
1707
  "variant": "badge",
@@ -1548,20 +1709,20 @@
1548
1709
  "name": "method"
1549
1710
  },
1550
1711
  {
1551
- "name": "statusCode",
1552
1712
  "label": "Status",
1553
- "variant": "badge"
1713
+ "variant": "badge",
1714
+ "name": "statusCode"
1554
1715
  },
1555
1716
  {
1556
1717
  "label": "Latency",
1557
- "format": "number",
1558
1718
  "name": "latencyMs",
1559
- "variant": "caption"
1719
+ "variant": "caption",
1720
+ "format": "number"
1560
1721
  },
1561
1722
  {
1562
1723
  "name": "timestamp",
1563
- "label": "Time",
1564
1724
  "variant": "caption",
1725
+ "label": "Time",
1565
1726
  "format": "date"
1566
1727
  }
1567
1728
  ],
@@ -1571,6 +1732,24 @@
1571
1732
  {
1572
1733
  "name": "AnalyticsDisplay",
1573
1734
  "category": "interaction",
1735
+ "listens": [
1736
+ {
1737
+ "event": "ANALYTICS_SEARCH",
1738
+ "triggers": "ANALYTICS_SEARCH",
1739
+ "source": {
1740
+ "kind": "trait",
1741
+ "trait": "AnalyticsAppLayout"
1742
+ }
1743
+ },
1744
+ {
1745
+ "event": "ANALYTICS_NOTIFICATIONS_OPEN",
1746
+ "triggers": "ANALYTICS_NOTIFICATIONS_OPEN",
1747
+ "source": {
1748
+ "kind": "trait",
1749
+ "trait": "AnalyticsAppLayout"
1750
+ }
1751
+ }
1752
+ ],
1574
1753
  "stateMachine": {
1575
1754
  "states": [
1576
1755
  {
@@ -1582,6 +1761,26 @@
1582
1761
  {
1583
1762
  "key": "INIT",
1584
1763
  "name": "Initialize"
1764
+ },
1765
+ {
1766
+ "key": "ANALYTICS_SEARCH",
1767
+ "name": "Analytics Search",
1768
+ "payloadSchema": [
1769
+ {
1770
+ "name": "value",
1771
+ "type": "string"
1772
+ }
1773
+ ]
1774
+ },
1775
+ {
1776
+ "key": "ANALYTICS_NOTIFICATIONS_OPEN",
1777
+ "name": "Analytics Notifications Open",
1778
+ "payloadSchema": [
1779
+ {
1780
+ "name": "id",
1781
+ "type": "string"
1782
+ }
1783
+ ]
1585
1784
  }
1586
1785
  ],
1587
1786
  "transitions": [
@@ -1594,38 +1793,84 @@
1594
1793
  "render-ui",
1595
1794
  "main",
1596
1795
  {
1597
- "className": "max-w-6xl mx-auto w-full p-4",
1796
+ "direction": "vertical",
1598
1797
  "type": "stack",
1599
1798
  "children": [
1600
1799
  {
1601
- "gap": "sm",
1602
- "type": "stack",
1603
1800
  "direction": "horizontal",
1604
- "align": "center",
1801
+ "type": "stack",
1605
1802
  "children": [
1606
1803
  {
1607
- "type": "icon",
1608
- "name": "bar-chart-2"
1804
+ "name": "bar-chart-2",
1805
+ "type": "icon"
1609
1806
  },
1610
1807
  {
1611
- "content": "Analytics",
1612
1808
  "variant": "h2",
1613
- "type": "typography"
1809
+ "type": "typography",
1810
+ "content": "Analytics"
1614
1811
  }
1615
- ]
1812
+ ],
1813
+ "align": "center",
1814
+ "gap": "sm"
1616
1815
  },
1617
1816
  {
1618
1817
  "type": "divider"
1619
1818
  },
1620
1819
  {
1621
- "content": "Recent requests",
1622
1820
  "type": "typography",
1821
+ "content": "Recent requests",
1623
1822
  "variant": "h3"
1624
1823
  },
1625
1824
  "@trait.AnalyticsBrowseList"
1626
1825
  ],
1627
1826
  "gap": "lg",
1628
- "direction": "vertical"
1827
+ "className": "max-w-6xl mx-auto w-full p-4"
1828
+ }
1829
+ ]
1830
+ ]
1831
+ },
1832
+ {
1833
+ "from": "composing",
1834
+ "to": "composing",
1835
+ "event": "ANALYTICS_SEARCH"
1836
+ },
1837
+ {
1838
+ "from": "composing",
1839
+ "to": "composing",
1840
+ "event": "ANALYTICS_NOTIFICATIONS_OPEN",
1841
+ "effects": [
1842
+ [
1843
+ "render-ui",
1844
+ "main",
1845
+ {
1846
+ "children": [
1847
+ {
1848
+ "type": "icon",
1849
+ "name": "bell"
1850
+ },
1851
+ {
1852
+ "content": "No notifications",
1853
+ "variant": "h3",
1854
+ "type": "typography"
1855
+ },
1856
+ {
1857
+ "type": "typography",
1858
+ "variant": "caption",
1859
+ "color": "muted",
1860
+ "content": "You're all caught up."
1861
+ },
1862
+ {
1863
+ "type": "button",
1864
+ "action": "INIT",
1865
+ "variant": "ghost",
1866
+ "label": "Back to analytics"
1867
+ }
1868
+ ],
1869
+ "gap": "md",
1870
+ "direction": "vertical",
1871
+ "type": "stack",
1872
+ "align": "center",
1873
+ "className": "py-8"
1629
1874
  }
1630
1875
  ]
1631
1876
  ]
@@ -1640,6 +1885,9 @@
1640
1885
  "name": "Analytics",
1641
1886
  "path": "/analytics",
1642
1887
  "traits": [
1888
+ {
1889
+ "ref": "AnalyticsAppLayout"
1890
+ },
1643
1891
  {
1644
1892
  "ref": "AnalyticsDisplay"
1645
1893
  },