@growthub/cli 0.9.12 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/README.md +27 -0
  2. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/settings/apis-webhooks/route.js +59 -0
  3. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/settings/workspace/route.js +70 -0
  4. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/integration-entities/route.js +41 -9
  5. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/list-entities/route.js +67 -0
  6. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/refresh-source/route.js +124 -0
  7. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/refresh-sources/route.js +127 -0
  8. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/register-resolver/route.js +119 -0
  9. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/resolvers/route.js +41 -0
  10. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/test-api-record/route.js +126 -0
  11. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/test-source/route.js +130 -0
  12. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/page.jsx +700 -214
  13. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/global-error.jsx +21 -0
  14. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +2468 -793
  15. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/apis-webhooks/apis-webhooks-form.jsx +208 -0
  16. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/apis-webhooks/page.jsx +19 -0
  17. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/apps/apps-list.jsx +43 -0
  18. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/apps/page.jsx +109 -0
  19. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/general/general-settings-form.jsx +134 -0
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/general/page.jsx +25 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/integrations/page.jsx +22 -3
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/page.jsx +25 -0
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/settings/settings-shell.jsx +33 -0
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workspace-builder.jsx +1558 -437
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/docs/data-sources-api-registry.md +139 -0
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/resolver-loader.js +57 -0
  27. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/resolvers/README.md +133 -0
  28. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/resolvers/google-analytics.js +160 -0
  29. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/source-resolver-registry.js +85 -0
  30. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-config.js +264 -1
  31. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +104 -0
  32. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-schema.js +23 -6
  33. package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/package.json +1 -0
  34. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +7 -0
  35. package/dist/index.js +1764 -40675
  36. package/package.json +1 -1
@@ -434,11 +434,20 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
434
434
  background: #f7f7f7;
435
435
  color: #555;
436
436
  font-size: 12px;
437
+ overflow: hidden;
438
+ }
439
+ .workspace-mark img {
440
+ width: 100%;
441
+ height: 100%;
442
+ object-fit: cover;
437
443
  }
438
444
  .workspace-nav {
439
445
  display: grid;
440
446
  gap: 2px;
441
447
  }
448
+ .workspace-nav-bottom {
449
+ margin-top: 2px;
450
+ }
442
451
  .workspace-nav a,
443
452
  .workspace-nav-static {
444
453
  border-radius: 6px;
@@ -521,12 +530,20 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
521
530
  .workspace-toolbar-actions button,
522
531
  .workspace-tabs button {
523
532
  min-height: 30px;
533
+ display: inline-flex;
534
+ align-items: center;
535
+ justify-content: center;
536
+ gap: 6px;
524
537
  border: 1px solid #dedede;
525
538
  border-radius: 6px;
526
539
  background: #ffffff;
527
540
  color: #4f4f4f;
528
541
  padding: 0 10px;
529
542
  }
543
+ .workspace-toolbar-actions button svg,
544
+ .workspace-tabs button svg {
545
+ flex: 0 0 auto;
546
+ }
530
547
  .workspace-table,
531
548
  .workspace-canvas {
532
549
  border: 1px solid #e7e7e7;
@@ -655,17 +672,23 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
655
672
  justify-content: flex-start;
656
673
  }
657
674
  .workspace-dashboard-actions button {
658
- border: 1px solid #e1e1e1;
675
+ min-height: 30px;
676
+ display: inline-flex;
677
+ align-items: center;
678
+ justify-content: center;
679
+ border: 1px solid #dedede;
659
680
  border-radius: 6px;
660
- background: #fafafa;
661
- color: #444;
681
+ background: #ffffff;
682
+ color: #4f4f4f;
662
683
  cursor: pointer;
663
- font-size: 11px;
684
+ font: inherit;
685
+ font-size: 12px;
664
686
  line-height: 1;
665
- padding: 6px 8px;
687
+ padding: 0 10px;
666
688
  }
667
689
  .workspace-dashboard-actions button:hover {
668
- background: #f0f0f0;
690
+ background: #f7f7f7;
691
+ border-color: #cfcfcd;
669
692
  }
670
693
  .workspace-integration-summary {
671
694
  display: grid;
@@ -845,1000 +868,2130 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
845
868
  color: #333;
846
869
  outline: none;
847
870
  }
848
- .workspace-toolbar-actions select,
849
- .workspace-widget-settings select {
850
- min-height: 32px;
851
- border: 1px solid #dcdcdc;
871
+ .workspace-tab-refresh {
872
+ margin-left: auto;
873
+ display: inline-flex;
874
+ align-items: center;
875
+ gap: 6px;
876
+ padding: 4px 10px;
852
877
  border-radius: 6px;
853
- background: #ffffff;
878
+ font-size: 12px;
879
+ font-weight: 500;
854
880
  color: #444;
855
- font: inherit;
856
- padding: 0 8px;
857
- }
858
- .workspace-hidden-input {
859
- display: none;
860
- }
861
- .workspace-grid {
862
- position: relative;
863
- display: grid;
864
- grid-template-columns: repeat(var(--workspace-columns), minmax(48px, 1fr));
865
- grid-template-rows: repeat(var(--workspace-rows), 52px);
866
- grid-auto-rows: 52px;
867
- gap: 8px;
868
- padding: 8px;
881
+ border: 1px solid #dcdcdc;
882
+ background: #fff;
883
+ transition: background 0.15s, color 0.15s, opacity 0.15s;
869
884
  }
870
- .workspace-grid-cell {
871
- appearance: none;
872
- border: 1px solid #ededed;
873
- border-radius: 7px;
874
- background: #fdfdfd;
875
- cursor: crosshair;
876
- padding: 0;
885
+ .workspace-tab-refresh:hover:not(:disabled) {
886
+ background: #f3f3f3;
887
+ color: #111;
877
888
  }
878
- .workspace-grid-cell:disabled {
879
- pointer-events: none;
880
- opacity: 1;
889
+ .workspace-tab-refresh.inert,
890
+ .workspace-tab-refresh:disabled {
891
+ opacity: 0.4;
892
+ cursor: default;
881
893
  }
882
- .workspace-add-widget {
883
- z-index: 1;
884
- display: grid;
885
- place-items: center;
886
- align-content: center;
887
- gap: 8px;
888
- border: 1px solid #e6e6e6;
889
- border-radius: 7px;
890
- background: #ffffff;
891
- color: #3d3d3d;
892
- cursor: pointer;
894
+ .workspace-tab-refresh.loading {
895
+ color: #555;
893
896
  }
894
- .workspace-add-widget.selecting {
895
- border-color: #7aa2ff;
896
- background: rgba(122, 162, 255, 0.16);
897
- box-shadow: inset 0 0 0 1px rgba(84, 125, 255, 0.35);
897
+ @keyframes workspace-spin {
898
+ from { transform: rotate(0deg); }
899
+ to { transform: rotate(360deg); }
898
900
  }
899
- .workspace-add-widget small {
900
- color: #979797;
901
+ .workspace-tab-refresh svg.spinning {
902
+ animation: workspace-spin 0.7s linear infinite;
901
903
  }
902
- .workspace-widget-icon {
903
- width: 92px;
904
- height: 68px;
905
- display: grid;
906
- place-items: center;
907
- border: 1px solid #d8e7ee;
908
- border-radius: 16px;
909
- background: #edfaff;
910
- transform: rotate(-30deg) skewX(18deg);
904
+
905
+ /* ─── Live Source Wizard ──────────────────────────────────────────────────── */
906
+
907
+ .live-source-wizard {
908
+ padding: 12px 0 4px;
909
+ display: flex;
910
+ flex-direction: column;
911
+ gap: 12px;
911
912
  }
912
- .workspace-widget-icon span {
913
- width: 56px;
914
- height: 38px;
915
- border: 3px solid #277cad;
916
- border-radius: 3px;
917
- background: #b9ecff;
913
+
914
+ /* Step breadcrumb */
915
+ .live-source-steps {
916
+ display: flex;
917
+ align-items: center;
918
+ gap: 0;
919
+ padding: 0 2px;
920
+ overflow-x: auto;
918
921
  }
919
- .workspace-widget-preview {
920
- position: relative;
921
- z-index: 2;
922
- border: 1px solid #dedede;
923
- border-radius: 7px;
924
- background: #ffffff;
925
- padding: 12px;
926
- cursor: pointer;
927
- overflow: hidden;
922
+ .live-source-step {
923
+ display: inline-flex;
924
+ align-items: center;
925
+ gap: 5px;
926
+ font-size: 11px;
927
+ color: #999;
928
+ padding: 4px 6px;
929
+ white-space: nowrap;
928
930
  }
929
- .workspace-grid.moving-widget .workspace-widget-preview {
930
- cursor: grabbing;
931
+ .live-source-step.active {
932
+ color: #111;
933
+ font-weight: 600;
931
934
  }
932
- .workspace-widget-preview.selected {
933
- border-color: #3f68ff;
934
- box-shadow: inset 0 0 0 1px rgba(63, 104, 255, 0.45);
935
+ .live-source-step.done {
936
+ color: #2a9d5c;
935
937
  }
936
- .workspace-resize-handle {
937
- position: absolute;
938
- z-index: 3;
939
- width: 13px;
940
- height: 13px;
941
- border: 1px solid #3f68ff;
942
- border-radius: 4px;
943
- background: #ffffff;
944
- box-shadow: 0 1px 3px rgba(63, 104, 255, 0.22);
945
- padding: 0;
938
+ .live-source-step-dot {
939
+ display: inline-flex;
940
+ align-items: center;
941
+ justify-content: center;
942
+ width: 18px;
943
+ height: 18px;
944
+ border-radius: 999px;
945
+ background: #ececec;
946
+ font-size: 10px;
947
+ font-weight: 700;
948
+ color: #888;
946
949
  }
947
- .workspace-resize-handle.nw {
948
- top: -6px;
949
- left: -6px;
950
- cursor: nwse-resize;
950
+ .live-source-step.active .live-source-step-dot {
951
+ background: #111;
952
+ color: #fff;
951
953
  }
952
- .workspace-resize-handle.ne {
953
- top: -6px;
954
- right: -6px;
955
- cursor: nesw-resize;
954
+ .live-source-step.done .live-source-step-dot {
955
+ background: #2a9d5c;
956
+ color: #fff;
956
957
  }
957
- .workspace-resize-handle.sw {
958
- bottom: -6px;
959
- left: -6px;
960
- cursor: nesw-resize;
958
+ .live-source-step-label {
959
+ display: none;
961
960
  }
962
- .workspace-resize-handle.se {
963
- right: -6px;
964
- bottom: -6px;
965
- cursor: nwse-resize;
961
+ .live-source-step.active .live-source-step-label,
962
+ .live-source-step.done .live-source-step-label {
963
+ display: inline;
966
964
  }
967
- .workspace-widget-preview-title {
965
+
966
+ /* Step body */
967
+ .live-source-step-body {
968
968
  display: flex;
969
- align-items: center;
970
- gap: 8px;
971
- min-height: 22px;
969
+ flex-direction: column;
970
+ gap: 10px;
971
+ padding: 4px 0;
972
972
  }
973
- .workspace-widget-preview-title span,
974
- .workspace-widget-preview-title button {
975
- color: #888;
973
+ .live-source-step-title {
974
+ font-size: 13px;
975
+ font-weight: 600;
976
+ color: #111;
977
+ margin: 0;
978
+ }
979
+ .live-source-step-hint {
976
980
  font-size: 11px;
981
+ color: #777;
982
+ margin: 0;
983
+ line-height: 1.5;
977
984
  }
978
- .workspace-widget-drag-handle {
979
- cursor: grab;
980
- user-select: none;
985
+
986
+ /* Auth mode toggle */
987
+ .live-source-auth-toggle {
988
+ display: flex;
989
+ flex-direction: column;
990
+ gap: 6px;
981
991
  }
982
- .workspace-grid.moving-widget .workspace-widget-drag-handle {
983
- cursor: grabbing;
992
+ .live-source-auth-toggle button {
993
+ display: flex;
994
+ flex-direction: column;
995
+ align-items: flex-start;
996
+ gap: 2px;
997
+ padding: 10px 12px;
998
+ border: 1px solid #e0e0e0;
999
+ border-radius: 8px;
1000
+ background: #fff;
1001
+ text-align: left;
1002
+ transition: border-color 0.1s, background 0.1s;
1003
+ position: relative;
984
1004
  }
985
- .workspace-widget-preview-title strong {
986
- min-width: 0;
987
- flex: 1;
988
- overflow: hidden;
989
- color: #333;
1005
+ .live-source-auth-toggle button.active {
1006
+ border-color: #111;
1007
+ background: #f7f7f7;
1008
+ }
1009
+ .live-source-auth-toggle button strong {
990
1010
  font-size: 13px;
991
- text-overflow: ellipsis;
992
- white-space: nowrap;
1011
+ color: #111;
993
1012
  }
994
- .workspace-widget-source-chip {
995
- max-width: 150px;
996
- min-width: 0;
997
- flex: 0 1 auto;
998
- overflow: hidden;
999
- border: 1px solid #d1d5db;
1000
- border-radius: 999px;
1001
- background: #fff;
1002
- color: #374151;
1003
- padding: 2px 8px;
1013
+ .live-source-auth-toggle button em {
1004
1014
  font-size: 11px;
1015
+ color: #777;
1016
+ font-style: normal;
1017
+ }
1018
+
1019
+ /* Badges */
1020
+ .live-source-badge {
1021
+ display: inline-flex;
1022
+ padding: 2px 7px;
1023
+ border-radius: 999px;
1024
+ font-size: 10px;
1005
1025
  font-weight: 600;
1006
- line-height: 16px;
1007
- text-overflow: ellipsis;
1008
- white-space: nowrap;
1026
+ letter-spacing: 0.3px;
1027
+ margin-top: 4px;
1009
1028
  }
1010
- .workspace-widget-preview-title button {
1011
- width: 22px;
1012
- height: 22px;
1013
- border: 0;
1014
- border-radius: 5px;
1015
- background: transparent;
1029
+ .live-source-badge.connected { background: #dcf5e9; color: #1a7a44; }
1030
+ .live-source-badge.warn { background: #fff3cd; color: #856404; }
1031
+ .live-source-badge.neutral { background: #ececec; color: #555; }
1032
+
1033
+ /* Integration list */
1034
+ .live-source-integration-list {
1035
+ display: flex;
1036
+ flex-direction: column;
1037
+ gap: 4px;
1038
+ max-height: 160px;
1039
+ overflow-y: auto;
1016
1040
  }
1017
- .workspace-widget-preview:not(.selected) .workspace-widget-preview-title button {
1018
- visibility: hidden;
1041
+ .live-source-integration-row {
1042
+ display: flex;
1043
+ align-items: center;
1044
+ gap: 8px;
1045
+ padding: 8px 10px;
1046
+ border: 1px solid #e8e8e8;
1047
+ border-radius: 6px;
1048
+ background: #fff;
1049
+ text-align: left;
1050
+ cursor: pointer;
1051
+ transition: border-color 0.1s, background 0.1s;
1019
1052
  }
1020
- .workspace-view-table {
1021
- margin-top: 10px;
1022
- border: 1px solid #eeeeee;
1023
- border-radius: 4px;
1024
- overflow: hidden;
1025
- color: #555;
1026
- font-size: 12px;
1053
+ .live-source-integration-row.active {
1054
+ border-color: #111;
1055
+ background: #f7f7f7;
1027
1056
  }
1028
- .workspace-view-table div {
1029
- display: grid;
1030
- grid-template-columns: repeat(var(--workspace-view-columns, 2), minmax(0, 1fr));
1031
- min-height: 25px;
1032
- border-bottom: 1px solid #eeeeee;
1057
+ .live-source-integration-icon {
1058
+ font-size: 14px;
1059
+ width: 22px;
1060
+ text-align: center;
1061
+ flex-shrink: 0;
1033
1062
  }
1034
- .workspace-view-table span {
1063
+ .live-source-integration-meta {
1064
+ flex: 1;
1035
1065
  min-width: 0;
1036
- overflow: hidden;
1037
- padding: 5px 8px;
1038
- text-overflow: ellipsis;
1039
- white-space: nowrap;
1040
1066
  }
1041
- .workspace-view-table span + span {
1042
- border-left: 1px solid #eeeeee;
1067
+ .live-source-integration-meta strong {
1068
+ display: block;
1069
+ font-size: 13px;
1070
+ color: #111;
1043
1071
  }
1044
- .workspace-view-table footer {
1045
- padding: 7px 8px;
1046
- color: #999;
1072
+ .live-source-integration-meta em {
1073
+ font-size: 11px;
1074
+ color: #777;
1075
+ font-style: normal;
1047
1076
  }
1048
- .workspace-iframe-preview {
1049
- height: calc(100% - 34px);
1050
- min-height: 90px;
1051
- display: grid;
1052
- place-items: center;
1053
- margin-top: 10px;
1054
- border-radius: 7px;
1055
- background: #fdfdfd;
1056
- color: #d54040;
1077
+ .live-source-empty {
1057
1078
  font-size: 12px;
1079
+ color: #999;
1080
+ padding: 6px 0;
1081
+ margin: 0;
1058
1082
  }
1059
- .workspace-rich-text-preview {
1060
- margin: 18px 10px 0;
1061
- color: #444;
1062
- font-size: 13px;
1063
- line-height: 1.5;
1064
- }
1065
- .workspace-chart-preview {
1066
- height: calc(100% - 42px);
1067
- min-height: 96px;
1083
+
1084
+ /* Custom id / field inputs */
1085
+ .live-source-custom-id,
1086
+ .live-source-field {
1068
1087
  display: flex;
1069
- align-items: end;
1070
- gap: 8px;
1071
- padding: 16px 10px 6px;
1072
- }
1073
- .workspace-chart-preview span {
1074
- flex: 1;
1075
- border-radius: 5px 5px 0 0;
1076
- background: var(--chart-accent, #d9e4ff);
1088
+ flex-direction: column;
1089
+ gap: 4px;
1077
1090
  }
1078
- .workspace-widget-panel {
1079
- border-left: 1px solid #e8e8e8;
1080
- padding: 0 12px 16px;
1081
- max-height: 100vh;
1082
- overflow-y: auto;
1083
- overscroll-behavior: contain;
1091
+ .live-source-custom-id span,
1092
+ .live-source-field span {
1093
+ font-size: 11px;
1094
+ font-weight: 600;
1095
+ color: #555;
1096
+ text-transform: uppercase;
1097
+ letter-spacing: 0.4px;
1084
1098
  }
1085
- .workspace-panel-title {
1086
- height: 48px;
1087
- display: flex;
1088
- align-items: center;
1089
- gap: 10px;
1090
- border-bottom: 1px solid #ececec;
1099
+ .live-source-custom-id input,
1100
+ .live-source-field input {
1101
+ padding: 7px 10px;
1102
+ border: 1px solid #ddd;
1103
+ border-radius: 6px;
1104
+ font-size: 13px;
1105
+ color: #111;
1106
+ background: #fff;
1091
1107
  }
1092
- .workspace-panel-title button,
1093
- .workspace-panel-title > span {
1094
- width: 24px;
1095
- height: 24px;
1096
- display: grid;
1097
- place-items: center;
1098
- border: 0;
1099
- border-radius: 5px;
1100
- background: #f1f1f1;
1101
- color: #888;
1108
+ .live-source-custom-id input:focus,
1109
+ .live-source-field input:focus {
1110
+ outline: 2px solid #111;
1111
+ border-color: transparent;
1102
1112
  }
1103
- .workspace-panel-title strong {
1104
- min-width: 0;
1105
- font-size: 14px;
1106
- overflow: hidden;
1107
- text-overflow: ellipsis;
1108
- white-space: nowrap;
1113
+
1114
+ /* Summary row (step 5) */
1115
+ .live-source-summary {
1116
+ display: flex;
1117
+ flex-direction: column;
1118
+ gap: 4px;
1119
+ background: #f7f7f7;
1120
+ border-radius: 6px;
1121
+ padding: 10px 12px;
1109
1122
  }
1110
- .workspace-panel-title em {
1111
- color: #999;
1123
+ .live-source-summary span {
1124
+ display: flex;
1125
+ gap: 6px;
1112
1126
  font-size: 12px;
1127
+ }
1128
+ .live-source-summary em {
1129
+ color: #888;
1113
1130
  font-style: normal;
1131
+ min-width: 80px;
1114
1132
  }
1115
- .workspace-panel-label {
1116
- margin: 14px 0 7px;
1117
- color: #999;
1118
- font-size: 11px;
1119
- font-weight: 700;
1133
+ .live-source-summary strong {
1134
+ color: #111;
1120
1135
  }
1121
- .workspace-widget-types {
1122
- display: grid;
1123
- gap: 2px;
1136
+
1137
+ /* Test button */
1138
+ .live-source-test-btn {
1139
+ display: inline-flex;
1140
+ align-items: center;
1141
+ gap: 7px;
1142
+ padding: 8px 16px;
1143
+ border-radius: 7px;
1144
+ background: #111;
1145
+ color: #fff;
1146
+ font-size: 13px;
1147
+ font-weight: 600;
1148
+ border: none;
1149
+ cursor: pointer;
1150
+ transition: opacity 0.15s;
1124
1151
  }
1125
- .workspace-widget-types button {
1152
+ .live-source-test-btn:disabled {
1153
+ opacity: 0.4;
1154
+ cursor: default;
1155
+ }
1156
+ .live-source-test-btn svg { flex-shrink: 0; }
1157
+
1158
+ /* Testing spinner state */
1159
+ .live-source-testing {
1126
1160
  display: flex;
1127
1161
  align-items: center;
1128
- gap: 10px;
1129
- min-height: 34px;
1130
- border: 0;
1162
+ gap: 8px;
1163
+ font-size: 13px;
1164
+ color: #555;
1165
+ padding: 6px 0;
1166
+ }
1167
+ .live-source-testing svg {
1168
+ animation: workspace-spin 0.7s linear infinite;
1169
+ }
1170
+
1171
+ /* Test result panels */
1172
+ .live-source-test-result {
1173
+ display: flex;
1174
+ flex-direction: column;
1175
+ gap: 6px;
1176
+ padding: 10px 12px;
1177
+ border-radius: 8px;
1178
+ border: 1px solid;
1179
+ }
1180
+ .live-source-test-result.success {
1181
+ background: #f0faf5;
1182
+ border-color: #b2e0c8;
1183
+ color: #1a7a44;
1184
+ }
1185
+ .live-source-test-result.success strong { font-size: 13px; }
1186
+ .live-source-test-result.success span { font-size: 11px; color: #3a8a5c; }
1187
+ .live-source-test-result.error {
1188
+ background: #fff5f5;
1189
+ border-color: #fdd;
1190
+ color: #b02020;
1191
+ }
1192
+ .live-source-test-result.error strong { font-size: 13px; }
1193
+ .live-source-test-result.error p { font-size: 12px; margin: 0; color: #b02020; }
1194
+ .live-source-retry {
1195
+ align-self: flex-start;
1196
+ padding: 4px 10px;
1131
1197
  border-radius: 5px;
1198
+ border: 1px solid currentColor;
1132
1199
  background: transparent;
1133
- color: #666;
1134
- padding: 0 8px;
1135
- text-align: left;
1200
+ font-size: 11px;
1201
+ cursor: pointer;
1202
+ color: inherit;
1136
1203
  }
1137
- .workspace-widget-types button:hover {
1138
- background: #f2f2f2;
1204
+
1205
+ /* Preview table */
1206
+ .live-source-preview {
1207
+ overflow-x: auto;
1208
+ margin-top: 4px;
1209
+ border-radius: 6px;
1210
+ border: 1px solid #d0f0e0;
1139
1211
  }
1140
- .workspace-widget-types span {
1141
- width: 20px;
1142
- height: 20px;
1143
- display: grid;
1144
- place-items: center;
1145
- border: 1px solid #d8d8d8;
1146
- border-radius: 4px;
1147
- color: #777;
1212
+ .live-source-preview table {
1213
+ width: 100%;
1214
+ border-collapse: collapse;
1148
1215
  font-size: 11px;
1149
1216
  }
1150
- .workspace-bindings {
1151
- border-top: 1px solid #ececec;
1152
- margin-top: 16px;
1217
+ .live-source-preview th {
1218
+ background: #e8f7ef;
1219
+ padding: 5px 8px;
1220
+ text-align: left;
1221
+ font-weight: 600;
1222
+ color: #1a5c38;
1223
+ border-bottom: 1px solid #c0e8d4;
1224
+ white-space: nowrap;
1153
1225
  }
1154
- .workspace-bindings div {
1226
+ .live-source-preview td {
1227
+ padding: 4px 8px;
1228
+ color: #222;
1229
+ border-bottom: 1px solid #eaf7f0;
1230
+ max-width: 180px;
1231
+ overflow: hidden;
1232
+ text-overflow: ellipsis;
1233
+ white-space: nowrap;
1234
+ }
1235
+ .live-source-preview tr:last-child td { border-bottom: none; }
1236
+ .live-source-null { color: #bbb; font-style: normal; }
1237
+
1238
+ /* Nav row (back / next / apply) */
1239
+ .live-source-nav {
1155
1240
  display: flex;
1156
- justify-content: space-between;
1157
- gap: 8px;
1158
1241
  align-items: center;
1159
- min-height: 30px;
1160
- color: #666;
1161
- font-size: 12px;
1242
+ gap: 8px;
1243
+ padding-top: 4px;
1162
1244
  }
1163
- .workspace-bindings code {
1164
- color: #777;
1165
- background: #f4f4f4;
1245
+ .live-source-back {
1246
+ padding: 6px 12px;
1247
+ border-radius: 6px;
1248
+ border: 1px solid #ddd;
1249
+ background: #fff;
1250
+ font-size: 12px;
1251
+ color: #555;
1252
+ cursor: pointer;
1166
1253
  }
1167
- .workspace-widget-settings {
1168
- display: grid;
1169
- gap: 14px;
1170
- padding-top: 14px;
1254
+ .live-source-next {
1255
+ flex: 1;
1256
+ padding: 8px 14px;
1257
+ border-radius: 6px;
1258
+ background: #111;
1259
+ color: #fff;
1260
+ font-size: 13px;
1261
+ font-weight: 600;
1262
+ border: none;
1263
+ cursor: pointer;
1264
+ transition: opacity 0.15s;
1171
1265
  }
1172
- .workspace-field-stack {
1173
- display: grid;
1174
- gap: 12px;
1266
+ .live-source-next:disabled { opacity: 0.35; cursor: default; }
1267
+ .live-source-apply {
1268
+ flex: 1;
1269
+ padding: 9px 14px;
1270
+ border-radius: 6px;
1271
+ background: #1a7a44;
1272
+ color: #fff;
1273
+ font-size: 13px;
1274
+ font-weight: 700;
1275
+ border: none;
1276
+ cursor: pointer;
1277
+ transition: opacity 0.15s;
1175
1278
  }
1176
- .workspace-widget-settings label {
1177
- display: grid;
1178
- gap: 6px;
1279
+ .live-source-apply:disabled {
1280
+ background: #ccc;
1281
+ color: #fff;
1282
+ cursor: default;
1179
1283
  }
1180
- .workspace-widget-settings label span {
1284
+ .live-source-cancel {
1285
+ align-self: flex-start;
1286
+ font-size: 11px;
1181
1287
  color: #999;
1288
+ background: none;
1289
+ border: none;
1290
+ cursor: pointer;
1291
+ padding: 2px 0;
1292
+ text-decoration: underline;
1293
+ }
1294
+
1295
+ /* Live source active state badge in subpanel */
1296
+ .workspace-active-source-state.live-source-active {
1297
+ border-left: 3px solid #2a9d5c;
1298
+ }
1299
+ .live-source-reconfigure {
1300
+ margin-left: auto;
1301
+ padding: 3px 8px;
1302
+ border-radius: 5px;
1303
+ border: 1px solid #2a9d5c;
1304
+ background: transparent;
1305
+ color: #2a9d5c;
1182
1306
  font-size: 11px;
1183
- font-weight: 700;
1307
+ cursor: pointer;
1184
1308
  }
1185
- .workspace-widget-settings input,
1186
- .workspace-widget-settings textarea {
1187
- width: 100%;
1188
- box-sizing: border-box;
1189
- border: 1px solid #e5e5e5;
1309
+
1310
+ /* "Configure →" label on Live Source entry in type picker */
1311
+ .workspace-source-configure {
1312
+ font-size: 11px;
1313
+ color: #888;
1314
+ margin-left: auto;
1315
+ }
1316
+ .workspace-source-object-row.live-source-entry {
1317
+ cursor: pointer;
1318
+ }
1319
+
1320
+ /* Resolver management in management panel */
1321
+ .workspace-readiness-action {
1322
+ padding: 4px 10px;
1323
+ border-radius: 5px;
1324
+ border: 1px solid #ddd;
1325
+ background: #fff;
1326
+ font-size: 12px;
1327
+ cursor: pointer;
1328
+ }
1329
+ .workspace-readiness-action:disabled { opacity: 0.5; cursor: default; }
1330
+ .resolver-upload-result span { font-weight: 600; }
1331
+ .resolver-upload-result.good span { color: #1a7a44; }
1332
+ .resolver-upload-result.error span { color: #b02020; }
1333
+ .workspace-toolbar-actions select,
1334
+ .workspace-widget-settings select {
1335
+ min-height: 32px;
1336
+ border: 1px solid #dcdcdc;
1190
1337
  border-radius: 6px;
1191
- background: #fafafa;
1338
+ background: #ffffff;
1192
1339
  color: #444;
1193
1340
  font: inherit;
1194
- padding: 8px 9px;
1341
+ padding: 0 8px;
1195
1342
  }
1196
- .workspace-widget-settings textarea {
1197
- min-height: 120px;
1198
- resize: vertical;
1343
+ .workspace-hidden-input {
1344
+ display: none;
1199
1345
  }
1200
- .workspace-settings-list {
1346
+ .workspace-grid {
1347
+ position: relative;
1348
+ display: grid;
1349
+ grid-template-columns: repeat(var(--workspace-columns), minmax(48px, 1fr));
1350
+ grid-template-rows: repeat(var(--workspace-rows), 52px);
1351
+ grid-auto-rows: 52px;
1352
+ gap: 8px;
1353
+ padding: 8px;
1354
+ }
1355
+ .workspace-grid-cell {
1356
+ appearance: none;
1357
+ border: 1px solid #ededed;
1358
+ border-radius: 7px;
1359
+ background: #fdfdfd;
1360
+ cursor: crosshair;
1361
+ padding: 0;
1362
+ }
1363
+ .workspace-grid-cell:disabled {
1364
+ pointer-events: none;
1365
+ opacity: 1;
1366
+ }
1367
+ .workspace-add-widget {
1368
+ z-index: 1;
1369
+ display: grid;
1370
+ place-items: center;
1371
+ align-content: center;
1372
+ gap: 8px;
1373
+ border: 1px solid #e6e6e6;
1374
+ border-radius: 7px;
1375
+ background: #ffffff;
1376
+ color: #3d3d3d;
1377
+ cursor: pointer;
1378
+ }
1379
+ .workspace-add-widget.selecting {
1380
+ border-color: #7aa2ff;
1381
+ background: rgba(122, 162, 255, 0.16);
1382
+ box-shadow: inset 0 0 0 1px rgba(84, 125, 255, 0.35);
1383
+ }
1384
+ .workspace-add-widget small {
1385
+ color: #979797;
1386
+ }
1387
+ .workspace-widget-icon {
1388
+ width: 92px;
1389
+ height: 68px;
1390
+ display: grid;
1391
+ place-items: center;
1392
+ border: 1px solid #d8e7ee;
1393
+ border-radius: 16px;
1394
+ background: #edfaff;
1395
+ transform: rotate(-30deg) skewX(18deg);
1396
+ }
1397
+ .workspace-widget-icon span {
1398
+ width: 56px;
1399
+ height: 38px;
1400
+ border: 3px solid #277cad;
1401
+ border-radius: 3px;
1402
+ background: #b9ecff;
1403
+ }
1404
+ .workspace-widget-preview {
1405
+ position: relative;
1406
+ z-index: 2;
1407
+ border: 1px solid #dedede;
1408
+ border-radius: 7px;
1409
+ background: #ffffff;
1410
+ padding: 12px;
1411
+ cursor: pointer;
1412
+ overflow: hidden;
1413
+ }
1414
+ .workspace-grid.moving-widget .workspace-widget-preview {
1415
+ cursor: grabbing;
1416
+ }
1417
+ .workspace-widget-preview.selected {
1418
+ border-color: #3f68ff;
1419
+ box-shadow: inset 0 0 0 1px rgba(63, 104, 255, 0.45);
1420
+ }
1421
+ .workspace-resize-handle {
1422
+ position: absolute;
1423
+ z-index: 3;
1424
+ width: 13px;
1425
+ height: 13px;
1426
+ border: 1px solid #3f68ff;
1427
+ border-radius: 4px;
1428
+ background: #ffffff;
1429
+ box-shadow: 0 1px 3px rgba(63, 104, 255, 0.22);
1430
+ padding: 0;
1431
+ }
1432
+ .workspace-resize-handle.nw {
1433
+ top: -6px;
1434
+ left: -6px;
1435
+ cursor: nwse-resize;
1436
+ }
1437
+ .workspace-resize-handle.ne {
1438
+ top: -6px;
1439
+ right: -6px;
1440
+ cursor: nesw-resize;
1441
+ }
1442
+ .workspace-resize-handle.sw {
1443
+ bottom: -6px;
1444
+ left: -6px;
1445
+ cursor: nesw-resize;
1446
+ }
1447
+ .workspace-resize-handle.se {
1448
+ right: -6px;
1449
+ bottom: -6px;
1450
+ cursor: nwse-resize;
1451
+ }
1452
+ .workspace-widget-preview-title {
1453
+ display: flex;
1454
+ align-items: center;
1455
+ gap: 8px;
1456
+ min-height: 22px;
1457
+ }
1458
+ .workspace-widget-preview-title span,
1459
+ .workspace-widget-preview-title button {
1460
+ color: #888;
1461
+ font-size: 11px;
1462
+ }
1463
+ .workspace-widget-drag-handle {
1464
+ cursor: grab;
1465
+ user-select: none;
1466
+ }
1467
+ .workspace-grid.moving-widget .workspace-widget-drag-handle {
1468
+ cursor: grabbing;
1469
+ }
1470
+ .workspace-widget-preview-title strong {
1471
+ min-width: 0;
1472
+ flex: 1;
1473
+ overflow: hidden;
1474
+ color: #333;
1475
+ font-size: 13px;
1476
+ text-overflow: ellipsis;
1477
+ white-space: nowrap;
1478
+ }
1479
+ .workspace-widget-source-chip {
1480
+ max-width: 150px;
1481
+ min-width: 0;
1482
+ flex: 0 1 auto;
1483
+ overflow: hidden;
1484
+ border: 1px solid #d1d5db;
1485
+ border-radius: 999px;
1486
+ background: #fff;
1487
+ color: #374151;
1488
+ padding: 2px 8px;
1489
+ font-size: 11px;
1490
+ font-weight: 600;
1491
+ line-height: 16px;
1492
+ text-overflow: ellipsis;
1493
+ white-space: nowrap;
1494
+ }
1495
+ .workspace-widget-preview-title button {
1496
+ width: 22px;
1497
+ height: 22px;
1498
+ border: 0;
1499
+ border-radius: 5px;
1500
+ background: transparent;
1501
+ }
1502
+ .workspace-widget-preview:not(.selected) .workspace-widget-preview-title button {
1503
+ visibility: hidden;
1504
+ }
1505
+ .workspace-view-table {
1506
+ margin-top: 10px;
1507
+ border: 1px solid #eeeeee;
1508
+ border-radius: 4px;
1509
+ overflow: hidden;
1510
+ color: #555;
1511
+ font-size: 12px;
1512
+ }
1513
+ .workspace-view-table div {
1514
+ display: grid;
1515
+ grid-template-columns: repeat(var(--workspace-view-columns, 2), minmax(0, 1fr));
1516
+ min-height: 25px;
1517
+ border-bottom: 1px solid #eeeeee;
1518
+ }
1519
+ .workspace-view-table span {
1520
+ min-width: 0;
1521
+ overflow: hidden;
1522
+ padding: 5px 8px;
1523
+ text-overflow: ellipsis;
1524
+ white-space: nowrap;
1525
+ }
1526
+ .workspace-view-table span + span {
1527
+ border-left: 1px solid #eeeeee;
1528
+ }
1529
+ .workspace-view-empty {
1530
+ display: flex !important;
1531
+ align-items: center;
1532
+ justify-content: center;
1533
+ min-height: 72px !important;
1534
+ color: #9ca3af;
1535
+ font-weight: 600;
1536
+ }
1537
+ .workspace-view-table footer {
1538
+ padding: 7px 8px;
1539
+ color: #999;
1540
+ }
1541
+ .workspace-iframe-preview {
1542
+ height: calc(100% - 34px);
1543
+ min-height: 90px;
1544
+ display: grid;
1545
+ place-items: center;
1546
+ margin-top: 10px;
1547
+ border-radius: 7px;
1548
+ background: #fdfdfd;
1549
+ color: #d54040;
1550
+ font-size: 12px;
1551
+ }
1552
+ .workspace-rich-text-preview {
1553
+ margin: 18px 10px 0;
1554
+ color: #444;
1555
+ font-size: 13px;
1556
+ line-height: 1.5;
1557
+ }
1558
+ .workspace-chart-preview {
1559
+ height: calc(100% - 42px);
1560
+ min-height: 96px;
1561
+ display: flex;
1562
+ align-items: end;
1563
+ gap: 8px;
1564
+ padding: 16px 10px 6px;
1565
+ }
1566
+ .workspace-chart-preview span {
1567
+ flex: 1;
1568
+ border-radius: 5px 5px 0 0;
1569
+ background: var(--chart-accent, #d9e4ff);
1570
+ }
1571
+ .workspace-widget-panel {
1572
+ border-left: 1px solid #e8e8e8;
1573
+ padding: 0 12px 16px;
1574
+ max-height: 100vh;
1575
+ overflow-y: auto;
1576
+ overscroll-behavior: contain;
1577
+ }
1578
+ .workspace-panel-title {
1579
+ height: 48px;
1580
+ display: flex;
1581
+ align-items: center;
1582
+ gap: 10px;
1583
+ border-bottom: 1px solid #ececec;
1584
+ }
1585
+ .workspace-panel-title button,
1586
+ .workspace-panel-title > span {
1587
+ width: 24px;
1588
+ height: 24px;
1589
+ display: grid;
1590
+ place-items: center;
1591
+ border: 0;
1592
+ border-radius: 5px;
1593
+ background: #f1f1f1;
1594
+ color: #888;
1595
+ }
1596
+ .workspace-panel-title strong {
1597
+ min-width: 0;
1598
+ font-size: 14px;
1599
+ overflow: hidden;
1600
+ text-overflow: ellipsis;
1601
+ white-space: nowrap;
1602
+ }
1603
+ .workspace-panel-title em {
1604
+ color: #999;
1605
+ font-size: 12px;
1606
+ font-style: normal;
1607
+ }
1608
+ .workspace-panel-label {
1609
+ margin: 14px 0 7px;
1610
+ color: #999;
1611
+ font-size: 11px;
1612
+ font-weight: 700;
1613
+ }
1614
+ .workspace-widget-types {
1615
+ display: grid;
1616
+ gap: 2px;
1617
+ }
1618
+ .workspace-widget-types button {
1619
+ display: flex;
1620
+ align-items: center;
1621
+ gap: 10px;
1622
+ min-height: 34px;
1623
+ border: 0;
1624
+ border-radius: 5px;
1625
+ background: transparent;
1626
+ color: #666;
1627
+ padding: 0 8px;
1628
+ text-align: left;
1629
+ }
1630
+ .workspace-widget-types button:hover {
1631
+ background: #f2f2f2;
1632
+ }
1633
+ .workspace-widget-types span {
1634
+ width: 20px;
1635
+ height: 20px;
1636
+ display: grid;
1637
+ place-items: center;
1638
+ border: 1px solid #d8d8d8;
1639
+ border-radius: 4px;
1640
+ color: #777;
1641
+ font-size: 11px;
1642
+ }
1643
+ .workspace-bindings {
1644
+ border-top: 1px solid #ececec;
1645
+ margin-top: 16px;
1646
+ }
1647
+ .workspace-bindings div {
1648
+ display: flex;
1649
+ justify-content: space-between;
1650
+ gap: 8px;
1651
+ align-items: center;
1652
+ min-height: 30px;
1653
+ color: #666;
1654
+ font-size: 12px;
1655
+ }
1656
+ .workspace-bindings code {
1657
+ color: #777;
1658
+ background: #f4f4f4;
1659
+ }
1660
+ .workspace-widget-settings {
1661
+ display: grid;
1662
+ gap: 14px;
1663
+ padding-top: 14px;
1664
+ }
1665
+ .workspace-field-stack {
1666
+ display: grid;
1667
+ gap: 12px;
1668
+ }
1669
+ .workspace-widget-settings label {
1670
+ display: grid;
1671
+ gap: 6px;
1672
+ }
1673
+ .workspace-widget-settings label span {
1674
+ color: #999;
1675
+ font-size: 11px;
1676
+ font-weight: 700;
1677
+ }
1678
+ .workspace-widget-settings input,
1679
+ .workspace-widget-settings textarea {
1680
+ width: 100%;
1681
+ box-sizing: border-box;
1682
+ border: 1px solid #e5e5e5;
1683
+ border-radius: 6px;
1684
+ background: #fafafa;
1685
+ color: #444;
1686
+ font: inherit;
1687
+ padding: 8px 9px;
1688
+ }
1689
+ .workspace-widget-settings textarea {
1690
+ min-height: 120px;
1691
+ resize: vertical;
1692
+ }
1693
+ .workspace-settings-list {
1694
+ display: grid;
1695
+ gap: 2px;
1696
+ }
1697
+ .workspace-settings-list div {
1698
+ display: flex;
1699
+ align-items: center;
1700
+ justify-content: space-between;
1701
+ min-height: 32px;
1702
+ border-radius: 5px;
1703
+ color: #666;
1704
+ font-size: 13px;
1705
+ padding: 0 8px;
1706
+ }
1707
+ .workspace-settings-list div:nth-child(3),
1708
+ .workspace-settings-list div:hover {
1709
+ background: #f3f3f3;
1710
+ }
1711
+ .workspace-settings-list code {
1712
+ color: #aaa;
1713
+ background: transparent;
1714
+ }
1715
+
1716
+ @media (max-width: 1080px) {
1717
+ .workspace-builder {
1718
+ grid-template-columns: 180px minmax(0, 1fr);
1719
+ }
1720
+ .workspace-widget-panel {
1721
+ grid-column: 1 / -1;
1722
+ border-left: 0;
1723
+ border-top: 1px solid #e8e8e8;
1724
+ }
1725
+ }
1726
+
1727
+ @media (max-width: 720px) {
1728
+ .workspace-builder {
1729
+ grid-template-columns: 1fr;
1730
+ }
1731
+ .workspace-rail {
1732
+ border-right: 0;
1733
+ border-bottom: 1px solid #e8e8e8;
1734
+ }
1735
+ .workspace-table-row {
1736
+ grid-template-columns: 1fr;
1737
+ }
1738
+ .workspace-table-head {
1739
+ display: none;
1740
+ }
1741
+ .workspace-table-row span,
1742
+ .workspace-table-row code {
1743
+ border-right: 0;
1744
+ }
1745
+ .workspace-grid {
1746
+ grid-template-columns: repeat(4, minmax(44px, 1fr));
1747
+ }
1748
+ .workspace-add-widget {
1749
+ grid-column: 1 / -1;
1750
+ }
1751
+ }
1752
+
1753
+ .template-gallery {
1754
+ position: fixed;
1755
+ inset: 0;
1756
+ z-index: 60;
1757
+ display: flex;
1758
+ align-items: stretch;
1759
+ justify-content: center;
1760
+ }
1761
+ .template-gallery-backdrop {
1762
+ position: absolute;
1763
+ inset: 0;
1764
+ background: rgba(15, 15, 15, 0.42);
1765
+ }
1766
+ .template-gallery-panel {
1767
+ position: relative;
1768
+ margin: 32px auto;
1769
+ width: min(1080px, calc(100vw - 32px));
1770
+ max-height: calc(100vh - 64px);
1771
+ overflow: auto;
1772
+ background: #ffffff;
1773
+ border: 1px solid #e3e3e3;
1774
+ border-radius: 12px;
1775
+ box-shadow: 0 20px 60px rgba(15, 15, 15, 0.18);
1776
+ padding: 18px 18px 14px;
1777
+ }
1778
+ .template-gallery-header {
1779
+ display: flex;
1780
+ align-items: center;
1781
+ justify-content: space-between;
1782
+ gap: 16px;
1783
+ margin-bottom: 14px;
1784
+ }
1785
+ .template-gallery-header p {
1786
+ margin: 0 0 2px;
1787
+ color: #888;
1788
+ font-size: 11px;
1789
+ text-transform: uppercase;
1790
+ }
1791
+ .template-gallery-header h2 {
1792
+ margin: 0;
1793
+ font-size: 16px;
1794
+ line-height: 1.2;
1795
+ }
1796
+ .template-gallery-header button {
1797
+ min-height: 30px;
1798
+ min-width: 30px;
1799
+ border: 1px solid #dedede;
1800
+ border-radius: 6px;
1801
+ background: #ffffff;
1802
+ color: #4f4f4f;
1803
+ font: inherit;
1804
+ cursor: pointer;
1805
+ }
1806
+ .template-gallery-grid {
1807
+ display: grid;
1808
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
1809
+ gap: 14px;
1810
+ }
1811
+ .template-card {
1812
+ display: flex;
1813
+ flex-direction: column;
1814
+ gap: 8px;
1815
+ border: 1px solid #e7e7e7;
1816
+ border-radius: 10px;
1817
+ background: #fcfcfc;
1818
+ padding: 12px;
1819
+ }
1820
+ .template-card.previewing {
1821
+ border-color: #9aa9ff;
1822
+ box-shadow: 0 0 0 2px rgba(154, 169, 255, 0.18);
1823
+ }
1824
+ .template-card-header {
1825
+ display: flex;
1826
+ align-items: center;
1827
+ justify-content: space-between;
1828
+ gap: 8px;
1829
+ }
1830
+ .template-card-header strong {
1831
+ font-size: 13px;
1832
+ }
1833
+ .template-card-category {
1834
+ font-size: 10px;
1835
+ text-transform: uppercase;
1836
+ letter-spacing: 0.04em;
1837
+ color: #5f5f5f;
1838
+ background: #efefef;
1839
+ border-radius: 999px;
1840
+ padding: 2px 8px;
1841
+ }
1842
+ .template-card-description {
1843
+ margin: 0;
1844
+ color: #555;
1845
+ font-size: 12px;
1846
+ line-height: 1.4;
1847
+ }
1848
+ .template-card-preview {
1849
+ border: 1px solid #ececec;
1850
+ border-radius: 8px;
1851
+ background: #ffffff;
1852
+ padding: 6px;
1853
+ }
1854
+ .template-mini-grid {
1855
+ position: relative;
1856
+ display: grid;
1857
+ grid-template-columns: repeat(var(--template-mini-columns, 12), 1fr);
1858
+ grid-template-rows: repeat(var(--template-mini-rows, 16), 6px);
1859
+ gap: 2px;
1860
+ background:
1861
+ repeating-linear-gradient(0deg, #f4f4f4 0 1px, transparent 1px 6px),
1862
+ repeating-linear-gradient(90deg, #f4f4f4 0 1px, transparent 1px 100%);
1863
+ border-radius: 4px;
1864
+ min-height: 96px;
1865
+ }
1866
+ .template-mini-widget {
1867
+ display: block;
1868
+ border-radius: 3px;
1869
+ border: 1px solid rgba(15, 15, 15, 0.06);
1870
+ }
1871
+ .template-mini-widget.kind-chart { background: #dbeafe; }
1872
+ .template-mini-widget.kind-view { background: #fef3c7; }
1873
+ .template-mini-widget.kind-iframe { background: #ede9fe; }
1874
+ .template-mini-widget.kind-rich-text { background: #dcfce7; }
1875
+ .template-card-meta {
1876
+ display: flex;
1877
+ flex-wrap: wrap;
1878
+ gap: 6px;
1879
+ color: #666;
1880
+ font-size: 11px;
1881
+ }
1882
+ .template-card-tags {
1883
+ display: flex;
1884
+ flex-wrap: wrap;
1885
+ gap: 4px;
1886
+ }
1887
+ .template-card-tags span {
1888
+ font-size: 10px;
1889
+ color: #4f4f4f;
1890
+ background: #f3f3f3;
1891
+ border-radius: 4px;
1892
+ padding: 2px 6px;
1893
+ }
1894
+ .template-card-actions {
1201
1895
  display: grid;
1896
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1897
+ gap: 6px;
1898
+ margin-top: 4px;
1899
+ }
1900
+ .template-card-actions button {
1901
+ min-height: 30px;
1902
+ border: 1px solid #dedede;
1903
+ border-radius: 6px;
1904
+ background: #ffffff;
1905
+ color: #2f2f2f;
1906
+ font: inherit;
1907
+ font-size: 12px;
1908
+ cursor: pointer;
1909
+ padding: 0 8px;
1910
+ }
1911
+ .template-card-actions button:hover {
1912
+ background: #f7f7f7;
1913
+ }
1914
+ .template-card-actions button.primary {
1915
+ border-color: #c7d2fe;
1916
+ background: #eef2ff;
1917
+ color: #273b8f;
1918
+ font-weight: 700;
1919
+ }
1920
+ .template-card-actions button.primary:hover {
1921
+ background: #e0e7ff;
1922
+ }
1923
+ .template-gallery-footer {
1924
+ display: flex;
1925
+ flex-direction: column;
1202
1926
  gap: 2px;
1927
+ margin-top: 14px;
1928
+ padding: 10px 12px;
1929
+ border: 1px dashed #d8d8d8;
1930
+ border-radius: 8px;
1931
+ background: #fafafa;
1932
+ color: #444;
1933
+ font-size: 12px;
1934
+ }
1935
+ .template-gallery-footer strong {
1936
+ font-size: 13px;
1937
+ }
1938
+
1939
+ @media (max-width: 720px) {
1940
+ .template-gallery-panel {
1941
+ margin: 16px;
1942
+ width: calc(100vw - 32px);
1943
+ padding: 14px;
1944
+ }
1945
+ .template-gallery-grid {
1946
+ grid-template-columns: 1fr;
1947
+ }
1948
+ .template-card-actions {
1949
+ grid-template-columns: 1fr;
1950
+ }
1951
+ }
1952
+
1953
+ /*
1954
+ * Widget panel — Twenty-style action row, empty state, inline field hints.
1955
+ * Additive to the existing .workspace-widget-* vocabulary.
1956
+ */
1957
+ .workspace-widget-actions {
1958
+ display: flex;
1959
+ gap: 6px;
1960
+ margin-top: 10px;
1961
+ padding-bottom: 10px;
1962
+ border-bottom: 1px solid #ececec;
1963
+ }
1964
+ .workspace-widget-actions button {
1965
+ flex: 1;
1966
+ min-height: 30px;
1967
+ border: 1px solid #dedede;
1968
+ border-radius: 6px;
1969
+ background: #ffffff;
1970
+ color: #3d3d3d;
1971
+ cursor: pointer;
1972
+ font: inherit;
1973
+ font-size: 12px;
1974
+ padding: 0 8px;
1975
+ }
1976
+ .workspace-widget-actions button:hover {
1977
+ background: #f7f7f7;
1978
+ }
1979
+ .workspace-widget-actions button.danger {
1980
+ color: #b3261e;
1981
+ border-color: #f0c5c2;
1982
+ background: #fff7f6;
1983
+ }
1984
+ .workspace-widget-actions button.danger:hover {
1985
+ background: #fdeae8;
1986
+ }
1987
+ .workspace-widget-empty {
1988
+ display: grid;
1989
+ gap: 6px;
1990
+ margin-top: 14px;
1991
+ padding: 12px;
1992
+ border: 1px dashed #d8d8d8;
1993
+ border-radius: 8px;
1994
+ background: #fafafa;
1995
+ }
1996
+ .workspace-widget-empty strong {
1997
+ color: #2c2c2c;
1998
+ font-size: 13px;
1999
+ }
2000
+ .workspace-widget-empty p {
2001
+ margin: 0;
2002
+ color: #666;
2003
+ font-size: 12px;
2004
+ line-height: 1.5;
2005
+ }
2006
+ .workspace-field-with-hint {
2007
+ position: relative;
2008
+ }
2009
+ .workspace-field-hint {
2010
+ display: block;
2011
+ margin-top: 4px;
2012
+ color: #888;
2013
+ font-size: 11px;
2014
+ font-style: normal;
2015
+ }
2016
+ .workspace-field-hint.good {
2017
+ color: #15803d;
2018
+ }
2019
+ .workspace-field-hint.warn {
2020
+ color: #92400e;
2021
+ }
2022
+
2023
+ /*
2024
+ * Workspace Settings + Management overlays.
2025
+ * Inspect-only panels sourced from GET /api/workspace + describePersistenceMode().
2026
+ * Visual vocabulary mirrors .template-gallery (modal + backdrop + white panel)
2027
+ * and .workspace-* (light theme, thin borders, subtle muted text).
2028
+ */
2029
+ .workspace-nav-button {
2030
+ display: block;
2031
+ width: 100%;
2032
+ border: 0;
2033
+ border-radius: 6px;
2034
+ background: transparent;
2035
+ color: #686868;
2036
+ cursor: pointer;
2037
+ font: inherit;
2038
+ font-size: 13px;
2039
+ padding: 8px 9px;
2040
+ text-align: left;
2041
+ text-decoration: none;
2042
+ }
2043
+ .workspace-nav-button:hover,
2044
+ .workspace-nav-button:focus {
2045
+ background: #f1f1f1;
2046
+ color: #2c2c2c;
2047
+ outline: none;
2048
+ }
2049
+ .workspace-overlay {
2050
+ position: fixed;
2051
+ inset: 0;
2052
+ z-index: 60;
2053
+ display: flex;
2054
+ align-items: stretch;
2055
+ justify-content: center;
2056
+ }
2057
+ .workspace-overlay-backdrop {
2058
+ position: absolute;
2059
+ inset: 0;
2060
+ background: rgba(15, 15, 15, 0.42);
2061
+ }
2062
+ .workspace-overlay-panel {
2063
+ position: relative;
2064
+ margin: 32px auto;
2065
+ width: min(960px, calc(100vw - 32px));
2066
+ max-height: calc(100vh - 64px);
2067
+ overflow: auto;
2068
+ background: #ffffff;
2069
+ border: 1px solid #e3e3e3;
2070
+ border-radius: 12px;
2071
+ box-shadow: 0 20px 60px rgba(15, 15, 15, 0.18);
2072
+ padding: 18px 18px 14px;
2073
+ }
2074
+ .workspace-overlay-header {
2075
+ display: flex;
2076
+ align-items: center;
2077
+ justify-content: space-between;
2078
+ gap: 16px;
2079
+ margin-bottom: 12px;
2080
+ }
2081
+ .workspace-overlay-header p {
2082
+ margin: 0 0 2px;
2083
+ color: #888;
2084
+ font-size: 11px;
2085
+ text-transform: uppercase;
2086
+ letter-spacing: 0.04em;
2087
+ }
2088
+ .workspace-overlay-header h2 {
2089
+ margin: 0;
2090
+ font-size: 16px;
2091
+ line-height: 1.2;
2092
+ }
2093
+ .workspace-overlay-header button {
2094
+ min-height: 30px;
2095
+ min-width: 30px;
2096
+ border: 1px solid #dedede;
2097
+ border-radius: 6px;
2098
+ background: #ffffff;
2099
+ color: #4f4f4f;
2100
+ font: inherit;
2101
+ cursor: pointer;
2102
+ }
2103
+ .workspace-overlay-note {
2104
+ margin: 0 0 16px;
2105
+ padding: 10px 12px;
2106
+ border: 1px dashed #d8d8d8;
2107
+ border-radius: 8px;
2108
+ background: #fafafa;
2109
+ color: #555;
2110
+ font-size: 12px;
2111
+ line-height: 1.5;
2112
+ }
2113
+ .workspace-overlay-note code {
2114
+ background: #f4f4f4;
2115
+ border-radius: 4px;
2116
+ color: #444;
2117
+ font-size: 11px;
2118
+ padding: 1px 5px;
2119
+ }
2120
+ .workspace-readiness {
2121
+ display: grid;
2122
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2123
+ gap: 14px;
2124
+ }
2125
+ .workspace-readiness-section {
2126
+ display: grid;
2127
+ align-content: start;
2128
+ gap: 6px;
2129
+ border: 1px solid #e7e7e7;
2130
+ border-radius: 10px;
2131
+ background: #fcfcfc;
2132
+ padding: 14px;
2133
+ }
2134
+ .workspace-readiness-section h3 {
2135
+ margin: 0 0 4px;
2136
+ color: #333;
2137
+ font-size: 13px;
2138
+ font-weight: 700;
2139
+ }
2140
+ .workspace-readiness-row {
2141
+ display: grid;
2142
+ grid-template-columns: minmax(120px, 0.6fr) minmax(0, 1fr);
2143
+ gap: 10px;
2144
+ align-items: center;
2145
+ min-height: 28px;
2146
+ border-top: 1px solid #f0f0f0;
2147
+ padding: 6px 0;
2148
+ }
2149
+ .workspace-readiness-row:first-of-type {
2150
+ border-top: 0;
2151
+ padding-top: 0;
2152
+ }
2153
+ .workspace-readiness-row > span:first-child {
2154
+ color: #999;
2155
+ font-size: 11px;
2156
+ font-weight: 700;
2157
+ text-transform: uppercase;
2158
+ letter-spacing: 0.04em;
1203
2159
  }
1204
- .workspace-settings-list div {
1205
- display: flex;
1206
- align-items: center;
1207
- justify-content: space-between;
1208
- min-height: 32px;
1209
- border-radius: 5px;
1210
- color: #666;
2160
+ .workspace-readiness-row strong {
2161
+ min-width: 0;
2162
+ color: #2c2c2c;
1211
2163
  font-size: 13px;
1212
- padding: 0 8px;
2164
+ font-weight: 600;
2165
+ word-break: break-word;
1213
2166
  }
1214
- .workspace-settings-list div:nth-child(3),
1215
- .workspace-settings-list div:hover {
1216
- background: #f3f3f3;
2167
+ .workspace-readiness-row em {
2168
+ min-width: 0;
2169
+ color: #666;
2170
+ font-size: 12px;
2171
+ font-style: normal;
2172
+ line-height: 1.45;
2173
+ word-break: break-word;
1217
2174
  }
1218
- .workspace-settings-list code {
1219
- color: #aaa;
1220
- background: transparent;
2175
+ .workspace-readiness-row code {
2176
+ min-width: 0;
2177
+ background: #f4f4f4;
2178
+ border-radius: 4px;
2179
+ color: #555;
2180
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
2181
+ font-size: 11px;
2182
+ padding: 2px 6px;
2183
+ word-break: break-word;
1221
2184
  }
1222
-
1223
- @media (max-width: 1080px) {
1224
- .workspace-builder {
1225
- grid-template-columns: 180px minmax(0, 1fr);
1226
- }
1227
- .workspace-widget-panel {
1228
- grid-column: 1 / -1;
1229
- border-left: 0;
1230
- border-top: 1px solid #e8e8e8;
1231
- }
2185
+ .workspace-readiness-empty {
2186
+ grid-template-columns: 1fr;
2187
+ }
2188
+ .workspace-readiness-empty em {
2189
+ color: #888;
2190
+ }
2191
+ .workspace-readiness-badge {
2192
+ display: inline-flex;
2193
+ align-items: center;
2194
+ justify-content: center;
2195
+ border: 1px solid #e1e1e1;
2196
+ border-radius: 999px;
2197
+ background: #f5f5f5;
2198
+ color: #444;
2199
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
2200
+ font-size: 11px;
2201
+ font-weight: 600;
2202
+ padding: 3px 9px;
2203
+ white-space: nowrap;
2204
+ }
2205
+ .workspace-readiness-badge.good {
2206
+ background: rgba(34, 197, 94, 0.12);
2207
+ border-color: rgba(34, 197, 94, 0.45);
2208
+ color: #15803d;
2209
+ }
2210
+ .workspace-readiness-badge.warn {
2211
+ background: rgba(245, 158, 11, 0.12);
2212
+ border-color: rgba(245, 158, 11, 0.45);
2213
+ color: #92400e;
2214
+ }
2215
+ .workspace-readiness-badge.mode-filesystem {
2216
+ background: rgba(34, 197, 94, 0.12);
2217
+ border-color: rgba(34, 197, 94, 0.45);
2218
+ color: #15803d;
2219
+ }
2220
+ .workspace-readiness-badge.mode-read-only {
2221
+ background: rgba(245, 158, 11, 0.12);
2222
+ border-color: rgba(245, 158, 11, 0.45);
2223
+ color: #92400e;
2224
+ }
2225
+ .workspace-readiness-badge.mode-database {
2226
+ background: rgba(56, 189, 248, 0.12);
2227
+ border-color: rgba(56, 189, 248, 0.5);
2228
+ color: #075985;
1232
2229
  }
1233
2230
 
1234
2231
  @media (max-width: 720px) {
1235
- .workspace-builder {
1236
- grid-template-columns: 1fr;
1237
- }
1238
- .workspace-rail {
1239
- border-right: 0;
1240
- border-bottom: 1px solid #e8e8e8;
2232
+ .workspace-overlay-panel {
2233
+ margin: 16px;
2234
+ width: calc(100vw - 32px);
2235
+ padding: 14px;
1241
2236
  }
1242
- .workspace-table-row {
2237
+ .workspace-readiness {
1243
2238
  grid-template-columns: 1fr;
1244
2239
  }
1245
- .workspace-table-head {
1246
- display: none;
1247
- }
1248
- .workspace-table-row span,
1249
- .workspace-table-row code {
1250
- border-right: 0;
1251
- }
1252
- .workspace-grid {
1253
- grid-template-columns: repeat(4, minmax(44px, 1fr));
1254
- }
1255
- .workspace-add-widget {
1256
- grid-column: 1 / -1;
1257
- }
1258
2240
  }
1259
2241
 
1260
- .template-gallery {
1261
- position: fixed;
1262
- inset: 0;
1263
- z-index: 60;
2242
+ /* === V1.1 builder extensions: sub-panel navigation, source/fields/sort/filter, chart, command palette === */
2243
+
2244
+ .workspace-widget-subpanel {
2245
+ display: grid;
2246
+ gap: 12px;
2247
+ padding-top: 8px;
2248
+ }
2249
+ .workspace-widget-subpanel-header {
1264
2250
  display: flex;
1265
- align-items: stretch;
2251
+ align-items: center;
2252
+ gap: 10px;
2253
+ padding: 6px 0 8px;
2254
+ border-bottom: 1px solid #ececec;
2255
+ }
2256
+ .workspace-widget-subpanel-header div {
2257
+ display: flex;
2258
+ flex-direction: column;
2259
+ min-width: 0;
2260
+ }
2261
+ .workspace-widget-subpanel-header p {
2262
+ margin: 0;
2263
+ font-size: 11px;
2264
+ color: #999;
2265
+ text-transform: uppercase;
2266
+ letter-spacing: 0.04em;
2267
+ }
2268
+ .workspace-widget-subpanel-header strong {
2269
+ font-size: 14px;
2270
+ color: #444;
2271
+ white-space: nowrap;
2272
+ overflow: hidden;
2273
+ text-overflow: ellipsis;
2274
+ }
2275
+ .workspace-widget-subpanel-back {
2276
+ width: 26px;
2277
+ height: 26px;
2278
+ display: grid;
2279
+ place-items: center;
2280
+ border: 1px solid #e8e8e8;
2281
+ border-radius: 6px;
2282
+ background: #fff;
2283
+ color: #666;
2284
+ cursor: pointer;
2285
+ font-size: 16px;
2286
+ line-height: 1;
2287
+ }
2288
+ .workspace-widget-subpanel-back:hover {
2289
+ background: #f3f3f3;
2290
+ }
2291
+
2292
+ .workspace-panel-hint {
2293
+ margin: 2px 0 0;
2294
+ color: #999;
2295
+ font-size: 11px;
2296
+ line-height: 1.5;
2297
+ }
2298
+
2299
+ /* Settings row buttons (replace bare div on the root inspector list) */
2300
+ .workspace-settings-row,
2301
+ .workspace-settings-list .workspace-settings-row {
2302
+ width: 100%;
2303
+ display: flex;
2304
+ align-items: center;
2305
+ justify-content: space-between;
2306
+ gap: 10px;
2307
+ min-height: 38px;
2308
+ border: 1px solid #e8eef8;
2309
+ border-radius: 7px;
2310
+ background: #fff;
2311
+ color: #666;
2312
+ font: inherit;
2313
+ font-size: 13px;
2314
+ padding: 8px 10px;
2315
+ text-align: left;
2316
+ cursor: pointer;
2317
+ box-shadow: 0 2px 8px rgba(15, 23, 42, 0.05);
2318
+ }
2319
+ .workspace-settings-row:hover:not([disabled]),
2320
+ .workspace-settings-list .workspace-settings-row:hover:not([disabled]) {
2321
+ border-color: #d6e4ff;
2322
+ background: #fff;
2323
+ }
2324
+ .workspace-settings-row[disabled],
2325
+ .workspace-settings-list .workspace-settings-row[disabled] {
2326
+ cursor: default;
2327
+ color: #888;
2328
+ }
2329
+ .workspace-settings-row code,
2330
+ .workspace-settings-list .workspace-settings-row code {
2331
+ color: #888;
2332
+ background: transparent;
2333
+ text-align: right;
2334
+ white-space: normal;
2335
+ }
2336
+
2337
+ .workspace-settings-shell {
2338
+ min-height: 100vh;
2339
+ background: #f7f7f6;
2340
+ color: #252525;
2341
+ }
2342
+ .workspace-settings-topbar {
2343
+ position: sticky;
2344
+ top: 0;
2345
+ z-index: 5;
2346
+ display: flex;
2347
+ align-items: center;
2348
+ gap: 18px;
2349
+ border-bottom: 1px solid #e4e4e2;
2350
+ background: rgba(247, 247, 246, 0.96);
2351
+ padding: 12px 24px;
2352
+ }
2353
+ .workspace-settings-exit {
2354
+ display: inline-flex;
2355
+ align-items: center;
1266
2356
  justify-content: center;
2357
+ width: 30px;
2358
+ height: 30px;
2359
+ border: 1px solid #dedede;
2360
+ border-radius: 6px;
2361
+ background: #fff;
2362
+ color: #666;
2363
+ text-decoration: none;
1267
2364
  }
1268
- .template-gallery-backdrop {
1269
- position: absolute;
1270
- inset: 0;
1271
- background: rgba(15, 15, 15, 0.42);
2365
+ .workspace-settings-exit:hover {
2366
+ border-color: #c9c9c7;
2367
+ color: #222;
2368
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
1272
2369
  }
1273
- .template-gallery-panel {
1274
- position: relative;
1275
- margin: 32px auto;
1276
- width: min(1080px, calc(100vw - 32px));
1277
- max-height: calc(100vh - 64px);
1278
- overflow: auto;
1279
- background: #ffffff;
1280
- border: 1px solid #e3e3e3;
1281
- border-radius: 12px;
1282
- box-shadow: 0 20px 60px rgba(15, 15, 15, 0.18);
1283
- padding: 18px 18px 14px;
2370
+ .workspace-settings-tabs {
2371
+ display: flex;
2372
+ gap: 6px;
2373
+ }
2374
+ .workspace-settings-tabs a {
2375
+ min-height: 32px;
2376
+ display: flex;
2377
+ align-items: center;
2378
+ border: 1px solid transparent;
2379
+ border-radius: 6px;
2380
+ color: #5f5f5f;
2381
+ font-size: 13px;
2382
+ padding: 0 9px;
2383
+ text-decoration: none;
1284
2384
  }
1285
- .template-gallery-header {
2385
+ .workspace-settings-tabs a.active,
2386
+ .workspace-settings-tabs a:hover {
2387
+ border-color: #e4e4e2;
2388
+ background: #ffffff;
2389
+ color: #222;
2390
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
2391
+ }
2392
+ .workspace-settings-tabs a.active {
2393
+ font-weight: 700;
2394
+ }
2395
+ .workspace-settings-aside {
2396
+ margin-top: auto;
2397
+ color: #888;
2398
+ font-size: 12px;
2399
+ }
2400
+ .workspace-settings-main {
2401
+ min-width: 0;
2402
+ padding: 22px 28px 42px;
2403
+ }
2404
+ .workspace-settings-header {
2405
+ min-height: 36px;
1286
2406
  display: flex;
1287
- align-items: center;
1288
- justify-content: space-between;
1289
- gap: 16px;
1290
- margin-bottom: 14px;
2407
+ align-items: baseline;
2408
+ gap: 8px;
2409
+ margin-bottom: 18px;
1291
2410
  }
1292
- .template-gallery-header p {
1293
- margin: 0 0 2px;
2411
+ .workspace-settings-header p {
2412
+ margin: 0;
1294
2413
  color: #888;
1295
- font-size: 11px;
1296
- text-transform: uppercase;
2414
+ font-size: 13px;
1297
2415
  }
1298
- .template-gallery-header h2 {
2416
+ .workspace-settings-header h1 {
1299
2417
  margin: 0;
1300
- font-size: 16px;
1301
- line-height: 1.2;
2418
+ color: #242424;
2419
+ font-size: 14px;
1302
2420
  }
1303
- .template-gallery-header button {
1304
- min-height: 30px;
1305
- min-width: 30px;
1306
- border: 1px solid #dedede;
1307
- border-radius: 6px;
2421
+ .workspace-settings-card {
2422
+ width: min(100%, 980px);
2423
+ border: 1px solid #e2e2e0;
2424
+ border-radius: 8px;
1308
2425
  background: #ffffff;
1309
- color: #4f4f4f;
1310
- font: inherit;
1311
- cursor: pointer;
1312
- }
1313
- .template-gallery-grid {
1314
- display: grid;
1315
- grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
1316
- gap: 14px;
2426
+ padding: 24px 28px;
1317
2427
  }
1318
- .template-card {
2428
+ .workspace-apps-card {
2429
+ max-height: calc(100vh - 116px);
1319
2430
  display: flex;
1320
2431
  flex-direction: column;
1321
- gap: 8px;
1322
- border: 1px solid #e7e7e7;
1323
- border-radius: 10px;
1324
- background: #fcfcfc;
1325
- padding: 12px;
1326
- }
1327
- .template-card.previewing {
1328
- border-color: #9aa9ff;
1329
- box-shadow: 0 0 0 2px rgba(154, 169, 255, 0.18);
2432
+ overflow: hidden;
2433
+ padding-bottom: 16px;
1330
2434
  }
1331
- .template-card-header {
2435
+ .workspace-settings-card-heading {
1332
2436
  display: flex;
1333
- align-items: center;
1334
2437
  justify-content: space-between;
2438
+ gap: 16px;
2439
+ align-items: flex-start;
2440
+ margin-bottom: 24px;
2441
+ }
2442
+ .workspace-apps-card .workspace-settings-card-heading {
2443
+ flex: 0 0 auto;
2444
+ margin-bottom: 18px;
2445
+ }
2446
+ .workspace-settings-top-actions {
2447
+ display: flex;
2448
+ justify-content: flex-end;
1335
2449
  gap: 8px;
2450
+ align-items: center;
2451
+ flex-wrap: wrap;
1336
2452
  }
1337
- .template-card-header strong {
1338
- font-size: 13px;
2453
+ .workspace-settings-top-actions button {
2454
+ min-height: 32px;
2455
+ display: inline-flex;
2456
+ align-items: center;
2457
+ gap: 6px;
2458
+ border: 1px solid #d4d4d2;
2459
+ border-radius: 6px;
2460
+ background: #fff;
2461
+ color: #2f2f2f;
2462
+ font: inherit;
2463
+ font-size: 12px;
2464
+ padding: 0 10px;
1339
2465
  }
1340
- .template-card-category {
1341
- font-size: 10px;
1342
- text-transform: uppercase;
1343
- letter-spacing: 0.04em;
1344
- color: #5f5f5f;
1345
- background: #efefef;
1346
- border-radius: 999px;
1347
- padding: 2px 8px;
2466
+ .workspace-settings-top-actions button:hover:not(:disabled) {
2467
+ border-color: #c9c9c7;
2468
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
1348
2469
  }
1349
- .template-card-description {
2470
+ .workspace-settings-message {
2471
+ margin: 10px 0 0;
2472
+ color: #777;
2473
+ font-size: 13px;
2474
+ }
2475
+ .workspace-settings-card-heading h2,
2476
+ .workspace-settings-section h3 {
1350
2477
  margin: 0;
1351
- color: #555;
1352
- font-size: 12px;
1353
- line-height: 1.4;
2478
+ color: #2a2a2a;
1354
2479
  }
1355
- .template-card-preview {
1356
- border: 1px solid #ececec;
1357
- border-radius: 8px;
1358
- background: #ffffff;
1359
- padding: 6px;
2480
+ .workspace-settings-card-heading h2 {
2481
+ font-size: 18px;
1360
2482
  }
1361
- .template-mini-grid {
1362
- position: relative;
2483
+ .workspace-settings-card-heading p,
2484
+ .workspace-settings-section p,
2485
+ .workspace-settings-actions p,
2486
+ .workspace-settings-empty {
2487
+ margin: 5px 0 0;
2488
+ color: #888;
2489
+ font-size: 13px;
2490
+ line-height: 1.45;
2491
+ }
2492
+ .workspace-settings-section {
1363
2493
  display: grid;
1364
- grid-template-columns: repeat(var(--template-mini-columns, 12), 1fr);
1365
- grid-template-rows: repeat(var(--template-mini-rows, 16), 6px);
1366
- gap: 2px;
1367
- background:
1368
- repeating-linear-gradient(0deg, #f4f4f4 0 1px, transparent 1px 6px),
1369
- repeating-linear-gradient(90deg, #f4f4f4 0 1px, transparent 1px 100%);
1370
- border-radius: 4px;
1371
- min-height: 96px;
2494
+ gap: 14px;
2495
+ border-top: 1px solid #eeeeec;
2496
+ padding: 20px 0;
1372
2497
  }
1373
- .template-mini-widget {
1374
- display: block;
1375
- border-radius: 3px;
1376
- border: 1px solid rgba(15, 15, 15, 0.06);
2498
+ .workspace-apps-linkage-section {
2499
+ flex: 0 0 auto;
2500
+ padding-bottom: 16px;
1377
2501
  }
1378
- .template-mini-widget.kind-chart { background: #dbeafe; }
1379
- .template-mini-widget.kind-view { background: #fef3c7; }
1380
- .template-mini-widget.kind-iframe { background: #ede9fe; }
1381
- .template-mini-widget.kind-rich-text { background: #dcfce7; }
1382
- .template-card-meta {
1383
- display: flex;
1384
- flex-wrap: wrap;
1385
- gap: 6px;
1386
- color: #666;
1387
- font-size: 11px;
2502
+ .workspace-apps-list-section {
2503
+ min-height: 0;
2504
+ flex: 1 1 auto;
2505
+ grid-template-rows: auto minmax(0, 1fr);
2506
+ padding-bottom: 0;
1388
2507
  }
1389
- .template-card-tags {
1390
- display: flex;
1391
- flex-wrap: wrap;
1392
- gap: 4px;
2508
+ .workspace-settings-section:first-of-type {
2509
+ border-top: 0;
2510
+ padding-top: 0;
1393
2511
  }
1394
- .template-card-tags span {
1395
- font-size: 10px;
1396
- color: #4f4f4f;
1397
- background: #f3f3f3;
1398
- border-radius: 4px;
1399
- padding: 2px 6px;
2512
+ .workspace-settings-section h3 {
2513
+ font-size: 14px;
1400
2514
  }
1401
- .template-card-actions {
2515
+ .workspace-settings-section.muted {
2516
+ color: #777;
2517
+ }
2518
+ .workspace-settings-grid {
2519
+ display: grid;
2520
+ gap: 14px;
2521
+ }
2522
+ .workspace-settings-grid.two {
2523
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2524
+ }
2525
+ .workspace-settings-grid label {
1402
2526
  display: grid;
1403
- grid-template-columns: repeat(3, minmax(0, 1fr));
1404
2527
  gap: 6px;
1405
- margin-top: 4px;
1406
2528
  }
1407
- .template-card-actions button {
1408
- min-height: 30px;
2529
+ .workspace-settings-grid label span {
2530
+ color: #8b8b8b;
2531
+ font-size: 12px;
2532
+ }
2533
+ .workspace-settings-grid input {
2534
+ min-height: 34px;
2535
+ width: 100%;
1409
2536
  border: 1px solid #dedede;
1410
2537
  border-radius: 6px;
1411
- background: #ffffff;
1412
- color: #2f2f2f;
2538
+ background: #fbfbfb;
2539
+ color: #303030;
1413
2540
  font: inherit;
1414
- font-size: 12px;
1415
- cursor: pointer;
1416
- padding: 0 8px;
1417
- }
1418
- .template-card-actions button:hover {
1419
- background: #f7f7f7;
1420
- }
1421
- .template-card-actions button.primary {
1422
- border-color: #c7d2fe;
1423
- background: #eef2ff;
1424
- color: #273b8f;
1425
- font-weight: 700;
1426
- }
1427
- .template-card-actions button.primary:hover {
1428
- background: #e0e7ff;
2541
+ font-size: 13px;
2542
+ padding: 0 10px;
1429
2543
  }
1430
- .template-gallery-footer {
2544
+ .workspace-identity-preview {
1431
2545
  display: flex;
1432
- flex-direction: column;
1433
- gap: 2px;
1434
- margin-top: 14px;
1435
- padding: 10px 12px;
1436
- border: 1px dashed #d8d8d8;
2546
+ align-items: center;
2547
+ gap: 12px;
2548
+ }
2549
+ .workspace-identity-mark {
2550
+ width: 46px;
2551
+ height: 46px;
2552
+ display: grid;
2553
+ place-items: center;
2554
+ border: 1px solid #dedede;
1437
2555
  border-radius: 8px;
1438
- background: #fafafa;
1439
- color: #444;
2556
+ color: #fff;
1440
2557
  font-size: 12px;
2558
+ font-weight: 800;
2559
+ overflow: hidden;
1441
2560
  }
1442
- .template-gallery-footer strong {
1443
- font-size: 13px;
2561
+ .workspace-identity-mark img,
2562
+ .workspace-logo-placeholder img {
2563
+ width: 100%;
2564
+ height: 100%;
2565
+ object-fit: cover;
1444
2566
  }
1445
-
1446
- @media (max-width: 720px) {
1447
- .template-gallery-panel {
1448
- margin: 16px;
1449
- width: calc(100vw - 32px);
1450
- padding: 14px;
1451
- }
1452
- .template-gallery-grid {
1453
- grid-template-columns: 1fr;
1454
- }
1455
- .template-card-actions {
1456
- grid-template-columns: 1fr;
1457
- }
2567
+ .workspace-identity-preview strong {
2568
+ display: block;
2569
+ font-size: 14px;
1458
2570
  }
1459
-
1460
- /*
1461
- * Widget panel — Twenty-style action row, empty state, inline field hints.
1462
- * Additive to the existing .workspace-widget-* vocabulary.
1463
- */
1464
- .workspace-widget-actions {
1465
- display: flex;
1466
- gap: 6px;
1467
- margin-top: 10px;
1468
- padding-bottom: 10px;
1469
- border-bottom: 1px solid #ececec;
2571
+ .workspace-identity-preview p {
2572
+ margin: 3px 0 0;
2573
+ color: #888;
2574
+ font-size: 12px;
1470
2575
  }
1471
- .workspace-widget-actions button {
1472
- flex: 1;
1473
- min-height: 30px;
2576
+ .workspace-logo-controls {
2577
+ display: inline-flex;
2578
+ align-items: flex-start;
2579
+ gap: 14px;
2580
+ }
2581
+ .workspace-logo-preview {
2582
+ display: inline-flex;
2583
+ align-items: center;
2584
+ }
2585
+ .workspace-logo-placeholder {
2586
+ width: 56px;
2587
+ height: 56px;
2588
+ display: grid;
2589
+ place-items: center;
1474
2590
  border: 1px solid #dedede;
1475
2591
  border-radius: 6px;
1476
- background: #ffffff;
1477
- color: #3d3d3d;
2592
+ background: #f5f5f4;
2593
+ color: #fff;
2594
+ font-size: 13px;
2595
+ font-weight: 800;
2596
+ overflow: hidden;
2597
+ }
2598
+ .workspace-settings-grid.logo-grid {
2599
+ grid-template-columns: minmax(0, 1fr) 180px;
2600
+ }
2601
+ .workspace-color-field {
2602
+ display: grid;
2603
+ grid-template-columns: 38px minmax(0, 1fr);
2604
+ gap: 8px;
2605
+ }
2606
+ .workspace-color-field input[type="color"] {
2607
+ min-height: 34px;
2608
+ padding: 3px;
1478
2609
  cursor: pointer;
1479
- font: inherit;
1480
- font-size: 12px;
1481
- padding: 0 8px;
1482
2610
  }
1483
- .workspace-widget-actions button:hover {
1484
- background: #f7f7f7;
2611
+ .workspace-logo-actions {
2612
+ display: grid;
2613
+ align-content: start;
2614
+ gap: 8px;
1485
2615
  }
1486
- .workspace-widget-actions button.danger {
1487
- color: #b3261e;
1488
- border-color: #f0c5c2;
1489
- background: #fff7f6;
2616
+ .workspace-logo-actions > div {
2617
+ display: flex;
2618
+ gap: 8px;
2619
+ align-items: center;
1490
2620
  }
1491
- .workspace-widget-actions button.danger:hover {
1492
- background: #fdeae8;
2621
+ .workspace-logo-actions p {
2622
+ margin: 0;
2623
+ color: #aaa;
2624
+ font-size: 12px;
1493
2625
  }
1494
- .workspace-widget-empty {
1495
- display: grid;
2626
+ .workspace-file-button {
2627
+ min-height: 32px;
2628
+ display: inline-flex;
2629
+ align-items: center;
1496
2630
  gap: 6px;
1497
- margin-top: 14px;
1498
- padding: 12px;
1499
- border: 1px dashed #d8d8d8;
1500
- border-radius: 8px;
1501
- background: #fafafa;
2631
+ border: 1px solid #dedede;
2632
+ border-radius: 6px;
2633
+ background: #fff;
2634
+ color: #333;
2635
+ font-size: 12px;
2636
+ padding: 0 10px;
2637
+ cursor: pointer;
1502
2638
  }
1503
- .workspace-widget-empty strong {
1504
- color: #2c2c2c;
1505
- font-size: 13px;
2639
+ .workspace-file-button input {
2640
+ position: absolute;
2641
+ width: 1px;
2642
+ height: 1px;
2643
+ overflow: hidden;
2644
+ opacity: 0;
2645
+ pointer-events: none;
1506
2646
  }
1507
- .workspace-widget-empty p {
1508
- margin: 0;
2647
+ .workspace-settings-pill {
2648
+ min-height: 28px;
2649
+ display: inline-flex;
2650
+ align-items: center;
2651
+ border: 1px solid #dedede;
2652
+ border-radius: 999px;
2653
+ background: #fafafa;
1509
2654
  color: #666;
1510
2655
  font-size: 12px;
1511
- line-height: 1.5;
2656
+ padding: 0 9px;
2657
+ white-space: nowrap;
1512
2658
  }
1513
- .workspace-field-with-hint {
1514
- position: relative;
2659
+ .workspace-settings-pill.good,
2660
+ .workspace-settings-status-row strong.good {
2661
+ color: #15803d;
1515
2662
  }
1516
- .workspace-field-hint {
1517
- display: block;
1518
- margin-top: 4px;
2663
+ .workspace-settings-pill.warn {
2664
+ color: #a16207;
2665
+ }
2666
+ .workspace-settings-kv,
2667
+ .workspace-settings-status-grid {
2668
+ display: grid;
2669
+ grid-template-columns: minmax(140px, 0.42fr) minmax(0, 1fr);
2670
+ gap: 8px 12px;
2671
+ align-items: center;
2672
+ }
2673
+ .workspace-settings-kv span,
2674
+ .workspace-settings-status-row span {
1519
2675
  color: #888;
2676
+ font-size: 12px;
2677
+ }
2678
+ .workspace-settings-kv code,
2679
+ .workspace-app-row code {
2680
+ width: fit-content;
2681
+ max-width: 100%;
2682
+ border: 1px solid #e1e1df;
2683
+ border-radius: 999px;
2684
+ background: #fafafa;
2685
+ color: #666;
1520
2686
  font-size: 11px;
1521
- font-style: normal;
2687
+ padding: 4px 7px;
2688
+ word-break: break-word;
1522
2689
  }
1523
- .workspace-field-hint.good {
1524
- color: #15803d;
2690
+ .workspace-settings-status-row {
2691
+ display: contents;
1525
2692
  }
1526
- .workspace-field-hint.warn {
1527
- color: #92400e;
2693
+ .workspace-settings-status-row strong {
2694
+ font-size: 13px;
2695
+ font-weight: 650;
1528
2696
  }
1529
-
1530
- /*
1531
- * Workspace Settings + Management overlays.
1532
- * Inspect-only panels sourced from GET /api/workspace + describePersistenceMode().
1533
- * Visual vocabulary mirrors .template-gallery (modal + backdrop + white panel)
1534
- * and .workspace-* (light theme, thin borders, subtle muted text).
1535
- */
1536
- .workspace-nav-button {
1537
- display: block;
1538
- width: 100%;
1539
- border: 0;
2697
+ .workspace-settings-actions {
2698
+ display: flex;
2699
+ justify-content: flex-end;
2700
+ gap: 12px;
2701
+ align-items: center;
2702
+ padding-top: 2px;
2703
+ }
2704
+ .workspace-settings-actions button {
2705
+ min-height: 34px;
2706
+ border: 1px solid #d4d4d2;
1540
2707
  border-radius: 6px;
1541
- background: transparent;
1542
- color: #686868;
1543
- cursor: pointer;
2708
+ background: #fff;
2709
+ color: #2f2f2f;
1544
2710
  font: inherit;
1545
2711
  font-size: 13px;
1546
- padding: 8px 9px;
1547
- text-align: left;
1548
- text-decoration: none;
1549
- }
1550
- .workspace-nav-button:hover,
1551
- .workspace-nav-button:focus {
1552
- background: #f1f1f1;
1553
- color: #2c2c2c;
1554
- outline: none;
1555
- }
1556
- .workspace-overlay {
1557
- position: fixed;
1558
- inset: 0;
1559
- z-index: 60;
1560
- display: flex;
1561
- align-items: stretch;
1562
- justify-content: center;
2712
+ padding: 0 14px;
1563
2713
  }
1564
- .workspace-overlay-backdrop {
1565
- position: absolute;
1566
- inset: 0;
1567
- background: rgba(15, 15, 15, 0.42);
2714
+ .workspace-settings-actions button:hover:not(:disabled) {
2715
+ border-color: #0b6bff;
2716
+ color: #0b6bff;
1568
2717
  }
1569
- .workspace-overlay-panel {
1570
- position: relative;
1571
- margin: 32px auto;
1572
- width: min(960px, calc(100vw - 32px));
1573
- max-height: calc(100vh - 64px);
1574
- overflow: auto;
1575
- background: #ffffff;
1576
- border: 1px solid #e3e3e3;
1577
- border-radius: 12px;
1578
- box-shadow: 0 20px 60px rgba(15, 15, 15, 0.18);
1579
- padding: 18px 18px 14px;
2718
+ .workspace-settings-actions p {
2719
+ margin-right: auto;
1580
2720
  }
1581
- .workspace-overlay-header {
1582
- display: flex;
1583
- align-items: center;
1584
- justify-content: space-between;
1585
- gap: 16px;
1586
- margin-bottom: 12px;
2721
+ .workspace-settings-actions button:disabled {
2722
+ cursor: default;
2723
+ opacity: 0.5;
1587
2724
  }
1588
- .workspace-overlay-header p {
1589
- margin: 0 0 2px;
1590
- color: #888;
1591
- font-size: 11px;
1592
- text-transform: uppercase;
1593
- letter-spacing: 0.04em;
2725
+ .workspace-app-list {
2726
+ display: grid;
2727
+ border: 1px solid #ececea;
2728
+ border-radius: 8px;
2729
+ overflow: hidden;
1594
2730
  }
1595
- .workspace-overlay-header h2 {
1596
- margin: 0;
1597
- font-size: 16px;
1598
- line-height: 1.2;
2731
+ .workspace-paginated-list {
2732
+ min-height: 0;
2733
+ display: grid;
2734
+ grid-template-rows: minmax(0, 1fr) auto;
2735
+ gap: 10px;
1599
2736
  }
1600
- .workspace-overlay-header button {
1601
- min-height: 30px;
1602
- min-width: 30px;
1603
- border: 1px solid #dedede;
1604
- border-radius: 6px;
1605
- background: #ffffff;
1606
- color: #4f4f4f;
1607
- font: inherit;
1608
- cursor: pointer;
2737
+ .workspace-app-list.bounded,
2738
+ .workspace-secret-list {
2739
+ max-height: min(58vh, 620px);
2740
+ overflow: auto;
2741
+ overscroll-behavior: contain;
2742
+ scrollbar-gutter: stable;
1609
2743
  }
1610
- .workspace-overlay-note {
1611
- margin: 0 0 16px;
1612
- padding: 10px 12px;
1613
- border: 1px dashed #d8d8d8;
1614
- border-radius: 8px;
1615
- background: #fafafa;
1616
- color: #555;
1617
- font-size: 12px;
1618
- line-height: 1.5;
2744
+ .workspace-apps-list-section .workspace-app-list.bounded {
2745
+ max-height: none;
2746
+ min-height: 0;
2747
+ height: 100%;
1619
2748
  }
1620
- .workspace-overlay-note code {
1621
- background: #f4f4f4;
1622
- border-radius: 4px;
1623
- color: #444;
1624
- font-size: 11px;
1625
- padding: 1px 5px;
2749
+ .workspace-reference-list {
2750
+ display: grid;
2751
+ gap: 8px;
1626
2752
  }
1627
- .workspace-readiness {
2753
+ .workspace-secret-list {
1628
2754
  display: grid;
1629
- grid-template-columns: repeat(2, minmax(0, 1fr));
1630
- gap: 14px;
2755
+ gap: 10px;
1631
2756
  }
1632
- .workspace-readiness-section {
2757
+ .workspace-secret-row {
1633
2758
  display: grid;
1634
- align-content: start;
1635
- gap: 6px;
1636
- border: 1px solid #e7e7e7;
1637
- border-radius: 10px;
1638
- background: #fcfcfc;
1639
- padding: 14px;
2759
+ gap: 8px;
2760
+ border: 1px solid #ececea;
2761
+ border-radius: 8px;
2762
+ background: #fff;
2763
+ padding: 10px;
1640
2764
  }
1641
- .workspace-readiness-section h3 {
1642
- margin: 0 0 4px;
1643
- color: #333;
2765
+ .workspace-secret-row h3 {
2766
+ margin: 0;
2767
+ color: #242424;
1644
2768
  font-size: 13px;
1645
- font-weight: 700;
1646
2769
  }
1647
- .workspace-readiness-row {
2770
+ .workspace-secret-row-main {
1648
2771
  display: grid;
1649
- grid-template-columns: minmax(120px, 0.6fr) minmax(0, 1fr);
1650
- gap: 10px;
2772
+ grid-template-columns: minmax(220px, 1fr) minmax(220px, 1fr) 34px;
2773
+ gap: 8px;
1651
2774
  align-items: center;
1652
- min-height: 28px;
1653
- border-top: 1px solid #f0f0f0;
1654
- padding: 6px 0;
1655
- }
1656
- .workspace-readiness-row:first-of-type {
1657
- border-top: 0;
1658
- padding-top: 0;
1659
2775
  }
1660
- .workspace-readiness-row > span:first-child {
1661
- color: #999;
1662
- font-size: 11px;
1663
- font-weight: 700;
1664
- text-transform: uppercase;
1665
- letter-spacing: 0.04em;
1666
- }
1667
- .workspace-readiness-row strong {
1668
- min-width: 0;
1669
- color: #2c2c2c;
2776
+ .workspace-secret-row input,
2777
+ .workspace-url-field input {
2778
+ min-height: 34px;
2779
+ border: 1px solid #dedede;
2780
+ border-radius: 6px;
2781
+ background: #fbfbfb;
2782
+ color: #303030;
2783
+ font: inherit;
1670
2784
  font-size: 13px;
1671
- font-weight: 600;
1672
- word-break: break-word;
2785
+ padding: 0 10px;
1673
2786
  }
1674
- .workspace-readiness-row em {
2787
+ .workspace-key-field {
2788
+ position: relative;
2789
+ min-height: 34px;
1675
2790
  min-width: 0;
1676
- color: #666;
2791
+ border: 1px solid #dedede;
2792
+ border-radius: 6px;
2793
+ background: #fbfbfb;
2794
+ color: #222;
2795
+ font: inherit;
1677
2796
  font-size: 12px;
1678
- font-style: normal;
1679
- line-height: 1.45;
1680
- word-break: break-word;
2797
+ font-weight: 700;
2798
+ padding: 0 9px;
2799
+ text-align: left;
2800
+ overflow: hidden;
2801
+ text-overflow: ellipsis;
2802
+ white-space: nowrap;
1681
2803
  }
1682
- .workspace-readiness-row code {
1683
- min-width: 0;
1684
- background: #f4f4f4;
1685
- border-radius: 4px;
1686
- color: #555;
1687
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1688
- font-size: 11px;
1689
- padding: 2px 6px;
1690
- word-break: break-word;
2804
+ .workspace-key-field:hover::after {
2805
+ content: attr(data-tooltip);
2806
+ position: absolute;
2807
+ left: 16px;
2808
+ bottom: calc(100% + 7px);
2809
+ z-index: 10;
2810
+ border: 1px solid #d7d7d5;
2811
+ border-radius: 5px;
2812
+ background: #fff;
2813
+ color: #2f2f2f;
2814
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.12);
2815
+ font-size: 12px;
2816
+ font-weight: 500;
2817
+ padding: 6px 8px;
2818
+ white-space: nowrap;
1691
2819
  }
1692
- .workspace-readiness-empty {
1693
- grid-template-columns: 1fr;
2820
+ .workspace-key-field:hover::before {
2821
+ content: "";
2822
+ position: absolute;
2823
+ left: 28px;
2824
+ bottom: calc(100% + 2px);
2825
+ z-index: 11;
2826
+ width: 9px;
2827
+ height: 9px;
2828
+ background: #fff;
2829
+ border-right: 1px solid #d7d7d5;
2830
+ border-bottom: 1px solid #d7d7d5;
2831
+ transform: rotate(45deg);
1694
2832
  }
1695
- .workspace-readiness-empty em {
1696
- color: #888;
2833
+ .workspace-secret-field {
2834
+ display: grid;
2835
+ grid-template-columns: minmax(0, 1fr) 34px;
1697
2836
  }
1698
- .workspace-readiness-badge {
2837
+ .workspace-secret-field input {
2838
+ border-radius: 6px 0 0 6px;
2839
+ }
2840
+ .workspace-secret-field button,
2841
+ .workspace-icon-button {
2842
+ min-height: 34px;
1699
2843
  display: inline-flex;
1700
2844
  align-items: center;
1701
2845
  justify-content: center;
1702
- border: 1px solid #e1e1e1;
1703
- border-radius: 999px;
1704
- background: #f5f5f5;
1705
- color: #444;
1706
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1707
- font-size: 11px;
1708
- font-weight: 600;
1709
- padding: 3px 9px;
1710
- white-space: nowrap;
2846
+ border: 1px solid #dedede;
2847
+ background: #fff;
2848
+ color: #555;
1711
2849
  }
1712
- .workspace-readiness-badge.good {
1713
- background: rgba(34, 197, 94, 0.12);
1714
- border-color: rgba(34, 197, 94, 0.45);
1715
- color: #15803d;
2850
+ .workspace-secret-field button {
2851
+ border-left: 0;
2852
+ border-radius: 0 6px 6px 0;
1716
2853
  }
1717
- .workspace-readiness-badge.warn {
1718
- background: rgba(245, 158, 11, 0.12);
1719
- border-color: rgba(245, 158, 11, 0.45);
1720
- color: #92400e;
2854
+ .workspace-icon-button {
2855
+ border-radius: 6px;
1721
2856
  }
1722
- .workspace-readiness-badge.mode-filesystem {
1723
- background: rgba(34, 197, 94, 0.12);
1724
- border-color: rgba(34, 197, 94, 0.45);
1725
- color: #15803d;
2857
+ .workspace-url-field {
2858
+ display: grid;
2859
+ gap: 5px;
1726
2860
  }
1727
- .workspace-readiness-badge.mode-read-only {
1728
- background: rgba(245, 158, 11, 0.12);
1729
- border-color: rgba(245, 158, 11, 0.45);
1730
- color: #92400e;
2861
+ .workspace-url-field span {
2862
+ color: #8b8b8b;
2863
+ font-size: 12px;
1731
2864
  }
1732
- .workspace-readiness-badge.mode-database {
1733
- background: rgba(56, 189, 248, 0.12);
1734
- border-color: rgba(56, 189, 248, 0.5);
1735
- color: #075985;
2865
+ .workspace-link-button {
2866
+ width: fit-content;
2867
+ min-height: 28px;
2868
+ display: inline-flex;
2869
+ align-items: center;
2870
+ gap: 6px;
2871
+ border: 0;
2872
+ background: transparent;
2873
+ color: #777;
2874
+ font: inherit;
2875
+ font-size: 12px;
2876
+ padding: 0;
1736
2877
  }
1737
-
1738
- @media (max-width: 720px) {
1739
- .workspace-overlay-panel {
1740
- margin: 16px;
1741
- width: calc(100vw - 32px);
1742
- padding: 14px;
1743
- }
1744
- .workspace-readiness {
1745
- grid-template-columns: 1fr;
1746
- }
2878
+ .workspace-link-button:hover {
2879
+ color: #222;
1747
2880
  }
1748
-
1749
- /* === V1.1 builder extensions: sub-panel navigation, source/fields/sort/filter, chart, command palette === */
1750
-
1751
- .workspace-widget-subpanel {
1752
- display: grid;
1753
- gap: 12px;
1754
- padding-top: 8px;
2881
+ .workspace-add-row {
2882
+ display: flex;
2883
+ gap: 8px;
1755
2884
  }
1756
- .workspace-widget-subpanel-header {
2885
+ .workspace-pagination {
1757
2886
  display: flex;
2887
+ justify-content: flex-end;
1758
2888
  align-items: center;
1759
- gap: 10px;
1760
- padding: 6px 0 8px;
1761
- border-bottom: 1px solid #ececec;
2889
+ gap: 8px;
2890
+ color: #777;
2891
+ font-size: 12px;
1762
2892
  }
1763
- .workspace-widget-subpanel-header div {
1764
- display: flex;
1765
- flex-direction: column;
1766
- min-width: 0;
2893
+ .workspace-pagination button {
2894
+ min-height: 30px;
2895
+ border: 1px solid #d4d4d2;
2896
+ border-radius: 6px;
2897
+ background: #fff;
2898
+ color: #333;
2899
+ font: inherit;
2900
+ font-size: 12px;
2901
+ padding: 0 10px;
1767
2902
  }
1768
- .workspace-widget-subpanel-header p {
1769
- margin: 0;
1770
- font-size: 11px;
1771
- color: #999;
1772
- text-transform: uppercase;
1773
- letter-spacing: 0.04em;
2903
+ .workspace-pagination button:disabled {
2904
+ opacity: 0.45;
1774
2905
  }
1775
- .workspace-widget-subpanel-header strong {
1776
- font-size: 14px;
1777
- color: #444;
1778
- white-space: nowrap;
1779
- overflow: hidden;
1780
- text-overflow: ellipsis;
2906
+ .workspace-reference-row {
2907
+ display: grid;
2908
+ grid-template-columns: 110px minmax(140px, 0.7fr) minmax(220px, 1fr) 142px auto;
2909
+ gap: 8px;
2910
+ align-items: center;
1781
2911
  }
1782
- .workspace-widget-subpanel-back {
1783
- width: 26px;
1784
- height: 26px;
2912
+ .workspace-reference-row input,
2913
+ .workspace-reference-row select {
2914
+ min-height: 34px;
2915
+ border: 1px solid #dedede;
2916
+ border-radius: 6px;
2917
+ background: #fbfbfb;
2918
+ color: #303030;
2919
+ font: inherit;
2920
+ font-size: 13px;
2921
+ padding: 0 10px;
2922
+ }
2923
+ .workspace-error-page {
2924
+ min-height: 100vh;
1785
2925
  display: grid;
1786
2926
  place-items: center;
1787
- border: 1px solid #e8e8e8;
1788
- border-radius: 6px;
2927
+ background: #f7f7f6;
2928
+ color: #252525;
2929
+ padding: 24px;
2930
+ }
2931
+ .workspace-error-page section {
2932
+ width: min(100%, 420px);
2933
+ border: 1px solid #e2e2e0;
2934
+ border-radius: 8px;
1789
2935
  background: #fff;
1790
- color: #666;
1791
- cursor: pointer;
1792
- font-size: 16px;
1793
- line-height: 1;
2936
+ padding: 24px;
1794
2937
  }
1795
- .workspace-widget-subpanel-back:hover {
1796
- background: #f3f3f3;
2938
+ .workspace-error-page h1 {
2939
+ margin: 0 0 8px;
2940
+ font-size: 22px;
1797
2941
  }
1798
-
1799
- .workspace-panel-hint {
1800
- margin: 2px 0 0;
1801
- color: #999;
1802
- font-size: 11px;
1803
- line-height: 1.5;
2942
+ .workspace-error-page p {
2943
+ margin: 0 0 16px;
2944
+ color: #777;
1804
2945
  }
1805
-
1806
- /* Settings row buttons (replace bare div on the root inspector list) */
1807
- .workspace-settings-row,
1808
- .workspace-settings-list .workspace-settings-row {
1809
- width: 100%;
1810
- display: flex;
2946
+ .workspace-error-page a {
2947
+ color: #0b6bff;
2948
+ font-weight: 650;
2949
+ }
2950
+ .workspace-checkbox {
2951
+ display: inline-flex;
1811
2952
  align-items: center;
1812
- justify-content: space-between;
1813
- gap: 10px;
1814
- min-height: 38px;
1815
- border: 1px solid #e8eef8;
1816
- border-radius: 7px;
1817
- background: #fff;
2953
+ gap: 6px;
1818
2954
  color: #666;
1819
- font: inherit;
1820
- font-size: 13px;
1821
- padding: 8px 10px;
1822
- text-align: left;
1823
- cursor: pointer;
1824
- box-shadow: 0 2px 8px rgba(15, 23, 42, 0.05);
2955
+ font-size: 12px;
1825
2956
  }
1826
- .workspace-settings-row:hover:not([disabled]),
1827
- .workspace-settings-list .workspace-settings-row:hover:not([disabled]) {
1828
- border-color: #d6e4ff;
2957
+ .workspace-secondary-button,
2958
+ .workspace-remove-button {
2959
+ min-height: 32px;
2960
+ display: inline-flex;
2961
+ align-items: center;
2962
+ gap: 6px;
2963
+ border: 1px solid #dedede;
2964
+ border-radius: 6px;
1829
2965
  background: #fff;
2966
+ color: #333;
2967
+ font: inherit;
2968
+ font-size: 12px;
2969
+ padding: 0 10px;
1830
2970
  }
1831
- .workspace-settings-row[disabled],
1832
- .workspace-settings-list .workspace-settings-row[disabled] {
1833
- cursor: default;
1834
- color: #888;
2971
+ .workspace-remove-button:disabled {
2972
+ opacity: 0.45;
1835
2973
  }
1836
- .workspace-settings-row code,
1837
- .workspace-settings-list .workspace-settings-row code {
1838
- color: #888;
1839
- background: transparent;
1840
- text-align: right;
1841
- white-space: normal;
2974
+ .workspace-app-row {
2975
+ display: grid;
2976
+ grid-template-columns: 38px minmax(0, 1fr) auto;
2977
+ gap: 12px;
2978
+ align-items: start;
2979
+ border-bottom: 1px solid #ececea;
2980
+ padding: 12px 14px;
2981
+ }
2982
+ .workspace-app-row:last-child {
2983
+ border-bottom: 0;
2984
+ }
2985
+ .workspace-app-row strong {
2986
+ display: block;
2987
+ color: #303030;
2988
+ font-size: 13px;
2989
+ }
2990
+ .workspace-app-row p {
2991
+ margin: 4px 0 0;
2992
+ color: #777;
2993
+ font-size: 12px;
2994
+ line-height: 1.4;
1842
2995
  }
1843
2996
 
1844
2997
  /* Source picker */
@@ -2725,9 +3878,9 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
2725
3878
  .dm-object-icon { color: #94a3b8; flex-shrink: 0; }
2726
3879
  .dm-object-name { font-size: 13px; font-weight: 600; color: #111827; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2727
3880
  .dm-object-row-meta { display: flex; gap: 8px; flex-wrap: wrap; padding-left: 18px; font-size: 11px; color: #888; }
2728
- .dm-badge { display: inline-flex; align-items: center; border-radius: 999px; border: 1px solid #e2e8f0; background: #f1f5f9; color: #475569; padding: 2px 7px; font-size: 11px; font-weight: 600; white-space: nowrap; }
2729
- .dm-badge-datasource { background: #eff6ff; color: #1d4ed8; border-color: #bfdbfe; }
2730
- .dm-badge-integration { background: #f0fdf4; color: #166534; border-color: #bbf7d0; }
3881
+ .dm-badge { display: inline-flex; align-items: center; border-radius: 4px; border: 1px solid #e4e4e4; background: #f5f5f5; color: #555; padding: 1px 6px; font-size: 11px; font-weight: 500; white-space: nowrap; letter-spacing: .01em; }
3882
+ .dm-badge-datasource { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
3883
+ .dm-badge-integration { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
2731
3884
  .dm-detail-panel { min-width: 0; }
2732
3885
  .dm-detail-header { padding: 14px 18px 10px; border-bottom: 1px solid #efefef; }
2733
3886
  .dm-detail-title-row { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; }
@@ -2736,7 +3889,7 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
2736
3889
  .dm-detail-meta-row code { font-size: 11px; color: #6b7280; background: #f3f4f6; border-radius: 4px; padding: 2px 6px; }
2737
3890
  .dm-tabs { display: flex; border-bottom: 1px solid #efefef; background: #fafafa; padding: 0 16px; }
2738
3891
  .dm-tab { border: 0; background: transparent; padding: 10px 12px; font: inherit; font-size: 13px; color: #6b7280; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; }
2739
- .dm-tab.active { color: #1d4ed8; border-bottom-color: #1d4ed8; font-weight: 600; }
3892
+ .dm-tab.active { color: #111; border-bottom-color: #111; font-weight: 600; }
2740
3893
  .dm-tab-content { padding: 16px 18px; overflow-x: auto; }
2741
3894
  .dm-tab-toolbar { display: flex; justify-content: space-between; gap: 10px; align-items: center; margin-bottom: 12px; }
2742
3895
  .dm-tab-toolbar-actions, .dm-inline-add, .dm-csv-options { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
@@ -2783,3 +3936,525 @@ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0
2783
3936
  .dm-layout { grid-template-columns: 1fr; }
2784
3937
  .dm-object-list { border-right: 0; border-bottom: 1px solid #e8e8e8; }
2785
3938
  }
3939
+
3940
+ /* ─── Data Model v2 — Twenty CRM / Airtable style ────────────────────────── */
3941
+
3942
+ /* Layout */
3943
+ .dm-layout-v2 { display: grid; grid-template-columns: 224px minmax(0,1fr); border: 1px solid #e5e7eb; border-radius: 10px; background: #fff; overflow: hidden; min-height: 580px; }
3944
+
3945
+ /* Object column */
3946
+ .dm-obj-col { display: flex; flex-direction: column; border-right: 1px solid #e5e7eb; background: #fafafa; }
3947
+ .dm-obj-col-head { padding: 11px 14px 8px; border-bottom: 1px solid #efefef; font-size: 11px; font-weight: 700; color: #9ca3af; text-transform: uppercase; letter-spacing: .05em; }
3948
+ .dm-obj-col-body { flex: 1; overflow-y: auto; padding: 6px; }
3949
+ .dm-obj-col-foot { padding: 8px; border-top: 1px solid #efefef; }
3950
+
3951
+ .dm-obj-row { width: 100%; display: flex; align-items: center; gap: 7px; border: 0; background: transparent; text-align: left; padding: 7px 9px; border-radius: 6px; cursor: pointer; font: inherit; font-size: 13px; color: #555; }
3952
+ .dm-obj-row:hover { background: #f0f0f0; }
3953
+ .dm-obj-row.active { background: #111; color: #fff; }
3954
+ .dm-obj-row.active .dm-obj-icon { color: #fff; }
3955
+ .dm-obj-row.active .dm-badge { background: rgba(255,255,255,.12); color: rgba(255,255,255,.75); border-color: rgba(255,255,255,.18); }
3956
+ .dm-obj-icon { color: #94a3b8; flex-shrink: 0; }
3957
+ .dm-obj-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }
3958
+ .dm-obj-add-btn { width: 100%; display: flex; align-items: center; gap: 6px; border: 1px dashed #d5d5d5; border-radius: 6px; background: transparent; color: #888; font: inherit; font-size: 12px; padding: 6px 10px; cursor: pointer; transition: background .1s, color .1s; }
3959
+ .dm-obj-add-btn:hover { background: #f5f5f5; border-color: #999; color: #222; }
3960
+
3961
+ /* Detail panel v2 */
3962
+ .dm-detail-v2 { display: flex; flex-direction: column; min-width: 0; }
3963
+ .dm-detail-v2-head { padding: 14px 18px 10px; border-bottom: 1px solid #efefef; }
3964
+ .dm-detail-v2-title { display: flex; align-items: center; gap: 7px; margin-bottom: 4px; }
3965
+ .dm-detail-v2-title h2 { margin: 0; font-size: 15px; font-weight: 600; color: #111827; flex: 1; }
3966
+ .dm-detail-v2-meta { display: flex; align-items: center; gap: 10px; padding-left: 21px; font-size: 12px; color: #9ca3af; }
3967
+ .dm-detail-v2-meta code { font-size: 11px; color: #6b7280; background: #f3f4f6; border-radius: 4px; padding: 2px 6px; }
3968
+
3969
+ /* Source validation banner */
3970
+ .dm-validation-banner { display: flex; align-items: center; gap: 7px; margin-top: 8px; padding: 7px 10px; background: #fffbeb; border: 1px solid #fde68a; border-radius: 6px; font-size: 12px; color: #92400e; }
3971
+
3972
+ /* Tabs v2 */
3973
+ .dm-tabs-v2 { display: flex; border-bottom: 1px solid #ebebeb; background: #fff; padding: 0 16px; }
3974
+ .dm-tab-v2 { border: 0; background: transparent; padding: 9px 12px; font: inherit; font-size: 13px; color: #999; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color .12s; }
3975
+ .dm-tab-v2:hover { color: #333; }
3976
+ .dm-tab-v2.active { color: #111; border-bottom-color: #111; font-weight: 600; }
3977
+ .dm-tab-body { padding: 16px 18px; overflow-x: auto; flex: 1; }
3978
+
3979
+ /* Fields tab v2 — Airtable style */
3980
+ .dm-fields-tab {}
3981
+ .dm-field-list-v2 { display: grid; border: 1px solid #e5e7eb; border-radius: 8px; overflow: hidden; background: #fff; }
3982
+ .dm-field-row { display: flex; align-items: center; gap: 8px; padding: 8px 14px; font-size: 13px; color: #333; border-bottom: 1px solid #f2f2f2; background: #fff; }
3983
+ .dm-field-row:last-child { border-bottom: 0; }
3984
+ .dm-field-row:hover { background: #fafafa; }
3985
+ .dm-field-row.dm-field-system { color: #aaa; }
3986
+ .dm-field-grip { color: #d1d5db; flex-shrink: 0; cursor: grab; }
3987
+ .dm-field-type-icon { display: flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 5px; background: #f3f4f6; color: #6b7280; flex-shrink: 0; }
3988
+ .dm-field-name { flex: 1; font-weight: 500; }
3989
+ .dm-field-sys-badge { font-size: 10px; color: #9ca3af; border: 1px solid #e5e7eb; border-radius: 999px; padding: 1px 7px; background: #f9fafb; font-weight: 600; }
3990
+ .dm-field-add-row { width: 100%; display: flex; align-items: center; gap: 8px; padding: 9px 12px; border: 0; background: transparent; font: inherit; font-size: 13px; color: #9ca3af; cursor: pointer; border-top: 1px solid #f3f4f6; }
3991
+ .dm-field-add-row:hover:not(:disabled) { background: #f9fafb; color: #374151; }
3992
+ .dm-field-add-row:disabled { opacity: .45; cursor: not-allowed; }
3993
+ .dm-field-add-active { background: #fafafa !important; }
3994
+ .dm-field-add-input { flex: 1; border: 0; background: transparent; font: inherit; font-size: 13px; color: #111827; outline: none; min-width: 0; }
3995
+ .dm-source-notice { display: flex; align-items: center; gap: 7px; margin-bottom: 12px; padding: 7px 10px; background: #f0f9ff; border: 1px solid #bae6fd; border-radius: 6px; font-size: 12px; color: #0369a1; }
3996
+ .dm-empty-notice { padding: 24px; text-align: center; color: #9ca3af; font-size: 13px; border: 1px solid #e5e7eb; border-radius: 8px; background: #fafafa; }
3997
+
3998
+ /* Records tab v2 */
3999
+ .dm-records-tab {}
4000
+ .dm-records-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 12px; }
4001
+ .dm-stat-label { font-size: 12px; color: #9ca3af; font-weight: 600; }
4002
+ .dm-records-actions { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
4003
+ .dm-btn-ghost { display: inline-flex; align-items: center; gap: 5px; height: 28px; border: 1px solid #e5e7eb; border-radius: 6px; background: #fff; color: #555; font: inherit; font-size: 12px; padding: 0 10px; cursor: pointer; transition: background .1s, border-color .1s; }
4004
+ .dm-btn-ghost:hover { background: #f5f5f5; border-color: #ccc; color: #222; }
4005
+ .dm-btn-primary-sm { display: inline-flex; align-items: center; gap: 5px; height: 28px; border: 0; border-radius: 6px; background: #111; color: #fff; font: inherit; font-size: 12px; padding: 0 11px; cursor: pointer; font-weight: 500; transition: background .12s; }
4006
+ .dm-btn-primary-sm:hover { background: #333; }
4007
+ .dm-btn-primary-sm:disabled { opacity: .45; cursor: not-allowed; }
4008
+ .dm-table-wrap { border: 1px solid #e5e7eb; border-radius: 8px; overflow-x: auto; }
4009
+ .dm-table { width: 100%; border-collapse: collapse; font-size: 13px; }
4010
+ .dm-table th { background: #f9fafb; border-bottom: 1px solid #e5e7eb; color: #6b7280; font-size: 11px; font-weight: 600; text-align: left; padding: 8px 10px; white-space: nowrap; text-transform: uppercase; letter-spacing: .04em; }
4011
+ .dm-table td { border-bottom: 1px solid #f3f4f6; padding: 4px 8px; }
4012
+ .dm-table tbody tr:last-child td { border-bottom: 0; }
4013
+ .dm-table tbody tr:hover td { background: #fafafa; }
4014
+ .dm-th-num,.dm-td-num { width: 36px; color: #9ca3af; text-align: center; }
4015
+ .dm-td-actions { width: 60px; text-align: right; white-space: nowrap; }
4016
+ .dm-row-action { width: 24px; height: 24px; border: 1px solid #e5e7eb; border-radius: 4px; background: #fff; color: #6b7280; cursor: pointer; font-size: 12px; }
4017
+ .dm-row-action:hover { background: #f3f4f6; }
4018
+ .dm-row-action.danger { color: #dc2626; }
4019
+ .dm-row-action.danger:hover { background: #fef2f2; border-color: #fca5a5; }
4020
+ .dm-row-action:disabled { opacity: .4; cursor: not-allowed; }
4021
+ .dm-csv-panel { border: 1px solid #e5e7eb; border-radius: 8px; background: #f9fafb; padding: 10px 12px; margin-bottom: 12px; }
4022
+ .dm-csv-opts { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: #374151; }
4023
+ .dm-csv-textarea { width: 100%; margin-bottom: 8px; border: 1px solid #d1d5db; border-radius: 6px; background: #fff; font-family: ui-monospace,SFMono-Regular,Menlo,monospace; font-size: 12px; padding: 7px 10px; box-sizing: border-box; resize: vertical; }
4024
+
4025
+ /* Data Model database grid */
4026
+ .dm-db-surface { display: flex; flex-direction: column; gap: 10px; padding: 14px; min-height: 0; flex: 1; background: #fff; }
4027
+ .dm-db-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
4028
+ .dm-db-toolbar-title { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
4029
+ .dm-db-toolbar-title strong { font-size: 13px; color: #111827; font-weight: 650; }
4030
+ .dm-db-toolbar-title span { font-size: 12px; color: #9ca3af; }
4031
+ .dm-db-grid-wrap { flex: 1; min-height: 420px; overflow: auto; border: 1px solid #dfe3e8; border-radius: 7px; background: #fff; }
4032
+ .dm-db-grid { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 12px; color: #1f2937; }
4033
+ .dm-db-grid th { position: sticky; top: 0; z-index: 1; height: 32px; background: #f8fafc; color: #475569; border-bottom: 1px solid #dfe3e8; border-right: 1px solid #edf0f3; padding: 0 10px; text-align: left; font-weight: 650; white-space: nowrap; }
4034
+ .dm-db-grid td { height: 32px; max-width: 260px; border-bottom: 1px solid #f1f5f9; border-right: 1px solid #f1f5f9; padding: 0 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }
4035
+ .dm-db-grid tbody tr:hover td { background: #f8fafc; }
4036
+ .dm-db-grid tbody tr.selected td { background: #eef2ff; }
4037
+ .dm-db-rownum { width: 42px; min-width: 42px; text-align: center !important; color: #94a3b8 !important; background: #f8fafc; font-variant-numeric: tabular-nums; }
4038
+ .dm-db-field-type { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; margin-right: 5px; border-radius: 4px; color: #64748b; background: #eef2f7; vertical-align: middle; }
4039
+ .dm-db-add-field { min-width: 118px; }
4040
+ .dm-db-add-field button { display: inline-flex; align-items: center; gap: 4px; border: 0; background: transparent; color: #64748b; font: inherit; font-size: 12px; cursor: pointer; }
4041
+ .dm-db-add-field input { width: 110px; height: 24px; border: 1px solid #cbd5e1; border-radius: 5px; padding: 0 7px; font: inherit; font-size: 12px; }
4042
+ .dm-db-empty-cell { background: #fbfdff; }
4043
+ .dm-db-new-row td { color: #64748b; background: #fbfdff; font-weight: 600; }
4044
+ .dm-db-status { display: inline-flex; align-items: center; gap: 5px; height: 20px; border: 1px solid #e2e8f0; border-radius: 999px; padding: 0 8px; background: #f8fafc; color: #64748b; font-size: 11px; font-weight: 650; }
4045
+ .dm-db-status span { width: 6px; height: 6px; border-radius: 50%; background: #94a3b8; }
4046
+ .dm-db-status.ok { border-color: #bbf7d0; background: #f0fdf4; color: #166534; }
4047
+ .dm-db-status.ok span { background: #22c55e; }
4048
+ .dm-db-status.bad { border-color: #fecaca; background: #fef2f2; color: #991b1b; }
4049
+ .dm-db-status.bad span { background: #ef4444; }
4050
+ .dm-record-backdrop { position: fixed; inset: 0; z-index: 80; background: rgba(15,23,42,.12); }
4051
+ .dm-record-drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 81; display: flex; flex-direction: column; width: min(440px, 100vw); background: #fff; border-left: 1px solid #dfe3e8; box-shadow: -10px 0 34px rgba(15,23,42,.16); }
4052
+ .dm-record-drawer-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 18px; border-bottom: 1px solid #edf0f3; }
4053
+ .dm-record-drawer-head p { margin: 0 0 3px; color: #94a3b8; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; }
4054
+ .dm-record-drawer-head h2 { margin: 0; color: #111827; font-size: 16px; font-weight: 650; }
4055
+ .dm-record-testbar { display: flex; align-items: center; gap: 8px; padding: 10px 18px; border-bottom: 1px solid #edf0f3; background: #fbfdff; }
4056
+ .dm-record-testbar > span:last-child { min-width: 0; color: #64748b; font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4057
+ .dm-record-fields { display: grid; gap: 12px; padding: 16px 18px 28px; overflow-y: auto; }
4058
+ .dm-record-field { display: grid; gap: 5px; }
4059
+ .dm-record-field span { color: #475569; font-size: 12px; font-weight: 650; }
4060
+ .dm-record-field input,
4061
+ .dm-record-field textarea { width: 100%; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #111827; font: inherit; font-size: 13px; padding: 8px 9px; box-sizing: border-box; }
4062
+ .dm-record-field textarea { resize: vertical; font-family: ui-monospace,SFMono-Regular,Menlo,monospace; line-height: 1.45; }
4063
+ .dm-record-field input:focus,
4064
+ .dm-record-field textarea:focus { outline: none; border-color: #64748b; box-shadow: 0 0 0 3px rgba(100,116,139,.12); }
4065
+ .dm-record-field input:disabled,
4066
+ .dm-record-field textarea:disabled { background: #f8fafc; color: #64748b; }
4067
+
4068
+ /* Relations tab */
4069
+ .dm-relations-tab { display: grid; gap: 16px; }
4070
+ .dm-relations-desc { margin: 0; font-size: 13px; color: #6b7280; line-height: 1.55; }
4071
+ .dm-relation-card { border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; overflow: hidden; }
4072
+ .dm-relation-card-head { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid #f3f4f6; background: #fafafa; }
4073
+ .dm-relation-mode-label { font-size: 12px; color: #6b7280; font-weight: 600; }
4074
+ .dm-relation-props { display: grid; gap: 0; }
4075
+ .dm-relation-prop { display: grid; grid-template-columns: 130px minmax(0,1fr); gap: 8px; align-items: center; padding: 8px 14px; border-bottom: 1px solid #f3f4f6; font-size: 12px; }
4076
+ .dm-relation-prop:last-child { border-bottom: 0; }
4077
+ .dm-relation-prop span { color: #9ca3af; font-weight: 600; }
4078
+ .dm-relation-prop code { font-size: 11px; color: #374151; background: #f3f4f6; border-radius: 4px; padding: 2px 6px; word-break: break-all; }
4079
+ .dm-relation-flow { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-top: 1px solid #f3f4f6; }
4080
+ .dm-relation-node { display: inline-flex; align-items: center; height: 26px; border: 1px solid #e5e7eb; border-radius: 6px; background: #f9fafb; color: #374151; font-size: 12px; font-weight: 600; padding: 0 10px; }
4081
+ .dm-relation-node.source { background: #f0f0f0; border-color: #d5d5d5; color: #333; }
4082
+ .dm-relation-arrow { color: #9ca3af; }
4083
+ .dm-relation-hint { margin: 0; padding: 10px 14px; font-size: 12px; color: #6b7280; border-top: 1px solid #f3f4f6; line-height: 1.5; }
4084
+ .dm-usage-section { display: grid; gap: 8px; }
4085
+ .dm-usage-label { margin: 0; font-size: 11px; font-weight: 700; color: #9ca3af; text-transform: uppercase; letter-spacing: .05em; }
4086
+ .dm-usage-rows { display: grid; gap: 5px; }
4087
+ .dm-usage-row { display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; padding: 8px 12px; border: 1px solid #e5e7eb; border-radius: 7px; background: #fafafa; font-size: 12px; }
4088
+ .dm-usage-row strong { color: #111827; font-weight: 500; }
4089
+ .dm-usage-row span { color: #9ca3af; }
4090
+ .dm-usage-row code { font-size: 11px; background: #f3f4f6; border-radius: 4px; padding: 2px 6px; color: #6b7280; }
4091
+
4092
+ /* Buttons v2 */
4093
+ .dm-btn-primary { display: inline-flex; align-items: center; gap: 5px; height: 32px; border: 0; border-radius: 6px; background: #111; color: #fff; font: inherit; font-size: 13px; padding: 0 13px; cursor: pointer; font-weight: 500; transition: background .12s; }
4094
+ .dm-btn-primary:hover { background: #333; }
4095
+ .dm-btn-primary:disabled { opacity: .45; cursor: not-allowed; }
4096
+ .dm-btn-outline { display: inline-flex; align-items: center; gap: 5px; height: 32px; border: 1px solid #e0e0e0; border-radius: 6px; background: #fff; color: #333; font: inherit; font-size: 13px; padding: 0 13px; cursor: pointer; transition: background .1s, border-color .1s; }
4097
+ .dm-btn-outline:hover { background: #f5f5f5; border-color: #bbb; }
4098
+
4099
+ /* Slide-out sidebar */
4100
+ .dm-sidebar-backdrop { position: fixed; inset: 0; z-index: 80; background: rgba(17,24,39,.2); }
4101
+ .dm-add-sidebar { position: fixed; top: 0; right: 0; bottom: 0; width: 340px; background: #fff; border-left: 1px solid #e5e7eb; box-shadow: -6px 0 32px rgba(15,23,42,.12); transform: translateX(100%); transition: transform .22s cubic-bezier(.22,1,.36,1); z-index: 81; display: flex; flex-direction: column; }
4102
+ .dm-add-sidebar.open { transform: translateX(0); }
4103
+ .dm-add-sidebar-head { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid #e5e7eb; }
4104
+ .dm-add-sidebar-head h2 { margin: 0; font-size: 15px; font-weight: 600; color: #111827; }
4105
+ .dm-sidebar-close { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: 1px solid #e5e7eb; border-radius: 6px; background: #fff; color: #6b7280; cursor: pointer; }
4106
+ .dm-sidebar-close:hover { background: #f9fafb; color: #374151; }
4107
+ .dm-add-sidebar-body { display: grid; gap: 14px; padding: 20px; flex: 1; align-content: start; }
4108
+ .dm-add-sidebar-hint { margin: 0; font-size: 13px; color: #6b7280; line-height: 1.5; }
4109
+ .dm-field-label-v2 { display: grid; gap: 6px; font-size: 12px; font-weight: 600; color: #374151; }
4110
+ .dm-input-v2 { width: 100%; height: 34px; border: 1px solid #d1d5db; border-radius: 7px; background: #fff; color: #111827; font: inherit; font-size: 13px; padding: 0 10px; box-sizing: border-box; }
4111
+ .dm-input-v2:focus { outline: none; border-color: #666; box-shadow: 0 0 0 3px rgba(0,0,0,.07); }
4112
+ .dm-add-sidebar-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }
4113
+
4114
+ /* Object type badges */
4115
+ .dm-badge-registry { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
4116
+ .dm-badge-people { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
4117
+ .dm-badge-tasks { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
4118
+ .dm-badge-manual { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
4119
+ .dm-badge-belongs { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
4120
+ .dm-badge-hasmany { background: #f5f5f5; color: #444; border-color: #e0e0e0; }
4121
+
4122
+ /* Tab count pill */
4123
+ .dm-tab-count { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 16px; border-radius: 999px; background: #e5e7eb; color: #6b7280; font-size: 10px; font-weight: 700; padding: 0 5px; margin-left: 5px; }
4124
+ .dm-tab-count { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; border-radius: 99px; background: #ebebeb; color: #666; font-size: 10px; font-weight: 600; padding: 0 4px; margin-left: 4px; }
4125
+ .dm-tab-v2.active .dm-tab-count { background: #222; color: #fff; }
4126
+
4127
+ /* Sidebar step: type-picker */
4128
+ .dm-type-picker { display: flex; flex-direction: column; flex: 1; overflow-y: auto; }
4129
+ .dm-type-picker-hint { margin: 0; padding: 14px 20px 8px; font-size: 13px; color: #6b7280; line-height: 1.5; }
4130
+ .dm-type-picker-list { display: grid; gap: 2px; padding: 4px 12px 16px; }
4131
+ .dm-type-card { display: flex; align-items: center; gap: 12px; padding: 11px 14px; border: 1px solid #e8e8e8; border-radius: 7px; background: #fff; cursor: pointer; text-align: left; font: inherit; transition: background .1s, border-color .1s; }
4132
+ .dm-type-card:hover { background: #fafafa; border-color: #ccc; }
4133
+ .dm-type-card-icon { display: flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 7px; background: #f2f2f2; color: #333; flex-shrink: 0; }
4134
+ .dm-type-card-body { flex: 1; min-width: 0; }
4135
+ .dm-type-card-body strong { display: block; font-size: 13px; color: #111; font-weight: 600; margin-bottom: 2px; }
4136
+ .dm-type-card-body span { font-size: 12px; color: #888; line-height: 1.4; }
4137
+ .dm-type-card-arrow { color: #bbb; flex-shrink: 0; }
4138
+
4139
+ /* Sidebar step: name + icon */
4140
+ .dm-add-sidebar-head-left { display: flex; align-items: center; gap: 8px; }
4141
+ .dm-sidebar-back { display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; border: 1px solid #e5e7eb; border-radius: 6px; background: #fff; color: #6b7280; cursor: pointer; font-size: 14px; }
4142
+ .dm-sidebar-back:hover { background: #f9fafb; }
4143
+ .dm-add-type-preview { display: flex; align-items: flex-start; gap: 12px; padding: 4px 0 4px; }
4144
+ .dm-add-type-icon { display: flex; align-items: center; justify-content: center; width: 42px; height: 42px; border-radius: 10px; background: #f3f4f6; color: #374151; flex-shrink: 0; }
4145
+ .dm-add-type-label { margin: 0 0 3px; font-size: 13px; font-weight: 700; color: #111827; }
4146
+
4147
+ /* Icon picker grid */
4148
+ .dm-icon-picker { display: grid; grid-template-columns: repeat(8, 1fr); gap: 4px; margin-top: 4px; }
4149
+ .dm-icon-picker-btn { display: flex; align-items: center; justify-content: center; width: 100%; aspect-ratio: 1; border: 1px solid #e5e5e5; border-radius: 6px; background: #fff; color: #555; cursor: pointer; transition: background .1s, border-color .1s; }
4150
+ .dm-icon-picker-btn:hover { background: #f5f5f5; border-color: #aaa; }
4151
+ .dm-icon-picker-btn.active { background: #111; border-color: #111; color: #fff; }
4152
+
4153
+ /* Preset fields + relations preview in sidebar */
4154
+ .dm-preset-fields-preview,.dm-preset-relations-preview { display: grid; gap: 8px; padding: 10px 12px; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 7px; }
4155
+ .dm-preset-fields-list { display: flex; flex-wrap: wrap; gap: 5px; }
4156
+ .dm-preset-field-chip { display: inline-flex; align-items: center; height: 22px; border: 1px solid #e5e7eb; border-radius: 5px; background: #fff; color: #374151; font-size: 11px; font-weight: 500; padding: 0 8px; }
4157
+ .dm-preset-relation-row { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #4b5563; }
4158
+ .dm-preset-rel-target { font-weight: 600; color: #333; }
4159
+
4160
+ /* Relation card v2 (typed) */
4161
+ .dm-relation-card-meta { display: flex; align-items: center; gap: 8px; flex: 1; }
4162
+ .dm-relation-name { font-size: 13px; font-weight: 600; color: #111827; }
4163
+ .dm-relation-target-type { font-size: 12px; color: #6b7280; }
4164
+ .dm-relation-desc-text { margin: 0; padding: 8px 14px 0; font-size: 12px; color: #6b7280; line-height: 1.5; }
4165
+ .dm-relation-props { display: grid; }
4166
+ .dm-relation-prop { display: grid; grid-template-columns: 120px minmax(0,1fr); gap: 8px; align-items: center; padding: 8px 14px; border-top: 1px solid #f3f4f6; font-size: 12px; }
4167
+ .dm-relation-prop span { color: #9ca3af; font-weight: 600; }
4168
+ .dm-relation-prop code { font-size: 11px; color: #374151; background: #f3f4f6; border-radius: 4px; padding: 2px 6px; word-break: break-all; }
4169
+
4170
+ /* Resolver chain block */
4171
+ .dm-resolver-chain { margin: 0; border-top: 1px solid #f3f4f6; padding: 12px 14px; display: grid; gap: 8px; }
4172
+ .dm-resolver-chain-head { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: #374151; }
4173
+ .dm-resolver-chain-desc { margin: 0; font-size: 12px; color: #6b7280; line-height: 1.55; }
4174
+ .dm-resolver-chain-desc code { background: #f3f4f6; border-radius: 3px; padding: 1px 5px; font-size: 11px; color: #374151; }
4175
+ .dm-resolver-targets { display: grid; gap: 4px; }
4176
+ .dm-resolver-target-row { display: flex; align-items: center; gap: 7px; padding: 6px 10px; border: 1px solid #e5e7eb; border-radius: 6px; background: #fafafa; font-size: 12px; color: #374151; }
4177
+ .dm-resolver-target-row strong { flex: 1; font-weight: 500; }
4178
+ .dm-resolver-no-targets { display: flex; align-items: center; gap: 7px; padding: 8px 10px; background: #fffbeb; border: 1px solid #fde68a; border-radius: 6px; font-size: 12px; color: #92400e; }
4179
+ .dm-detail-icon { color: #6b7280; }
4180
+
4181
+ @media (max-width: 900px) {
4182
+ .dm-layout-v2 { grid-template-columns: 1fr; }
4183
+ .dm-obj-col { border-right: 0; border-bottom: 1px solid #e5e7eb; }
4184
+ .dm-add-sidebar { width: 100%; }
4185
+ .dm-icon-picker { grid-template-columns: repeat(6, 1fr); }
4186
+ }
4187
+
4188
+ /* SourceDropdown — inline source picker in widget inspector */
4189
+ .workspace-settings-row-dropdown { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
4190
+ .workspace-settings-row-dropdown > span { font-size: 12px; color: #6b7280; flex-shrink: 0; }
4191
+ .source-dropdown-wrap { position: relative; flex: 1; min-width: 0; }
4192
+ .source-dropdown-trigger { display: flex; align-items: center; justify-content: space-between; gap: 6px; width: 100%; padding: 4px 8px; font-size: 12px; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 5px; cursor: pointer; color: #111827; text-align: left; }
4193
+ .source-dropdown-trigger:hover, .source-dropdown-trigger.open { border-color: #555; background: #fff; }
4194
+ .source-dropdown-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4195
+ .source-dropdown-popover { position: absolute; top: calc(100% + 4px); right: 0; min-width: 220px; max-width: 280px; max-height: 320px; overflow-y: auto; background: #fff; border: 1px solid #e5e7eb; border-radius: 8px; box-shadow: 0 8px 24px rgba(15,23,42,.14); z-index: 200; padding: 4px; }
4196
+ .source-dropdown-section-label { font-size: 10px; font-weight: 700; color: #9ca3af; text-transform: uppercase; letter-spacing: .05em; padding: 8px 8px 3px; }
4197
+ .source-dropdown-item { display: flex; align-items: center; gap: 7px; width: 100%; padding: 7px 8px; font-size: 12px; color: #374151; background: none; border: none; border-radius: 5px; cursor: pointer; text-align: left; }
4198
+ .source-dropdown-item:hover { background: #f5f5f5; color: #111; }
4199
+ .source-dropdown-item.selected { background: #f0f0f0; color: #111; font-weight: 600; }
4200
+ .source-dropdown-item svg { color: #9ca3af; flex-shrink: 0; }
4201
+ .source-dropdown-item .source-dropdown-item-live { color: #555; }
4202
+ .source-dropdown-integration-badge { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; font-size: 10px; font-weight: 700; background: #f1f5f9; border: 1px solid #e2e8f0; border-radius: 4px; color: #374151; flex-shrink: 0; margin-left: auto; cursor: default; }
4203
+ .source-dropdown-empty { padding: 12px 8px 4px; font-size: 12px; color: #9ca3af; display: grid; gap: 4px; }
4204
+ .source-dropdown-hint { font-size: 11px; color: #c4b5fd; }
4205
+ .source-dropdown-footer { display: flex; align-items: center; gap: 4px; padding: 8px 8px 6px; border-top: 1px solid #f1f5f9; margin-top: 4px; font-size: 11px; color: #9ca3af; }
4206
+ .source-dropdown-footer strong { color: #333; }
4207
+
4208
+ /* Source sub-panel — object-only clean picker */
4209
+ .workspace-source-search-wrap { display: flex; align-items: center; gap: 7px; border: 1px solid #e5e7eb; border-radius: 7px; padding: 6px 10px; background: #fff; color: #9ca3af; margin-bottom: 8px; cursor: text; }
4210
+ .workspace-source-search-wrap input { flex: 1; border: none; outline: none; font-size: 13px; background: transparent; color: #111827; }
4211
+ .workspace-source-search-wrap:focus-within { border-color: #555; }
4212
+ .workspace-source-object-list { display: grid; gap: 2px; }
4213
+ .workspace-source-object-row { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 10px; background: #fff; border: 1px solid #e5e7eb; border-radius: 7px; cursor: pointer; text-align: left; font: inherit; }
4214
+ .workspace-source-object-row:hover { background: #f9fafb; border-color: #a5b4fc; }
4215
+ .workspace-source-object-row.active { background: #f0f0f0; border-color: #aaa; }
4216
+ .workspace-source-object-icon { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 6px; background: #f3f4f6; color: #374151; flex-shrink: 0; }
4217
+ .workspace-source-object-row.active .workspace-source-object-icon { background: #e0e0e0; color: #222; }
4218
+ .workspace-source-object-meta { flex: 1; min-width: 0; }
4219
+ .workspace-source-object-meta strong { display: block; font-size: 13px; font-weight: 600; color: #111827; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4220
+ .workspace-source-object-meta em { display: block; font-size: 11px; font-style: normal; color: #9ca3af; margin-top: 1px; }
4221
+ .workspace-source-empty { display: grid; place-items: center; gap: 8px; padding: 32px 16px; text-align: center; color: #9ca3af; }
4222
+ .workspace-source-empty svg { color: #d1d5db; }
4223
+ .workspace-source-empty strong { font-size: 13px; color: #374151; }
4224
+ .workspace-source-empty p { font-size: 12px; color: #9ca3af; line-height: 1.5; margin: 0; max-width: 220px; }
4225
+ .workspace-source-empty-link { font-size: 12px; color: #333; text-decoration: underline; font-weight: 600; }
4226
+ .workspace-source-empty-link:hover { text-decoration: underline; }
4227
+
4228
+ /* SourceDropdown — compact inline version */
4229
+ .source-dropdown-search { display: flex; align-items: center; gap: 6px; padding: 6px 8px; border-bottom: 1px solid #f3f4f6; color: #9ca3af; }
4230
+ .source-dropdown-search input { flex: 1; border: none; outline: none; font-size: 12px; background: transparent; color: #111827; }
4231
+
4232
+ /* SourceRefreshConfigurator — inline test + apply panel */
4233
+ .source-refresh-collapsed { display: flex; align-items: center; gap: 8px; padding: 8px 0 4px; }
4234
+ .source-refresh-toggle { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #555; background: none; border: 1px dashed #d5d5d5; border-radius: 6px; padding: 5px 10px; cursor: pointer; }
4235
+ .source-refresh-toggle:hover { background: #f5f3ff; }
4236
+ .source-refresh-active-badge { font-size: 11px; color: #16a34a; background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 10px; padding: 2px 8px; }
4237
+ .source-refresh-panel { display: grid; gap: 10px; padding: 14px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; margin: 8px 0; }
4238
+ .source-refresh-header { display: flex; align-items: center; gap: 8px; }
4239
+ .source-refresh-header strong { flex: 1; font-size: 13px; color: #111827; }
4240
+ .source-refresh-close { background: none; border: none; color: #9ca3af; cursor: pointer; font-size: 14px; padding: 2px 4px; }
4241
+ .source-refresh-close:hover { color: #374151; }
4242
+ .source-refresh-hint { margin: 0; font-size: 12px; color: #6b7280; line-height: 1.4; }
4243
+ .source-refresh-field { display: grid; gap: 4px; font-size: 12px; color: #374151; font-weight: 600; }
4244
+ .source-refresh-field em { font-weight: 400; color: #9ca3af; }
4245
+ .source-refresh-field input { font-size: 12px; border: 1px solid #d1d5db; border-radius: 5px; padding: 5px 8px; background: #fff; }
4246
+ .source-refresh-test-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 7px 14px; font-size: 12px; font-weight: 600; background: #111; color: #fff; border: none; border-radius: 6px; cursor: pointer; transition: background .1s; }
4247
+ .source-refresh-test-btn:hover { background: #333; }
4248
+ .source-refresh-test-btn:hover:not(:disabled) { background: #4f46e5; }
4249
+ .source-refresh-test-btn:disabled { opacity: .55; cursor: default; }
4250
+ .source-refresh-error { display: grid; gap: 4px; padding: 10px; background: #fef2f2; border: 1px solid #fecaca; border-radius: 6px; font-size: 12px; color: #991b1b; }
4251
+ .source-refresh-error strong { color: #7f1d1d; }
4252
+ .source-refresh-error button { margin-top: 4px; font-size: 11px; padding: 3px 8px; border: 1px solid #fca5a5; border-radius: 4px; background: #fff; cursor: pointer; color: #7f1d1d; }
4253
+ .source-refresh-success { display: grid; gap: 8px; padding: 10px; background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 6px; font-size: 12px; color: #166534; }
4254
+ .source-refresh-preview { overflow-x: auto; }
4255
+ .source-refresh-preview-label { margin: 0 0 6px; font-size: 11px; color: #4b5563; font-weight: 600; }
4256
+ .source-refresh-preview table { border-collapse: collapse; font-size: 11px; width: 100%; }
4257
+ .source-refresh-preview th { background: #f1f5f9; color: #374151; padding: 4px 8px; text-align: left; border-bottom: 1px solid #e2e8f0; white-space: nowrap; }
4258
+ .source-refresh-preview td { padding: 4px 8px; border-bottom: 1px solid #f1f5f9; color: #1f2937; }
4259
+ .source-refresh-preview em { color: #9ca3af; font-style: normal; }
4260
+ .source-refresh-apply { display: inline-flex; align-items: center; gap: 6px; padding: 7px 14px; font-size: 12px; font-weight: 600; background: #16a34a; color: #fff; border: none; border-radius: 6px; cursor: pointer; }
4261
+ .source-refresh-apply:hover { background: #15803d; }
4262
+
4263
+ /* ══════════════════════════════════════════════════════════════
4264
+ ResolverControlPanel — generic resolver management in widget inspector
4265
+ ══════════════════════════════════════════════════════════════ */
4266
+ .resolver-control-panel { display: grid; gap: 10px; padding: 12px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; margin-top: 8px; }
4267
+
4268
+ /* Status bar */
4269
+ .resolver-status-bar { display: flex; align-items: center; gap: 8px; }
4270
+ .resolver-reg-badge { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 50%; font-size: 11px; font-weight: 700; flex-shrink: 0; }
4271
+ .resolver-reg-badge.ok { background: #dcfce7; color: #166534; }
4272
+ .resolver-reg-badge.missing { background: #fef2f2; color: #991b1b; }
4273
+ .resolver-id-code { font-family: monospace; font-size: 11px; background: #e2e8f0; padding: 2px 6px; border-radius: 4px; color: #1e3a5f; }
4274
+ .resolver-status-label { font-size: 11px; color: #64748b; }
4275
+
4276
+ /* Guidance / hint */
4277
+ .resolver-guidance { margin: 0; font-size: 11px; color: #92400e; background: #fffbeb; border: 1px solid #fde68a; border-radius: 5px; padding: 7px 9px; line-height: 1.5; }
4278
+ .resolver-guidance.warn { color: #555; background: #f8f8f8; border-color: #e0e0e0; }
4279
+ .resolver-guidance code { background: #e5e7eb; border-radius: 3px; padding: 1px 4px; font-size: 10px; }
4280
+
4281
+ /* Params */
4282
+ .resolver-param-row { display: grid; grid-template-columns: 90px 1fr; align-items: center; gap: 8px; }
4283
+ .resolver-param-label { font-size: 11px; font-weight: 600; color: #374151; }
4284
+ .resolver-param-select { font-size: 12px; border: 1px solid #d1d5db; border-radius: 5px; padding: 5px 8px; background: #fff; color: #1f2937; width: 100%; }
4285
+ .resolver-param-input { font-size: 12px; border: 1px solid #d1d5db; border-radius: 5px; padding: 5px 8px; background: #fff; color: #1f2937; width: 100%; }
4286
+ .resolver-loading-label { font-size: 11px; color: #9ca3af; }
4287
+ .resolver-error-label { font-size: 11px; color: #dc2626; }
4288
+
4289
+ /* Lookback pills */
4290
+ .resolver-lookback-row { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }
4291
+ .resolver-lookback-pill { font-size: 11px; font-weight: 600; padding: 3px 8px; border: 1px solid #d1d5db; border-radius: 4px; background: #fff; cursor: pointer; color: #374151; transition: background 120ms, border-color 120ms; }
4292
+ .resolver-lookback-pill.active { background: #111; color: #fff; border-color: #111; }
4293
+ .resolver-lookback-pill:hover:not(.active) { background: #f1f5f9; }
4294
+ .resolver-lookback-custom { width: 56px; font-size: 12px; border: 1px solid #d1d5db; border-radius: 5px; padding: 3px 6px; color: #374151; }
4295
+
4296
+ /* Save params */
4297
+ .resolver-save-params-btn { justify-self: start; font-size: 11px; font-weight: 600; padding: 5px 11px; background: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 5px; cursor: pointer; color: #334155; }
4298
+ .resolver-save-params-btn:hover { background: #e2e8f0; }
4299
+
4300
+ /* Actions row */
4301
+ /* Resolver controls inside FilterSubPanel */
4302
+ .workspace-resolver-controls { display: grid; gap: 8px; padding-top: 4px; }
4303
+ .workspace-lookback-row { display: flex; align-items: center; gap: 6px; margin-top: 4px; }
4304
+ .workspace-lookback-btn { font-size: 11px; padding: 3px 8px; border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; cursor: pointer; color: #334155; }
4305
+ .workspace-lookback-btn.active { background: #f1f5f9; border-color: #94a3b8; font-weight: 600; }
4306
+ .workspace-lookback-row input[type="number"] { width: 52px; font-size: 12px; padding: 3px 6px; border: 1px solid #e2e8f0; border-radius: 4px; }
4307
+ .workspace-resolver-actions { display: flex; gap: 6px; flex-wrap: wrap; }
4308
+ .workspace-settings-row-btn { font-size: 12px; font-weight: 500; padding: 6px 12px; background: #fff; color: #334155; border: 1px solid #cbd5e1; border-radius: 6px; cursor: pointer; }
4309
+ .workspace-settings-row-btn:hover:not(:disabled) { background: #f1f5f9; border-color: #94a3b8; }
4310
+ .workspace-settings-row-btn:disabled { opacity: .55; cursor: default; }
4311
+ .workspace-resolver-result { font-size: 11px; padding: 5px 8px; border-radius: 4px; margin-top: 2px; }
4312
+ .workspace-resolver-result.ok { background: #f0fdf4; color: #166534; border: 1px solid #bbf7d0; }
4313
+ .workspace-resolver-result.error { background: #fef2f2; color: #991b1b; border: 1px solid #fecaca; }
4314
+
4315
+ .resolver-actions { display: flex; gap: 7px; flex-wrap: wrap; }
4316
+ .resolver-test-btn { font-size: 12px; font-weight: 500; padding: 6px 12px; background: #fff; color: #334155; border: 1px solid #cbd5e1; border-radius: 6px; cursor: pointer; }
4317
+ .resolver-test-btn:hover:not(:disabled) { background: #f1f5f9; border-color: #94a3b8; }
4318
+ .resolver-test-btn:disabled { opacity: .55; cursor: default; }
4319
+ .resolver-refresh-btn { font-size: 12px; font-weight: 500; padding: 6px 12px; background: #fff; color: #334155; border: 1px solid #cbd5e1; border-radius: 6px; cursor: pointer; }
4320
+ .resolver-refresh-btn:hover:not(:disabled) { background: #f1f5f9; border-color: #94a3b8; }
4321
+ .resolver-refresh-btn:disabled { opacity: .55; cursor: default; }
4322
+ .resolver-retry-btn { margin-top: 4px; font-size: 11px; padding: 3px 9px; border: 1px solid #fca5a5; border-radius: 4px; background: #fff; cursor: pointer; color: #7f1d1d; }
4323
+
4324
+ /* Result blocks */
4325
+ .resolver-result-block { border-radius: 6px; padding: 10px; font-size: 12px; display: grid; gap: 6px; }
4326
+ .resolver-result-block.error { background: #fef2f2; border: 1px solid #fecaca; color: #7f1d1d; }
4327
+ .resolver-result-block.ok { background: #f0fdf4; border: 1px solid #bbf7d0; color: #14532d; }
4328
+ .resolver-result-title { font-weight: 700; margin: 0; }
4329
+ .resolver-result-detail { margin: 0; font-size: 11px; color: #6b7280; }
4330
+ .resolver-result-block.error .resolver-result-detail { color: #b91c1c; }
4331
+ .resolver-result-header { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
4332
+ .resolver-result-ok-badge { font-weight: 700; color: #166534; }
4333
+ .resolver-result-count { font-size: 11px; color: #4b5563; }
4334
+
4335
+ /* Preview table */
4336
+ .resolver-preview-table-wrap { overflow-x: auto; border-radius: 4px; }
4337
+ .resolver-preview-table { border-collapse: collapse; font-size: 11px; width: 100%; }
4338
+ .resolver-preview-table th { background: #dcfce7; color: #166534; padding: 4px 8px; text-align: left; border-bottom: 1px solid #bbf7d0; white-space: nowrap; font-weight: 600; }
4339
+ .resolver-preview-table td { padding: 4px 8px; border-bottom: 1px solid #f0fdf4; color: #1f2937; }
4340
+ .resolver-preview-table em { color: #9ca3af; font-style: normal; }
4341
+
4342
+ /* ── Management panel — per-resolver rows ───────────────────── */
4343
+ .mgmt-resolver-list { display: grid; gap: 8px; margin-top: 8px; }
4344
+ .mgmt-resolver-row { border: 1px solid #e2e8f0; border-radius: 7px; padding: 10px 12px; background: #fff; display: grid; gap: 6px; }
4345
+ .mgmt-resolver-header { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
4346
+ .mgmt-resolver-id { font-family: monospace; font-size: 12px; background: #f1f5f9; padding: 3px 7px; border-radius: 4px; color: #1e3a5f; }
4347
+ .mgmt-resolver-badges { display: flex; gap: 4px; flex-wrap: wrap; flex: 1; }
4348
+ .mgmt-resolver-type-badge { font-size: 10px; padding: 2px 6px; background: #f0f0f0; color: #444; border-radius: 3px; font-weight: 600; }
4349
+ .mgmt-resolver-type-badge.list { background: #d1fae5; color: #065f46; }
4350
+ .mgmt-resolver-test-btn { margin-left: auto; font-size: 11px; font-weight: 600; padding: 4px 10px; background: #f8fafc; border: 1px solid #cbd5e1; border-radius: 5px; cursor: pointer; color: #334155; white-space: nowrap; }
4351
+ .mgmt-resolver-test-btn:hover:not(:disabled) { background: #e2e8f0; }
4352
+ .mgmt-resolver-test-result { font-size: 11px; padding: 5px 8px; border-radius: 4px; }
4353
+ .mgmt-resolver-test-result.ok { background: #f0fdf4; color: #166534; border: 1px solid #bbf7d0; }
4354
+ .mgmt-resolver-test-result.error { background: #fef2f2; color: #991b1b; border: 1px solid #fecaca; }
4355
+ .mgmt-resolver-linked { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 11px; }
4356
+ .mgmt-resolver-linked-label { color: #6b7280; font-weight: 600; }
4357
+ .mgmt-resolver-linked-obj { background: #f0f0f0; color: #333; padding: 2px 7px; border-radius: 10px; font-size: 10px; font-weight: 600; }
4358
+
4359
+ /* ─── FieldDropdown — chart axis field picker ─────────────────────────── */
4360
+ .field-dropdown-wrap { position: relative; min-width: 0; max-width: 100%; }
4361
+ .field-dropdown-trigger {
4362
+ display: flex; align-items: center; gap: 4px;
4363
+ width: 100%; min-width: 0; max-width: 100%;
4364
+ padding: 5px 8px; border: 1px solid #e2e8f0; border-radius: 6px;
4365
+ background: #fff; font-size: 12px; color: #1e293b; cursor: pointer;
4366
+ transition: border-color .15s, box-shadow .15s;
4367
+ }
4368
+ .field-dropdown-trigger:hover:not(:disabled) { border-color: #aaa; }
4369
+ .field-dropdown-trigger.open { border-color: #333; box-shadow: 0 0 0 3px rgba(0,0,0,.06); }
4370
+ .field-dropdown-trigger.disabled { opacity: .45; cursor: not-allowed; }
4371
+ .field-dropdown-label { flex: 1; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4372
+ .field-dropdown-popover {
4373
+ position: absolute; top: calc(100% + 4px); right: 0; z-index: 200;
4374
+ width: min(100%, 220px); min-width: 0; max-width: calc(100vw - 32px); max-height: 260px; overflow-y: auto;
4375
+ background: #fff; border: 1px solid #e2e8f0; border-radius: 8px;
4376
+ box-shadow: 0 8px 24px rgba(0,0,0,.1);
4377
+ }
4378
+ .field-dropdown-search {
4379
+ display: flex; align-items: center; gap: 6px;
4380
+ padding: 7px 10px; border-bottom: 1px solid #f1f5f9; color: #9ca3af; position: sticky; top: 0; background: #fff;
4381
+ }
4382
+ .field-dropdown-search input { border: none; outline: none; font-size: 12px; color: #0f172a; width: 100%; background: transparent; }
4383
+ .field-dropdown-item {
4384
+ display: flex; align-items: center; gap: 8px;
4385
+ width: 100%; padding: 7px 10px; border: none; background: transparent;
4386
+ font-size: 12px; color: #374151; cursor: pointer; text-align: left;
4387
+ transition: background .1s;
4388
+ }
4389
+ .field-dropdown-item span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4390
+ .field-dropdown-item:hover { background: #f8fafc; }
4391
+ .field-dropdown-item.selected { background: #f0f0f0; color: #111; font-weight: 600; }
4392
+ .field-dropdown-item .check { margin-left: auto; color: #333; }
4393
+ .field-dropdown-empty { font-size: 11px; color: #9ca3af; padding: 12px 12px; text-align: center; }
4394
+
4395
+ /* workspace-settings-row-field — label + field dropdown row */
4396
+ .workspace-settings-row-field {
4397
+ display: flex; align-items: center; justify-content: space-between;
4398
+ padding: 5px 0; gap: 8px; font-size: 12px; color: #374151;
4399
+ }
4400
+ .workspace-settings-row-field > span { flex: 0 0 auto; min-width: 80px; }
4401
+ .workspace-settings-row-field > select {
4402
+ flex: 1; max-width: 180px;
4403
+ border: 1px solid #e2e8f0; border-radius: 6px; padding: 5px 8px;
4404
+ font-size: 12px; color: #1e293b; background: #fff; cursor: pointer;
4405
+ }
4406
+
4407
+ /* ─── FieldsSubPanel (wfp) — Twenty CRM-style fields list ─────────────── */
4408
+ .wfp-field-list { display: flex; flex-direction: column; gap: 0; padding-top: 4px; }
4409
+ .wfp-field-row {
4410
+ display: flex; align-items: center; gap: 8px;
4411
+ padding: 7px 10px; border-radius: 6px; font-size: 12px;
4412
+ color: #1e293b; transition: background .12s; user-select: none;
4413
+ }
4414
+ .wfp-field-row:hover { background: #f8fafc; }
4415
+ .wfp-field-row.hidden { opacity: .5; }
4416
+ .wfp-grip { color: #d1d5db; flex-shrink: 0; cursor: grab; }
4417
+ .wfp-field-icon { color: #94a3b8; flex-shrink: 0; }
4418
+ .wfp-field-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4419
+ .wfp-field-actions { display: flex; align-items: center; gap: 2px; margin-left: auto; }
4420
+ .wfp-eye-btn {
4421
+ display: flex; align-items: center; justify-content: center;
4422
+ width: 24px; height: 24px; border: none; background: transparent;
4423
+ border-radius: 4px; cursor: pointer; color: #9ca3af; transition: color .1s, background .1s;
4424
+ }
4425
+ .wfp-eye-btn:hover { color: #374151; background: #f1f5f9; }
4426
+ .wfp-eye-btn.off { color: #d1d5db; }
4427
+ .wfp-remove-btn {
4428
+ display: flex; align-items: center; justify-content: center;
4429
+ width: 22px; height: 22px; border: none; background: transparent;
4430
+ border-radius: 4px; cursor: pointer; color: #d1d5db; transition: color .1s;
4431
+ }
4432
+ .wfp-remove-btn:hover { color: #ef4444; }
4433
+ .wfp-hidden-toggle {
4434
+ display: flex; align-items: center; gap: 6px;
4435
+ width: 100%; padding: 7px 10px; border: none; background: transparent;
4436
+ font-size: 12px; color: #6b7280; cursor: pointer; border-radius: 6px;
4437
+ margin-top: 2px; transition: background .12s;
4438
+ }
4439
+ .wfp-hidden-toggle:hover { background: #f8fafc; }
4440
+ .wfp-hidden-count {
4441
+ font-size: 11px; background: #f1f5f9; color: #6b7280;
4442
+ padding: 1px 6px; border-radius: 10px; font-weight: 600;
4443
+ }
4444
+ .wfp-chevron { color: #9ca3af; margin-left: auto; transition: transform .2s; }
4445
+ .wfp-chevron.open { transform: rotate(180deg); }
4446
+ .wfp-add-field {
4447
+ display: flex; gap: 6px; padding: 10px 10px 4px;
4448
+ border-top: 1px solid #f1f5f9; margin-top: 8px;
4449
+ }
4450
+ .wfp-add-field input {
4451
+ flex: 1; border: 1px solid #e2e8f0; border-radius: 6px;
4452
+ padding: 5px 8px; font-size: 12px; outline: none; color: #1e293b;
4453
+ }
4454
+ .wfp-add-field input:focus { border-color: #999; outline: none; }
4455
+ .wfp-add-field button {
4456
+ padding: 5px 10px; background: #111; color: #fff; border: none;
4457
+ border-radius: 6px; font-size: 12px; font-weight: 500; cursor: pointer; transition: background .1s;
4458
+ }
4459
+ .wfp-add-field button:hover:not(:disabled) { background: #333; }
4460
+ .wfp-add-field button:disabled { opacity: .4; cursor: not-allowed; }