@tangle-network/brand 1.25.0 → 1.26.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.26.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 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.
8
+
9
+ ## 1.25.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 19a10d9: Extend PageShell reading slots, Heading and PageHeader opt-in presentation, and Button display size. Publish React-free primitive presentation classes and native-dialog binding for Hono without changing existing control defaults.
14
+
3
15
  ## 1.25.0
4
16
 
5
17
  ### Minor 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": "4dbeabd991e0",
624
+ "tsx_files": 140,
612
625
  "css_files": 3,
613
626
  "versions": {
614
627
  "agent-app": [
615
- "0.60.80"
628
+ "0.60.180"
616
629
  ],
617
630
  "brand": [
618
- "1.22.0"
631
+ "1.25.1"
619
632
  ],
620
633
  "sandbox-ui": [
621
- "0.133.1"
634
+ "0.134.7"
622
635
  ],
623
636
  "ui": [
624
- "11.32.1"
637
+ "11.38.1"
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": 15,
643
+ "sandbox-ui": 118,
644
+ "agent-app": 263
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,25 @@
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": {
685
+ "src/routes/app.workspace.settings.tsx": 1
686
+ }
672
687
  },
673
688
  "raw_palette": 0,
674
689
  "hex": 0,
675
690
  "arbitrary_color": 0,
676
- "css_var_defs": 58,
691
+ "css_var_defs": 56,
677
692
  "local_primitive_count": 0,
678
693
  "font_size_literal": 3,
679
694
  "size_literal": 0,
680
695
  "native_control": 0,
681
696
  "control_override": 4,
682
- "page_heading": 18,
697
+ "page_heading": 17,
683
698
  "shell_override": 4,
684
699
  "header_height_literal": 0,
685
700
  "transcript_type_override": 0,
701
+ "settings_layout": 1,
686
702
  "palette_top": [],
687
703
  "local_primitives": {}
688
704
  },
@@ -692,40 +708,41 @@
692
708
  "apps/web"
693
709
  ],
694
710
  "branch": "main",
695
- "head": "d88f237a23f2",
711
+ "head": "3ede280109b0",
696
712
  "tsx_files": 58,
697
713
  "css_files": 1,
698
714
  "versions": {
699
715
  "agent-app": [
700
- "0.60.72"
716
+ "0.60.162",
717
+ "0.60.168"
701
718
  ],
702
719
  "brand": [
703
- "1.22.0"
720
+ "1.24.1"
704
721
  ],
705
722
  "override:agent-app": [
706
- "0.60.72"
723
+ "0.60.162"
707
724
  ],
708
725
  "override:brand": [
709
- "1.22.0"
726
+ "1.24.1"
710
727
  ],
711
728
  "override:sandbox-ui": [
712
- "0.133.1"
729
+ "0.134.3"
713
730
  ],
714
731
  "override:ui": [
715
- "11.32.1"
732
+ "11.33.0"
716
733
  ],
717
734
  "sandbox-ui": [
718
- "0.133.1"
735
+ "0.134.3"
719
736
  ],
720
737
  "ui": [
721
- "11.32.1"
738
+ "11.33.0"
722
739
  ]
723
740
  },
724
741
  "importing_files": {
725
742
  "brand": 1,
726
- "ui": 4,
727
- "sandbox-ui": 39,
728
- "agent-app": 108
743
+ "ui": 7,
744
+ "sandbox-ui": 41,
745
+ "agent-app": 110
729
746
  },
730
747
  "by_file": {
731
748
  "raw_palette": {},
@@ -749,7 +766,10 @@
749
766
  },
750
767
  "shell_override": {},
751
768
  "header_height_literal": {},
752
- "transcript_type_override": {}
769
+ "transcript_type_override": {},
770
+ "settings_layout": {
771
+ "apps/web/src/routes/app.settings.tsx": 1
772
+ }
753
773
  },
754
774
  "raw_palette": 0,
755
775
  "hex": 0,
@@ -764,6 +784,7 @@
764
784
  "shell_override": 0,
765
785
  "header_height_literal": 0,
766
786
  "transcript_type_override": 0,
787
+ "settings_layout": 1,
767
788
  "palette_top": [],
768
789
  "local_primitives": {}
769
790
  },
@@ -773,28 +794,28 @@
773
794
  ""
774
795
  ],
775
796
  "branch": "main",
776
- "head": "d8c3ecca3a72",
797
+ "head": "a4d952d0e8a9",
777
798
  "tsx_files": 63,
778
799
  "css_files": 1,
779
800
  "versions": {
780
801
  "agent-app": [
781
- "0.60.72"
802
+ "0.60.168"
782
803
  ],
783
804
  "brand": [
784
- "1.22.0"
805
+ "1.24.2"
785
806
  ],
786
807
  "sandbox-ui": [
787
- "0.133.1"
808
+ "0.134.7"
788
809
  ],
789
810
  "ui": [
790
- "11.32.1"
811
+ "11.33.0"
791
812
  ]
792
813
  },
793
814
  "importing_files": {
794
815
  "brand": 2,
795
816
  "ui": 33,
796
817
  "sandbox-ui": 26,
797
- "agent-app": 128
818
+ "agent-app": 138
798
819
  },
799
820
  "by_file": {
800
821
  "raw_palette": {},
@@ -819,7 +840,10 @@
819
840
  },
820
841
  "shell_override": {},
821
842
  "header_height_literal": {},
822
- "transcript_type_override": {}
843
+ "transcript_type_override": {},
844
+ "settings_layout": {
845
+ "src/routes/app.workspace.settings.tsx": 1
846
+ }
823
847
  },
824
848
  "raw_palette": 0,
825
849
  "hex": 0,
@@ -834,6 +858,7 @@
834
858
  "shell_override": 0,
835
859
  "header_height_literal": 0,
836
860
  "transcript_type_override": 0,
861
+ "settings_layout": 1,
837
862
  "palette_top": [],
838
863
  "local_primitives": {}
839
864
  },
@@ -878,7 +903,7 @@
878
903
  "src/routes/app.workspace.vault.tsx": 2
879
904
  },
880
905
  "hex": {
881
- "src/app.css": 110,
906
+ "src/app.css": 99,
882
907
  "src/root.tsx": 2,
883
908
  "src/routes/_index.tsx": 6,
884
909
  "src/routes/app.workspace._index.tsx": 2,
@@ -913,10 +938,13 @@
913
938
  },
914
939
  "shell_override": {},
915
940
  "header_height_literal": {},
916
- "transcript_type_override": {}
941
+ "transcript_type_override": {},
942
+ "settings_layout": {
943
+ "src/routes/app.workspace.settings.tsx": 1
944
+ }
917
945
  },
918
946
  "raw_palette": 72,
919
- "hex": 148,
947
+ "hex": 137,
920
948
  "arbitrary_color": 0,
921
949
  "css_var_defs": 183,
922
950
  "local_primitive_count": 0,
@@ -928,6 +956,7 @@
928
956
  "shell_override": 0,
929
957
  "header_height_literal": 0,
930
958
  "transcript_type_override": 0,
959
+ "settings_layout": 1,
931
960
  "palette_top": [
932
961
  [
933
962
  "text-amber-600",
@@ -962,28 +991,28 @@
962
991
  ""
963
992
  ],
964
993
  "branch": "master",
965
- "head": "20b11756ba9d",
994
+ "head": "45ed1c289657",
966
995
  "tsx_files": 52,
967
996
  "css_files": 1,
968
997
  "versions": {
969
998
  "agent-app": [
970
- "0.60.83"
999
+ "0.60.168"
971
1000
  ],
972
1001
  "brand": [
973
- "1.22.0"
1002
+ "1.24.2"
974
1003
  ],
975
1004
  "sandbox-ui": [
976
- "0.133.1"
1005
+ "0.134.7"
977
1006
  ],
978
1007
  "ui": [
979
- "11.32.1"
1008
+ "11.33.0"
980
1009
  ]
981
1010
  },
982
1011
  "importing_files": {
983
1012
  "brand": 1,
984
1013
  "ui": 2,
985
- "sandbox-ui": 38,
986
- "agent-app": 134
1014
+ "sandbox-ui": 41,
1015
+ "agent-app": 138
987
1016
  },
988
1017
  "by_file": {
989
1018
  "raw_palette": {},
@@ -1009,7 +1038,10 @@
1009
1038
  },
1010
1039
  "shell_override": {},
1011
1040
  "header_height_literal": {},
1012
- "transcript_type_override": {}
1041
+ "transcript_type_override": {},
1042
+ "settings_layout": {
1043
+ "src/routes/app.workspace.settings.tsx": 1
1044
+ }
1013
1045
  },
1014
1046
  "raw_palette": 0,
1015
1047
  "hex": 0,
@@ -1024,6 +1056,7 @@
1024
1056
  "shell_override": 0,
1025
1057
  "header_height_literal": 0,
1026
1058
  "transcript_type_override": 0,
1059
+ "settings_layout": 1,
1027
1060
  "palette_top": [],
1028
1061
  "local_primitives": {}
1029
1062
  },
@@ -1033,35 +1066,36 @@
1033
1066
  "apps/web"
1034
1067
  ],
1035
1068
  "branch": "main",
1036
- "head": "6b1b12e7f8f6",
1069
+ "head": "4a22164424ed",
1037
1070
  "tsx_files": 18,
1038
1071
  "css_files": 7,
1039
1072
  "versions": {
1040
1073
  "agent-app": [
1041
- "0.60.84"
1074
+ "0.60.120",
1075
+ "0.60.134"
1042
1076
  ],
1043
1077
  "brand": [
1044
- "1.22.0"
1078
+ "1.24.1"
1045
1079
  ],
1046
1080
  "override:brand": [
1047
- "1.22.0"
1081
+ "1.24.1"
1048
1082
  ],
1049
1083
  "override:sandbox-ui": [
1050
- "0.133.1"
1084
+ "0.133.8"
1051
1085
  ],
1052
1086
  "override:ui": [
1053
- "11.32.1"
1087
+ "11.33.0"
1054
1088
  ],
1055
1089
  "sandbox-ui": [
1056
- "0.133.1"
1090
+ "0.133.8"
1057
1091
  ],
1058
1092
  "ui": [
1059
- "11.32.1"
1093
+ "11.33.0"
1060
1094
  ]
1061
1095
  },
1062
1096
  "importing_files": {
1063
1097
  "brand": 1,
1064
- "ui": 8,
1098
+ "ui": 13,
1065
1099
  "sandbox-ui": 6,
1066
1100
  "agent-app": 7
1067
1101
  },
@@ -1079,7 +1113,7 @@
1079
1113
  "apps/web/src/assembly/AssemblyBooklet.tsx": 9,
1080
1114
  "apps/web/src/canvas/NodeInspector.tsx": 8,
1081
1115
  "apps/web/src/canvas/SystemDiagramCanvas.tsx": 1,
1082
- "apps/web/src/styles.css": 190,
1116
+ "apps/web/src/styles.css": 181,
1083
1117
  "apps/web/src/styles/assembly.css": 21,
1084
1118
  "apps/web/src/styles/canvas-nodes.css": 8,
1085
1119
  "apps/web/src/styles/composer.css": 13,
@@ -1091,7 +1125,6 @@
1091
1125
  "apps/web/src/ApiKeysPanel.tsx": 5,
1092
1126
  "apps/web/src/App.tsx": 6,
1093
1127
  "apps/web/src/CaptureWorkspace.tsx": 7,
1094
- "apps/web/src/ErrorBoundary.tsx": 1,
1095
1128
  "apps/web/src/Markdown.tsx": 1,
1096
1129
  "apps/web/src/PreparedActions.tsx": 10,
1097
1130
  "apps/web/src/assembly/AssemblyBooklet.tsx": 3,
@@ -1106,21 +1139,23 @@
1106
1139
  },
1107
1140
  "shell_override": {},
1108
1141
  "header_height_literal": {},
1109
- "transcript_type_override": {}
1142
+ "transcript_type_override": {},
1143
+ "settings_layout": {}
1110
1144
  },
1111
1145
  "raw_palette": 0,
1112
1146
  "hex": 0,
1113
1147
  "arbitrary_color": 0,
1114
1148
  "css_var_defs": 1,
1115
1149
  "local_primitive_count": 0,
1116
- "font_size_literal": 285,
1150
+ "font_size_literal": 276,
1117
1151
  "size_literal": 0,
1118
- "native_control": 52,
1152
+ "native_control": 51,
1119
1153
  "control_override": 0,
1120
1154
  "page_heading": 1,
1121
1155
  "shell_override": 0,
1122
1156
  "header_height_literal": 0,
1123
1157
  "transcript_type_override": 0,
1158
+ "settings_layout": 0,
1124
1159
  "palette_top": [],
1125
1160
  "local_primitives": {}
1126
1161
  },
@@ -1130,28 +1165,28 @@
1130
1165
  ""
1131
1166
  ],
1132
1167
  "branch": "main",
1133
- "head": "15d54650c9e6",
1134
- "tsx_files": 32,
1168
+ "head": "9d7faf8d8bc6",
1169
+ "tsx_files": 37,
1135
1170
  "css_files": 12,
1136
1171
  "versions": {
1137
1172
  "agent-app": [
1138
- "0.60.83"
1173
+ "0.60.168"
1139
1174
  ],
1140
1175
  "brand": [
1141
- "1.22.0"
1176
+ "1.24.2"
1142
1177
  ],
1143
1178
  "sandbox-ui": [
1144
- "0.133.1"
1179
+ "0.134.7"
1145
1180
  ],
1146
1181
  "ui": [
1147
- "11.32.1"
1182
+ "11.35.0"
1148
1183
  ]
1149
1184
  },
1150
1185
  "importing_files": {
1151
1186
  "brand": 0,
1152
- "ui": 3,
1153
- "sandbox-ui": 31,
1154
- "agent-app": 65
1187
+ "ui": 4,
1188
+ "sandbox-ui": 35,
1189
+ "agent-app": 74
1155
1190
  },
1156
1191
  "by_file": {
1157
1192
  "raw_palette": {},
@@ -1178,7 +1213,14 @@
1178
1213
  },
1179
1214
  "shell_override": {},
1180
1215
  "header_height_literal": {},
1181
- "transcript_type_override": {}
1216
+ "transcript_type_override": {},
1217
+ "settings_layout": {
1218
+ "src/web/AgentProfileSettings.tsx": 1,
1219
+ "src/web/BusinessSettings.tsx": 1,
1220
+ "src/web/GuestGuidebookSettings.tsx": 1,
1221
+ "src/web/PhoneLineSettings.tsx": 1,
1222
+ "src/web/SummarySettings.tsx": 1
1223
+ }
1182
1224
  },
1183
1225
  "raw_palette": 0,
1184
1226
  "hex": 0,
@@ -1193,6 +1235,7 @@
1193
1235
  "shell_override": 0,
1194
1236
  "header_height_literal": 0,
1195
1237
  "transcript_type_override": 0,
1238
+ "settings_layout": 5,
1196
1239
  "palette_top": [],
1197
1240
  "local_primitives": {}
1198
1241
  },
@@ -1202,7 +1245,7 @@
1202
1245
  "packages/website"
1203
1246
  ],
1204
1247
  "branch": "main",
1205
- "head": "f15b7f2a883d",
1248
+ "head": "24f56e7de979",
1206
1249
  "tsx_files": 26,
1207
1250
  "css_files": 1,
1208
1251
  "versions": {
@@ -1280,7 +1323,8 @@
1280
1323
  "packages/website/src/components/RedteamDashboardLayout.tsx": 4
1281
1324
  },
1282
1325
  "header_height_literal": {},
1283
- "transcript_type_override": {}
1326
+ "transcript_type_override": {},
1327
+ "settings_layout": {}
1284
1328
  },
1285
1329
  "raw_palette": 0,
1286
1330
  "hex": 0,
@@ -1295,6 +1339,7 @@
1295
1339
  "shell_override": 4,
1296
1340
  "header_height_literal": 0,
1297
1341
  "transcript_type_override": 0,
1342
+ "settings_layout": 0,
1298
1343
  "palette_top": [],
1299
1344
  "local_primitives": {}
1300
1345
  },
@@ -1304,12 +1349,12 @@
1304
1349
  ""
1305
1350
  ],
1306
1351
  "branch": "main",
1307
- "head": "c3ca6f919e26",
1352
+ "head": "3b55174f84e2",
1308
1353
  "tsx_files": 43,
1309
1354
  "css_files": 1,
1310
1355
  "versions": {
1311
1356
  "agent-app": [
1312
- "^0.57.2"
1357
+ "0.60.168"
1313
1358
  ],
1314
1359
  "brand": [
1315
1360
  "^1.17.0"
@@ -1377,7 +1422,10 @@
1377
1422
  "src/components/layout/app-layout.tsx": 4
1378
1423
  },
1379
1424
  "header_height_literal": {},
1380
- "transcript_type_override": {}
1425
+ "transcript_type_override": {},
1426
+ "settings_layout": {
1427
+ "src/pages/settings.tsx": 1
1428
+ }
1381
1429
  },
1382
1430
  "raw_palette": 0,
1383
1431
  "hex": 0,
@@ -1392,6 +1440,7 @@
1392
1440
  "shell_override": 4,
1393
1441
  "header_height_literal": 0,
1394
1442
  "transcript_type_override": 0,
1443
+ "settings_layout": 1,
1395
1444
  "palette_top": [],
1396
1445
  "local_primitives": {}
1397
1446
  },
@@ -1401,40 +1450,40 @@
1401
1450
  ""
1402
1451
  ],
1403
1452
  "branch": "main",
1404
- "head": "2df6a86bcc28",
1405
- "tsx_files": 110,
1453
+ "head": "e0c8ed540dd7",
1454
+ "tsx_files": 116,
1406
1455
  "css_files": 2,
1407
1456
  "versions": {
1408
1457
  "agent-app": [
1409
- "0.60.72"
1458
+ "0.60.168"
1410
1459
  ],
1411
1460
  "brand": [
1412
- "1.22.0"
1461
+ "1.24.2"
1413
1462
  ],
1414
1463
  "override:agent-app": [
1415
- "0.60.72"
1464
+ "0.60.162"
1416
1465
  ],
1417
1466
  "override:brand": [
1418
- "1.22.0"
1467
+ "1.24.2"
1419
1468
  ],
1420
1469
  "override:sandbox-ui": [
1421
- "0.133.1"
1470
+ "0.134.4"
1422
1471
  ],
1423
1472
  "override:ui": [
1424
- "11.32.1"
1473
+ "11.35.0"
1425
1474
  ],
1426
1475
  "sandbox-ui": [
1427
- "0.133.1"
1476
+ "0.134.4"
1428
1477
  ],
1429
1478
  "ui": [
1430
- "11.32.1"
1479
+ "11.35.0"
1431
1480
  ]
1432
1481
  },
1433
1482
  "importing_files": {
1434
1483
  "brand": 2,
1435
- "ui": 4,
1436
- "sandbox-ui": 78,
1437
- "agent-app": 69
1484
+ "ui": 15,
1485
+ "sandbox-ui": 80,
1486
+ "agent-app": 81
1438
1487
  },
1439
1488
  "by_file": {
1440
1489
  "raw_palette": {},
@@ -1447,7 +1496,7 @@
1447
1496
  "src/components/agent-rune.tsx": 1,
1448
1497
  "src/components/chat-launch.tsx": 1,
1449
1498
  "src/routes/app.launch.$agentId.tsx": 2,
1450
- "src/styles/listing.css": 45
1499
+ "src/styles/listing.css": 27
1451
1500
  },
1452
1501
  "size_literal": {},
1453
1502
  "native_control": {
@@ -1472,14 +1521,17 @@
1472
1521
  },
1473
1522
  "shell_override": {},
1474
1523
  "header_height_literal": {},
1475
- "transcript_type_override": {}
1524
+ "transcript_type_override": {},
1525
+ "settings_layout": {
1526
+ "src/routes/app.$agentId.settings.tsx": 1
1527
+ }
1476
1528
  },
1477
1529
  "raw_palette": 0,
1478
1530
  "hex": 0,
1479
1531
  "arbitrary_color": 0,
1480
1532
  "css_var_defs": 0,
1481
1533
  "local_primitive_count": 0,
1482
- "font_size_literal": 50,
1534
+ "font_size_literal": 32,
1483
1535
  "size_literal": 0,
1484
1536
  "native_control": 2,
1485
1537
  "control_override": 1,
@@ -1487,6 +1539,7 @@
1487
1539
  "shell_override": 0,
1488
1540
  "header_height_literal": 0,
1489
1541
  "transcript_type_override": 0,
1542
+ "settings_layout": 1,
1490
1543
  "palette_top": [],
1491
1544
  "local_primitives": {}
1492
1545
  },
@@ -1496,7 +1549,7 @@
1496
1549
  "apps/web"
1497
1550
  ],
1498
1551
  "branch": "develop",
1499
- "head": "732a028e393f",
1552
+ "head": "e7367c10440b",
1500
1553
  "tsx_files": 356,
1501
1554
  "css_files": 9,
1502
1555
  "versions": {
@@ -1765,7 +1818,13 @@
1765
1818
  "header_height_literal": {
1766
1819
  "apps/web/src/components/@settings/tabs/connections/NetlifyConnection.tsx": 1
1767
1820
  },
1768
- "transcript_type_override": {}
1821
+ "transcript_type_override": {},
1822
+ "settings_layout": {
1823
+ "apps/web/src/components/@settings/tabs/partner-dashboard/PartnerSettingsTab.tsx": 1,
1824
+ "apps/web/src/components/@settings/tabs/settings/SettingsTab.tsx": 1,
1825
+ "apps/web/src/routes/settings.partner.$partnerId.tsx": 1,
1826
+ "apps/web/src/routes/settings.partner._index.tsx": 1
1827
+ }
1769
1828
  },
1770
1829
  "raw_palette": 0,
1771
1830
  "hex": 0,
@@ -1780,6 +1839,7 @@
1780
1839
  "shell_override": 2,
1781
1840
  "header_height_literal": 1,
1782
1841
  "transcript_type_override": 0,
1842
+ "settings_layout": 4,
1783
1843
  "palette_top": [],
1784
1844
  "local_primitives": {}
1785
1845
  },
@@ -1789,7 +1849,7 @@
1789
1849
  "public"
1790
1850
  ],
1791
1851
  "branch": "main",
1792
- "head": "037eee72f92f",
1852
+ "head": "ebb6d8a1a356",
1793
1853
  "tsx_files": 1,
1794
1854
  "css_files": 0,
1795
1855
  "versions": {
@@ -1825,7 +1885,8 @@
1825
1885
  "page_heading": {},
1826
1886
  "shell_override": {},
1827
1887
  "header_height_literal": {},
1828
- "transcript_type_override": {}
1888
+ "transcript_type_override": {},
1889
+ "settings_layout": {}
1829
1890
  },
1830
1891
  "raw_palette": 0,
1831
1892
  "hex": 0,
@@ -1840,6 +1901,7 @@
1840
1901
  "shell_override": 0,
1841
1902
  "header_height_literal": 0,
1842
1903
  "transcript_type_override": 0,
1904
+ "settings_layout": 0,
1843
1905
  "palette_top": [],
1844
1906
  "local_primitives": {}
1845
1907
  }
@@ -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.0",
3
+ "version": "1.26.0",
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",
@@ -74,15 +74,14 @@
74
74
  padding: 0 1.5rem;
75
75
  border: 1px solid transparent;
76
76
  border-radius: var(--display-control-radius);
77
- background: hsl(var(--primary));
78
- color: hsl(var(--primary-foreground));
79
77
  font: 600 var(--display-control-font-size)/1 var(--font-sans);
80
78
  text-decoration: none;
81
79
  white-space: nowrap;
82
80
  box-shadow: var(--display-control-shadow);
83
81
  cursor: pointer;
84
- transition: transform var(--duration-fast) ease-out;
82
+ transition: transform var(--motion-control);
85
83
  }
84
+ .tangle-control-display:not([data-variant]), .tangle-control-display[data-variant="default"] { background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); }
86
85
  .tangle-control-display[data-variant="outline"] {
87
86
  background: hsl(var(--card));
88
87
  color: hsl(var(--card-foreground));
@@ -107,10 +106,8 @@
107
106
  rotate: -14deg;
108
107
  }
109
108
  .tangle-intro-knot > svg { width: 100%; height: auto; }
110
- .tangle-intro[data-motion] { animation: tangle-intro-enter var(--duration-expressive-entrance) var(--ease-expressive) both; }
111
- .tangle-intro[data-motion] .tangle-intro-knot { animation: tangle-intro-drift var(--duration-expressive-ambient) ease-in-out infinite; }
109
+ .tangle-intro[data-motion] { animation: tangle-intro-enter var(--motion-arrive) both; }
112
110
  @keyframes tangle-intro-enter { from { opacity: 0; transform: translateY(var(--arrive-distance)); } to { opacity: 1; transform: none; } }
113
- @keyframes tangle-intro-drift { 50% { transform: translateY(-0.75rem) scale(1.04); } }
114
111
  @media (prefers-reduced-motion: reduce) {
115
112
  .tangle-intro, .tangle-intro *, .tangle-control-display { animation: none !important; transition: none !important; transform: none !important; }
116
113
  }
@@ -118,3 +115,8 @@
118
115
  .tangle-display[data-gradient] { background: none; color: CanvasText; }
119
116
  .tangle-intro::before, .tangle-intro::after { display: none; }
120
117
  }
118
+
119
+ /* Nonvisual presence markers let Radix retain its lifecycle while the shared
120
+ * surface adapter retargets geometry. Distinct names preserve interrupted exit. */
121
+ @keyframes tangle-surface-present { from { --tangle-presence: 0; } to { --tangle-presence: 1; } }
122
+ @keyframes tangle-surface-absent { from { --tangle-presence: 1; } to { --tangle-presence: 0; } }