@lifeonlars/prime-yggdrasil 0.1.4 → 0.2.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.
@@ -611,3 +611,82 @@
611
611
  border-color: transparent;
612
612
  color: var(--severity-danger-text);
613
613
  }
614
+
615
+ /* Button Contrast Variant */
616
+ .p-button.p-button-contrast,
617
+ .p-button-group.p-button-contrast > .p-button,
618
+ .p-splitbutton.p-button-contrast > .p-button {
619
+ color: var(--surface-neutral-primary);
620
+ background: var(--text-neutral-loud);
621
+ border: 1px solid var(--text-neutral-loud);
622
+ }
623
+
624
+ .p-button.p-button-contrast:not(:disabled):hover,
625
+ .p-button-group.p-button-contrast > .p-button:not(:disabled):hover,
626
+ .p-splitbutton.p-button-contrast > .p-button:not(:disabled):hover {
627
+ background: var(--text-neutral-loud);
628
+ color: var(--surface-neutral-primary);
629
+ border-color: var(--text-neutral-loud);
630
+ }
631
+
632
+ .p-button.p-button-contrast:not(:disabled):focus,
633
+ .p-button-group.p-button-contrast > .p-button:not(:disabled):focus,
634
+ .p-splitbutton.p-button-contrast > .p-button:not(:disabled):focus {
635
+ box-shadow: none;
636
+ }
637
+
638
+ .p-button.p-button-contrast:not(:disabled):active,
639
+ .p-button-group.p-button-contrast > .p-button:not(:disabled):active,
640
+ .p-splitbutton.p-button-contrast > .p-button:not(:disabled):active {
641
+ background: var(--text-neutral-default);
642
+ color: var(--surface-neutral-primary);
643
+ border-color: var(--text-neutral-default);
644
+ }
645
+
646
+ .p-button.p-button-contrast.p-button-outlined,
647
+ .p-button-group.p-button-contrast > .p-button.p-button-outlined,
648
+ .p-splitbutton.p-button-contrast > .p-button.p-button-outlined {
649
+ background-color: transparent;
650
+ color: var(--text-neutral-loud);
651
+ border: 1px solid;
652
+ }
653
+
654
+ .p-button.p-button-contrast.p-button-outlined:not(:disabled):hover,
655
+ .p-button-group.p-button-contrast > .p-button.p-button-outlined:not(:disabled):hover,
656
+ .p-splitbutton.p-button-contrast > .p-button.p-button-outlined:not(:disabled):hover {
657
+ background: color-mix(in srgb, var(--text-neutral-loud) 4%, transparent);
658
+ color: var(--text-neutral-loud);
659
+ border: 1px solid;
660
+ }
661
+
662
+ .p-button.p-button-contrast.p-button-outlined:not(:disabled):active,
663
+ .p-button-group.p-button-contrast > .p-button.p-button-outlined:not(:disabled):active,
664
+ .p-splitbutton.p-button-contrast > .p-button.p-button-outlined:not(:disabled):active {
665
+ background: color-mix(in srgb, var(--text-neutral-loud) 16%, transparent);
666
+ color: var(--text-neutral-loud);
667
+ border: 1px solid;
668
+ }
669
+
670
+ .p-button.p-button-contrast.p-button-text,
671
+ .p-button-group.p-button-contrast > .p-button.p-button-text,
672
+ .p-splitbutton.p-button-contrast > .p-button.p-button-text {
673
+ background-color: transparent;
674
+ color: var(--text-neutral-loud);
675
+ border-color: transparent;
676
+ }
677
+
678
+ .p-button.p-button-contrast.p-button-text:not(:disabled):hover,
679
+ .p-button-group.p-button-contrast > .p-button.p-button-text:not(:disabled):hover,
680
+ .p-splitbutton.p-button-contrast > .p-button.p-button-text:not(:disabled):hover {
681
+ background: color-mix(in srgb, var(--text-neutral-loud) 4%, transparent);
682
+ border-color: transparent;
683
+ color: var(--text-neutral-loud);
684
+ }
685
+
686
+ .p-button.p-button-contrast.p-button-text:not(:disabled):active,
687
+ .p-button-group.p-button-contrast > .p-button.p-button-text:not(:disabled):active,
688
+ .p-splitbutton.p-button-contrast > .p-button.p-button-text:not(:disabled):active {
689
+ background: color-mix(in srgb, var(--text-neutral-loud) 16%, transparent);
690
+ border-color: transparent;
691
+ color: var(--text-neutral-loud);
692
+ }
@@ -917,3 +917,144 @@
917
917
  .p-orderlist.p-orderlist-striped .p-orderlist-list .p-orderlist-item:nth-child(even):hover {
918
918
  background: var(--surface-state-hover);
919
919
  }
920
+
921
+ /* DataTable Column Filters */
922
+ .p-column-filter-menu-button {
923
+ width: 2rem;
924
+ height: 2rem;
925
+ color: var(--text-neutral-subdued);
926
+ border: 0 none;
927
+ background: transparent;
928
+ border-radius: var(--radius-full);
929
+ transition: background-color 0.2s, color 0.2s, box-shadow 0.2s;
930
+ }
931
+
932
+ .p-column-filter-menu-button:hover {
933
+ color: var(--text-neutral-loud);
934
+ border-color: transparent;
935
+ background: var(--surface-state-hover);
936
+ }
937
+
938
+ .p-column-filter-menu-button:focus-visible {
939
+ outline: 0 none;
940
+ outline-offset: 0;
941
+ box-shadow: 0 0 0 0.2rem var(--surface-brand-overlay);
942
+ }
943
+
944
+ .p-column-filter-menu-button.p-column-filter-menu-button-open,
945
+ .p-column-filter-menu-button.p-column-filter-menu-button-open:hover {
946
+ background: var(--surface-state-hover);
947
+ color: var(--text-neutral-loud);
948
+ }
949
+
950
+ .p-column-filter-menu-button.p-column-filter-menu-button-active,
951
+ .p-column-filter-menu-button.p-column-filter-menu-button-active:hover {
952
+ background: var(--surface-brand-overlay);
953
+ color: var(--text-state-interactive);
954
+ }
955
+
956
+ .p-column-filter-clear-button {
957
+ width: 2rem;
958
+ height: 2rem;
959
+ color: var(--text-neutral-subdued);
960
+ border: 0 none;
961
+ background: transparent;
962
+ border-radius: var(--radius-full);
963
+ transition: background-color 0.2s, color 0.2s, box-shadow 0.2s;
964
+ }
965
+
966
+ .p-column-filter-clear-button:hover {
967
+ color: var(--text-neutral-loud);
968
+ border-color: transparent;
969
+ background: var(--surface-state-hover);
970
+ }
971
+
972
+ .p-column-filter-clear-button:focus-visible {
973
+ outline: 0 none;
974
+ outline-offset: 0;
975
+ box-shadow: 0 0 0 0.2rem var(--surface-brand-overlay);
976
+ }
977
+
978
+ .p-column-filter-row .p-column-filter-menu-button,
979
+ .p-column-filter-row .p-column-filter-clear-button {
980
+ margin-left: 0.5rem;
981
+ }
982
+
983
+ .p-column-filter-overlay {
984
+ background: var(--surface-neutral-primary);
985
+ color: var(--text-neutral-default);
986
+ border: 0 none;
987
+ border-radius: var(--radius-md);
988
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
989
+ min-width: 12.5rem;
990
+ }
991
+
992
+ .p-column-filter-overlay .p-column-filter-row-items {
993
+ padding: 0.75rem 0;
994
+ }
995
+
996
+ .p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item {
997
+ margin: 0;
998
+ padding: 0.75rem 1.25rem;
999
+ border: 0 none;
1000
+ color: var(--text-neutral-default);
1001
+ background: transparent;
1002
+ transition: box-shadow 0.2s;
1003
+ border-radius: 0;
1004
+ }
1005
+
1006
+ .p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:focus-visible {
1007
+ outline: 0 none;
1008
+ outline-offset: 0;
1009
+ box-shadow: inset 0 0 0 0.15rem var(--surface-brand-overlay);
1010
+ }
1011
+
1012
+ .p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item.p-highlight {
1013
+ color: var(--text-state-interactive);
1014
+ background: var(--surface-brand-overlay);
1015
+ }
1016
+
1017
+ .p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:not(.p-highlight, .p-disabled):hover {
1018
+ color: var(--text-neutral-default);
1019
+ background: var(--surface-state-hover);
1020
+ }
1021
+
1022
+ .p-column-filter-overlay .p-column-filter-row-items .p-column-filter-separator {
1023
+ border-top: 1px solid var(--border-neutral-subdued);
1024
+ margin: 0.25rem 0;
1025
+ }
1026
+
1027
+ .p-column-filter-overlay-menu .p-column-filter-operator {
1028
+ padding: 0.75rem 1.25rem;
1029
+ border-bottom: 1px solid var(--border-neutral-subdued);
1030
+ color: var(--text-neutral-loud);
1031
+ background: var(--surface-neutral-secondary);
1032
+ margin: 0;
1033
+ border-top-right-radius: var(--radius-md);
1034
+ border-top-left-radius: var(--radius-md);
1035
+ }
1036
+
1037
+ .p-column-filter-overlay-menu .p-column-filter-constraint {
1038
+ padding: 1.25rem;
1039
+ border-bottom: 1px solid var(--border-neutral-subdued);
1040
+ }
1041
+
1042
+ .p-column-filter-overlay-menu .p-column-filter-constraint .p-column-filter-matchmode-dropdown {
1043
+ margin-bottom: 0.5rem;
1044
+ }
1045
+
1046
+ .p-column-filter-overlay-menu .p-column-filter-constraint .p-column-filter-remove-button {
1047
+ margin-top: 0.5rem;
1048
+ }
1049
+
1050
+ .p-column-filter-overlay-menu .p-column-filter-constraint:last-child {
1051
+ border-bottom: 0 none;
1052
+ }
1053
+
1054
+ .p-column-filter-overlay-menu .p-column-filter-add-rule {
1055
+ padding: 0.75rem 1.25rem;
1056
+ }
1057
+
1058
+ .p-column-filter-overlay-menu .p-column-filter-buttonbar {
1059
+ padding: 1.25rem;
1060
+ }
@@ -46,6 +46,60 @@
46
46
  .p-inputnumber.p-invalid.p-component > .p-inputtext {
47
47
  border-color: var(--severity-danger-text);
48
48
  }
49
+ .p-icon-field {
50
+ position: relative;
51
+ }
52
+ .p-icon-field > .p-input-icon {
53
+ position: absolute;
54
+ top: 50%;
55
+ margin-top: -0.5rem;
56
+ }
57
+ .p-fluid .p-icon-field-left,
58
+ .p-fluid .p-icon-field-right {
59
+ width: 100%;
60
+ }
61
+ .p-icon-field-left > .p-input-icon:first-of-type {
62
+ left: 0.75rem;
63
+ color: var(--text-neutral-subdued);
64
+ }
65
+ .p-icon-field-right > .p-input-icon:last-of-type {
66
+ right: 0.75rem;
67
+ color: var(--text-neutral-subdued);
68
+ }
69
+ .p-icon-field-left > .p-inputtext {
70
+ padding-left: 2.5rem;
71
+ }
72
+ .p-icon-field-left.p-float-label > label {
73
+ left: 2.5rem;
74
+ }
75
+ .p-icon-field-right > .p-inputtext {
76
+ padding-right: 2.5rem;
77
+ }
78
+ .p-password.p-invalid.p-component > .p-inputtext {
79
+ border-color: var(--severity-danger-text);
80
+ }
81
+ .p-password-panel {
82
+ padding: 1.25rem;
83
+ background: var(--surface-neutral-primary);
84
+ color: var(--text-neutral-default);
85
+ border: 0 none;
86
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
87
+ border-radius: var(--radius-md);
88
+ }
89
+ .p-password-panel .p-password-meter {
90
+ margin-bottom: 0.5rem;
91
+ background: var(--surface-neutral-secondary);
92
+ border-radius: var(--radius-sm);
93
+ }
94
+ .p-password-panel .p-password-meter .p-password-strength.weak {
95
+ background: var(--severity-danger-text);
96
+ }
97
+ .p-password-panel .p-password-meter .p-password-strength.medium {
98
+ background: var(--severity-warning-text);
99
+ }
100
+ .p-password-panel .p-password-meter .p-password-strength.strong {
101
+ background: var(--severity-success-text);
102
+ }
49
103
  .p-inputgroup > .p-component,
50
104
  .p-inputgroup > .p-inputwrapper > .p-inputtext,
51
105
  .p-inputgroup > .p-float-label > .p-component {
@@ -487,6 +541,152 @@
487
541
  .p-dropdown.p-invalid.p-component {
488
542
  border-color: var(--severity-danger-text);
489
543
  }
544
+ .p-dropdown-panel {
545
+ background: var(--surface-neutral-primary);
546
+ color: var(--text-neutral-default);
547
+ border: 0 none;
548
+ border-radius: var(--radius-md);
549
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
550
+ }
551
+ .p-dropdown-panel .p-dropdown-header {
552
+ padding: 0.75rem 1.25rem;
553
+ border-bottom: 1px solid var(--border-neutral-subdued);
554
+ color: var(--text-neutral-loud);
555
+ background: var(--surface-neutral-secondary);
556
+ margin: 0;
557
+ border-top-right-radius: var(--radius-md);
558
+ border-top-left-radius: var(--radius-md);
559
+ }
560
+ .p-dropdown-panel .p-dropdown-header .p-dropdown-filter {
561
+ padding-right: 1.75rem;
562
+ margin-right: -1.75rem;
563
+ }
564
+ .p-dropdown-panel .p-dropdown-header .p-dropdown-filter-icon {
565
+ right: 0.75rem;
566
+ color: var(--text-neutral-subdued);
567
+ }
568
+ .p-dropdown-panel .p-dropdown-items {
569
+ padding: 0.75rem 0;
570
+ }
571
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item {
572
+ margin: 0;
573
+ padding: 0.75rem 1.25rem;
574
+ border: 0 none;
575
+ color: var(--text-neutral-default);
576
+ background: transparent;
577
+ transition: box-shadow 0.2s;
578
+ border-radius: 0;
579
+ }
580
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item:first-child {
581
+ margin-top: 0;
582
+ }
583
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item:last-child {
584
+ margin-bottom: 0;
585
+ }
586
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight {
587
+ color: var(--text-state-interactive);
588
+ background: var(--surface-brand-overlay);
589
+ }
590
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight.p-focus {
591
+ background: color-mix(in srgb, var(--surface-brand-primary) 24%, transparent);
592
+ }
593
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item:not(.p-highlight):not(.p-disabled).p-focus {
594
+ color: var(--text-neutral-default);
595
+ background: var(--surface-state-hover);
596
+ }
597
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item .p-dropdown-check-icon {
598
+ position: relative;
599
+ margin-left: -0.5rem;
600
+ margin-right: 0.5rem;
601
+ }
602
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-item-group {
603
+ margin: 0;
604
+ padding: 0.75rem 1.25rem;
605
+ color: var(--text-neutral-loud);
606
+ background: var(--surface-neutral-primary);
607
+ font-weight: 700;
608
+ }
609
+ .p-dropdown-panel .p-dropdown-items .p-dropdown-empty-message {
610
+ padding: 0.75rem 1.25rem;
611
+ color: var(--text-neutral-default);
612
+ background: transparent;
613
+ }
614
+ .p-autocomplete .p-autocomplete-loader {
615
+ right: 0.75rem;
616
+ }
617
+ .p-autocomplete.p-autocomplete-dd .p-autocomplete-loader {
618
+ right: 3.75rem;
619
+ }
620
+ .p-autocomplete .p-autocomplete-multiple-container {
621
+ padding: 0.375rem 0.75rem;
622
+ gap: 0.5rem;
623
+ }
624
+ .p-autocomplete .p-autocomplete-multiple-container:not(.p-disabled):hover {
625
+ border-color: var(--border-state-interactive);
626
+ }
627
+ .p-autocomplete .p-autocomplete-multiple-container:not(.p-disabled).p-focus {
628
+ outline: 0 none;
629
+ outline-offset: 0;
630
+ box-shadow: 0 0 0 0.2rem var(--surface-brand-overlay);
631
+ border-color: var(--border-state-interactive);
632
+ }
633
+ .p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-input-token {
634
+ padding: 0.375rem 0;
635
+ }
636
+ .p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-input-token input {
637
+ font-family: var(--font-family);
638
+ font-size: 1rem;
639
+ color: var(--text-neutral-default);
640
+ padding: 0;
641
+ margin: 0;
642
+ }
643
+ .p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-token {
644
+ padding: 0.375rem 0.75rem;
645
+ margin-right: 0.5rem;
646
+ background: var(--surface-brand-overlay);
647
+ color: var(--text-state-interactive);
648
+ border-radius: var(--radius-md);
649
+ }
650
+ .p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-token .p-autocomplete-token-icon {
651
+ margin-left: 0.5rem;
652
+ }
653
+ .p-autocomplete.p-invalid.p-component > .p-inputtext {
654
+ border-color: var(--severity-danger-text);
655
+ }
656
+ .p-autocomplete-panel {
657
+ background: var(--surface-neutral-primary);
658
+ color: var(--text-neutral-default);
659
+ border: 0 none;
660
+ border-radius: var(--radius-md);
661
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
662
+ }
663
+ .p-autocomplete-panel .p-autocomplete-items {
664
+ padding: 0.75rem 0;
665
+ }
666
+ .p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item {
667
+ margin: 0;
668
+ padding: 0.75rem 1.25rem;
669
+ border: 0 none;
670
+ color: var(--text-neutral-default);
671
+ background: transparent;
672
+ transition: box-shadow 0.2s;
673
+ border-radius: 0;
674
+ }
675
+ .p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item:hover {
676
+ color: var(--text-neutral-default);
677
+ background: var(--surface-state-hover);
678
+ }
679
+ .p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item.p-highlight {
680
+ color: var(--text-state-interactive);
681
+ background: var(--surface-brand-overlay);
682
+ }
683
+ .p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item-group {
684
+ margin: 0;
685
+ padding: 0.75rem 1.25rem;
686
+ color: var(--text-neutral-loud);
687
+ background: var(--surface-neutral-primary);
688
+ font-weight: 700;
689
+ }
490
690
  .p-multiselect {
491
691
  display: inline-flex;
492
692
  cursor: pointer;
@@ -602,6 +802,68 @@
602
802
  .p-treeselect.p-invalid.p-component {
603
803
  border-color: var(--severity-danger-text);
604
804
  }
805
+
806
+ /* TreeSelect Panel */
807
+ .p-treeselect-panel {
808
+ background: var(--surface-neutral-primary);
809
+ color: var(--text-neutral-default);
810
+ border: 0 none;
811
+ border-radius: var(--radius-md);
812
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
813
+ }
814
+ .p-treeselect-panel .p-treeselect-header {
815
+ padding: 0.75rem 1.25rem;
816
+ border-bottom: 1px solid var(--border-neutral-subdued);
817
+ color: var(--text-neutral-loud);
818
+ background: var(--surface-neutral-secondary);
819
+ margin: 0;
820
+ border-top-right-radius: var(--radius-md);
821
+ border-top-left-radius: var(--radius-md);
822
+ }
823
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container {
824
+ margin-right: 0.5rem;
825
+ }
826
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container .p-treeselect-filter {
827
+ padding-right: 1.75rem;
828
+ }
829
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container .p-treeselect-filter-icon {
830
+ right: 0.75rem;
831
+ color: var(--text-neutral-subdued);
832
+ }
833
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container.p-treeselect-clearable-filter .p-treeselect-filter {
834
+ padding-right: 3.5rem;
835
+ }
836
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-filter-container.p-treeselect-clearable-filter .p-treeselect-filter-clear-icon {
837
+ right: 2.5rem;
838
+ }
839
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-close {
840
+ width: 2rem;
841
+ height: 2rem;
842
+ color: var(--text-neutral-subdued);
843
+ border: 0 none;
844
+ background: transparent;
845
+ border-radius: var(--radius-full);
846
+ transition: background-color 0.2s, color 0.2s, box-shadow 0.2s;
847
+ }
848
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-close:focus-visible {
849
+ outline: 0 none;
850
+ outline-offset: 0;
851
+ box-shadow: 0 0 0 0.2rem var(--surface-brand-overlay);
852
+ }
853
+ .p-treeselect-panel .p-treeselect-header .p-treeselect-close:enabled:hover {
854
+ color: var(--text-neutral-loud);
855
+ border-color: transparent;
856
+ background: var(--surface-state-hover);
857
+ }
858
+ .p-treeselect-panel .p-treeselect-items-wrapper .p-tree {
859
+ border: 0 none;
860
+ }
861
+ .p-treeselect-panel .p-treeselect-items-wrapper .p-treeselect-empty-message {
862
+ padding: 0.75rem 1.25rem;
863
+ color: var(--text-neutral-default);
864
+ background: transparent;
865
+ }
866
+
605
867
  .p-cascadeselect {
606
868
  background: var(--text-onsurface-onbrand);
607
869
  border: 1px solid var(--border-neutral-subdued);
@@ -649,6 +911,47 @@
649
911
  .p-cascadeselect.p-invalid.p-component {
650
912
  border-color: var(--severity-danger-text);
651
913
  }
914
+ .p-cascadeselect-panel {
915
+ background: var(--surface-neutral-primary);
916
+ color: var(--text-neutral-default);
917
+ border: 0 none;
918
+ border-radius: var(--radius-md);
919
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
920
+ }
921
+ .p-cascadeselect-panel .p-cascadeselect-items {
922
+ padding: 0.75rem 0;
923
+ }
924
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item {
925
+ margin: 0;
926
+ border: 0 none;
927
+ color: var(--text-neutral-default);
928
+ background: transparent;
929
+ transition: box-shadow 0.2s;
930
+ border-radius: 0;
931
+ }
932
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item:first-child {
933
+ margin-top: 0;
934
+ }
935
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item:last-child {
936
+ margin-bottom: 0;
937
+ }
938
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item.p-highlight {
939
+ color: var(--text-state-interactive);
940
+ background: var(--surface-brand-overlay);
941
+ }
942
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item.p-highlight.p-focus {
943
+ background: color-mix(in srgb, var(--surface-brand-primary) 24%, transparent);
944
+ }
945
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item:not(.p-highlight):not(.p-disabled).p-focus {
946
+ color: var(--text-neutral-default);
947
+ background: var(--surface-state-hover);
948
+ }
949
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-item-content {
950
+ padding: 0.75rem 1.25rem;
951
+ }
952
+ .p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-group-icon {
953
+ font-size: 0.875rem;
954
+ }
652
955
  .p-listbox {
653
956
  background: var(--text-onsurface-onbrand);
654
957
  color: var(--text-neutral-subdued);
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Extended miscellaneous components
3
+ * Components not commonly used but part of PrimeReact
4
+ */
5
+
6
+ /* InputOTP */
7
+ .p-inputotp {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: 0.5rem;
11
+ }
12
+
13
+ .p-inputotp-input {
14
+ text-align: center;
15
+ width: 2.5rem;
16
+ }
17
+
18
+ /* Mention */
19
+ .p-mention-panel {
20
+ background: var(--surface-neutral-primary);
21
+ color: var(--text-neutral-default);
22
+ border: 0 none;
23
+ border-radius: var(--radius-md);
24
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
25
+ }
26
+
27
+ .p-mention-panel .p-mention-items {
28
+ padding: 0.75rem 0;
29
+ }
30
+
31
+ .p-mention-panel .p-mention-items .p-mention-item {
32
+ margin: 0;
33
+ padding: 0.75rem 1.25rem;
34
+ border: 0 none;
35
+ color: var(--text-neutral-default);
36
+ background: transparent;
37
+ transition: box-shadow 0.2s;
38
+ border-radius: 0;
39
+ }
40
+
41
+ .p-mention-panel .p-mention-items .p-mention-item:hover {
42
+ color: var(--text-neutral-default);
43
+ background: var(--surface-state-hover);
44
+ }
45
+
46
+ .p-mention-panel .p-mention-items .p-mention-item.p-highlight {
47
+ color: var(--text-state-interactive);
48
+ background: var(--surface-brand-overlay);
49
+ }
50
+
51
+ /* Toolbar */
52
+ .p-toolbar {
53
+ background: var(--surface-neutral-secondary);
54
+ border: 1px solid var(--border-neutral-subdued);
55
+ padding: 1.25rem;
56
+ border-radius: var(--radius-md);
57
+ gap: 0.5rem;
58
+ }
59
+
60
+ .p-toolbar .p-toolbar-separator {
61
+ margin: 0 0.5rem;
62
+ }
63
+
64
+ /* ConfirmPopup */
65
+ .p-confirm-popup {
66
+ background: var(--surface-neutral-primary);
67
+ color: var(--text-neutral-default);
68
+ border: 0 none;
69
+ border-radius: var(--radius-md);
70
+ box-shadow: 0 1px 3px rgb(0 0 0 / 30%);
71
+ }
72
+
73
+ .p-confirm-popup .p-confirm-popup-content {
74
+ padding: 1.25rem;
75
+ }
76
+
77
+ .p-confirm-popup .p-confirm-popup-footer {
78
+ text-align: right;
79
+ padding: 0 1.25rem 1.25rem 1.25rem;
80
+ }
81
+
82
+ .p-confirm-popup .p-confirm-popup-footer button {
83
+ margin: 0 0.5rem 0 0;
84
+ width: auto;
85
+ }
86
+
87
+ .p-confirm-popup .p-confirm-popup-footer button:last-child {
88
+ margin: 0;
89
+ }
90
+
91
+ .p-confirm-popup:after {
92
+ border: solid transparent;
93
+ border-color: rgb(255 255 255 / 0%);
94
+ border-bottom-color: var(--surface-neutral-primary);
95
+ }
96
+
97
+ .p-confirm-popup:before {
98
+ border: solid transparent;
99
+ border-color: rgb(255 255 255 / 0%);
100
+ border-bottom-color: var(--surface-neutral-primary);
101
+ }
102
+
103
+ .p-confirm-popup.p-confirm-popup-flipped:after {
104
+ border-top-color: var(--surface-neutral-primary);
105
+ }
106
+
107
+ .p-confirm-popup.p-confirm-popup-flipped:before {
108
+ border-top-color: var(--surface-neutral-primary);
109
+ }
110
+
111
+ .p-confirm-popup .p-confirm-popup-icon {
112
+ font-size: 1.5rem;
113
+ }
114
+
115
+ .p-confirm-popup .p-confirm-popup-icon.p-icon {
116
+ width: 1.5rem;
117
+ height: 1.5rem;
118
+ }
119
+
120
+ .p-confirm-popup .p-confirm-popup-message {
121
+ margin-left: 1rem;
122
+ }
123
+
124
+ /* ScrollTop */
125
+ .p-scrolltop {
126
+ width: 3rem;
127
+ height: 3rem;
128
+ border-radius: var(--radius-full);
129
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
130
+ transition: background-color 0.2s, color 0.2s, box-shadow 0.2s;
131
+ }
132
+
133
+ .p-scrolltop.p-link {
134
+ background: rgb(0 0 0 / 70%);
135
+ }
136
+
137
+ .p-scrolltop.p-link:hover {
138
+ background: rgb(0 0 0 / 80%);
139
+ }
140
+
141
+ .p-scrolltop .p-scrolltop-icon {
142
+ font-size: 1.5rem;
143
+ color: var(--surface-neutral-secondary);
144
+ }
145
+
146
+ .p-scrolltop .p-scrolltop-icon.p-icon {
147
+ width: 1.5rem;
148
+ height: 1.5rem;
149
+ }
150
+
151
+ /* DataScroller */
152
+ .p-datascroller .p-paginator-top {
153
+ border-width: 0 0 1px 0;
154
+ border-radius: 0;
155
+ }
156
+
157
+ .p-datascroller .p-paginator-bottom {
158
+ border-width: 0 0 1px 0;
159
+ border-radius: 0;
160
+ }
161
+
162
+ .p-datascroller .p-datascroller-header {
163
+ background: var(--surface-neutral-secondary);
164
+ color: var(--text-neutral-loud);
165
+ border: 1px solid var(--border-neutral-subdued);
166
+ border-width: 1px 0 1px 0;
167
+ padding: 1rem 1rem;
168
+ font-weight: 700;
169
+ }
170
+
171
+ .p-datascroller .p-datascroller-content {
172
+ background: var(--surface-neutral-primary);
173
+ color: var(--text-neutral-default);
174
+ border: 0 none;
175
+ padding: 0;
176
+ }
177
+
178
+ .p-datascroller.p-datascroller-inline .p-datascroller-list > li {
179
+ border: solid var(--border-neutral-subdued);
180
+ border-width: 0 0 1px 0;
181
+ }
182
+
183
+ .p-datascroller .p-datascroller-footer {
184
+ background: var(--surface-neutral-secondary);
185
+ color: var(--text-neutral-loud);
186
+ border: 1px solid var(--border-neutral-subdued);
187
+ border-width: 0 0 1px 0;
188
+ padding: 1rem 1rem;
189
+ font-weight: 700;
190
+ border-bottom-left-radius: var(--radius-md);
191
+ border-bottom-right-radius: var(--radius-md);
192
+ }
@@ -78,6 +78,15 @@
78
78
  .p-avatar.p-avatar-xl .p-avatar-icon {
79
79
  font-size: 2rem;
80
80
  }
81
+
82
+ .p-avatar-circle {
83
+ border-radius: var(--radius-full);
84
+ }
85
+
86
+ .p-avatar-group .p-avatar {
87
+ border: 2px solid var(--surface-neutral-primary);
88
+ }
89
+
81
90
  .p-chip {
82
91
  background-color: var(--surface-neutral-secondary);
83
92
  color: var(--text-neutral-default);
@@ -176,3 +176,37 @@
176
176
  .p-tooltip.p-tooltip-bottom .p-tooltip-arrow {
177
177
  border-bottom-color: var(--text-neutral-subdued);
178
178
  }
179
+
180
+ /* Component Overlay Transitions */
181
+ .p-component-overlay {
182
+ background-color: rgb(0 0 0 / 40%);
183
+ transition-duration: 0.2s;
184
+ }
185
+
186
+ .p-component-overlay-enter {
187
+ animation: p-component-overlay-enter-animation 150ms forwards;
188
+ }
189
+
190
+ .p-component-overlay-leave {
191
+ animation: p-component-overlay-leave-animation 150ms forwards;
192
+ }
193
+
194
+ @keyframes p-component-overlay-enter-animation {
195
+ from {
196
+ background-color: transparent;
197
+ }
198
+
199
+ to {
200
+ background-color: rgb(0 0 0 / 40%);
201
+ }
202
+ }
203
+
204
+ @keyframes p-component-overlay-leave-animation {
205
+ from {
206
+ background-color: rgb(0 0 0 / 40%);
207
+ }
208
+
209
+ to {
210
+ background-color: transparent;
211
+ }
212
+ }
@@ -13,3 +13,4 @@
13
13
  @import "./components/message.css";
14
14
  @import "./components/media.css";
15
15
  @import "./components/misc.css";
16
+ @import "./components/misc-extended.css";
@@ -0,0 +1,12 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_6670_42251)">
3
+ <path d="M-0.00186157 3H24.0019V21H-0.00186157V3Z" fill="#C8102E"/>
4
+ <path d="M7.71189 3H10.2844V21H7.71189V3Z" fill="white"/>
5
+ <path d="M-0.00186157 10.7137H24.0019V13.2863H-0.00186157V10.7137Z" fill="white"/>
6
+ </g>
7
+ <defs>
8
+ <clipPath id="clip0_6670_42251">
9
+ <rect width="24" height="24" fill="white"/>
10
+ </clipPath>
11
+ </defs>
12
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M0 3H24V21H0V3Z" fill="white"/>
3
+ <path d="M0 9.54375H24V14.4562H0V9.54375Z" fill="#002F6C"/>
4
+ <path d="M6.58125 3H11.49V21H6.5775L6.58125 3Z" fill="#002F6C"/>
5
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M0 3H24V21H0V3Z" fill="#ED2939"/>
3
+ <path d="M6.75 3H11.25V21H6.75V3Z" fill="white"/>
4
+ <path d="M0 9.75H24V14.25H0V9.75Z" fill="white"/>
5
+ <path d="M7.875 3H10.125V21H7.875V3Z" fill="#002664"/>
6
+ <path d="M0 10.875H24V13.125H0V10.875Z" fill="#002664"/>
7
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M0 3H24V21H0V3Z" fill="#005293"/>
3
+ <path d="M6.6 3V10.2H0V13.8H6.6V21H10.2V13.8H24V10.2H10.2V3H6.6Z" fill="#FECB00"/>
4
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M0 3H24V21H0V3Z" fill="#012169"/>
3
+ <path d="M2.8125 3L11.9625 9.7875L21.075 3H24V5.325L15 12.0375L24 18.7125V21H21L12 14.2875L3.0375 21H0V18.75L8.9625 12.075L0 5.4V3H2.8125Z" fill="white"/>
4
+ <path d="M15.9 13.5375L24 19.5V21L13.8375 13.5375H15.9ZM9 14.2875L9.225 15.6L2.025 21H0L9 14.2875ZM24 3V3.1125L14.6625 10.1625L14.7375 8.5125L22.125 3H24ZM0 3L8.9625 9.6H6.7125L0 4.575V3Z" fill="#C8102E"/>
5
+ <path d="M9.0375 3V21H15.0375V3H9.0375ZM0 9V15H24V9H0Z" fill="white"/>
6
+ <path d="M0 10.2375V13.8375H24V10.2375H0ZM10.2375 3V21H13.8375V3H10.2375Z" fill="#C8102E"/>
7
+ </svg>
@@ -122,6 +122,85 @@ Or use utility classes:
122
122
  <div className="shadow-4">High shadow</div>
123
123
  ```
124
124
 
125
+ ## ⚙️ PrimeReact Configuration
126
+
127
+ ### App Setup with PrimeReactProvider
128
+
129
+ Wrap your app with `PrimeReactProvider` to configure global settings:
130
+
131
+ ```tsx
132
+ import { PrimeReactProvider } from 'primereact/api';
133
+
134
+ function App() {
135
+ const primeConfig = {
136
+ ripple: true, // Enable ripple effect on buttons/clicks
137
+ inputStyle: 'outlined', // 'outlined' or 'filled'
138
+ locale: 'en', // Default locale
139
+ };
140
+
141
+ return (
142
+ <PrimeReactProvider value={primeConfig}>
143
+ {/* Your app content */}
144
+ </PrimeReactProvider>
145
+ );
146
+ }
147
+ ```
148
+
149
+ ### Ripple Effect
150
+
151
+ The ripple effect is **disabled by default**. Enable it for Material Design-style click animations:
152
+
153
+ ```tsx
154
+ <PrimeReactProvider value={{ ripple: true }}>
155
+ ```
156
+
157
+ **Supported components:**
158
+ - Button
159
+ - Checkbox
160
+ - RadioButton
161
+ - Dropdown items
162
+ - Menu items
163
+ - ListBox items
164
+
165
+ **Note:** The ripple effect is a JavaScript feature, not CSS. It's configured at the app level, not in the theme.
166
+
167
+ ### Input Style
168
+
169
+ Choose between outlined (default) or filled input styles:
170
+
171
+ ```tsx
172
+ // Outlined inputs (default) - border around input
173
+ <PrimeReactProvider value={{ inputStyle: 'outlined' }}>
174
+
175
+ // Filled inputs - filled background, bottom border only
176
+ <PrimeReactProvider value={{ inputStyle: 'filled' }}>
177
+ ```
178
+
179
+ ### Other Configuration Options
180
+
181
+ ```tsx
182
+ const primeConfig = {
183
+ ripple: true,
184
+ inputStyle: 'outlined',
185
+
186
+ // Append overlays to specific element (default: document.body)
187
+ appendTo: 'self', // or document.getElementById('overlays')
188
+
189
+ // Control z-index layering
190
+ zIndex: {
191
+ modal: 1100, // Modals
192
+ overlay: 1000, // Overlays/dropdowns
193
+ menu: 1000, // Menus
194
+ tooltip: 1100, // Tooltips
195
+ },
196
+
197
+ // Locale for date formatting, number formatting, etc.
198
+ locale: 'en',
199
+ };
200
+ ```
201
+
202
+ **Documentation:** [PrimeReact Configuration](https://primereact.org/configuration/)
203
+
125
204
  ## 🧩 Component Selection Guide
126
205
 
127
206
  ### Data Display
@@ -245,6 +324,42 @@ import { Card } from 'primereact/card';
245
324
  <Card>Content</Card>
246
325
  ```
247
326
 
327
+ ### 5. **CRITICAL: Applying Utility Classes to Components**
328
+ ```tsx
329
+ // ❌ DON'T DO THIS - Utility classes on components
330
+ <Button className="w-full block mt-4 p-4" label="Submit" />
331
+ <InputText className="text-lg font-bold" />
332
+ <DataTable className="my-8" value={data} />
333
+
334
+ // ✅ DO THIS INSTEAD - Use component props + wrapper
335
+ <div className="w-full mt-4"> {/* Utility classes on wrapper */}
336
+ <Button label="Submit" />
337
+ </div>
338
+
339
+ <div className="text-lg"> {/* Styling on wrapper */}
340
+ <InputText />
341
+ </div>
342
+ ```
343
+
344
+ **Why this matters:**
345
+ - ✅ **Components** are configured via **props** (size, variant, severity, etc.)
346
+ - ✅ **Utility classes** are for **layout/composition** (flex, grid, margins, width)
347
+ - ❌ Mixing utility classes with components breaks the design system
348
+ - ❌ Can cause unexpected visual bugs (icon misalignment, broken layouts)
349
+
350
+ **Correct approach:**
351
+ ```tsx
352
+ // ✅ Layout utilities on wrappers/containers
353
+ <div className="flex gap-4 w-full">
354
+ <Button label="Cancel" severity="secondary" />
355
+ <Button label="Submit" />
356
+ </div>
357
+
358
+ // ✅ Component configuration via props
359
+ <Button label="Large Button" size="large" />
360
+ <InputText placeholder="Text" className="w-full" /> {/* Width is OK */}
361
+ ```
362
+
248
363
  ## 🔍 Decision Tree for UI Development
249
364
 
250
365
  ```
@@ -0,0 +1,251 @@
1
+ # Prime Yggdrasil Theme Completeness Audit
2
+
3
+ **Date:** 2026-01-08
4
+ **Base Theme:** PrimeReact Lara Light Blue
5
+ **Status:** ⚠️ Incomplete - Missing ~141 CSS classes
6
+
7
+ ---
8
+
9
+ ## Executive Summary
10
+
11
+ ### PrimeReact Architecture
12
+
13
+ PrimeReact uses a **fully headless/unstyled architecture**:
14
+ - Components are React components with NO built-in styling
15
+ - `primereact.css` is deprecated/empty
16
+ - **Themes provide 100% of the styling** (layout, colors, spacing, positioning)
17
+ - This is by design - similar to Tailwind CSS or Headless UI
18
+
19
+ ### Current State
20
+
21
+ - **Lara theme:** 7,068 lines, 662 unique CSS classes
22
+ - **Yggdrasil theme:** 5,590 lines, 521 unique CSS classes
23
+ - **Missing:** ~1,500 lines, 141 CSS classes
24
+ - **Coverage:** ~79% complete
25
+
26
+ ---
27
+
28
+ ## Missing Components
29
+
30
+ ### Major Component Families Not Included
31
+
32
+ 1. **AutoComplete** - Searchable dropdown with autocomplete
33
+ 2. **ColorPicker** - Color selection component
34
+ 3. **DataScroller** - Infinite scroll data display
35
+ 4. **InputOTP** - One-time password input
36
+ 5. **Mention** - @mention autocomplete for text areas
37
+ 6. **ScrollTop** - Back-to-top button
38
+ 7. **Toolbar** - Action button toolbar
39
+ 8. **TreeSelect** - Tree structure selection (partial - base exists, but missing panel/overlay styles)
40
+
41
+ ### Missing Specialized Styles
42
+
43
+ - **Column Filter** - Advanced DataTable column filtering UI (40+ classes)
44
+ - **Confirm Popup** - Confirmation dialog positioning
45
+ - **Avatar Group** - Multiple avatar display
46
+ - **Component Overlay** - Enter/leave transitions
47
+ - **Button Contrast** - High contrast button variant
48
+ - **Error States** - Dedicated error styling
49
+
50
+ ---
51
+
52
+ ## What We DO Have (Well Covered)
53
+
54
+ ✅ **Forms:** InputText, Dropdown, MultiSelect, Checkbox, Radio, Slider, Rating, InputSwitch
55
+ ✅ **Buttons:** All variants, sizes, severities, outlined, text, raised, rounded
56
+ ✅ **Data:** DataTable, Paginator, Tree, TreeTable
57
+ ✅ **Panels:** Card, Accordion, TabView, Fieldset
58
+ ✅ **Overlays:** Dialog, Sidebar, Tooltip, ConfirmDialog
59
+ ✅ **Menus:** Menu, Menubar, ContextMenu, MegaMenu, Breadcrumb, Steps
60
+ ✅ **Messages:** Toast, Message, InlineMessage
61
+ ✅ **Media:** Carousel, Galleria, Image
62
+ ✅ **Misc:** Badge, Chip, Tag, Avatar (basic), ProgressBar, Skeleton
63
+ ✅ **Calendar/Date:** Full calendar component
64
+
65
+ ---
66
+
67
+ ## Recent Fixes
68
+
69
+ ### IconField Positioning (2026-01-08)
70
+
71
+ **Issue:** Password toggle icons, search icons, and all IconField icons were mispositioned
72
+
73
+ **Root Cause:** Missing IconField CSS positioning rules in theme
74
+
75
+ **Fix:** Added to `src/theme/components/form.css`:
76
+ ```css
77
+ .p-icon-field { position: relative; }
78
+ .p-icon-field > .p-input-icon { position: absolute; top: 50%; margin-top: -0.5rem; }
79
+ .p-icon-field-left > .p-input-icon:first-of-type { left: 0.75rem; }
80
+ .p-icon-field-right > .p-input-icon:last-of-type { right: 0.75rem; }
81
+ .p-icon-field-left > .p-inputtext { padding-left: 2.5rem; }
82
+ .p-icon-field-right > .p-inputtext { padding-right: 2.5rem; }
83
+ ```
84
+
85
+ **Impact:** Fixes Password, Search, Calendar icon positioning across all use cases
86
+
87
+ ---
88
+
89
+ ## Ripple Effect
90
+
91
+ **Status:** ❌ Not included (but not CSS-related)
92
+
93
+ The ripple effect is a **JavaScript feature**, not CSS. To enable:
94
+
95
+ ```tsx
96
+ import { PrimeReactProvider } from 'primereact/api';
97
+
98
+ function App() {
99
+ return (
100
+ <PrimeReactProvider value={{ ripple: true }}>
101
+ {/* Your app */}
102
+ </PrimeReactProvider>
103
+ );
104
+ }
105
+ ```
106
+
107
+ **Recommendation:** Add ripple configuration to the AI-AGENT-GUIDE.md with example code.
108
+
109
+ ---
110
+
111
+ ## Recommendations
112
+
113
+ ### Option 1: Complete Theme (Recommended for Production)
114
+
115
+ **Pros:**
116
+ - Full PrimeReact component coverage
117
+ - No missing components
118
+ - Better user experience
119
+
120
+ **Cons:**
121
+ - More CSS to maintain
122
+ - Larger bundle size
123
+
124
+ **Action Items:**
125
+ 1. Extract missing component styles from Lara theme
126
+ 2. Convert to semantic tokens
127
+ 3. Add to appropriate component category files
128
+ 4. Test each component in Storybook
129
+
130
+ **Estimated Effort:** 4-6 hours
131
+
132
+ ---
133
+
134
+ ### Option 2: As-Needed Addition
135
+
136
+ **Pros:**
137
+ - Smaller bundle size
138
+ - Only maintain what you use
139
+ - Faster initial development
140
+
141
+ **Cons:**
142
+ - Components break when first used
143
+ - Users need to report missing styles
144
+ - Inconsistent component coverage
145
+
146
+ **Current Approach:** This is what we're doing now
147
+
148
+ ---
149
+
150
+ ### Option 3: Document Supported Components
151
+
152
+ **Pros:**
153
+ - Clear expectations
154
+ - Intentional scope
155
+ - Maintain quality over quantity
156
+
157
+ **Cons:**
158
+ - Limited component set
159
+ - May not fit all use cases
160
+
161
+ **Action Items:**
162
+ 1. Create SUPPORTED-COMPONENTS.md
163
+ 2. List all tested/working components
164
+ 3. Mark unsupported components
165
+ 4. Provide workarounds or alternatives
166
+
167
+ ---
168
+
169
+ ## Missing Component Priority Assessment
170
+
171
+ ### High Priority (Common Use Cases)
172
+
173
+ 1. **AutoComplete** - Very common in search/filter UIs
174
+ 2. **Toolbar** - Standard in admin panels
175
+ 3. **Column Filter** - Essential for DataTable filtering
176
+ 4. **InputOTP** - Growing use for 2FA/authentication
177
+
178
+ ### Medium Priority (Specialized Features)
179
+
180
+ 5. **TreeSelect** panel/overlay - Complete the partial implementation
181
+ 6. **Confirm Popup** - Nice-to-have confirmation UX
182
+ 7. **ColorPicker** - Design tools, customization UIs
183
+
184
+ ### Low Priority (Niche Use Cases)
185
+
186
+ 8. **DataScroller** - Alternative to pagination (less common)
187
+ 9. **Mention** - Social/collaborative apps only
188
+ 10. **ScrollTop** - Nice-to-have UX enhancement
189
+
190
+ ---
191
+
192
+ ## Next Steps
193
+
194
+ ### Immediate Actions
195
+
196
+ 1. ✅ **Document ripple configuration** in AI-AGENT-GUIDE.md
197
+ 2. ✅ **Document IconField fix** for future reference
198
+ 3. ⏳ **Test current theme** in external project to identify critical gaps
199
+ 4. ⏳ **Create SUPPORTED-COMPONENTS.md** listing coverage
200
+
201
+ ### Short Term (Before Next Release)
202
+
203
+ 1. Add high-priority missing components (AutoComplete, Toolbar, Column Filter)
204
+ 2. Complete TreeSelect implementation
205
+ 3. Add component coverage tests
206
+ 4. Update documentation with component support matrix
207
+
208
+ ### Long Term
209
+
210
+ 1. Achieve 100% Lara theme parity
211
+ 2. Automated theme comparison tests
212
+ 3. CSS size optimization
213
+ 4. Component-specific documentation
214
+
215
+ ---
216
+
217
+ ## Testing Checklist
218
+
219
+ When testing theme completeness in external projects:
220
+
221
+ - [ ] All form inputs render correctly
222
+ - [ ] Icons position correctly (IconField, Password, etc.)
223
+ - [ ] DataTable with filtering works
224
+ - [ ] Overlay components position correctly
225
+ - [ ] Buttons have all variants
226
+ - [ ] No console errors about missing CSS
227
+ - [ ] Dark mode works across all components
228
+ - [ ] Responsive behavior works
229
+ - [ ] Semantic tokens apply correctly
230
+
231
+ ---
232
+
233
+ ## Files Modified Today
234
+
235
+ 1. `src/theme/components/form.css` - Added IconField positioning
236
+ 2. `src/stories/Password.stories.tsx` - Added Password component examples
237
+ 3. `src/stories/IconField.stories.tsx` - Added IconField examples
238
+
239
+ ---
240
+
241
+ ## Conclusion
242
+
243
+ **The Lara theme IS complete and self-contained.** Our Yggdrasil theme is based on it but we only extracted ~79% of the component styles during the initial conversion.
244
+
245
+ **The good news:** We have all the core components that most apps need (forms, tables, dialogs, menus).
246
+
247
+ **The gap:** Specialized components (AutoComplete, ColorPicker, etc.) are missing.
248
+
249
+ **The fix:** Extract missing components from Lara theme as needed, or do a complete extraction for 100% coverage.
250
+
251
+ The IconField issue we just fixed is exactly this pattern - a component style that exists in Lara but wasn't included in our initial extraction.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeonlars/prime-yggdrasil",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "description": "AI-agent-friendly PrimeReact design system for component-driven development with semantic tokens and dark mode support",
6
6
  "keywords": [