yaml-flow 8.11.7 → 8.11.9

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 (92) hide show
  1. package/browser/asset-integrity.json +5 -5
  2. package/browser/live-cards.schema.json +779 -150
  3. package/browser/server-runtime-controlface.js +4 -4
  4. package/examples/board/cards/card-rebalance-sim.json +11 -6
  5. package/examples/board/cards/cardT-market-prices.json +3 -1
  6. package/examples/board/cards/cardT-portfolio-value.json +3 -1
  7. package/examples/board/cards/cardT-portfolio.json +4 -2
  8. package/examples/board/test/server-http-test-browser.ts +3 -1
  9. package/examples/board/test/server-http-test.js +3 -1
  10. package/examples/portfolio-tracker/portfolio-tracker.js +2 -2
  11. package/examples/portfolio-tracker/test/portfolio-t4.js +2 -2
  12. package/lib/board-live-cards-mcp.cjs +1 -1
  13. package/lib/board-live-cards-mcp.js +1 -1
  14. package/lib/board-live-cards-node.cjs +6 -6
  15. package/lib/board-live-cards-node.js +6 -6
  16. package/lib/board-live-cards-public.cjs +1 -1
  17. package/lib/board-live-cards-public.js +1 -1
  18. package/lib/board-live-cards-server-runtime.cjs +1 -1
  19. package/lib/board-live-cards-server-runtime.js +1 -1
  20. package/lib/board-livegraph-runtime/index.cjs +1 -1
  21. package/lib/board-livegraph-runtime/index.d.cts +1 -1
  22. package/lib/board-livegraph-runtime/index.d.ts +1 -1
  23. package/lib/board-livegraph-runtime/index.js +1 -1
  24. package/lib/card-compute/index.cjs +1 -1
  25. package/lib/card-compute/index.d.cts +6 -0
  26. package/lib/card-compute/index.d.ts +6 -0
  27. package/lib/card-compute/index.js +1 -1
  28. package/lib/card-store-public.cjs +1 -1
  29. package/lib/card-store-public.js +1 -1
  30. package/lib/card-validation.cjs +1 -1
  31. package/lib/card-validation.js +1 -1
  32. package/lib/{chunk-TUQ6JBER.cjs → chunk-22S5GCQK.cjs} +3 -3
  33. package/lib/{chunk-HKPVF5UI.js → chunk-3C52UCJC.js} +3 -3
  34. package/lib/{chunk-NOAERAOE.cjs → chunk-3HCH2ZFB.cjs} +2 -2
  35. package/lib/chunk-66ZZIF2L.cjs +2 -0
  36. package/lib/{chunk-EHREWADE.js → chunk-72FB4M6P.js} +2 -2
  37. package/lib/chunk-AW6XLBHX.cjs +2 -0
  38. package/lib/chunk-BSZYTSFX.js +2 -0
  39. package/lib/chunk-C7OY3PYL.js +3 -0
  40. package/lib/chunk-C7RR2JCL.cjs +3 -0
  41. package/lib/chunk-CAID4CGO.cjs +2 -0
  42. package/lib/chunk-CVTL2EFR.js +3 -0
  43. package/lib/chunk-E7SDEZSI.js +3 -0
  44. package/lib/{chunk-I3ZOFU3F.js → chunk-F6KRSQ7V.js} +2 -2
  45. package/lib/chunk-G5UUXBIB.cjs +2 -0
  46. package/lib/{chunk-23PEDGFN.js → chunk-K2VRX4TC.js} +2 -2
  47. package/lib/chunk-ONJG6QW6.js +2 -0
  48. package/lib/{chunk-52XPRCZC.cjs → chunk-P4WQJ7LA.cjs} +2 -2
  49. package/lib/chunk-P7STTKRO.cjs +3 -0
  50. package/lib/{chunk-YAPTL2MP.cjs → chunk-PYYRDOD5.cjs} +2 -2
  51. package/lib/chunk-QE3QXEHI.js +2 -0
  52. package/lib/chunk-QJQ53PLM.js +2 -0
  53. package/lib/chunk-TIQ775WI.cjs +3 -0
  54. package/lib/cloud-storage.cjs +1 -1
  55. package/lib/cloud-storage.js +1 -1
  56. package/lib/continuous-event-graph/index.cjs +1 -1
  57. package/lib/continuous-event-graph/index.d.cts +2 -2
  58. package/lib/continuous-event-graph/index.d.ts +2 -2
  59. package/lib/continuous-event-graph/index.js +1 -1
  60. package/lib/firestore-storage/index.cjs +1 -1
  61. package/lib/firestore-storage/index.js +1 -1
  62. package/lib/index.cjs +2 -2
  63. package/lib/index.d.cts +1 -1
  64. package/lib/index.d.ts +1 -1
  65. package/lib/index.js +1 -1
  66. package/lib/{live-cards-bridge-Bwi-lbBT.d.cts → live-cards-bridge-D8kP3uog.d.cts} +2 -2
  67. package/lib/{live-cards-bridge-YL6AWawT.d.ts → live-cards-bridge-DMBSDgpk.d.ts} +2 -2
  68. package/lib/localstorage-storage/index.cjs +1 -1
  69. package/lib/localstorage-storage/index.js +1 -1
  70. package/lib/server-runtime/index.cjs +1 -1
  71. package/lib/server-runtime/index.js +1 -1
  72. package/lib/server-runtime-controlface/index.cjs +1 -1
  73. package/lib/server-runtime-controlface/index.js +1 -1
  74. package/lib/server-runtime-core/index.cjs +1 -1
  75. package/lib/server-runtime-core/index.js +1 -1
  76. package/package.json +2 -1
  77. package/schema/live-cards.schema.json +779 -150
  78. package/browser/live-cards.js +0 -108
  79. package/lib/chunk-2LGCYN35.js +0 -2
  80. package/lib/chunk-3XPY7CCM.cjs +0 -3
  81. package/lib/chunk-6M3RIGUH.js +0 -2
  82. package/lib/chunk-ATOQP3BD.js +0 -2
  83. package/lib/chunk-CPJXGK2T.cjs +0 -2
  84. package/lib/chunk-GHUW6P4G.cjs +0 -2
  85. package/lib/chunk-J7KE7SPA.cjs +0 -2
  86. package/lib/chunk-K5TEZRZK.cjs +0 -3
  87. package/lib/chunk-QBEQL4TL.cjs +0 -2
  88. package/lib/chunk-QEHKMLHA.cjs +0 -3
  89. package/lib/chunk-RKLEBQUG.js +0 -3
  90. package/lib/chunk-WGYS2L4V.js +0 -2
  91. package/lib/chunk-X32SJDLT.js +0 -3
  92. package/lib/chunk-YT76JNKE.js +0 -3
@@ -7,34 +7,6 @@
7
7
  "type": "string",
8
8
  "pattern": "^(card_data|requires|fetched_sources|computed_values)(\\.|$)"
9
9
  },
10
- "bind_or_literal": {
11
- "description": "A literal value or a bind reference object",
12
- "oneOf": [
13
- {
14
- "type": "string"
15
- },
16
- {
17
- "type": "number"
18
- },
19
- {
20
- "type": "boolean"
21
- },
22
- {
23
- "type": "array"
24
- },
25
- {
26
- "type": "object",
27
- "properties": {
28
- "bind": {
29
- "$ref": "#/definitions/bind_ref"
30
- }
31
- },
32
- "required": [
33
- "bind"
34
- ]
35
- }
36
- ]
37
- },
38
10
  "compute_expr": {
39
11
  "description": "A declarative JSON compute expression",
40
12
  "type": "object",
@@ -257,6 +229,10 @@
257
229
  "type": "string"
258
230
  }
259
231
  },
232
+ "skip_when": {
233
+ "type": "string",
234
+ "description": "JSONata over card_data/requires. Truthy skips this source."
235
+ },
260
236
  "timeout": {
261
237
  "type": "integer",
262
238
  "minimum": 0,
@@ -274,11 +250,8 @@
274
250
  "required": [
275
251
  "kind"
276
252
  ],
253
+ "additionalProperties": false,
277
254
  "properties": {
278
- "id": {
279
- "type": "string",
280
- "description": "Optional element ID for targeted updates"
281
- },
282
255
  "kind": {
283
256
  "enum": [
284
257
  "metric",
@@ -286,7 +259,6 @@
286
259
  "editable-table",
287
260
  "chart",
288
261
  "form",
289
- "filter",
290
262
  "list",
291
263
  "notes",
292
264
  "todo",
@@ -295,163 +267,456 @@
295
267
  "badge",
296
268
  "text",
297
269
  "markdown",
270
+ "markup",
271
+ "selection",
272
+ "searchbox",
273
+ "query",
298
274
  "ref",
299
275
  "custom",
300
276
  "actions"
301
277
  ]
302
278
  },
279
+ "id": {
280
+ "type": "string",
281
+ "description": "Optional element ID for targeted updates and action routing"
282
+ },
303
283
  "label": {
304
284
  "type": "string",
305
- "description": "Heading above this element"
285
+ "description": "Heading above this element (also the metric/alert title)"
306
286
  },
307
287
  "className": {
308
288
  "type": "string",
309
289
  "description": "Bootstrap grid class, e.g. 'col-12 col-md-6'"
310
290
  },
291
+ "containerStyle": {
292
+ "type": "object",
293
+ "description": "Inline style applied to the element container"
294
+ },
311
295
  "visible": {
312
296
  "type": "string",
313
297
  "description": "card_data/requires/fetched_sources/computed_values path — element shown only if truthy"
314
298
  },
315
299
  "data": {
300
+ "allOf": [
301
+ {
302
+ "$ref": "#/definitions/value_source"
303
+ }
304
+ ],
305
+ "description": "The element value: { bind } (dynamic) or { value } (static literal)"
306
+ },
307
+ "writeTo": {
308
+ "$ref": "#/definitions/write_ref"
309
+ },
310
+ "spec": {
316
311
  "type": "object",
317
- "properties": {
318
- "bind": {
319
- "$ref": "#/definitions/bind_ref",
320
- "description": "card_data/requires/fetched_sources/computed_values path to read data from"
312
+ "description": "Per-kind static configuration (constrained per kind below)"
313
+ }
314
+ },
315
+ "allOf": [
316
+ {
317
+ "if": {
318
+ "properties": {
319
+ "kind": {
320
+ "const": "metric"
321
+ }
321
322
  },
322
- "writeTo": {
323
- "$ref": "#/definitions/bind_ref",
324
- "description": "card_data path for user input (form, filter, todo, notes)"
323
+ "required": [
324
+ "kind"
325
+ ]
326
+ },
327
+ "then": {
328
+ "properties": {
329
+ "spec": {
330
+ "$ref": "#/definitions/spec_empty"
331
+ },
332
+ "writeTo": false
325
333
  },
326
- "columns": {
327
- "type": "array",
328
- "items": {
329
- "type": "string"
334
+ "required": [
335
+ "data"
336
+ ]
337
+ }
338
+ },
339
+ {
340
+ "if": {
341
+ "properties": {
342
+ "kind": {
343
+ "const": "table"
344
+ }
345
+ },
346
+ "required": [
347
+ "kind"
348
+ ]
349
+ },
350
+ "then": {
351
+ "properties": {
352
+ "spec": {
353
+ "$ref": "#/definitions/spec_table"
330
354
  },
331
- "description": "table: visible columns"
355
+ "writeTo": false
332
356
  },
333
- "maxRows": {
334
- "type": "integer",
335
- "description": "table/list: max rows to display"
357
+ "required": [
358
+ "data"
359
+ ]
360
+ }
361
+ },
362
+ {
363
+ "if": {
364
+ "properties": {
365
+ "kind": {
366
+ "const": "list"
367
+ }
336
368
  },
337
- "sortable": {
338
- "type": "boolean",
339
- "default": true,
340
- "description": "table: enable click-to-sort"
369
+ "required": [
370
+ "kind"
371
+ ]
372
+ },
373
+ "then": {
374
+ "properties": {
375
+ "spec": {
376
+ "$ref": "#/definitions/spec_table"
377
+ },
378
+ "writeTo": false
341
379
  },
342
- "placeholder": {
343
- "type": "string",
344
- "description": "Empty-state message"
380
+ "required": [
381
+ "data"
382
+ ]
383
+ }
384
+ },
385
+ {
386
+ "if": {
387
+ "properties": {
388
+ "kind": {
389
+ "const": "chart"
390
+ }
345
391
  },
346
- "chartType": {
347
- "enum": [
348
- "bar",
349
- "line",
350
- "pie",
351
- "doughnut"
352
- ]
392
+ "required": [
393
+ "kind"
394
+ ]
395
+ },
396
+ "then": {
397
+ "properties": {
398
+ "spec": {
399
+ "$ref": "#/definitions/spec_chart"
400
+ },
401
+ "writeTo": false
353
402
  },
354
- "chartOptions": {
355
- "type": "object",
356
- "description": "Chart.js options passthrough"
357
- },
358
- "fields": {
359
- "type": "object",
360
- "description": "JSON Schema for form/filter fields"
361
- },
362
- "thresholds": {
363
- "type": "object",
364
- "properties": {
365
- "green": {
366
- "type": "string"
367
- },
368
- "amber": {
369
- "type": "string"
370
- }
403
+ "required": [
404
+ "data"
405
+ ]
406
+ }
407
+ },
408
+ {
409
+ "if": {
410
+ "properties": {
411
+ "kind": {
412
+ "const": "alert"
371
413
  }
372
414
  },
373
- "colorMap": {
374
- "type": "object",
375
- "description": "badge: value → Bootstrap color"
415
+ "required": [
416
+ "kind"
417
+ ]
418
+ },
419
+ "then": {
420
+ "properties": {
421
+ "spec": {
422
+ "$ref": "#/definitions/spec_alert"
423
+ },
424
+ "writeTo": false
376
425
  },
377
- "style": {
378
- "enum": [
379
- "heading",
380
- "muted",
381
- "default"
382
- ],
383
- "description": "text: display style"
426
+ "required": [
427
+ "data"
428
+ ]
429
+ }
430
+ },
431
+ {
432
+ "if": {
433
+ "properties": {
434
+ "kind": {
435
+ "const": "badge"
436
+ }
384
437
  },
385
- "upload": {
386
- "type": "boolean",
387
- "default": true,
388
- "description": "file-upload: show drop zone (false = read-only file list)"
438
+ "required": [
439
+ "kind"
440
+ ]
441
+ },
442
+ "then": {
443
+ "properties": {
444
+ "spec": {
445
+ "$ref": "#/definitions/spec_badge"
446
+ },
447
+ "writeTo": false
389
448
  },
390
- "accept": {
391
- "type": "array",
392
- "items": {
393
- "type": "string"
449
+ "required": [
450
+ "data"
451
+ ]
452
+ }
453
+ },
454
+ {
455
+ "if": {
456
+ "properties": {
457
+ "kind": {
458
+ "const": "narrative"
459
+ }
460
+ },
461
+ "required": [
462
+ "kind"
463
+ ]
464
+ },
465
+ "then": {
466
+ "properties": {
467
+ "spec": {
468
+ "$ref": "#/definitions/spec_empty"
394
469
  },
395
- "description": "file-upload: allowed extensions"
470
+ "writeTo": false
396
471
  },
397
- "multiple": {
398
- "type": "boolean",
399
- "default": true,
400
- "description": "file-upload: allow multiple files"
472
+ "required": [
473
+ "data"
474
+ ]
475
+ }
476
+ },
477
+ {
478
+ "if": {
479
+ "properties": {
480
+ "kind": {
481
+ "const": "text"
482
+ }
401
483
  },
402
- "fileAttach": {
403
- "type": "boolean",
404
- "default": false,
405
- "description": "chat: enable inline file attachments"
484
+ "required": [
485
+ "kind"
486
+ ]
487
+ },
488
+ "then": {
489
+ "properties": {
490
+ "spec": {
491
+ "$ref": "#/definitions/spec_text"
492
+ },
493
+ "writeTo": false
406
494
  },
407
- "fileAccept": {
408
- "type": "array",
409
- "items": {
410
- "type": "string"
495
+ "required": [
496
+ "data"
497
+ ]
498
+ }
499
+ },
500
+ {
501
+ "if": {
502
+ "properties": {
503
+ "kind": {
504
+ "const": "markdown"
505
+ }
506
+ },
507
+ "required": [
508
+ "kind"
509
+ ]
510
+ },
511
+ "then": {
512
+ "properties": {
513
+ "spec": {
514
+ "$ref": "#/definitions/spec_empty"
411
515
  },
412
- "description": "chat: allowed attachment extensions"
413
- },
414
- "buttons": {
415
- "type": "array",
416
- "description": "actions: button definitions",
417
- "items": {
418
- "type": "object",
419
- "required": [
420
- "id",
421
- "label"
422
- ],
423
- "properties": {
424
- "id": {
425
- "type": "string"
426
- },
427
- "label": {
428
- "type": "string"
429
- },
430
- "style": {
431
- "type": "string",
432
- "description": "Bootstrap button variant, e.g. 'success', 'outline-danger'"
433
- },
434
- "size": {
435
- "type": "string",
436
- "default": "sm"
437
- },
438
- "disabled": {
439
- "oneOf": [
440
- {
441
- "type": "boolean"
442
- },
443
- {
444
- "type": "string",
445
- "description": "card_data/requires/fetched_sources/computed_values path — truthy = disabled"
446
- }
447
- ]
448
- }
449
- }
516
+ "writeTo": false
517
+ },
518
+ "required": [
519
+ "data"
520
+ ]
521
+ }
522
+ },
523
+ {
524
+ "if": {
525
+ "properties": {
526
+ "kind": {
527
+ "const": "markup"
528
+ }
529
+ },
530
+ "required": [
531
+ "kind"
532
+ ]
533
+ },
534
+ "then": {
535
+ "properties": {
536
+ "spec": {
537
+ "$ref": "#/definitions/spec_empty"
538
+ },
539
+ "writeTo": false
540
+ },
541
+ "required": [
542
+ "data"
543
+ ]
544
+ }
545
+ },
546
+ {
547
+ "if": {
548
+ "properties": {
549
+ "kind": {
550
+ "const": "actions"
551
+ }
552
+ },
553
+ "required": [
554
+ "kind"
555
+ ]
556
+ },
557
+ "then": {
558
+ "properties": {
559
+ "spec": {
560
+ "$ref": "#/definitions/spec_actions"
561
+ },
562
+ "data": false,
563
+ "writeTo": false
564
+ }
565
+ }
566
+ },
567
+ {
568
+ "if": {
569
+ "properties": {
570
+ "kind": {
571
+ "const": "selection"
572
+ }
573
+ },
574
+ "required": [
575
+ "kind"
576
+ ]
577
+ },
578
+ "then": {
579
+ "properties": {
580
+ "spec": {
581
+ "$ref": "#/definitions/spec_single_field"
582
+ }
583
+ }
584
+ }
585
+ },
586
+ {
587
+ "if": {
588
+ "properties": {
589
+ "kind": {
590
+ "const": "searchbox"
591
+ }
592
+ },
593
+ "required": [
594
+ "kind"
595
+ ]
596
+ },
597
+ "then": {
598
+ "properties": {
599
+ "spec": {
600
+ "$ref": "#/definitions/spec_searchbox"
601
+ }
602
+ }
603
+ }
604
+ },
605
+ {
606
+ "if": {
607
+ "properties": {
608
+ "kind": {
609
+ "const": "query"
610
+ }
611
+ },
612
+ "required": [
613
+ "kind"
614
+ ]
615
+ },
616
+ "then": {
617
+ "properties": {
618
+ "spec": {
619
+ "$ref": "#/definitions/spec_searchbox"
620
+ }
621
+ }
622
+ }
623
+ },
624
+ {
625
+ "if": {
626
+ "properties": {
627
+ "kind": {
628
+ "const": "form"
629
+ }
630
+ },
631
+ "required": [
632
+ "kind"
633
+ ]
634
+ },
635
+ "then": {
636
+ "properties": {
637
+ "spec": {
638
+ "$ref": "#/definitions/spec_form"
639
+ }
640
+ }
641
+ }
642
+ },
643
+ {
644
+ "if": {
645
+ "properties": {
646
+ "kind": {
647
+ "const": "notes"
648
+ }
649
+ },
650
+ "required": [
651
+ "kind"
652
+ ]
653
+ },
654
+ "then": {
655
+ "properties": {
656
+ "spec": {
657
+ "$ref": "#/definitions/spec_empty"
658
+ }
659
+ }
660
+ }
661
+ },
662
+ {
663
+ "if": {
664
+ "properties": {
665
+ "kind": {
666
+ "const": "todo"
667
+ }
668
+ },
669
+ "required": [
670
+ "kind"
671
+ ]
672
+ },
673
+ "then": {
674
+ "properties": {
675
+ "spec": {
676
+ "$ref": "#/definitions/spec_empty"
677
+ }
678
+ }
679
+ }
680
+ },
681
+ {
682
+ "if": {
683
+ "properties": {
684
+ "kind": {
685
+ "const": "editable-table"
686
+ }
687
+ },
688
+ "required": [
689
+ "kind"
690
+ ]
691
+ },
692
+ "then": {
693
+ "properties": {
694
+ "spec": {
695
+ "$ref": "#/definitions/spec_editable_table"
696
+ }
697
+ }
698
+ }
699
+ },
700
+ {
701
+ "if": {
702
+ "properties": {
703
+ "kind": {
704
+ "const": "ref"
705
+ }
706
+ },
707
+ "required": [
708
+ "kind"
709
+ ]
710
+ },
711
+ "then": {
712
+ "properties": {
713
+ "spec": {
714
+ "$ref": "#/definitions/spec_ref"
450
715
  }
451
716
  }
452
717
  }
453
718
  }
454
- }
719
+ ]
455
720
  },
456
721
  "view": {
457
722
  "type": "object",
@@ -467,6 +732,370 @@
467
732
  }
468
733
  }
469
734
  }
735
+ },
736
+ "value_source": {
737
+ "description": "Element value source. Exactly one of `bind` (dynamic path) or `value` (static inline literal).",
738
+ "type": "object",
739
+ "oneOf": [
740
+ {
741
+ "required": [
742
+ "bind"
743
+ ],
744
+ "additionalProperties": false,
745
+ "properties": {
746
+ "bind": {
747
+ "$ref": "#/definitions/bind_ref",
748
+ "description": "card_data/requires/fetched_sources/computed_values path to read the value from"
749
+ }
750
+ }
751
+ },
752
+ {
753
+ "required": [
754
+ "value"
755
+ ],
756
+ "additionalProperties": false,
757
+ "properties": {
758
+ "value": {
759
+ "description": "Static inline literal value (no binding)."
760
+ }
761
+ }
762
+ }
763
+ ]
764
+ },
765
+ "write_ref": {
766
+ "type": "string",
767
+ "pattern": "^card_data(\\.|$)",
768
+ "description": "card_data path the element writes user input to (input kinds only)"
769
+ },
770
+ "spec_empty": {
771
+ "type": "object",
772
+ "additionalProperties": false,
773
+ "properties": {}
774
+ },
775
+ "spec_table": {
776
+ "type": "object",
777
+ "additionalProperties": false,
778
+ "properties": {
779
+ "columns": {
780
+ "type": "array",
781
+ "items": {
782
+ "type": "string"
783
+ },
784
+ "description": "Visible columns, in order"
785
+ },
786
+ "maxRows": {
787
+ "type": "integer",
788
+ "description": "Max rows to display"
789
+ },
790
+ "sortable": {
791
+ "type": "boolean",
792
+ "default": true,
793
+ "description": "Enable click-to-sort"
794
+ },
795
+ "placeholder": {
796
+ "type": "string",
797
+ "description": "Empty-state message"
798
+ }
799
+ }
800
+ },
801
+ "spec_chart": {
802
+ "type": "object",
803
+ "additionalProperties": false,
804
+ "properties": {
805
+ "chartType": {
806
+ "enum": [
807
+ "bar",
808
+ "line",
809
+ "area",
810
+ "scatter",
811
+ "pie",
812
+ "doughnut"
813
+ ],
814
+ "description": "Explicit chart type (else auto-detected)"
815
+ },
816
+ "columns": {
817
+ "type": "array",
818
+ "items": {
819
+ "type": "string"
820
+ },
821
+ "description": "First column is the label/x axis; rest are series"
822
+ },
823
+ "labelKey": {
824
+ "type": "string",
825
+ "description": "Row key to use as the category/x label"
826
+ },
827
+ "xKey": {
828
+ "type": "string",
829
+ "description": "Row key to use as the x axis (line charts)"
830
+ },
831
+ "series": {
832
+ "type": "array",
833
+ "items": {
834
+ "type": "string"
835
+ },
836
+ "description": "Row keys to plot as series"
837
+ },
838
+ "stacked": {
839
+ "type": "boolean",
840
+ "description": "Stack bar/area series"
841
+ },
842
+ "legend": {
843
+ "type": "boolean",
844
+ "default": true,
845
+ "description": "Show the legend"
846
+ },
847
+ "grid": {
848
+ "type": "boolean",
849
+ "default": true,
850
+ "description": "Show the cartesian grid"
851
+ },
852
+ "height": {
853
+ "type": "integer",
854
+ "default": 220,
855
+ "description": "Chart height in pixels"
856
+ }
857
+ }
858
+ },
859
+ "spec_alert": {
860
+ "type": "object",
861
+ "additionalProperties": false,
862
+ "properties": {
863
+ "thresholds": {
864
+ "type": "object",
865
+ "additionalProperties": false,
866
+ "properties": {
867
+ "green": {
868
+ "type": "string",
869
+ "description": "Comparison expr, e.g. '>=80'"
870
+ },
871
+ "amber": {
872
+ "type": "string",
873
+ "description": "Comparison expr, e.g. '>=50'"
874
+ }
875
+ }
876
+ }
877
+ }
878
+ },
879
+ "spec_badge": {
880
+ "type": "object",
881
+ "additionalProperties": false,
882
+ "properties": {
883
+ "colorMap": {
884
+ "type": "object",
885
+ "additionalProperties": {
886
+ "type": "string"
887
+ },
888
+ "description": "value → tone/Bootstrap color"
889
+ }
890
+ }
891
+ },
892
+ "spec_text": {
893
+ "type": "object",
894
+ "additionalProperties": false,
895
+ "properties": {
896
+ "format": {
897
+ "enum": [
898
+ "default",
899
+ "file-links"
900
+ ],
901
+ "description": "'file-links' renders the bound file array as download links"
902
+ },
903
+ "style": {
904
+ "enum": [
905
+ "default",
906
+ "muted",
907
+ "muted-italic",
908
+ "heading"
909
+ ],
910
+ "description": "Display style"
911
+ },
912
+ "hideIfEmpty": {
913
+ "type": "boolean",
914
+ "description": "Render nothing when the value is empty"
915
+ }
916
+ }
917
+ },
918
+ "spec_actions": {
919
+ "type": "object",
920
+ "additionalProperties": false,
921
+ "required": [
922
+ "buttons"
923
+ ],
924
+ "properties": {
925
+ "buttons": {
926
+ "type": "array",
927
+ "description": "Button definitions; clicks emit an action save keyed by element id + button id",
928
+ "items": {
929
+ "type": "object",
930
+ "required": [
931
+ "id",
932
+ "label"
933
+ ],
934
+ "additionalProperties": false,
935
+ "properties": {
936
+ "id": {
937
+ "type": "string"
938
+ },
939
+ "label": {
940
+ "type": "string"
941
+ },
942
+ "style": {
943
+ "type": "string",
944
+ "description": "Bootstrap button variant, e.g. 'success', 'outline-danger'"
945
+ },
946
+ "size": {
947
+ "type": "string",
948
+ "default": "sm"
949
+ },
950
+ "disabled": {
951
+ "oneOf": [
952
+ {
953
+ "type": "boolean"
954
+ },
955
+ {
956
+ "type": "string",
957
+ "description": "card_data/requires/fetched_sources/computed_values path — truthy = disabled"
958
+ }
959
+ ]
960
+ }
961
+ }
962
+ }
963
+ }
964
+ }
965
+ },
966
+ "spec_form": {
967
+ "type": "object",
968
+ "additionalProperties": false,
969
+ "required": [
970
+ "fields"
971
+ ],
972
+ "properties": {
973
+ "fields": {
974
+ "type": "object",
975
+ "description": "JSON-Schema-ish { properties, required } describing the form fields"
976
+ },
977
+ "discardLabel": {
978
+ "type": "string"
979
+ },
980
+ "saveLabel": {
981
+ "type": "string"
982
+ },
983
+ "validators": {
984
+ "type": "array",
985
+ "description": "Cross-field validation rules. Each item is a [jsonataExpr, errorMessage] pair; the expr is evaluated against { data: <current field values> } and must return true to pass. Required-field emptiness is already handled by fields.required, so validators are for format/relationship rules. Runs on blur and submit.",
986
+ "items": {
987
+ "type": "array",
988
+ "minItems": 2,
989
+ "maxItems": 2,
990
+ "items": {
991
+ "type": "string"
992
+ }
993
+ }
994
+ }
995
+ }
996
+ },
997
+ "spec_single_field": {
998
+ "type": "object",
999
+ "additionalProperties": false,
1000
+ "required": [
1001
+ "fields"
1002
+ ],
1003
+ "properties": {
1004
+ "fields": {
1005
+ "type": "object",
1006
+ "description": "Single-property JSON-Schema-ish { properties, required } for the control"
1007
+ }
1008
+ }
1009
+ },
1010
+ "spec_searchbox": {
1011
+ "type": "object",
1012
+ "additionalProperties": false,
1013
+ "required": [
1014
+ "fields"
1015
+ ],
1016
+ "properties": {
1017
+ "fields": {
1018
+ "type": "object",
1019
+ "description": "Single-property JSON-Schema-ish { properties, required } for the query field"
1020
+ },
1021
+ "actionLabel": {
1022
+ "type": "string",
1023
+ "description": "Submit button label (default 'Search')"
1024
+ }
1025
+ }
1026
+ },
1027
+ "spec_editable_table": {
1028
+ "type": "object",
1029
+ "additionalProperties": false,
1030
+ "properties": {
1031
+ "schema": {
1032
+ "type": "object",
1033
+ "description": "JSON-Schema-ish { properties } describing per-column cell types"
1034
+ },
1035
+ "columns": {
1036
+ "type": "array",
1037
+ "items": {
1038
+ "type": "string"
1039
+ },
1040
+ "description": "Explicit column order"
1041
+ },
1042
+ "addRow": {
1043
+ "type": "boolean",
1044
+ "default": true
1045
+ },
1046
+ "deleteRow": {
1047
+ "type": "boolean",
1048
+ "default": true
1049
+ },
1050
+ "placeholder": {
1051
+ "type": "string"
1052
+ }
1053
+ }
1054
+ },
1055
+ "spec_ref": {
1056
+ "type": "object",
1057
+ "additionalProperties": true,
1058
+ "required": [
1059
+ "viewBind"
1060
+ ],
1061
+ "properties": {
1062
+ "viewBind": {
1063
+ "$ref": "#/definitions/bind_ref",
1064
+ "description": "Path to a computed view descriptor { kind, data?, spec? } selecting the effective kind at runtime"
1065
+ },
1066
+ "fallbackKind": {
1067
+ "enum": [
1068
+ "metric",
1069
+ "table",
1070
+ "editable-table",
1071
+ "chart",
1072
+ "form",
1073
+ "list",
1074
+ "notes",
1075
+ "todo",
1076
+ "alert",
1077
+ "narrative",
1078
+ "badge",
1079
+ "text",
1080
+ "markdown",
1081
+ "markup",
1082
+ "selection",
1083
+ "searchbox",
1084
+ "query",
1085
+ "ref",
1086
+ "custom",
1087
+ "actions"
1088
+ ],
1089
+ "description": "Kind to use when viewBind is absent/unresolved"
1090
+ },
1091
+ "columns": {
1092
+ "type": "array",
1093
+ "items": {
1094
+ "type": "string"
1095
+ },
1096
+ "description": "Columns to forward to the resolved table/list view"
1097
+ }
1098
+ }
470
1099
  }
471
1100
  },
472
1101
  "title": "LiveCard",