typo3-typescript-sources 13.4.20

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 (415) hide show
  1. package/.github/workflows/sync-and-publish.yml +265 -0
  2. package/.last-synced-tag +1 -0
  3. package/LICENSE.txt +339 -0
  4. package/README-TYPO3.md +166 -0
  5. package/README.md +28 -0
  6. package/adminpanel/admin-panel.ts +375 -0
  7. package/adminpanel/modules/cache.ts +27 -0
  8. package/adminpanel/modules/preview.ts +75 -0
  9. package/backend/action-button/abstract-action.ts +22 -0
  10. package/backend/action-button/deferred-action.ts +41 -0
  11. package/backend/action-button/immediate-action.ts +31 -0
  12. package/backend/action-dispatcher.ts +104 -0
  13. package/backend/ajax-data-handler/message-interface.ts +18 -0
  14. package/backend/ajax-data-handler/response-interface.ts +20 -0
  15. package/backend/ajax-data-handler.ts +214 -0
  16. package/backend/backend-exception.ts +22 -0
  17. package/backend/broadcast-message.ts +50 -0
  18. package/backend/broadcast-service.ts +52 -0
  19. package/backend/browse-database.ts +38 -0
  20. package/backend/clear-cache.ts +88 -0
  21. package/backend/clipboard-panel.ts +240 -0
  22. package/backend/close-current-window.ts +2 -0
  23. package/backend/code-editor/autocomplete/completion-result.ts +105 -0
  24. package/backend/code-editor/autocomplete/ts-code-completion.ts +142 -0
  25. package/backend/code-editor/autocomplete/ts-parser.ts +485 -0
  26. package/backend/code-editor/autocomplete/ts-ref.ts +164 -0
  27. package/backend/code-editor/element/code-mirror-element.ts +282 -0
  28. package/backend/code-editor/language/typoscript.ts +181 -0
  29. package/backend/code-editor/stream-parser/typoscript.ts +1600 -0
  30. package/backend/color-picker.ts +158 -0
  31. package/backend/color-scheme-switch.ts +179 -0
  32. package/backend/column-selector-button.ts +302 -0
  33. package/backend/context-help.ts +68 -0
  34. package/backend/context-menu-actions.ts +322 -0
  35. package/backend/context-menu.ts +751 -0
  36. package/backend/copy-to-clipboard.ts +79 -0
  37. package/backend/date-time-picker.ts +270 -0
  38. package/backend/document-save-actions.ts +159 -0
  39. package/backend/drag-tooltip.ts +285 -0
  40. package/backend/drag-uploader.ts +914 -0
  41. package/backend/element/alert-element.ts +116 -0
  42. package/backend/element/dispatch-modal-button.ts +50 -0
  43. package/backend/element/draggable-resizable-element.ts +249 -0
  44. package/backend/element/editable-page-title.ts +306 -0
  45. package/backend/element/icon-element.ts +84 -0
  46. package/backend/element/immediate-action-element.ts +89 -0
  47. package/backend/element/pagination.ts +59 -0
  48. package/backend/element/progress-bar-element.ts +172 -0
  49. package/backend/element/progress-tracker-element.ts +119 -0
  50. package/backend/element/pseudo-button.ts +58 -0
  51. package/backend/element/spinner-element.ts +51 -0
  52. package/backend/element/thumbnail-element.ts +80 -0
  53. package/backend/element-browser.ts +182 -0
  54. package/backend/enum/data-transfer-types.ts +21 -0
  55. package/backend/enum/icon-types.ts +31 -0
  56. package/backend/enum/key-types.ts +27 -0
  57. package/backend/enum/severity.ts +20 -0
  58. package/backend/enum/viewport/scaffold-identifier.ts +24 -0
  59. package/backend/event/client-request.ts +25 -0
  60. package/backend/event/consumable.ts +18 -0
  61. package/backend/event/consumer-scope.ts +54 -0
  62. package/backend/event/event-dispatcher.ts +26 -0
  63. package/backend/event/interaction-request-assignment.ts +24 -0
  64. package/backend/event/interaction-request-map.ts +75 -0
  65. package/backend/event/interaction-request.ts +48 -0
  66. package/backend/event/trigger-request.ts +56 -0
  67. package/backend/form/submit-interceptor.ts +66 -0
  68. package/backend/form-engine/container/files-control-container.ts +716 -0
  69. package/backend/form-engine/container/flex-form-container-container.ts +166 -0
  70. package/backend/form-engine/container/flex-form-section-container.ts +210 -0
  71. package/backend/form-engine/container/inline-control-container.ts +1230 -0
  72. package/backend/form-engine/container/site-language-container.ts +616 -0
  73. package/backend/form-engine/element/abstract-sortable-select-items.ts +186 -0
  74. package/backend/form-engine/element/category-element.ts +160 -0
  75. package/backend/form-engine/element/color-element.ts +81 -0
  76. package/backend/form-engine/element/datetime-element.ts +66 -0
  77. package/backend/form-engine/element/extra/char-counter.ts +112 -0
  78. package/backend/form-engine/element/extra/select-box-filter.ts +85 -0
  79. package/backend/form-engine/element/folder-element.ts +66 -0
  80. package/backend/form-engine/element/group-element.ts +47 -0
  81. package/backend/form-engine/element/json-element.ts +52 -0
  82. package/backend/form-engine/element/link-element.ts +121 -0
  83. package/backend/form-engine/element/mfa-info-element.ts +169 -0
  84. package/backend/form-engine/element/modifier/resizable.ts +27 -0
  85. package/backend/form-engine/element/modifier/tabbable.ts +29 -0
  86. package/backend/form-engine/element/online-media-form-element.ts +65 -0
  87. package/backend/form-engine/element/password-element.ts +71 -0
  88. package/backend/form-engine/element/select-multiple-side-by-side-element.ts +83 -0
  89. package/backend/form-engine/element/select-single-element.ts +82 -0
  90. package/backend/form-engine/element/select-tree-element.ts +148 -0
  91. package/backend/form-engine/element/select-tree-toolbar.ts +118 -0
  92. package/backend/form-engine/element/select-tree.ts +210 -0
  93. package/backend/form-engine/element/slug-element.ts +243 -0
  94. package/backend/form-engine/element/suggest/result-container.ts +118 -0
  95. package/backend/form-engine/element/suggest/result-item.ts +90 -0
  96. package/backend/form-engine/element/table-permission-element.ts +101 -0
  97. package/backend/form-engine/element/table-wizard-element.ts +427 -0
  98. package/backend/form-engine/element/text-element.ts +52 -0
  99. package/backend/form-engine/element/text-table-element.ts +31 -0
  100. package/backend/form-engine/field-control/add-record.ts +40 -0
  101. package/backend/form-engine/field-control/edit-popup.ts +64 -0
  102. package/backend/form-engine/field-control/insert-clipboard.ts +50 -0
  103. package/backend/form-engine/field-control/link-popup.ts +53 -0
  104. package/backend/form-engine/field-control/list-module.ts +40 -0
  105. package/backend/form-engine/field-control/password-generator.ts +102 -0
  106. package/backend/form-engine/field-control/reset-selection.ts +48 -0
  107. package/backend/form-engine/field-wizard/localization-state-selector.ts +67 -0
  108. package/backend/form-engine/field-wizard/value-picker.ts +123 -0
  109. package/backend/form-engine/field-wizard/value-slider.ts +86 -0
  110. package/backend/form-engine/inline-relation/ajax-dispatcher.ts +124 -0
  111. package/backend/form-engine/inline-relation/inline-response-interface.ts +41 -0
  112. package/backend/form-engine-link-browser-adapter.ts +129 -0
  113. package/backend/form-engine-review.ts +155 -0
  114. package/backend/form-engine-suggest.ts +133 -0
  115. package/backend/form-engine-validation.ts +686 -0
  116. package/backend/form-engine.ts +1391 -0
  117. package/backend/global-event-handler.ts +252 -0
  118. package/backend/grid-editor.ts +1077 -0
  119. package/backend/hashing/md5.ts +252 -0
  120. package/backend/helper.ts +24 -0
  121. package/backend/hotkeys/hotkey-storage.ts +63 -0
  122. package/backend/hotkeys.ts +216 -0
  123. package/backend/icons.ts +236 -0
  124. package/backend/image-manipulation.ts +885 -0
  125. package/backend/info-window.ts +46 -0
  126. package/backend/input/clearable.ts +128 -0
  127. package/backend/input/index.d.ts +8 -0
  128. package/backend/java-script-module-import-event-handler.ts +19 -0
  129. package/backend/key-bindings.ts +42 -0
  130. package/backend/layout-module/drag-drop.ts +359 -0
  131. package/backend/layout-module/paste.ts +165 -0
  132. package/backend/link-browser.ts +89 -0
  133. package/backend/live-search/element/backend-search.ts +34 -0
  134. package/backend/live-search/element/hint.ts +33 -0
  135. package/backend/live-search/element/provider/default-result-item.ts +52 -0
  136. package/backend/live-search/element/provider/page-provider-result-item.ts +52 -0
  137. package/backend/live-search/element/result/item/action/action-container.ts +135 -0
  138. package/backend/live-search/element/result/item/action/action.ts +56 -0
  139. package/backend/live-search/element/result/item/item-container.ts +224 -0
  140. package/backend/live-search/element/result/item/item.ts +74 -0
  141. package/backend/live-search/element/result/result-container.ts +110 -0
  142. package/backend/live-search/element/result/result-detail-container.ts +50 -0
  143. package/backend/live-search/element/result/result-pagination.ts +122 -0
  144. package/backend/live-search/element/search-option-item.ts +70 -0
  145. package/backend/live-search/live-search-configurator.ts +54 -0
  146. package/backend/live-search/live-search-shortcut.ts +29 -0
  147. package/backend/live-search/result-types/backend-module-result-type.ts +8 -0
  148. package/backend/live-search/result-types/default-result-type.ts +21 -0
  149. package/backend/live-search/result-types/page-result-type.ts +23 -0
  150. package/backend/localization.ts +390 -0
  151. package/backend/login-refresh.ts +525 -0
  152. package/backend/login.ts +179 -0
  153. package/backend/mail-link-handler.ts +45 -0
  154. package/backend/modal-interface.ts +19 -0
  155. package/backend/modal.ts +685 -0
  156. package/backend/module/iframe.ts +125 -0
  157. package/backend/module/router.ts +275 -0
  158. package/backend/module-menu.ts +550 -0
  159. package/backend/module.ts +133 -0
  160. package/backend/multi-record-selection-action.ts +44 -0
  161. package/backend/multi-record-selection-delete-action.ts +108 -0
  162. package/backend/multi-record-selection-edit-action.ts +56 -0
  163. package/backend/multi-record-selection.ts +468 -0
  164. package/backend/multi-step-wizard.ts +568 -0
  165. package/backend/new-content-element-wizard-button.ts +51 -0
  166. package/backend/new-multiple-pages.ts +108 -0
  167. package/backend/new-record-wizard.ts +680 -0
  168. package/backend/notification.ts +366 -0
  169. package/backend/offset.ts +40 -0
  170. package/backend/online-media.ts +110 -0
  171. package/backend/page-actions.ts +91 -0
  172. package/backend/page-link-handler.ts +51 -0
  173. package/backend/pagetsconfig/pagetsconfig-includes.ts +77 -0
  174. package/backend/popover.ts +165 -0
  175. package/backend/record-download-button.ts +104 -0
  176. package/backend/record-link-handler.ts +31 -0
  177. package/backend/record-search.ts +44 -0
  178. package/backend/recordlist.ts +230 -0
  179. package/backend/resource/resource.ts +35 -0
  180. package/backend/security/element/csp-reports.ts +406 -0
  181. package/backend/security/element/sudo-mode.ts +249 -0
  182. package/backend/security/sudo-mode-interceptor.ts +19 -0
  183. package/backend/settings/editor/editable-setting.ts +231 -0
  184. package/backend/settings/editor.ts +451 -0
  185. package/backend/settings/enum/settings-mode.enum.ts +24 -0
  186. package/backend/settings/type/base.ts +200 -0
  187. package/backend/settings/type/bool.ts +56 -0
  188. package/backend/settings/type/color.ts +64 -0
  189. package/backend/settings/type/int.ts +85 -0
  190. package/backend/settings/type/number.ts +61 -0
  191. package/backend/settings/type/page.ts +100 -0
  192. package/backend/settings/type/string.ts +77 -0
  193. package/backend/settings/type/stringlist.ts +87 -0
  194. package/backend/severity.ts +88 -0
  195. package/backend/site-inline-actions.ts +32 -0
  196. package/backend/sortable-table.ts +208 -0
  197. package/backend/storage/abstract-client-storage.ts +76 -0
  198. package/backend/storage/browser-session.ts +28 -0
  199. package/backend/storage/client.ts +28 -0
  200. package/backend/storage/module-state-storage.ts +118 -0
  201. package/backend/storage/persistent.ts +204 -0
  202. package/backend/switch-user.ts +82 -0
  203. package/backend/tabs.ts +72 -0
  204. package/backend/telephone-link-handler.ts +40 -0
  205. package/backend/tests/backend/storage/browser-storage-test.ts +87 -0
  206. package/backend/tests/backend/storage/client-test.ts +87 -0
  207. package/backend/tests/backend/utility/dom-helper-test.ts +51 -0
  208. package/backend/tests/backend-exception-test.ts +28 -0
  209. package/backend/tests/element/immediate-action-element-test.ts +81 -0
  210. package/backend/tests/form-engine-validation-test.ts +304 -0
  211. package/backend/tests/grid-editor-test.ts +29 -0
  212. package/backend/tests/hashing/md5Test.ts +28 -0
  213. package/backend/tests/icons-test.ts +23 -0
  214. package/backend/tests/notification-test.ts +161 -0
  215. package/backend/tests/popover-test.ts +83 -0
  216. package/backend/toolbar/clear-cache-menu.ts +88 -0
  217. package/backend/toolbar/live-search.ts +284 -0
  218. package/backend/toolbar/shortcut-menu.ts +254 -0
  219. package/backend/toolbar/system-information-menu.ts +161 -0
  220. package/backend/toolbar.ts +41 -0
  221. package/backend/tree/file-storage-browser.ts +194 -0
  222. package/backend/tree/file-storage-tree-container.ts +465 -0
  223. package/backend/tree/file-storage-tree.ts +42 -0
  224. package/backend/tree/page-browser.ts +272 -0
  225. package/backend/tree/page-tree-element.ts +602 -0
  226. package/backend/tree/page-tree.ts +152 -0
  227. package/backend/tree/tree-module-state.ts +159 -0
  228. package/backend/tree/tree-node-toggle.ts +31 -0
  229. package/backend/tree/tree-node.ts +97 -0
  230. package/backend/tree/tree-toolbar.ts +117 -0
  231. package/backend/tree/tree.ts +1595 -0
  232. package/backend/url-link-handler.ts +36 -0
  233. package/backend/user-pass-login.ts +255 -0
  234. package/backend/user-settings-manager.ts +189 -0
  235. package/backend/utility/collapse-state-persister.ts +205 -0
  236. package/backend/utility/collapse-state-search.ts +183 -0
  237. package/backend/utility/dom-helper.ts +91 -0
  238. package/backend/utility/drag-drop-utility.ts +47 -0
  239. package/backend/utility/message-utility.ts +45 -0
  240. package/backend/utility/top-level-module-import.ts +32 -0
  241. package/backend/utility.ts +194 -0
  242. package/backend/viewport/abstract-container.ts +22 -0
  243. package/backend/viewport/content-container.ts +98 -0
  244. package/backend/viewport/loader.ts +28 -0
  245. package/backend/viewport/navigation-container.ts +119 -0
  246. package/backend/viewport/resizable-navigation.ts +176 -0
  247. package/backend/viewport/toolbar.ts +27 -0
  248. package/backend/viewport/topbar.ts +39 -0
  249. package/backend/viewport.ts +46 -0
  250. package/backend/window-manager.ts +84 -0
  251. package/backend/wizard/move-content-element.ts +107 -0
  252. package/backend/wizard/move-page.ts +74 -0
  253. package/backend/wizard.ts +331 -0
  254. package/belog/backend-log.ts +88 -0
  255. package/beuser/backend-user-listing.ts +40 -0
  256. package/beuser/permissions.ts +291 -0
  257. package/core/ajax/ajax-request-types.ts +15 -0
  258. package/core/ajax/ajax-request.ts +202 -0
  259. package/core/ajax/ajax-response.ts +57 -0
  260. package/core/ajax/input-transformer.ts +92 -0
  261. package/core/ajax/simple-response-interface.ts +5 -0
  262. package/core/authentication/mfa-provider/totp.ts +54 -0
  263. package/core/cache/dedupe-async-task.ts +95 -0
  264. package/core/directive/markdown.ts +82 -0
  265. package/core/directive/nl2br.ts +16 -0
  266. package/core/document-service.ts +35 -0
  267. package/core/event/debounce-event.ts +40 -0
  268. package/core/event/event-interface.ts +24 -0
  269. package/core/event/regular-event.ts +58 -0
  270. package/core/event/request-animation-frame-event.ts +42 -0
  271. package/core/event/throttle-event.ts +54 -0
  272. package/core/java-script-item-handler.ts +29 -0
  273. package/core/java-script-item-processor.ts +171 -0
  274. package/core/lit-helper.ts +126 -0
  275. package/core/literals.ts +17 -0
  276. package/core/referrer-refresh.ts +2 -0
  277. package/core/security-utility.ts +89 -0
  278. package/core/tests/ajax/ajax-request-test.ts +290 -0
  279. package/core/tests/ajax/input-transformer-test.ts +64 -0
  280. package/core/tests/cache/dedupe-async-task-test.ts +152 -0
  281. package/core/tests/event/throttle-event-test.ts +47 -0
  282. package/core/tests/literals-test.ts +24 -0
  283. package/core/tests/security-utility-test.ts +50 -0
  284. package/core/utility/types.ts +9 -0
  285. package/dashboard/chart-initializer.ts +136 -0
  286. package/dashboard/dashboard.ts +1487 -0
  287. package/extensionmanager/distribution-image.ts +55 -0
  288. package/extensionmanager/main.ts +291 -0
  289. package/extensionmanager/repository.ts +195 -0
  290. package/extensionmanager/update.ts +118 -0
  291. package/extensionmanager/upload-form.ts +42 -0
  292. package/filelist/browse-files.ts +148 -0
  293. package/filelist/browse-folders.ts +94 -0
  294. package/filelist/context-menu-actions.ts +335 -0
  295. package/filelist/create-folder.ts +69 -0
  296. package/filelist/file-delete.ts +69 -0
  297. package/filelist/file-list-actions.ts +132 -0
  298. package/filelist/file-list-dragdrop.ts +139 -0
  299. package/filelist/file-list-rename-handler.ts +128 -0
  300. package/filelist/file-list-transfer-handler.ts +138 -0
  301. package/filelist/file-list.ts +396 -0
  302. package/filelist/file-replace.ts +37 -0
  303. package/filelist/linkbrowser-file-handler.ts +94 -0
  304. package/filelist/linkbrowser-folder-handler.ts +74 -0
  305. package/filelist/rename-file.ts +109 -0
  306. package/form/backend/form-editor/component/property-grid-editor.ts +340 -0
  307. package/form/backend/form-editor/core.ts +2104 -0
  308. package/form/backend/form-editor/helper.ts +226 -0
  309. package/form/backend/form-editor/inspector-component.ts +2323 -0
  310. package/form/backend/form-editor/mediator.ts +941 -0
  311. package/form/backend/form-editor/modals-component.ts +433 -0
  312. package/form/backend/form-editor/stage-component.ts +908 -0
  313. package/form/backend/form-editor/tree-component.ts +548 -0
  314. package/form/backend/form-editor/view-model.ts +1343 -0
  315. package/form/backend/form-editor.ts +846 -0
  316. package/form/backend/form-manager/main.ts +39 -0
  317. package/form/backend/form-manager/view-model.ts +789 -0
  318. package/form/backend/form-manager.ts +180 -0
  319. package/form/backend/helper.ts +60 -0
  320. package/form/frontend/date-picker.ts +38 -0
  321. package/frontend/default_frontend.ts +82 -0
  322. package/impexp/context-menu-actions.ts +50 -0
  323. package/impexp/import-export.ts +62 -0
  324. package/indexed-search/pagination.ts +26 -0
  325. package/indexed-search/statistics.ts +50 -0
  326. package/info/translation-status.ts +48 -0
  327. package/install/ajax/ajax-queue.ts +83 -0
  328. package/install/init-install.ts +2 -0
  329. package/install/init-installer.ts +2 -0
  330. package/install/install.ts +25 -0
  331. package/install/installer.ts +458 -0
  332. package/install/message-interface.ts +18 -0
  333. package/install/module/abstract-inline-module.ts +27 -0
  334. package/install/module/abstract-interactable-module.ts +107 -0
  335. package/install/module/environment/environment-check.ts +92 -0
  336. package/install/module/environment/folder-structure.ts +145 -0
  337. package/install/module/environment/image-processing.ts +141 -0
  338. package/install/module/environment/mail-test.ts +127 -0
  339. package/install/module/environment/php-info.ts +50 -0
  340. package/install/module/environment/system-information.ts +50 -0
  341. package/install/module/maintenance/cache.ts +59 -0
  342. package/install/module/maintenance/clear-tables.ts +134 -0
  343. package/install/module/maintenance/clear-typo3temp-files.ts +137 -0
  344. package/install/module/maintenance/create-admin.ts +126 -0
  345. package/install/module/maintenance/database-analyzer.ts +266 -0
  346. package/install/module/maintenance/dump-autoload.ts +58 -0
  347. package/install/module/maintenance/language-packs.ts +338 -0
  348. package/install/module/maintenance/reset-backend-user-uc.ts +58 -0
  349. package/install/module/password-strength.ts +56 -0
  350. package/install/module/settings/change-install-tool-password.ts +101 -0
  351. package/install/module/settings/extension-configuration.ts +224 -0
  352. package/install/module/settings/features.ts +102 -0
  353. package/install/module/settings/local-configuration.ts +316 -0
  354. package/install/module/settings/presets.ts +147 -0
  355. package/install/module/settings/system-maintainer.ts +111 -0
  356. package/install/module/upgrade/core-update.ts +255 -0
  357. package/install/module/upgrade/extension-compat-tester.ts +195 -0
  358. package/install/module/upgrade/extension-scanner.ts +381 -0
  359. package/install/module/upgrade/tca-ext-tables-check.ts +93 -0
  360. package/install/module/upgrade/tca-migrations-check.ts +101 -0
  361. package/install/module/upgrade/upgrade-docs.ts +310 -0
  362. package/install/module/upgrade/upgrade-wizards.ts +612 -0
  363. package/install/renderable/clearable.ts +113 -0
  364. package/install/renderable/flash-message.ts +64 -0
  365. package/install/renderable/info-box.ts +66 -0
  366. package/install/renderable/language-packs.ts +304 -0
  367. package/install/renderable/offset-group.ts +38 -0
  368. package/install/renderable/severity.ts +49 -0
  369. package/install/renderable/wrap-group.ts +36 -0
  370. package/install/router.ts +468 -0
  371. package/linkvalidator/linkvalidator-modal.ts +45 -0
  372. package/linkvalidator/linkvalidator.ts +101 -0
  373. package/lowlevel/query-generator.ts +132 -0
  374. package/lowlevel/reference-index.ts +44 -0
  375. package/opendocs/toolbar/opendocs-menu.ts +117 -0
  376. package/package.json +34 -0
  377. package/recycler/recycler.ts +539 -0
  378. package/redirects/event-handler.ts +108 -0
  379. package/redirects/form-engine-evaluation.ts +34 -0
  380. package/redirects/redirects-module.ts +58 -0
  381. package/rte-ckeditor/ckeditor5.ts +402 -0
  382. package/rte-ckeditor/css-prefixer.ts +94 -0
  383. package/rte-ckeditor/legacy/ckeditor5-bundle.ts +17 -0
  384. package/rte-ckeditor/legacy/ckeditor5-inspector.ts +2 -0
  385. package/rte-ckeditor/plugin/typo3-link.ts +810 -0
  386. package/rte-ckeditor/plugin/whitespace.ts +114 -0
  387. package/rte-ckeditor/rte-link-browser.ts +112 -0
  388. package/rte-ckeditor/tests/css-prefixer-test.ts +314 -0
  389. package/scheduler/scheduler-add-group.ts +119 -0
  390. package/scheduler/scheduler-editable-group-name.ts +307 -0
  391. package/scheduler/scheduler-sortable-groups.ts +59 -0
  392. package/scheduler/scheduler.ts +466 -0
  393. package/setup/setup-module.ts +122 -0
  394. package/styleguide/checkbox-demo.ts +5 -0
  395. package/styleguide/element/theme-switcher-element.ts +101 -0
  396. package/styleguide/filter.ts +22 -0
  397. package/styleguide/find-icons.ts +78 -0
  398. package/styleguide/processing-indicator.ts +78 -0
  399. package/styleguide/render-notifications.ts +64 -0
  400. package/sys-note/element/delete-button.ts +78 -0
  401. package/tstemplate/constant-editor.ts +64 -0
  402. package/tstemplate/information-module.ts +31 -0
  403. package/tstemplate/template-analyzer.ts +77 -0
  404. package/viewpage/main.ts +253 -0
  405. package/workspaces/backend.ts +979 -0
  406. package/workspaces/preview.ts +232 -0
  407. package/workspaces/renderable/comment-view.ts +79 -0
  408. package/workspaces/renderable/diff-view.ts +58 -0
  409. package/workspaces/renderable/history-view.ts +97 -0
  410. package/workspaces/renderable/record-information.ts +118 -0
  411. package/workspaces/renderable/record-table.ts +355 -0
  412. package/workspaces/renderable/send-to-stage-form.ts +108 -0
  413. package/workspaces/toolbar/workspaces-menu.ts +190 -0
  414. package/workspaces/utility/icon-helper.ts +57 -0
  415. package/workspaces/workspaces.ts +136 -0
@@ -0,0 +1,252 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ /*! Based on http://www.webtoolkit.info/javascript_md5.html */
15
+
16
+ class Md5 {
17
+ public static hash(value: string): string {
18
+ let k;
19
+ let AA;
20
+ let BB;
21
+ let CC;
22
+ let DD;
23
+ let a;
24
+ let b;
25
+ let c;
26
+ let d;
27
+ const S11 = 7;
28
+ const S12 = 12;
29
+ const S13 = 17;
30
+ const S14 = 22;
31
+ const S21 = 5;
32
+ const S22 = 9;
33
+ const S23 = 14;
34
+ const S24 = 20;
35
+ const S31 = 4;
36
+ const S32 = 11;
37
+ const S33 = 16;
38
+ const S34 = 23;
39
+ const S41 = 6;
40
+ const S42 = 10;
41
+ const S43 = 15;
42
+ const S44 = 21;
43
+
44
+ value = Md5.utf8Encode(value);
45
+ const x = Md5.convertToWordArray(value);
46
+
47
+ a = 0x67452301;
48
+ b = 0xEFCDAB89;
49
+ c = 0x98BADCFE;
50
+ d = 0x10325476;
51
+
52
+ for (k = 0; k < x.length; k += 16) {
53
+ AA = a;
54
+ BB = b;
55
+ CC = c;
56
+ DD = d;
57
+ a = Md5.FF(a, b, c, d, x[k], S11, 0xD76AA478);
58
+ d = Md5.FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
59
+ c = Md5.FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
60
+ b = Md5.FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
61
+ a = Md5.FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
62
+ d = Md5.FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
63
+ c = Md5.FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
64
+ b = Md5.FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
65
+ a = Md5.FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
66
+ d = Md5.FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
67
+ c = Md5.FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
68
+ b = Md5.FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
69
+ a = Md5.FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
70
+ d = Md5.FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
71
+ c = Md5.FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
72
+ b = Md5.FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
73
+ a = Md5.GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
74
+ d = Md5.GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
75
+ c = Md5.GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
76
+ b = Md5.GG(b, c, d, a, x[k], S24, 0xE9B6C7AA);
77
+ a = Md5.GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
78
+ d = Md5.GG(d, a, b, c, x[k + 10], S22, 0x2441453);
79
+ c = Md5.GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
80
+ b = Md5.GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
81
+ a = Md5.GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
82
+ d = Md5.GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
83
+ c = Md5.GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
84
+ b = Md5.GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
85
+ a = Md5.GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
86
+ d = Md5.GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
87
+ c = Md5.GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
88
+ b = Md5.GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
89
+ a = Md5.HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
90
+ d = Md5.HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
91
+ c = Md5.HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
92
+ b = Md5.HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
93
+ a = Md5.HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
94
+ d = Md5.HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
95
+ c = Md5.HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
96
+ b = Md5.HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
97
+ a = Md5.HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
98
+ d = Md5.HH(d, a, b, c, x[k], S32, 0xEAA127FA);
99
+ c = Md5.HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
100
+ b = Md5.HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
101
+ a = Md5.HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
102
+ d = Md5.HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
103
+ c = Md5.HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
104
+ b = Md5.HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
105
+ a = Md5.II(a, b, c, d, x[k], S41, 0xF4292244);
106
+ d = Md5.II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
107
+ c = Md5.II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
108
+ b = Md5.II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
109
+ a = Md5.II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
110
+ d = Md5.II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
111
+ c = Md5.II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
112
+ b = Md5.II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
113
+ a = Md5.II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
114
+ d = Md5.II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
115
+ c = Md5.II(c, d, a, b, x[k + 6], S43, 0xA3014314);
116
+ b = Md5.II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
117
+ a = Md5.II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
118
+ d = Md5.II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
119
+ c = Md5.II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
120
+ b = Md5.II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
121
+ a = Md5.addUnsigned(a, AA);
122
+ b = Md5.addUnsigned(b, BB);
123
+ c = Md5.addUnsigned(c, CC);
124
+ d = Md5.addUnsigned(d, DD);
125
+ }
126
+
127
+ const temp = Md5.wordToHex(a) + Md5.wordToHex(b) + Md5.wordToHex(c) + Md5.wordToHex(d);
128
+
129
+ return temp.toLowerCase();
130
+ }
131
+
132
+ private static rotateLeft(lValue: number, iShiftBits: number): number {
133
+ return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
134
+ }
135
+
136
+ private static addUnsigned(lX: number, lY: number): number {
137
+ const lX8 = (lX & 0x80000000);
138
+ const lY8 = (lY & 0x80000000);
139
+ const lX4 = (lX & 0x40000000);
140
+ const lY4 = (lY & 0x40000000);
141
+ const lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
142
+ if (lX4 & lY4) {
143
+ return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
144
+ }
145
+ if (lX4 | lY4) {
146
+ if (lResult & 0x40000000) {
147
+ return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
148
+ } else {
149
+ return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
150
+ }
151
+ } else {
152
+ return (lResult ^ lX8 ^ lY8);
153
+ }
154
+ }
155
+
156
+ private static F(x: number, y: number, z: number): number {
157
+ return (x & y) | ((~x) & z);
158
+ }
159
+
160
+ private static G(x: number, y: number, z: number): number {
161
+ return (x & z) | (y & (~z));
162
+ }
163
+
164
+ private static H(x: number, y: number, z: number): number {
165
+ return (x ^ y ^ z);
166
+ }
167
+
168
+ private static I(x: number, y: number, z: number): number {
169
+ return (y ^ (x | (~z)));
170
+ }
171
+
172
+ private static FF(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
173
+ a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.F(b, c, d), x), ac));
174
+ return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
175
+ }
176
+
177
+ private static GG(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
178
+ a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.G(b, c, d), x), ac));
179
+ return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
180
+ }
181
+
182
+ private static HH(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
183
+ a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.H(b, c, d), x), ac));
184
+ return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
185
+ }
186
+
187
+ private static II(a: number, b: number, c: number, d: number, x: number, s: number, ac: number): number {
188
+ a = Md5.addUnsigned(a, Md5.addUnsigned(Md5.addUnsigned(Md5.I(b, c, d), x), ac));
189
+ return Md5.addUnsigned(Md5.rotateLeft(a, s), b);
190
+ }
191
+
192
+ private static convertToWordArray(string: string): Array<number> {
193
+ let lWordCount;
194
+ const lMessageLength = string.length;
195
+ const lNumberOfWords_temp1 = lMessageLength + 8;
196
+ const lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
197
+ const lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
198
+ const lWordArray = Array(lNumberOfWords - 1);
199
+ let lBytePosition = 0;
200
+ let lByteCount = 0;
201
+ while (lByteCount < lMessageLength) {
202
+ lWordCount = (lByteCount - (lByteCount % 4)) / 4;
203
+ lBytePosition = (lByteCount % 4) * 8;
204
+ lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
205
+ lByteCount++;
206
+ }
207
+ lWordCount = (lByteCount - (lByteCount % 4)) / 4;
208
+ lBytePosition = (lByteCount % 4) * 8;
209
+ lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
210
+ lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
211
+ lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
212
+ return lWordArray;
213
+ }
214
+
215
+ private static wordToHex(lValue: number): string {
216
+ let wordToHexValue = '';
217
+ let wordToHexValue_temp = '';
218
+ let lByte;
219
+ let lCount;
220
+ for (lCount = 0; lCount <= 3; lCount++) {
221
+ lByte = (lValue >>> (lCount * 8)) & 255;
222
+ wordToHexValue_temp = '0' + lByte.toString(16);
223
+ wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length - 2, 2);
224
+ }
225
+ return wordToHexValue;
226
+ }
227
+
228
+ private static utf8Encode(string: string): string {
229
+ string = string.replace(/\r\n/g, '\n');
230
+ let utftext = '';
231
+
232
+ for (let n = 0; n < string.length; n++) {
233
+ const c = string.charCodeAt(n);
234
+
235
+ if (c < 128) {
236
+ utftext += String.fromCharCode(c);
237
+ } else if ((c > 127) && (c < 2048)) {
238
+ utftext += String.fromCharCode((c >> 6) | 192);
239
+ utftext += String.fromCharCode((c & 63) | 128);
240
+ } else {
241
+ utftext += String.fromCharCode((c >> 12) | 224);
242
+ utftext += String.fromCharCode(((c >> 6) & 63) | 128);
243
+ utftext += String.fromCharCode((c & 63) | 128);
244
+ }
245
+
246
+ }
247
+
248
+ return utftext;
249
+ }
250
+ }
251
+
252
+ export default Md5;
@@ -0,0 +1,24 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+ /**
14
+ * @internal Use in TYPO3 core only, API can change at any time!
15
+ */
16
+ if (document.currentScript) {
17
+ const scriptElement = document.currentScript;
18
+ switch (scriptElement.dataset.action) {
19
+ case 'window.close':
20
+ window.close();
21
+ break;
22
+ default:
23
+ }
24
+ }
@@ -0,0 +1,63 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ export type HotkeyStruct = {
15
+ modifiers: {
16
+ meta: boolean,
17
+ ctrl: boolean,
18
+ shift: boolean,
19
+ alt: boolean,
20
+ },
21
+ key: string
22
+ };
23
+ export type HotkeyHandler = (e: KeyboardEvent) => void;
24
+ export type Options = {
25
+ scope: string,
26
+ allowOnEditables: boolean,
27
+ allowRepeat: boolean,
28
+ bindElement: Element|undefined
29
+ };
30
+ export type HotkeySetup = {
31
+ struct: HotkeyStruct;
32
+ handler: HotkeyHandler;
33
+ options: Options;
34
+ };
35
+ type HotkeyMap = Map<string, HotkeySetup>;
36
+ export type ScopedHotkeyMap = Map<string, HotkeyMap>;
37
+
38
+ /**
39
+ * Storage helper for the hotkeys module to keep registered hotkeys anywhere in the backend scaffold available
40
+ */
41
+ class HotkeyStorage {
42
+ public constructor(
43
+ private readonly scopedHotkeyMap: ScopedHotkeyMap = new Map([
44
+ ['all', new Map()]
45
+ ]),
46
+ public activeScope: string = 'all'
47
+ ) {
48
+ }
49
+
50
+ public getScopedHotkeyMap(): ScopedHotkeyMap {
51
+ return this.scopedHotkeyMap;
52
+ }
53
+ }
54
+
55
+ let hotkeysStorageInstance: HotkeyStorage;
56
+ if (!top.TYPO3.HotkeyStorage) {
57
+ hotkeysStorageInstance = new HotkeyStorage();
58
+ top.TYPO3.HotkeyStorage = hotkeysStorageInstance;
59
+ } else {
60
+ hotkeysStorageInstance = top.TYPO3.HotkeyStorage;
61
+ }
62
+
63
+ export default hotkeysStorageInstance;
@@ -0,0 +1,216 @@
1
+ /*
2
+ * This file is part of the TYPO3 CMS project.
3
+ *
4
+ * It is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU General Public License, either version 2
6
+ * of the License, or any later version.
7
+ *
8
+ * For the full copyright and license information, please read the
9
+ * LICENSE.txt file that was distributed with this source code.
10
+ *
11
+ * The TYPO3 project - inspiring people to share!
12
+ */
13
+
14
+ import HotkeyStorage, { type ScopedHotkeyMap, type HotkeyStruct, type Options, type HotkeySetup } from '@typo3/backend/hotkeys/hotkey-storage';
15
+ import RegularEvent from '@typo3/core/event/regular-event';
16
+
17
+ export enum ModifierKeys {
18
+ META = 'meta',
19
+ CTRL = 'control',
20
+ SHIFT = 'shift',
21
+ ALT = 'alt',
22
+ }
23
+
24
+ type Hotkey = string[];
25
+
26
+ /**
27
+ * Module: @typo3/backend/hotkeys
28
+ *
29
+ * Provides API to register hotkeys (aka shortcuts) in the TYPO3 backend. It is possible to register hotkeys in
30
+ * different scopes, that can also be switched during runtime. Extensions should always specify their scope when
31
+ * registering hotkeys.
32
+ *
33
+ * Due to how the TYPO3 backend currently works, registered hotkeys are limited to the same document the API is used in.
34
+ */
35
+ class Hotkeys {
36
+ // navigator.platform is deprecated, but https://developer.mozilla.org/en-US/docs/Web/API/User-Agent_Client_Hints_API is experimental for now
37
+ public readonly normalizedCtrlModifierKey = navigator.platform.toLowerCase().startsWith('mac') ? ModifierKeys.META : ModifierKeys.CTRL;
38
+ private readonly scopedHotkeyMap: ScopedHotkeyMap;
39
+ private readonly defaultOptions: Options = {
40
+ scope: 'all',
41
+ allowOnEditables: false,
42
+ allowRepeat: false,
43
+ bindElement: undefined
44
+ };
45
+
46
+ public constructor() {
47
+ this.scopedHotkeyMap = HotkeyStorage.getScopedHotkeyMap();
48
+ this.setScope('all');
49
+ this.registerEventHandler();
50
+ }
51
+
52
+ public setScope(scope: string): void {
53
+ HotkeyStorage.activeScope = scope;
54
+ }
55
+
56
+ public getScope(): string {
57
+ return HotkeyStorage.activeScope;
58
+ }
59
+
60
+ public register(hotkey: Hotkey, handler: (e: KeyboardEvent) => void, options: Partial<Options> = {}): void {
61
+ if (hotkey.filter((hotkeyPart: string) => !Object.values<string>(ModifierKeys).includes(hotkeyPart)).length === 0) {
62
+ throw new Error('Attempted to register hotkey "' + hotkey.join('+') + '" without a non-modifier key.');
63
+ }
64
+
65
+ // Normalize trigger
66
+ hotkey = hotkey.map((h: string) => h.toLowerCase());
67
+
68
+ const mergedConfiguration: Options = { ...this.defaultOptions, ...options };
69
+ if (!this.scopedHotkeyMap.has(mergedConfiguration.scope)) {
70
+ this.scopedHotkeyMap.set(mergedConfiguration.scope, new Map());
71
+ }
72
+
73
+ let ariaKeyShortcut = this.composeAriaKeyShortcut(hotkey);
74
+ const hotkeyMap = this.scopedHotkeyMap.get(mergedConfiguration.scope);
75
+ const hotkeyStruct = this.createHotkeyStructFromTrigger(hotkey);
76
+ const encodedHotkeyStruct = JSON.stringify(hotkeyStruct);
77
+
78
+ if (hotkeyMap.has(encodedHotkeyStruct)) {
79
+ const setup = hotkeyMap.get(encodedHotkeyStruct);
80
+
81
+ // Hotkey already exists, remove potentially set `aria-keyshortcuts` for this hotkey
82
+ setup.options.bindElement?.removeAttribute('aria-keyshortcuts');
83
+ // Delete existing hotkey. If the existing hotkey was registered in a different browser scope, the callback is lost
84
+ hotkeyMap.delete(encodedHotkeyStruct);
85
+ }
86
+ hotkeyMap.set(encodedHotkeyStruct, { struct: hotkeyStruct, handler, options: mergedConfiguration });
87
+
88
+ if (mergedConfiguration.bindElement instanceof Element) {
89
+ const existingAriaAttribute = mergedConfiguration.bindElement.getAttribute('aria-keyshortcuts');
90
+ if (existingAriaAttribute !== null && !existingAriaAttribute.includes(ariaKeyShortcut)) {
91
+ // Element already has `aria-keyshortcuts`, append composed shortcut
92
+ ariaKeyShortcut = existingAriaAttribute + ' ' + ariaKeyShortcut;
93
+ }
94
+ mergedConfiguration.bindElement.setAttribute('aria-keyshortcuts', ariaKeyShortcut);
95
+ }
96
+ }
97
+
98
+ private registerEventHandler(): void {
99
+ new RegularEvent('keydown', (e: KeyboardEvent): void => {
100
+ const hotkeySetup = this.findHotkeySetup(e);
101
+ if (hotkeySetup === null) {
102
+ return;
103
+ }
104
+
105
+ if (e.repeat && !hotkeySetup.options.allowRepeat) {
106
+ return;
107
+ }
108
+
109
+ if (!hotkeySetup.options.allowOnEditables) {
110
+ const target = e.target as HTMLElement;
111
+ if (target.isContentEditable || (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) && !(e.target as HTMLInputElement|HTMLTextAreaElement).readOnly)) {
112
+ return;
113
+ }
114
+ }
115
+
116
+ hotkeySetup.handler(e);
117
+ }).bindTo(document);
118
+ }
119
+
120
+ private findHotkeySetup(e: KeyboardEvent): HotkeySetup|undefined {
121
+ // We always consider the global "all" scope first to avoid overriding global hotkeys
122
+ const scopes: string[] = [...new Set(['all', HotkeyStorage.activeScope])];
123
+ const hotkeyStruct = this.createHotkeyStructFromEvent(e);
124
+ const encodedHotkeyStruct = JSON.stringify(hotkeyStruct);
125
+
126
+ for (const scope of scopes) {
127
+ const hotkeyMap = this.scopedHotkeyMap.get(scope);
128
+ if (hotkeyMap.has(encodedHotkeyStruct)) {
129
+ return hotkeyMap.get(encodedHotkeyStruct);
130
+ }
131
+ }
132
+
133
+ return null;
134
+ }
135
+
136
+ private createHotkeyStructFromTrigger(hotkey: Hotkey): HotkeyStruct {
137
+ const nonModifierCodes = hotkey.filter((hotkeyPart: string) => !Object.values<string>(ModifierKeys).includes(hotkeyPart));
138
+ if (nonModifierCodes.length > 1) {
139
+ throw new Error('Cannot register hotkey with more than one non-modifier key, "' + nonModifierCodes.join('+') + '" given.');
140
+ }
141
+
142
+ return {
143
+ modifiers: {
144
+ meta: hotkey.includes(ModifierKeys.META),
145
+ ctrl: hotkey.includes(ModifierKeys.CTRL),
146
+ shift: hotkey.includes(ModifierKeys.SHIFT),
147
+ alt: hotkey.includes(ModifierKeys.ALT),
148
+ },
149
+ key: nonModifierCodes[0].toLowerCase(),
150
+ };
151
+ }
152
+
153
+ private createHotkeyStructFromEvent(e: KeyboardEvent): HotkeyStruct {
154
+ return {
155
+ modifiers: {
156
+ meta: e.metaKey,
157
+ ctrl: e.ctrlKey,
158
+ shift: e.shiftKey,
159
+ alt: e.altKey,
160
+ },
161
+ key: e.key?.toLowerCase(),
162
+ };
163
+ }
164
+
165
+ /**
166
+ * Composes a string for use with `aria-keyshortcuts`
167
+ * @see https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-keyshortcuts
168
+ */
169
+ private composeAriaKeyShortcut(hotkey: Hotkey): string {
170
+ const parts: string[] = [];
171
+
172
+ for (let key of hotkey) {
173
+ if (key === '+') {
174
+ key = 'plus';
175
+ } else {
176
+ key = key.replace(/[\u00A0-\u9999<>&]/g, i => '&#' + i.charCodeAt(0) + ';');
177
+ }
178
+
179
+ parts.push(key);
180
+ }
181
+
182
+ // The standard requires to have modifier keys to be at first
183
+ parts.sort((a: string, b: string): number => {
184
+ const aIsModifierKey = Object.values<string>(ModifierKeys).includes(a);
185
+ const bIsModifierKey = Object.values<string>(ModifierKeys).includes(b);
186
+
187
+ if (aIsModifierKey && !bIsModifierKey) {
188
+ return -1;
189
+ }
190
+
191
+ if (!aIsModifierKey && bIsModifierKey) {
192
+ return 1;
193
+ }
194
+
195
+ if (aIsModifierKey && bIsModifierKey) {
196
+ return -1;
197
+ }
198
+
199
+ return 0;
200
+ });
201
+
202
+ return parts.join('+');
203
+ }
204
+ }
205
+
206
+ // Helper to always get the same instance within a frame
207
+ // @todo: have the module in `top` scope, while being able to register the `keydown` event in each frame
208
+ let hotkeysInstance: Hotkeys;
209
+ if (!TYPO3.Hotkeys) {
210
+ hotkeysInstance = new Hotkeys();
211
+ TYPO3.Hotkeys = hotkeysInstance;
212
+ } else {
213
+ hotkeysInstance = TYPO3.Hotkeys;
214
+ }
215
+
216
+ export default hotkeysInstance;