@bettercms-ai/mcp 0.18.0 → 0.20.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.
- package/SKILL.md +15 -5
- package/dist/index.js +2297 -49
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -315,6 +315,1970 @@ import { BetterCMS } from "@bettercms-ai/sdk";
|
|
|
315
315
|
// src/tools.ts
|
|
316
316
|
import { z } from "zod";
|
|
317
317
|
import { BetterCMSError } from "@bettercms-ai/sdk";
|
|
318
|
+
|
|
319
|
+
// ../types/src/layout-lucide-icons.ts
|
|
320
|
+
var LAYOUT_SECTION_ICONS = Object.freeze([
|
|
321
|
+
"LayoutPanelTop",
|
|
322
|
+
"PanelTop",
|
|
323
|
+
"PanelBottom",
|
|
324
|
+
"Menu",
|
|
325
|
+
"Navigation",
|
|
326
|
+
"Megaphone",
|
|
327
|
+
"GalleryHorizontal",
|
|
328
|
+
"Rows3",
|
|
329
|
+
"Grid2X2",
|
|
330
|
+
"FileText",
|
|
331
|
+
"Link",
|
|
332
|
+
"Contact",
|
|
333
|
+
"BadgeInfo",
|
|
334
|
+
"Sparkles",
|
|
335
|
+
"a-arrow-down",
|
|
336
|
+
"a-arrow-up",
|
|
337
|
+
"a-large-small",
|
|
338
|
+
"accessibility",
|
|
339
|
+
"activity",
|
|
340
|
+
"air-vent",
|
|
341
|
+
"airplay",
|
|
342
|
+
"alarm-clock-check",
|
|
343
|
+
"alarm-check",
|
|
344
|
+
"alarm-clock-minus",
|
|
345
|
+
"alarm-minus",
|
|
346
|
+
"alarm-clock-off",
|
|
347
|
+
"alarm-clock-plus",
|
|
348
|
+
"alarm-plus",
|
|
349
|
+
"alarm-clock",
|
|
350
|
+
"alarm-smoke",
|
|
351
|
+
"album",
|
|
352
|
+
"align-center-horizontal",
|
|
353
|
+
"align-center-vertical",
|
|
354
|
+
"align-end-horizontal",
|
|
355
|
+
"align-end-vertical",
|
|
356
|
+
"align-horizontal-distribute-center",
|
|
357
|
+
"align-horizontal-distribute-end",
|
|
358
|
+
"align-horizontal-distribute-start",
|
|
359
|
+
"align-horizontal-justify-center",
|
|
360
|
+
"align-horizontal-justify-end",
|
|
361
|
+
"align-horizontal-justify-start",
|
|
362
|
+
"align-horizontal-space-around",
|
|
363
|
+
"align-horizontal-space-between",
|
|
364
|
+
"align-start-horizontal",
|
|
365
|
+
"align-start-vertical",
|
|
366
|
+
"align-vertical-distribute-center",
|
|
367
|
+
"align-vertical-distribute-end",
|
|
368
|
+
"align-vertical-distribute-start",
|
|
369
|
+
"align-vertical-justify-center",
|
|
370
|
+
"align-vertical-justify-end",
|
|
371
|
+
"align-vertical-justify-start",
|
|
372
|
+
"align-vertical-space-around",
|
|
373
|
+
"align-vertical-space-between",
|
|
374
|
+
"ambulance",
|
|
375
|
+
"ampersand",
|
|
376
|
+
"ampersands",
|
|
377
|
+
"amphora",
|
|
378
|
+
"anchor",
|
|
379
|
+
"angry",
|
|
380
|
+
"annoyed",
|
|
381
|
+
"antenna",
|
|
382
|
+
"anvil",
|
|
383
|
+
"aperture",
|
|
384
|
+
"app-window-mac",
|
|
385
|
+
"app-window",
|
|
386
|
+
"apple",
|
|
387
|
+
"archive-restore",
|
|
388
|
+
"archive-x",
|
|
389
|
+
"archive",
|
|
390
|
+
"armchair",
|
|
391
|
+
"arrow-big-down-dash",
|
|
392
|
+
"arrow-big-down",
|
|
393
|
+
"arrow-big-left-dash",
|
|
394
|
+
"arrow-big-left",
|
|
395
|
+
"arrow-big-right-dash",
|
|
396
|
+
"arrow-big-right",
|
|
397
|
+
"arrow-big-up-dash",
|
|
398
|
+
"arrow-big-up",
|
|
399
|
+
"arrow-down-0-1",
|
|
400
|
+
"arrow-down-01",
|
|
401
|
+
"arrow-down-1-0",
|
|
402
|
+
"arrow-down-10",
|
|
403
|
+
"arrow-down-a-z",
|
|
404
|
+
"arrow-down-az",
|
|
405
|
+
"arrow-down-from-line",
|
|
406
|
+
"arrow-down-left",
|
|
407
|
+
"arrow-down-narrow-wide",
|
|
408
|
+
"arrow-down-right",
|
|
409
|
+
"arrow-down-to-dot",
|
|
410
|
+
"arrow-down-to-line",
|
|
411
|
+
"arrow-down-up",
|
|
412
|
+
"arrow-down-wide-narrow",
|
|
413
|
+
"sort-desc",
|
|
414
|
+
"arrow-down-z-a",
|
|
415
|
+
"arrow-down-za",
|
|
416
|
+
"arrow-down",
|
|
417
|
+
"arrow-left-from-line",
|
|
418
|
+
"arrow-left-right",
|
|
419
|
+
"arrow-left-to-line",
|
|
420
|
+
"arrow-left",
|
|
421
|
+
"arrow-right-from-line",
|
|
422
|
+
"arrow-right-left",
|
|
423
|
+
"arrow-right-to-line",
|
|
424
|
+
"arrow-right",
|
|
425
|
+
"arrow-up-0-1",
|
|
426
|
+
"arrow-up-01",
|
|
427
|
+
"arrow-up-1-0",
|
|
428
|
+
"arrow-up-10",
|
|
429
|
+
"arrow-up-a-z",
|
|
430
|
+
"arrow-up-az",
|
|
431
|
+
"arrow-up-down",
|
|
432
|
+
"arrow-up-from-dot",
|
|
433
|
+
"arrow-up-from-line",
|
|
434
|
+
"arrow-up-left",
|
|
435
|
+
"arrow-up-narrow-wide",
|
|
436
|
+
"sort-asc",
|
|
437
|
+
"arrow-up-right",
|
|
438
|
+
"arrow-up-to-line",
|
|
439
|
+
"arrow-up-wide-narrow",
|
|
440
|
+
"arrow-up-z-a",
|
|
441
|
+
"arrow-up-za",
|
|
442
|
+
"arrow-up",
|
|
443
|
+
"arrows-up-from-line",
|
|
444
|
+
"asterisk",
|
|
445
|
+
"at-sign",
|
|
446
|
+
"atom",
|
|
447
|
+
"audio-lines",
|
|
448
|
+
"audio-waveform",
|
|
449
|
+
"award",
|
|
450
|
+
"axe",
|
|
451
|
+
"axis-3d",
|
|
452
|
+
"axis-3-d",
|
|
453
|
+
"baby",
|
|
454
|
+
"backpack",
|
|
455
|
+
"badge-alert",
|
|
456
|
+
"badge-cent",
|
|
457
|
+
"badge-check",
|
|
458
|
+
"verified",
|
|
459
|
+
"badge-dollar-sign",
|
|
460
|
+
"badge-euro",
|
|
461
|
+
"badge-indian-rupee",
|
|
462
|
+
"badge-info",
|
|
463
|
+
"badge-japanese-yen",
|
|
464
|
+
"badge-minus",
|
|
465
|
+
"badge-percent",
|
|
466
|
+
"badge-plus",
|
|
467
|
+
"badge-pound-sterling",
|
|
468
|
+
"badge-question-mark",
|
|
469
|
+
"badge-help",
|
|
470
|
+
"badge-russian-ruble",
|
|
471
|
+
"badge-swiss-franc",
|
|
472
|
+
"badge-turkish-lira",
|
|
473
|
+
"badge-x",
|
|
474
|
+
"badge",
|
|
475
|
+
"baggage-claim",
|
|
476
|
+
"balloon",
|
|
477
|
+
"ban",
|
|
478
|
+
"banana",
|
|
479
|
+
"bandage",
|
|
480
|
+
"banknote-arrow-down",
|
|
481
|
+
"banknote-arrow-up",
|
|
482
|
+
"banknote-x",
|
|
483
|
+
"banknote",
|
|
484
|
+
"barcode",
|
|
485
|
+
"barrel",
|
|
486
|
+
"baseline",
|
|
487
|
+
"bath",
|
|
488
|
+
"battery-charging",
|
|
489
|
+
"battery-full",
|
|
490
|
+
"battery-low",
|
|
491
|
+
"battery-medium",
|
|
492
|
+
"battery-plus",
|
|
493
|
+
"battery-warning",
|
|
494
|
+
"battery",
|
|
495
|
+
"beaker",
|
|
496
|
+
"bean-off",
|
|
497
|
+
"bean",
|
|
498
|
+
"bed-double",
|
|
499
|
+
"bed-single",
|
|
500
|
+
"bed",
|
|
501
|
+
"beef-off",
|
|
502
|
+
"beef",
|
|
503
|
+
"beer-off",
|
|
504
|
+
"beer",
|
|
505
|
+
"bell-dot",
|
|
506
|
+
"bell-electric",
|
|
507
|
+
"bell-minus",
|
|
508
|
+
"bell-off",
|
|
509
|
+
"bell-plus",
|
|
510
|
+
"bell-ring",
|
|
511
|
+
"bell",
|
|
512
|
+
"between-horizontal-end",
|
|
513
|
+
"between-horizonal-end",
|
|
514
|
+
"between-horizontal-start",
|
|
515
|
+
"between-horizonal-start",
|
|
516
|
+
"between-vertical-end",
|
|
517
|
+
"between-vertical-start",
|
|
518
|
+
"biceps-flexed",
|
|
519
|
+
"bike",
|
|
520
|
+
"binary",
|
|
521
|
+
"binoculars",
|
|
522
|
+
"biohazard",
|
|
523
|
+
"bird",
|
|
524
|
+
"birdhouse",
|
|
525
|
+
"bitcoin",
|
|
526
|
+
"blend",
|
|
527
|
+
"blinds",
|
|
528
|
+
"blocks",
|
|
529
|
+
"bluetooth-connected",
|
|
530
|
+
"bluetooth-off",
|
|
531
|
+
"bluetooth-searching",
|
|
532
|
+
"bluetooth",
|
|
533
|
+
"bold",
|
|
534
|
+
"bolt",
|
|
535
|
+
"bomb",
|
|
536
|
+
"bone",
|
|
537
|
+
"book-a",
|
|
538
|
+
"book-alert",
|
|
539
|
+
"book-audio",
|
|
540
|
+
"book-check",
|
|
541
|
+
"book-copy",
|
|
542
|
+
"book-dashed",
|
|
543
|
+
"book-template",
|
|
544
|
+
"book-down",
|
|
545
|
+
"book-headphones",
|
|
546
|
+
"book-heart",
|
|
547
|
+
"book-image",
|
|
548
|
+
"book-key",
|
|
549
|
+
"book-lock",
|
|
550
|
+
"book-marked",
|
|
551
|
+
"book-minus",
|
|
552
|
+
"book-open-check",
|
|
553
|
+
"book-open-text",
|
|
554
|
+
"book-open",
|
|
555
|
+
"book-plus",
|
|
556
|
+
"book-search",
|
|
557
|
+
"book-text",
|
|
558
|
+
"book-type",
|
|
559
|
+
"book-up-2",
|
|
560
|
+
"book-up",
|
|
561
|
+
"book-user",
|
|
562
|
+
"book-x",
|
|
563
|
+
"book",
|
|
564
|
+
"bookmark-check",
|
|
565
|
+
"bookmark-minus",
|
|
566
|
+
"bookmark-off",
|
|
567
|
+
"bookmark-plus",
|
|
568
|
+
"bookmark-x",
|
|
569
|
+
"bookmark",
|
|
570
|
+
"boom-box",
|
|
571
|
+
"bot-message-square",
|
|
572
|
+
"bot-off",
|
|
573
|
+
"bot",
|
|
574
|
+
"bottle-wine",
|
|
575
|
+
"bow-arrow",
|
|
576
|
+
"box",
|
|
577
|
+
"boxes",
|
|
578
|
+
"braces",
|
|
579
|
+
"curly-braces",
|
|
580
|
+
"brackets",
|
|
581
|
+
"brain-circuit",
|
|
582
|
+
"brain-cog",
|
|
583
|
+
"brain",
|
|
584
|
+
"brick-wall-fire",
|
|
585
|
+
"brick-wall-shield",
|
|
586
|
+
"brick-wall",
|
|
587
|
+
"briefcase-business",
|
|
588
|
+
"briefcase-conveyor-belt",
|
|
589
|
+
"briefcase-medical",
|
|
590
|
+
"briefcase",
|
|
591
|
+
"bring-to-front",
|
|
592
|
+
"brush-cleaning",
|
|
593
|
+
"brush",
|
|
594
|
+
"bubbles",
|
|
595
|
+
"bug-off",
|
|
596
|
+
"bug-play",
|
|
597
|
+
"bug",
|
|
598
|
+
"building-2",
|
|
599
|
+
"building",
|
|
600
|
+
"bus-front",
|
|
601
|
+
"bus",
|
|
602
|
+
"cable-car",
|
|
603
|
+
"cable",
|
|
604
|
+
"cake-slice",
|
|
605
|
+
"cake",
|
|
606
|
+
"calculator",
|
|
607
|
+
"calendar-1",
|
|
608
|
+
"calendar-arrow-down",
|
|
609
|
+
"calendar-arrow-up",
|
|
610
|
+
"calendar-check-2",
|
|
611
|
+
"calendar-check",
|
|
612
|
+
"calendar-clock",
|
|
613
|
+
"calendar-cog",
|
|
614
|
+
"calendar-days",
|
|
615
|
+
"calendar-fold",
|
|
616
|
+
"calendar-heart",
|
|
617
|
+
"calendar-minus-2",
|
|
618
|
+
"calendar-minus",
|
|
619
|
+
"calendar-off",
|
|
620
|
+
"calendar-plus-2",
|
|
621
|
+
"calendar-plus",
|
|
622
|
+
"calendar-range",
|
|
623
|
+
"calendar-search",
|
|
624
|
+
"calendar-sync",
|
|
625
|
+
"calendar-x-2",
|
|
626
|
+
"calendar-x",
|
|
627
|
+
"calendar",
|
|
628
|
+
"calendars",
|
|
629
|
+
"camera-off",
|
|
630
|
+
"camera",
|
|
631
|
+
"candy-cane",
|
|
632
|
+
"candy-off",
|
|
633
|
+
"candy",
|
|
634
|
+
"cannabis-off",
|
|
635
|
+
"cannabis",
|
|
636
|
+
"captions-off",
|
|
637
|
+
"captions",
|
|
638
|
+
"subtitles",
|
|
639
|
+
"car-front",
|
|
640
|
+
"car-taxi-front",
|
|
641
|
+
"car",
|
|
642
|
+
"caravan",
|
|
643
|
+
"card-sim",
|
|
644
|
+
"carrot",
|
|
645
|
+
"case-lower",
|
|
646
|
+
"case-sensitive",
|
|
647
|
+
"case-upper",
|
|
648
|
+
"cassette-tape",
|
|
649
|
+
"cast",
|
|
650
|
+
"castle",
|
|
651
|
+
"cat",
|
|
652
|
+
"cctv-off",
|
|
653
|
+
"cctv",
|
|
654
|
+
"chart-area",
|
|
655
|
+
"area-chart",
|
|
656
|
+
"chart-bar-big",
|
|
657
|
+
"bar-chart-horizontal-big",
|
|
658
|
+
"chart-bar-decreasing",
|
|
659
|
+
"chart-bar-increasing",
|
|
660
|
+
"chart-bar-stacked",
|
|
661
|
+
"chart-bar",
|
|
662
|
+
"bar-chart-horizontal",
|
|
663
|
+
"chart-candlestick",
|
|
664
|
+
"candlestick-chart",
|
|
665
|
+
"chart-column-big",
|
|
666
|
+
"bar-chart-big",
|
|
667
|
+
"chart-column-decreasing",
|
|
668
|
+
"chart-column-increasing",
|
|
669
|
+
"bar-chart-4",
|
|
670
|
+
"chart-column-stacked",
|
|
671
|
+
"chart-column",
|
|
672
|
+
"bar-chart-3",
|
|
673
|
+
"chart-gantt",
|
|
674
|
+
"chart-line",
|
|
675
|
+
"line-chart",
|
|
676
|
+
"chart-network",
|
|
677
|
+
"chart-no-axes-column-decreasing",
|
|
678
|
+
"chart-no-axes-column-increasing",
|
|
679
|
+
"bar-chart",
|
|
680
|
+
"chart-no-axes-column",
|
|
681
|
+
"bar-chart-2",
|
|
682
|
+
"chart-no-axes-combined",
|
|
683
|
+
"chart-no-axes-gantt",
|
|
684
|
+
"gantt-chart",
|
|
685
|
+
"chart-pie",
|
|
686
|
+
"pie-chart",
|
|
687
|
+
"chart-scatter",
|
|
688
|
+
"scatter-chart",
|
|
689
|
+
"chart-spline",
|
|
690
|
+
"check-check",
|
|
691
|
+
"check-line",
|
|
692
|
+
"check",
|
|
693
|
+
"chef-hat",
|
|
694
|
+
"cherry",
|
|
695
|
+
"chess-bishop",
|
|
696
|
+
"chess-king",
|
|
697
|
+
"chess-knight",
|
|
698
|
+
"chess-pawn",
|
|
699
|
+
"chess-queen",
|
|
700
|
+
"chess-rook",
|
|
701
|
+
"chevron-down",
|
|
702
|
+
"chevron-first",
|
|
703
|
+
"chevron-last",
|
|
704
|
+
"chevron-left",
|
|
705
|
+
"chevron-right",
|
|
706
|
+
"chevron-up",
|
|
707
|
+
"chevrons-down-up",
|
|
708
|
+
"chevrons-down",
|
|
709
|
+
"chevrons-left-right-ellipsis",
|
|
710
|
+
"chevrons-left-right",
|
|
711
|
+
"chevrons-left",
|
|
712
|
+
"chevrons-right-left",
|
|
713
|
+
"chevrons-right",
|
|
714
|
+
"chevrons-up-down",
|
|
715
|
+
"chevrons-up",
|
|
716
|
+
"church",
|
|
717
|
+
"cigarette-off",
|
|
718
|
+
"cigarette",
|
|
719
|
+
"circle-alert",
|
|
720
|
+
"alert-circle",
|
|
721
|
+
"circle-arrow-down",
|
|
722
|
+
"arrow-down-circle",
|
|
723
|
+
"circle-arrow-left",
|
|
724
|
+
"arrow-left-circle",
|
|
725
|
+
"circle-arrow-out-down-left",
|
|
726
|
+
"arrow-down-left-from-circle",
|
|
727
|
+
"circle-arrow-out-down-right",
|
|
728
|
+
"arrow-down-right-from-circle",
|
|
729
|
+
"circle-arrow-out-up-left",
|
|
730
|
+
"arrow-up-left-from-circle",
|
|
731
|
+
"circle-arrow-out-up-right",
|
|
732
|
+
"arrow-up-right-from-circle",
|
|
733
|
+
"circle-arrow-right",
|
|
734
|
+
"arrow-right-circle",
|
|
735
|
+
"circle-arrow-up",
|
|
736
|
+
"arrow-up-circle",
|
|
737
|
+
"circle-check-big",
|
|
738
|
+
"check-circle",
|
|
739
|
+
"circle-check",
|
|
740
|
+
"check-circle-2",
|
|
741
|
+
"circle-chevron-down",
|
|
742
|
+
"chevron-down-circle",
|
|
743
|
+
"circle-chevron-left",
|
|
744
|
+
"chevron-left-circle",
|
|
745
|
+
"circle-chevron-right",
|
|
746
|
+
"chevron-right-circle",
|
|
747
|
+
"circle-chevron-up",
|
|
748
|
+
"chevron-up-circle",
|
|
749
|
+
"circle-dashed",
|
|
750
|
+
"circle-divide",
|
|
751
|
+
"divide-circle",
|
|
752
|
+
"circle-dollar-sign",
|
|
753
|
+
"circle-dot-dashed",
|
|
754
|
+
"circle-dot",
|
|
755
|
+
"circle-ellipsis",
|
|
756
|
+
"circle-equal",
|
|
757
|
+
"circle-fading-arrow-up",
|
|
758
|
+
"circle-fading-plus",
|
|
759
|
+
"circle-gauge",
|
|
760
|
+
"gauge-circle",
|
|
761
|
+
"circle-minus",
|
|
762
|
+
"minus-circle",
|
|
763
|
+
"circle-off",
|
|
764
|
+
"circle-parking-off",
|
|
765
|
+
"parking-circle-off",
|
|
766
|
+
"circle-parking",
|
|
767
|
+
"parking-circle",
|
|
768
|
+
"circle-pause",
|
|
769
|
+
"pause-circle",
|
|
770
|
+
"circle-percent",
|
|
771
|
+
"percent-circle",
|
|
772
|
+
"circle-pile",
|
|
773
|
+
"circle-play",
|
|
774
|
+
"play-circle",
|
|
775
|
+
"circle-plus",
|
|
776
|
+
"plus-circle",
|
|
777
|
+
"circle-pound-sterling",
|
|
778
|
+
"circle-power",
|
|
779
|
+
"power-circle",
|
|
780
|
+
"circle-question-mark",
|
|
781
|
+
"help-circle",
|
|
782
|
+
"circle-help",
|
|
783
|
+
"circle-slash-2",
|
|
784
|
+
"circle-slashed",
|
|
785
|
+
"circle-slash",
|
|
786
|
+
"circle-small",
|
|
787
|
+
"circle-star",
|
|
788
|
+
"circle-stop",
|
|
789
|
+
"stop-circle",
|
|
790
|
+
"circle-user-round",
|
|
791
|
+
"user-circle-2",
|
|
792
|
+
"circle-user",
|
|
793
|
+
"user-circle",
|
|
794
|
+
"circle-x",
|
|
795
|
+
"x-circle",
|
|
796
|
+
"circle",
|
|
797
|
+
"circuit-board",
|
|
798
|
+
"citrus",
|
|
799
|
+
"clapperboard",
|
|
800
|
+
"clipboard-check",
|
|
801
|
+
"clipboard-clock",
|
|
802
|
+
"clipboard-copy",
|
|
803
|
+
"clipboard-list",
|
|
804
|
+
"clipboard-minus",
|
|
805
|
+
"clipboard-paste",
|
|
806
|
+
"clipboard-pen-line",
|
|
807
|
+
"clipboard-signature",
|
|
808
|
+
"clipboard-pen",
|
|
809
|
+
"clipboard-edit",
|
|
810
|
+
"clipboard-plus",
|
|
811
|
+
"clipboard-type",
|
|
812
|
+
"clipboard-x",
|
|
813
|
+
"clipboard",
|
|
814
|
+
"clock-1",
|
|
815
|
+
"clock-10",
|
|
816
|
+
"clock-11",
|
|
817
|
+
"clock-12",
|
|
818
|
+
"clock-2",
|
|
819
|
+
"clock-3",
|
|
820
|
+
"clock-4",
|
|
821
|
+
"clock-5",
|
|
822
|
+
"clock-6",
|
|
823
|
+
"clock-7",
|
|
824
|
+
"clock-8",
|
|
825
|
+
"clock-9",
|
|
826
|
+
"clock-alert",
|
|
827
|
+
"clock-arrow-down",
|
|
828
|
+
"clock-arrow-up",
|
|
829
|
+
"clock-check",
|
|
830
|
+
"clock-fading",
|
|
831
|
+
"clock-plus",
|
|
832
|
+
"clock",
|
|
833
|
+
"closed-caption",
|
|
834
|
+
"cloud-alert",
|
|
835
|
+
"cloud-backup",
|
|
836
|
+
"cloud-check",
|
|
837
|
+
"cloud-cog",
|
|
838
|
+
"cloud-download",
|
|
839
|
+
"download-cloud",
|
|
840
|
+
"cloud-drizzle",
|
|
841
|
+
"cloud-fog",
|
|
842
|
+
"cloud-hail",
|
|
843
|
+
"cloud-lightning",
|
|
844
|
+
"cloud-moon-rain",
|
|
845
|
+
"cloud-moon",
|
|
846
|
+
"cloud-off",
|
|
847
|
+
"cloud-rain-wind",
|
|
848
|
+
"cloud-rain",
|
|
849
|
+
"cloud-snow",
|
|
850
|
+
"cloud-sun-rain",
|
|
851
|
+
"cloud-sun",
|
|
852
|
+
"cloud-sync",
|
|
853
|
+
"cloud-upload",
|
|
854
|
+
"upload-cloud",
|
|
855
|
+
"cloud",
|
|
856
|
+
"cloudy",
|
|
857
|
+
"clover",
|
|
858
|
+
"club",
|
|
859
|
+
"code-xml",
|
|
860
|
+
"code-2",
|
|
861
|
+
"code",
|
|
862
|
+
"coffee",
|
|
863
|
+
"cog",
|
|
864
|
+
"coins",
|
|
865
|
+
"columns-2",
|
|
866
|
+
"columns",
|
|
867
|
+
"columns-3-cog",
|
|
868
|
+
"columns-settings",
|
|
869
|
+
"table-config",
|
|
870
|
+
"columns-3",
|
|
871
|
+
"panels-left-right",
|
|
872
|
+
"columns-4",
|
|
873
|
+
"combine",
|
|
874
|
+
"command",
|
|
875
|
+
"compass",
|
|
876
|
+
"component",
|
|
877
|
+
"computer",
|
|
878
|
+
"concierge-bell",
|
|
879
|
+
"cone",
|
|
880
|
+
"construction",
|
|
881
|
+
"contact-round",
|
|
882
|
+
"contact-2",
|
|
883
|
+
"contact",
|
|
884
|
+
"container",
|
|
885
|
+
"contrast",
|
|
886
|
+
"cookie",
|
|
887
|
+
"cooking-pot",
|
|
888
|
+
"copy-check",
|
|
889
|
+
"copy-minus",
|
|
890
|
+
"copy-plus",
|
|
891
|
+
"copy-slash",
|
|
892
|
+
"copy-x",
|
|
893
|
+
"copy",
|
|
894
|
+
"copyleft",
|
|
895
|
+
"copyright",
|
|
896
|
+
"corner-down-left",
|
|
897
|
+
"corner-down-right",
|
|
898
|
+
"corner-left-down",
|
|
899
|
+
"corner-left-up",
|
|
900
|
+
"corner-right-down",
|
|
901
|
+
"corner-right-up",
|
|
902
|
+
"corner-up-left",
|
|
903
|
+
"corner-up-right",
|
|
904
|
+
"cpu",
|
|
905
|
+
"creative-commons",
|
|
906
|
+
"credit-card",
|
|
907
|
+
"croissant",
|
|
908
|
+
"crop",
|
|
909
|
+
"cross",
|
|
910
|
+
"crosshair",
|
|
911
|
+
"crown",
|
|
912
|
+
"cuboid",
|
|
913
|
+
"cup-soda",
|
|
914
|
+
"currency",
|
|
915
|
+
"cylinder",
|
|
916
|
+
"dam",
|
|
917
|
+
"database-backup",
|
|
918
|
+
"database-search",
|
|
919
|
+
"database-zap",
|
|
920
|
+
"database",
|
|
921
|
+
"decimals-arrow-left",
|
|
922
|
+
"decimals-arrow-right",
|
|
923
|
+
"delete",
|
|
924
|
+
"dessert",
|
|
925
|
+
"diameter",
|
|
926
|
+
"diamond-minus",
|
|
927
|
+
"diamond-percent",
|
|
928
|
+
"percent-diamond",
|
|
929
|
+
"diamond-plus",
|
|
930
|
+
"diamond",
|
|
931
|
+
"dice-1",
|
|
932
|
+
"dice-2",
|
|
933
|
+
"dice-3",
|
|
934
|
+
"dice-4",
|
|
935
|
+
"dice-5",
|
|
936
|
+
"dice-6",
|
|
937
|
+
"dices",
|
|
938
|
+
"diff",
|
|
939
|
+
"disc-2",
|
|
940
|
+
"disc-3",
|
|
941
|
+
"disc-album",
|
|
942
|
+
"disc",
|
|
943
|
+
"divide",
|
|
944
|
+
"dna-off",
|
|
945
|
+
"dna",
|
|
946
|
+
"dock",
|
|
947
|
+
"dog",
|
|
948
|
+
"dollar-sign",
|
|
949
|
+
"donut",
|
|
950
|
+
"door-closed-locked",
|
|
951
|
+
"door-closed",
|
|
952
|
+
"door-open",
|
|
953
|
+
"dot",
|
|
954
|
+
"download",
|
|
955
|
+
"drafting-compass",
|
|
956
|
+
"drama",
|
|
957
|
+
"drill",
|
|
958
|
+
"drone",
|
|
959
|
+
"droplet-off",
|
|
960
|
+
"droplet",
|
|
961
|
+
"droplets",
|
|
962
|
+
"drum",
|
|
963
|
+
"drumstick",
|
|
964
|
+
"dumbbell",
|
|
965
|
+
"ear-off",
|
|
966
|
+
"ear",
|
|
967
|
+
"earth-lock",
|
|
968
|
+
"earth",
|
|
969
|
+
"globe-2",
|
|
970
|
+
"eclipse",
|
|
971
|
+
"egg-fried",
|
|
972
|
+
"egg-off",
|
|
973
|
+
"egg",
|
|
974
|
+
"ellipse",
|
|
975
|
+
"ellipsis-vertical",
|
|
976
|
+
"more-vertical",
|
|
977
|
+
"ellipsis",
|
|
978
|
+
"more-horizontal",
|
|
979
|
+
"equal-approximately",
|
|
980
|
+
"equal-not",
|
|
981
|
+
"equal",
|
|
982
|
+
"eraser",
|
|
983
|
+
"ethernet-port",
|
|
984
|
+
"euro",
|
|
985
|
+
"ev-charger",
|
|
986
|
+
"expand",
|
|
987
|
+
"external-link",
|
|
988
|
+
"eye-closed",
|
|
989
|
+
"eye-off",
|
|
990
|
+
"eye",
|
|
991
|
+
"factory",
|
|
992
|
+
"fan",
|
|
993
|
+
"fast-forward",
|
|
994
|
+
"feather",
|
|
995
|
+
"fence",
|
|
996
|
+
"ferris-wheel",
|
|
997
|
+
"file-archive",
|
|
998
|
+
"file-axis-3d",
|
|
999
|
+
"file-axis-3-d",
|
|
1000
|
+
"file-badge",
|
|
1001
|
+
"file-badge-2",
|
|
1002
|
+
"file-box",
|
|
1003
|
+
"file-braces-corner",
|
|
1004
|
+
"file-json-2",
|
|
1005
|
+
"file-braces",
|
|
1006
|
+
"file-json",
|
|
1007
|
+
"file-chart-column-increasing",
|
|
1008
|
+
"file-bar-chart",
|
|
1009
|
+
"file-chart-column",
|
|
1010
|
+
"file-bar-chart-2",
|
|
1011
|
+
"file-chart-line",
|
|
1012
|
+
"file-line-chart",
|
|
1013
|
+
"file-chart-pie",
|
|
1014
|
+
"file-pie-chart",
|
|
1015
|
+
"file-check-corner",
|
|
1016
|
+
"file-check-2",
|
|
1017
|
+
"file-check",
|
|
1018
|
+
"file-clock",
|
|
1019
|
+
"file-code-corner",
|
|
1020
|
+
"file-code-2",
|
|
1021
|
+
"file-code",
|
|
1022
|
+
"file-cog",
|
|
1023
|
+
"file-cog-2",
|
|
1024
|
+
"file-diff",
|
|
1025
|
+
"file-digit",
|
|
1026
|
+
"file-down",
|
|
1027
|
+
"file-exclamation-point",
|
|
1028
|
+
"file-warning",
|
|
1029
|
+
"file-headphone",
|
|
1030
|
+
"file-audio",
|
|
1031
|
+
"file-audio-2",
|
|
1032
|
+
"file-heart",
|
|
1033
|
+
"file-image",
|
|
1034
|
+
"file-input",
|
|
1035
|
+
"file-key",
|
|
1036
|
+
"file-key-2",
|
|
1037
|
+
"file-lock",
|
|
1038
|
+
"file-lock-2",
|
|
1039
|
+
"file-minus-corner",
|
|
1040
|
+
"file-minus-2",
|
|
1041
|
+
"file-minus",
|
|
1042
|
+
"file-music",
|
|
1043
|
+
"file-output",
|
|
1044
|
+
"file-pen-line",
|
|
1045
|
+
"file-signature",
|
|
1046
|
+
"file-pen",
|
|
1047
|
+
"file-edit",
|
|
1048
|
+
"file-play",
|
|
1049
|
+
"file-video",
|
|
1050
|
+
"file-plus-corner",
|
|
1051
|
+
"file-plus-2",
|
|
1052
|
+
"file-plus",
|
|
1053
|
+
"file-question-mark",
|
|
1054
|
+
"file-question",
|
|
1055
|
+
"file-scan",
|
|
1056
|
+
"file-search-corner",
|
|
1057
|
+
"file-search-2",
|
|
1058
|
+
"file-search",
|
|
1059
|
+
"file-signal",
|
|
1060
|
+
"file-volume-2",
|
|
1061
|
+
"file-sliders",
|
|
1062
|
+
"file-spreadsheet",
|
|
1063
|
+
"file-stack",
|
|
1064
|
+
"file-symlink",
|
|
1065
|
+
"file-terminal",
|
|
1066
|
+
"file-text",
|
|
1067
|
+
"file-type-corner",
|
|
1068
|
+
"file-type-2",
|
|
1069
|
+
"file-type",
|
|
1070
|
+
"file-up",
|
|
1071
|
+
"file-user",
|
|
1072
|
+
"file-video-camera",
|
|
1073
|
+
"file-video-2",
|
|
1074
|
+
"file-volume",
|
|
1075
|
+
"file-x-corner",
|
|
1076
|
+
"file-x-2",
|
|
1077
|
+
"file-x",
|
|
1078
|
+
"file",
|
|
1079
|
+
"files",
|
|
1080
|
+
"film",
|
|
1081
|
+
"fingerprint-pattern",
|
|
1082
|
+
"fingerprint",
|
|
1083
|
+
"fire-extinguisher",
|
|
1084
|
+
"fish-off",
|
|
1085
|
+
"fish-symbol",
|
|
1086
|
+
"fish",
|
|
1087
|
+
"fishing-hook",
|
|
1088
|
+
"fishing-rod",
|
|
1089
|
+
"flag-off",
|
|
1090
|
+
"flag-triangle-left",
|
|
1091
|
+
"flag-triangle-right",
|
|
1092
|
+
"flag",
|
|
1093
|
+
"flame-kindling",
|
|
1094
|
+
"flame",
|
|
1095
|
+
"flashlight-off",
|
|
1096
|
+
"flashlight",
|
|
1097
|
+
"flask-conical-off",
|
|
1098
|
+
"flask-conical",
|
|
1099
|
+
"flask-round",
|
|
1100
|
+
"flip-horizontal-2",
|
|
1101
|
+
"flip-vertical-2",
|
|
1102
|
+
"flower-2",
|
|
1103
|
+
"flower",
|
|
1104
|
+
"focus",
|
|
1105
|
+
"fold-horizontal",
|
|
1106
|
+
"fold-vertical",
|
|
1107
|
+
"folder-archive",
|
|
1108
|
+
"folder-check",
|
|
1109
|
+
"folder-clock",
|
|
1110
|
+
"folder-closed",
|
|
1111
|
+
"folder-code",
|
|
1112
|
+
"folder-cog",
|
|
1113
|
+
"folder-cog-2",
|
|
1114
|
+
"folder-dot",
|
|
1115
|
+
"folder-down",
|
|
1116
|
+
"folder-git-2",
|
|
1117
|
+
"folder-git",
|
|
1118
|
+
"folder-heart",
|
|
1119
|
+
"folder-input",
|
|
1120
|
+
"folder-kanban",
|
|
1121
|
+
"folder-key",
|
|
1122
|
+
"folder-lock",
|
|
1123
|
+
"folder-minus",
|
|
1124
|
+
"folder-open-dot",
|
|
1125
|
+
"folder-open",
|
|
1126
|
+
"folder-output",
|
|
1127
|
+
"folder-pen",
|
|
1128
|
+
"folder-edit",
|
|
1129
|
+
"folder-plus",
|
|
1130
|
+
"folder-root",
|
|
1131
|
+
"folder-search-2",
|
|
1132
|
+
"folder-search",
|
|
1133
|
+
"folder-symlink",
|
|
1134
|
+
"folder-sync",
|
|
1135
|
+
"folder-tree",
|
|
1136
|
+
"folder-up",
|
|
1137
|
+
"folder-x",
|
|
1138
|
+
"folder",
|
|
1139
|
+
"folders",
|
|
1140
|
+
"footprints",
|
|
1141
|
+
"forklift",
|
|
1142
|
+
"form",
|
|
1143
|
+
"forward",
|
|
1144
|
+
"frame",
|
|
1145
|
+
"frown",
|
|
1146
|
+
"fuel",
|
|
1147
|
+
"fullscreen",
|
|
1148
|
+
"funnel-plus",
|
|
1149
|
+
"funnel-x",
|
|
1150
|
+
"filter-x",
|
|
1151
|
+
"funnel",
|
|
1152
|
+
"filter",
|
|
1153
|
+
"gallery-horizontal-end",
|
|
1154
|
+
"gallery-horizontal",
|
|
1155
|
+
"gallery-thumbnails",
|
|
1156
|
+
"gallery-vertical-end",
|
|
1157
|
+
"gallery-vertical",
|
|
1158
|
+
"gamepad-2",
|
|
1159
|
+
"gamepad-directional",
|
|
1160
|
+
"gamepad",
|
|
1161
|
+
"gauge",
|
|
1162
|
+
"gavel",
|
|
1163
|
+
"gem",
|
|
1164
|
+
"georgian-lari",
|
|
1165
|
+
"ghost",
|
|
1166
|
+
"gift",
|
|
1167
|
+
"git-branch-minus",
|
|
1168
|
+
"git-branch-plus",
|
|
1169
|
+
"git-branch",
|
|
1170
|
+
"git-commit-horizontal",
|
|
1171
|
+
"git-commit",
|
|
1172
|
+
"git-commit-vertical",
|
|
1173
|
+
"git-compare-arrows",
|
|
1174
|
+
"git-compare",
|
|
1175
|
+
"git-fork",
|
|
1176
|
+
"git-graph",
|
|
1177
|
+
"git-merge-conflict",
|
|
1178
|
+
"git-merge",
|
|
1179
|
+
"git-pull-request-arrow",
|
|
1180
|
+
"git-pull-request-closed",
|
|
1181
|
+
"git-pull-request-create-arrow",
|
|
1182
|
+
"git-pull-request-create",
|
|
1183
|
+
"git-pull-request-draft",
|
|
1184
|
+
"git-pull-request",
|
|
1185
|
+
"glass-water",
|
|
1186
|
+
"glasses",
|
|
1187
|
+
"globe-lock",
|
|
1188
|
+
"globe-off",
|
|
1189
|
+
"globe-x",
|
|
1190
|
+
"globe",
|
|
1191
|
+
"goal",
|
|
1192
|
+
"gpu",
|
|
1193
|
+
"graduation-cap",
|
|
1194
|
+
"grape",
|
|
1195
|
+
"grid-2x2-check",
|
|
1196
|
+
"grid-2-x-2-check",
|
|
1197
|
+
"grid-2x2-plus",
|
|
1198
|
+
"grid-2-x-2-plus",
|
|
1199
|
+
"grid-2x2-x",
|
|
1200
|
+
"grid-2-x-2-x",
|
|
1201
|
+
"grid-2x2",
|
|
1202
|
+
"grid-2-x-2",
|
|
1203
|
+
"grid-3x2",
|
|
1204
|
+
"grid-3x3",
|
|
1205
|
+
"grid",
|
|
1206
|
+
"grid-3-x-3",
|
|
1207
|
+
"grip-horizontal",
|
|
1208
|
+
"grip-vertical",
|
|
1209
|
+
"grip",
|
|
1210
|
+
"group",
|
|
1211
|
+
"guitar",
|
|
1212
|
+
"ham",
|
|
1213
|
+
"hamburger",
|
|
1214
|
+
"hammer",
|
|
1215
|
+
"hand-coins",
|
|
1216
|
+
"hand-fist",
|
|
1217
|
+
"hand-grab",
|
|
1218
|
+
"grab",
|
|
1219
|
+
"hand-heart",
|
|
1220
|
+
"hand-helping",
|
|
1221
|
+
"helping-hand",
|
|
1222
|
+
"hand-metal",
|
|
1223
|
+
"hand-platter",
|
|
1224
|
+
"hand",
|
|
1225
|
+
"handbag",
|
|
1226
|
+
"handshake",
|
|
1227
|
+
"hard-drive-download",
|
|
1228
|
+
"hard-drive-upload",
|
|
1229
|
+
"hard-drive",
|
|
1230
|
+
"hard-hat",
|
|
1231
|
+
"hash",
|
|
1232
|
+
"hat-glasses",
|
|
1233
|
+
"haze",
|
|
1234
|
+
"hd",
|
|
1235
|
+
"hdmi-port",
|
|
1236
|
+
"heading-1",
|
|
1237
|
+
"heading-2",
|
|
1238
|
+
"heading-3",
|
|
1239
|
+
"heading-4",
|
|
1240
|
+
"heading-5",
|
|
1241
|
+
"heading-6",
|
|
1242
|
+
"heading",
|
|
1243
|
+
"headphone-off",
|
|
1244
|
+
"headphones",
|
|
1245
|
+
"headset",
|
|
1246
|
+
"heart-crack",
|
|
1247
|
+
"heart-handshake",
|
|
1248
|
+
"heart-minus",
|
|
1249
|
+
"heart-off",
|
|
1250
|
+
"heart-plus",
|
|
1251
|
+
"heart-pulse",
|
|
1252
|
+
"heart",
|
|
1253
|
+
"heater",
|
|
1254
|
+
"helicopter",
|
|
1255
|
+
"hexagon",
|
|
1256
|
+
"highlighter",
|
|
1257
|
+
"history",
|
|
1258
|
+
"hop-off",
|
|
1259
|
+
"hop",
|
|
1260
|
+
"hospital",
|
|
1261
|
+
"hotel",
|
|
1262
|
+
"hourglass",
|
|
1263
|
+
"house-heart",
|
|
1264
|
+
"house-plug",
|
|
1265
|
+
"house-plus",
|
|
1266
|
+
"house-wifi",
|
|
1267
|
+
"house",
|
|
1268
|
+
"home",
|
|
1269
|
+
"ice-cream-bowl",
|
|
1270
|
+
"ice-cream-2",
|
|
1271
|
+
"ice-cream-cone",
|
|
1272
|
+
"ice-cream",
|
|
1273
|
+
"id-card-lanyard",
|
|
1274
|
+
"id-card",
|
|
1275
|
+
"image-down",
|
|
1276
|
+
"image-minus",
|
|
1277
|
+
"image-off",
|
|
1278
|
+
"image-play",
|
|
1279
|
+
"image-plus",
|
|
1280
|
+
"image-up",
|
|
1281
|
+
"image-upscale",
|
|
1282
|
+
"image",
|
|
1283
|
+
"images",
|
|
1284
|
+
"import",
|
|
1285
|
+
"inbox",
|
|
1286
|
+
"indian-rupee",
|
|
1287
|
+
"infinity",
|
|
1288
|
+
"info",
|
|
1289
|
+
"inspection-panel",
|
|
1290
|
+
"italic",
|
|
1291
|
+
"iteration-ccw",
|
|
1292
|
+
"iteration-cw",
|
|
1293
|
+
"japanese-yen",
|
|
1294
|
+
"joystick",
|
|
1295
|
+
"kanban",
|
|
1296
|
+
"kayak",
|
|
1297
|
+
"key-round",
|
|
1298
|
+
"key-square",
|
|
1299
|
+
"key",
|
|
1300
|
+
"keyboard-music",
|
|
1301
|
+
"keyboard-off",
|
|
1302
|
+
"keyboard",
|
|
1303
|
+
"lamp-ceiling",
|
|
1304
|
+
"lamp-desk",
|
|
1305
|
+
"lamp-floor",
|
|
1306
|
+
"lamp-wall-down",
|
|
1307
|
+
"lamp-wall-up",
|
|
1308
|
+
"lamp",
|
|
1309
|
+
"land-plot",
|
|
1310
|
+
"landmark",
|
|
1311
|
+
"languages",
|
|
1312
|
+
"laptop-minimal-check",
|
|
1313
|
+
"laptop-minimal",
|
|
1314
|
+
"laptop-2",
|
|
1315
|
+
"laptop",
|
|
1316
|
+
"lasso-select",
|
|
1317
|
+
"lasso",
|
|
1318
|
+
"laugh",
|
|
1319
|
+
"layers-2",
|
|
1320
|
+
"layers-plus",
|
|
1321
|
+
"layers",
|
|
1322
|
+
"layers-3",
|
|
1323
|
+
"layout-dashboard",
|
|
1324
|
+
"layout-grid",
|
|
1325
|
+
"layout-list",
|
|
1326
|
+
"layout-panel-left",
|
|
1327
|
+
"layout-panel-top",
|
|
1328
|
+
"layout-template",
|
|
1329
|
+
"leaf",
|
|
1330
|
+
"leafy-green",
|
|
1331
|
+
"lectern",
|
|
1332
|
+
"lens-concave",
|
|
1333
|
+
"lens-convex",
|
|
1334
|
+
"library-big",
|
|
1335
|
+
"library",
|
|
1336
|
+
"life-buoy",
|
|
1337
|
+
"ligature",
|
|
1338
|
+
"lightbulb-off",
|
|
1339
|
+
"lightbulb",
|
|
1340
|
+
"line-dot-right-horizontal",
|
|
1341
|
+
"line-squiggle",
|
|
1342
|
+
"line-style",
|
|
1343
|
+
"link-2-off",
|
|
1344
|
+
"link-2",
|
|
1345
|
+
"link",
|
|
1346
|
+
"list-check",
|
|
1347
|
+
"list-checks",
|
|
1348
|
+
"list-chevrons-down-up",
|
|
1349
|
+
"list-chevrons-up-down",
|
|
1350
|
+
"list-collapse",
|
|
1351
|
+
"list-end",
|
|
1352
|
+
"list-filter-plus",
|
|
1353
|
+
"list-filter",
|
|
1354
|
+
"list-indent-decrease",
|
|
1355
|
+
"outdent",
|
|
1356
|
+
"indent-decrease",
|
|
1357
|
+
"list-indent-increase",
|
|
1358
|
+
"indent",
|
|
1359
|
+
"indent-increase",
|
|
1360
|
+
"list-minus",
|
|
1361
|
+
"list-music",
|
|
1362
|
+
"list-ordered",
|
|
1363
|
+
"list-plus",
|
|
1364
|
+
"list-restart",
|
|
1365
|
+
"list-start",
|
|
1366
|
+
"list-todo",
|
|
1367
|
+
"list-tree",
|
|
1368
|
+
"list-video",
|
|
1369
|
+
"list-x",
|
|
1370
|
+
"list",
|
|
1371
|
+
"loader-circle",
|
|
1372
|
+
"loader-2",
|
|
1373
|
+
"loader-pinwheel",
|
|
1374
|
+
"loader",
|
|
1375
|
+
"locate-fixed",
|
|
1376
|
+
"locate-off",
|
|
1377
|
+
"locate",
|
|
1378
|
+
"lock-keyhole-open",
|
|
1379
|
+
"unlock-keyhole",
|
|
1380
|
+
"lock-keyhole",
|
|
1381
|
+
"lock-open",
|
|
1382
|
+
"unlock",
|
|
1383
|
+
"lock",
|
|
1384
|
+
"log-in",
|
|
1385
|
+
"log-out",
|
|
1386
|
+
"logs",
|
|
1387
|
+
"lollipop",
|
|
1388
|
+
"luggage",
|
|
1389
|
+
"magnet",
|
|
1390
|
+
"mail-check",
|
|
1391
|
+
"mail-minus",
|
|
1392
|
+
"mail-open",
|
|
1393
|
+
"mail-plus",
|
|
1394
|
+
"mail-question-mark",
|
|
1395
|
+
"mail-question",
|
|
1396
|
+
"mail-search",
|
|
1397
|
+
"mail-warning",
|
|
1398
|
+
"mail-x",
|
|
1399
|
+
"mail",
|
|
1400
|
+
"mailbox",
|
|
1401
|
+
"mails",
|
|
1402
|
+
"map-minus",
|
|
1403
|
+
"map-pin-check-inside",
|
|
1404
|
+
"map-pin-check",
|
|
1405
|
+
"map-pin-house",
|
|
1406
|
+
"map-pin-minus-inside",
|
|
1407
|
+
"map-pin-minus",
|
|
1408
|
+
"map-pin-off",
|
|
1409
|
+
"map-pin-pen",
|
|
1410
|
+
"location-edit",
|
|
1411
|
+
"map-pin-plus-inside",
|
|
1412
|
+
"map-pin-plus",
|
|
1413
|
+
"map-pin-search",
|
|
1414
|
+
"map-pin-x-inside",
|
|
1415
|
+
"map-pin-x",
|
|
1416
|
+
"map-pin",
|
|
1417
|
+
"map-pinned",
|
|
1418
|
+
"map-plus",
|
|
1419
|
+
"map",
|
|
1420
|
+
"mars-stroke",
|
|
1421
|
+
"mars",
|
|
1422
|
+
"martini",
|
|
1423
|
+
"maximize-2",
|
|
1424
|
+
"maximize",
|
|
1425
|
+
"medal",
|
|
1426
|
+
"megaphone-off",
|
|
1427
|
+
"megaphone",
|
|
1428
|
+
"meh",
|
|
1429
|
+
"memory-stick",
|
|
1430
|
+
"menu",
|
|
1431
|
+
"merge",
|
|
1432
|
+
"message-circle-check",
|
|
1433
|
+
"message-circle-code",
|
|
1434
|
+
"message-circle-dashed",
|
|
1435
|
+
"message-circle-heart",
|
|
1436
|
+
"message-circle-more",
|
|
1437
|
+
"message-circle-off",
|
|
1438
|
+
"message-circle-plus",
|
|
1439
|
+
"message-circle-question-mark",
|
|
1440
|
+
"message-circle-question",
|
|
1441
|
+
"message-circle-reply",
|
|
1442
|
+
"message-circle-warning",
|
|
1443
|
+
"message-circle-x",
|
|
1444
|
+
"message-circle",
|
|
1445
|
+
"message-square-check",
|
|
1446
|
+
"message-square-code",
|
|
1447
|
+
"message-square-dashed",
|
|
1448
|
+
"message-square-diff",
|
|
1449
|
+
"message-square-dot",
|
|
1450
|
+
"message-square-heart",
|
|
1451
|
+
"message-square-lock",
|
|
1452
|
+
"message-square-more",
|
|
1453
|
+
"message-square-off",
|
|
1454
|
+
"message-square-plus",
|
|
1455
|
+
"message-square-quote",
|
|
1456
|
+
"message-square-reply",
|
|
1457
|
+
"message-square-share",
|
|
1458
|
+
"message-square-text",
|
|
1459
|
+
"message-square-warning",
|
|
1460
|
+
"message-square-x",
|
|
1461
|
+
"message-square",
|
|
1462
|
+
"messages-square",
|
|
1463
|
+
"metronome",
|
|
1464
|
+
"mic-off",
|
|
1465
|
+
"mic-vocal",
|
|
1466
|
+
"mic-2",
|
|
1467
|
+
"mic",
|
|
1468
|
+
"microchip",
|
|
1469
|
+
"microscope",
|
|
1470
|
+
"microwave",
|
|
1471
|
+
"milestone",
|
|
1472
|
+
"milk-off",
|
|
1473
|
+
"milk",
|
|
1474
|
+
"minimize-2",
|
|
1475
|
+
"minimize",
|
|
1476
|
+
"minus",
|
|
1477
|
+
"mirror-rectangular",
|
|
1478
|
+
"mirror-round",
|
|
1479
|
+
"monitor-check",
|
|
1480
|
+
"monitor-cloud",
|
|
1481
|
+
"monitor-cog",
|
|
1482
|
+
"monitor-dot",
|
|
1483
|
+
"monitor-down",
|
|
1484
|
+
"monitor-off",
|
|
1485
|
+
"monitor-pause",
|
|
1486
|
+
"monitor-play",
|
|
1487
|
+
"monitor-smartphone",
|
|
1488
|
+
"monitor-speaker",
|
|
1489
|
+
"monitor-stop",
|
|
1490
|
+
"monitor-up",
|
|
1491
|
+
"monitor-x",
|
|
1492
|
+
"monitor",
|
|
1493
|
+
"moon-star",
|
|
1494
|
+
"moon",
|
|
1495
|
+
"motorbike",
|
|
1496
|
+
"mountain-snow",
|
|
1497
|
+
"mountain",
|
|
1498
|
+
"mouse-left",
|
|
1499
|
+
"mouse-off",
|
|
1500
|
+
"mouse-pointer-2-off",
|
|
1501
|
+
"mouse-pointer-2",
|
|
1502
|
+
"mouse-pointer-ban",
|
|
1503
|
+
"mouse-pointer-click",
|
|
1504
|
+
"mouse-pointer",
|
|
1505
|
+
"mouse-right",
|
|
1506
|
+
"mouse",
|
|
1507
|
+
"move-3d",
|
|
1508
|
+
"move-3-d",
|
|
1509
|
+
"move-diagonal-2",
|
|
1510
|
+
"move-diagonal",
|
|
1511
|
+
"move-down-left",
|
|
1512
|
+
"move-down-right",
|
|
1513
|
+
"move-down",
|
|
1514
|
+
"move-horizontal",
|
|
1515
|
+
"move-left",
|
|
1516
|
+
"move-right",
|
|
1517
|
+
"move-up-left",
|
|
1518
|
+
"move-up-right",
|
|
1519
|
+
"move-up",
|
|
1520
|
+
"move-vertical",
|
|
1521
|
+
"move",
|
|
1522
|
+
"music-2",
|
|
1523
|
+
"music-3",
|
|
1524
|
+
"music-4",
|
|
1525
|
+
"music",
|
|
1526
|
+
"navigation-2-off",
|
|
1527
|
+
"navigation-2",
|
|
1528
|
+
"navigation-off",
|
|
1529
|
+
"navigation",
|
|
1530
|
+
"network",
|
|
1531
|
+
"newspaper",
|
|
1532
|
+
"nfc",
|
|
1533
|
+
"non-binary",
|
|
1534
|
+
"notebook-pen",
|
|
1535
|
+
"notebook-tabs",
|
|
1536
|
+
"notebook-text",
|
|
1537
|
+
"notebook",
|
|
1538
|
+
"notepad-text-dashed",
|
|
1539
|
+
"notepad-text",
|
|
1540
|
+
"nut-off",
|
|
1541
|
+
"nut",
|
|
1542
|
+
"octagon-alert",
|
|
1543
|
+
"alert-octagon",
|
|
1544
|
+
"octagon-minus",
|
|
1545
|
+
"octagon-pause",
|
|
1546
|
+
"pause-octagon",
|
|
1547
|
+
"octagon-x",
|
|
1548
|
+
"x-octagon",
|
|
1549
|
+
"octagon",
|
|
1550
|
+
"omega",
|
|
1551
|
+
"option",
|
|
1552
|
+
"orbit",
|
|
1553
|
+
"origami",
|
|
1554
|
+
"package-2",
|
|
1555
|
+
"package-check",
|
|
1556
|
+
"package-minus",
|
|
1557
|
+
"package-open",
|
|
1558
|
+
"package-plus",
|
|
1559
|
+
"package-search",
|
|
1560
|
+
"package-x",
|
|
1561
|
+
"package",
|
|
1562
|
+
"paint-bucket",
|
|
1563
|
+
"paint-roller",
|
|
1564
|
+
"paintbrush-vertical",
|
|
1565
|
+
"paintbrush-2",
|
|
1566
|
+
"paintbrush",
|
|
1567
|
+
"palette",
|
|
1568
|
+
"panda",
|
|
1569
|
+
"panel-bottom-close",
|
|
1570
|
+
"panel-bottom-dashed",
|
|
1571
|
+
"panel-bottom-inactive",
|
|
1572
|
+
"panel-bottom-open",
|
|
1573
|
+
"panel-bottom",
|
|
1574
|
+
"panel-left-close",
|
|
1575
|
+
"sidebar-close",
|
|
1576
|
+
"panel-left-dashed",
|
|
1577
|
+
"panel-left-inactive",
|
|
1578
|
+
"panel-left-open",
|
|
1579
|
+
"sidebar-open",
|
|
1580
|
+
"panel-left-right-dashed",
|
|
1581
|
+
"panel-left",
|
|
1582
|
+
"sidebar",
|
|
1583
|
+
"panel-right-close",
|
|
1584
|
+
"panel-right-dashed",
|
|
1585
|
+
"panel-right-inactive",
|
|
1586
|
+
"panel-right-open",
|
|
1587
|
+
"panel-right",
|
|
1588
|
+
"panel-top-bottom-dashed",
|
|
1589
|
+
"panel-top-close",
|
|
1590
|
+
"panel-top-dashed",
|
|
1591
|
+
"panel-top-inactive",
|
|
1592
|
+
"panel-top-open",
|
|
1593
|
+
"panel-top",
|
|
1594
|
+
"panels-left-bottom",
|
|
1595
|
+
"panels-right-bottom",
|
|
1596
|
+
"panels-top-left",
|
|
1597
|
+
"layout",
|
|
1598
|
+
"paperclip",
|
|
1599
|
+
"parentheses",
|
|
1600
|
+
"parking-meter",
|
|
1601
|
+
"party-popper",
|
|
1602
|
+
"pause",
|
|
1603
|
+
"paw-print",
|
|
1604
|
+
"pc-case",
|
|
1605
|
+
"pen-line",
|
|
1606
|
+
"edit-3",
|
|
1607
|
+
"pen-off",
|
|
1608
|
+
"pen-tool",
|
|
1609
|
+
"pen",
|
|
1610
|
+
"edit-2",
|
|
1611
|
+
"pencil-line",
|
|
1612
|
+
"pencil-off",
|
|
1613
|
+
"pencil-ruler",
|
|
1614
|
+
"pencil",
|
|
1615
|
+
"pentagon",
|
|
1616
|
+
"percent",
|
|
1617
|
+
"person-standing",
|
|
1618
|
+
"philippine-peso",
|
|
1619
|
+
"phone-call",
|
|
1620
|
+
"phone-forwarded",
|
|
1621
|
+
"phone-incoming",
|
|
1622
|
+
"phone-missed",
|
|
1623
|
+
"phone-off",
|
|
1624
|
+
"phone-outgoing",
|
|
1625
|
+
"phone",
|
|
1626
|
+
"pi",
|
|
1627
|
+
"piano",
|
|
1628
|
+
"pickaxe",
|
|
1629
|
+
"picture-in-picture-2",
|
|
1630
|
+
"picture-in-picture",
|
|
1631
|
+
"piggy-bank",
|
|
1632
|
+
"pilcrow-left",
|
|
1633
|
+
"pilcrow-right",
|
|
1634
|
+
"pilcrow",
|
|
1635
|
+
"pill-bottle",
|
|
1636
|
+
"pill",
|
|
1637
|
+
"pin-off",
|
|
1638
|
+
"pin",
|
|
1639
|
+
"pipette",
|
|
1640
|
+
"pizza",
|
|
1641
|
+
"plane-landing",
|
|
1642
|
+
"plane-takeoff",
|
|
1643
|
+
"plane",
|
|
1644
|
+
"play",
|
|
1645
|
+
"plug-2",
|
|
1646
|
+
"plug-zap",
|
|
1647
|
+
"plug-zap-2",
|
|
1648
|
+
"plug",
|
|
1649
|
+
"plus",
|
|
1650
|
+
"pocket-knife",
|
|
1651
|
+
"podcast",
|
|
1652
|
+
"pointer-off",
|
|
1653
|
+
"pointer",
|
|
1654
|
+
"popcorn",
|
|
1655
|
+
"popsicle",
|
|
1656
|
+
"pound-sterling",
|
|
1657
|
+
"power-off",
|
|
1658
|
+
"power",
|
|
1659
|
+
"presentation",
|
|
1660
|
+
"printer-check",
|
|
1661
|
+
"printer-x",
|
|
1662
|
+
"printer",
|
|
1663
|
+
"projector",
|
|
1664
|
+
"proportions",
|
|
1665
|
+
"puzzle",
|
|
1666
|
+
"pyramid",
|
|
1667
|
+
"qr-code",
|
|
1668
|
+
"quote",
|
|
1669
|
+
"rabbit",
|
|
1670
|
+
"radar",
|
|
1671
|
+
"radiation",
|
|
1672
|
+
"radical",
|
|
1673
|
+
"radio-off",
|
|
1674
|
+
"radio-receiver",
|
|
1675
|
+
"radio-tower",
|
|
1676
|
+
"radio",
|
|
1677
|
+
"radius",
|
|
1678
|
+
"rainbow",
|
|
1679
|
+
"rat",
|
|
1680
|
+
"ratio",
|
|
1681
|
+
"receipt-cent",
|
|
1682
|
+
"receipt-euro",
|
|
1683
|
+
"receipt-indian-rupee",
|
|
1684
|
+
"receipt-japanese-yen",
|
|
1685
|
+
"receipt-pound-sterling",
|
|
1686
|
+
"receipt-russian-ruble",
|
|
1687
|
+
"receipt-swiss-franc",
|
|
1688
|
+
"receipt-text",
|
|
1689
|
+
"receipt-turkish-lira",
|
|
1690
|
+
"receipt",
|
|
1691
|
+
"rectangle-circle",
|
|
1692
|
+
"rectangle-ellipsis",
|
|
1693
|
+
"form-input",
|
|
1694
|
+
"rectangle-goggles",
|
|
1695
|
+
"rectangle-horizontal",
|
|
1696
|
+
"rectangle-vertical",
|
|
1697
|
+
"recycle",
|
|
1698
|
+
"redo-2",
|
|
1699
|
+
"redo-dot",
|
|
1700
|
+
"redo",
|
|
1701
|
+
"refresh-ccw-dot",
|
|
1702
|
+
"refresh-ccw",
|
|
1703
|
+
"refresh-cw-off",
|
|
1704
|
+
"refresh-cw",
|
|
1705
|
+
"refrigerator",
|
|
1706
|
+
"regex",
|
|
1707
|
+
"remove-formatting",
|
|
1708
|
+
"repeat-1",
|
|
1709
|
+
"repeat-2",
|
|
1710
|
+
"repeat",
|
|
1711
|
+
"replace-all",
|
|
1712
|
+
"replace",
|
|
1713
|
+
"reply-all",
|
|
1714
|
+
"reply",
|
|
1715
|
+
"rewind",
|
|
1716
|
+
"ribbon",
|
|
1717
|
+
"road",
|
|
1718
|
+
"rocket",
|
|
1719
|
+
"rocking-chair",
|
|
1720
|
+
"roller-coaster",
|
|
1721
|
+
"rose",
|
|
1722
|
+
"rotate-3d",
|
|
1723
|
+
"rotate-3-d",
|
|
1724
|
+
"rotate-ccw-key",
|
|
1725
|
+
"rotate-ccw-square",
|
|
1726
|
+
"rotate-ccw",
|
|
1727
|
+
"rotate-cw-square",
|
|
1728
|
+
"rotate-cw",
|
|
1729
|
+
"route-off",
|
|
1730
|
+
"route",
|
|
1731
|
+
"router",
|
|
1732
|
+
"rows-2",
|
|
1733
|
+
"rows",
|
|
1734
|
+
"rows-3",
|
|
1735
|
+
"panels-top-bottom",
|
|
1736
|
+
"rows-4",
|
|
1737
|
+
"rss",
|
|
1738
|
+
"ruler-dimension-line",
|
|
1739
|
+
"ruler",
|
|
1740
|
+
"russian-ruble",
|
|
1741
|
+
"sailboat",
|
|
1742
|
+
"salad",
|
|
1743
|
+
"sandwich",
|
|
1744
|
+
"satellite-dish",
|
|
1745
|
+
"satellite",
|
|
1746
|
+
"saudi-riyal",
|
|
1747
|
+
"save-all",
|
|
1748
|
+
"save-off",
|
|
1749
|
+
"save",
|
|
1750
|
+
"scale-3d",
|
|
1751
|
+
"scale-3-d",
|
|
1752
|
+
"scale",
|
|
1753
|
+
"scaling",
|
|
1754
|
+
"scan-barcode",
|
|
1755
|
+
"scan-eye",
|
|
1756
|
+
"scan-face",
|
|
1757
|
+
"scan-heart",
|
|
1758
|
+
"scan-line",
|
|
1759
|
+
"scan-qr-code",
|
|
1760
|
+
"scan-search",
|
|
1761
|
+
"scan-text",
|
|
1762
|
+
"scan",
|
|
1763
|
+
"school",
|
|
1764
|
+
"scissors-line-dashed",
|
|
1765
|
+
"scissors",
|
|
1766
|
+
"scooter",
|
|
1767
|
+
"screen-share-off",
|
|
1768
|
+
"screen-share",
|
|
1769
|
+
"scroll-text",
|
|
1770
|
+
"scroll",
|
|
1771
|
+
"search-alert",
|
|
1772
|
+
"search-check",
|
|
1773
|
+
"search-code",
|
|
1774
|
+
"search-slash",
|
|
1775
|
+
"search-x",
|
|
1776
|
+
"search",
|
|
1777
|
+
"section",
|
|
1778
|
+
"send-horizontal",
|
|
1779
|
+
"send-horizonal",
|
|
1780
|
+
"send-to-back",
|
|
1781
|
+
"send",
|
|
1782
|
+
"separator-horizontal",
|
|
1783
|
+
"separator-vertical",
|
|
1784
|
+
"server-cog",
|
|
1785
|
+
"server-crash",
|
|
1786
|
+
"server-off",
|
|
1787
|
+
"server",
|
|
1788
|
+
"settings-2",
|
|
1789
|
+
"settings",
|
|
1790
|
+
"shapes",
|
|
1791
|
+
"share-2",
|
|
1792
|
+
"share",
|
|
1793
|
+
"sheet",
|
|
1794
|
+
"shell",
|
|
1795
|
+
"shelving-unit",
|
|
1796
|
+
"shield-alert",
|
|
1797
|
+
"shield-ban",
|
|
1798
|
+
"shield-check",
|
|
1799
|
+
"shield-cog-corner",
|
|
1800
|
+
"shield-cog",
|
|
1801
|
+
"shield-ellipsis",
|
|
1802
|
+
"shield-half",
|
|
1803
|
+
"shield-minus",
|
|
1804
|
+
"shield-off",
|
|
1805
|
+
"shield-plus",
|
|
1806
|
+
"shield-question-mark",
|
|
1807
|
+
"shield-question",
|
|
1808
|
+
"shield-user",
|
|
1809
|
+
"shield-x",
|
|
1810
|
+
"shield-close",
|
|
1811
|
+
"shield",
|
|
1812
|
+
"ship-wheel",
|
|
1813
|
+
"ship",
|
|
1814
|
+
"shirt",
|
|
1815
|
+
"shopping-bag",
|
|
1816
|
+
"shopping-basket",
|
|
1817
|
+
"shopping-cart",
|
|
1818
|
+
"shovel",
|
|
1819
|
+
"shower-head",
|
|
1820
|
+
"shredder",
|
|
1821
|
+
"shrimp",
|
|
1822
|
+
"shrink",
|
|
1823
|
+
"shrub",
|
|
1824
|
+
"shuffle",
|
|
1825
|
+
"sigma",
|
|
1826
|
+
"signal-high",
|
|
1827
|
+
"signal-low",
|
|
1828
|
+
"signal-medium",
|
|
1829
|
+
"signal-zero",
|
|
1830
|
+
"signal",
|
|
1831
|
+
"signature",
|
|
1832
|
+
"signpost-big",
|
|
1833
|
+
"signpost",
|
|
1834
|
+
"siren",
|
|
1835
|
+
"skip-back",
|
|
1836
|
+
"skip-forward",
|
|
1837
|
+
"skull",
|
|
1838
|
+
"slash",
|
|
1839
|
+
"slice",
|
|
1840
|
+
"sliders-horizontal",
|
|
1841
|
+
"sliders-vertical",
|
|
1842
|
+
"sliders",
|
|
1843
|
+
"smartphone-charging",
|
|
1844
|
+
"smartphone-nfc",
|
|
1845
|
+
"smartphone",
|
|
1846
|
+
"smile-plus",
|
|
1847
|
+
"smile",
|
|
1848
|
+
"snail",
|
|
1849
|
+
"snowflake",
|
|
1850
|
+
"soap-dispenser-droplet",
|
|
1851
|
+
"sofa",
|
|
1852
|
+
"solar-panel",
|
|
1853
|
+
"soup",
|
|
1854
|
+
"space",
|
|
1855
|
+
"spade",
|
|
1856
|
+
"sparkle",
|
|
1857
|
+
"sparkles",
|
|
1858
|
+
"stars",
|
|
1859
|
+
"speaker",
|
|
1860
|
+
"speech",
|
|
1861
|
+
"spell-check-2",
|
|
1862
|
+
"spell-check",
|
|
1863
|
+
"spline-pointer",
|
|
1864
|
+
"spline",
|
|
1865
|
+
"split",
|
|
1866
|
+
"spool",
|
|
1867
|
+
"sport-shoe",
|
|
1868
|
+
"spotlight",
|
|
1869
|
+
"spray-can",
|
|
1870
|
+
"sprout",
|
|
1871
|
+
"square-activity",
|
|
1872
|
+
"activity-square",
|
|
1873
|
+
"square-arrow-down-left",
|
|
1874
|
+
"arrow-down-left-square",
|
|
1875
|
+
"square-arrow-down-right",
|
|
1876
|
+
"arrow-down-right-square",
|
|
1877
|
+
"square-arrow-down",
|
|
1878
|
+
"arrow-down-square",
|
|
1879
|
+
"square-arrow-left",
|
|
1880
|
+
"arrow-left-square",
|
|
1881
|
+
"square-arrow-out-down-left",
|
|
1882
|
+
"arrow-down-left-from-square",
|
|
1883
|
+
"square-arrow-out-down-right",
|
|
1884
|
+
"arrow-down-right-from-square",
|
|
1885
|
+
"square-arrow-out-up-left",
|
|
1886
|
+
"arrow-up-left-from-square",
|
|
1887
|
+
"square-arrow-out-up-right",
|
|
1888
|
+
"arrow-up-right-from-square",
|
|
1889
|
+
"square-arrow-right-enter",
|
|
1890
|
+
"square-arrow-right-exit",
|
|
1891
|
+
"square-arrow-right",
|
|
1892
|
+
"arrow-right-square",
|
|
1893
|
+
"square-arrow-up-left",
|
|
1894
|
+
"arrow-up-left-square",
|
|
1895
|
+
"square-arrow-up-right",
|
|
1896
|
+
"arrow-up-right-square",
|
|
1897
|
+
"square-arrow-up",
|
|
1898
|
+
"arrow-up-square",
|
|
1899
|
+
"square-asterisk",
|
|
1900
|
+
"asterisk-square",
|
|
1901
|
+
"square-bottom-dashed-scissors",
|
|
1902
|
+
"scissors-square-dashed-bottom",
|
|
1903
|
+
"square-centerline-dashed-horizontal",
|
|
1904
|
+
"flip-horizontal",
|
|
1905
|
+
"square-centerline-dashed-vertical",
|
|
1906
|
+
"flip-vertical",
|
|
1907
|
+
"square-chart-gantt",
|
|
1908
|
+
"gantt-chart-square",
|
|
1909
|
+
"square-gantt-chart",
|
|
1910
|
+
"square-check-big",
|
|
1911
|
+
"check-square",
|
|
1912
|
+
"square-check",
|
|
1913
|
+
"check-square-2",
|
|
1914
|
+
"square-chevron-down",
|
|
1915
|
+
"chevron-down-square",
|
|
1916
|
+
"square-chevron-left",
|
|
1917
|
+
"chevron-left-square",
|
|
1918
|
+
"square-chevron-right",
|
|
1919
|
+
"chevron-right-square",
|
|
1920
|
+
"square-chevron-up",
|
|
1921
|
+
"chevron-up-square",
|
|
1922
|
+
"square-code",
|
|
1923
|
+
"code-square",
|
|
1924
|
+
"square-dashed-bottom-code",
|
|
1925
|
+
"square-dashed-bottom",
|
|
1926
|
+
"square-dashed-kanban",
|
|
1927
|
+
"kanban-square-dashed",
|
|
1928
|
+
"square-dashed-mouse-pointer",
|
|
1929
|
+
"mouse-pointer-square-dashed",
|
|
1930
|
+
"square-dashed-text",
|
|
1931
|
+
"text-selection",
|
|
1932
|
+
"text-select",
|
|
1933
|
+
"square-dashed-top-solid",
|
|
1934
|
+
"square-dashed",
|
|
1935
|
+
"box-select",
|
|
1936
|
+
"square-divide",
|
|
1937
|
+
"divide-square",
|
|
1938
|
+
"square-dot",
|
|
1939
|
+
"dot-square",
|
|
1940
|
+
"square-equal",
|
|
1941
|
+
"equal-square",
|
|
1942
|
+
"square-function",
|
|
1943
|
+
"function-square",
|
|
1944
|
+
"square-kanban",
|
|
1945
|
+
"kanban-square",
|
|
1946
|
+
"square-library",
|
|
1947
|
+
"library-square",
|
|
1948
|
+
"square-m",
|
|
1949
|
+
"m-square",
|
|
1950
|
+
"square-menu",
|
|
1951
|
+
"menu-square",
|
|
1952
|
+
"square-minus",
|
|
1953
|
+
"minus-square",
|
|
1954
|
+
"square-mouse-pointer",
|
|
1955
|
+
"inspect",
|
|
1956
|
+
"square-parking-off",
|
|
1957
|
+
"parking-square-off",
|
|
1958
|
+
"square-parking",
|
|
1959
|
+
"parking-square",
|
|
1960
|
+
"square-pause",
|
|
1961
|
+
"square-pen",
|
|
1962
|
+
"pen-box",
|
|
1963
|
+
"edit",
|
|
1964
|
+
"pen-square",
|
|
1965
|
+
"square-percent",
|
|
1966
|
+
"percent-square",
|
|
1967
|
+
"square-pi",
|
|
1968
|
+
"pi-square",
|
|
1969
|
+
"square-pilcrow",
|
|
1970
|
+
"pilcrow-square",
|
|
1971
|
+
"square-play",
|
|
1972
|
+
"play-square",
|
|
1973
|
+
"square-plus",
|
|
1974
|
+
"plus-square",
|
|
1975
|
+
"square-power",
|
|
1976
|
+
"power-square",
|
|
1977
|
+
"square-radical",
|
|
1978
|
+
"square-round-corner",
|
|
1979
|
+
"square-scissors",
|
|
1980
|
+
"scissors-square",
|
|
1981
|
+
"square-sigma",
|
|
1982
|
+
"sigma-square",
|
|
1983
|
+
"square-slash",
|
|
1984
|
+
"slash-square",
|
|
1985
|
+
"square-split-horizontal",
|
|
1986
|
+
"split-square-horizontal",
|
|
1987
|
+
"square-split-vertical",
|
|
1988
|
+
"split-square-vertical",
|
|
1989
|
+
"square-square",
|
|
1990
|
+
"square-stack",
|
|
1991
|
+
"square-star",
|
|
1992
|
+
"square-stop",
|
|
1993
|
+
"square-terminal",
|
|
1994
|
+
"terminal-square",
|
|
1995
|
+
"square-user-round",
|
|
1996
|
+
"user-square-2",
|
|
1997
|
+
"square-user",
|
|
1998
|
+
"user-square",
|
|
1999
|
+
"square-x",
|
|
2000
|
+
"x-square",
|
|
2001
|
+
"square",
|
|
2002
|
+
"squares-exclude",
|
|
2003
|
+
"squares-intersect",
|
|
2004
|
+
"squares-subtract",
|
|
2005
|
+
"squares-unite",
|
|
2006
|
+
"squircle-dashed",
|
|
2007
|
+
"squircle",
|
|
2008
|
+
"squirrel",
|
|
2009
|
+
"stamp",
|
|
2010
|
+
"star-half",
|
|
2011
|
+
"star-off",
|
|
2012
|
+
"star",
|
|
2013
|
+
"step-back",
|
|
2014
|
+
"step-forward",
|
|
2015
|
+
"stethoscope",
|
|
2016
|
+
"sticker",
|
|
2017
|
+
"sticky-note",
|
|
2018
|
+
"stone",
|
|
2019
|
+
"store",
|
|
2020
|
+
"stretch-horizontal",
|
|
2021
|
+
"stretch-vertical",
|
|
2022
|
+
"strikethrough",
|
|
2023
|
+
"subscript",
|
|
2024
|
+
"sun-dim",
|
|
2025
|
+
"sun-medium",
|
|
2026
|
+
"sun-moon",
|
|
2027
|
+
"sun-snow",
|
|
2028
|
+
"sun",
|
|
2029
|
+
"sunrise",
|
|
2030
|
+
"sunset",
|
|
2031
|
+
"superscript",
|
|
2032
|
+
"swatch-book",
|
|
2033
|
+
"swiss-franc",
|
|
2034
|
+
"switch-camera",
|
|
2035
|
+
"sword",
|
|
2036
|
+
"swords",
|
|
2037
|
+
"syringe",
|
|
2038
|
+
"table-2",
|
|
2039
|
+
"table-cells-merge",
|
|
2040
|
+
"table-cells-split",
|
|
2041
|
+
"table-columns-split",
|
|
2042
|
+
"table-of-contents",
|
|
2043
|
+
"table-properties",
|
|
2044
|
+
"table-rows-split",
|
|
2045
|
+
"table",
|
|
2046
|
+
"tablet-smartphone",
|
|
2047
|
+
"tablet",
|
|
2048
|
+
"tablets",
|
|
2049
|
+
"tag",
|
|
2050
|
+
"tags",
|
|
2051
|
+
"tally-1",
|
|
2052
|
+
"tally-2",
|
|
2053
|
+
"tally-3",
|
|
2054
|
+
"tally-4",
|
|
2055
|
+
"tally-5",
|
|
2056
|
+
"tangent",
|
|
2057
|
+
"target",
|
|
2058
|
+
"telescope",
|
|
2059
|
+
"tent-tree",
|
|
2060
|
+
"tent",
|
|
2061
|
+
"terminal",
|
|
2062
|
+
"test-tube-diagonal",
|
|
2063
|
+
"test-tube-2",
|
|
2064
|
+
"test-tube",
|
|
2065
|
+
"test-tubes",
|
|
2066
|
+
"text-align-center",
|
|
2067
|
+
"align-center",
|
|
2068
|
+
"text-align-end",
|
|
2069
|
+
"align-right",
|
|
2070
|
+
"text-align-justify",
|
|
2071
|
+
"align-justify",
|
|
2072
|
+
"text-align-start",
|
|
2073
|
+
"text",
|
|
2074
|
+
"align-left",
|
|
2075
|
+
"text-cursor-input",
|
|
2076
|
+
"text-cursor",
|
|
2077
|
+
"text-initial",
|
|
2078
|
+
"letter-text",
|
|
2079
|
+
"text-quote",
|
|
2080
|
+
"text-search",
|
|
2081
|
+
"text-wrap",
|
|
2082
|
+
"wrap-text",
|
|
2083
|
+
"theater",
|
|
2084
|
+
"thermometer-snowflake",
|
|
2085
|
+
"thermometer-sun",
|
|
2086
|
+
"thermometer",
|
|
2087
|
+
"thumbs-down",
|
|
2088
|
+
"thumbs-up",
|
|
2089
|
+
"ticket-check",
|
|
2090
|
+
"ticket-minus",
|
|
2091
|
+
"ticket-percent",
|
|
2092
|
+
"ticket-plus",
|
|
2093
|
+
"ticket-slash",
|
|
2094
|
+
"ticket-x",
|
|
2095
|
+
"ticket",
|
|
2096
|
+
"tickets-plane",
|
|
2097
|
+
"tickets",
|
|
2098
|
+
"timer-off",
|
|
2099
|
+
"timer-reset",
|
|
2100
|
+
"timer",
|
|
2101
|
+
"toggle-left",
|
|
2102
|
+
"toggle-right",
|
|
2103
|
+
"toilet",
|
|
2104
|
+
"tool-case",
|
|
2105
|
+
"toolbox",
|
|
2106
|
+
"tornado",
|
|
2107
|
+
"torus",
|
|
2108
|
+
"touchpad-off",
|
|
2109
|
+
"touchpad",
|
|
2110
|
+
"towel-rack",
|
|
2111
|
+
"tower-control",
|
|
2112
|
+
"toy-brick",
|
|
2113
|
+
"tractor",
|
|
2114
|
+
"traffic-cone",
|
|
2115
|
+
"train-front-tunnel",
|
|
2116
|
+
"train-front",
|
|
2117
|
+
"train-track",
|
|
2118
|
+
"tram-front",
|
|
2119
|
+
"train",
|
|
2120
|
+
"transgender",
|
|
2121
|
+
"trash-2",
|
|
2122
|
+
"trash",
|
|
2123
|
+
"tree-deciduous",
|
|
2124
|
+
"tree-palm",
|
|
2125
|
+
"palmtree",
|
|
2126
|
+
"tree-pine",
|
|
2127
|
+
"trees",
|
|
2128
|
+
"trending-down",
|
|
2129
|
+
"trending-up-down",
|
|
2130
|
+
"trending-up",
|
|
2131
|
+
"triangle-alert",
|
|
2132
|
+
"alert-triangle",
|
|
2133
|
+
"triangle-dashed",
|
|
2134
|
+
"triangle-right",
|
|
2135
|
+
"triangle",
|
|
2136
|
+
"trophy",
|
|
2137
|
+
"truck-electric",
|
|
2138
|
+
"truck",
|
|
2139
|
+
"turkish-lira",
|
|
2140
|
+
"turntable",
|
|
2141
|
+
"turtle",
|
|
2142
|
+
"tv-minimal-play",
|
|
2143
|
+
"tv-minimal",
|
|
2144
|
+
"tv-2",
|
|
2145
|
+
"tv",
|
|
2146
|
+
"type-outline",
|
|
2147
|
+
"type",
|
|
2148
|
+
"umbrella-off",
|
|
2149
|
+
"umbrella",
|
|
2150
|
+
"underline",
|
|
2151
|
+
"undo-2",
|
|
2152
|
+
"undo-dot",
|
|
2153
|
+
"undo",
|
|
2154
|
+
"unfold-horizontal",
|
|
2155
|
+
"unfold-vertical",
|
|
2156
|
+
"ungroup",
|
|
2157
|
+
"university",
|
|
2158
|
+
"school-2",
|
|
2159
|
+
"unlink-2",
|
|
2160
|
+
"unlink",
|
|
2161
|
+
"unplug",
|
|
2162
|
+
"upload",
|
|
2163
|
+
"usb",
|
|
2164
|
+
"user-check",
|
|
2165
|
+
"user-cog",
|
|
2166
|
+
"user-key",
|
|
2167
|
+
"user-lock",
|
|
2168
|
+
"user-minus",
|
|
2169
|
+
"user-pen",
|
|
2170
|
+
"user-plus",
|
|
2171
|
+
"user-round-check",
|
|
2172
|
+
"user-check-2",
|
|
2173
|
+
"user-round-cog",
|
|
2174
|
+
"user-cog-2",
|
|
2175
|
+
"user-round-key",
|
|
2176
|
+
"user-round-minus",
|
|
2177
|
+
"user-minus-2",
|
|
2178
|
+
"user-round-pen",
|
|
2179
|
+
"user-round-plus",
|
|
2180
|
+
"user-plus-2",
|
|
2181
|
+
"user-round-search",
|
|
2182
|
+
"user-round-x",
|
|
2183
|
+
"user-x-2",
|
|
2184
|
+
"user-round",
|
|
2185
|
+
"user-2",
|
|
2186
|
+
"user-search",
|
|
2187
|
+
"user-star",
|
|
2188
|
+
"user-x",
|
|
2189
|
+
"user",
|
|
2190
|
+
"users-round",
|
|
2191
|
+
"users-2",
|
|
2192
|
+
"users",
|
|
2193
|
+
"utensils-crossed",
|
|
2194
|
+
"fork-knife-crossed",
|
|
2195
|
+
"utensils",
|
|
2196
|
+
"fork-knife",
|
|
2197
|
+
"utility-pole",
|
|
2198
|
+
"van",
|
|
2199
|
+
"variable",
|
|
2200
|
+
"vault",
|
|
2201
|
+
"vector-square",
|
|
2202
|
+
"vegan",
|
|
2203
|
+
"venetian-mask",
|
|
2204
|
+
"venus-and-mars",
|
|
2205
|
+
"venus",
|
|
2206
|
+
"vibrate-off",
|
|
2207
|
+
"vibrate",
|
|
2208
|
+
"video-off",
|
|
2209
|
+
"video",
|
|
2210
|
+
"videotape",
|
|
2211
|
+
"view",
|
|
2212
|
+
"voicemail",
|
|
2213
|
+
"volleyball",
|
|
2214
|
+
"volume-1",
|
|
2215
|
+
"volume-2",
|
|
2216
|
+
"volume-off",
|
|
2217
|
+
"volume-x",
|
|
2218
|
+
"volume",
|
|
2219
|
+
"vote",
|
|
2220
|
+
"wallet-cards",
|
|
2221
|
+
"wallet-minimal",
|
|
2222
|
+
"wallet-2",
|
|
2223
|
+
"wallet",
|
|
2224
|
+
"wallpaper",
|
|
2225
|
+
"wand-sparkles",
|
|
2226
|
+
"wand-2",
|
|
2227
|
+
"wand",
|
|
2228
|
+
"warehouse",
|
|
2229
|
+
"washing-machine",
|
|
2230
|
+
"watch",
|
|
2231
|
+
"waves-arrow-down",
|
|
2232
|
+
"waves-arrow-up",
|
|
2233
|
+
"waves-ladder",
|
|
2234
|
+
"waves",
|
|
2235
|
+
"waypoints",
|
|
2236
|
+
"webcam",
|
|
2237
|
+
"webhook-off",
|
|
2238
|
+
"webhook",
|
|
2239
|
+
"weight-tilde",
|
|
2240
|
+
"weight",
|
|
2241
|
+
"wheat-off",
|
|
2242
|
+
"wheat",
|
|
2243
|
+
"whole-word",
|
|
2244
|
+
"wifi-cog",
|
|
2245
|
+
"wifi-high",
|
|
2246
|
+
"wifi-low",
|
|
2247
|
+
"wifi-off",
|
|
2248
|
+
"wifi-pen",
|
|
2249
|
+
"wifi-sync",
|
|
2250
|
+
"wifi-zero",
|
|
2251
|
+
"wifi",
|
|
2252
|
+
"wind-arrow-down",
|
|
2253
|
+
"wind",
|
|
2254
|
+
"wine-off",
|
|
2255
|
+
"wine",
|
|
2256
|
+
"workflow",
|
|
2257
|
+
"worm",
|
|
2258
|
+
"wrench",
|
|
2259
|
+
"x-line-top",
|
|
2260
|
+
"x",
|
|
2261
|
+
"zap-off",
|
|
2262
|
+
"zap",
|
|
2263
|
+
"zodiac-aquarius",
|
|
2264
|
+
"zodiac-aries",
|
|
2265
|
+
"zodiac-cancer",
|
|
2266
|
+
"zodiac-capricorn",
|
|
2267
|
+
"zodiac-gemini",
|
|
2268
|
+
"zodiac-leo",
|
|
2269
|
+
"zodiac-libra",
|
|
2270
|
+
"zodiac-ophiuchus",
|
|
2271
|
+
"zodiac-pisces",
|
|
2272
|
+
"zodiac-sagittarius",
|
|
2273
|
+
"zodiac-scorpio",
|
|
2274
|
+
"zodiac-taurus",
|
|
2275
|
+
"zodiac-virgo",
|
|
2276
|
+
"zoom-in",
|
|
2277
|
+
"zoom-out"
|
|
2278
|
+
]);
|
|
2279
|
+
var LAYOUT_SECTION_ICON_SET = new Set(LAYOUT_SECTION_ICONS);
|
|
2280
|
+
|
|
2281
|
+
// src/tools.ts
|
|
318
2282
|
var FRAMEWORK_CHOICES = ["astro", "next", "react-ts", "other"];
|
|
319
2283
|
var FRAMEWORK_LABELS = {
|
|
320
2284
|
astro: "Astro \u2014 recommended default, static by default and fastest to publish",
|
|
@@ -381,7 +2345,22 @@ var fieldType = z.enum([
|
|
|
381
2345
|
// `config` verbatim — which is what the warning above demands before adding a type here.
|
|
382
2346
|
// `modular` needs config.blockSlugs; `location` takes no config.
|
|
383
2347
|
"modular",
|
|
384
|
-
"location"
|
|
2348
|
+
"location",
|
|
2349
|
+
// All LEAF types, so the pass-through branch above covers them. `document` is THE article
|
|
2350
|
+
// body — the rich document canvas, collections only, at most one per model, top level
|
|
2351
|
+
// only. It was the conspicuous omission: the dashboard shipped an editor for it while no
|
|
2352
|
+
// agent could create the field. `sections` is a page-section zone composed in the Visual
|
|
2353
|
+
// Editor, so it has no inline control.
|
|
2354
|
+
"document",
|
|
2355
|
+
"longtext",
|
|
2356
|
+
"slug",
|
|
2357
|
+
"email",
|
|
2358
|
+
"phone",
|
|
2359
|
+
"link",
|
|
2360
|
+
"color",
|
|
2361
|
+
"json",
|
|
2362
|
+
"file",
|
|
2363
|
+
"sections"
|
|
385
2364
|
]);
|
|
386
2365
|
var slug = z.string().regex(/^[a-z0-9-]+$/, "lowercase letters, numbers, and hyphens only");
|
|
387
2366
|
var fieldKey = z.string().regex(/^[a-zA-Z0-9_]+$/, "letters, numbers, and underscores only");
|
|
@@ -493,12 +2472,42 @@ function buildToolDefs(deps) {
|
|
|
493
2472
|
}
|
|
494
2473
|
};
|
|
495
2474
|
}
|
|
2475
|
+
const blockObject = z.object({
|
|
2476
|
+
type: z.enum([
|
|
2477
|
+
"heading",
|
|
2478
|
+
"text",
|
|
2479
|
+
"richtext",
|
|
2480
|
+
"image",
|
|
2481
|
+
"button",
|
|
2482
|
+
"spacer",
|
|
2483
|
+
"video",
|
|
2484
|
+
"columns",
|
|
2485
|
+
"section",
|
|
2486
|
+
"slider",
|
|
2487
|
+
"tabs",
|
|
2488
|
+
"navbar",
|
|
2489
|
+
"footer",
|
|
2490
|
+
"form",
|
|
2491
|
+
"component",
|
|
2492
|
+
"collection"
|
|
2493
|
+
]).describe("block type; section/slider/tabs/columns nest child blocks"),
|
|
2494
|
+
id: z.string().min(1).describe("stable unique block id"),
|
|
2495
|
+
props: z.record(z.string(), z.unknown()).describe(
|
|
2496
|
+
"per-type props: heading {text, level}; text/richtext {html} (NOT {text}); image {src, alt}; button {text, href}; spacer {height}; video {url}; form {formId}; component {componentId, overrides?}; navbar {links:[{label,href}], logo?, cta?}; footer {columns, copyright?}; section {children: block[]}; columns {columns: block[][], gap} \u2014 a column may NOT hold columns/section/slider/tabs; slider {slides:[{id,children}]}; tabs {tabs:[{id,label,children}]}; collection {cardComponentId?, detailComponentId?, titleField?, excerptField?, limit?, order?, emptyText?} \u2014 lists this page's published entries as cards, and renders ONE entry on /<page>/<entrySlug>"
|
|
2497
|
+
),
|
|
2498
|
+
style: z.record(z.string(), z.unknown()).optional().describe(
|
|
2499
|
+
"design tokens: theme, bg (none|surface|muted|accent|dark|custom), bgCustom hex, paddingTop/paddingBottom/paddingSides px, contentWidth (narrow|default|wide|full), align, corner, shadow, borderTop/borderBottom. A real marketing band is a `section` block carrying bg + padding + contentWidth."
|
|
2500
|
+
)
|
|
2501
|
+
});
|
|
496
2502
|
const createPageInput = z.object({
|
|
497
2503
|
title: z.string().min(1).describe("display title of the page, e.g. 'Home'"),
|
|
498
2504
|
slug: slug.describe("URL-safe path segment, unique per project, e.g. 'home'"),
|
|
499
2505
|
pageType: z.enum(["singleton", "dynamic"]).default("singleton").describe(
|
|
500
2506
|
"'singleton' = exactly one entry (Home, About, Contact); 'dynamic' = many entries sharing this schema (Blog posts, Products). Defaults to singleton."
|
|
501
2507
|
),
|
|
2508
|
+
blockJson: z.array(blockObject).optional().describe(
|
|
2509
|
+
"the page's VISUAL composition \u2014 how a components-first page is built. Place one `component` block per section: {type:'component', id:'<stable>', props:{componentId:'<id from create_component>'}}. The component must be PUBLISHED (publish_component) or it renders as nothing on the live site. Independent of `fields`, which is a typed schema for a site's own code to read."
|
|
2510
|
+
),
|
|
502
2511
|
fields: z.array(fieldObject).optional().describe("the page's typed schema fields"),
|
|
503
2512
|
metaTitle: z.string().optional().describe("SEO meta title"),
|
|
504
2513
|
metaDescription: z.string().optional().describe("SEO meta description")
|
|
@@ -629,20 +2638,53 @@ function buildToolDefs(deps) {
|
|
|
629
2638
|
fields: z.array(formFieldObject).optional().describe("REPLACES the field array \u2014 include all fields to keep"),
|
|
630
2639
|
...formSettingsShape
|
|
631
2640
|
});
|
|
632
|
-
const blockObject = z.object({
|
|
633
|
-
type: z.enum(["heading", "text", "image", "button", "spacer", "video", "columns"]).describe("block type; 'columns' nests child blocks in props.columns"),
|
|
634
|
-
id: z.string().min(1).describe("stable unique block id"),
|
|
635
|
-
props: z.record(z.string(), z.unknown()).describe(
|
|
636
|
-
"per-type props: heading {text, level}; text {text}; image {src, alt}; button {text, href}; spacer {height}; video {url}; columns {columns: block[][], gap}"
|
|
637
|
-
)
|
|
638
|
-
});
|
|
639
2641
|
const componentPropObject = z.object({
|
|
640
2642
|
key: z.string().min(1),
|
|
641
2643
|
label: z.string().min(1),
|
|
642
2644
|
target: z.object({ blockId: z.string().min(1), path: z.string().min(1) }),
|
|
643
|
-
type: z.enum(["text", "richtext", "image", "url", "boolean"]),
|
|
2645
|
+
type: z.enum(["text", "richtext", "image", "url", "boolean", "slot"]),
|
|
2646
|
+
// 'slot' holds ONE nested component instance; config.componentIds restricts what may
|
|
2647
|
+
// fill it. Absent here until now, so a slot allowlist was unreachable from stdio even
|
|
2648
|
+
// once the enum allowed the type.
|
|
2649
|
+
config: z.object({ componentIds: z.array(z.string()).optional() }).optional(),
|
|
644
2650
|
defaultValue: z.unknown().optional()
|
|
645
2651
|
});
|
|
2652
|
+
const getLayoutInput = z.object({
|
|
2653
|
+
scope: z.enum(["global", "page"]).default("global"),
|
|
2654
|
+
pageId: z.string().min(1).optional().describe("page id or slug; required for page scope"),
|
|
2655
|
+
projectId: z.string().min(1).optional().describe("required only for a workspace-scoped grant")
|
|
2656
|
+
});
|
|
2657
|
+
const layoutBinding = z.object({ inputId: z.string().min(1), fieldId: z.string().min(1) });
|
|
2658
|
+
const layoutIcon = z.string().min(1).max(80).regex(/^(?:[a-z0-9]+(?:-[a-z0-9]+)*|[A-Z][A-Za-z0-9]+)$/).refine((value) => LAYOUT_SECTION_ICON_SET.has(value), "Select a supported Lucide icon").describe("Lucide icon name in canonical kebab-case; legacy CamelCase Layout icon names remain accepted");
|
|
2659
|
+
const sectionTarget = { sectionId: z.string().min(1) };
|
|
2660
|
+
const layoutCommand = z.discriminatedUnion("type", [
|
|
2661
|
+
z.object({ type: z.literal("set-section-values"), ...sectionTarget, values: z.record(z.string(), z.unknown()) }),
|
|
2662
|
+
z.object({ type: z.literal("set-field-value"), ...sectionTarget, fieldId: z.string().min(1), value: z.unknown() }),
|
|
2663
|
+
z.object({ type: z.literal("add-component"), ...sectionTarget, componentId: z.string().min(1), variantGroupId: z.string().min(1).optional(), bindings: z.array(layoutBinding).optional(), literalValues: z.record(z.string(), z.unknown()).optional() }),
|
|
2664
|
+
z.object({ type: z.literal("remove-item"), ...sectionTarget, itemId: z.string().min(1) }),
|
|
2665
|
+
z.object({ type: z.literal("move-component"), ...sectionTarget, itemId: z.string().min(1), index: z.number().int().nonnegative() }),
|
|
2666
|
+
z.object({ type: z.literal("move-item"), ...sectionTarget, itemId: z.string().min(1), index: z.number().int().nonnegative() }),
|
|
2667
|
+
z.object({ type: z.literal("swap-component-variant"), ...sectionTarget, itemId: z.string().min(1), componentId: z.string().min(1) }),
|
|
2668
|
+
z.object({ type: z.literal("set-page-state"), ...sectionTarget, state: z.enum(["inherit", "override-content", "customize-structure", "disable", "reset"]) }),
|
|
2669
|
+
z.object({ type: z.literal("set-section-state"), ...sectionTarget, state: z.enum(["inherit", "override-content", "customize-structure", "disable", "reset"]) }),
|
|
2670
|
+
z.object({ type: z.literal("add-section"), name: z.string().min(1), icon: layoutIcon, zone: z.enum(["before_page", "after_page"]) }),
|
|
2671
|
+
z.object({ type: z.literal("restore-section"), section: z.object({ id: z.string().min(1) }).passthrough(), data: z.object({ fields: z.record(z.string(), z.unknown()) }), placement: z.object({ zone: z.enum(["above-page-content", "below-page-content"]), localOrderKey: z.string().min(1), afterSectionId: z.string().optional(), beforeSectionId: z.string().optional() }).optional() }),
|
|
2672
|
+
z.object({ type: z.literal("update-section"), ...sectionTarget, name: z.string().min(1).optional(), icon: layoutIcon.optional(), slug: z.string().min(1).optional(), zone: z.enum(["above-page-content", "below-page-content"]).optional(), orderKey: z.string().min(1).optional() }),
|
|
2673
|
+
z.object({ type: z.literal("remove-section"), ...sectionTarget }),
|
|
2674
|
+
z.object({ type: z.literal("move-section"), ...sectionTarget, afterId: z.string().nullable().optional(), beforeId: z.string().nullable().optional() }),
|
|
2675
|
+
z.object({ type: z.literal("add-field"), ...sectionTarget, parentFieldId: z.string().optional(), fieldType: z.enum(["text", "longtext", "richtext", "number", "toggle", "date", "image", "file", "link", "email", "phone", "select", "color", "json", "reference", "multi-reference", "group", "repeater"]).optional(), field: z.object({ id: z.string(), slug: z.string(), label: z.string(), type: z.string() }).passthrough().optional() }),
|
|
2676
|
+
z.object({ type: z.literal("update-field"), ...sectionTarget, fieldId: z.string().min(1), patch: z.object({}).passthrough() }),
|
|
2677
|
+
z.object({ type: z.literal("remove-field"), ...sectionTarget, fieldId: z.string().min(1) }),
|
|
2678
|
+
z.object({ type: z.literal("move-field"), ...sectionTarget, itemId: z.string().min(1), index: z.number().int().nonnegative() }),
|
|
2679
|
+
z.object({ type: z.literal("set-bindings"), ...sectionTarget, itemId: z.string().min(1), bindings: z.array(layoutBinding), literalValues: z.record(z.string(), z.unknown()).optional() })
|
|
2680
|
+
]);
|
|
2681
|
+
const commandLayoutInput = z.object({
|
|
2682
|
+
scope: z.enum(["global", "page"]).default("global"),
|
|
2683
|
+
pageId: z.string().min(1).optional(),
|
|
2684
|
+
projectId: z.string().min(1).optional().describe("required only for a workspace-scoped grant"),
|
|
2685
|
+
command: layoutCommand.describe("one canonical discriminated Layout command; authority is derived from type"),
|
|
2686
|
+
ifMatch: z.number().int().nonnegative().describe("revision returned by get_layout")
|
|
2687
|
+
});
|
|
646
2688
|
const componentCategory = z.enum([
|
|
647
2689
|
"navbar",
|
|
648
2690
|
"footer",
|
|
@@ -988,10 +3030,10 @@ function buildToolDefs(deps) {
|
|
|
988
3030
|
// ── Pages (metadata edit; parity with remote /mcp) ──
|
|
989
3031
|
def(
|
|
990
3032
|
"update_page",
|
|
991
|
-
"Edit a page
|
|
992
|
-
"Edit a page
|
|
993
|
-
z.object({ pageId: z.string().min(1), title: z.string().optional(), slug: z.string().optional(), metaTitle: z.string().optional(), metaDescription: z.string().optional(), status: z.enum(["draft", "published"]).optional() }).shape,
|
|
994
|
-
async (c, a) => ok("Updated page.", await data(c, "PATCH", `/management/pages/${s(a.pageId)}/meta`, { title: a.title, slug: a.slug, metaTitle: a.metaTitle, metaDescription: a.metaDescription, status: a.status }))
|
|
3033
|
+
"Edit a page",
|
|
3034
|
+
"Edit a page: title, slug, SEO metaTitle/metaDescription, publish status (draft|published), and `blockJson` (its block composition \u2014 passing it REPLACES the whole array, so read get_page first). It does NOT change the field SCHEMA \u2014 use add_page_field / set_page_content for that. Renaming the slug keeps content intact. Publishing copies the draft blocks live in the same call.",
|
|
3035
|
+
z.object({ pageId: z.string().min(1), title: z.string().optional(), slug: z.string().optional(), blockJson: z.array(blockObject).optional().describe("REPLACES the page's block composition"), metaTitle: z.string().optional(), metaDescription: z.string().optional(), status: z.enum(["draft", "published"]).optional() }).shape,
|
|
3036
|
+
async (c, a) => ok("Updated page.", await data(c, "PATCH", `/management/pages/${s(a.pageId)}/meta`, { title: a.title, slug: a.slug, blockJson: a.blockJson, metaTitle: a.metaTitle, metaDescription: a.metaDescription, status: a.status }))
|
|
995
3037
|
),
|
|
996
3038
|
// ── Code + deploy (parity with remote /mcp; needs artifact:write) ──
|
|
997
3039
|
def(
|
|
@@ -1037,6 +3079,13 @@ function buildToolDefs(deps) {
|
|
|
1037
3079
|
z.object({ since: z.string().datetime(), limit: z.number().int().min(1).max(100).optional() }).shape,
|
|
1038
3080
|
async (c, a) => ok("Project changes.", await data(c, "GET", `/management/insights/activity${q({ since: a.since, limit: a.limit ?? 100 })}`))
|
|
1039
3081
|
),
|
|
3082
|
+
def(
|
|
3083
|
+
"get_next_steps",
|
|
3084
|
+
"Get what to do next",
|
|
3085
|
+
"What is still unfinished in the connected project, as the platform sees it \u2014 pages you created without a meta description, drafts never published, collections with no entries, forms nobody is notified about, writes waiting for human approval. Each item cites the count it reacted to. Call it AFTER a batch of edits to catch what you left behind, and before telling the user you are done.",
|
|
3086
|
+
z.object({}).shape,
|
|
3087
|
+
async (c) => ok("Next steps.", await data(c, "GET", `/management/insights/next-steps`))
|
|
3088
|
+
),
|
|
1040
3089
|
def(
|
|
1041
3090
|
"get_analytics_overview",
|
|
1042
3091
|
"Get traffic overview",
|
|
@@ -1170,6 +3219,7 @@ function buildToolDefs(deps) {
|
|
|
1170
3219
|
title: args.title,
|
|
1171
3220
|
slug: args.slug,
|
|
1172
3221
|
pageType: args.pageType ?? "singleton",
|
|
3222
|
+
...args.blockJson ? { blockJson: args.blockJson } : {},
|
|
1173
3223
|
...args.fields ? { fields: args.fields.map(toField) } : {},
|
|
1174
3224
|
...args.metaTitle !== void 0 ? { metaTitle: args.metaTitle } : {},
|
|
1175
3225
|
...args.metaDescription !== void 0 ? { metaDescription: args.metaDescription } : {}
|
|
@@ -1456,6 +3506,31 @@ function buildToolDefs(deps) {
|
|
|
1456
3506
|
})
|
|
1457
3507
|
)
|
|
1458
3508
|
},
|
|
3509
|
+
// ── Project/page Layout (draft-only; publish remains dashboard-gated) ──
|
|
3510
|
+
{
|
|
3511
|
+
name: "get_layout",
|
|
3512
|
+
config: {
|
|
3513
|
+
title: "Get the project or page Layout draft",
|
|
3514
|
+
description: "Read the Global Layout or one page's Layout override, including its optimistic revision. Always read this before update_layout.",
|
|
3515
|
+
inputSchema: getLayoutInput.shape
|
|
3516
|
+
},
|
|
3517
|
+
handler: guard(async (args) => withClient(async (client) => {
|
|
3518
|
+
const layout = await client.getManagedLayout(args);
|
|
3519
|
+
return ok(`${layout.scope === "global" ? "Global" : `Page ${layout.pageSlug}`} Layout draft at revision ${layout.revision}.`, layout);
|
|
3520
|
+
}))
|
|
3521
|
+
},
|
|
3522
|
+
{
|
|
3523
|
+
name: "update_layout",
|
|
3524
|
+
config: {
|
|
3525
|
+
title: "Apply one Layout draft command",
|
|
3526
|
+
description: "Apply one permission-shaped values/composition/schema command to the Global Layout or a page override. Draft-only: this never publishes. Pass the revision from get_layout as ifMatch.",
|
|
3527
|
+
inputSchema: commandLayoutInput.shape
|
|
3528
|
+
},
|
|
3529
|
+
handler: guard(async (args) => withClient(async (client) => {
|
|
3530
|
+
const layout = await client.commandManagedLayout({ ...args, command: args.command });
|
|
3531
|
+
return ok(`Updated ${layout.scope === "global" ? "Global" : `Page ${layout.pageSlug}`} Layout draft to revision ${layout.revision}.`, layout);
|
|
3532
|
+
}))
|
|
3533
|
+
},
|
|
1459
3534
|
// ── Components (discover + author reusable symbols) ──
|
|
1460
3535
|
{
|
|
1461
3536
|
name: "list_components",
|
|
@@ -1555,6 +3630,23 @@ ${lines.join("\n")}`, found);
|
|
|
1555
3630
|
})
|
|
1556
3631
|
)
|
|
1557
3632
|
},
|
|
3633
|
+
{
|
|
3634
|
+
name: "publish_component",
|
|
3635
|
+
config: {
|
|
3636
|
+
title: "Publish a component",
|
|
3637
|
+
description: "Publish a component: copy its DRAFT definition to the live copy and re-bake every published page that embeds it. This is the ONLY way a component reaches the live site \u2014 create_component and update_component write drafts, and an unpublished component renders as NOTHING on the live site, with no error. Publish every component you place on a page. 403 PUBLISH_NOT_GRANTED means this connection may author but not publish: say so and let the user publish from the dashboard. 422 means publishing would break a Layout that uses it \u2014 the response names which.",
|
|
3638
|
+
inputSchema: getComponentInput.shape
|
|
3639
|
+
},
|
|
3640
|
+
handler: guard(
|
|
3641
|
+
async (args) => withClient(async (client) => {
|
|
3642
|
+
const res = await client.fetchJSON(
|
|
3643
|
+
client.url(`/management/components/${args.componentId}/publish`),
|
|
3644
|
+
{ method: "POST" }
|
|
3645
|
+
);
|
|
3646
|
+
return ok("Published component.", res.data);
|
|
3647
|
+
})
|
|
3648
|
+
)
|
|
3649
|
+
},
|
|
1558
3650
|
// ── AI content + SEO actions (Option B) ────────────────────────────────────
|
|
1559
3651
|
{
|
|
1560
3652
|
name: "write_content",
|
|
@@ -1604,29 +3696,144 @@ function registerTools(server, deps) {
|
|
|
1604
3696
|
|
|
1605
3697
|
// src/prompts.ts
|
|
1606
3698
|
import { z as z2 } from "zod";
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
3699
|
+
|
|
3700
|
+
// src/playbook.ts
|
|
3701
|
+
var SCHEMA_PLAYBOOK = `# Designing a BetterCMS project
|
|
3702
|
+
|
|
3703
|
+
Read this BEFORE creating anything. Confirm the shape with the user before you build it.
|
|
3704
|
+
|
|
3705
|
+
## 1. Pick the architecture first
|
|
3706
|
+
|
|
3707
|
+
**Components-first** \u2014 a marketing site. A library of reusable *components*, each a
|
|
3708
|
+
section, and thin pages that place them. Editors add, reorder and swap sections without
|
|
3709
|
+
touching a schema. This is what \`create_component\` + \`create_page(blockJson)\` are for.
|
|
3710
|
+
|
|
3711
|
+
**Schema-first** \u2014 a blog, a product catalogue, a directory: many rows sharing one shape.
|
|
3712
|
+
A collection (\`create_content_model\`) plus entries.
|
|
3713
|
+
|
|
3714
|
+
Most real sites are both: components for the marketing pages, a collection for the blog.
|
|
3715
|
+
Decide before your first call; converting later means rewriting content.
|
|
3716
|
+
|
|
3717
|
+
## 2. The decision tree
|
|
3718
|
+
|
|
3719
|
+
Repeated visual region on a page? -> a COMPONENT with sectionType (a Section)
|
|
3720
|
+
...and it comes in more than one look? -> siblings sharing that sectionType = VARIANTS
|
|
3721
|
+
A stack of mixed, reorderable content? -> kind:'block' models + a \`modular\` field
|
|
3722
|
+
A row in a list (post, author, tier)? -> a collection (kind:'model')
|
|
3723
|
+
The one body of an article? -> type:'document' (exactly one, top level)
|
|
3724
|
+
A fixed cluster of fields? -> group (never a 1-item repeater)
|
|
3725
|
+
A repeating cluster? -> repeater
|
|
3726
|
+
A list of plain strings? -> array (never a repeater of one text)
|
|
3727
|
+
Site-wide nav/footer? -> place the project's provisioned components
|
|
3728
|
+
|
|
3729
|
+
## 3. Anatomy of a real section component
|
|
3730
|
+
|
|
3731
|
+
A component that is only headings and text renders as an unstyled stack. Every section the
|
|
3732
|
+
product ships looks like this \u2014 a \`section\` block carrying \`style\`, with content nested in
|
|
3733
|
+
\`props.children\`:
|
|
3734
|
+
|
|
3735
|
+
{
|
|
3736
|
+
type: "section", id: "root",
|
|
3737
|
+
style: { bg: "surface", paddingTop: 96, paddingBottom: 96, contentWidth: "default", align: "center" },
|
|
3738
|
+
props: { children: [
|
|
3739
|
+
{ type: "heading", id: "h", props: { text: "Headline", level: 2 } },
|
|
3740
|
+
{ type: "text", id: "sub", props: { html: "<p>Supporting copy.</p>" } },
|
|
3741
|
+
{ type: "button", id: "cta", props: { text: "Get started", href: "/signup", variant: "primary" } }
|
|
3742
|
+
] }
|
|
3743
|
+
}
|
|
3744
|
+
|
|
3745
|
+
Then declare what an editor may change, via \`props\`:
|
|
3746
|
+
|
|
3747
|
+
props: [
|
|
3748
|
+
{ key: "headline", label: "Headline", target: { blockId: "h", path: "props.text" }, type: "text" },
|
|
3749
|
+
{ key: "body", label: "Body", target: { blockId: "sub", path: "props.html" }, type: "richtext" },
|
|
3750
|
+
{ key: "ctaHref", label: "CTA link", target: { blockId: "cta", path: "props.href" }, type: "url" }
|
|
3751
|
+
]
|
|
3752
|
+
|
|
3753
|
+
Declare props only for what should really be editable. Every prop is a decision an editor
|
|
3754
|
+
has to make.
|
|
3755
|
+
|
|
3756
|
+
## 4. Variants
|
|
3757
|
+
|
|
3758
|
+
Components sharing a \`sectionType\` are swappable layouts of one section family \u2014 "Hero
|
|
3759
|
+
centered" and "Hero split" both with \`sectionType: "Hero"\`. Swapping is one write and
|
|
3760
|
+
keeps content, because overrides are keyed by prop KEY.
|
|
3761
|
+
|
|
3762
|
+
So **use the same prop keys across a family**. A variant that calls it \`title\` where its
|
|
3763
|
+
sibling calls it \`headline\` silently drops that content on the swap.
|
|
3764
|
+
|
|
3765
|
+
Pair \`sectionType\` with a library \`category\` (hero, content, social-proof, conversion) or
|
|
3766
|
+
the component never appears in the editor's "Add a section" picker.
|
|
3767
|
+
|
|
3768
|
+
## 5. Blocks and modular fields
|
|
3769
|
+
|
|
3770
|
+
A \`kind:'block'\` model holds no entries of its own; it exists to be stacked inside another
|
|
3771
|
+
model's \`modular\` field. Create the blocks FIRST, then name their slugs (not ids) in
|
|
3772
|
+
\`config.blockSlugs\`. This is the page-builder shape: one \`sections\` field holding an
|
|
3773
|
+
ordered list of typed blocks.
|
|
3774
|
+
|
|
3775
|
+
## 6. Blogs
|
|
3776
|
+
|
|
3777
|
+
author collection: name, avatar, bio
|
|
3778
|
+
blog-post collection: title, slug, excerpt, cover (image),
|
|
3779
|
+
body (document), author (reference -> author)
|
|
3780
|
+
|
|
3781
|
+
\`document\` is THE article body: a rich document canvas, **collections only**, at most one
|
|
3782
|
+
per model, top level only (never inside a group or repeater). A page's body is its block
|
|
3783
|
+
content, so \`document\` on a page is rejected. Use \`richtext\` for a short formatted field,
|
|
3784
|
+
\`longtext\` for multi-line plain text.
|
|
3785
|
+
|
|
3786
|
+
Then the pages:
|
|
3787
|
+
|
|
3788
|
+
create_page slug:"blog" pageType:"dynamic" fields:[...the post schema...]
|
|
3789
|
+
blockJson: [ nav, heading, { type:"collection", id:"list", props:{} }, footer ]
|
|
3790
|
+
|
|
3791
|
+
create_content_entry per post, with pageId set to that page
|
|
3792
|
+
|
|
3793
|
+
The \`collection\` block is lane-aware: on \`/blog\` it renders a card per entry, and on
|
|
3794
|
+
\`/blog/<slug>\` it renders THAT entry. One page, both jobs. Every OTHER block in the array
|
|
3795
|
+
is interpolated per entry with \`{{fieldKey}}\` placeholders \u2014 \`{{title}}\`, \`{{cover.url}}\`,
|
|
3796
|
+
\`{{body.html}}\`. Note that richtext and document bind to \`.html\` only, never the bare name.
|
|
3797
|
+
|
|
3798
|
+
## 7. Order of operations
|
|
3799
|
+
|
|
3800
|
+
1. blocks create_content_model kind:'block' (before anything references them)
|
|
3801
|
+
2. collections create_content_model
|
|
3802
|
+
3. components create_component (they land as DRAFTS)
|
|
3803
|
+
4. publish publish_component <- every component you intend to place
|
|
3804
|
+
5. pages create_page with blockJson placing those components
|
|
3805
|
+
6. content create_content_entry / set_page_content
|
|
3806
|
+
7. publish update_page status:'published'
|
|
3807
|
+
8. check get_next_steps, and fix what it lists
|
|
3808
|
+
|
|
3809
|
+
## 8. Two ways to ship a blank site
|
|
3810
|
+
|
|
3811
|
+
**An unpublished component renders as an empty string.** Not an error, not a placeholder \u2014
|
|
3812
|
+
nothing, on a page that returns 200. If a section is missing from the live site, check
|
|
3813
|
+
\`publish_component\` before anything else.
|
|
3814
|
+
|
|
3815
|
+
**A workspace-level component (\`projectId: null\`) never reaches a live site.** It resolves
|
|
3816
|
+
in preview and is blank in production. Always pass the project's id.
|
|
3817
|
+
`;
|
|
3818
|
+
|
|
3819
|
+
// src/prompts.ts
|
|
3820
|
+
var SCHEMA_PROPOSAL_FLOW = `### Whole-project design (confirm-first) \u2192 \`create_component\` / \`create_page\` / \`create_content_model\`
|
|
3821
|
+
Design the WHOLE project from its brief or its code, and **confirm the shape with the user
|
|
3822
|
+
BEFORE creating anything**. Never silently guess.
|
|
3823
|
+
|
|
3824
|
+
1. **Read the source** \u2014 the connected repo, or the uploaded project in your working
|
|
3825
|
+
directory. For each page, identify the repeated visual regions and the list-shaped data.
|
|
3826
|
+
2. **Classify every part** using the decision tree in the playbook below. The two mistakes
|
|
3827
|
+
that matter: flattening a marketing page into loose page fields when its sections should
|
|
3828
|
+
be COMPONENTS, and giving a blog a \`richtext\` field when its body should be \`document\`.
|
|
3829
|
+
3. **Present the proposal (REQUIRED gate).** Show the component library (with each section's
|
|
3830
|
+
family and variants), the collections and their fields, and the pages that place them.
|
|
3831
|
+
Ask the user (AskUserQuestion) to confirm or adjust. Do not create anything before this.
|
|
3832
|
+
4. **Build it in the playbook's order** \u2014 blocks, collections, components, PUBLISH the
|
|
3833
|
+
components, pages, content, publish. Skipping the publish step ships a blank site.
|
|
3834
|
+
|
|
3835
|
+
${SCHEMA_PLAYBOOK}
|
|
3836
|
+
`;
|
|
1630
3837
|
var PAGE_FLOW = `### Page authoring \u2192 \`create_page\` tool
|
|
1631
3838
|
Author a page (the page-first schema). Ask, in order, via AskUserQuestion:
|
|
1632
3839
|
1. **Page type** \u2014 singleton (exactly one entry: Home, About, Contact) vs dynamic
|
|
@@ -1669,20 +3876,36 @@ Author a form (then the user embeds it with \`<BcmsForm form={getForm('Name')} /
|
|
|
1669
3876
|
4. **Confirm**, then \`create_form\` { name, fields, ... } (returns the new id), or
|
|
1670
3877
|
\`update_form\` { formId, ... } to edit (passing \`fields\` REPLACES the array \u2014 include all).
|
|
1671
3878
|
5. Offer to wire \`<BcmsForm>\` into the page/component where the user wants it.`;
|
|
1672
|
-
var COMPONENT_FLOW = `### Component authoring \u2192 \`create_component\` / \`
|
|
1673
|
-
Author a reusable
|
|
1674
|
-
|
|
1675
|
-
confirm. Never guess the layout.
|
|
3879
|
+
var COMPONENT_FLOW = `### Component authoring \u2192 \`create_component\` / \`publish_component\`
|
|
3880
|
+
Author a reusable section. blockJson is the visual definition; authoring it blind is
|
|
3881
|
+
error-prone, so go slow and confirm. Never guess the layout.
|
|
1676
3882
|
1. **Discover** \u2014 \`list_components\` / \`get_component\` (read before update; keep existing blocks).
|
|
1677
|
-
2. **Design the
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
4. **
|
|
1684
|
-
{
|
|
1685
|
-
|
|
3883
|
+
2. **Design the tree** \u2014 wrap the section in a \`section\` block carrying \`style\`
|
|
3884
|
+
(bg + paddingTop/paddingBottom + contentWidth) and nest content in props.children. See
|
|
3885
|
+
"Anatomy of a real section component" in the playbook. Give every block a stable id.
|
|
3886
|
+
3. **sectionType + category** \u2014 set both, or the component never appears in the editor's
|
|
3887
|
+
"Add a section" picker. Components sharing a sectionType are swappable VARIANTS, so reuse
|
|
3888
|
+
the same prop keys across a family or a swap drops content.
|
|
3889
|
+
4. **Props** \u2014 declare only what should really be editable:
|
|
3890
|
+
{ key, label, target: { blockId, path }, type: text|richtext|image|url|boolean|slot }.
|
|
3891
|
+
5. **Confirm the structure** (AskUserQuestion: show the block tree), then \`create_component\`.
|
|
3892
|
+
6. **\`publish_component\`.** It lands as a DRAFT, and a draft component renders as NOTHING on
|
|
3893
|
+
the live site \u2014 no error, no placeholder. This step is not optional.
|
|
3894
|
+
`;
|
|
3895
|
+
var LAYOUT_FLOW = `### Project/page Layout authoring \u2192 \`get_layout\` / \`update_layout\`
|
|
3896
|
+
Edit the project's draft Global Layout or one page's draft override. Layout publishing stays
|
|
3897
|
+
in the dashboard; these tools never change the live site.
|
|
3898
|
+
1. **Read first** \u2014 call \`get_layout\` with scope \`global\`, or scope \`page\` + pageId.
|
|
3899
|
+
Keep the returned \`revision\`; every write must pass it as \`ifMatch\`.
|
|
3900
|
+
2. **Choose one discriminated command type** \u2014 the server derives its authority family;
|
|
3901
|
+
callers cannot claim a weaker family for a schema or composition mutation.
|
|
3902
|
+
3. **Apply one canonical command** with \`update_layout\`, then use the returned revision for
|
|
3903
|
+
the next command. A 409 means somebody else edited it: re-read; never blindly retry.
|
|
3904
|
+
4. Direct fields are headless data. Only Component items render markup. Navigation/Footer
|
|
3905
|
+
are reserved Sections and cannot be deleted or moved; page overrides may inherit,
|
|
3906
|
+
override content, customize structure, or disable them.
|
|
3907
|
+
5. Read Component/Variant identities before attaching or swapping. Required values and
|
|
3908
|
+
bindings must be complete before a human publishes from the dashboard.`;
|
|
1686
3909
|
var BUILD_SITE_FLOW = `### Build a whole site (schema \u2192 pages \u2192 AI copy) \u2192 composes the flows below
|
|
1687
3910
|
End-to-end authoring from a repo or a brief. Confirm-first at every stage.
|
|
1688
3911
|
1. **Schema** \u2014 run the whole-project schema design above: propose the page/zone/field tree,
|
|
@@ -1754,6 +3977,8 @@ ${FORM_FLOW}
|
|
|
1754
3977
|
|
|
1755
3978
|
${COMPONENT_FLOW}
|
|
1756
3979
|
|
|
3980
|
+
${LAYOUT_FLOW}
|
|
3981
|
+
|
|
1757
3982
|
${BUILD_SITE_FLOW}
|
|
1758
3983
|
|
|
1759
3984
|
${LANDING_PAGES_FLOW}
|
|
@@ -1767,6 +3992,29 @@ here \u2014 route to it the same way.`
|
|
|
1767
3992
|
]
|
|
1768
3993
|
})
|
|
1769
3994
|
);
|
|
3995
|
+
server.registerPrompt(
|
|
3996
|
+
"edit_layout",
|
|
3997
|
+
{
|
|
3998
|
+
title: "Edit project or page Layout (guided)",
|
|
3999
|
+
description: "Safely edit a draft Global Layout or page override with optimistic locking. Publishing remains in the dashboard.",
|
|
4000
|
+
argsSchema: {
|
|
4001
|
+
request: z2.string().optional().describe("what to change, e.g. 'disable the footer on the pricing page'")
|
|
4002
|
+
}
|
|
4003
|
+
},
|
|
4004
|
+
({ request }) => ({
|
|
4005
|
+
messages: [{
|
|
4006
|
+
role: "user",
|
|
4007
|
+
content: {
|
|
4008
|
+
type: "text",
|
|
4009
|
+
text: `Edit the BetterCMS Layout draft.${request ? ` The user wants: "${request}".` : ""}
|
|
4010
|
+
|
|
4011
|
+
${LAYOUT_FLOW}
|
|
4012
|
+
|
|
4013
|
+
Report which scope changed and the new revision. Remind the user that publishing is a separate dashboard action.`
|
|
4014
|
+
}
|
|
4015
|
+
}]
|
|
4016
|
+
})
|
|
4017
|
+
);
|
|
1770
4018
|
server.registerPrompt(
|
|
1771
4019
|
"propose_schema",
|
|
1772
4020
|
{
|