yaml-flow 8.11.8 → 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 (84) hide show
  1. package/browser/asset-integrity.json +5 -5
  2. package/browser/live-cards.schema.json +775 -150
  3. package/browser/server-runtime-controlface.js +4 -4
  4. package/examples/board/cards/card-rebalance-sim.json +7 -5
  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 +2 -2
  15. package/lib/board-live-cards-node.js +1 -1
  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.js +1 -1
  26. package/lib/card-store-public.cjs +1 -1
  27. package/lib/card-store-public.js +1 -1
  28. package/lib/card-validation.cjs +1 -1
  29. package/lib/card-validation.js +1 -1
  30. package/lib/{chunk-OR6B2H2Y.cjs → chunk-22S5GCQK.cjs} +3 -3
  31. package/lib/{chunk-BA25VGJP.js → chunk-3C52UCJC.js} +3 -3
  32. package/lib/{chunk-36KKCQVE.cjs → chunk-3HCH2ZFB.cjs} +2 -2
  33. package/lib/chunk-66ZZIF2L.cjs +2 -0
  34. package/lib/{chunk-4NWVZ7AW.js → chunk-72FB4M6P.js} +2 -2
  35. package/lib/chunk-AW6XLBHX.cjs +2 -0
  36. package/lib/chunk-BSZYTSFX.js +2 -0
  37. package/lib/{chunk-BRYV6CDD.js → chunk-C7OY3PYL.js} +3 -3
  38. package/lib/{chunk-EGZPROOH.cjs → chunk-C7RR2JCL.cjs} +3 -3
  39. package/lib/{chunk-JOQWJ3VR.cjs → chunk-CAID4CGO.cjs} +2 -2
  40. package/lib/chunk-CVTL2EFR.js +3 -0
  41. package/lib/{chunk-REZO2QJD.js → chunk-E7SDEZSI.js} +3 -3
  42. package/lib/{chunk-PIPXFUEA.js → chunk-F6KRSQ7V.js} +2 -2
  43. package/lib/chunk-G5UUXBIB.cjs +2 -0
  44. package/lib/{chunk-ROIYEFSE.js → chunk-K2VRX4TC.js} +2 -2
  45. package/lib/chunk-ONJG6QW6.js +2 -0
  46. package/lib/{chunk-HOS2ZUFZ.cjs → chunk-P4WQJ7LA.cjs} +2 -2
  47. package/lib/chunk-P7STTKRO.cjs +3 -0
  48. package/lib/{chunk-6SPWFJRG.cjs → chunk-PYYRDOD5.cjs} +2 -2
  49. package/lib/chunk-QE3QXEHI.js +2 -0
  50. package/lib/{chunk-MRESV3MD.js → chunk-QJQ53PLM.js} +2 -2
  51. package/lib/{chunk-MRIFSG7L.cjs → chunk-TIQ775WI.cjs} +3 -3
  52. package/lib/cloud-storage.cjs +1 -1
  53. package/lib/cloud-storage.js +1 -1
  54. package/lib/continuous-event-graph/index.cjs +1 -1
  55. package/lib/continuous-event-graph/index.d.cts +2 -2
  56. package/lib/continuous-event-graph/index.d.ts +2 -2
  57. package/lib/continuous-event-graph/index.js +1 -1
  58. package/lib/firestore-storage/index.cjs +1 -1
  59. package/lib/firestore-storage/index.js +1 -1
  60. package/lib/index.cjs +2 -2
  61. package/lib/index.d.cts +1 -1
  62. package/lib/index.d.ts +1 -1
  63. package/lib/index.js +1 -1
  64. package/lib/{live-cards-bridge-Bwi-lbBT.d.cts → live-cards-bridge-D8kP3uog.d.cts} +2 -2
  65. package/lib/{live-cards-bridge-YL6AWawT.d.ts → live-cards-bridge-DMBSDgpk.d.ts} +2 -2
  66. package/lib/localstorage-storage/index.cjs +1 -1
  67. package/lib/localstorage-storage/index.js +1 -1
  68. package/lib/server-runtime/index.cjs +1 -1
  69. package/lib/server-runtime/index.js +1 -1
  70. package/lib/server-runtime-controlface/index.cjs +1 -1
  71. package/lib/server-runtime-controlface/index.js +1 -1
  72. package/lib/server-runtime-core/index.cjs +1 -1
  73. package/lib/server-runtime-core/index.js +1 -1
  74. package/package.json +2 -1
  75. package/schema/live-cards.schema.json +775 -150
  76. package/browser/live-cards.js +0 -108
  77. package/lib/chunk-3DWVFRQD.cjs +0 -3
  78. package/lib/chunk-3SLSRX6Q.js +0 -3
  79. package/lib/chunk-543ZEGP7.cjs +0 -2
  80. package/lib/chunk-ESTFYRHF.cjs +0 -2
  81. package/lib/chunk-NN52BT3Q.js +0 -2
  82. package/lib/chunk-UJQ7IML5.js +0 -2
  83. package/lib/chunk-YOY2JM5N.js +0 -2
  84. package/lib/chunk-ZV35WD6K.cjs +0 -2
@@ -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",
@@ -278,11 +250,8 @@
278
250
  "required": [
279
251
  "kind"
280
252
  ],
253
+ "additionalProperties": false,
281
254
  "properties": {
282
- "id": {
283
- "type": "string",
284
- "description": "Optional element ID for targeted updates"
285
- },
286
255
  "kind": {
287
256
  "enum": [
288
257
  "metric",
@@ -290,7 +259,6 @@
290
259
  "editable-table",
291
260
  "chart",
292
261
  "form",
293
- "filter",
294
262
  "list",
295
263
  "notes",
296
264
  "todo",
@@ -299,163 +267,456 @@
299
267
  "badge",
300
268
  "text",
301
269
  "markdown",
270
+ "markup",
271
+ "selection",
272
+ "searchbox",
273
+ "query",
302
274
  "ref",
303
275
  "custom",
304
276
  "actions"
305
277
  ]
306
278
  },
279
+ "id": {
280
+ "type": "string",
281
+ "description": "Optional element ID for targeted updates and action routing"
282
+ },
307
283
  "label": {
308
284
  "type": "string",
309
- "description": "Heading above this element"
285
+ "description": "Heading above this element (also the metric/alert title)"
310
286
  },
311
287
  "className": {
312
288
  "type": "string",
313
289
  "description": "Bootstrap grid class, e.g. 'col-12 col-md-6'"
314
290
  },
291
+ "containerStyle": {
292
+ "type": "object",
293
+ "description": "Inline style applied to the element container"
294
+ },
315
295
  "visible": {
316
296
  "type": "string",
317
297
  "description": "card_data/requires/fetched_sources/computed_values path — element shown only if truthy"
318
298
  },
319
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": {
320
311
  "type": "object",
321
- "properties": {
322
- "bind": {
323
- "$ref": "#/definitions/bind_ref",
324
- "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
+ }
325
322
  },
326
- "writeTo": {
327
- "$ref": "#/definitions/bind_ref",
328
- "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
329
333
  },
330
- "columns": {
331
- "type": "array",
332
- "items": {
333
- "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"
334
354
  },
335
- "description": "table: visible columns"
355
+ "writeTo": false
336
356
  },
337
- "maxRows": {
338
- "type": "integer",
339
- "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
+ }
340
368
  },
341
- "sortable": {
342
- "type": "boolean",
343
- "default": true,
344
- "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
345
379
  },
346
- "placeholder": {
347
- "type": "string",
348
- "description": "Empty-state message"
380
+ "required": [
381
+ "data"
382
+ ]
383
+ }
384
+ },
385
+ {
386
+ "if": {
387
+ "properties": {
388
+ "kind": {
389
+ "const": "chart"
390
+ }
349
391
  },
350
- "chartType": {
351
- "enum": [
352
- "bar",
353
- "line",
354
- "pie",
355
- "doughnut"
356
- ]
392
+ "required": [
393
+ "kind"
394
+ ]
395
+ },
396
+ "then": {
397
+ "properties": {
398
+ "spec": {
399
+ "$ref": "#/definitions/spec_chart"
400
+ },
401
+ "writeTo": false
357
402
  },
358
- "chartOptions": {
359
- "type": "object",
360
- "description": "Chart.js options passthrough"
361
- },
362
- "fields": {
363
- "type": "object",
364
- "description": "JSON Schema for form/filter fields"
365
- },
366
- "thresholds": {
367
- "type": "object",
368
- "properties": {
369
- "green": {
370
- "type": "string"
371
- },
372
- "amber": {
373
- "type": "string"
374
- }
403
+ "required": [
404
+ "data"
405
+ ]
406
+ }
407
+ },
408
+ {
409
+ "if": {
410
+ "properties": {
411
+ "kind": {
412
+ "const": "alert"
375
413
  }
376
414
  },
377
- "colorMap": {
378
- "type": "object",
379
- "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
380
425
  },
381
- "style": {
382
- "enum": [
383
- "heading",
384
- "muted",
385
- "default"
386
- ],
387
- "description": "text: display style"
426
+ "required": [
427
+ "data"
428
+ ]
429
+ }
430
+ },
431
+ {
432
+ "if": {
433
+ "properties": {
434
+ "kind": {
435
+ "const": "badge"
436
+ }
388
437
  },
389
- "upload": {
390
- "type": "boolean",
391
- "default": true,
392
- "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
393
448
  },
394
- "accept": {
395
- "type": "array",
396
- "items": {
397
- "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"
398
469
  },
399
- "description": "file-upload: allowed extensions"
470
+ "writeTo": false
400
471
  },
401
- "multiple": {
402
- "type": "boolean",
403
- "default": true,
404
- "description": "file-upload: allow multiple files"
472
+ "required": [
473
+ "data"
474
+ ]
475
+ }
476
+ },
477
+ {
478
+ "if": {
479
+ "properties": {
480
+ "kind": {
481
+ "const": "text"
482
+ }
405
483
  },
406
- "fileAttach": {
407
- "type": "boolean",
408
- "default": false,
409
- "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
410
494
  },
411
- "fileAccept": {
412
- "type": "array",
413
- "items": {
414
- "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"
415
515
  },
416
- "description": "chat: allowed attachment extensions"
417
- },
418
- "buttons": {
419
- "type": "array",
420
- "description": "actions: button definitions",
421
- "items": {
422
- "type": "object",
423
- "required": [
424
- "id",
425
- "label"
426
- ],
427
- "properties": {
428
- "id": {
429
- "type": "string"
430
- },
431
- "label": {
432
- "type": "string"
433
- },
434
- "style": {
435
- "type": "string",
436
- "description": "Bootstrap button variant, e.g. 'success', 'outline-danger'"
437
- },
438
- "size": {
439
- "type": "string",
440
- "default": "sm"
441
- },
442
- "disabled": {
443
- "oneOf": [
444
- {
445
- "type": "boolean"
446
- },
447
- {
448
- "type": "string",
449
- "description": "card_data/requires/fetched_sources/computed_values path — truthy = disabled"
450
- }
451
- ]
452
- }
453
- }
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"
454
715
  }
455
716
  }
456
717
  }
457
718
  }
458
- }
719
+ ]
459
720
  },
460
721
  "view": {
461
722
  "type": "object",
@@ -471,6 +732,370 @@
471
732
  }
472
733
  }
473
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
+ }
474
1099
  }
475
1100
  },
476
1101
  "title": "LiveCard",