@mochabug/adapt-web 1.0.1-rc.11 → 1.0.1-rc.13

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.
@@ -32,7 +32,8 @@ var MbAdapt = (() => {
32
32
  clearPersistedState: () => clearPersistedState,
33
33
  configure: () => configure,
34
34
  createConnectClient: () => createConnectClient,
35
- resetConfig: () => resetConfig
35
+ resetConfig: () => resetConfig,
36
+ resolveTheme: () => resolveTheme
36
37
  });
37
38
 
38
39
  // ../node_modules/@bufbuild/protobuf/dist/esm/is-message.js
@@ -6715,89 +6716,116 @@ var MbAdapt = (() => {
6715
6716
  min-height: inherit;
6716
6717
  display: flex;
6717
6718
  flex-direction: column;
6718
- background: var(--mb-adapt-bg);
6719
- --mb-adapt-bg: transparent;
6720
- --mb-adapt-font: system-ui, -apple-system, sans-serif;
6721
- --mb-adapt-button-hover-bg: rgba(128, 128, 128, 0.2);
6722
- --mb-adapt-separator-active: rgba(59, 130, 246, 0.5);
6723
- --mb-adapt-floating-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25), 0 12px 24px -8px rgba(0, 0, 0, 0.15);
6724
- --mb-adapt-floating-border: none;
6725
- --mb-adapt-floating-backdrop: none;
6726
- --mb-adapt-floating-radius: 8px;
6727
- --mb-adapt-status-card-shadow: 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
6728
- --mb-adapt-drag-ghost-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
6729
- --mb-adapt-border-radius: 8px;
6719
+
6720
+ /* Two-layer CSS variables: --_X reads user-set --mb-adapt-X first, falls back to light default */
6721
+ --_bg: var(--mb-adapt-bg, transparent);
6722
+ --_font: var(--mb-adapt-font, system-ui, -apple-system, sans-serif);
6723
+ --_button-hover-bg: var(--mb-adapt-button-hover-bg, rgba(128, 128, 128, 0.2));
6724
+ --_separator-active: var(--mb-adapt-separator-active, rgba(59, 130, 246, 0.5));
6725
+ --_floating-shadow: var(--mb-adapt-floating-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.25), 0 12px 24px -8px rgba(0, 0, 0, 0.15));
6726
+ --_floating-border: var(--mb-adapt-floating-border, none);
6727
+ --_floating-backdrop: var(--mb-adapt-floating-backdrop, none);
6728
+ --_floating-radius: var(--mb-adapt-floating-radius, 8px);
6729
+ --_status-card-bg: var(--mb-adapt-status-card-bg, #ffffff);
6730
+ --_status-card-border: var(--mb-adapt-status-card-border, #e5e7eb);
6731
+ --_status-card-shadow: var(--mb-adapt-status-card-shadow, 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04));
6732
+ --_status-icon-bg: var(--mb-adapt-status-icon-bg, #fef2f2);
6733
+ --_status-icon-stopped-bg: var(--mb-adapt-status-icon-stopped-bg, var(--mb-adapt-status-icon-bg, #f3f4f6));
6734
+ --_status-text: var(--mb-adapt-status-text, #374151);
6735
+ --_drag-ghost-shadow: var(--mb-adapt-drag-ghost-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));
6736
+ --_border-radius: var(--mb-adapt-border-radius, 8px);
6730
6737
  --mb-adapt-responsive-breakpoint: 768;
6731
6738
  --mb-adapt-responsive-hysteresis: 40;
6732
6739
 
6733
- /* Cap.js widget customization variables */
6734
- --mb-adapt-cap-background: #ffffff;
6735
- --mb-adapt-cap-border-color: #e2e8f0;
6736
- --mb-adapt-cap-border-radius: 16px;
6737
- --mb-adapt-cap-height: 72px;
6738
- --mb-adapt-cap-width: 380px;
6739
- --mb-adapt-cap-padding: 20px 28px;
6740
- --mb-adapt-cap-gap: 20px;
6741
- --mb-adapt-cap-color: #1e293b;
6742
- --mb-adapt-cap-checkbox-size: 36px;
6743
- --mb-adapt-cap-checkbox-border: 2px solid #cbd5e1;
6744
- --mb-adapt-cap-checkbox-radius: 10px;
6745
- --mb-adapt-cap-checkbox-background: #f8fafc;
6746
- --mb-adapt-cap-spinner-color: #6366f1;
6747
- --mb-adapt-cap-spinner-bg: #e2e8f0;
6748
- --mb-adapt-cap-font: inherit;
6749
- --mb-adapt-cap-spinner-thickness: 3px;
6750
- --mb-adapt-cap-shadow: 0 4px 20px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
6751
- --mb-adapt-cap-shadow-hover: 0 8px 30px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.06);
6752
-
6753
- /* Fork panel theming \u2014 customizable via CSS variables */
6754
- --mb-adapt-fork-bg: #ffffff;
6755
- --mb-adapt-fork-tab-bg: #f3f3f3;
6756
- --mb-adapt-fork-tab-active-bg: #ffffff;
6757
- --mb-adapt-fork-tab-color: rgb(51, 51, 51);
6758
- --mb-adapt-fork-tab-inactive-color: rgba(51, 51, 51, 0.7);
6759
- --mb-adapt-fork-separator: rgba(128, 128, 128, 0.35);
6740
+ /* Cap.js widget variables */
6741
+ --_cap-background: var(--mb-adapt-cap-background, #ffffff);
6742
+ --_cap-border-color: var(--mb-adapt-cap-border-color, #e2e8f0);
6743
+ --_cap-border-radius: var(--mb-adapt-cap-border-radius, 16px);
6744
+ --_cap-height: var(--mb-adapt-cap-height, 72px);
6745
+ --_cap-width: var(--mb-adapt-cap-width, 380px);
6746
+ --_cap-padding: var(--mb-adapt-cap-padding, 20px 28px);
6747
+ --_cap-gap: var(--mb-adapt-cap-gap, 20px);
6748
+ --_cap-color: var(--mb-adapt-cap-color, #1e293b);
6749
+ --_cap-checkbox-size: var(--mb-adapt-cap-checkbox-size, 36px);
6750
+ --_cap-checkbox-border: var(--mb-adapt-cap-checkbox-border, 2px solid #cbd5e1);
6751
+ --_cap-checkbox-radius: var(--mb-adapt-cap-checkbox-radius, 10px);
6752
+ --_cap-checkbox-background: var(--mb-adapt-cap-checkbox-background, #f8fafc);
6753
+ --_cap-spinner-color: var(--mb-adapt-cap-spinner-color, #6366f1);
6754
+ --_cap-spinner-bg: var(--mb-adapt-cap-spinner-bg, #e2e8f0);
6755
+ --_cap-font: var(--mb-adapt-cap-font, inherit);
6756
+ --_cap-spinner-thickness: var(--mb-adapt-cap-spinner-thickness, 3px);
6757
+ --_cap-shadow: var(--mb-adapt-cap-shadow, 0 4px 20px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04));
6758
+ --_cap-shadow-hover: var(--mb-adapt-cap-shadow-hover, 0 8px 30px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.06));
6759
+
6760
+ /* Fork panel theming */
6761
+ --_fork-bg: var(--mb-adapt-fork-bg, #ffffff);
6762
+ --_fork-tab-bg: var(--mb-adapt-fork-tab-bg, #f3f3f3);
6763
+ --_fork-tab-active-bg: var(--mb-adapt-fork-tab-active-bg, #ffffff);
6764
+ --_fork-tab-color: var(--mb-adapt-fork-tab-color, rgb(51, 51, 51));
6765
+ --_fork-tab-inactive-color: var(--mb-adapt-fork-tab-inactive-color, rgba(51, 51, 51, 0.7));
6766
+ --_fork-separator: var(--mb-adapt-fork-separator, rgba(128, 128, 128, 0.35));
6767
+
6768
+ /* Tab shape */
6769
+ --_tab-radius: var(--mb-adapt-tab-radius, 0);
6770
+ --_tab-shadow: var(--mb-adapt-tab-shadow, none);
6771
+ --_tab-active-shadow: var(--mb-adapt-tab-active-shadow, none);
6772
+ --_tab-gap: var(--mb-adapt-tab-gap, 0px);
6773
+ --_tab-padding: var(--mb-adapt-tab-padding, 0 14px);
6774
+ --_tab-font-size: var(--mb-adapt-tab-font-size, 13px);
6775
+ --_tab-min-width: var(--mb-adapt-tab-min-width, 100px);
6776
+ --_tab-spacing: var(--mb-adapt-tab-spacing, 6px);
6777
+ --_toolbar-height: var(--mb-adapt-toolbar-height, 40px);
6778
+ --_toolbar-padding: var(--mb-adapt-toolbar-padding, 0);
6779
+
6780
+ /* Drop targets \u2014 light defaults */
6781
+ --_drop-header-bg: var(--mb-adapt-drop-header-bg, rgba(99, 102, 241, 0.18));
6782
+ --_drop-center-bg: var(--mb-adapt-drop-center-bg, rgba(99, 102, 241, 0.12));
6783
+ --_drop-split-bg: var(--mb-adapt-drop-split-bg, rgba(99, 102, 241, 0.14));
6784
+ --_drop-border: var(--mb-adapt-drop-border, rgba(99, 102, 241, 0.55));
6785
+
6786
+ background: var(--_bg);
6760
6787
  }
6761
6788
 
6762
6789
  .mb-adapt--dark {
6763
6790
  /* Cap.js widget dark mode */
6764
- --mb-adapt-cap-background: #1e293b;
6765
- --mb-adapt-cap-border-color: #334155;
6766
- --mb-adapt-cap-color: #f1f5f9;
6767
- --mb-adapt-cap-checkbox-border: 2px solid #475569;
6768
- --mb-adapt-cap-checkbox-background: #0f172a;
6769
- --mb-adapt-cap-spinner-color: #818cf8;
6770
- --mb-adapt-cap-spinner-bg: #334155;
6771
- --mb-adapt-cap-shadow: 0 4px 20px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15);
6772
- --mb-adapt-cap-shadow-hover: 0 8px 30px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.2);
6791
+ --_cap-background: var(--mb-adapt-cap-background, #1e293b);
6792
+ --_cap-border-color: var(--mb-adapt-cap-border-color, #334155);
6793
+ --_cap-color: var(--mb-adapt-cap-color, #f1f5f9);
6794
+ --_cap-checkbox-border: var(--mb-adapt-cap-checkbox-border, 2px solid #475569);
6795
+ --_cap-checkbox-background: var(--mb-adapt-cap-checkbox-background, #0f172a);
6796
+ --_cap-spinner-color: var(--mb-adapt-cap-spinner-color, #818cf8);
6797
+ --_cap-spinner-bg: var(--mb-adapt-cap-spinner-bg, #334155);
6798
+ --_cap-shadow: var(--mb-adapt-cap-shadow, 0 4px 20px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15));
6799
+ --_cap-shadow-hover: var(--mb-adapt-cap-shadow-hover, 0 8px 30px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.2));
6773
6800
 
6774
6801
  /* Status card dark mode */
6775
- --mb-adapt-status-card-bg: #1e293b;
6776
- --mb-adapt-status-card-border: #334155;
6777
- --mb-adapt-status-icon-bg: #351c1c;
6778
- --mb-adapt-status-text: #e2e8f0;
6802
+ --_status-card-bg: var(--mb-adapt-status-card-bg, #1e293b);
6803
+ --_status-card-border: var(--mb-adapt-status-card-border, #334155);
6804
+ --_status-icon-bg: var(--mb-adapt-status-icon-bg, #351c1c);
6805
+ --_status-icon-stopped-bg: var(--mb-adapt-status-icon-stopped-bg, var(--mb-adapt-status-icon-bg, #1e293b));
6806
+ --_status-text: var(--mb-adapt-status-text, #e2e8f0);
6779
6807
 
6780
6808
  /* Panel dark mode overrides */
6781
- --mb-adapt-button-hover-bg: rgba(128, 128, 128, 0.3);
6782
- --mb-adapt-separator-active: rgba(99, 130, 246, 0.6);
6783
- --mb-adapt-floating-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 12px 24px -8px rgba(0, 0, 0, 0.3);
6784
- --mb-adapt-floating-border: 1px solid rgba(255, 255, 255, 0.06);
6785
- --mb-adapt-status-card-shadow: 0 4px 24px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15);
6786
- --mb-adapt-drag-ghost-shadow: 0 4px 12px rgba(0, 0, 0, 0.35);
6809
+ --_button-hover-bg: var(--mb-adapt-button-hover-bg, rgba(128, 128, 128, 0.3));
6810
+ --_separator-active: var(--mb-adapt-separator-active, rgba(99, 130, 246, 0.6));
6811
+ --_floating-shadow: var(--mb-adapt-floating-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 12px 24px -8px rgba(0, 0, 0, 0.3));
6812
+ --_floating-border: var(--mb-adapt-floating-border, 1px solid rgba(255, 255, 255, 0.06));
6813
+ --_status-card-shadow: var(--mb-adapt-status-card-shadow, 0 4px 24px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15));
6814
+ --_drag-ghost-shadow: var(--mb-adapt-drag-ghost-shadow, 0 4px 12px rgba(0, 0, 0, 0.35));
6787
6815
 
6788
6816
  /* Fork panel dark mode */
6789
- --mb-adapt-fork-bg: #1e1e1e;
6790
- --mb-adapt-fork-tab-bg: #252526;
6791
- --mb-adapt-fork-tab-active-bg: #1e1e1e;
6792
- --mb-adapt-fork-tab-color: #ffffff;
6793
- --mb-adapt-fork-tab-inactive-color: #969696;
6794
- --mb-adapt-fork-separator: rgb(68, 68, 68);
6817
+ --_fork-bg: var(--mb-adapt-fork-bg, #1e1e1e);
6818
+ --_fork-tab-bg: var(--mb-adapt-fork-tab-bg, #252526);
6819
+ --_fork-tab-active-bg: var(--mb-adapt-fork-tab-active-bg, #1e1e1e);
6820
+ --_fork-tab-color: var(--mb-adapt-fork-tab-color, #ffffff);
6821
+ --_fork-tab-inactive-color: var(--mb-adapt-fork-tab-inactive-color, #969696);
6822
+ --_fork-separator: var(--mb-adapt-fork-separator, rgb(68, 68, 68));
6795
6823
 
6796
6824
  /* Drop target dark mode */
6797
- --mb-adapt-drop-header-bg: rgba(129, 140, 248, 0.22);
6798
- --mb-adapt-drop-center-bg: rgba(129, 140, 248, 0.15);
6799
- --mb-adapt-drop-split-bg: rgba(129, 140, 248, 0.18);
6800
- --mb-adapt-drop-border: rgba(129, 140, 248, 0.6);
6825
+ --_drop-header-bg: var(--mb-adapt-drop-header-bg, rgba(129, 140, 248, 0.22));
6826
+ --_drop-center-bg: var(--mb-adapt-drop-center-bg, rgba(129, 140, 248, 0.15));
6827
+ --_drop-split-bg: var(--mb-adapt-drop-split-bg, rgba(129, 140, 248, 0.18));
6828
+ --_drop-border: var(--mb-adapt-drop-border, rgba(129, 140, 248, 0.6));
6801
6829
  }
6802
6830
 
6803
6831
  /* \u2500\u2500 Layout (recursive split tree) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -6837,7 +6865,7 @@ var MbAdapt = (() => {
6837
6865
  /* Draggable separator between split panels */
6838
6866
  .mb-layout-separator {
6839
6867
  flex: 0 0 5px;
6840
- background: var(--mb-adapt-fork-separator);
6868
+ background: var(--_fork-separator);
6841
6869
  transition: background 0.15s;
6842
6870
  position: relative;
6843
6871
  z-index: 1;
@@ -6849,7 +6877,7 @@ var MbAdapt = (() => {
6849
6877
 
6850
6878
  .mb-layout-separator:hover,
6851
6879
  .mb-layout-separator--active {
6852
- background: var(--mb-adapt-separator-active);
6880
+ background: var(--_separator-active);
6853
6881
  }
6854
6882
 
6855
6883
  /* \u2500\u2500 Group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -6857,16 +6885,17 @@ var MbAdapt = (() => {
6857
6885
  display: flex;
6858
6886
  flex-direction: column;
6859
6887
  height: 100%;
6860
- background: var(--mb-adapt-bg);
6888
+ background: var(--_bg);
6861
6889
  }
6862
6890
 
6863
6891
  .mb-group-header {
6864
6892
  display: flex;
6865
6893
  align-items: stretch;
6866
- height: 40px;
6867
- min-height: 40px;
6868
- background: var(--mb-adapt-fork-tab-bg);
6869
- border-bottom: 1px solid var(--mb-adapt-fork-separator);
6894
+ height: var(--_toolbar-height);
6895
+ min-height: var(--_toolbar-height);
6896
+ padding: var(--_toolbar-padding);
6897
+ background: var(--_fork-tab-bg);
6898
+ border-bottom: 1px solid var(--_fork-separator);
6870
6899
  user-select: none;
6871
6900
  }
6872
6901
 
@@ -6877,7 +6906,7 @@ var MbAdapt = (() => {
6877
6906
 
6878
6907
  .mb-group-tabs {
6879
6908
  display: flex;
6880
- align-items: stretch;
6909
+ align-items: center;
6881
6910
  overflow-x: auto;
6882
6911
  overflow-y: hidden;
6883
6912
  flex: 0 1 auto;
@@ -6904,16 +6933,16 @@ var MbAdapt = (() => {
6904
6933
  flex: 1;
6905
6934
  position: relative;
6906
6935
  overflow: hidden;
6907
- background: var(--mb-adapt-fork-bg);
6936
+ background: var(--_fork-bg);
6908
6937
  }
6909
6938
 
6910
6939
  /* Main group overrides */
6911
6940
  .mb-group[data-main-group="true"] {
6912
- background: var(--mb-adapt-bg);
6941
+ background: var(--_bg);
6913
6942
  }
6914
6943
 
6915
6944
  .mb-group[data-main-group="true"] .mb-group-content {
6916
- background: var(--mb-adapt-bg);
6945
+ background: var(--_bg);
6917
6946
  }
6918
6947
 
6919
6948
 
@@ -6921,27 +6950,31 @@ var MbAdapt = (() => {
6921
6950
  .mb-tab {
6922
6951
  display: flex;
6923
6952
  align-items: center;
6924
- gap: 6px;
6925
- padding: 0 14px;
6926
- min-width: 100px;
6927
- font-size: 13px;
6928
- font-family: var(--mb-adapt-font);
6953
+ gap: var(--_tab-spacing);
6954
+ padding: var(--_tab-padding);
6955
+ min-width: var(--_tab-min-width);
6956
+ font-size: var(--_tab-font-size);
6957
+ font-family: var(--_font);
6929
6958
  white-space: nowrap;
6930
6959
  cursor: pointer;
6931
6960
  touch-action: none;
6932
- color: var(--mb-adapt-fork-tab-inactive-color);
6933
- background: var(--mb-adapt-fork-tab-bg);
6934
- border-right: 1px solid var(--mb-adapt-fork-separator);
6935
- transition: background 0.1s;
6961
+ color: var(--_fork-tab-inactive-color);
6962
+ background: var(--_fork-tab-bg);
6963
+ border-right: 1px solid var(--_fork-separator);
6964
+ border-radius: var(--_tab-radius);
6965
+ box-shadow: var(--_tab-shadow);
6966
+ margin: var(--_tab-gap);
6967
+ transition: background 0.15s, box-shadow 0.15s;
6936
6968
  }
6937
6969
 
6938
6970
  .mb-tab[data-active="true"] {
6939
- color: var(--mb-adapt-fork-tab-color);
6940
- background: var(--mb-adapt-fork-tab-active-bg);
6971
+ color: var(--_fork-tab-color);
6972
+ background: var(--_fork-tab-active-bg);
6973
+ box-shadow: var(--_tab-active-shadow);
6941
6974
  }
6942
6975
 
6943
6976
  .mb-tab:hover {
6944
- background: var(--mb-adapt-fork-tab-active-bg);
6977
+ background: var(--_fork-tab-active-bg);
6945
6978
  }
6946
6979
 
6947
6980
  .mb-tab-label {
@@ -6992,7 +7025,7 @@ var MbAdapt = (() => {
6992
7025
 
6993
7026
  .mb-tab-close:hover {
6994
7027
  opacity: 1 !important;
6995
- background: var(--mb-adapt-button-hover-bg);
7028
+ background: var(--_button-hover-bg);
6996
7029
  }
6997
7030
 
6998
7031
  .mb-tab-close svg {
@@ -7020,11 +7053,11 @@ var MbAdapt = (() => {
7020
7053
  .mb-floating-overlay {
7021
7054
  position: fixed;
7022
7055
  z-index: 100000;
7023
- box-shadow: var(--mb-adapt-floating-shadow);
7024
- border: var(--mb-adapt-floating-border);
7025
- backdrop-filter: var(--mb-adapt-floating-backdrop);
7026
- -webkit-backdrop-filter: var(--mb-adapt-floating-backdrop);
7027
- border-radius: var(--mb-adapt-floating-radius);
7056
+ box-shadow: var(--_floating-shadow);
7057
+ border: var(--_floating-border);
7058
+ backdrop-filter: var(--_floating-backdrop);
7059
+ -webkit-backdrop-filter: var(--_floating-backdrop);
7060
+ border-radius: var(--_floating-radius);
7028
7061
  display: flex;
7029
7062
  flex-direction: column;
7030
7063
  /* No overflow:hidden here \u2014 resize handles use negative offsets (top:-3px etc.)
@@ -7034,7 +7067,7 @@ var MbAdapt = (() => {
7034
7067
 
7035
7068
  .mb-floating-overlay > .mb-group {
7036
7069
  flex: 1;
7037
- border-radius: var(--mb-adapt-floating-radius);
7070
+ border-radius: var(--_floating-radius);
7038
7071
  overflow: hidden;
7039
7072
  }
7040
7073
 
@@ -7046,7 +7079,7 @@ var MbAdapt = (() => {
7046
7079
  flex: 1;
7047
7080
  min-width: 0;
7048
7081
  min-height: 0;
7049
- border-radius: var(--mb-adapt-floating-radius);
7082
+ border-radius: var(--_floating-radius);
7050
7083
  overflow: hidden;
7051
7084
  }
7052
7085
 
@@ -7091,7 +7124,7 @@ var MbAdapt = (() => {
7091
7124
  border: 0;
7092
7125
  display: block;
7093
7126
  background: transparent;
7094
- border-radius: var(--mb-adapt-border-radius);
7127
+ border-radius: var(--_border-radius);
7095
7128
  pointer-events: auto;
7096
7129
  opacity: 0;
7097
7130
  transition: opacity 0.1s ease-out;
@@ -7126,10 +7159,10 @@ var MbAdapt = (() => {
7126
7159
  padding: 32px 40px;
7127
7160
  max-width: 380px;
7128
7161
  border-radius: 16px;
7129
- background: var(--mb-adapt-status-card-bg, #ffffff);
7130
- border: 1px solid var(--mb-adapt-status-card-border, #e5e7eb);
7131
- box-shadow: var(--mb-adapt-status-card-shadow);
7132
- font-family: var(--mb-adapt-font);
7162
+ background: var(--_status-card-bg);
7163
+ border: 1px solid var(--_status-card-border);
7164
+ box-shadow: var(--_status-card-shadow);
7165
+ font-family: var(--_font);
7133
7166
  text-align: center;
7134
7167
  }
7135
7168
 
@@ -7140,7 +7173,7 @@ var MbAdapt = (() => {
7140
7173
  display: flex;
7141
7174
  align-items: center;
7142
7175
  justify-content: center;
7143
- background: var(--mb-adapt-status-icon-bg, #fef2f2);
7176
+ background: var(--_status-icon-bg);
7144
7177
  }
7145
7178
 
7146
7179
  .mb-adapt__status-icon svg {
@@ -7149,11 +7182,11 @@ var MbAdapt = (() => {
7149
7182
  }
7150
7183
 
7151
7184
  .mb-adapt__status-icon--stopped {
7152
- background: var(--mb-adapt-status-icon-bg, #f3f4f6);
7185
+ background: var(--_status-icon-stopped-bg);
7153
7186
  }
7154
7187
 
7155
7188
  .mb-adapt__status-text {
7156
- color: var(--mb-adapt-status-text, #374151);
7189
+ color: var(--_status-text);
7157
7190
  font-size: 15px;
7158
7191
  line-height: 1.5;
7159
7192
  margin: 0;
@@ -7161,19 +7194,19 @@ var MbAdapt = (() => {
7161
7194
 
7162
7195
  .mb-adapt__status-restart {
7163
7196
  padding: 8px 20px;
7164
- border: 1px solid var(--mb-adapt-status-card-border, #e5e7eb);
7197
+ border: 1px solid var(--_status-card-border);
7165
7198
  border-radius: 8px;
7166
7199
  background: transparent;
7167
- color: var(--mb-adapt-status-text, #374151);
7200
+ color: var(--_status-text);
7168
7201
  font-size: 14px;
7169
7202
  font-weight: 500;
7170
- font-family: var(--mb-adapt-font);
7203
+ font-family: var(--_font);
7171
7204
  cursor: pointer;
7172
7205
  transition: background 0.15s, border-color 0.15s;
7173
7206
  }
7174
7207
 
7175
7208
  .mb-adapt__status-restart:hover {
7176
- background: var(--mb-adapt-status-card-border, #e5e7eb);
7209
+ background: var(--_status-card-border);
7177
7210
  }
7178
7211
 
7179
7212
  /* \u2500\u2500 Confirm-on-close dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -7203,18 +7236,18 @@ var MbAdapt = (() => {
7203
7236
  padding: 24px 28px;
7204
7237
  max-width: 360px;
7205
7238
  width: 100%;
7206
- border-radius: var(--mb-adapt-floating-radius);
7207
- background: var(--mb-adapt-fork-tab-active-bg);
7208
- border: 1px solid var(--mb-adapt-fork-separator);
7209
- box-shadow: var(--mb-adapt-floating-shadow);
7210
- font-family: var(--mb-adapt-font);
7239
+ border-radius: var(--_floating-radius);
7240
+ background: var(--_fork-tab-active-bg);
7241
+ border: 1px solid var(--_fork-separator);
7242
+ box-shadow: var(--_floating-shadow);
7243
+ font-family: var(--_font);
7211
7244
  text-align: center;
7212
7245
  }
7213
7246
 
7214
7247
  .mb-adapt__confirm-text {
7215
7248
  font-size: 14px;
7216
7249
  line-height: 1.5;
7217
- color: var(--mb-adapt-fork-tab-color);
7250
+ color: var(--_fork-tab-color);
7218
7251
  margin: 0;
7219
7252
  }
7220
7253
 
@@ -7228,7 +7261,7 @@ var MbAdapt = (() => {
7228
7261
  padding: 8px 16px;
7229
7262
  border-radius: 6px;
7230
7263
  font-size: 13px;
7231
- font-family: var(--mb-adapt-font);
7264
+ font-family: var(--_font);
7232
7265
  cursor: pointer;
7233
7266
  font-weight: 500;
7234
7267
  transition: background 0.15s, border-color 0.15s;
@@ -7236,17 +7269,17 @@ var MbAdapt = (() => {
7236
7269
 
7237
7270
  .mb-adapt__confirm-btn--cancel {
7238
7271
  background: transparent;
7239
- border: 1px solid var(--mb-adapt-fork-separator);
7240
- color: var(--mb-adapt-fork-tab-color);
7272
+ border: 1px solid var(--_fork-separator);
7273
+ color: var(--_fork-tab-color);
7241
7274
  }
7242
7275
 
7243
7276
  .mb-adapt__confirm-btn--cancel:hover {
7244
- background: var(--mb-adapt-button-hover-bg);
7277
+ background: var(--_button-hover-bg);
7245
7278
  }
7246
7279
 
7247
7280
  .mb-adapt__confirm-btn--confirm {
7248
- background: var(--mb-adapt-fork-tab-color);
7249
- color: var(--mb-adapt-fork-tab-active-bg);
7281
+ background: var(--_fork-tab-color);
7282
+ color: var(--_fork-tab-active-bg);
7250
7283
  border: 1px solid transparent;
7251
7284
  }
7252
7285
 
@@ -7271,23 +7304,23 @@ var MbAdapt = (() => {
7271
7304
 
7272
7305
  /* Cap.js widget styling */
7273
7306
  .mb-adapt cap-widget {
7274
- --cap-background: var(--mb-adapt-cap-background);
7275
- --cap-border-color: var(--mb-adapt-cap-border-color);
7276
- --cap-border-radius: var(--mb-adapt-cap-border-radius);
7277
- --cap-widget-height: var(--mb-adapt-cap-height);
7278
- --cap-widget-width: var(--mb-adapt-cap-width);
7279
- --cap-widget-padding: var(--mb-adapt-cap-padding);
7280
- --cap-gap: var(--mb-adapt-cap-gap);
7281
- --cap-color: var(--mb-adapt-cap-color);
7282
- --cap-checkbox-size: var(--mb-adapt-cap-checkbox-size);
7283
- --cap-checkbox-border: var(--mb-adapt-cap-checkbox-border);
7284
- --cap-checkbox-border-radius: var(--mb-adapt-cap-checkbox-radius);
7285
- --cap-checkbox-background: var(--mb-adapt-cap-checkbox-background);
7307
+ --cap-background: var(--_cap-background);
7308
+ --cap-border-color: var(--_cap-border-color);
7309
+ --cap-border-radius: var(--_cap-border-radius);
7310
+ --cap-widget-height: var(--_cap-height);
7311
+ --cap-widget-width: var(--_cap-width);
7312
+ --cap-widget-padding: var(--_cap-padding);
7313
+ --cap-gap: var(--_cap-gap);
7314
+ --cap-color: var(--_cap-color);
7315
+ --cap-checkbox-size: var(--_cap-checkbox-size);
7316
+ --cap-checkbox-border: var(--_cap-checkbox-border);
7317
+ --cap-checkbox-border-radius: var(--_cap-checkbox-radius);
7318
+ --cap-checkbox-background: var(--_cap-checkbox-background);
7286
7319
  --cap-checkbox-margin: 0;
7287
- --cap-font: var(--mb-adapt-cap-font);
7288
- --cap-spinner-color: var(--mb-adapt-cap-spinner-color);
7289
- --cap-spinner-background-color: var(--mb-adapt-cap-spinner-bg);
7290
- --cap-spinner-thickness: var(--mb-adapt-cap-spinner-thickness);
7320
+ --cap-font: var(--_cap-font);
7321
+ --cap-spinner-color: var(--_cap-spinner-color);
7322
+ --cap-spinner-background-color: var(--_cap-spinner-bg);
7323
+ --cap-spinner-thickness: var(--_cap-spinner-thickness);
7291
7324
  }
7292
7325
 
7293
7326
  /* Hide Cap.js credits */
@@ -7308,7 +7341,7 @@ cap-widget::part(attribution) {
7308
7341
  padding: 0;
7309
7342
  border: none;
7310
7343
  background: transparent;
7311
- color: var(--mb-adapt-fork-tab-color);
7344
+ color: var(--_fork-tab-color);
7312
7345
  cursor: pointer;
7313
7346
  display: flex;
7314
7347
  align-items: center;
@@ -7319,7 +7352,7 @@ cap-widget::part(attribution) {
7319
7352
  }
7320
7353
  .mb-adapt-fork-actions button:hover {
7321
7354
  opacity: 1;
7322
- background: var(--mb-adapt-button-hover-bg);
7355
+ background: var(--_button-hover-bg);
7323
7356
  }
7324
7357
  .mb-adapt-fork-actions button svg {
7325
7358
  width: 14px;
@@ -7332,12 +7365,12 @@ cap-widget::part(attribution) {
7332
7365
  docked panels are minimized \u2014 the iframe gets the remaining height. */
7333
7366
  .mb-adapt-minimized-tabs {
7334
7367
  display: none;
7335
- height: 40px;
7368
+ height: var(--_toolbar-height);
7336
7369
  flex-shrink: 0;
7337
7370
  z-index: 100;
7338
7371
  align-items: stretch;
7339
- background: var(--mb-adapt-fork-tab-bg);
7340
- border-bottom: 1px solid var(--mb-adapt-fork-separator);
7372
+ background: var(--_fork-tab-bg);
7373
+ border-bottom: 1px solid var(--_fork-separator);
7341
7374
  user-select: none;
7342
7375
  }
7343
7376
  .mb-adapt-minimized-tab {
@@ -7346,12 +7379,12 @@ cap-widget::part(attribution) {
7346
7379
  gap: 8px;
7347
7380
  padding: 0 12px;
7348
7381
  flex: 1;
7349
- background: var(--mb-adapt-fork-tab-bg);
7350
- color: var(--mb-adapt-fork-tab-color);
7351
- font-size: 13px;
7352
- font-family: var(--mb-adapt-font);
7382
+ background: var(--_fork-tab-bg);
7383
+ color: var(--_fork-tab-color);
7384
+ font-size: var(--_tab-font-size);
7385
+ font-family: var(--_font);
7353
7386
  white-space: nowrap;
7354
- border-right: 1px solid var(--mb-adapt-fork-separator);
7387
+ border-right: 1px solid var(--_fork-separator);
7355
7388
  cursor: default;
7356
7389
  }
7357
7390
  .mb-adapt-minimized-tab-label {
@@ -7384,7 +7417,7 @@ cap-widget::part(attribution) {
7384
7417
  }
7385
7418
  .mb-adapt-minimized-tab-action:hover {
7386
7419
  opacity: 1;
7387
- background: var(--mb-adapt-button-hover-bg);
7420
+ background: var(--_button-hover-bg);
7388
7421
  }
7389
7422
  .mb-adapt-minimized-tab-action svg {
7390
7423
  width: 14px;
@@ -7399,8 +7432,8 @@ cap-widget::part(attribution) {
7399
7432
 
7400
7433
  /* Drop target highlight for minimized tab merge */
7401
7434
  .mb-adapt-minimized-tab--drop-target {
7402
- background: var(--mb-adapt-drop-header-bg, rgba(99, 102, 241, 0.18)) !important;
7403
- box-shadow: inset 0 0 0 2px var(--mb-adapt-drop-border, rgba(99, 102, 241, 0.6));
7435
+ background: var(--_drop-header-bg) !important;
7436
+ box-shadow: inset 0 0 0 2px var(--_drop-border);
7404
7437
  }
7405
7438
 
7406
7439
  /* \u2500\u2500 Pointer-drag ghost element \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -7409,14 +7442,14 @@ cap-widget::part(attribution) {
7409
7442
  pointer-events: none;
7410
7443
  z-index: 999999;
7411
7444
  padding: 4px 10px;
7412
- background: var(--mb-adapt-fork-tab-bg);
7413
- color: var(--mb-adapt-fork-tab-color);
7414
- border: 1px solid var(--mb-adapt-fork-separator);
7415
- border-radius: 4px;
7416
- font-size: 13px;
7417
- font-family: var(--mb-adapt-font);
7445
+ background: var(--_fork-tab-bg);
7446
+ color: var(--_fork-tab-color);
7447
+ border: 1px solid var(--_fork-separator);
7448
+ border-radius: var(--_tab-radius, 4px);
7449
+ font-size: var(--_tab-font-size);
7450
+ font-family: var(--_font);
7418
7451
  white-space: nowrap;
7419
- box-shadow: var(--mb-adapt-drag-ghost-shadow);
7452
+ box-shadow: var(--_drag-ghost-shadow);
7420
7453
  opacity: 0.92;
7421
7454
  display: flex;
7422
7455
  align-items: center;
@@ -7429,8 +7462,8 @@ cap-widget::part(attribution) {
7429
7462
 
7430
7463
  /* \u2500\u2500 Drop target highlight on group header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
7431
7464
  .mb-group-header--drop-target {
7432
- background: var(--mb-adapt-drop-header-bg, rgba(99, 102, 241, 0.18)) !important;
7433
- box-shadow: inset 0 0 0 2px var(--mb-adapt-drop-border, rgba(99, 102, 241, 0.6));
7465
+ background: var(--_drop-header-bg) !important;
7466
+ box-shadow: inset 0 0 0 2px var(--_drop-border);
7434
7467
  }
7435
7468
 
7436
7469
  /* \u2500\u2500 Drop overlay (content-area and dock-strip indicators) */
@@ -7445,16 +7478,16 @@ cap-widget::part(attribution) {
7445
7478
  }
7446
7479
 
7447
7480
  .mb-drop-overlay[data-zone="center"] {
7448
- background: var(--mb-adapt-drop-center-bg, rgba(99, 102, 241, 0.12));
7449
- border: 2px solid var(--mb-adapt-drop-border, rgba(99, 102, 241, 0.55));
7481
+ background: var(--_drop-center-bg);
7482
+ border: 2px solid var(--_drop-border);
7450
7483
  }
7451
7484
 
7452
7485
  .mb-drop-overlay[data-zone="top"],
7453
7486
  .mb-drop-overlay[data-zone="bottom"],
7454
7487
  .mb-drop-overlay[data-zone="left"],
7455
7488
  .mb-drop-overlay[data-zone="right"] {
7456
- background: var(--mb-adapt-drop-split-bg, rgba(99, 102, 241, 0.14));
7457
- border: 2px solid var(--mb-adapt-drop-border, rgba(99, 102, 241, 0.55));
7489
+ background: var(--_drop-split-bg);
7490
+ border: 2px solid var(--_drop-border);
7458
7491
  }
7459
7492
 
7460
7493
  /* \u2500\u2500 Iframe pointer-event guard during drag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -7486,7 +7519,7 @@ html.mb-dragging webview {
7486
7519
 
7487
7520
  .mb-tab-popout:hover {
7488
7521
  opacity: 1 !important;
7489
- background: var(--mb-adapt-button-hover-bg);
7522
+ background: var(--_button-hover-bg);
7490
7523
  }
7491
7524
 
7492
7525
  .mb-tab-popout svg {
@@ -10422,6 +10455,78 @@ html.mb-dragging webview {
10422
10455
  }
10423
10456
  };
10424
10457
 
10458
+ // src/theme.ts
10459
+ function parseHex(hex) {
10460
+ const m = /^#([0-9a-f]{3,8})$/i.exec(hex.trim());
10461
+ if (!m) return null;
10462
+ const h = m[1];
10463
+ if (h.length === 3) {
10464
+ return [
10465
+ parseInt(h[0] + h[0], 16),
10466
+ parseInt(h[1] + h[1], 16),
10467
+ parseInt(h[2] + h[2], 16)
10468
+ ];
10469
+ }
10470
+ if (h.length === 6 || h.length === 8) {
10471
+ return [
10472
+ parseInt(h.slice(0, 2), 16),
10473
+ parseInt(h.slice(2, 4), 16),
10474
+ parseInt(h.slice(4, 6), 16)
10475
+ ];
10476
+ }
10477
+ return null;
10478
+ }
10479
+ function hexToRgba(hex, alpha) {
10480
+ const rgb = parseHex(hex);
10481
+ if (!rgb) return hex;
10482
+ return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${alpha})`;
10483
+ }
10484
+ function resolveTheme(theme) {
10485
+ const result = {};
10486
+ if (theme.primary) {
10487
+ const p = theme.primary;
10488
+ result["--mb-adapt-separator-active"] = hexToRgba(p, 0.4);
10489
+ result["--mb-adapt-drop-border"] = p;
10490
+ result["--mb-adapt-drop-header-bg"] = hexToRgba(p, 0.15);
10491
+ result["--mb-adapt-drop-center-bg"] = hexToRgba(p, 0.1);
10492
+ result["--mb-adapt-drop-split-bg"] = hexToRgba(p, 0.12);
10493
+ result["--mb-adapt-status-icon-bg"] = hexToRgba(p, 0.08);
10494
+ result["--mb-adapt-cap-spinner-color"] = p;
10495
+ }
10496
+ if (theme.background) {
10497
+ result["--mb-adapt-bg"] = theme.background;
10498
+ result["--mb-adapt-fork-tab-active-bg"] = theme.background;
10499
+ result["--mb-adapt-status-card-bg"] = theme.background;
10500
+ }
10501
+ if (theme.surface) {
10502
+ result["--mb-adapt-fork-bg"] = theme.surface;
10503
+ result["--mb-adapt-fork-tab-bg"] = theme.surface;
10504
+ }
10505
+ if (theme.text) {
10506
+ result["--mb-adapt-fork-tab-color"] = theme.text;
10507
+ result["--mb-adapt-status-text"] = theme.text;
10508
+ result["--mb-adapt-cap-color"] = theme.text;
10509
+ }
10510
+ if (theme.textSecondary) {
10511
+ result["--mb-adapt-fork-tab-inactive-color"] = theme.textSecondary;
10512
+ }
10513
+ if (theme.border) {
10514
+ result["--mb-adapt-fork-separator"] = theme.border;
10515
+ result["--mb-adapt-status-card-border"] = theme.border;
10516
+ result["--mb-adapt-cap-border-color"] = theme.border;
10517
+ }
10518
+ if (theme.font) {
10519
+ result["--mb-adapt-font"] = theme.font;
10520
+ result["--mb-adapt-cap-font"] = theme.font;
10521
+ }
10522
+ if (theme.vars) {
10523
+ for (const [key, value] of Object.entries(theme.vars)) {
10524
+ result[`--mb-adapt-${key}`] = value;
10525
+ }
10526
+ }
10527
+ return result;
10528
+ }
10529
+
10425
10530
  // src/AdaptAutomationElement.ts
10426
10531
  var OBSERVED_ATTRIBUTES = [
10427
10532
  "automation-id",
@@ -10454,6 +10559,13 @@ html.mb-dragging webview {
10454
10559
  static get observedAttributes() {
10455
10560
  return OBSERVED_ATTRIBUTES;
10456
10561
  }
10562
+ get theme() {
10563
+ return this._theme;
10564
+ }
10565
+ set theme(v) {
10566
+ this._theme = v;
10567
+ this._client?.setTheme(v);
10568
+ }
10457
10569
  // --- Attribute ↔ Property reflection ---
10458
10570
  get automationId() {
10459
10571
  return this.getAttribute("automation-id");
@@ -10706,6 +10818,7 @@ html.mb-dragging webview {
10706
10818
  if (this.classNames !== void 0) options.classNames = this.classNames;
10707
10819
  if (this.styles !== void 0) options.styles = this.styles;
10708
10820
  if (this.text !== void 0) options.text = this.text;
10821
+ if (this._theme !== void 0) options.theme = this._theme;
10709
10822
  if (this.persistOptions !== void 0) {
10710
10823
  options.persist = this.persistOptions;
10711
10824
  } else if (this.persist) {
@@ -10796,6 +10909,7 @@ html.mb-dragging webview {
10796
10909
  this.allowMaximize = options.allowMaximize ?? true;
10797
10910
  this.floatingAutoResize = options.floatingAutoResize ?? false;
10798
10911
  this.confirmOnClose = options.confirmOnClose ?? false;
10912
+ this.theme = options.theme;
10799
10913
  const container = typeof options.container === "string" ? document.getElementById(options.container) : options.container;
10800
10914
  if (!container) {
10801
10915
  throw new Error(`Container with id '${options.container}' not found`);
@@ -10998,11 +11112,43 @@ html.mb-dragging webview {
10998
11112
  this.darkMode = darkMode;
10999
11113
  this.rootElement?.classList.toggle("mb-adapt--dark", darkMode);
11000
11114
  this.capWidgetInstance?.setDarkMode(darkMode);
11115
+ this.applyTheme();
11001
11116
  const msg = { type: "adapt-darkMode", darkMode };
11002
11117
  for (const c of this.components.values()) {
11003
11118
  this.postToComponent(c, msg);
11004
11119
  }
11005
11120
  }
11121
+ /**
11122
+ * Set the theme. Applies CSS custom properties derived from semantic tokens.
11123
+ * Pass `undefined` to clear all theme overrides.
11124
+ */
11125
+ setTheme(theme) {
11126
+ this.theme = theme;
11127
+ this.clearThemeVars();
11128
+ if (theme?.mode !== void 0) {
11129
+ const dark = theme.mode === "dark";
11130
+ if (this.darkMode !== dark) {
11131
+ this.setDarkMode(dark);
11132
+ return;
11133
+ }
11134
+ }
11135
+ this.applyTheme();
11136
+ }
11137
+ clearThemeVars() {
11138
+ if (!this.rootElement || !this._appliedThemeVars) return;
11139
+ for (const key of this._appliedThemeVars) {
11140
+ this.rootElement.style.removeProperty(key);
11141
+ }
11142
+ this._appliedThemeVars = void 0;
11143
+ }
11144
+ applyTheme() {
11145
+ if (!this.rootElement || !this.theme) return;
11146
+ const vars = resolveTheme(this.theme);
11147
+ for (const [key, value] of Object.entries(vars)) {
11148
+ this.rootElement.style.setProperty(key, value);
11149
+ }
11150
+ this._appliedThemeVars = Object.keys(vars);
11151
+ }
11006
11152
  /**
11007
11153
  * Enable or disable auto-resizing based on iframe content height.
11008
11154
  */
@@ -11207,6 +11353,7 @@ html.mb-dragging webview {
11207
11353
  if (this.options.styles) {
11208
11354
  Object.assign(this.rootElement.style, this.options.styles);
11209
11355
  }
11356
+ this.applyTheme();
11210
11357
  this.container.appendChild(this.rootElement);
11211
11358
  }
11212
11359
  // --- URL handling ---