@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
@@ -86,6 +86,10 @@
86
86
  "ref": "AppShell.traits.AppLayout",
87
87
  "name": "BookingProviderAppLayout",
88
88
  "config": {
89
+ "searchEvent": "BOOKING_SEARCH",
90
+ "notifications": [],
91
+ "contentTrait": "@trait.ProviderCatalog",
92
+ "appName": "BookingSystemApp",
89
93
  "navItems": [
90
94
  {
91
95
  "label": "Providers",
@@ -93,25 +97,21 @@
93
97
  "href": "/providers"
94
98
  },
95
99
  {
100
+ "href": "/book",
96
101
  "label": "Book",
97
- "icon": "calendar-plus",
98
- "href": "/book"
102
+ "icon": "calendar-plus"
99
103
  },
100
104
  {
101
- "label": "Appointments",
102
105
  "href": "/appointments",
103
- "icon": "calendar"
106
+ "icon": "calendar",
107
+ "label": "Appointments"
104
108
  },
105
109
  {
106
- "icon": "clock",
107
110
  "label": "Schedule",
111
+ "icon": "clock",
108
112
  "href": "/schedule"
109
113
  }
110
114
  ],
111
- "searchEvent": "BOOKING_SEARCH",
112
- "contentTrait": "@trait.ProviderCatalog",
113
- "notifications": [],
114
- "appName": "BookingSystemApp",
115
115
  "notificationClickEvent": "BOOKING_NOTIFICATIONS_OPEN"
116
116
  },
117
117
  "events": {
@@ -203,16 +203,16 @@
203
203
  "direction": "vertical",
204
204
  "children": [
205
205
  {
206
+ "direction": "horizontal",
207
+ "type": "stack",
206
208
  "align": "center",
207
209
  "children": [
208
210
  {
209
- "gap": "sm",
210
211
  "align": "center",
211
- "direction": "horizontal",
212
212
  "children": [
213
213
  {
214
- "name": "user",
215
- "type": "icon"
214
+ "type": "icon",
215
+ "name": "user"
216
216
  },
217
217
  {
218
218
  "type": "typography",
@@ -220,37 +220,37 @@
220
220
  "variant": "h2"
221
221
  }
222
222
  ],
223
- "type": "stack"
223
+ "gap": "sm",
224
+ "type": "stack",
225
+ "direction": "horizontal"
224
226
  },
225
227
  {
228
+ "direction": "horizontal",
229
+ "type": "stack",
230
+ "gap": "sm",
226
231
  "children": [
227
232
  {
228
- "action": "CREATE",
229
- "variant": "primary",
230
233
  "icon": "plus",
234
+ "variant": "primary",
231
235
  "type": "button",
236
+ "action": "CREATE",
232
237
  "label": "Add Provider"
233
238
  }
234
- ],
235
- "direction": "horizontal",
236
- "type": "stack",
237
- "gap": "sm"
239
+ ]
238
240
  }
239
241
  ],
240
- "type": "stack",
241
242
  "justify": "between",
242
- "direction": "horizontal",
243
243
  "gap": "md"
244
244
  },
245
245
  {
246
- "gap": "md",
246
+ "align": "center",
247
247
  "type": "stack",
248
248
  "direction": "horizontal",
249
- "align": "center",
250
249
  "children": [
251
250
  "@trait.ProviderSearch",
252
251
  "@trait.ProviderFilter"
253
- ]
252
+ ],
253
+ "gap": "md"
254
254
  },
255
255
  {
256
256
  "type": "divider"
@@ -281,15 +281,17 @@
281
281
  "render-ui",
282
282
  "main",
283
283
  {
284
+ "className": "py-8",
285
+ "align": "center",
284
286
  "children": [
285
287
  {
286
288
  "type": "icon",
287
289
  "name": "bell"
288
290
  },
289
291
  {
290
- "content": "No notifications",
292
+ "variant": "h3",
291
293
  "type": "typography",
292
- "variant": "h3"
294
+ "content": "No notifications"
293
295
  },
294
296
  {
295
297
  "type": "typography",
@@ -298,16 +300,14 @@
298
300
  "content": "You're all caught up."
299
301
  },
300
302
  {
301
- "label": "Back to providers",
302
- "action": "INIT",
303
303
  "variant": "ghost",
304
- "type": "button"
304
+ "action": "INIT",
305
+ "type": "button",
306
+ "label": "Back to providers"
305
307
  }
306
308
  ],
307
- "align": "center",
308
- "direction": "vertical",
309
309
  "type": "stack",
310
- "className": "py-8",
310
+ "direction": "vertical",
311
311
  "gap": "md"
312
312
  }
313
313
  ]
@@ -321,17 +321,17 @@
321
321
  "ref": "Search.traits.SearchResultSearch",
322
322
  "name": "ProviderSearch",
323
323
  "config": {
324
- "event": "SEARCH",
325
- "placeholder": "Search providers…"
324
+ "placeholder": "Search providers…",
325
+ "event": "SEARCH"
326
326
  }
327
327
  },
328
328
  {
329
329
  "ref": "Filter.traits.FilterTargetFilter",
330
330
  "name": "ProviderFilter",
331
331
  "config": {
332
+ "event": "FILTER",
332
333
  "filters": [
333
334
  {
334
- "label": "Specialty",
335
335
  "filterType": "select",
336
336
  "options": [
337
337
  "general",
@@ -340,17 +340,17 @@
340
340
  "cardiology",
341
341
  "psychiatry"
342
342
  ],
343
+ "label": "Specialty",
343
344
  "field": "specialty"
344
345
  },
345
346
  {
347
+ "label": "Rating",
346
348
  "field": "rating",
347
349
  "max": 5.0,
348
- "label": "Rating",
349
350
  "filterType": "range",
350
351
  "min": 0.0
351
352
  }
352
- ],
353
- "event": "FILTER"
353
+ ]
354
354
  }
355
355
  },
356
356
  {
@@ -360,36 +360,36 @@
360
360
  "metrics": [
361
361
  {
362
362
  "label": "Total Providers",
363
- "variant": "primary",
363
+ "icon": "users",
364
364
  "format": "number",
365
365
  "aggregation": "count",
366
- "icon": "users"
366
+ "variant": "primary"
367
367
  },
368
368
  {
369
369
  "label": "Active",
370
370
  "aggregation": "count",
371
- "variant": "success",
372
- "format": "number",
373
371
  "icon": "check-circle",
372
+ "format": "number",
374
373
  "filter": {
375
374
  "available": true
376
- }
375
+ },
376
+ "variant": "success"
377
377
  },
378
378
  {
379
379
  "label": "Avg Rating",
380
- "icon": "star",
381
380
  "aggregation": "avg",
382
381
  "format": "number",
383
382
  "field": "rating",
384
- "variant": "info"
383
+ "variant": "info",
384
+ "icon": "star"
385
385
  },
386
386
  {
387
- "field": "hourlyRate",
388
- "icon": "dollar-sign",
389
387
  "aggregation": "avg",
390
- "variant": "info",
388
+ "format": "currency",
389
+ "field": "hourlyRate",
391
390
  "label": "Avg Hourly Rate",
392
- "format": "currency"
391
+ "variant": "info",
392
+ "icon": "dollar-sign"
393
393
  }
394
394
  ],
395
395
  "title": "Provider Overview"
@@ -409,10 +409,10 @@
409
409
  "ref": "Graphs.traits.GraphItemGraph",
410
410
  "name": "ProviderGraphs",
411
411
  "config": {
412
- "title": "Providers by Specialty",
413
412
  "chartType": "pie",
414
413
  "categoryField": "specialty",
415
414
  "aggregation": "count",
415
+ "title": "Providers by Specialty",
416
416
  "subtitle": "Distribution across specialties"
417
417
  },
418
418
  "listens": [
@@ -431,7 +431,6 @@
431
431
  "name": "ProviderBrowseList",
432
432
  "linkedEntity": "Provider",
433
433
  "config": {
434
- "cols": 2.0,
435
434
  "gap": "md",
436
435
  "fields": [
437
436
  {
@@ -444,38 +443,39 @@
444
443
  "variant": "badge"
445
444
  },
446
445
  {
446
+ "name": "rating",
447
447
  "variant": "body",
448
- "format": "number",
449
- "name": "rating"
448
+ "format": "number"
450
449
  },
451
450
  {
452
451
  "variant": "h4",
453
- "label": "Hourly Rate",
454
452
  "name": "hourlyRate",
453
+ "label": "Hourly Rate",
455
454
  "format": "currency"
456
455
  },
457
456
  {
458
- "name": "available",
459
457
  "variant": "body",
458
+ "name": "available",
460
459
  "label": "Availability",
461
460
  "format": "boolean"
462
461
  }
463
462
  ],
463
+ "cols": 2.0,
464
464
  "itemActions": [
465
465
  {
466
- "variant": "ghost",
467
466
  "label": "View",
468
- "event": "VIEW"
467
+ "event": "VIEW",
468
+ "variant": "ghost"
469
469
  },
470
470
  {
471
+ "variant": "ghost",
471
472
  "event": "EDIT",
472
- "label": "Edit",
473
- "variant": "ghost"
473
+ "label": "Edit"
474
474
  },
475
475
  {
476
- "variant": "danger",
477
476
  "label": "Delete",
478
- "event": "DELETE"
477
+ "event": "DELETE",
478
+ "variant": "danger"
479
479
  }
480
480
  ]
481
481
  },
@@ -696,8 +696,8 @@
696
696
  "Provider",
697
697
  {
698
698
  "emit": {
699
- "failure": "ProviderLoadFailed",
700
- "success": "ProviderLoaded"
699
+ "success": "ProviderLoaded",
700
+ "failure": "ProviderLoadFailed"
701
701
  }
702
702
  }
703
703
  ]
@@ -722,9 +722,10 @@
722
722
  "render-ui",
723
723
  "modal",
724
724
  {
725
+ "type": "stack",
726
+ "direction": "vertical",
725
727
  "children": [
726
728
  {
727
- "direction": "horizontal",
728
729
  "type": "stack",
729
730
  "children": [
730
731
  {
@@ -732,18 +733,18 @@
732
733
  "type": "icon"
733
734
  },
734
735
  {
735
- "content": "Add Provider",
736
736
  "type": "typography",
737
- "variant": "h3"
737
+ "variant": "h3",
738
+ "content": "Add Provider"
738
739
  }
739
740
  ],
741
+ "direction": "horizontal",
740
742
  "gap": "sm"
741
743
  },
742
744
  {
743
745
  "type": "divider"
744
746
  },
745
747
  {
746
- "cancelEvent": "CLOSE",
747
748
  "fields": [
748
749
  "name",
749
750
  "specialty",
@@ -753,14 +754,13 @@
753
754
  "hourlyRate",
754
755
  "available"
755
756
  ],
756
- "type": "form-section",
757
757
  "submitEvent": "SAVE",
758
- "mode": "create"
758
+ "mode": "create",
759
+ "type": "form-section",
760
+ "cancelEvent": "CLOSE"
759
761
  }
760
762
  ],
761
- "type": "stack",
762
- "gap": "md",
763
- "direction": "vertical"
763
+ "gap": "md"
764
764
  }
765
765
  ]
766
766
  ]
@@ -1021,8 +1021,8 @@
1021
1021
  "Provider",
1022
1022
  {
1023
1023
  "emit": {
1024
- "failure": "ProviderLoadFailed",
1025
- "success": "ProviderLoaded"
1024
+ "success": "ProviderLoaded",
1025
+ "failure": "ProviderLoadFailed"
1026
1026
  }
1027
1027
  }
1028
1028
  ]
@@ -1039,8 +1039,8 @@
1039
1039
  {
1040
1040
  "id": "@payload.id",
1041
1041
  "emit": {
1042
- "success": "ProviderLoaded",
1043
- "failure": "ProviderLoadFailed"
1042
+ "failure": "ProviderLoadFailed",
1043
+ "success": "ProviderLoaded"
1044
1044
  }
1045
1045
  }
1046
1046
  ],
@@ -1049,11 +1049,10 @@
1049
1049
  "modal",
1050
1050
  {
1051
1051
  "direction": "vertical",
1052
+ "type": "stack",
1053
+ "gap": "md",
1052
1054
  "children": [
1053
1055
  {
1054
- "type": "stack",
1055
- "direction": "horizontal",
1056
- "gap": "sm",
1057
1056
  "children": [
1058
1057
  {
1059
1058
  "name": "edit",
@@ -1064,15 +1063,18 @@
1064
1063
  "type": "typography",
1065
1064
  "content": "Edit Provider"
1066
1065
  }
1067
- ]
1066
+ ],
1067
+ "gap": "sm",
1068
+ "type": "stack",
1069
+ "direction": "horizontal"
1068
1070
  },
1069
1071
  {
1070
1072
  "type": "divider"
1071
1073
  },
1072
1074
  {
1073
1075
  "type": "form-section",
1074
- "entity": "@payload.row",
1075
1076
  "submitEvent": "SAVE",
1077
+ "entity": "@payload.row",
1076
1078
  "cancelEvent": "CLOSE",
1077
1079
  "fields": [
1078
1080
  "name",
@@ -1085,9 +1087,7 @@
1085
1087
  ],
1086
1088
  "mode": "edit"
1087
1089
  }
1088
- ],
1089
- "type": "stack",
1090
- "gap": "md"
1090
+ ]
1091
1091
  }
1092
1092
  ]
1093
1093
  ]
@@ -1128,8 +1128,8 @@
1128
1128
  "@payload.data",
1129
1129
  {
1130
1130
  "emit": {
1131
- "success": "ProviderUpdated",
1132
- "failure": "ProviderUpdateFailed"
1131
+ "failure": "ProviderUpdateFailed",
1132
+ "success": "ProviderUpdated"
1133
1133
  }
1134
1134
  }
1135
1135
  ],
@@ -1322,8 +1322,8 @@
1322
1322
  "Provider",
1323
1323
  {
1324
1324
  "emit": {
1325
- "success": "ProviderLoaded",
1326
- "failure": "ProviderLoadFailed"
1325
+ "failure": "ProviderLoadFailed",
1326
+ "success": "ProviderLoaded"
1327
1327
  }
1328
1328
  }
1329
1329
  ]
@@ -1338,45 +1338,46 @@
1338
1338
  "fetch",
1339
1339
  "Provider",
1340
1340
  {
1341
- "id": "@payload.id",
1342
1341
  "emit": {
1343
1342
  "success": "ProviderLoaded",
1344
1343
  "failure": "ProviderLoadFailed"
1345
- }
1344
+ },
1345
+ "id": "@payload.id"
1346
1346
  }
1347
1347
  ],
1348
1348
  [
1349
1349
  "render-ui",
1350
1350
  "modal",
1351
1351
  {
1352
+ "gap": "md",
1353
+ "direction": "vertical",
1352
1354
  "children": [
1353
1355
  {
1356
+ "align": "center",
1354
1357
  "type": "stack",
1355
- "gap": "sm",
1356
1358
  "children": [
1357
1359
  {
1358
1360
  "type": "icon",
1359
1361
  "name": "eye"
1360
1362
  },
1361
1363
  {
1362
- "content": "@entity.name",
1364
+ "type": "typography",
1363
1365
  "variant": "h3",
1364
- "type": "typography"
1366
+ "content": "@entity.name"
1365
1367
  }
1366
1368
  ],
1367
1369
  "direction": "horizontal",
1368
- "align": "center"
1370
+ "gap": "sm"
1369
1371
  },
1370
1372
  {
1371
1373
  "type": "divider"
1372
1374
  },
1373
1375
  {
1374
- "type": "stack",
1375
1376
  "children": [
1376
1377
  {
1378
+ "type": "typography",
1377
1379
  "variant": "caption",
1378
- "content": "Name",
1379
- "type": "typography"
1380
+ "content": "Name"
1380
1381
  },
1381
1382
  {
1382
1383
  "content": "@entity.name",
@@ -1384,44 +1385,47 @@
1384
1385
  "variant": "body"
1385
1386
  }
1386
1387
  ],
1388
+ "direction": "horizontal",
1387
1389
  "gap": "md",
1388
- "direction": "horizontal"
1390
+ "type": "stack"
1389
1391
  },
1390
1392
  {
1391
- "direction": "horizontal",
1392
1393
  "children": [
1393
1394
  {
1394
- "content": "Specialty",
1395
1395
  "variant": "caption",
1396
- "type": "typography"
1396
+ "type": "typography",
1397
+ "content": "Specialty"
1397
1398
  },
1398
1399
  {
1400
+ "type": "typography",
1399
1401
  "variant": "body",
1400
- "content": "@entity.specialty",
1401
- "type": "typography"
1402
+ "content": "@entity.specialty"
1402
1403
  }
1403
1404
  ],
1405
+ "gap": "md",
1404
1406
  "type": "stack",
1405
- "gap": "md"
1407
+ "direction": "horizontal"
1406
1408
  },
1407
1409
  {
1408
- "gap": "md",
1410
+ "type": "stack",
1409
1411
  "direction": "horizontal",
1412
+ "gap": "md",
1410
1413
  "children": [
1411
1414
  {
1415
+ "variant": "caption",
1412
1416
  "content": "Location",
1413
- "type": "typography",
1414
- "variant": "caption"
1417
+ "type": "typography"
1415
1418
  },
1416
1419
  {
1417
1420
  "variant": "body",
1418
1421
  "content": "@entity.location",
1419
1422
  "type": "typography"
1420
1423
  }
1421
- ],
1422
- "type": "stack"
1424
+ ]
1423
1425
  },
1424
1426
  {
1427
+ "direction": "horizontal",
1428
+ "gap": "md",
1425
1429
  "type": "stack",
1426
1430
  "children": [
1427
1431
  {
@@ -1430,35 +1434,32 @@
1430
1434
  "type": "typography"
1431
1435
  },
1432
1436
  {
1433
- "type": "typography",
1437
+ "variant": "body",
1434
1438
  "content": "@entity.phone",
1435
- "variant": "body"
1439
+ "type": "typography"
1436
1440
  }
1437
- ],
1438
- "gap": "md",
1439
- "direction": "horizontal"
1441
+ ]
1440
1442
  },
1441
1443
  {
1442
- "direction": "horizontal",
1443
1444
  "gap": "md",
1445
+ "direction": "horizontal",
1446
+ "type": "stack",
1444
1447
  "children": [
1445
1448
  {
1446
- "type": "typography",
1447
1449
  "variant": "caption",
1450
+ "type": "typography",
1448
1451
  "content": "Rating"
1449
1452
  },
1450
1453
  {
1454
+ "content": "@entity.rating",
1451
1455
  "type": "typography",
1452
- "variant": "body",
1453
- "content": "@entity.rating"
1456
+ "variant": "body"
1454
1457
  }
1455
- ],
1456
- "type": "stack"
1458
+ ]
1457
1459
  },
1458
1460
  {
1459
1461
  "type": "stack",
1460
1462
  "gap": "md",
1461
- "direction": "horizontal",
1462
1463
  "children": [
1463
1464
  {
1464
1465
  "variant": "caption",
@@ -1466,56 +1467,55 @@
1466
1467
  "type": "typography"
1467
1468
  },
1468
1469
  {
1469
- "type": "typography",
1470
1470
  "variant": "body",
1471
- "content": "@entity.hourlyRate"
1471
+ "content": "@entity.hourlyRate",
1472
+ "type": "typography"
1472
1473
  }
1473
- ]
1474
+ ],
1475
+ "direction": "horizontal"
1474
1476
  },
1475
1477
  {
1476
- "type": "stack",
1477
- "direction": "horizontal",
1478
- "gap": "md",
1479
1478
  "children": [
1480
1479
  {
1480
+ "type": "typography",
1481
1481
  "variant": "caption",
1482
- "content": "Available",
1483
- "type": "typography"
1482
+ "content": "Available"
1484
1483
  },
1485
1484
  {
1486
1485
  "type": "typography",
1487
- "variant": "body",
1488
- "content": "@entity.available"
1486
+ "content": "@entity.available",
1487
+ "variant": "body"
1489
1488
  }
1490
- ]
1489
+ ],
1490
+ "gap": "md",
1491
+ "direction": "horizontal",
1492
+ "type": "stack"
1491
1493
  },
1492
1494
  {
1493
1495
  "type": "divider"
1494
1496
  },
1495
1497
  {
1496
- "gap": "sm",
1497
- "type": "stack",
1498
1498
  "direction": "horizontal",
1499
+ "type": "stack",
1500
+ "gap": "sm",
1499
1501
  "justify": "end",
1500
1502
  "children": [
1501
1503
  {
1504
+ "icon": "edit",
1502
1505
  "label": "Edit",
1503
- "type": "button",
1504
1506
  "action": "EDIT",
1505
- "icon": "edit",
1507
+ "type": "button",
1506
1508
  "variant": "primary"
1507
1509
  },
1508
1510
  {
1509
1511
  "type": "button",
1510
- "action": "CLOSE",
1512
+ "label": "Close",
1511
1513
  "variant": "ghost",
1512
- "label": "Close"
1514
+ "action": "CLOSE"
1513
1515
  }
1514
1516
  ]
1515
1517
  }
1516
1518
  ],
1517
- "direction": "vertical",
1518
- "gap": "md",
1519
1519
  "type": "stack"
1520
1520
  }
1521
1521
  ]
@@ -1767,67 +1767,67 @@
1767
1767
  "fetch",
1768
1768
  "Provider",
1769
1769
  {
1770
+ "id": "@payload.id",
1770
1771
  "emit": {
1771
- "failure": "ProviderLoadFailed",
1772
- "success": "ProviderLoaded"
1773
- },
1774
- "id": "@payload.id"
1772
+ "success": "ProviderLoaded",
1773
+ "failure": "ProviderLoadFailed"
1774
+ }
1775
1775
  }
1776
1776
  ],
1777
1777
  [
1778
1778
  "render-ui",
1779
1779
  "modal",
1780
1780
  {
1781
+ "gap": "md",
1781
1782
  "children": [
1782
1783
  {
1783
1784
  "direction": "horizontal",
1784
- "align": "center",
1785
- "type": "stack",
1786
1785
  "children": [
1787
1786
  {
1788
1787
  "name": "alert-triangle",
1789
1788
  "type": "icon"
1790
1789
  },
1791
1790
  {
1792
- "variant": "h3",
1793
1791
  "content": "Delete Provider",
1792
+ "variant": "h3",
1794
1793
  "type": "typography"
1795
1794
  }
1796
1795
  ],
1796
+ "type": "stack",
1797
+ "align": "center",
1797
1798
  "gap": "sm"
1798
1799
  },
1799
1800
  {
1800
1801
  "type": "divider"
1801
1802
  },
1802
1803
  {
1804
+ "variant": "error",
1803
1805
  "type": "alert",
1804
- "message": "This action cannot be undone.",
1805
- "variant": "error"
1806
+ "message": "This action cannot be undone."
1806
1807
  },
1807
1808
  {
1809
+ "type": "stack",
1810
+ "direction": "horizontal",
1808
1811
  "children": [
1809
1812
  {
1810
- "variant": "ghost",
1811
- "label": "Cancel",
1812
1813
  "type": "button",
1814
+ "label": "Cancel",
1815
+ "variant": "ghost",
1813
1816
  "action": "CANCEL"
1814
1817
  },
1815
1818
  {
1816
- "variant": "danger",
1819
+ "label": "Delete",
1817
1820
  "icon": "check",
1818
1821
  "type": "button",
1819
1822
  "action": "CONFIRM_DELETE",
1820
- "label": "Delete"
1823
+ "variant": "danger"
1821
1824
  }
1822
1825
  ],
1823
- "direction": "horizontal",
1824
- "gap": "sm",
1825
1826
  "justify": "end",
1826
- "type": "stack"
1827
+ "gap": "sm"
1827
1828
  }
1828
1829
  ],
1829
1830
  "type": "stack",
1830
- "gap": "md",
1831
1831
  "direction": "vertical"
1832
1832
  }
1833
1833
  ]
@@ -1845,8 +1845,8 @@
1845
1845
  "@entity.pendingId",
1846
1846
  {
1847
1847
  "emit": {
1848
- "success": "ProviderDeleted",
1849
- "failure": "ProviderDeleteFailed"
1848
+ "failure": "ProviderDeleteFailed",
1849
+ "success": "ProviderDeleted"
1850
1850
  }
1851
1851
  }
1852
1852
  ],
@@ -1867,8 +1867,8 @@
1867
1867
  "Provider",
1868
1868
  {
1869
1869
  "emit": {
1870
- "success": "ProviderLoaded",
1871
- "failure": "ProviderLoadFailed"
1870
+ "failure": "ProviderLoadFailed",
1871
+ "success": "ProviderLoaded"
1872
1872
  }
1873
1873
  }
1874
1874
  ],
@@ -1900,9 +1900,9 @@
1900
1900
  "Provider",
1901
1901
  {
1902
1902
  "emit": {
1903
- "failure": "ProviderLoadFailed",
1904
- "success": "ProviderLoaded"
1905
- }
1903
+ "success": "ProviderLoaded",
1904
+ "failure": "ProviderLoadFailed"
1905
+ }
1906
1906
  }
1907
1907
  ]
1908
1908
  ]
@@ -1929,8 +1929,8 @@
1929
1929
  "Provider",
1930
1930
  {
1931
1931
  "emit": {
1932
- "failure": "ProviderLoadFailed",
1933
- "success": "ProviderLoaded"
1932
+ "success": "ProviderLoaded",
1933
+ "failure": "ProviderLoadFailed"
1934
1934
  }
1935
1935
  }
1936
1936
  ]
@@ -1986,6 +1986,10 @@
1986
1986
  {
1987
1987
  "name": "BookingOrbital",
1988
1988
  "uses": [
1989
+ {
1990
+ "from": "std/behaviors/std-app-layout",
1991
+ "as": "AppShell"
1992
+ },
1989
1993
  {
1990
1994
  "from": "std/behaviors/std-service-stripe",
1991
1995
  "as": "Stripe"
@@ -2042,14 +2046,53 @@
2042
2046
  ]
2043
2047
  },
2044
2048
  "traits": [
2049
+ {
2050
+ "ref": "AppShell.traits.AppLayout",
2051
+ "name": "BookingAppLayout",
2052
+ "linkedEntity": "Booking",
2053
+ "config": {
2054
+ "navItems": [
2055
+ {
2056
+ "href": "/providers",
2057
+ "icon": "user-check",
2058
+ "label": "Providers"
2059
+ },
2060
+ {
2061
+ "href": "/book",
2062
+ "icon": "calendar-plus",
2063
+ "label": "Book"
2064
+ },
2065
+ {
2066
+ "label": "Appointments",
2067
+ "icon": "calendar",
2068
+ "href": "/appointments"
2069
+ },
2070
+ {
2071
+ "href": "/schedule",
2072
+ "icon": "clock",
2073
+ "label": "Schedule"
2074
+ }
2075
+ ],
2076
+ "contentTrait": "@trait.BookingWizard",
2077
+ "notifications": [],
2078
+ "notificationClickEvent": "BOOKING_NOTIFICATIONS_OPEN",
2079
+ "appName": "BookingSystemApp",
2080
+ "searchEvent": "BOOKING_SEARCH",
2081
+ "topBarActions": []
2082
+ },
2083
+ "events": {
2084
+ "SEARCH": "BOOKING_SEARCH",
2085
+ "NOTIFY_CLICK": "BOOKING_NOTIFICATIONS_OPEN"
2086
+ }
2087
+ },
2045
2088
  {
2046
2089
  "ref": "Stripe.traits.ServiceStripeStripe",
2047
2090
  "name": "BookingPayment",
2048
2091
  "config": {
2049
- "currency": "usd",
2050
- "uiTrait": "@trait.BookingPaymentForm",
2092
+ "amount": 0.0,
2051
2093
  "metadata": {},
2052
- "amount": 0.0
2094
+ "uiTrait": "@trait.BookingPaymentForm",
2095
+ "currency": "usd"
2053
2096
  },
2054
2097
  "listens": [
2055
2098
  {
@@ -2105,44 +2148,44 @@
2105
2148
  "main",
2106
2149
  {
2107
2150
  "gap": "md",
2108
- "direction": "vertical",
2109
2151
  "children": [
2110
2152
  {
2111
- "type": "alert",
2112
2153
  "variant": "info",
2113
- "message": "Enter card details to pay your booking deposit."
2154
+ "message": "Enter card details to pay your booking deposit.",
2155
+ "type": "alert"
2114
2156
  },
2115
2157
  {
2116
- "placeholder": "Card number",
2117
2158
  "inputType": "text",
2159
+ "placeholder": "Card number",
2118
2160
  "type": "input"
2119
2161
  },
2120
2162
  {
2163
+ "gap": "sm",
2121
2164
  "type": "stack",
2165
+ "direction": "horizontal",
2122
2166
  "children": [
2123
2167
  {
2168
+ "type": "input",
2124
2169
  "inputType": "text",
2125
- "placeholder": "MM/YY",
2126
- "type": "input"
2170
+ "placeholder": "MM/YY"
2127
2171
  },
2128
2172
  {
2129
2173
  "placeholder": "CVC",
2130
2174
  "inputType": "text",
2131
2175
  "type": "input"
2132
2176
  }
2133
- ],
2134
- "gap": "sm",
2135
- "direction": "horizontal"
2177
+ ]
2136
2178
  },
2137
2179
  {
2180
+ "icon": "credit-card",
2138
2181
  "type": "button",
2139
- "variant": "primary",
2140
- "action": "CREATE_PAYMENT",
2141
2182
  "label": "Pay deposit",
2142
- "icon": "credit-card"
2183
+ "action": "CREATE_PAYMENT",
2184
+ "variant": "primary"
2143
2185
  }
2144
2186
  ],
2145
- "type": "stack"
2187
+ "type": "stack",
2188
+ "direction": "vertical"
2146
2189
  }
2147
2190
  ]
2148
2191
  ]
@@ -2497,26 +2540,22 @@
2497
2540
  "render-ui",
2498
2541
  "main",
2499
2542
  {
2500
- "gap": "lg",
2501
- "className": "max-w-xl mx-auto w-full",
2502
- "direction": "vertical",
2503
- "type": "stack",
2504
2543
  "children": [
2505
2544
  {
2545
+ "content": "Book Appointment",
2506
2546
  "type": "typography",
2507
- "variant": "h2",
2508
- "content": "Book Appointment"
2547
+ "variant": "h2"
2509
2548
  },
2510
2549
  {
2511
2550
  "type": "wizard-progress",
2551
+ "currentStep": 0.0,
2512
2552
  "steps": [
2513
2553
  "Select Provider",
2514
2554
  "Select Time",
2515
2555
  "Your Details",
2516
2556
  "Payment",
2517
2557
  "Confirmation"
2518
- ],
2519
- "currentStep": 0.0
2558
+ ]
2520
2559
  },
2521
2560
  {
2522
2561
  "type": "divider"
@@ -2527,20 +2566,24 @@
2527
2566
  "content": "Select Provider"
2528
2567
  },
2529
2568
  {
2569
+ "mode": "create",
2530
2570
  "submitLabel": "Continue",
2531
- "type": "form-section",
2571
+ "showCancel": false,
2532
2572
  "fields": [
2533
2573
  {
2534
2574
  "name": "providerName",
2535
- "required": true,
2536
- "min": 2.0
2575
+ "min": 2.0,
2576
+ "required": true
2537
2577
  }
2538
2578
  ],
2539
- "showCancel": false,
2540
2579
  "submitEvent": "NEXT",
2541
- "mode": "create"
2580
+ "type": "form-section"
2542
2581
  }
2543
- ]
2582
+ ],
2583
+ "className": "max-w-xl mx-auto w-full",
2584
+ "direction": "vertical",
2585
+ "gap": "lg",
2586
+ "type": "stack"
2544
2587
  }
2545
2588
  ]
2546
2589
  ]
@@ -2560,14 +2603,18 @@
2560
2603
  "render-ui",
2561
2604
  "main",
2562
2605
  {
2606
+ "gap": "lg",
2607
+ "direction": "vertical",
2563
2608
  "type": "stack",
2609
+ "className": "max-w-xl mx-auto w-full",
2564
2610
  "children": [
2565
2611
  {
2566
- "type": "typography",
2567
2612
  "variant": "h2",
2613
+ "type": "typography",
2568
2614
  "content": "Book Appointment"
2569
2615
  },
2570
2616
  {
2617
+ "currentStep": 1.0,
2571
2618
  "type": "wizard-progress",
2572
2619
  "steps": [
2573
2620
  "Select Provider",
@@ -2575,36 +2622,32 @@
2575
2622
  "Your Details",
2576
2623
  "Payment",
2577
2624
  "Confirmation"
2578
- ],
2579
- "currentStep": 1.0
2625
+ ]
2580
2626
  },
2581
2627
  {
2582
2628
  "type": "divider"
2583
2629
  },
2584
2630
  {
2585
2631
  "type": "typography",
2586
- "content": "Select Time",
2587
- "variant": "h3"
2632
+ "variant": "h3",
2633
+ "content": "Select Time"
2588
2634
  },
2589
2635
  {
2590
2636
  "cancelEvent": "PREV",
2637
+ "submitEvent": "NEXT",
2638
+ "mode": "edit",
2591
2639
  "fields": [
2592
2640
  {
2593
2641
  "required": true,
2594
2642
  "name": "scheduledAt"
2595
2643
  }
2596
2644
  ],
2645
+ "entity": "@entity",
2597
2646
  "type": "form-section",
2598
2647
  "cancelLabel": "Back",
2599
- "submitEvent": "NEXT",
2600
- "entity": "@entity",
2601
- "submitLabel": "Continue",
2602
- "mode": "edit"
2648
+ "submitLabel": "Continue"
2603
2649
  }
2604
- ],
2605
- "className": "max-w-xl mx-auto w-full",
2606
- "direction": "vertical",
2607
- "gap": "lg"
2650
+ ]
2608
2651
  }
2609
2652
  ]
2610
2653
  ]
@@ -2628,10 +2671,6 @@
2628
2671
  "render-ui",
2629
2672
  "main",
2630
2673
  {
2631
- "gap": "lg",
2632
- "direction": "vertical",
2633
- "type": "stack",
2634
- "className": "max-w-xl mx-auto w-full",
2635
2674
  "children": [
2636
2675
  {
2637
2676
  "content": "Book Appointment",
@@ -2639,53 +2678,57 @@
2639
2678
  "type": "typography"
2640
2679
  },
2641
2680
  {
2642
- "type": "wizard-progress",
2643
- "currentStep": 2.0,
2644
2681
  "steps": [
2645
2682
  "Select Provider",
2646
2683
  "Select Time",
2647
2684
  "Your Details",
2648
2685
  "Payment",
2649
2686
  "Confirmation"
2650
- ]
2687
+ ],
2688
+ "currentStep": 2.0,
2689
+ "type": "wizard-progress"
2651
2690
  },
2652
2691
  {
2653
2692
  "type": "divider"
2654
2693
  },
2655
2694
  {
2656
2695
  "variant": "h3",
2657
- "type": "typography",
2658
- "content": "Your Details"
2696
+ "content": "Your Details",
2697
+ "type": "typography"
2659
2698
  },
2660
2699
  {
2661
- "type": "form-section",
2662
- "submitEvent": "NEXT",
2663
- "cancelEvent": "PREV",
2664
- "entity": "@entity",
2665
- "mode": "edit",
2666
- "cancelLabel": "Back",
2667
2700
  "submitLabel": "Continue",
2701
+ "type": "form-section",
2668
2702
  "fields": [
2669
2703
  {
2670
- "name": "customerName",
2671
2704
  "required": true,
2705
+ "name": "customerName",
2672
2706
  "min": 2.0
2673
2707
  },
2674
2708
  {
2675
- "type": "email",
2709
+ "name": "email",
2676
2710
  "required": true,
2677
- "name": "email"
2711
+ "type": "email"
2678
2712
  },
2679
2713
  {
2680
- "required": true,
2681
- "name": "phone"
2714
+ "name": "phone",
2715
+ "required": true
2682
2716
  },
2683
2717
  {
2684
2718
  "name": "notes"
2685
2719
  }
2686
- ]
2720
+ ],
2721
+ "mode": "edit",
2722
+ "cancelLabel": "Back",
2723
+ "cancelEvent": "PREV",
2724
+ "submitEvent": "NEXT",
2725
+ "entity": "@entity"
2687
2726
  }
2688
- ]
2727
+ ],
2728
+ "gap": "lg",
2729
+ "className": "max-w-xl mx-auto w-full",
2730
+ "type": "stack",
2731
+ "direction": "vertical"
2689
2732
  }
2690
2733
  ]
2691
2734
  ]
@@ -2699,6 +2742,9 @@
2699
2742
  "render-ui",
2700
2743
  "main",
2701
2744
  {
2745
+ "gap": "lg",
2746
+ "type": "stack",
2747
+ "direction": "vertical",
2702
2748
  "children": [
2703
2749
  {
2704
2750
  "type": "typography",
@@ -2706,6 +2752,7 @@
2706
2752
  "content": "Book Appointment"
2707
2753
  },
2708
2754
  {
2755
+ "currentStep": 0.0,
2709
2756
  "type": "wizard-progress",
2710
2757
  "steps": [
2711
2758
  "Select Provider",
@@ -2713,37 +2760,33 @@
2713
2760
  "Your Details",
2714
2761
  "Payment",
2715
2762
  "Confirmation"
2716
- ],
2717
- "currentStep": 0.0
2763
+ ]
2718
2764
  },
2719
2765
  {
2720
2766
  "type": "divider"
2721
2767
  },
2722
2768
  {
2723
- "type": "typography",
2724
2769
  "variant": "h3",
2725
- "content": "Select Provider"
2770
+ "content": "Select Provider",
2771
+ "type": "typography"
2726
2772
  },
2727
2773
  {
2728
2774
  "submitLabel": "Continue",
2729
- "showCancel": false,
2730
- "type": "form-section",
2775
+ "mode": "edit",
2731
2776
  "fields": [
2732
2777
  {
2733
- "required": true,
2734
2778
  "min": 2.0,
2735
- "name": "providerName"
2779
+ "name": "providerName",
2780
+ "required": true
2736
2781
  }
2737
2782
  ],
2738
- "mode": "edit",
2739
- "entity": "@entity",
2740
- "submitEvent": "NEXT"
2783
+ "submitEvent": "NEXT",
2784
+ "showCancel": false,
2785
+ "type": "form-section",
2786
+ "entity": "@entity"
2741
2787
  }
2742
2788
  ],
2743
- "gap": "lg",
2744
- "direction": "vertical",
2745
- "className": "max-w-xl mx-auto w-full",
2746
- "type": "stack"
2789
+ "className": "max-w-xl mx-auto w-full"
2747
2790
  }
2748
2791
  ]
2749
2792
  ]
@@ -2783,52 +2826,52 @@
2783
2826
  "render-ui",
2784
2827
  "main",
2785
2828
  {
2786
- "className": "max-w-xl mx-auto w-full",
2787
- "direction": "vertical",
2788
2829
  "children": [
2789
2830
  {
2790
- "content": "Book Appointment",
2831
+ "variant": "h2",
2791
2832
  "type": "typography",
2792
- "variant": "h2"
2833
+ "content": "Book Appointment"
2793
2834
  },
2794
2835
  {
2795
- "currentStep": 3.0,
2796
- "type": "wizard-progress",
2797
2836
  "steps": [
2798
2837
  "Select Provider",
2799
2838
  "Select Time",
2800
2839
  "Your Details",
2801
2840
  "Payment",
2802
2841
  "Confirmation"
2803
- ]
2842
+ ],
2843
+ "currentStep": 3.0,
2844
+ "type": "wizard-progress"
2804
2845
  },
2805
2846
  {
2806
2847
  "type": "divider"
2807
2848
  },
2808
2849
  {
2809
- "variant": "h3",
2850
+ "type": "typography",
2810
2851
  "content": "Pay Deposit",
2811
- "type": "typography"
2852
+ "variant": "h3"
2812
2853
  },
2813
2854
  "@trait.BookingPayment",
2814
2855
  {
2815
- "justify": "start",
2856
+ "type": "stack",
2816
2857
  "gap": "sm",
2817
2858
  "direction": "horizontal",
2818
- "type": "stack",
2859
+ "justify": "start",
2819
2860
  "children": [
2820
2861
  {
2821
- "icon": "arrow-left",
2862
+ "type": "button",
2822
2863
  "variant": "ghost",
2864
+ "icon": "arrow-left",
2823
2865
  "label": "Back",
2824
- "action": "PREV",
2825
- "type": "button"
2866
+ "action": "PREV"
2826
2867
  }
2827
2868
  ]
2828
2869
  }
2829
2870
  ],
2871
+ "gap": "lg",
2830
2872
  "type": "stack",
2831
- "gap": "lg"
2873
+ "direction": "vertical",
2874
+ "className": "max-w-xl mx-auto w-full"
2832
2875
  }
2833
2876
  ]
2834
2877
  ]
@@ -2844,48 +2887,48 @@
2844
2887
  {
2845
2888
  "direction": "vertical",
2846
2889
  "className": "max-w-xl mx-auto w-full",
2847
- "type": "stack",
2848
2890
  "children": [
2849
2891
  {
2850
- "content": "Book Appointment",
2851
2892
  "variant": "h2",
2852
- "type": "typography"
2893
+ "type": "typography",
2894
+ "content": "Book Appointment"
2853
2895
  },
2854
2896
  {
2855
- "currentStep": 1.0,
2856
- "type": "wizard-progress",
2857
2897
  "steps": [
2858
2898
  "Select Provider",
2859
2899
  "Select Time",
2860
2900
  "Your Details",
2861
2901
  "Payment",
2862
2902
  "Confirmation"
2863
- ]
2903
+ ],
2904
+ "type": "wizard-progress",
2905
+ "currentStep": 1.0
2864
2906
  },
2865
2907
  {
2866
2908
  "type": "divider"
2867
2909
  },
2868
2910
  {
2869
2911
  "variant": "h3",
2870
- "content": "Select Time",
2871
- "type": "typography"
2912
+ "type": "typography",
2913
+ "content": "Select Time"
2872
2914
  },
2873
2915
  {
2874
- "submitEvent": "NEXT",
2875
- "type": "form-section",
2916
+ "cancelEvent": "PREV",
2876
2917
  "submitLabel": "Continue",
2877
- "entity": "@entity",
2878
2918
  "mode": "edit",
2919
+ "entity": "@entity",
2920
+ "submitEvent": "NEXT",
2879
2921
  "cancelLabel": "Back",
2880
2922
  "fields": [
2881
2923
  {
2882
- "required": true,
2883
- "name": "scheduledAt"
2924
+ "name": "scheduledAt",
2925
+ "required": true
2884
2926
  }
2885
2927
  ],
2886
- "cancelEvent": "PREV"
2928
+ "type": "form-section"
2887
2929
  }
2888
2930
  ],
2931
+ "type": "stack",
2889
2932
  "gap": "lg"
2890
2933
  }
2891
2934
  ]
@@ -2908,76 +2951,78 @@
2908
2951
  "render-ui",
2909
2952
  "main",
2910
2953
  {
2954
+ "gap": "lg",
2955
+ "type": "stack",
2911
2956
  "children": [
2912
2957
  {
2913
2958
  "type": "typography",
2914
- "content": "Review your booking",
2915
- "variant": "h2"
2959
+ "variant": "h2",
2960
+ "content": "Review your booking"
2916
2961
  },
2917
2962
  {
2963
+ "type": "wizard-progress",
2964
+ "currentStep": 4.0,
2918
2965
  "steps": [
2919
2966
  "Select Provider",
2920
2967
  "Select Time",
2921
2968
  "Your Details",
2922
2969
  "Payment",
2923
2970
  "Confirmation"
2924
- ],
2925
- "type": "wizard-progress",
2926
- "currentStep": 4.0
2971
+ ]
2927
2972
  },
2928
2973
  {
2929
2974
  "type": "divider"
2930
2975
  },
2931
2976
  {
2932
2977
  "type": "stack",
2933
- "gap": "sm",
2934
2978
  "direction": "vertical",
2979
+ "gap": "sm",
2935
2980
  "children": [
2936
2981
  {
2937
2982
  "children": [
2938
2983
  {
2939
- "type": "typography",
2940
2984
  "variant": "caption",
2985
+ "type": "typography",
2941
2986
  "content": "Provider"
2942
2987
  },
2943
2988
  {
2944
- "type": "typography",
2945
2989
  "variant": "body",
2946
- "content": "@entity.providerName"
2990
+ "content": "@entity.providerName",
2991
+ "type": "typography"
2947
2992
  }
2948
2993
  ],
2949
- "type": "stack",
2950
2994
  "gap": "md",
2951
2995
  "direction": "horizontal",
2952
- "justify": "between"
2996
+ "justify": "between",
2997
+ "type": "stack"
2953
2998
  },
2954
2999
  {
2955
- "type": "stack",
2956
- "justify": "between",
2957
- "gap": "md",
2958
3000
  "children": [
2959
3001
  {
2960
- "type": "typography",
2961
3002
  "variant": "caption",
3003
+ "type": "typography",
2962
3004
  "content": "When"
2963
3005
  },
2964
3006
  {
3007
+ "variant": "body",
2965
3008
  "type": "typography",
2966
- "content": "@entity.scheduledAt",
2967
- "variant": "body"
3009
+ "content": "@entity.scheduledAt"
2968
3010
  }
2969
3011
  ],
2970
- "direction": "horizontal"
3012
+ "direction": "horizontal",
3013
+ "justify": "between",
3014
+ "type": "stack",
3015
+ "gap": "md"
2971
3016
  },
2972
3017
  {
2973
3018
  "direction": "horizontal",
2974
3019
  "type": "stack",
2975
- "justify": "between",
2976
3020
  "gap": "md",
3021
+ "justify": "between",
2977
3022
  "children": [
2978
3023
  {
2979
- "type": "typography",
2980
3024
  "content": "Customer",
3025
+ "type": "typography",
2981
3026
  "variant": "caption"
2982
3027
  },
2983
3028
  {
@@ -2988,49 +3033,47 @@
2988
3033
  ]
2989
3034
  },
2990
3035
  {
2991
- "direction": "horizontal",
2992
3036
  "type": "stack",
2993
3037
  "gap": "md",
2994
- "justify": "between",
2995
3038
  "children": [
2996
3039
  {
2997
- "variant": "caption",
2998
3040
  "content": "Email",
3041
+ "variant": "caption",
2999
3042
  "type": "typography"
3000
3043
  },
3001
3044
  {
3045
+ "content": "@entity.email",
3002
3046
  "type": "typography",
3003
- "variant": "body",
3004
- "content": "@entity.email"
3047
+ "variant": "body"
3005
3048
  }
3006
- ]
3007
- },
3008
- {
3049
+ ],
3050
+ "direction": "horizontal",
3051
+ "justify": "between"
3052
+ },
3053
+ {
3009
3054
  "children": [
3010
3055
  {
3011
- "content": "Phone",
3056
+ "variant": "caption",
3012
3057
  "type": "typography",
3013
- "variant": "caption"
3058
+ "content": "Phone"
3014
3059
  },
3015
3060
  {
3061
+ "type": "typography",
3016
3062
  "variant": "body",
3017
- "content": "@entity.phone",
3018
- "type": "typography"
3063
+ "content": "@entity.phone"
3019
3064
  }
3020
3065
  ],
3021
- "direction": "horizontal",
3022
- "justify": "between",
3023
3066
  "type": "stack",
3024
- "gap": "md"
3067
+ "justify": "between",
3068
+ "gap": "md",
3069
+ "direction": "horizontal"
3025
3070
  },
3026
3071
  {
3027
- "type": "stack",
3028
- "justify": "between",
3029
3072
  "children": [
3030
3073
  {
3031
- "type": "typography",
3032
3074
  "variant": "caption",
3033
- "content": "Deposit Paid"
3075
+ "content": "Deposit Paid",
3076
+ "type": "typography"
3034
3077
  },
3035
3078
  {
3036
3079
  "variant": "body",
@@ -3039,7 +3082,9 @@
3039
3082
  }
3040
3083
  ],
3041
3084
  "direction": "horizontal",
3042
- "gap": "md"
3085
+ "type": "stack",
3086
+ "gap": "md",
3087
+ "justify": "between"
3043
3088
  }
3044
3089
  ]
3045
3090
  },
@@ -3048,31 +3093,29 @@
3048
3093
  },
3049
3094
  {
3050
3095
  "gap": "sm",
3051
- "direction": "horizontal",
3052
- "justify": "between",
3053
3096
  "children": [
3054
3097
  {
3055
3098
  "icon": "arrow-left",
3056
- "label": "Back",
3057
- "type": "button",
3058
3099
  "action": "PREV",
3059
- "variant": "ghost"
3100
+ "variant": "ghost",
3101
+ "type": "button",
3102
+ "label": "Back"
3060
3103
  },
3061
3104
  {
3105
+ "type": "button",
3062
3106
  "label": "Confirm booking",
3063
3107
  "action": "COMPLETE",
3064
- "type": "button",
3065
3108
  "variant": "primary",
3066
3109
  "icon": "check"
3067
3110
  }
3068
3111
  ],
3069
- "type": "stack"
3112
+ "direction": "horizontal",
3113
+ "type": "stack",
3114
+ "justify": "between"
3070
3115
  }
3071
3116
  ],
3072
- "direction": "vertical",
3073
- "type": "stack",
3074
3117
  "className": "max-w-xl mx-auto w-full",
3075
- "gap": "lg"
3118
+ "direction": "vertical"
3076
3119
  }
3077
3120
  ]
3078
3121
  ]
@@ -3087,24 +3130,25 @@
3087
3130
  "main",
3088
3131
  {
3089
3132
  "gap": "lg",
3090
- "type": "stack",
3133
+ "direction": "vertical",
3091
3134
  "className": "max-w-xl mx-auto w-full",
3135
+ "type": "stack",
3092
3136
  "children": [
3093
3137
  {
3138
+ "content": "Book Appointment",
3094
3139
  "type": "typography",
3095
- "variant": "h2",
3096
- "content": "Book Appointment"
3140
+ "variant": "h2"
3097
3141
  },
3098
3142
  {
3099
3143
  "currentStep": 2.0,
3100
- "type": "wizard-progress",
3101
3144
  "steps": [
3102
3145
  "Select Provider",
3103
3146
  "Select Time",
3104
3147
  "Your Details",
3105
3148
  "Payment",
3106
3149
  "Confirmation"
3107
- ]
3150
+ ],
3151
+ "type": "wizard-progress"
3108
3152
  },
3109
3153
  {
3110
3154
  "type": "divider"
@@ -3115,35 +3159,34 @@
3115
3159
  "type": "typography"
3116
3160
  },
3117
3161
  {
3118
- "entity": "@entity",
3119
- "submitEvent": "NEXT",
3120
- "cancelEvent": "PREV",
3121
- "mode": "edit",
3122
- "submitLabel": "Continue",
3123
- "cancelLabel": "Back",
3124
3162
  "type": "form-section",
3125
3163
  "fields": [
3126
3164
  {
3127
- "name": "customerName",
3128
3165
  "required": true,
3129
- "min": 2.0
3166
+ "min": 2.0,
3167
+ "name": "customerName"
3130
3168
  },
3131
3169
  {
3132
3170
  "name": "email",
3133
- "type": "email",
3134
- "required": true
3171
+ "required": true,
3172
+ "type": "email"
3135
3173
  },
3136
3174
  {
3137
- "required": true,
3138
- "name": "phone"
3175
+ "name": "phone",
3176
+ "required": true
3139
3177
  },
3140
3178
  {
3141
3179
  "name": "notes"
3142
3180
  }
3143
- ]
3181
+ ],
3182
+ "cancelEvent": "PREV",
3183
+ "submitEvent": "NEXT",
3184
+ "mode": "edit",
3185
+ "cancelLabel": "Back",
3186
+ "submitLabel": "Continue",
3187
+ "entity": "@entity"
3144
3188
  }
3145
- ],
3146
- "direction": "vertical"
3189
+ ]
3147
3190
  }
3148
3191
  ]
3149
3192
  ]
@@ -3183,10 +3226,10 @@
3183
3226
  "email",
3184
3227
  "send",
3185
3228
  {
3186
- "recipient": "@entity.email",
3187
3229
  "body": "Your booking is confirmed.",
3188
- "subject": "Booking Confirmed",
3189
- "sender": "noreply@bookings.example"
3230
+ "sender": "noreply@bookings.example",
3231
+ "recipient": "@entity.email",
3232
+ "subject": "Booking Confirmed"
3190
3233
  },
3191
3234
  {
3192
3235
  "emit": {
@@ -3200,8 +3243,8 @@
3200
3243
  "twilio",
3201
3244
  "sendSMS",
3202
3245
  {
3203
- "sender": "+15551234567",
3204
3246
  "recipient": "@entity.phone",
3247
+ "sender": "+15551234567",
3205
3248
  "body": "Booking confirmed for @entity.scheduledAt"
3206
3249
  },
3207
3250
  {
@@ -3227,35 +3270,35 @@
3227
3270
  "render-ui",
3228
3271
  "main",
3229
3272
  {
3273
+ "className": "max-w-xl mx-auto w-full py-12",
3274
+ "type": "stack",
3230
3275
  "children": [
3231
3276
  {
3232
- "type": "icon",
3233
- "name": "check-circle"
3277
+ "name": "check-circle",
3278
+ "type": "icon"
3234
3279
  },
3235
3280
  {
3236
3281
  "variant": "h2",
3237
- "content": "Booking confirmed",
3238
- "type": "typography"
3282
+ "type": "typography",
3283
+ "content": "Booking confirmed"
3239
3284
  },
3240
3285
  {
3241
3286
  "type": "typography",
3242
3287
  "color": "muted",
3243
- "content": "We have emailed and SMS-confirmed your appointment.",
3244
- "variant": "body"
3288
+ "variant": "body",
3289
+ "content": "We have emailed and SMS-confirmed your appointment."
3245
3290
  },
3246
3291
  {
3247
- "variant": "ghost",
3248
- "type": "button",
3292
+ "label": "Book another",
3249
3293
  "icon": "rotate-ccw",
3294
+ "type": "button",
3250
3295
  "action": "RESTART",
3251
- "label": "Book another"
3296
+ "variant": "ghost"
3252
3297
  }
3253
3298
  ],
3254
- "type": "stack",
3255
3299
  "align": "center",
3256
3300
  "gap": "lg",
3257
- "direction": "vertical",
3258
- "className": "max-w-xl mx-auto w-full py-12"
3301
+ "direction": "vertical"
3259
3302
  }
3260
3303
  ]
3261
3304
  ]
@@ -3269,15 +3312,13 @@
3269
3312
  "render-ui",
3270
3313
  "main",
3271
3314
  {
3272
- "gap": "lg",
3273
3315
  "className": "max-w-xl mx-auto w-full",
3274
3316
  "type": "stack",
3275
- "direction": "vertical",
3276
3317
  "children": [
3277
3318
  {
3278
- "type": "typography",
3319
+ "variant": "h2",
3279
3320
  "content": "Book Appointment",
3280
- "variant": "h2"
3321
+ "type": "typography"
3281
3322
  },
3282
3323
  {
3283
3324
  "currentStep": 3.0,
@@ -3294,27 +3335,29 @@
3294
3335
  "type": "divider"
3295
3336
  },
3296
3337
  {
3297
- "content": "Pay Deposit",
3298
3338
  "variant": "h3",
3299
- "type": "typography"
3339
+ "type": "typography",
3340
+ "content": "Pay Deposit"
3300
3341
  },
3301
3342
  "@trait.BookingPayment",
3302
3343
  {
3303
- "type": "stack",
3304
- "direction": "horizontal",
3305
3344
  "gap": "sm",
3345
+ "type": "stack",
3306
3346
  "justify": "start",
3347
+ "direction": "horizontal",
3307
3348
  "children": [
3308
3349
  {
3309
3350
  "label": "Back",
3310
- "variant": "ghost",
3311
- "type": "button",
3312
3351
  "action": "PREV",
3313
- "icon": "arrow-left"
3352
+ "variant": "ghost",
3353
+ "icon": "arrow-left",
3354
+ "type": "button"
3314
3355
  }
3315
3356
  ]
3316
3357
  }
3317
- ]
3358
+ ],
3359
+ "direction": "vertical",
3360
+ "gap": "lg"
3318
3361
  }
3319
3362
  ]
3320
3363
  ]
@@ -3368,48 +3411,48 @@
3368
3411
  "render-ui",
3369
3412
  "main",
3370
3413
  {
3371
- "type": "stack",
3372
- "gap": "lg",
3373
3414
  "className": "max-w-xl mx-auto w-full",
3374
3415
  "direction": "vertical",
3416
+ "type": "stack",
3417
+ "gap": "lg",
3375
3418
  "children": [
3376
3419
  {
3377
- "content": "Book Appointment",
3378
3420
  "type": "typography",
3421
+ "content": "Book Appointment",
3379
3422
  "variant": "h2"
3380
3423
  },
3381
3424
  {
3382
3425
  "type": "wizard-progress",
3426
+ "currentStep": 0.0,
3383
3427
  "steps": [
3384
3428
  "Select Provider",
3385
3429
  "Select Time",
3386
3430
  "Your Details",
3387
3431
  "Payment",
3388
3432
  "Confirmation"
3389
- ],
3390
- "currentStep": 0.0
3433
+ ]
3391
3434
  },
3392
3435
  {
3393
3436
  "type": "divider"
3394
3437
  },
3395
3438
  {
3396
3439
  "variant": "h3",
3397
- "content": "Select Provider",
3398
- "type": "typography"
3440
+ "type": "typography",
3441
+ "content": "Select Provider"
3399
3442
  },
3400
3443
  {
3444
+ "showCancel": false,
3445
+ "mode": "create",
3446
+ "submitEvent": "NEXT",
3447
+ "submitLabel": "Continue",
3401
3448
  "fields": [
3402
3449
  {
3403
3450
  "required": true,
3404
- "min": 2.0,
3405
- "name": "providerName"
3451
+ "name": "providerName",
3452
+ "min": 2.0
3406
3453
  }
3407
3454
  ],
3408
- "mode": "create",
3409
- "type": "form-section",
3410
- "submitEvent": "NEXT",
3411
- "submitLabel": "Continue",
3412
- "showCancel": false
3455
+ "type": "form-section"
3413
3456
  }
3414
3457
  ]
3415
3458
  }
@@ -3426,6 +3469,9 @@
3426
3469
  "name": "Book",
3427
3470
  "path": "/book",
3428
3471
  "traits": [
3472
+ {
3473
+ "ref": "BookingAppLayout"
3474
+ },
3429
3475
  {
3430
3476
  "ref": "BookingWizard"
3431
3477
  },
@@ -3442,6 +3488,10 @@
3442
3488
  {
3443
3489
  "name": "AppointmentOrbital",
3444
3490
  "uses": [
3491
+ {
3492
+ "from": "std/behaviors/std-app-layout",
3493
+ "as": "AppShell"
3494
+ },
3445
3495
  {
3446
3496
  "from": "std/behaviors/std-calendar",
3447
3497
  "as": "Calendar"
@@ -3503,6 +3553,45 @@
3503
3553
  ]
3504
3554
  },
3505
3555
  "traits": [
3556
+ {
3557
+ "ref": "AppShell.traits.AppLayout",
3558
+ "name": "AppointmentAppLayout",
3559
+ "linkedEntity": "Appointment",
3560
+ "config": {
3561
+ "notificationClickEvent": "APPOINTMENT_NOTIFICATIONS_OPEN",
3562
+ "notifications": [],
3563
+ "contentTrait": "@trait.AppointmentDashboard",
3564
+ "searchEvent": "APPOINTMENT_SEARCH",
3565
+ "appName": "BookingSystemApp",
3566
+ "navItems": [
3567
+ {
3568
+ "href": "/providers",
3569
+ "label": "Providers",
3570
+ "icon": "user-check"
3571
+ },
3572
+ {
3573
+ "href": "/book",
3574
+ "icon": "calendar-plus",
3575
+ "label": "Book"
3576
+ },
3577
+ {
3578
+ "icon": "calendar",
3579
+ "href": "/appointments",
3580
+ "label": "Appointments"
3581
+ },
3582
+ {
3583
+ "label": "Schedule",
3584
+ "href": "/schedule",
3585
+ "icon": "clock"
3586
+ }
3587
+ ],
3588
+ "topBarActions": []
3589
+ },
3590
+ "events": {
3591
+ "SEARCH": "APPOINTMENT_SEARCH",
3592
+ "NOTIFY_CLICK": "APPOINTMENT_NOTIFICATIONS_OPEN"
3593
+ }
3594
+ },
3506
3595
  {
3507
3596
  "name": "AppointmentDashboard",
3508
3597
  "category": "interaction",
@@ -3545,16 +3634,18 @@
3545
3634
  "render-ui",
3546
3635
  "main",
3547
3636
  {
3548
- "direction": "vertical",
3637
+ "type": "stack",
3638
+ "gap": "lg",
3549
3639
  "children": [
3550
3640
  {
3551
- "gap": "md",
3552
- "type": "stack",
3553
3641
  "direction": "horizontal",
3642
+ "type": "stack",
3554
3643
  "justify": "between",
3644
+ "align": "center",
3555
3645
  "children": [
3556
3646
  {
3557
- "direction": "horizontal",
3647
+ "type": "stack",
3648
+ "gap": "sm",
3558
3649
  "children": [
3559
3650
  {
3560
3651
  "name": "calendar",
@@ -3562,30 +3653,29 @@
3562
3653
  },
3563
3654
  {
3564
3655
  "variant": "h2",
3565
- "type": "typography",
3566
- "content": "Appointments"
3656
+ "content": "Appointments",
3657
+ "type": "typography"
3567
3658
  }
3568
3659
  ],
3569
3660
  "align": "center",
3570
- "type": "stack",
3571
- "gap": "sm"
3661
+ "direction": "horizontal"
3572
3662
  },
3573
3663
  {
3574
- "direction": "horizontal",
3575
- "type": "stack",
3576
- "gap": "sm",
3577
3664
  "children": [
3578
3665
  {
3579
- "variant": "primary",
3580
- "action": "CREATE",
3581
3666
  "icon": "plus",
3582
3667
  "label": "Create Appointment",
3583
- "type": "button"
3668
+ "type": "button",
3669
+ "action": "CREATE",
3670
+ "variant": "primary"
3584
3671
  }
3585
- ]
3672
+ ],
3673
+ "type": "stack",
3674
+ "gap": "sm",
3675
+ "direction": "horizontal"
3586
3676
  }
3587
3677
  ],
3588
- "align": "center"
3678
+ "gap": "md"
3589
3679
  },
3590
3680
  {
3591
3681
  "type": "divider"
@@ -3596,8 +3686,7 @@
3596
3686
  },
3597
3687
  "@trait.AppointmentBrowseList"
3598
3688
  ],
3599
- "type": "stack",
3600
- "gap": "lg"
3689
+ "direction": "vertical"
3601
3690
  }
3602
3691
  ]
3603
3692
  ]
@@ -3611,9 +3700,9 @@
3611
3700
  "name": "AppointmentCalendar",
3612
3701
  "linkedEntity": "Appointment",
3613
3702
  "config": {
3614
- "dateField": "scheduledAt",
3615
3703
  "titleField": "summary",
3616
- "colorField": "status"
3704
+ "colorField": "status",
3705
+ "dateField": "scheduledAt"
3617
3706
  },
3618
3707
  "listens": [
3619
3708
  {
@@ -3656,57 +3745,57 @@
3656
3745
  "name": "AppointmentBrowseList",
3657
3746
  "linkedEntity": "Appointment",
3658
3747
  "config": {
3748
+ "gap": "sm",
3749
+ "cols": 1.0,
3750
+ "itemActions": [
3751
+ {
3752
+ "variant": "ghost",
3753
+ "event": "VIEW",
3754
+ "label": "View"
3755
+ },
3756
+ {
3757
+ "variant": "ghost",
3758
+ "label": "Edit",
3759
+ "event": "EDIT"
3760
+ },
3761
+ {
3762
+ "label": "Delete",
3763
+ "event": "DELETE",
3764
+ "variant": "danger"
3765
+ }
3766
+ ],
3659
3767
  "fields": [
3660
3768
  {
3769
+ "icon": "calendar",
3661
3770
  "name": "summary",
3662
3771
  "variant": "h3",
3663
- "label": "Summary",
3664
- "icon": "calendar"
3772
+ "label": "Summary"
3665
3773
  },
3666
3774
  {
3667
3775
  "name": "providerName",
3668
- "label": "Provider",
3669
- "variant": "body"
3776
+ "variant": "body",
3777
+ "label": "Provider"
3670
3778
  },
3671
3779
  {
3780
+ "variant": "body",
3672
3781
  "name": "customerName",
3673
- "label": "Customer",
3674
- "variant": "body"
3782
+ "label": "Customer"
3675
3783
  },
3676
3784
  {
3677
3785
  "format": "date",
3678
- "name": "scheduledAt",
3786
+ "label": "When",
3679
3787
  "variant": "body",
3680
- "label": "When"
3788
+ "name": "scheduledAt"
3681
3789
  },
3682
3790
  {
3683
- "variant": "caption",
3684
- "name": "time"
3791
+ "name": "time",
3792
+ "variant": "caption"
3685
3793
  },
3686
3794
  {
3687
3795
  "variant": "badge",
3688
3796
  "name": "status"
3689
3797
  }
3690
- ],
3691
- "itemActions": [
3692
- {
3693
- "variant": "ghost",
3694
- "label": "View",
3695
- "event": "VIEW"
3696
- },
3697
- {
3698
- "label": "Edit",
3699
- "event": "EDIT",
3700
- "variant": "ghost"
3701
- },
3702
- {
3703
- "variant": "danger",
3704
- "label": "Delete",
3705
- "event": "DELETE"
3706
- }
3707
- ],
3708
- "gap": "sm",
3709
- "cols": 1.0
3798
+ ]
3710
3799
  },
3711
3800
  "listens": [
3712
3801
  {
@@ -3910,8 +3999,8 @@
3910
3999
  "Appointment",
3911
4000
  {
3912
4001
  "emit": {
3913
- "success": "AppointmentLoaded",
3914
- "failure": "AppointmentLoadFailed"
4002
+ "failure": "AppointmentLoadFailed",
4003
+ "success": "AppointmentLoaded"
3915
4004
  }
3916
4005
  }
3917
4006
  ]
@@ -3936,9 +4025,12 @@
3936
4025
  "render-ui",
3937
4026
  "modal",
3938
4027
  {
4028
+ "type": "stack",
4029
+ "direction": "vertical",
4030
+ "gap": "md",
3939
4031
  "children": [
3940
4032
  {
3941
- "gap": "sm",
4033
+ "type": "stack",
3942
4034
  "direction": "horizontal",
3943
4035
  "children": [
3944
4036
  {
@@ -3947,20 +4039,17 @@
3947
4039
  },
3948
4040
  {
3949
4041
  "content": "Create Appointment",
3950
- "type": "typography",
3951
- "variant": "h3"
4042
+ "variant": "h3",
4043
+ "type": "typography"
3952
4044
  }
3953
4045
  ],
3954
- "type": "stack"
4046
+ "gap": "sm"
3955
4047
  },
3956
4048
  {
3957
4049
  "type": "divider"
3958
4050
  },
3959
4051
  {
3960
- "type": "form-section",
3961
4052
  "submitEvent": "SAVE",
3962
- "cancelEvent": "CLOSE",
3963
- "mode": "create",
3964
4053
  "fields": [
3965
4054
  "providerName",
3966
4055
  "customerName",
@@ -3969,12 +4058,12 @@
3969
4058
  "time",
3970
4059
  "status",
3971
4060
  "notes"
3972
- ]
4061
+ ],
4062
+ "mode": "create",
4063
+ "cancelEvent": "CLOSE",
4064
+ "type": "form-section"
3973
4065
  }
3974
- ],
3975
- "type": "stack",
3976
- "gap": "md",
3977
- "direction": "vertical"
4066
+ ]
3978
4067
  }
3979
4068
  ]
3980
4069
  ]
@@ -4254,28 +4343,29 @@
4254
4343
  "modal",
4255
4344
  {
4256
4345
  "gap": "md",
4257
- "type": "stack",
4346
+ "direction": "vertical",
4258
4347
  "children": [
4259
4348
  {
4349
+ "direction": "horizontal",
4260
4350
  "type": "stack",
4351
+ "gap": "sm",
4261
4352
  "children": [
4262
4353
  {
4263
4354
  "type": "icon",
4264
4355
  "name": "edit"
4265
4356
  },
4266
4357
  {
4358
+ "content": "Edit Appointment",
4267
4359
  "variant": "h3",
4268
- "type": "typography",
4269
- "content": "Edit Appointment"
4360
+ "type": "typography"
4270
4361
  }
4271
- ],
4272
- "gap": "sm",
4273
- "direction": "horizontal"
4362
+ ]
4274
4363
  },
4275
4364
  {
4276
4365
  "type": "divider"
4277
4366
  },
4278
4367
  {
4368
+ "submitEvent": "SAVE",
4279
4369
  "cancelEvent": "CLOSE",
4280
4370
  "fields": [
4281
4371
  "providerName",
@@ -4286,13 +4376,12 @@
4286
4376
  "status",
4287
4377
  "notes"
4288
4378
  ],
4289
- "type": "form-section",
4290
- "submitEvent": "SAVE",
4291
4379
  "mode": "edit",
4380
+ "type": "form-section",
4292
4381
  "entity": "@payload.row"
4293
4382
  }
4294
4383
  ],
4295
- "direction": "vertical"
4384
+ "type": "stack"
4296
4385
  }
4297
4386
  ]
4298
4387
  ]
@@ -4519,8 +4608,8 @@
4519
4608
  "Appointment",
4520
4609
  {
4521
4610
  "emit": {
4522
- "success": "AppointmentLoaded",
4523
- "failure": "AppointmentLoadFailed"
4611
+ "failure": "AppointmentLoadFailed",
4612
+ "success": "AppointmentLoaded"
4524
4613
  }
4525
4614
  }
4526
4615
  ]
@@ -4537,8 +4626,8 @@
4537
4626
  {
4538
4627
  "id": "@payload.id",
4539
4628
  "emit": {
4540
- "failure": "AppointmentLoadFailed",
4541
- "success": "AppointmentLoaded"
4629
+ "success": "AppointmentLoaded",
4630
+ "failure": "AppointmentLoadFailed"
4542
4631
  }
4543
4632
  }
4544
4633
  ],
@@ -4546,15 +4635,16 @@
4546
4635
  "render-ui",
4547
4636
  "modal",
4548
4637
  {
4638
+ "type": "stack",
4549
4639
  "children": [
4550
4640
  {
4551
- "direction": "horizontal",
4552
4641
  "type": "stack",
4642
+ "direction": "horizontal",
4553
4643
  "align": "center",
4554
4644
  "children": [
4555
4645
  {
4556
- "type": "icon",
4557
- "name": "eye"
4646
+ "name": "eye",
4647
+ "type": "icon"
4558
4648
  },
4559
4649
  {
4560
4650
  "variant": "h3",
@@ -4569,74 +4659,73 @@
4569
4659
  },
4570
4660
  {
4571
4661
  "direction": "horizontal",
4572
- "type": "stack",
4573
4662
  "gap": "md",
4663
+ "type": "stack",
4574
4664
  "children": [
4575
4665
  {
4666
+ "content": "Provider",
4576
4667
  "variant": "caption",
4577
- "type": "typography",
4578
- "content": "Provider"
4668
+ "type": "typography"
4579
4669
  },
4580
4670
  {
4581
4671
  "type": "typography",
4582
- "variant": "body",
4583
- "content": "@entity.providerName"
4672
+ "content": "@entity.providerName",
4673
+ "variant": "body"
4584
4674
  }
4585
4675
  ]
4586
4676
  },
4587
4677
  {
4588
4678
  "children": [
4589
4679
  {
4590
- "variant": "caption",
4591
4680
  "content": "Customer",
4592
- "type": "typography"
4681
+ "type": "typography",
4682
+ "variant": "caption"
4593
4683
  },
4594
4684
  {
4595
4685
  "type": "typography",
4596
- "variant": "body",
4597
- "content": "@entity.customerName"
4686
+ "content": "@entity.customerName",
4687
+ "variant": "body"
4598
4688
  }
4599
4689
  ],
4600
- "direction": "horizontal",
4601
4690
  "type": "stack",
4602
- "gap": "md"
4691
+ "gap": "md",
4692
+ "direction": "horizontal"
4603
4693
  },
4604
4694
  {
4695
+ "direction": "horizontal",
4696
+ "type": "stack",
4697
+ "gap": "md",
4605
4698
  "children": [
4606
4699
  {
4607
- "type": "typography",
4608
4700
  "variant": "caption",
4609
- "content": "When"
4701
+ "content": "When",
4702
+ "type": "typography"
4610
4703
  },
4611
4704
  {
4612
4705
  "type": "typography",
4613
4706
  "variant": "body",
4614
4707
  "content": "@entity.scheduledAt"
4615
4708
  }
4616
- ],
4617
- "type": "stack",
4618
- "direction": "horizontal",
4619
- "gap": "md"
4709
+ ]
4620
4710
  },
4621
4711
  {
4712
+ "gap": "md",
4622
4713
  "direction": "horizontal",
4623
4714
  "type": "stack",
4624
- "gap": "md",
4625
4715
  "children": [
4626
4716
  {
4627
- "content": "Time",
4628
4717
  "type": "typography",
4629
- "variant": "caption"
4718
+ "variant": "caption",
4719
+ "content": "Time"
4630
4720
  },
4631
4721
  {
4632
4722
  "variant": "body",
4633
- "content": "@entity.time",
4634
- "type": "typography"
4723
+ "type": "typography",
4724
+ "content": "@entity.time"
4635
4725
  }
4636
4726
  ]
4637
4727
  },
4638
4728
  {
4639
- "gap": "md",
4640
4729
  "type": "stack",
4641
4730
  "children": [
4642
4731
  {
@@ -4650,39 +4739,41 @@
4650
4739
  "content": "@entity.status"
4651
4740
  }
4652
4741
  ],
4653
- "direction": "horizontal"
4742
+ "direction": "horizontal",
4743
+ "gap": "md"
4654
4744
  },
4655
4745
  {
4656
4746
  "type": "stack",
4747
+ "gap": "md",
4657
4748
  "direction": "horizontal",
4658
4749
  "children": [
4659
4750
  {
4660
- "type": "typography",
4661
4751
  "variant": "caption",
4662
- "content": "Notes"
4752
+ "content": "Notes",
4753
+ "type": "typography"
4663
4754
  },
4664
4755
  {
4665
4756
  "type": "typography",
4666
4757
  "variant": "body",
4667
4758
  "content": "@entity.notes"
4668
4759
  }
4669
- ],
4670
- "gap": "md"
4760
+ ]
4671
4761
  },
4672
4762
  {
4673
4763
  "type": "divider"
4674
4764
  },
4675
4765
  {
4676
4766
  "type": "stack",
4677
- "justify": "end",
4678
4767
  "gap": "sm",
4768
+ "justify": "end",
4769
+ "direction": "horizontal",
4679
4770
  "children": [
4680
4771
  {
4681
4772
  "type": "button",
4773
+ "variant": "primary",
4682
4774
  "label": "Edit",
4683
4775
  "icon": "edit",
4684
- "action": "EDIT",
4685
- "variant": "primary"
4776
+ "action": "EDIT"
4686
4777
  },
4687
4778
  {
4688
4779
  "label": "Close",
@@ -4690,12 +4781,10 @@
4690
4781
  "type": "button",
4691
4782
  "action": "CLOSE"
4692
4783
  }
4693
- ],
4694
- "direction": "horizontal"
4784
+ ]
4695
4785
  }
4696
4786
  ],
4697
4787
  "gap": "md",
4698
- "type": "stack",
4699
4788
  "direction": "vertical"
4700
4789
  }
4701
4790
  ]
@@ -4952,36 +5041,36 @@
4952
5041
  {
4953
5042
  "type": "stack",
4954
5043
  "direction": "vertical",
5044
+ "gap": "md",
4955
5045
  "children": [
4956
5046
  {
5047
+ "type": "stack",
4957
5048
  "align": "center",
4958
- "direction": "horizontal",
5049
+ "gap": "sm",
4959
5050
  "children": [
4960
5051
  {
4961
5052
  "name": "alert-triangle",
4962
5053
  "type": "icon"
4963
5054
  },
4964
5055
  {
5056
+ "type": "typography",
4965
5057
  "variant": "h3",
4966
- "content": "Delete Appointment",
4967
- "type": "typography"
5058
+ "content": "Delete Appointment"
4968
5059
  }
4969
5060
  ],
4970
- "gap": "sm",
4971
- "type": "stack"
5061
+ "direction": "horizontal"
4972
5062
  },
4973
5063
  {
4974
5064
  "type": "divider"
4975
5065
  },
4976
5066
  {
4977
- "type": "alert",
5067
+ "message": "This action cannot be undone.",
4978
5068
  "variant": "error",
4979
- "message": "This action cannot be undone."
5069
+ "type": "alert"
4980
5070
  },
4981
5071
  {
4982
- "direction": "horizontal",
4983
5072
  "justify": "end",
4984
- "type": "stack",
5073
+ "gap": "sm",
4985
5074
  "children": [
4986
5075
  {
4987
5076
  "label": "Cancel",
@@ -4990,17 +5079,17 @@
4990
5079
  "type": "button"
4991
5080
  },
4992
5081
  {
4993
- "action": "CONFIRM_DELETE",
4994
5082
  "variant": "danger",
5083
+ "action": "CONFIRM_DELETE",
4995
5084
  "label": "Delete",
4996
- "icon": "check",
4997
- "type": "button"
5085
+ "type": "button",
5086
+ "icon": "check"
4998
5087
  }
4999
5088
  ],
5000
- "gap": "sm"
5089
+ "type": "stack",
5090
+ "direction": "horizontal"
5001
5091
  }
5002
- ],
5003
- "gap": "md"
5092
+ ]
5004
5093
  }
5005
5094
  ]
5006
5095
  ]
@@ -5039,8 +5128,8 @@
5039
5128
  "Appointment",
5040
5129
  {
5041
5130
  "emit": {
5042
- "success": "AppointmentLoaded",
5043
- "failure": "AppointmentLoadFailed"
5131
+ "failure": "AppointmentLoadFailed",
5132
+ "success": "AppointmentLoaded"
5044
5133
  }
5045
5134
  }
5046
5135
  ],
@@ -5101,8 +5190,8 @@
5101
5190
  "Appointment",
5102
5191
  {
5103
5192
  "emit": {
5104
- "failure": "AppointmentLoadFailed",
5105
- "success": "AppointmentLoaded"
5193
+ "success": "AppointmentLoaded",
5194
+ "failure": "AppointmentLoadFailed"
5106
5195
  }
5107
5196
  }
5108
5197
  ]
@@ -5118,6 +5207,9 @@
5118
5207
  "name": "Appointments",
5119
5208
  "path": "/appointments",
5120
5209
  "traits": [
5210
+ {
5211
+ "ref": "AppointmentAppLayout"
5212
+ },
5121
5213
  {
5122
5214
  "ref": "AppointmentDashboard"
5123
5215
  },
@@ -5145,6 +5237,12 @@
5145
5237
  },
5146
5238
  {
5147
5239
  "name": "ScheduleOrbital",
5240
+ "uses": [
5241
+ {
5242
+ "from": "std/behaviors/std-app-layout",
5243
+ "as": "AppShell"
5244
+ }
5245
+ ],
5148
5246
  "entity": {
5149
5247
  "name": "Schedule",
5150
5248
  "persistence": "singleton",
@@ -5177,6 +5275,45 @@
5177
5275
  ]
5178
5276
  },
5179
5277
  "traits": [
5278
+ {
5279
+ "ref": "AppShell.traits.AppLayout",
5280
+ "name": "ScheduleAppLayout",
5281
+ "linkedEntity": "Schedule",
5282
+ "config": {
5283
+ "notificationClickEvent": "SCHEDULE_NOTIFICATIONS_OPEN",
5284
+ "navItems": [
5285
+ {
5286
+ "href": "/providers",
5287
+ "icon": "user-check",
5288
+ "label": "Providers"
5289
+ },
5290
+ {
5291
+ "icon": "calendar-plus",
5292
+ "href": "/book",
5293
+ "label": "Book"
5294
+ },
5295
+ {
5296
+ "href": "/appointments",
5297
+ "label": "Appointments",
5298
+ "icon": "calendar"
5299
+ },
5300
+ {
5301
+ "label": "Schedule",
5302
+ "href": "/schedule",
5303
+ "icon": "clock"
5304
+ }
5305
+ ],
5306
+ "topBarActions": [],
5307
+ "contentTrait": "@trait.ScheduleDisplay",
5308
+ "notifications": [],
5309
+ "searchEvent": "SCHEDULE_SEARCH",
5310
+ "appName": "BookingSystemApp"
5311
+ },
5312
+ "events": {
5313
+ "NOTIFY_CLICK": "SCHEDULE_NOTIFICATIONS_OPEN",
5314
+ "SEARCH": "SCHEDULE_SEARCH"
5315
+ }
5316
+ },
5180
5317
  {
5181
5318
  "name": "ScheduleDisplay",
5182
5319
  "category": "interaction",
@@ -5298,8 +5435,8 @@
5298
5435
  "Schedule",
5299
5436
  {
5300
5437
  "emit": {
5301
- "failure": "ScheduleLoadFailed",
5302
- "success": "ScheduleLoaded"
5438
+ "success": "ScheduleLoaded",
5439
+ "failure": "ScheduleLoadFailed"
5303
5440
  }
5304
5441
  }
5305
5442
  ],
@@ -5308,74 +5445,72 @@
5308
5445
  "main",
5309
5446
  {
5310
5447
  "type": "stack",
5311
- "gap": "lg",
5312
- "direction": "vertical",
5313
5448
  "children": [
5314
5449
  {
5315
5450
  "type": "stack",
5451
+ "gap": "md",
5452
+ "direction": "horizontal",
5453
+ "justify": "between",
5316
5454
  "align": "center",
5317
5455
  "children": [
5318
5456
  {
5319
5457
  "align": "center",
5320
5458
  "children": [
5321
5459
  {
5322
- "name": "clock",
5323
- "type": "icon"
5460
+ "type": "icon",
5461
+ "name": "clock"
5324
5462
  },
5325
5463
  {
5326
- "content": "Schedule Overview",
5464
+ "type": "typography",
5327
5465
  "variant": "h2",
5328
- "type": "typography"
5466
+ "content": "Schedule Overview"
5329
5467
  }
5330
5468
  ],
5331
- "type": "stack",
5469
+ "direction": "horizontal",
5332
5470
  "gap": "sm",
5333
- "direction": "horizontal"
5471
+ "type": "stack"
5334
5472
  },
5335
5473
  {
5336
- "variant": "secondary",
5337
5474
  "type": "button",
5338
5475
  "label": "Refresh",
5339
- "action": "REFRESH",
5340
- "icon": "refresh-cw"
5476
+ "variant": "secondary",
5477
+ "icon": "refresh-cw",
5478
+ "action": "REFRESH"
5341
5479
  }
5342
- ],
5343
- "direction": "horizontal",
5344
- "gap": "md",
5345
- "justify": "between"
5480
+ ]
5346
5481
  },
5347
5482
  {
5348
5483
  "type": "divider"
5349
5484
  },
5350
5485
  {
5486
+ "cols": 4.0,
5487
+ "type": "simple-grid",
5351
5488
  "children": [
5352
5489
  {
5353
- "icon": "calendar",
5354
- "label": "Total Bookings",
5355
5490
  "value": "@entity.totalBookings",
5356
- "type": "stat-display"
5491
+ "label": "Total Bookings",
5492
+ "type": "stat-display",
5493
+ "icon": "calendar"
5357
5494
  },
5358
5495
  {
5359
- "label": "Confirmed Today",
5360
- "icon": "check-circle",
5361
5496
  "type": "stat-display",
5497
+ "icon": "check-circle",
5498
+ "label": "Confirmed Today",
5362
5499
  "value": "@entity.confirmedToday"
5363
5500
  },
5364
5501
  {
5365
5502
  "type": "stat-display",
5366
- "icon": "clock",
5367
5503
  "label": "Pending",
5368
- "value": "@entity.pendingBookings"
5504
+ "value": "@entity.pendingBookings",
5505
+ "icon": "clock"
5369
5506
  },
5370
5507
  {
5371
- "type": "stat-display",
5372
- "value": "@entity.availableSlots",
5508
+ "label": "Available Slots",
5373
5509
  "icon": "calendar-plus",
5374
- "label": "Available Slots"
5510
+ "value": "@entity.availableSlots",
5511
+ "type": "stat-display"
5375
5512
  }
5376
- ],
5377
- "type": "simple-grid",
5378
- "cols": 4.0
5513
+ ]
5379
5514
  },
5380
5515
  {
5381
5516
  "type": "divider"
@@ -5383,7 +5518,9 @@
5383
5518
  {
5384
5519
  "type": "calendar-grid"
5385
5520
  }
5386
- ]
5521
+ ],
5522
+ "direction": "vertical",
5523
+ "gap": "lg"
5387
5524
  }
5388
5525
  ]
5389
5526
  ]
@@ -5398,8 +5535,8 @@
5398
5535
  "Schedule",
5399
5536
  {
5400
5537
  "emit": {
5401
- "success": "ScheduleLoaded",
5402
- "failure": "ScheduleLoadFailed"
5538
+ "failure": "ScheduleLoadFailed",
5539
+ "success": "ScheduleLoaded"
5403
5540
  }
5404
5541
  }
5405
5542
  ],
@@ -5407,22 +5544,22 @@
5407
5544
  "render-ui",
5408
5545
  "main",
5409
5546
  {
5547
+ "className": "py-12",
5548
+ "direction": "vertical",
5549
+ "type": "stack",
5550
+ "align": "center",
5551
+ "gap": "md",
5410
5552
  "children": [
5411
5553
  {
5412
5554
  "type": "spinner"
5413
5555
  },
5414
5556
  {
5415
5557
  "type": "typography",
5416
- "color": "muted",
5417
5558
  "content": "Refreshing…",
5418
- "variant": "caption"
5559
+ "variant": "caption",
5560
+ "color": "muted"
5419
5561
  }
5420
- ],
5421
- "gap": "md",
5422
- "className": "py-12",
5423
- "align": "center",
5424
- "direction": "vertical",
5425
- "type": "stack"
5562
+ ]
5426
5563
  }
5427
5564
  ]
5428
5565
  ]
@@ -5439,69 +5576,69 @@
5439
5576
  "gap": "lg",
5440
5577
  "children": [
5441
5578
  {
5442
- "justify": "between",
5443
- "type": "stack",
5444
- "gap": "md",
5445
5579
  "children": [
5446
5580
  {
5447
- "type": "stack",
5448
- "align": "center",
5581
+ "direction": "horizontal",
5449
5582
  "children": [
5450
5583
  {
5451
- "type": "icon",
5452
- "name": "clock"
5584
+ "name": "clock",
5585
+ "type": "icon"
5453
5586
  },
5454
5587
  {
5588
+ "type": "typography",
5455
5589
  "content": "Schedule Overview",
5456
- "variant": "h2",
5457
- "type": "typography"
5590
+ "variant": "h2"
5458
5591
  }
5459
5592
  ],
5460
5593
  "gap": "sm",
5461
- "direction": "horizontal"
5594
+ "align": "center",
5595
+ "type": "stack"
5462
5596
  },
5463
5597
  {
5464
- "variant": "secondary",
5598
+ "action": "REFRESH",
5465
5599
  "icon": "refresh-cw",
5466
- "type": "button",
5467
5600
  "label": "Refresh",
5468
- "action": "REFRESH"
5601
+ "variant": "secondary",
5602
+ "type": "button"
5469
5603
  }
5470
5604
  ],
5471
5605
  "align": "center",
5472
- "direction": "horizontal"
5606
+ "type": "stack",
5607
+ "direction": "horizontal",
5608
+ "gap": "md",
5609
+ "justify": "between"
5473
5610
  },
5474
5611
  {
5475
5612
  "type": "divider"
5476
5613
  },
5477
5614
  {
5478
- "cols": 4.0,
5479
5615
  "children": [
5480
5616
  {
5481
- "value": "@entity.totalBookings",
5482
- "label": "Total Bookings",
5483
5617
  "type": "stat-display",
5484
- "icon": "calendar"
5618
+ "icon": "calendar",
5619
+ "label": "Total Bookings",
5620
+ "value": "@entity.totalBookings"
5485
5621
  },
5486
5622
  {
5487
- "icon": "check-circle",
5488
5623
  "label": "Confirmed Today",
5489
5624
  "type": "stat-display",
5625
+ "icon": "check-circle",
5490
5626
  "value": "@entity.confirmedToday"
5491
5627
  },
5492
5628
  {
5629
+ "type": "stat-display",
5493
5630
  "label": "Pending",
5494
5631
  "value": "@entity.pendingBookings",
5495
- "type": "stat-display",
5496
5632
  "icon": "clock"
5497
5633
  },
5498
5634
  {
5499
- "label": "Available Slots",
5500
- "type": "stat-display",
5501
5635
  "icon": "calendar-plus",
5502
- "value": "@entity.availableSlots"
5636
+ "label": "Available Slots",
5637
+ "value": "@entity.availableSlots",
5638
+ "type": "stat-display"
5503
5639
  }
5504
5640
  ],
5641
+ "cols": 4.0,
5505
5642
  "type": "simple-grid"
5506
5643
  },
5507
5644
  {
@@ -5511,8 +5648,8 @@
5511
5648
  "type": "calendar-grid"
5512
5649
  }
5513
5650
  ],
5514
- "direction": "vertical",
5515
- "type": "stack"
5651
+ "type": "stack",
5652
+ "direction": "vertical"
5516
5653
  }
5517
5654
  ]
5518
5655
  ]
@@ -5529,11 +5666,10 @@
5529
5666
  "type": "stack",
5530
5667
  "children": [
5531
5668
  {
5532
- "direction": "horizontal",
5533
5669
  "type": "stack",
5534
- "justify": "between",
5535
5670
  "align": "center",
5536
5671
  "gap": "md",
5672
+ "justify": "between",
5537
5673
  "children": [
5538
5674
  {
5539
5675
  "children": [
@@ -5542,24 +5678,25 @@
5542
5678
  "name": "clock"
5543
5679
  },
5544
5680
  {
5545
- "variant": "h2",
5681
+ "content": "Schedule Overview",
5546
5682
  "type": "typography",
5547
- "content": "Schedule Overview"
5683
+ "variant": "h2"
5548
5684
  }
5549
5685
  ],
5550
- "gap": "sm",
5551
5686
  "align": "center",
5687
+ "direction": "horizontal",
5552
5688
  "type": "stack",
5553
- "direction": "horizontal"
5689
+ "gap": "sm"
5554
5690
  },
5555
5691
  {
5692
+ "label": "Refresh",
5693
+ "icon": "refresh-cw",
5556
5694
  "action": "REFRESH",
5557
5695
  "type": "button",
5558
- "variant": "secondary",
5559
- "icon": "refresh-cw",
5560
- "label": "Refresh"
5696
+ "variant": "secondary"
5561
5697
  }
5562
- ]
5698
+ ],
5699
+ "direction": "horizontal"
5563
5700
  },
5564
5701
  {
5565
5702
  "type": "divider"
@@ -5569,28 +5706,28 @@
5569
5706
  "cols": 4.0,
5570
5707
  "children": [
5571
5708
  {
5572
- "type": "stat-display",
5573
- "label": "Total Bookings",
5574
5709
  "value": "@entity.totalBookings",
5710
+ "label": "Total Bookings",
5711
+ "type": "stat-display",
5575
5712
  "icon": "calendar"
5576
5713
  },
5577
5714
  {
5578
- "value": "@entity.confirmedToday",
5579
5715
  "type": "stat-display",
5580
- "label": "Confirmed Today",
5581
- "icon": "check-circle"
5716
+ "value": "@entity.confirmedToday",
5717
+ "icon": "check-circle",
5718
+ "label": "Confirmed Today"
5582
5719
  },
5583
5720
  {
5584
- "icon": "clock",
5585
- "label": "Pending",
5586
5721
  "type": "stat-display",
5587
- "value": "@entity.pendingBookings"
5722
+ "value": "@entity.pendingBookings",
5723
+ "label": "Pending",
5724
+ "icon": "clock"
5588
5725
  },
5589
5726
  {
5590
- "value": "@entity.availableSlots",
5591
5727
  "label": "Available Slots",
5728
+ "type": "stat-display",
5592
5729
  "icon": "calendar-plus",
5593
- "type": "stat-display"
5730
+ "value": "@entity.availableSlots"
5594
5731
  }
5595
5732
  ]
5596
5733
  },
@@ -5601,8 +5738,8 @@
5601
5738
  "type": "calendar-grid"
5602
5739
  }
5603
5740
  ],
5604
- "direction": "vertical",
5605
- "gap": "lg"
5741
+ "gap": "lg",
5742
+ "direction": "vertical"
5606
5743
  }
5607
5744
  ]
5608
5745
  ]
@@ -5616,36 +5753,36 @@
5616
5753
  "render-ui",
5617
5754
  "main",
5618
5755
  {
5619
- "align": "center",
5620
- "direction": "vertical",
5621
5756
  "gap": "md",
5622
- "type": "stack",
5623
5757
  "className": "py-12",
5758
+ "align": "center",
5624
5759
  "children": [
5625
5760
  {
5626
- "color": "destructive",
5627
5761
  "name": "alert-triangle",
5762
+ "color": "destructive",
5628
5763
  "type": "icon"
5629
5764
  },
5630
5765
  {
5631
5766
  "content": "Failed to refresh schedule",
5632
- "type": "typography",
5633
- "variant": "h3"
5767
+ "variant": "h3",
5768
+ "type": "typography"
5634
5769
  },
5635
5770
  {
5636
- "type": "typography",
5637
- "color": "muted",
5638
5771
  "variant": "body",
5772
+ "color": "muted",
5773
+ "type": "typography",
5639
5774
  "content": "@payload.error"
5640
5775
  },
5641
5776
  {
5642
- "type": "button",
5643
5777
  "label": "Retry",
5644
5778
  "action": "REFRESH",
5779
+ "variant": "primary",
5645
5780
  "icon": "rotate-ccw",
5646
- "variant": "primary"
5781
+ "type": "button"
5647
5782
  }
5648
- ]
5783
+ ],
5784
+ "direction": "vertical",
5785
+ "type": "stack"
5649
5786
  }
5650
5787
  ]
5651
5788
  ]
@@ -5660,6 +5797,9 @@
5660
5797
  "name": "Schedule",
5661
5798
  "path": "/schedule",
5662
5799
  "traits": [
5800
+ {
5801
+ "ref": "ScheduleAppLayout"
5802
+ },
5663
5803
  {
5664
5804
  "ref": "ScheduleDisplay"
5665
5805
  }