@lvce-editor/title-bar-worker 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -61,7 +61,7 @@ class AssertionError extends Error {
61
61
  }
62
62
  }
63
63
  const Object$1 = 1;
64
- const Number = 2;
64
+ const Number$1 = 2;
65
65
  const Array$1 = 3;
66
66
  const String = 4;
67
67
  const Boolean$1 = 5;
@@ -71,7 +71,7 @@ const Unknown$1 = 8;
71
71
  const getType = value => {
72
72
  switch (typeof value) {
73
73
  case 'number':
74
- return Number;
74
+ return Number$1;
75
75
  case 'function':
76
76
  return Function;
77
77
  case 'string':
@@ -98,7 +98,7 @@ const object = value => {
98
98
  };
99
99
  const number = value => {
100
100
  const type = getType(value);
101
- if (type !== Number) {
101
+ if (type !== Number$1) {
102
102
  throw new AssertionError('expected value to be of type number');
103
103
  }
104
104
  };
@@ -108,18 +108,6 @@ const array = value => {
108
108
  throw new AssertionError('expected value to be of type array');
109
109
  }
110
110
  };
111
- const string = value => {
112
- const type = getType(value);
113
- if (type !== String) {
114
- throw new AssertionError('expected value to be of type string');
115
- }
116
- };
117
- const boolean = value => {
118
- const type = getType(value);
119
- if (type !== Boolean$1) {
120
- throw new AssertionError('expected value to be of type boolean');
121
- }
122
- };
123
111
 
124
112
  const isMessagePort = value => {
125
113
  return value && value instanceof MessagePort;
@@ -903,6 +891,109 @@ const WebWorkerRpcClient = {
903
891
  __proto__: null,
904
892
  create: create$3
905
893
  };
894
+ const createMockRpc = ({
895
+ commandMap
896
+ }) => {
897
+ const invocations = [];
898
+ const invoke = (method, ...params) => {
899
+ invocations.push([method, ...params]);
900
+ const command = commandMap[method];
901
+ if (!command) {
902
+ throw new Error(`command ${method} not found`);
903
+ }
904
+ return command(...params);
905
+ };
906
+ const mockRpc = {
907
+ invoke,
908
+ invokeAndTransfer: invoke,
909
+ invocations
910
+ };
911
+ return mockRpc;
912
+ };
913
+
914
+ const toCommandId = key => {
915
+ const dotIndex = key.indexOf('.');
916
+ return key.slice(dotIndex + 1);
917
+ };
918
+ const create$2 = () => {
919
+ const states = Object.create(null);
920
+ const commandMapRef = {};
921
+ return {
922
+ get(uid) {
923
+ return states[uid];
924
+ },
925
+ set(uid, oldState, newState) {
926
+ states[uid] = {
927
+ oldState,
928
+ newState
929
+ };
930
+ },
931
+ dispose(uid) {
932
+ delete states[uid];
933
+ },
934
+ getKeys() {
935
+ return Object.keys(states).map(key => {
936
+ return Number.parseInt(key);
937
+ });
938
+ },
939
+ clear() {
940
+ for (const key of Object.keys(states)) {
941
+ delete states[key];
942
+ }
943
+ },
944
+ wrapCommand(fn) {
945
+ const wrapped = async (uid, ...args) => {
946
+ const {
947
+ newState
948
+ } = states[uid];
949
+ const newerState = await fn(newState, ...args);
950
+ if (newState === newerState) {
951
+ return;
952
+ }
953
+ const latest = states[uid];
954
+ states[uid] = {
955
+ oldState: latest.oldState,
956
+ newState: newerState
957
+ };
958
+ };
959
+ return wrapped;
960
+ },
961
+ wrapGetter(fn) {
962
+ const wrapped = (uid, ...args) => {
963
+ const {
964
+ newState
965
+ } = states[uid];
966
+ return fn(newState, ...args);
967
+ };
968
+ return wrapped;
969
+ },
970
+ diff(uid, modules, numbers) {
971
+ const {
972
+ oldState,
973
+ newState
974
+ } = states[uid];
975
+ const diffResult = [];
976
+ for (let i = 0; i < modules.length; i++) {
977
+ const fn = modules[i];
978
+ if (!fn(oldState, newState)) {
979
+ diffResult.push(numbers[i]);
980
+ }
981
+ }
982
+ return diffResult;
983
+ },
984
+ getCommandIds() {
985
+ const keys = Object.keys(commandMapRef);
986
+ const ids = keys.map(toCommandId);
987
+ return ids;
988
+ },
989
+ registerCommands(commandMap) {
990
+ Object.assign(commandMapRef, commandMap);
991
+ }
992
+ };
993
+ };
994
+ const terminate = () => {
995
+ globalThis.close();
996
+ };
906
997
 
907
998
  const RenderEntries = 1;
908
999
  const RenderFocusedIndex = 2;
@@ -937,24 +1028,10 @@ const diff = (oldState, newState) => {
937
1028
  return diffResult;
938
1029
  };
939
1030
 
940
- const create$2 = () => {
941
- const states = Object.create(null);
942
- return {
943
- get(uid) {
944
- return states[uid];
945
- },
946
- set(uid, oldState, newState) {
947
- states[uid] = {
948
- oldState,
949
- newState
950
- };
951
- }
952
- };
953
- };
954
-
955
1031
  const {
956
1032
  get: get$1,
957
- set: set$3
1033
+ set: set$3,
1034
+ wrapCommand
958
1035
  } = create$2();
959
1036
 
960
1037
  const diff2 = uid => {
@@ -971,7 +1048,19 @@ const getCommandIds = () => {
971
1048
  return commandsIds;
972
1049
  };
973
1050
 
1051
+ const Menu$1 = 'menu';
1052
+ const MenuBar = 'menubar';
1053
+ const MenuItem$1 = 'menuitem';
1054
+ const MenuItemCheckBox = 'menuitemcheckbox';
1055
+ const None$1 = 'none';
1056
+ const Separator$1 = 'separator';
1057
+
1058
+ const Button = 1;
1059
+ const Div = 4;
1060
+ const Span = 8;
974
1061
  const Text = 12;
1062
+ const I = 16;
1063
+ const Img = 17;
975
1064
 
976
1065
  const Escape$2 = 8;
977
1066
  const Space$2 = 9;
@@ -992,6 +1081,10 @@ const mergeClassNames = (...classNames) => {
992
1081
  return classNames.filter(Boolean).join(' ');
993
1082
  };
994
1083
 
1084
+ const px = value => {
1085
+ return `${value}px`;
1086
+ };
1087
+
995
1088
  const text = data => {
996
1089
  return {
997
1090
  type: Text,
@@ -1114,8 +1207,8 @@ const Terminal$1 = 14;
1114
1207
  const TitleBar = 15;
1115
1208
  const View$1 = 16;
1116
1209
 
1117
- const Separator$1 = 1;
1118
- const None$1 = 0;
1210
+ const Separator = 1;
1211
+ const None = 0;
1119
1212
  const SubMenu = 4;
1120
1213
  const Checked = 2;
1121
1214
  const Unchecked = 3;
@@ -1126,7 +1219,7 @@ const Ignore = 7;
1126
1219
  const menuEntrySeparator = {
1127
1220
  id: 'separator',
1128
1221
  label: '',
1129
- flags: Separator$1,
1222
+ flags: Separator,
1130
1223
  command: ''
1131
1224
  };
1132
1225
 
@@ -1145,27 +1238,27 @@ const getMenuEntries$d = () => {
1145
1238
  }, menuEntrySeparator, {
1146
1239
  id: 'cut',
1147
1240
  label: cut(),
1148
- flags: None$1,
1241
+ flags: None,
1149
1242
  command: /* Editor.cut */'Editor.cut'
1150
1243
  }, {
1151
1244
  id: 'copy',
1152
1245
  label: copy(),
1153
- flags: None$1,
1246
+ flags: None,
1154
1247
  command: /* Editor.copy */'Editor.copy'
1155
1248
  }, {
1156
1249
  id: 'paste',
1157
1250
  label: paste(),
1158
- flags: None$1,
1251
+ flags: None,
1159
1252
  command: /* Editor.paste */'Editor.paste'
1160
1253
  }, menuEntrySeparator, {
1161
1254
  id: 'toggle-line-comment',
1162
1255
  label: toggleLineComment(),
1163
- flags: None$1,
1256
+ flags: None,
1164
1257
  command: /* Editor.toggleLineComment */'Editor.toggleLineComment'
1165
1258
  }, {
1166
1259
  id: 'toggle-block-comment',
1167
1260
  label: toggleBlockComment(),
1168
- flags: None$1,
1261
+ flags: None,
1169
1262
  command: /* Editor.toggleBlockComment */'Editor.toggleBlockComment'
1170
1263
  }];
1171
1264
  };
@@ -1223,17 +1316,17 @@ const getMenuEntries$c = platform => {
1223
1316
  const entries = [{
1224
1317
  id: 'newFile',
1225
1318
  label: newFile(),
1226
- flags: None$1,
1319
+ flags: None,
1227
1320
  command: '-1'
1228
1321
  }, {
1229
1322
  id: 'newWindow',
1230
1323
  label: newWindow(),
1231
- flags: None$1,
1324
+ flags: None,
1232
1325
  command: /* Window.openNew */'Window.openNew'
1233
1326
  }, menuEntrySeparator, {
1234
1327
  id: 'openFile',
1235
1328
  label: openFile(),
1236
- flags: None$1,
1329
+ flags: None,
1237
1330
  command: 'Dialog.openFile'
1238
1331
  }, {
1239
1332
  id: 'openFolder',
@@ -1248,12 +1341,12 @@ const getMenuEntries$c = platform => {
1248
1341
  }, menuEntrySeparator, {
1249
1342
  id: 'save',
1250
1343
  label: save(),
1251
- flags: None$1,
1344
+ flags: None,
1252
1345
  command: 'Main.save'
1253
1346
  }, {
1254
1347
  id: 'saveAll',
1255
1348
  label: saveAll(),
1256
- flags: None$1,
1349
+ flags: None,
1257
1350
  command: 'Main.saveAll'
1258
1351
  }];
1259
1352
  if (platform === Electron) {
@@ -1330,7 +1423,7 @@ const getMenuEntries$a = async platform => {
1330
1423
  entries.push({
1331
1424
  id: 'toggleDeveloperTools',
1332
1425
  label: toggleDeveloperTools(),
1333
- flags: None$1,
1426
+ flags: None,
1334
1427
  command: 'Developer.toggleDeveloperTools'
1335
1428
  }, {
1336
1429
  id: 'openProcessExplorer',
@@ -1353,7 +1446,7 @@ const getMenuEntries$a = async platform => {
1353
1446
  entries.push({
1354
1447
  id: 'about',
1355
1448
  label: about(),
1356
- flags: None$1,
1449
+ flags: None,
1357
1450
  command: 'About.showAbout'
1358
1451
  });
1359
1452
  return entries;
@@ -1459,6 +1552,11 @@ const sendMessagePortToMarkdownWorker = async (port, rpcId) => {
1459
1552
  // @ts-ignore
1460
1553
  await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToMarkdownWorker', port, command, rpcId);
1461
1554
  };
1555
+ const sendMessagePortToIconThemeWorker = async (port, rpcId) => {
1556
+ const command = 'IconTheme.handleMessagePort';
1557
+ // @ts-ignore
1558
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToIconThemeWorker', port, command, rpcId);
1559
+ };
1462
1560
  const sendMessagePortToFileSystemWorker = async (port, rpcId) => {
1463
1561
  const command = 'FileSystem.handleMessagePort';
1464
1562
  // @ts-ignore
@@ -1658,6 +1756,13 @@ const getLogsDir = async () => {
1658
1756
  // @ts-ignore
1659
1757
  return invoke$1('PlatformPaths.getLogsDir');
1660
1758
  };
1759
+ const registerMockRpc = commandMap => {
1760
+ const mockRpc = createMockRpc({
1761
+ commandMap
1762
+ });
1763
+ set$1(mockRpc);
1764
+ return mockRpc;
1765
+ };
1661
1766
 
1662
1767
  const RendererWorker = {
1663
1768
  __proto__: null,
@@ -1707,6 +1812,7 @@ const RendererWorker = {
1707
1812
  openUrl,
1708
1813
  openWidget,
1709
1814
  readFile,
1815
+ registerMockRpc,
1710
1816
  registerWebViewInterceptor,
1711
1817
  renderMarkdown,
1712
1818
  rerenderEditor,
@@ -1717,6 +1823,7 @@ const RendererWorker = {
1717
1823
  sendMessagePortToErrorWorker,
1718
1824
  sendMessagePortToExtensionHostWorker,
1719
1825
  sendMessagePortToFileSystemWorker,
1826
+ sendMessagePortToIconThemeWorker,
1720
1827
  sendMessagePortToMarkdownWorker,
1721
1828
  sendMessagePortToRendererProcess,
1722
1829
  sendMessagePortToSearchProcess,
@@ -1776,7 +1883,7 @@ const toMenuItem = folder => {
1776
1883
  const label = getTitle(homeDir, folder);
1777
1884
  return {
1778
1885
  label,
1779
- flags: None$1,
1886
+ flags: None,
1780
1887
  command: 'Workspace.setPath',
1781
1888
  args: [folder]
1782
1889
  };
@@ -1792,12 +1899,12 @@ const getMenuEntries$9 = async () => {
1792
1899
  items.push({
1793
1900
  id: 'more',
1794
1901
  label: moreDot(),
1795
- flags: None$1,
1902
+ flags: None,
1796
1903
  command: 'QuickPick.showRecent'
1797
1904
  }, menuEntrySeparator, {
1798
1905
  id: 'clearRecentlyOpened',
1799
1906
  label: clearRecentlyOpened(),
1800
- flags: None$1,
1907
+ flags: None,
1801
1908
  command: 'RecentlyOpened.clearRecentlyOpened'
1802
1909
  });
1803
1910
  return items;
@@ -1825,17 +1932,17 @@ const getMenuEntries$7 = () => {
1825
1932
  return [{
1826
1933
  id: 'selectAll',
1827
1934
  label: selectAll(),
1828
- flags: None$1,
1935
+ flags: None,
1829
1936
  command: 'Editor.selectAll'
1830
1937
  }, {
1831
1938
  id: 'copyLineUp',
1832
1939
  label: copyLineUp(),
1833
- flags: None$1,
1940
+ flags: None,
1834
1941
  command: 'Editor.copyLineUp'
1835
1942
  }, {
1836
1943
  id: 'copyLineDown',
1837
1944
  label: copyLineDown(),
1838
- flags: None$1,
1945
+ flags: None,
1839
1946
  command: 'Editor.copyLineDown'
1840
1947
  }, {
1841
1948
  id: 'moveLineUp',
@@ -1871,7 +1978,7 @@ const getMenuEntries$6 = () => {
1871
1978
  return [{
1872
1979
  id: 'newTerminal',
1873
1980
  label: newTerminal(),
1874
- flags: None$1,
1981
+ flags: None,
1875
1982
  command: 'Layout.togglePanel',
1876
1983
  args: ['Terminal']
1877
1984
  }];
@@ -1960,27 +2067,27 @@ const getMenuEntries$4 = () => {
1960
2067
  return [{
1961
2068
  id: File$2,
1962
2069
  label: file(),
1963
- flags: None$1
2070
+ flags: None
1964
2071
  }, {
1965
2072
  id: Edit$1,
1966
2073
  label: edit(),
1967
- flags: None$1
2074
+ flags: None
1968
2075
  }, {
1969
2076
  id: Selection$1,
1970
2077
  label: selection(),
1971
- flags: None$1
2078
+ flags: None
1972
2079
  }, {
1973
2080
  id: View$1,
1974
2081
  label: view(),
1975
- flags: None$1
2082
+ flags: None
1976
2083
  }, {
1977
2084
  id: Go$1,
1978
2085
  label: go(),
1979
- flags: None$1
2086
+ flags: None
1980
2087
  }, {
1981
2088
  id: Help$1,
1982
2089
  label: help(),
1983
- flags: None$1
2090
+ flags: None
1984
2091
  }];
1985
2092
  };
1986
2093
 
@@ -2073,8 +2180,8 @@ const getTitleBarButtons = (platform, controlsOverlayEnabled, titleBarStyleCusto
2073
2180
  };
2074
2181
 
2075
2182
  const MaskIconCheck = 'MaskIconCheck';
2076
- const Menu$1 = 'Menu';
2077
- const MenuItem$1 = 'MenuItem';
2183
+ const Menu = 'Menu';
2184
+ const MenuItem = 'MenuItem';
2078
2185
  const MenuItemCheckMark = 'MenuItemCheckMark';
2079
2186
  const MenuItemCheckmarkIcon = 'MenuItemCheckmarkIcon';
2080
2187
  const MenuItemFocused = 'MenuItemFocused';
@@ -2092,24 +2199,11 @@ const TitleBarTopLevelEntry = 'TitleBarTopLevelEntry';
2092
2199
  const TitleBarTopLevelEntryLabel = 'TitleBarTopLevelEntryLabel';
2093
2200
  const Viewlet = 'Viewlet';
2094
2201
 
2095
- const Menu = 'menu';
2096
- const MenuBar = 'menubar';
2097
- const MenuItem = 'menuitem';
2098
- const MenuItemCheckBox = 'menuitemcheckbox';
2099
- const None = 'none';
2100
- const Separator = 'separator';
2101
-
2102
- const Button = 1;
2103
- const Div = 4;
2104
- const I = 16;
2105
- const Img = 17;
2106
- const Span = 8;
2107
-
2108
2202
  const getIconVirtualDom = (icon, type = Div) => {
2109
2203
  return {
2110
2204
  type,
2111
2205
  className: `MaskIcon MaskIcon${icon}`,
2112
- role: None,
2206
+ role: None$1,
2113
2207
  childCount: 0
2114
2208
  };
2115
2209
  };
@@ -2140,12 +2234,13 @@ const getTitleBarButtonsVirtualDom = buttons => {
2140
2234
  return dom;
2141
2235
  };
2142
2236
 
2237
+ const parentNode = {
2238
+ type: Div,
2239
+ className: mergeClassNames(Viewlet, TitleBarIcon),
2240
+ childCount: 1
2241
+ };
2143
2242
  const getTitleBarIconVirtualDom = iconSrc => {
2144
- return [{
2145
- type: Div,
2146
- className: mergeClassNames(Viewlet, TitleBarIcon),
2147
- childCount: 1
2148
- }, {
2243
+ return [parentNode, {
2149
2244
  type: Img,
2150
2245
  className: TitleBarIconIcon,
2151
2246
  src: iconSrc,
@@ -2154,16 +2249,16 @@ const getTitleBarIconVirtualDom = iconSrc => {
2154
2249
  }];
2155
2250
  };
2156
2251
 
2157
- const HandleClick = 'handleClick';
2158
- const HandleClickMinimize = 'handleClickMinimize';
2159
- const HandleClickToggleClose = 'handleClickToggleClose';
2160
- const HandleClickToggleMaximize = 'handleClickToggleMaximize';
2161
- const HandleFocusIn = 'handleFocusIn';
2162
- const HandleFocusOut = 'handleFocusOut';
2163
- const HandlePointerOut = 'handlePointerOut';
2164
- const HandlePointerOver = 'handlePointerOver';
2165
- const HandleMenuClick = 'handleMenuClick';
2166
- const HandleMenuMouseOver = 'handleMenuMouseOver';
2252
+ const HandleClick = 1;
2253
+ const HandleClickMinimize = 2;
2254
+ const HandleClickToggleClose = 3;
2255
+ const HandleClickToggleMaximize = 4;
2256
+ const HandleFocusIn = 5;
2257
+ const HandleFocusOut = 6;
2258
+ const HandlePointerOut = 7;
2259
+ const HandlePointerOver = 8;
2260
+ const HandleMenuClick = 9;
2261
+ const HandleMenuMouseOver = 10;
2167
2262
 
2168
2263
  const getItemVirtualDom = item => {
2169
2264
  // @ts-ignore
@@ -2173,13 +2268,14 @@ const getItemVirtualDom = item => {
2173
2268
  isOpen,
2174
2269
  isFocused
2175
2270
  } = item;
2271
+ // TODO avoid mutation
2176
2272
  const dom = [];
2177
2273
  dom.push({
2178
2274
  type: Div,
2179
2275
  className: TitleBarTopLevelEntry,
2180
2276
  ariaHasPopup: true,
2181
2277
  ariaExpanded: isOpen,
2182
- role: MenuItem,
2278
+ role: MenuItem$1,
2183
2279
  childCount: 1,
2184
2280
  ariaKeyShortcuts: keyboardShortCut
2185
2281
  });
@@ -2252,7 +2348,8 @@ const handleClickToggleMaximize = async state => {
2252
2348
  return state;
2253
2349
  };
2254
2350
 
2255
- const handleClick$1 = (state, className) => {
2351
+ // TODO use button name property
2352
+ const handleClick$1 = async (state, className) => {
2256
2353
  if (className.includes('Minimize')) {
2257
2354
  return handleClickMinimize(state);
2258
2355
  }
@@ -2298,7 +2395,7 @@ const getMenuHeight = items => {
2298
2395
  let height = CONTEXT_MENU_PADDING;
2299
2396
  for (const item of items) {
2300
2397
  switch (item.flags) {
2301
- case Separator$1:
2398
+ case Separator:
2302
2399
  height += CONTEXT_MENU_SEPARATOR_HEIGHT;
2303
2400
  break;
2304
2401
  default:
@@ -2354,7 +2451,7 @@ const getIndexToFocusPrevious = menu => {
2354
2451
  };
2355
2452
  const canBeFocused = item => {
2356
2453
  switch (item.flags) {
2357
- case Separator$1:
2454
+ case Separator:
2358
2455
  case Disabled:
2359
2456
  return false;
2360
2457
  default:
@@ -2487,7 +2584,7 @@ const handlePointerOut = (state, clientX, clientY) => {
2487
2584
  if (index === -1) {
2488
2585
  return state;
2489
2586
  }
2490
- return handleMouseOut(state, index);
2587
+ return handleMouseOut(state);
2491
2588
  };
2492
2589
 
2493
2590
  const handleMouseOverMenuClosed = (state, index) => {
@@ -2511,74 +2608,46 @@ const handlePointerOver = (state, clientX, clientY) => {
2511
2608
  return handleMouseOver(state, index);
2512
2609
  };
2513
2610
 
2514
- const getFontString = (fontWeight, fontSize, fontFamily) => {
2515
- return `${fontWeight} ${fontSize}px ${fontFamily}`;
2516
- };
2517
-
2518
- const createTextMeasureContext = () => {
2611
+ const createTextMeasureContext = (letterSpacing, font) => {
2519
2612
  const canvas = new OffscreenCanvas(0, 0);
2520
2613
  const ctx = canvas.getContext('2d');
2521
2614
  if (!ctx) {
2522
2615
  throw new Error('Failed to get canvas context 2d');
2523
2616
  }
2617
+ ctx.letterSpacing = letterSpacing;
2618
+ ctx.font = font;
2524
2619
  return ctx;
2525
2620
  };
2526
2621
 
2527
- const state = {
2528
- ctx: undefined
2529
- };
2530
- const getOrCreate = createCtx => {
2531
- if (state.ctx) {
2532
- return state.ctx;
2533
- }
2534
- state.ctx = createCtx();
2535
- return state.ctx;
2536
- };
2537
-
2538
- const getContext = () => {
2539
- const ctx = getOrCreate(createTextMeasureContext);
2540
- return ctx;
2541
- };
2542
-
2543
- const px = value => {
2544
- return `${value}px`;
2622
+ const getFontString = (fontWeight, fontSize, fontFamily) => {
2623
+ return `${fontWeight} ${fontSize}px ${fontFamily}`;
2545
2624
  };
2546
2625
 
2547
- const getLetterSpacingString = letterSpacing => {
2548
- return px(letterSpacing);
2549
- };
2550
- const measureTextWidth = (text, fontWeight, fontSize, fontFamily, letterSpacing, isMonoSpaceFont, charWidth) => {
2551
- string(text);
2552
- number(fontWeight);
2553
- number(fontSize);
2554
- string(fontFamily);
2555
- boolean(isMonoSpaceFont);
2556
- number(charWidth);
2626
+ const measureTextWidths = (texts, fontWeight, fontSize, fontFamily, letterSpacing) => {
2557
2627
  if (typeof letterSpacing !== 'number') {
2558
2628
  throw new TypeError('letterSpacing must be of type number');
2559
2629
  }
2560
- const letterSpacingString = getLetterSpacingString(letterSpacing);
2630
+ const letterSpacingString = px(letterSpacing);
2561
2631
  const fontString = getFontString(fontWeight, fontSize, fontFamily);
2562
- const ctx = getContext();
2563
- ctx.letterSpacing = letterSpacingString;
2564
- ctx.font = fontString;
2565
- const metrics = ctx.measureText(text);
2566
- const {
2567
- width
2568
- } = metrics;
2569
- return width;
2570
- };
2571
-
2572
- const measureTitleBarEntryWidth = (label, fontWeight, fontSize, fontFamily, letterSpacing) => {
2573
- const isMonospaceFont = false;
2574
- const charWidth = 0;
2575
- return measureTextWidth(label, fontWeight, fontSize, fontFamily, letterSpacing, isMonospaceFont, charWidth);
2632
+ const ctx = createTextMeasureContext(letterSpacingString, fontString);
2633
+ const widths = [];
2634
+ for (const text of texts) {
2635
+ const metrics = ctx.measureText(text);
2636
+ const {
2637
+ width
2638
+ } = metrics;
2639
+ widths.push(width);
2640
+ }
2641
+ return widths;
2576
2642
  };
2577
2643
 
2578
2644
  const addWidths = (entries, labelPadding, fontWeight, fontSize, fontFamily, letterSpacing) => {
2645
+ const labels = entries.map(entry => entry.label);
2646
+ const widths = measureTextWidths(labels, fontWeight, fontSize, fontFamily, letterSpacing);
2579
2647
  const withWidths = [];
2580
- for (const entry of entries) {
2581
- const textWidth = measureTitleBarEntryWidth(entry.label, fontWeight, fontSize, fontFamily, letterSpacing);
2648
+ for (let i = 0; i < entries.length; i++) {
2649
+ const entry = entries[i];
2650
+ const textWidth = widths[i];
2582
2651
  const width = textWidth + labelPadding * 2;
2583
2652
  withWidths.push({
2584
2653
  ...entry,
@@ -2658,7 +2727,7 @@ const renderFocusedIndex = (oldState, newState) => {
2658
2727
 
2659
2728
  const checkboxChecked = {
2660
2729
  type: Div,
2661
- className: mergeClassNames(MenuItem$1, MenuItemCheckMark),
2730
+ className: mergeClassNames(MenuItem, MenuItemCheckMark),
2662
2731
  role: MenuItemCheckBox,
2663
2732
  ariaChecked: true,
2664
2733
  tabIndex: -1,
@@ -2966,21 +3035,25 @@ const parseKey = rawKey => {
2966
3035
  };
2967
3036
  };
2968
3037
 
3038
+ const classNameFocused = mergeClassNames(MenuItem, MenuItemFocused);
3039
+ const getMenuItemClassName = isFocused => {
3040
+ if (isFocused) {
3041
+ return classNameFocused;
3042
+ }
3043
+ return MenuItem;
3044
+ };
2969
3045
  const getMenuItemDefaultDom = menuItem => {
2970
3046
  const {
2971
3047
  label,
2972
3048
  isFocused,
2973
3049
  key
2974
3050
  } = menuItem;
2975
- let className = MenuItem$1;
2976
- if (isFocused) {
2977
- className += ' ' + MenuItemFocused;
2978
- }
3051
+ const className = getMenuItemClassName(isFocused);
2979
3052
  const dom = [];
2980
3053
  dom.push({
2981
3054
  type: Div,
2982
3055
  className,
2983
- role: MenuItem,
3056
+ role: MenuItem$1,
2984
3057
  tabIndex: -1,
2985
3058
  childCount: 1
2986
3059
  }, text(label));
@@ -2999,8 +3072,8 @@ const getMenuItemDefaultDom = menuItem => {
2999
3072
 
3000
3073
  const disabled = {
3001
3074
  type: Div,
3002
- className: MenuItem$1,
3003
- role: MenuItem,
3075
+ className: MenuItem,
3076
+ role: MenuItem$1,
3004
3077
  tabIndex: -1,
3005
3078
  disabled: true,
3006
3079
  childCount: 1
@@ -3019,7 +3092,7 @@ const getMenuItemsNoopDom = () => {
3019
3092
  const separator = {
3020
3093
  type: Div,
3021
3094
  className: MenuItemSeparator,
3022
- role: Separator,
3095
+ role: Separator$1,
3023
3096
  childCount: 1
3024
3097
  };
3025
3098
  const separatorLine = {
@@ -3043,7 +3116,7 @@ const getMenuItemSubMenuDom = menuItem => {
3043
3116
  isExpanded,
3044
3117
  level
3045
3118
  } = menuItem;
3046
- let className = MenuItem$1;
3119
+ let className = MenuItem;
3047
3120
  className += ' ' + MenuItemSubMenu;
3048
3121
  if (isFocused) {
3049
3122
  className += ' ' + MenuItemFocused;
@@ -3051,7 +3124,7 @@ const getMenuItemSubMenuDom = menuItem => {
3051
3124
  return [{
3052
3125
  type: Div,
3053
3126
  className,
3054
- role: MenuItem,
3127
+ role: MenuItem$1,
3055
3128
  tabIndex: -1,
3056
3129
  ariaHasPopup: true,
3057
3130
  ariaExpanded: isExpanded,
@@ -3062,7 +3135,7 @@ const getMenuItemSubMenuDom = menuItem => {
3062
3135
 
3063
3136
  const checkboxUnchecked = {
3064
3137
  type: Div,
3065
- className: MenuItem$1,
3138
+ className: MenuItem,
3066
3139
  role: MenuItemCheckBox,
3067
3140
  ariaChecked: false,
3068
3141
  tabIndex: -1,
@@ -3077,11 +3150,11 @@ const getMenuItemUncheckedDom = menuItem => {
3077
3150
 
3078
3151
  const getMenuItemRenderer = flags => {
3079
3152
  switch (flags) {
3080
- case None$1:
3153
+ case None:
3081
3154
  case RestoreFocus:
3082
3155
  case Ignore:
3083
3156
  return getMenuItemDefaultDom;
3084
- case Separator$1:
3157
+ case Separator:
3085
3158
  return getMenuItemSeparatorDom;
3086
3159
  case Checked:
3087
3160
  return getMenuItemCheckedDom;
@@ -3107,8 +3180,8 @@ const getMenuItemVirtualDom = menuItem => {
3107
3180
  const getMenuVirtualDom = menuItems => {
3108
3181
  const dom = [{
3109
3182
  type: Div,
3110
- className: Menu$1,
3111
- role: Menu,
3183
+ className: Menu,
3184
+ role: Menu$1,
3112
3185
  tabIndex: -1,
3113
3186
  childCount: menuItems.length
3114
3187
  }, ...menuItems.flatMap(getMenuItemVirtualDom)];
@@ -3240,10 +3313,6 @@ const saveState = uid => {
3240
3313
  };
3241
3314
  };
3242
3315
 
3243
- const terminate = () => {
3244
- globalThis.close();
3245
- };
3246
-
3247
3316
  const create = (id, uri, x, y, width, height) => {
3248
3317
  const state = {
3249
3318
  uid: id,
@@ -3260,7 +3329,8 @@ const create = (id, uri, x, y, width, height) => {
3260
3329
  x,
3261
3330
  y,
3262
3331
  width,
3263
- height
3332
+ height,
3333
+ iconWidth: 30
3264
3334
  };
3265
3335
  set$3(id, state, state);
3266
3336
  return state;
@@ -3377,10 +3447,7 @@ const handleFocusOut = async state => {
3377
3447
  return state;
3378
3448
  };
3379
3449
 
3380
- /**
3381
- * @param {boolean} focus
3382
- */
3383
- const openMenu = (state, focus) => {
3450
+ const openMenu = async (state, focus) => {
3384
3451
  const {
3385
3452
  focusedIndex
3386
3453
  } = state;
@@ -3433,7 +3500,7 @@ const closeOneMenu = state => {
3433
3500
  };
3434
3501
  };
3435
3502
 
3436
- const handleKeyArrowLeftMenuOpen = state => {
3503
+ const handleKeyArrowLeftMenuOpen = async state => {
3437
3504
  const {
3438
3505
  menus
3439
3506
  } = state;
@@ -3650,7 +3717,7 @@ const handleMenuClick = async (state, level, index) => {
3650
3717
  return state;
3651
3718
  }
3652
3719
  switch (item.flags) {
3653
- case None$1:
3720
+ case None:
3654
3721
  return selectIndexNone(state, item);
3655
3722
  case SubMenu:
3656
3723
  return selectIndexSubMenu(state, menu, index);
@@ -3738,7 +3805,7 @@ const handleMenuMouseOver = async (state, level, index) => {
3738
3805
  };
3739
3806
  };
3740
3807
 
3741
- const toggleMenu = state => {
3808
+ const toggleMenu = async state => {
3742
3809
  const {
3743
3810
  isMenuOpen
3744
3811
  } = state;
@@ -3748,21 +3815,6 @@ const toggleMenu = state => {
3748
3815
  return openMenu(state, /* focus */false);
3749
3816
  };
3750
3817
 
3751
- const wrapCommand = fn => {
3752
- const wrapped = async (uid, ...args) => {
3753
- const {
3754
- newState
3755
- } = get$1(uid);
3756
- const newerState = await fn(newState, ...args);
3757
- if (newState === newerState) {
3758
- return;
3759
- }
3760
- const latest = get$1(uid);
3761
- set$3(uid, latest.oldState, newerState);
3762
- };
3763
- return wrapped;
3764
- };
3765
-
3766
3818
  const commandMap = {
3767
3819
  'TitleBar.getButtonsVirtualDom': getTitleBarButtonsVirtualDom,
3768
3820
  'TitleBar.getIconVirtualDom': getTitleBarIconVirtualDom,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/title-bar-worker",
3
- "version": "2.4.0",
3
+ "version": "2.6.0",
4
4
  "description": "Title Bar Worker",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,5 +9,8 @@
9
9
  "license": "MIT",
10
10
  "author": "Lvce Editor",
11
11
  "type": "module",
12
- "main": "dist/titleBarWorkerMain.js"
12
+ "main": "dist/titleBarWorkerMain.js",
13
+ "dependencies": {
14
+ "@lvce-editor/viewlet-registry": "^1.4.0"
15
+ }
13
16
  }