@tangle-network/brand 1.25.1 → 1.26.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.26.1
4
+
5
+ ### Patch Changes
6
+
7
+ - e14783a: The shipped drift baseline lowers `settings_layout` from each default branch after the apps adopted agent-app `settings-react`: gtm, tax, legal, creative, browser and builder record 0, hospitality 3 (was 5) and blueprint 3 (was 4).
8
+
9
+ ## 1.26.0
10
+
11
+ ### Minor Changes
12
+
13
+ - c7e7664: `tangle-drift` gates `settings_layout`: settings page files (route or page modules whose path names settings, or files named for their settings, such as `BusinessSettings.tsx` or `SettingsTab.tsx`) that import nothing from `@tangle-network/agent-app/settings-react` and sit under no settings layout that does. Only a layout covers its children (a Next.js `layout`, a flat route parent or a `route.tsx` folder route); a composing `page` or `index` covers only itself. Cards, sections, dialogs, hooks, menus and buttons are not pages. The shipped baseline records each surface's count from its default branch, so new local settings pages fail a consumer's gate and the count only falls as apps adopt the shared settings layout.
14
+
3
15
  ## 1.25.1
4
16
 
5
17
  ### Patch Changes
@@ -95,7 +95,8 @@
95
95
  "src/components/quickstart-code.css": 2,
96
96
  "src/pages/index.astro": 1
97
97
  },
98
- "transcript_type_override": {}
98
+ "transcript_type_override": {},
99
+ "settings_layout": {}
99
100
  },
100
101
  "raw_palette": 0,
101
102
  "hex": 29,
@@ -111,7 +112,8 @@
111
112
  "header_height_literal": 4,
112
113
  "transcript_type_override": 0,
113
114
  "palette_top": [],
114
- "local_primitives": {}
115
+ "local_primitives": {},
116
+ "settings_layout": 0
115
117
  },
116
118
  "sandbox": {
117
119
  "repo": "tangle-network/agent-container",
@@ -217,7 +219,11 @@
217
219
  "products/sandbox/web/src/pages/dashboard/sandbox-session/AgentWorkspace.tsx": 6
218
220
  },
219
221
  "header_height_literal": {},
220
- "transcript_type_override": {}
222
+ "transcript_type_override": {},
223
+ "settings_layout": {
224
+ "products/sandbox/web/src/pages/dashboard/Settings.tsx": 1,
225
+ "products/sandbox/web/src/pages/dashboard/sandbox-session/SettingsTab.tsx": 1
226
+ }
221
227
  },
222
228
  "raw_palette": 0,
223
229
  "hex": 21,
@@ -233,7 +239,8 @@
233
239
  "palette_top": [],
234
240
  "local_primitives": {},
235
241
  "header_height_literal": 0,
236
- "transcript_type_override": 0
242
+ "transcript_type_override": 0,
243
+ "settings_layout": 2
237
244
  },
238
245
  "platform": {
239
246
  "repo": "tangle-network/agent-container",
@@ -471,7 +478,8 @@
471
478
  "products/platform/web/src/client/components/NavigationFrame.tsx": 1,
472
479
  "products/platform/web/src/client/vault.css": 1
473
480
  },
474
- "transcript_type_override": {}
481
+ "transcript_type_override": {},
482
+ "settings_layout": {}
475
483
  },
476
484
  "raw_palette": 0,
477
485
  "hex": 24,
@@ -494,7 +502,8 @@
494
502
  "page_heading": 37,
495
503
  "shell_override": 1,
496
504
  "header_height_literal": 2,
497
- "transcript_type_override": 0
505
+ "transcript_type_override": 0,
506
+ "settings_layout": 0
498
507
  },
499
508
  "intelligence": {
500
509
  "repo": "tangle-network/agent-container",
@@ -502,7 +511,7 @@
502
511
  "products/intelligence/web"
503
512
  ],
504
513
  "branch": "develop",
505
- "head": "b2753f3761c4",
514
+ "head": "315aa36750ea",
506
515
  "tsx_files": 83,
507
516
  "css_files": 1,
508
517
  "versions": {
@@ -583,7 +592,10 @@
583
592
  },
584
593
  "shell_override": {},
585
594
  "header_height_literal": {},
586
- "transcript_type_override": {}
595
+ "transcript_type_override": {},
596
+ "settings_layout": {
597
+ "products/intelligence/web/src/pages/Settings.tsx": 1
598
+ }
587
599
  },
588
600
  "raw_palette": 0,
589
601
  "hex": 0,
@@ -598,6 +610,7 @@
598
610
  "shell_override": 0,
599
611
  "header_height_literal": 0,
600
612
  "transcript_type_override": 0,
613
+ "settings_layout": 1,
601
614
  "palette_top": [],
602
615
  "local_primitives": {}
603
616
  },
@@ -607,35 +620,35 @@
607
620
  ""
608
621
  ],
609
622
  "branch": "master",
610
- "head": "c84c3887366d",
611
- "tsx_files": 134,
623
+ "head": "41bfb73951a0",
624
+ "tsx_files": 144,
612
625
  "css_files": 3,
613
626
  "versions": {
614
627
  "agent-app": [
615
- "0.60.80"
628
+ "0.60.185"
616
629
  ],
617
630
  "brand": [
618
- "1.22.0"
631
+ "1.26.0"
619
632
  ],
620
633
  "sandbox-ui": [
621
- "0.133.1"
634
+ "0.134.10"
622
635
  ],
623
636
  "ui": [
624
- "11.32.1"
637
+ "11.40.0"
625
638
  ]
626
639
  },
627
640
  "importing_files": {
628
641
  "brand": 3,
629
- "ui": 10,
630
- "sandbox-ui": 115,
631
- "agent-app": 233
642
+ "ui": 21,
643
+ "sandbox-ui": 112,
644
+ "agent-app": 273
632
645
  },
633
646
  "by_file": {
634
647
  "raw_palette": {},
635
648
  "hex": {},
636
649
  "arbitrary_color": {},
637
650
  "css_var_defs": {
638
- "src/app.css": 58
651
+ "src/app.css": 56
639
652
  },
640
653
  "local_primitive_count": {},
641
654
  "font_size_literal": {
@@ -648,6 +661,7 @@
648
661
  "src/routes/app.workspace.onboarding.tsx": 4
649
662
  },
650
663
  "page_heading": {
664
+ "src/components/access-refusal.tsx": 1,
651
665
  "src/components/workspace-terminal-panel.tsx": 2,
652
666
  "src/root.tsx": 1,
653
667
  "src/routes/_index.tsx": 1,
@@ -655,9 +669,7 @@
655
669
  "src/routes/agents.consent.tsx": 1,
656
670
  "src/routes/app.workspace.agents.tsx": 1,
657
671
  "src/routes/app.workspace.designs.$documentId.tsx": 1,
658
- "src/routes/app.workspace.review.tsx": 1,
659
672
  "src/routes/app.workspace.sequences.$sequenceId.tsx": 1,
660
- "src/routes/app.workspace.settings.tsx": 1,
661
673
  "src/routes/app.workspace.studio.tsx": 1,
662
674
  "src/routes/app.workspace.vault.tsx": 1,
663
675
  "src/routes/forgot-password.tsx": 2,
@@ -668,21 +680,23 @@
668
680
  "src/routes/app.workspace.vault.tsx": 2
669
681
  },
670
682
  "header_height_literal": {},
671
- "transcript_type_override": {}
683
+ "transcript_type_override": {},
684
+ "settings_layout": {}
672
685
  },
673
686
  "raw_palette": 0,
674
687
  "hex": 0,
675
688
  "arbitrary_color": 0,
676
- "css_var_defs": 58,
689
+ "css_var_defs": 56,
677
690
  "local_primitive_count": 0,
678
691
  "font_size_literal": 3,
679
692
  "size_literal": 0,
680
693
  "native_control": 0,
681
694
  "control_override": 4,
682
- "page_heading": 18,
695
+ "page_heading": 17,
683
696
  "shell_override": 4,
684
697
  "header_height_literal": 0,
685
698
  "transcript_type_override": 0,
699
+ "settings_layout": 0,
686
700
  "palette_top": [],
687
701
  "local_primitives": {}
688
702
  },
@@ -692,40 +706,40 @@
692
706
  "apps/web"
693
707
  ],
694
708
  "branch": "main",
695
- "head": "d88f237a23f2",
696
- "tsx_files": 58,
709
+ "head": "b173739f0721",
710
+ "tsx_files": 63,
697
711
  "css_files": 1,
698
712
  "versions": {
699
713
  "agent-app": [
700
- "0.60.72"
714
+ "0.60.185"
701
715
  ],
702
716
  "brand": [
703
- "1.22.0"
717
+ "1.26.0"
704
718
  ],
705
719
  "override:agent-app": [
706
- "0.60.72"
720
+ "0.60.185"
707
721
  ],
708
722
  "override:brand": [
709
- "1.22.0"
723
+ "1.26.0"
710
724
  ],
711
725
  "override:sandbox-ui": [
712
- "0.133.1"
726
+ "0.134.10"
713
727
  ],
714
728
  "override:ui": [
715
- "11.32.1"
729
+ "11.40.0"
716
730
  ],
717
731
  "sandbox-ui": [
718
- "0.133.1"
732
+ "0.134.10"
719
733
  ],
720
734
  "ui": [
721
- "11.32.1"
735
+ "11.40.0"
722
736
  ]
723
737
  },
724
738
  "importing_files": {
725
739
  "brand": 1,
726
- "ui": 4,
727
- "sandbox-ui": 39,
728
- "agent-app": 108
740
+ "ui": 11,
741
+ "sandbox-ui": 40,
742
+ "agent-app": 113
729
743
  },
730
744
  "by_file": {
731
745
  "raw_palette": {},
@@ -749,7 +763,8 @@
749
763
  },
750
764
  "shell_override": {},
751
765
  "header_height_literal": {},
752
- "transcript_type_override": {}
766
+ "transcript_type_override": {},
767
+ "settings_layout": {}
753
768
  },
754
769
  "raw_palette": 0,
755
770
  "hex": 0,
@@ -764,6 +779,7 @@
764
779
  "shell_override": 0,
765
780
  "header_height_literal": 0,
766
781
  "transcript_type_override": 0,
782
+ "settings_layout": 0,
767
783
  "palette_top": [],
768
784
  "local_primitives": {}
769
785
  },
@@ -773,28 +789,28 @@
773
789
  ""
774
790
  ],
775
791
  "branch": "main",
776
- "head": "d8c3ecca3a72",
777
- "tsx_files": 63,
792
+ "head": "e69e39fa4a67",
793
+ "tsx_files": 65,
778
794
  "css_files": 1,
779
795
  "versions": {
780
796
  "agent-app": [
781
- "0.60.72"
797
+ "0.60.185"
782
798
  ],
783
799
  "brand": [
784
- "1.22.0"
800
+ "1.26.0"
785
801
  ],
786
802
  "sandbox-ui": [
787
- "0.133.1"
803
+ "0.134.10"
788
804
  ],
789
805
  "ui": [
790
- "11.32.1"
806
+ "11.40.0"
791
807
  ]
792
808
  },
793
809
  "importing_files": {
794
810
  "brand": 2,
795
- "ui": 33,
811
+ "ui": 34,
796
812
  "sandbox-ui": 26,
797
- "agent-app": 128
813
+ "agent-app": 140
798
814
  },
799
815
  "by_file": {
800
816
  "raw_palette": {},
@@ -819,7 +835,8 @@
819
835
  },
820
836
  "shell_override": {},
821
837
  "header_height_literal": {},
822
- "transcript_type_override": {}
838
+ "transcript_type_override": {},
839
+ "settings_layout": {}
823
840
  },
824
841
  "raw_palette": 0,
825
842
  "hex": 0,
@@ -834,6 +851,7 @@
834
851
  "shell_override": 0,
835
852
  "header_height_literal": 0,
836
853
  "transcript_type_override": 0,
854
+ "settings_layout": 0,
837
855
  "palette_top": [],
838
856
  "local_primitives": {}
839
857
  },
@@ -878,7 +896,7 @@
878
896
  "src/routes/app.workspace.vault.tsx": 2
879
897
  },
880
898
  "hex": {
881
- "src/app.css": 110,
899
+ "src/app.css": 99,
882
900
  "src/root.tsx": 2,
883
901
  "src/routes/_index.tsx": 6,
884
902
  "src/routes/app.workspace._index.tsx": 2,
@@ -913,10 +931,13 @@
913
931
  },
914
932
  "shell_override": {},
915
933
  "header_height_literal": {},
916
- "transcript_type_override": {}
934
+ "transcript_type_override": {},
935
+ "settings_layout": {
936
+ "src/routes/app.workspace.settings.tsx": 1
937
+ }
917
938
  },
918
939
  "raw_palette": 72,
919
- "hex": 148,
940
+ "hex": 137,
920
941
  "arbitrary_color": 0,
921
942
  "css_var_defs": 183,
922
943
  "local_primitive_count": 0,
@@ -928,6 +949,7 @@
928
949
  "shell_override": 0,
929
950
  "header_height_literal": 0,
930
951
  "transcript_type_override": 0,
952
+ "settings_layout": 1,
931
953
  "palette_top": [
932
954
  [
933
955
  "text-amber-600",
@@ -962,28 +984,28 @@
962
984
  ""
963
985
  ],
964
986
  "branch": "master",
965
- "head": "20b11756ba9d",
966
- "tsx_files": 52,
987
+ "head": "05bc326b9307",
988
+ "tsx_files": 56,
967
989
  "css_files": 1,
968
990
  "versions": {
969
991
  "agent-app": [
970
- "0.60.83"
992
+ "0.60.185"
971
993
  ],
972
994
  "brand": [
973
- "1.22.0"
995
+ "1.26.0"
974
996
  ],
975
997
  "sandbox-ui": [
976
- "0.133.1"
998
+ "0.134.10"
977
999
  ],
978
1000
  "ui": [
979
- "11.32.1"
1001
+ "11.40.0"
980
1002
  ]
981
1003
  },
982
1004
  "importing_files": {
983
1005
  "brand": 1,
984
- "ui": 2,
985
- "sandbox-ui": 38,
986
- "agent-app": 134
1006
+ "ui": 6,
1007
+ "sandbox-ui": 41,
1008
+ "agent-app": 141
987
1009
  },
988
1010
  "by_file": {
989
1011
  "raw_palette": {},
@@ -1009,7 +1031,8 @@
1009
1031
  },
1010
1032
  "shell_override": {},
1011
1033
  "header_height_literal": {},
1012
- "transcript_type_override": {}
1034
+ "transcript_type_override": {},
1035
+ "settings_layout": {}
1013
1036
  },
1014
1037
  "raw_palette": 0,
1015
1038
  "hex": 0,
@@ -1024,6 +1047,7 @@
1024
1047
  "shell_override": 0,
1025
1048
  "header_height_literal": 0,
1026
1049
  "transcript_type_override": 0,
1050
+ "settings_layout": 0,
1027
1051
  "palette_top": [],
1028
1052
  "local_primitives": {}
1029
1053
  },
@@ -1033,35 +1057,36 @@
1033
1057
  "apps/web"
1034
1058
  ],
1035
1059
  "branch": "main",
1036
- "head": "6b1b12e7f8f6",
1060
+ "head": "4a22164424ed",
1037
1061
  "tsx_files": 18,
1038
1062
  "css_files": 7,
1039
1063
  "versions": {
1040
1064
  "agent-app": [
1041
- "0.60.84"
1065
+ "0.60.120",
1066
+ "0.60.134"
1042
1067
  ],
1043
1068
  "brand": [
1044
- "1.22.0"
1069
+ "1.24.1"
1045
1070
  ],
1046
1071
  "override:brand": [
1047
- "1.22.0"
1072
+ "1.24.1"
1048
1073
  ],
1049
1074
  "override:sandbox-ui": [
1050
- "0.133.1"
1075
+ "0.133.8"
1051
1076
  ],
1052
1077
  "override:ui": [
1053
- "11.32.1"
1078
+ "11.33.0"
1054
1079
  ],
1055
1080
  "sandbox-ui": [
1056
- "0.133.1"
1081
+ "0.133.8"
1057
1082
  ],
1058
1083
  "ui": [
1059
- "11.32.1"
1084
+ "11.33.0"
1060
1085
  ]
1061
1086
  },
1062
1087
  "importing_files": {
1063
1088
  "brand": 1,
1064
- "ui": 8,
1089
+ "ui": 13,
1065
1090
  "sandbox-ui": 6,
1066
1091
  "agent-app": 7
1067
1092
  },
@@ -1079,7 +1104,7 @@
1079
1104
  "apps/web/src/assembly/AssemblyBooklet.tsx": 9,
1080
1105
  "apps/web/src/canvas/NodeInspector.tsx": 8,
1081
1106
  "apps/web/src/canvas/SystemDiagramCanvas.tsx": 1,
1082
- "apps/web/src/styles.css": 190,
1107
+ "apps/web/src/styles.css": 181,
1083
1108
  "apps/web/src/styles/assembly.css": 21,
1084
1109
  "apps/web/src/styles/canvas-nodes.css": 8,
1085
1110
  "apps/web/src/styles/composer.css": 13,
@@ -1091,7 +1116,6 @@
1091
1116
  "apps/web/src/ApiKeysPanel.tsx": 5,
1092
1117
  "apps/web/src/App.tsx": 6,
1093
1118
  "apps/web/src/CaptureWorkspace.tsx": 7,
1094
- "apps/web/src/ErrorBoundary.tsx": 1,
1095
1119
  "apps/web/src/Markdown.tsx": 1,
1096
1120
  "apps/web/src/PreparedActions.tsx": 10,
1097
1121
  "apps/web/src/assembly/AssemblyBooklet.tsx": 3,
@@ -1106,21 +1130,23 @@
1106
1130
  },
1107
1131
  "shell_override": {},
1108
1132
  "header_height_literal": {},
1109
- "transcript_type_override": {}
1133
+ "transcript_type_override": {},
1134
+ "settings_layout": {}
1110
1135
  },
1111
1136
  "raw_palette": 0,
1112
1137
  "hex": 0,
1113
1138
  "arbitrary_color": 0,
1114
1139
  "css_var_defs": 1,
1115
1140
  "local_primitive_count": 0,
1116
- "font_size_literal": 285,
1141
+ "font_size_literal": 276,
1117
1142
  "size_literal": 0,
1118
- "native_control": 52,
1143
+ "native_control": 51,
1119
1144
  "control_override": 0,
1120
1145
  "page_heading": 1,
1121
1146
  "shell_override": 0,
1122
1147
  "header_height_literal": 0,
1123
1148
  "transcript_type_override": 0,
1149
+ "settings_layout": 0,
1124
1150
  "palette_top": [],
1125
1151
  "local_primitives": {}
1126
1152
  },
@@ -1130,28 +1156,28 @@
1130
1156
  ""
1131
1157
  ],
1132
1158
  "branch": "main",
1133
- "head": "15d54650c9e6",
1134
- "tsx_files": 32,
1135
- "css_files": 12,
1159
+ "head": "b094a583ee4a",
1160
+ "tsx_files": 38,
1161
+ "css_files": 11,
1136
1162
  "versions": {
1137
1163
  "agent-app": [
1138
- "0.60.83"
1164
+ "0.60.186"
1139
1165
  ],
1140
1166
  "brand": [
1141
- "1.22.0"
1167
+ "1.26.0"
1142
1168
  ],
1143
1169
  "sandbox-ui": [
1144
- "0.133.1"
1170
+ "0.134.10"
1145
1171
  ],
1146
1172
  "ui": [
1147
- "11.32.1"
1173
+ "11.40.0"
1148
1174
  ]
1149
1175
  },
1150
1176
  "importing_files": {
1151
1177
  "brand": 0,
1152
- "ui": 3,
1153
- "sandbox-ui": 31,
1154
- "agent-app": 65
1178
+ "ui": 5,
1179
+ "sandbox-ui": 33,
1180
+ "agent-app": 76
1155
1181
  },
1156
1182
  "by_file": {
1157
1183
  "raw_palette": {},
@@ -1162,7 +1188,6 @@
1162
1188
  "font_size_literal": {
1163
1189
  "src/resetos/resetos.css": 30,
1164
1190
  "src/ui/operator-dashboard.css": 33,
1165
- "src/web/agent-profile-settings.css": 1,
1166
1191
  "src/web/workspace.css": 1
1167
1192
  },
1168
1193
  "size_literal": {},
@@ -1178,14 +1203,19 @@
1178
1203
  },
1179
1204
  "shell_override": {},
1180
1205
  "header_height_literal": {},
1181
- "transcript_type_override": {}
1206
+ "transcript_type_override": {},
1207
+ "settings_layout": {
1208
+ "src/web/GuestGuidebookSettings.tsx": 1,
1209
+ "src/web/PhoneLineSettings.tsx": 1,
1210
+ "src/web/SummarySettings.tsx": 1
1211
+ }
1182
1212
  },
1183
1213
  "raw_palette": 0,
1184
1214
  "hex": 0,
1185
1215
  "arbitrary_color": 0,
1186
1216
  "css_var_defs": 0,
1187
1217
  "local_primitive_count": 0,
1188
- "font_size_literal": 65,
1218
+ "font_size_literal": 64,
1189
1219
  "size_literal": 0,
1190
1220
  "native_control": 0,
1191
1221
  "control_override": 0,
@@ -1193,6 +1223,7 @@
1193
1223
  "shell_override": 0,
1194
1224
  "header_height_literal": 0,
1195
1225
  "transcript_type_override": 0,
1226
+ "settings_layout": 3,
1196
1227
  "palette_top": [],
1197
1228
  "local_primitives": {}
1198
1229
  },
@@ -1202,7 +1233,7 @@
1202
1233
  "packages/website"
1203
1234
  ],
1204
1235
  "branch": "main",
1205
- "head": "f15b7f2a883d",
1236
+ "head": "24f56e7de979",
1206
1237
  "tsx_files": 26,
1207
1238
  "css_files": 1,
1208
1239
  "versions": {
@@ -1280,7 +1311,8 @@
1280
1311
  "packages/website/src/components/RedteamDashboardLayout.tsx": 4
1281
1312
  },
1282
1313
  "header_height_literal": {},
1283
- "transcript_type_override": {}
1314
+ "transcript_type_override": {},
1315
+ "settings_layout": {}
1284
1316
  },
1285
1317
  "raw_palette": 0,
1286
1318
  "hex": 0,
@@ -1295,6 +1327,7 @@
1295
1327
  "shell_override": 4,
1296
1328
  "header_height_literal": 0,
1297
1329
  "transcript_type_override": 0,
1330
+ "settings_layout": 0,
1298
1331
  "palette_top": [],
1299
1332
  "local_primitives": {}
1300
1333
  },
@@ -1304,28 +1337,28 @@
1304
1337
  ""
1305
1338
  ],
1306
1339
  "branch": "main",
1307
- "head": "c3ca6f919e26",
1308
- "tsx_files": 43,
1340
+ "head": "ca95d9366843",
1341
+ "tsx_files": 48,
1309
1342
  "css_files": 1,
1310
1343
  "versions": {
1311
1344
  "agent-app": [
1312
- "^0.57.2"
1345
+ "0.60.185"
1313
1346
  ],
1314
1347
  "brand": [
1315
- "^1.17.0"
1348
+ "^1.26.0"
1316
1349
  ],
1317
1350
  "sandbox-ui": [
1318
- "^0.127.4"
1351
+ "^0.134.10"
1319
1352
  ],
1320
1353
  "ui": [
1321
- "^11.24.0"
1354
+ "^11.40.0"
1322
1355
  ]
1323
1356
  },
1324
1357
  "importing_files": {
1325
1358
  "brand": 0,
1326
- "ui": 41,
1359
+ "ui": 44,
1327
1360
  "sandbox-ui": 0,
1328
- "agent-app": 0
1361
+ "agent-app": 5
1329
1362
  },
1330
1363
  "by_file": {
1331
1364
  "raw_palette": {},
@@ -1350,8 +1383,7 @@
1350
1383
  },
1351
1384
  "size_literal": {
1352
1385
  "src/components/chat/chat-panel.tsx": 1,
1353
- "src/pages/run-detail.tsx": 1,
1354
- "src/pages/settings.tsx": 1
1386
+ "src/pages/run-detail.tsx": 1
1355
1387
  },
1356
1388
  "native_control": {
1357
1389
  "src/components/chat/chat-panel.tsx": 3,
@@ -1377,7 +1409,8 @@
1377
1409
  "src/components/layout/app-layout.tsx": 4
1378
1410
  },
1379
1411
  "header_height_literal": {},
1380
- "transcript_type_override": {}
1412
+ "transcript_type_override": {},
1413
+ "settings_layout": {}
1381
1414
  },
1382
1415
  "raw_palette": 0,
1383
1416
  "hex": 0,
@@ -1385,13 +1418,14 @@
1385
1418
  "css_var_defs": 1,
1386
1419
  "local_primitive_count": 0,
1387
1420
  "font_size_literal": 26,
1388
- "size_literal": 3,
1421
+ "size_literal": 2,
1389
1422
  "native_control": 16,
1390
1423
  "control_override": 10,
1391
1424
  "page_heading": 1,
1392
1425
  "shell_override": 4,
1393
1426
  "header_height_literal": 0,
1394
1427
  "transcript_type_override": 0,
1428
+ "settings_layout": 0,
1395
1429
  "palette_top": [],
1396
1430
  "local_primitives": {}
1397
1431
  },
@@ -1401,40 +1435,40 @@
1401
1435
  ""
1402
1436
  ],
1403
1437
  "branch": "main",
1404
- "head": "2df6a86bcc28",
1405
- "tsx_files": 110,
1438
+ "head": "8a10f63e0948",
1439
+ "tsx_files": 123,
1406
1440
  "css_files": 2,
1407
1441
  "versions": {
1408
1442
  "agent-app": [
1409
- "0.60.72"
1443
+ "0.60.187"
1410
1444
  ],
1411
1445
  "brand": [
1412
- "1.22.0"
1446
+ "1.26.0"
1413
1447
  ],
1414
1448
  "override:agent-app": [
1415
- "0.60.72"
1449
+ "0.60.187"
1416
1450
  ],
1417
1451
  "override:brand": [
1418
- "1.22.0"
1452
+ "1.26.0"
1419
1453
  ],
1420
1454
  "override:sandbox-ui": [
1421
- "0.133.1"
1455
+ "0.134.10"
1422
1456
  ],
1423
1457
  "override:ui": [
1424
- "11.32.1"
1458
+ "11.40.0"
1425
1459
  ],
1426
1460
  "sandbox-ui": [
1427
- "0.133.1"
1461
+ "0.134.10"
1428
1462
  ],
1429
1463
  "ui": [
1430
- "11.32.1"
1464
+ "11.40.0"
1431
1465
  ]
1432
1466
  },
1433
1467
  "importing_files": {
1434
1468
  "brand": 2,
1435
- "ui": 4,
1469
+ "ui": 19,
1436
1470
  "sandbox-ui": 78,
1437
- "agent-app": 69
1471
+ "agent-app": 87
1438
1472
  },
1439
1473
  "by_file": {
1440
1474
  "raw_palette": {},
@@ -1447,7 +1481,7 @@
1447
1481
  "src/components/agent-rune.tsx": 1,
1448
1482
  "src/components/chat-launch.tsx": 1,
1449
1483
  "src/routes/app.launch.$agentId.tsx": 2,
1450
- "src/styles/listing.css": 45
1484
+ "src/styles/listing.css": 27
1451
1485
  },
1452
1486
  "size_literal": {},
1453
1487
  "native_control": {
@@ -1472,14 +1506,15 @@
1472
1506
  },
1473
1507
  "shell_override": {},
1474
1508
  "header_height_literal": {},
1475
- "transcript_type_override": {}
1509
+ "transcript_type_override": {},
1510
+ "settings_layout": {}
1476
1511
  },
1477
1512
  "raw_palette": 0,
1478
1513
  "hex": 0,
1479
1514
  "arbitrary_color": 0,
1480
1515
  "css_var_defs": 0,
1481
1516
  "local_primitive_count": 0,
1482
- "font_size_literal": 50,
1517
+ "font_size_literal": 32,
1483
1518
  "size_literal": 0,
1484
1519
  "native_control": 2,
1485
1520
  "control_override": 1,
@@ -1487,6 +1522,7 @@
1487
1522
  "shell_override": 0,
1488
1523
  "header_height_literal": 0,
1489
1524
  "transcript_type_override": 0,
1525
+ "settings_layout": 0,
1490
1526
  "palette_top": [],
1491
1527
  "local_primitives": {}
1492
1528
  },
@@ -1496,28 +1532,28 @@
1496
1532
  "apps/web"
1497
1533
  ],
1498
1534
  "branch": "develop",
1499
- "head": "732a028e393f",
1500
- "tsx_files": 356,
1535
+ "head": "6cea23be873a",
1536
+ "tsx_files": 355,
1501
1537
  "css_files": 9,
1502
1538
  "versions": {
1503
1539
  "agent-app": [
1504
- "0.57.2"
1540
+ "0.60.185"
1505
1541
  ],
1506
1542
  "brand": [
1507
- "^1.17.0"
1543
+ "^1.26.0"
1508
1544
  ],
1509
1545
  "sandbox-ui": [
1510
- "0.127.4"
1546
+ "0.134.10"
1511
1547
  ],
1512
1548
  "ui": [
1513
- "^11.24.0"
1549
+ "^11.40.0"
1514
1550
  ]
1515
1551
  },
1516
1552
  "importing_files": {
1517
1553
  "brand": 0,
1518
1554
  "ui": 184,
1519
1555
  "sandbox-ui": 3,
1520
- "agent-app": 4
1556
+ "agent-app": 7
1521
1557
  },
1522
1558
  "by_file": {
1523
1559
  "raw_palette": {},
@@ -1567,8 +1603,6 @@
1567
1603
  "apps/web/src/routes/leaderboard._index.tsx": 4
1568
1604
  },
1569
1605
  "native_control": {
1570
- "apps/web/src/components/@settings/core/ControlPanel.tsx": 4,
1571
- "apps/web/src/components/@settings/shared/components/TabManagement.tsx": 1,
1572
1606
  "apps/web/src/components/@settings/tabs/agents/ToolTogglesEditor.tsx": 2,
1573
1607
  "apps/web/src/components/@settings/tabs/batch-runs/BatchRunsTab.tsx": 5,
1574
1608
  "apps/web/src/components/@settings/tabs/connections/CoolifyConnection.tsx": 1,
@@ -1588,7 +1622,6 @@
1588
1622
  "apps/web/src/components/@settings/tabs/partner-dashboard/components/dialogs/RemovalPolicyDialog.tsx": 2,
1589
1623
  "apps/web/src/components/@settings/tabs/plugins/PluginsTab.tsx": 1,
1590
1624
  "apps/web/src/components/@settings/tabs/projects/ProjectsTab.client.tsx": 8,
1591
- "apps/web/src/components/@settings/tabs/settings/SettingsTab.tsx": 3,
1592
1625
  "apps/web/src/components/admin/AdminPartnersTab.tsx": 7,
1593
1626
  "apps/web/src/components/admin/AdminUsersTab.tsx": 3,
1594
1627
  "apps/web/src/components/admin/PartnerDetailModal.tsx": 2,
@@ -1765,7 +1798,12 @@
1765
1798
  "header_height_literal": {
1766
1799
  "apps/web/src/components/@settings/tabs/connections/NetlifyConnection.tsx": 1
1767
1800
  },
1768
- "transcript_type_override": {}
1801
+ "transcript_type_override": {},
1802
+ "settings_layout": {
1803
+ "apps/web/src/components/@settings/tabs/partner-dashboard/PartnerSettingsTab.tsx": 1,
1804
+ "apps/web/src/routes/settings.partner.$partnerId.tsx": 1,
1805
+ "apps/web/src/routes/settings.partner._index.tsx": 1
1806
+ }
1769
1807
  },
1770
1808
  "raw_palette": 0,
1771
1809
  "hex": 0,
@@ -1774,12 +1812,13 @@
1774
1812
  "local_primitive_count": 0,
1775
1813
  "font_size_literal": 50,
1776
1814
  "size_literal": 28,
1777
- "native_control": 401,
1815
+ "native_control": 393,
1778
1816
  "control_override": 18,
1779
1817
  "page_heading": 30,
1780
1818
  "shell_override": 2,
1781
1819
  "header_height_literal": 1,
1782
1820
  "transcript_type_override": 0,
1821
+ "settings_layout": 3,
1783
1822
  "palette_top": [],
1784
1823
  "local_primitives": {}
1785
1824
  },
@@ -1789,7 +1828,7 @@
1789
1828
  "public"
1790
1829
  ],
1791
1830
  "branch": "main",
1792
- "head": "037eee72f92f",
1831
+ "head": "ebb6d8a1a356",
1793
1832
  "tsx_files": 1,
1794
1833
  "css_files": 0,
1795
1834
  "versions": {
@@ -1825,7 +1864,8 @@
1825
1864
  "page_heading": {},
1826
1865
  "shell_override": {},
1827
1866
  "header_height_literal": {},
1828
- "transcript_type_override": {}
1867
+ "transcript_type_override": {},
1868
+ "settings_layout": {}
1829
1869
  },
1830
1870
  "raw_palette": 0,
1831
1871
  "hex": 0,
@@ -1840,6 +1880,7 @@
1840
1880
  "shell_override": 0,
1841
1881
  "header_height_literal": 0,
1842
1882
  "transcript_type_override": 0,
1883
+ "settings_layout": 0,
1843
1884
  "palette_top": [],
1844
1885
  "local_primitives": {}
1845
1886
  }
@@ -6,7 +6,8 @@
6
6
  * CSS custom-property definitions, locally defined primitives, and the sizing and
7
7
  * type deviations that bypass the shared control scale (literal font sizes and
8
8
  * heights, native controls, restyled shared controls, hand-written page titles),
9
- * and local re-drawings of the shared conversation shell in a surface's source,
9
+ * local re-drawings of the shared conversation shell, and settings pages drawn
10
+ * without the shared settings layout in a surface's source,
10
11
  * reading a git tree with `git grep` (no checkout of the tree needed).
11
12
  * The counts committed in drift-baseline.json beside this file may only fall.
12
13
  *
@@ -126,12 +127,40 @@ export const RULE_PATTERNS = {
126
127
  },
127
128
  };
128
129
 
130
+ /**
131
+ * Metrics that count page files rather than matches. A candidate is a page file under the surface's
132
+ * pathspecs whose path names `name` (in any case). A page file is a route or page module (under a
133
+ * `routes`, `pages` or `views` directory, unless its name ends in a part word: a card, section or
134
+ * dialog is drawn inside a page and is not one), a Next.js `page` or `layout` file, or a file
135
+ * elsewhere named for `name` whose last word is `name` or a page word (`BusinessSettings.tsx`,
136
+ * `SettingsTab.tsx`; not a `useSettings` hook or a `SettingsMenu`). A candidate is counted unless it
137
+ * imports `composes`, or it sits under a composing layout, the one kind of module that renders the
138
+ * routes beneath it: a Next.js `layout`, or a `routes` module other than an index. A composing
139
+ * `page` or `index` covers only itself. Nesting is read from the path, at `/` and at the dots of
140
+ * flat route file names, so `app.settings.tsx` holds `app.settings.team.tsx` and
141
+ * `app.settings/Billing.tsx` but not `app.settings_.team.tsx`, which leaves its parent's layout.
142
+ */
143
+ export const PAGE_PATTERNS = {
144
+ // A settings page drawn locally. agent-app's settings-react owns the settings composition: the
145
+ // section nav, frame, rows and save behaviour.
146
+ settings_layout: {
147
+ name: "settings",
148
+ composes: String.raw`(?:\bfrom|\bimport)\s*\(?\s*["']@tangle-network/agent-app/settings-react(?:/[^"']*)?["']`,
149
+ reason: "imports nothing from @tangle-network/agent-app/settings-react",
150
+ },
151
+ };
152
+ const PAGE_DIR = /(?:^|\/)(?:routes|pages|views)\//i;
153
+ const ROUTES_DIR = /(?:^|\/)routes\//i;
154
+ const PAGE_PARTS = ["card", "cards", "section", "sections", "dialog", "modal", "sheet", "drawer", "panel", "form", "row", "field"];
155
+ const PAGE_WORDS = ["page", "tab", "view", "screen"];
156
+
129
157
  const LOCAL_PRIM_NAME = new RegExp(String.raw`(?:function|const)\s+(${PRIMS})\b`);
130
158
  const SHARED = ["@tangle-network/brand", "@tangle-network/ui", "@tangle-network/sandbox-ui", "@tangle-network/agent-app"];
131
159
 
132
160
  /** The counts the gate ratchets. Everything else in a row is informational. */
133
161
  const LINE_METRICS = Object.keys(PATTERNS);
134
- export const GATED = [LINE_METRICS[0], "hex", ...LINE_METRICS.slice(1), ...Object.keys(RULE_PATTERNS).filter((m) => m !== "hex")];
162
+ export const GATED = [LINE_METRICS[0], "hex", ...LINE_METRICS.slice(1), ...Object.keys(RULE_PATTERNS).filter((m) => m !== "hex"),
163
+ ...Object.keys(PAGE_PATTERNS)];
135
164
 
136
165
  function extensions(surface, metric) {
137
166
  const extra = SURFACES[surface]?.extraExt ?? [];
@@ -149,6 +178,7 @@ function extensions(surface, metric) {
149
178
  case "shell_override": return ["*.tsx", "*.jsx", "*.css", ...extra];
150
179
  case "header_height_literal": return ["*.tsx", "*.jsx", "*.astro", "*.css", "*.vue", "*.svelte"];
151
180
  case "transcript_type_override": return ["*.tsx", "*.jsx", "*.css"];
181
+ case "settings_layout": return ["*.tsx", "*.jsx", "*.astro"];
152
182
  case "imports": return ["*.tsx", "*.ts", "*.astro", "*.jsx"];
153
183
  default: return SRC_EXT;
154
184
  }
@@ -195,25 +225,35 @@ export function grepMatches(source, roots, pattern, exts) {
195
225
  return rows;
196
226
  }
197
227
 
198
- /** Every match of a multi-line metric: [{ path, line, match }], `line` being where the match starts. */
199
- export function ruleMatches(source, roots, metric, exts) {
200
- const { prefilter, patterns } = RULE_PATTERNS[metric];
201
- const args = ["grep", "-I", "-P", "-l", "--null", "-e", prefilter];
228
+ /** Files under `specs`, less the excluded paths, with a line matching the PCRE `pattern`. */
229
+ function grepFiles(source, pattern, specs) {
230
+ const args = ["grep", "-I", "-P", "-l", "--null", "-e", pattern];
202
231
  if (source.rev) args.push(source.rev);
203
232
  else args.push("--untracked");
204
- args.push("--", ...pathspecs(roots, exts), ...EXCLUDE);
233
+ args.push("--", ...specs, ...EXCLUDE);
205
234
  const prefix = source.rev ? `${source.rev}:` : "";
206
- const files = git(source.dir, args, { allowExit1: true }).split("\0").filter(Boolean)
235
+ return git(source.dir, args, { allowExit1: true }).split("\0").filter(Boolean)
207
236
  .map((f) => (f.startsWith(prefix) ? f.slice(prefix.length) : f).trim()).filter(Boolean);
237
+ }
238
+
239
+ /**
240
+ * A file's text with its comments blanked, keeping offsets and newlines. Comments name things
241
+ * without styling or importing them (a CSS note that mentions "transcript" or "header").
242
+ */
243
+ function codeText(source, path) {
244
+ const blank = (comment) => comment.replace(/[^\n]/g, " ");
245
+ return readFile(source, path)
246
+ .replace(/\/\*[\s\S]*?\*\//g, blank)
247
+ .replace(/<!--[\s\S]*?-->/g, blank)
248
+ .replace(/(^|[\s;{}(])\/\/[^\n]*/gm, (m, lead) => lead + blank(m.slice(lead.length)));
249
+ }
250
+
251
+ /** Every match of a multi-line metric: [{ path, line, match }], `line` being where the match starts. */
252
+ export function ruleMatches(source, roots, metric, exts) {
253
+ const { prefilter, patterns } = RULE_PATTERNS[metric];
208
254
  const rows = [];
209
- for (const path of files) {
210
- // Comments name things without styling them (a CSS note that mentions "transcript" or
211
- // "header"); blank them, keeping offsets and newlines, so only real rules count.
212
- const blank = (comment) => comment.replace(/[^\n]/g, " ");
213
- const text = readFile(source, path)
214
- .replace(/\/\*[\s\S]*?\*\//g, blank)
215
- .replace(/<!--[\s\S]*?-->/g, blank)
216
- .replace(/(^|[\s;{}(])\/\/[^\n]*/gm, (m, lead) => lead + blank(m.slice(lead.length)));
255
+ for (const path of grepFiles(source, prefilter, pathspecs(roots, exts))) {
256
+ const text = codeText(source, path);
217
257
  const found = new Map();
218
258
  for (const pattern of patterns) {
219
259
  for (const m of text.matchAll(new RegExp(pattern, "g"))) found.set(m.index, m[0]);
@@ -225,6 +265,49 @@ export function ruleMatches(source, roots, metric, exts) {
225
265
  return rows.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : a.line - b.line));
226
266
  }
227
267
 
268
+ /** A file name without its directory or extension. */
269
+ function baseName(path) {
270
+ return path.slice(path.lastIndexOf("/") + 1).replace(/\.[^.]+$/, "");
271
+ }
272
+
273
+ /** The words of a file name: `SettingsPortsCard.tsx` is settings, ports, card; `SSOSettings.tsx` is sso, settings. */
274
+ function fileWords(path) {
275
+ return baseName(path).split(/(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|[^A-Za-z0-9]+/)
276
+ .filter(Boolean).map((w) => w.toLowerCase());
277
+ }
278
+
279
+ /** A page file's route as path segments: no extension or trailing route, index, page or layout name. */
280
+ function routeSegments(path) {
281
+ return path.toLowerCase().replace(/\.[^./]+$/, "").replace(/\/(?:route|index|page|layout)$/, "").split(/[/.]/);
282
+ }
283
+
284
+ /** Whether a page module renders the routes beneath it: a Next.js layout, or a routes module other than an index. */
285
+ function wrapsChildren(path) {
286
+ const base = baseName(path).toLowerCase();
287
+ if (/(?:^|\.)(?:_?index|page)$/.test(base)) return false;
288
+ return base === "layout" || ROUTES_DIR.test(path);
289
+ }
290
+
291
+ /** Every page a page metric counts: [{ path, line: 1, match }], `match` saying why it counts. */
292
+ export function pageMatches(source, roots, metric, exts) {
293
+ const { name, composes, reason } = PAGE_PATTERNS[metric];
294
+ const isPage = (f) => {
295
+ const words = fileWords(f);
296
+ if (PAGE_DIR.test(f)) return !PAGE_PARTS.includes(words.at(-1));
297
+ if (words.length === 1 && ["page", "layout"].includes(words[0])) return true;
298
+ return words.includes(name) && words[0] !== "use" && [name, ...PAGE_WORDS].includes(words.at(-1));
299
+ };
300
+ const specs = pathspecs(roots, exts.map((e) => `*${name}${e}`)).map((s) => `:(icase)${s}`);
301
+ const pages = grepFiles(source, "^", specs).filter(isPage).sort();
302
+ const composing = new Set(pages.filter((f) => new RegExp(composes).test(codeText(source, f))));
303
+ const layouts = [...composing].filter(wrapsChildren).map(routeSegments);
304
+ const covered = (f) => {
305
+ const route = routeSegments(f);
306
+ return composing.has(f) || layouts.some((layout) => layout.every((segment, i) => route[i] === segment));
307
+ };
308
+ return pages.filter((f) => !covered(f)).map((path) => ({ path, line: 1, match: reason }));
309
+ }
310
+
228
311
  /** Full text of matching lines in the named files, for failure reports. */
229
312
  function grepLines(source, pattern, files) {
230
313
  const args = ["grep", "-I", "-P", "-n", "--null", "-e", pattern];
@@ -305,9 +388,10 @@ export function measure(surface, source) {
305
388
  }
306
389
  row.by_file = {};
307
390
  for (const metric of GATED) {
308
- const hits = RULE_PATTERNS[metric]
309
- ? ruleMatches(source, roots, metric, extensions(surface, metric))
310
- : grepMatches(source, roots, PATTERNS[metric], extensions(surface, metric));
391
+ const exts = extensions(surface, metric);
392
+ const hits = RULE_PATTERNS[metric] ? ruleMatches(source, roots, metric, exts)
393
+ : PAGE_PATTERNS[metric] ? pageMatches(source, roots, metric, exts)
394
+ : grepMatches(source, roots, PATTERNS[metric], exts);
311
395
  matches[metric] = hits;
312
396
  row[metric] = hits.length;
313
397
  row.by_file[metric] = sortedObject(countBy(hits.map((h) => h.path)));
@@ -546,7 +630,7 @@ export function main(argv = process.argv.slice(2), log = (s) => process.stdout.w
546
630
  log(files.length ? " files above their baseline count:" : " no single file rose (moved or renamed?); largest files:");
547
631
  for (const f of shown.slice(0, 10)) log(` ${f.path}: ${f.base} -> ${f.now}`);
548
632
  const shownPaths = shown.slice(0, 10).map((f) => f.path);
549
- const lines = RULE_PATTERNS[metric]
633
+ const lines = RULE_PATTERNS[metric] || PAGE_PATTERNS[metric]
550
634
  ? matches[metric].filter((m) => shownPaths.includes(m.path)).map((m) => ({ path: m.path, line: m.line, text: m.match.replace(/\s+/g, " ") }))
551
635
  : grepLines(source, PATTERNS[metric], shownPaths);
552
636
  for (const l of lines.slice(0, opts.top)) log(` ${l.path}:${l.line}: ${l.text.slice(0, 160)}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/brand",
3
- "version": "1.25.1",
3
+ "version": "1.26.1",
4
4
  "description": "Tangle brand system — design tokens, logo, Tailwind v4 theme. Single source of truth for every Tangle app.",
5
5
  "type": "module",
6
6
  "license": "MIT",