@webiny/app-admin 5.34.8 → 5.35.0-beta.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.
Files changed (255) hide show
  1. package/assets/icons/add-18px.svg +1 -1
  2. package/assets/icons/arrow_drop_down-24px.svg +1 -1
  3. package/assets/icons/filter-24px.svg +1 -1
  4. package/assets/icons/highlight-24px.svg +1 -1
  5. package/assets/icons/info.svg +1 -1
  6. package/assets/icons/insert_drive_file-24px.svg +1 -1
  7. package/assets/icons/insert_photo-24px.svg +1 -1
  8. package/assets/icons/label-24px.svg +1 -1
  9. package/assets/icons/round-account_circle-24px.svg +1 -1
  10. package/assets/icons/round-arrow_drop_down-24px.svg +1 -1
  11. package/assets/icons/round-help-24px.svg +1 -1
  12. package/assets/icons/round-settings-24px.svg +1 -1
  13. package/assets/icons/today-24px.svg +1 -1
  14. package/assets/icons/touch_app.svg +1 -1
  15. package/base/Admin.js +1 -15
  16. package/base/Admin.js.map +1 -1
  17. package/base/Base.js +6 -44
  18. package/base/Base.js.map +1 -1
  19. package/base/plugins/AddGraphQLQuerySelection.js +5 -9
  20. package/base/plugins/AddGraphQLQuerySelection.js.map +1 -1
  21. package/base/providers/ApolloProvider.js +0 -5
  22. package/base/providers/ApolloProvider.js.map +1 -1
  23. package/base/providers/TelemetryProvider.js +1 -7
  24. package/base/providers/TelemetryProvider.js.map +1 -1
  25. package/base/providers/UiStateProvider.js +0 -5
  26. package/base/providers/UiStateProvider.js.map +1 -1
  27. package/base/providers/ViewCompositionProvider.js +3 -16
  28. package/base/providers/ViewCompositionProvider.js.map +1 -1
  29. package/base/ui/Brand.js +0 -4
  30. package/base/ui/Brand.js.map +1 -1
  31. package/base/ui/CenteredView.js +2 -7
  32. package/base/ui/CenteredView.js.map +1 -1
  33. package/base/ui/Dashboard.js +0 -4
  34. package/base/ui/Dashboard.js.map +1 -1
  35. package/base/ui/FileManager.d.ts +67 -0
  36. package/base/ui/FileManager.js +61 -0
  37. package/base/ui/FileManager.js.map +1 -0
  38. package/base/ui/Layout.js +1 -6
  39. package/base/ui/Layout.js.map +1 -1
  40. package/base/ui/LocaleSelector.js +0 -4
  41. package/base/ui/LocaleSelector.js.map +1 -1
  42. package/base/ui/LoginScreen.js +0 -6
  43. package/base/ui/LoginScreen.js.map +1 -1
  44. package/base/ui/Logo.js +0 -6
  45. package/base/ui/Logo.js.map +1 -1
  46. package/base/ui/Menu.js +2 -31
  47. package/base/ui/Menu.js.map +1 -1
  48. package/base/ui/Navigation.js +11 -44
  49. package/base/ui/Navigation.js.map +1 -1
  50. package/base/ui/NotFound.js +0 -4
  51. package/base/ui/NotFound.js.map +1 -1
  52. package/base/ui/Search.js +5 -23
  53. package/base/ui/Search.js.map +1 -1
  54. package/base/ui/Tags.js +1 -8
  55. package/base/ui/Tags.js.map +1 -1
  56. package/base/ui/UserMenu.js +5 -29
  57. package/base/ui/UserMenu.js.map +1 -1
  58. package/components/AdminLayout.js +1 -6
  59. package/components/AdminLayout.js.map +1 -1
  60. package/components/AppInstaller/AppInstaller.js +18 -84
  61. package/components/AppInstaller/AppInstaller.js.map +1 -1
  62. package/components/AppInstaller/Sidebar.js +11 -44
  63. package/components/AppInstaller/Sidebar.js.map +1 -1
  64. package/components/AppInstaller/index.js +0 -7
  65. package/components/AppInstaller/index.js.map +1 -1
  66. package/components/AppInstaller/styled.d.ts +17 -5
  67. package/components/AppInstaller/styled.js +0 -4
  68. package/components/AppInstaller/styled.js.map +1 -1
  69. package/components/AppInstaller/useInstaller.d.ts +1 -7
  70. package/components/AppInstaller/useInstaller.js +72 -183
  71. package/components/AppInstaller/useInstaller.js.map +1 -1
  72. package/components/EmptyView.js +4 -12
  73. package/components/EmptyView.js.map +1 -1
  74. package/components/FloatingActionButton.js +2 -8
  75. package/components/FloatingActionButton.js.map +1 -1
  76. package/components/MultiImageUpload.js +1 -10
  77. package/components/MultiImageUpload.js.map +1 -1
  78. package/components/OverlayLayout/OverlayLayout.js +9 -38
  79. package/components/OverlayLayout/OverlayLayout.js.map +1 -1
  80. package/components/OverlayLayout/index.js +0 -2
  81. package/components/OverlayLayout/index.js.map +1 -1
  82. package/components/Permissions/Permissions.d.ts +2 -0
  83. package/components/Permissions/Permissions.js +25 -27
  84. package/components/Permissions/Permissions.js.map +1 -1
  85. package/components/Permissions/StyledComponents.js +0 -7
  86. package/components/Permissions/StyledComponents.js.map +1 -1
  87. package/components/Permissions/index.js +0 -3
  88. package/components/Permissions/index.js.map +1 -1
  89. package/components/RichTextEditor/RichTextEditor.js +0 -7
  90. package/components/RichTextEditor/RichTextEditor.js.map +1 -1
  91. package/components/RichTextEditor/index.js +0 -2
  92. package/components/RichTextEditor/index.js.map +1 -1
  93. package/components/RichTextEditor/tools/header/index.js +62 -102
  94. package/components/RichTextEditor/tools/header/index.js.map +1 -1
  95. package/components/RichTextEditor/tools/image/index.js +15 -36
  96. package/components/RichTextEditor/tools/image/index.js.map +1 -1
  97. package/components/RichTextEditor/tools/image/svgs.js.map +1 -1
  98. package/components/RichTextEditor/tools/image/tunes.js +5 -22
  99. package/components/RichTextEditor/tools/image/tunes.js.map +1 -1
  100. package/components/RichTextEditor/tools/image/ui.js +16 -39
  101. package/components/RichTextEditor/tools/image/ui.js.map +1 -1
  102. package/components/RichTextEditor/tools/paragraph/index.js +55 -81
  103. package/components/RichTextEditor/tools/paragraph/index.js.map +1 -1
  104. package/components/RichTextEditor/tools/textColor/index.js +15 -41
  105. package/components/RichTextEditor/tools/textColor/index.js.map +1 -1
  106. package/components/RichTextEditor/tools/utils.js +0 -2
  107. package/components/RichTextEditor/tools/utils.js.map +1 -1
  108. package/components/Routes.js +6 -13
  109. package/components/Routes.js.map +1 -1
  110. package/components/SearchUI.d.ts +1 -0
  111. package/components/SearchUI.js +14 -14
  112. package/components/SearchUI.js.map +1 -1
  113. package/components/SimpleForm/SimpleForm.js +3 -32
  114. package/components/SimpleForm/SimpleForm.js.map +1 -1
  115. package/components/SimpleForm/index.js +0 -1
  116. package/components/SimpleForm/index.js.map +1 -1
  117. package/components/SimpleUI/InputField.d.ts +2 -0
  118. package/components/SimpleUI/InputField.js +16 -30
  119. package/components/SimpleUI/InputField.js.map +1 -1
  120. package/components/SingleImageUpload.d.ts +1 -1
  121. package/components/SingleImageUpload.js +14 -30
  122. package/components/SingleImageUpload.js.map +1 -1
  123. package/components/SplitView/SplitView.js +1 -20
  124. package/components/SplitView/SplitView.js.map +1 -1
  125. package/components/SplitView/index.js +0 -1
  126. package/components/SplitView/index.js.map +1 -1
  127. package/components/index.d.ts +1 -1
  128. package/components/index.js +1 -2
  129. package/components/index.js.map +1 -1
  130. package/hooks/useConfirmationDialog.js +6 -18
  131. package/hooks/useConfirmationDialog.js.map +1 -1
  132. package/hooks/useDialog.js +0 -5
  133. package/hooks/useDialog.js.map +1 -1
  134. package/hooks/useSnackbar.js +0 -5
  135. package/hooks/useSnackbar.js.map +1 -1
  136. package/index.d.ts +2 -3
  137. package/index.js +1 -61
  138. package/index.js.map +1 -1
  139. package/package.json +22 -32
  140. package/plugins/MenuPlugin.js +0 -15
  141. package/plugins/MenuPlugin.js.map +1 -1
  142. package/plugins/PermissionRendererPlugin.js +0 -15
  143. package/plugins/PermissionRendererPlugin.js.map +1 -1
  144. package/plugins/globalSearch/SearchBar.js +5 -53
  145. package/plugins/globalSearch/SearchBar.js.map +1 -1
  146. package/plugins/globalSearch/SearchBarDropdown.js +15 -33
  147. package/plugins/globalSearch/SearchBarDropdown.js.map +1 -1
  148. package/plugins/globalSearch/index.js.map +1 -1
  149. package/plugins/globalSearch/styled.d.ts +13 -4
  150. package/plugins/globalSearch/styled.js +1 -5
  151. package/plugins/globalSearch/styled.js.map +1 -1
  152. package/plugins/uiLayoutRenderer/index.js +2 -16
  153. package/plugins/uiLayoutRenderer/index.js.map +1 -1
  154. package/styles/theme.scss +31 -1
  155. package/types.d.ts +23 -27
  156. package/types.js.map +1 -1
  157. package/ui/UIElement.js +0 -1
  158. package/ui/UIElement.js.map +1 -1
  159. package/ui/UILayout.js +0 -1
  160. package/ui/UILayout.js.map +1 -1
  161. package/ui/UIRenderer.js +0 -1
  162. package/ui/UIRenderer.js.map +1 -1
  163. package/ui/UIView.js +0 -1
  164. package/ui/UIView.js.map +1 -1
  165. package/ui/elements/AccordionElement.js +2 -28
  166. package/ui/elements/AccordionElement.js.map +1 -1
  167. package/ui/elements/ButtonElement.js +0 -19
  168. package/ui/elements/ButtonElement.js.map +1 -1
  169. package/ui/elements/ButtonGroupElement.js +0 -19
  170. package/ui/elements/ButtonGroupElement.js.map +1 -1
  171. package/ui/elements/GenericElement.js +0 -2
  172. package/ui/elements/GenericElement.js.map +1 -1
  173. package/ui/elements/LabelElement.js +0 -14
  174. package/ui/elements/LabelElement.js.map +1 -1
  175. package/ui/elements/NavigationMenuElement.js +3 -36
  176. package/ui/elements/NavigationMenuElement.js.map +1 -1
  177. package/ui/elements/PanelElement.js +0 -11
  178. package/ui/elements/PanelElement.js.map +1 -1
  179. package/ui/elements/PlaceholderElement.js +0 -11
  180. package/ui/elements/PlaceholderElement.js.map +1 -1
  181. package/ui/elements/SmallButtonElement.js +0 -19
  182. package/ui/elements/SmallButtonElement.js.map +1 -1
  183. package/ui/elements/TypographyElement.js +0 -19
  184. package/ui/elements/TypographyElement.js.map +1 -1
  185. package/ui/elements/ViewElement.js +0 -2
  186. package/ui/elements/ViewElement.js.map +1 -1
  187. package/ui/elements/form/DynamicFieldsetElement/DynamicFieldsetRowElement.js +0 -16
  188. package/ui/elements/form/DynamicFieldsetElement/DynamicFieldsetRowElement.js.map +1 -1
  189. package/ui/elements/form/DynamicFieldsetElement.js +11 -34
  190. package/ui/elements/form/DynamicFieldsetElement.js.map +1 -1
  191. package/ui/elements/form/FileManagerElement/EmptyStateElement.js +0 -15
  192. package/ui/elements/form/FileManagerElement/EmptyStateElement.js.map +1 -1
  193. package/ui/elements/form/FileManagerElement/EmptyStateElementRenderer.js +5 -27
  194. package/ui/elements/form/FileManagerElement/EmptyStateElementRenderer.js.map +1 -1
  195. package/ui/elements/form/FileManagerElement/FileManagerElementRenderer.js +4 -23
  196. package/ui/elements/form/FileManagerElement/FileManagerElementRenderer.js.map +1 -1
  197. package/ui/elements/form/FileManagerElement/styled.d.ts +23 -16
  198. package/ui/elements/form/FileManagerElement/styled.js +0 -5
  199. package/ui/elements/form/FileManagerElement/styled.js.map +1 -1
  200. package/ui/elements/form/FileManagerElement.js +0 -20
  201. package/ui/elements/form/FileManagerElement.js.map +1 -1
  202. package/ui/elements/form/FormElement.js +0 -21
  203. package/ui/elements/form/FormElement.js.map +1 -1
  204. package/ui/elements/form/FormFieldElement.js +0 -33
  205. package/ui/elements/form/FormFieldElement.js.map +1 -1
  206. package/ui/elements/form/HiddenElement.js +0 -17
  207. package/ui/elements/form/HiddenElement.js.map +1 -1
  208. package/ui/elements/form/InputElement.js +0 -18
  209. package/ui/elements/form/InputElement.js.map +1 -1
  210. package/ui/elements/form/PasswordElement.js +0 -15
  211. package/ui/elements/form/PasswordElement.js.map +1 -1
  212. package/ui/elements/form/SelectElement.js +1 -19
  213. package/ui/elements/form/SelectElement.js.map +1 -1
  214. package/ui/elements/form/TextareaElement.js +0 -17
  215. package/ui/elements/form/TextareaElement.js.map +1 -1
  216. package/ui/views/AdminView/ContentElement.js +1 -25
  217. package/ui/views/AdminView/ContentElement.js.map +1 -1
  218. package/ui/views/AdminView/HeaderElement.js +0 -40
  219. package/ui/views/AdminView/HeaderElement.js.map +1 -1
  220. package/ui/views/AdminView/HeaderSectionCenterElement.js +0 -20
  221. package/ui/views/AdminView/HeaderSectionCenterElement.js.map +1 -1
  222. package/ui/views/AdminView/HeaderSectionLeftElement.js +0 -20
  223. package/ui/views/AdminView/HeaderSectionLeftElement.js.map +1 -1
  224. package/ui/views/AdminView/HeaderSectionRightElement.js +0 -20
  225. package/ui/views/AdminView/HeaderSectionRightElement.js.map +1 -1
  226. package/ui/views/AdminView/components/Dialog.js +10 -21
  227. package/ui/views/AdminView/components/Dialog.js.map +1 -1
  228. package/ui/views/AdminView/components/Hamburger.js +2 -10
  229. package/ui/views/AdminView/components/Hamburger.js.map +1 -1
  230. package/ui/views/AdminView/components/Snackbar.js +0 -9
  231. package/ui/views/AdminView/components/Snackbar.js.map +1 -1
  232. package/ui/views/FormView/FormContainerElement.js +0 -21
  233. package/ui/views/FormView/FormContainerElement.js.map +1 -1
  234. package/ui/views/FormView/FormContentElement.js +0 -11
  235. package/ui/views/FormView/FormContentElement.js.map +1 -1
  236. package/ui/views/FormView/FormFooterElement.js +0 -19
  237. package/ui/views/FormView/FormFooterElement.js.map +1 -1
  238. package/ui/views/FormView/FormHeaderElement.js +2 -24
  239. package/ui/views/FormView/FormHeaderElement.js.map +1 -1
  240. package/ui/views/FormView.js +0 -41
  241. package/ui/views/FormView.js.map +1 -1
  242. package/ui/views/OverlayView/ContentElement.js +0 -19
  243. package/ui/views/OverlayView/ContentElement.js.map +1 -1
  244. package/ui/views/OverlayView/HeaderElement.js +4 -26
  245. package/ui/views/OverlayView/HeaderElement.js.map +1 -1
  246. package/ui/views/OverlayView/HeaderTitleElement.js +0 -22
  247. package/ui/views/OverlayView/HeaderTitleElement.js.map +1 -1
  248. package/ui/views/OverlayView/useOverlayView.js +3 -13
  249. package/ui/views/OverlayView/useOverlayView.js.map +1 -1
  250. package/ui/views/OverlayView.js +4 -38
  251. package/ui/views/OverlayView.js.map +1 -1
  252. package/ui/views/SplitView/SplitViewPanelElement.js +2 -22
  253. package/ui/views/SplitView/SplitViewPanelElement.js.map +1 -1
  254. package/ui/views/SplitView.js +0 -40
  255. package/ui/views/SplitView.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":["Tunes","api","actions","onChange","buttons","wrapper","buttonBase","styles","settingsButton","button","buttonActive","settingsButtonActive","toolData","make","CSS","tunes","concat","forEach","tune","title","i18n","t","el","innerHTML","icon","addEventListener","tuneClicked","name","action","dataset","classList","toggle","push","tooltip","onHover","placement","appendChild","tuneName","customFunction","find","contains","svgs","stretched"],"sources":["tunes.ts"],"sourcesContent":["import { API } from \"@editorjs/editorjs\";\nimport { make } from \"./ui\";\nimport svgs from \"./svgs\";\nimport { ImageToolData, Tune, TuneOnChangeCallable } from \"./types\";\n\ninterface TunesParams {\n api: API;\n actions: Tune[];\n onChange: TuneOnChangeCallable;\n}\n/**\n * Working with Block Tunes\n */\nexport default class Tunes {\n private api: API;\n private readonly actions: Tune[];\n private readonly onChange: TuneOnChangeCallable;\n private buttons: Array<HTMLElement>;\n /**\n * @param {object} tune - image tool Tunes managers\n * @param {object} tune.api - Editor API\n * @param {object} tune.actions - list of user defined tunes\n * @param {Function} tune.onChange - tune toggling callback\n */\n constructor({ api, actions, onChange }: TunesParams) {\n this.api = api;\n this.actions = actions;\n this.onChange = onChange;\n this.buttons = [];\n }\n\n /**\n * Available Image tunes\n *\n * @returns {{name: string, icon: string, title: string}[]}\n */\n static get tunes(): Tune[] {\n return [\n {\n name: \"stretched\",\n icon: svgs.stretched,\n title: \"Stretch image\"\n }\n ];\n }\n\n /**\n * Styles\n *\n * @returns {{wrapper: string, buttonBase: *, button: string, buttonActive: *}}\n */\n get CSS() {\n return {\n wrapper: \"\",\n buttonBase: this.api.styles.settingsButton,\n button: \"image-tool__tune\",\n buttonActive: this.api.styles.settingsButtonActive\n };\n }\n\n /**\n * Makes buttons with tunes: stretch image\n *\n * @param {ImageToolData} toolData - generate Elements of tunes\n * @returns {Element}\n */\n render(toolData: ImageToolData): HTMLElement {\n const wrapper = make(\"div\", this.CSS.wrapper);\n\n this.buttons = [];\n\n const tunes = Tunes.tunes.concat(this.actions);\n\n tunes.forEach(tune => {\n const title = this.api.i18n.t(tune.title);\n const el = make(\"div\", [this.CSS.buttonBase, this.CSS.button], {\n innerHTML: tune.icon,\n title\n });\n\n el.addEventListener(\"click\", () => {\n this.tuneClicked(tune.name, tune.action);\n });\n\n el.dataset[\"tune\"] = tune.name;\n const name = tune.name as keyof ImageToolData;\n el.classList.toggle(this.CSS.buttonActive, !!toolData[name]);\n\n this.buttons.push(el);\n\n this.api.tooltip.onHover(el, title, {\n placement: \"top\"\n });\n\n wrapper.appendChild(el);\n });\n\n return wrapper;\n }\n\n /**\n * Clicks to one of the tunes\n *\n * @param {string} tuneName - clicked tune name\n * @param {Function} customFunction - function to execute on click\n */\n tuneClicked(tuneName: string, customFunction?: TuneOnChangeCallable): boolean {\n if (typeof customFunction === \"function\") {\n if (!customFunction(tuneName)) {\n return false;\n }\n }\n\n const button = this.buttons.find(el => el.dataset[\"tune\"] === tuneName);\n\n if (button) {\n button.classList.toggle(\n this.CSS.buttonActive,\n !button.classList.contains(this.CSS.buttonActive)\n );\n }\n\n this.onChange(tuneName);\n return true;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["Tunes","api","actions","onChange","buttons","wrapper","buttonBase","styles","settingsButton","button","buttonActive","settingsButtonActive","toolData","make","CSS","tunes","concat","forEach","tune","title","i18n","t","el","innerHTML","icon","addEventListener","tuneClicked","name","action","dataset","classList","toggle","push","tooltip","onHover","placement","appendChild","tuneName","customFunction","find","contains","svgs","stretched"],"sources":["tunes.ts"],"sourcesContent":["import { API } from \"@editorjs/editorjs\";\nimport { make } from \"./ui\";\nimport svgs from \"./svgs\";\nimport { ImageToolData, Tune, TuneOnChangeCallable } from \"./types\";\n\ninterface TunesParams {\n api: API;\n actions: Tune[];\n onChange: TuneOnChangeCallable;\n}\n/**\n * Working with Block Tunes\n */\nexport default class Tunes {\n private api: API;\n private readonly actions: Tune[];\n private readonly onChange: TuneOnChangeCallable;\n private buttons: Array<HTMLElement>;\n /**\n * @param {object} tune - image tool Tunes managers\n * @param {object} tune.api - Editor API\n * @param {object} tune.actions - list of user defined tunes\n * @param {Function} tune.onChange - tune toggling callback\n */\n constructor({ api, actions, onChange }: TunesParams) {\n this.api = api;\n this.actions = actions;\n this.onChange = onChange;\n this.buttons = [];\n }\n\n /**\n * Available Image tunes\n *\n * @returns {{name: string, icon: string, title: string}[]}\n */\n static get tunes(): Tune[] {\n return [\n {\n name: \"stretched\",\n icon: svgs.stretched,\n title: \"Stretch image\"\n }\n ];\n }\n\n /**\n * Styles\n *\n * @returns {{wrapper: string, buttonBase: *, button: string, buttonActive: *}}\n */\n get CSS() {\n return {\n wrapper: \"\",\n buttonBase: this.api.styles.settingsButton,\n button: \"image-tool__tune\",\n buttonActive: this.api.styles.settingsButtonActive\n };\n }\n\n /**\n * Makes buttons with tunes: stretch image\n *\n * @param {ImageToolData} toolData - generate Elements of tunes\n * @returns {Element}\n */\n render(toolData: ImageToolData): HTMLElement {\n const wrapper = make(\"div\", this.CSS.wrapper);\n\n this.buttons = [];\n\n const tunes = Tunes.tunes.concat(this.actions);\n\n tunes.forEach(tune => {\n const title = this.api.i18n.t(tune.title);\n const el = make(\"div\", [this.CSS.buttonBase, this.CSS.button], {\n innerHTML: tune.icon,\n title\n });\n\n el.addEventListener(\"click\", () => {\n this.tuneClicked(tune.name, tune.action);\n });\n\n el.dataset[\"tune\"] = tune.name;\n const name = tune.name as keyof ImageToolData;\n el.classList.toggle(this.CSS.buttonActive, !!toolData[name]);\n\n this.buttons.push(el);\n\n this.api.tooltip.onHover(el, title, {\n placement: \"top\"\n });\n\n wrapper.appendChild(el);\n });\n\n return wrapper;\n }\n\n /**\n * Clicks to one of the tunes\n *\n * @param {string} tuneName - clicked tune name\n * @param {Function} customFunction - function to execute on click\n */\n tuneClicked(tuneName: string, customFunction?: TuneOnChangeCallable): boolean {\n if (typeof customFunction === \"function\") {\n if (!customFunction(tuneName)) {\n return false;\n }\n }\n\n const button = this.buttons.find(el => el.dataset[\"tune\"] === tuneName);\n\n if (button) {\n button.classList.toggle(\n this.CSS.buttonActive,\n !button.classList.contains(this.CSS.buttonActive)\n );\n }\n\n this.onChange(tuneName);\n return true;\n }\n}\n"],"mappings":"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"}
@@ -1,20 +1,14 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.make = exports.default = void 0;
9
-
10
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
9
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
10
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
-
18
12
  /**
19
13
  * Class for working with UI:
20
14
  * - rendering base structure
@@ -31,9 +25,9 @@ var Ui = /*#__PURE__*/function () {
31
25
  */
32
26
  function Ui(_ref) {
33
27
  var api = _ref.api,
34
- config = _ref.config,
35
- onSelectFile = _ref.onSelectFile,
36
- readOnly = _ref.readOnly;
28
+ config = _ref.config,
29
+ onSelectFile = _ref.onSelectFile,
30
+ readOnly = _ref.readOnly;
37
31
  (0, _classCallCheck2.default)(this, Ui);
38
32
  (0, _defineProperty2.default)(this, "api", void 0);
39
33
  (0, _defineProperty2.default)(this, "config", void 0);
@@ -53,6 +47,7 @@ var Ui = /*#__PURE__*/function () {
53
47
  contentEditable: !this.readOnly
54
48
  })
55
49
  };
50
+
56
51
  /**
57
52
  * Create base structure
58
53
  * <wrapper>
@@ -60,19 +55,17 @@ var Ui = /*#__PURE__*/function () {
60
55
  * <caption />
61
56
  * </wrapper>
62
57
  */
63
-
64
58
  this.nodes.caption.dataset["placeholder"] = this.config.captionPlaceholder;
65
59
  this.nodes.wrapper.appendChild(this.nodes.imageContainer);
66
60
  this.nodes.wrapper.appendChild(this.nodes.caption);
67
61
  this.nodes.wrapper.appendChild(this.nodes.fileButton);
68
62
  }
63
+
69
64
  /**
70
65
  * CSS classes
71
66
  *
72
67
  * @returns {object}
73
68
  */
74
-
75
-
76
69
  (0, _createClass2.default)(Ui, [{
77
70
  key: "CSS",
78
71
  get: function get() {
@@ -80,7 +73,6 @@ var Ui = /*#__PURE__*/function () {
80
73
  baseClass: this.api.styles.block,
81
74
  input: this.api.styles.input,
82
75
  button: this.api.styles.button,
83
-
84
76
  /**
85
77
  * Tool's classes
86
78
  */
@@ -90,6 +82,7 @@ var Ui = /*#__PURE__*/function () {
90
82
  caption: "image-tool__caption"
91
83
  };
92
84
  }
85
+
93
86
  /**
94
87
  * Ui statuses:
95
88
  * - empty
@@ -97,7 +90,6 @@ var Ui = /*#__PURE__*/function () {
97
90
  *
98
91
  * @returns {{EMPTY: string, UPLOADING: string, FILLED: string}}
99
92
  */
100
-
101
93
  }, {
102
94
  key: "render",
103
95
  value:
@@ -111,20 +103,18 @@ var Ui = /*#__PURE__*/function () {
111
103
  if (!toolData.file || Object.keys(toolData.file).length === 0) {
112
104
  this.toggleStatus(Ui.status.EMPTY);
113
105
  }
114
-
115
106
  return this.nodes.wrapper;
116
107
  }
108
+
117
109
  /**
118
110
  * Creates upload-file button
119
111
  *
120
112
  * @returns {Element}
121
113
  */
122
-
123
114
  }, {
124
115
  key: "createFileButton",
125
116
  value: function createFileButton() {
126
117
  var _this = this;
127
-
128
118
  var button = make("div", [this.CSS.button]);
129
119
  button.innerHTML = this.api.i18n.t("Select an Image");
130
120
  button.addEventListener("click", function () {
@@ -132,18 +122,17 @@ var Ui = /*#__PURE__*/function () {
132
122
  });
133
123
  return button;
134
124
  }
125
+
135
126
  /**
136
127
  * Shows an image
137
128
  *
138
129
  * @param {string} url - image source
139
130
  * @returns {void}
140
131
  */
141
-
142
132
  }, {
143
133
  key: "fillImage",
144
134
  value: function fillImage(url) {
145
135
  var _this2 = this;
146
-
147
136
  /**
148
137
  * Check for a source extension to compose element correctly: video tag for mp4, img — for others
149
138
  */
@@ -151,6 +140,7 @@ var Ui = /*#__PURE__*/function () {
151
140
  var attributes = {
152
141
  src: url
153
142
  };
143
+
154
144
  /**
155
145
  * We use eventName variable because IMG and VIDEO tags have different event to be called on source load
156
146
  * - IMG: load
@@ -158,12 +148,11 @@ var Ui = /*#__PURE__*/function () {
158
148
  *
159
149
  * @type {string}
160
150
  */
161
-
162
151
  var eventName = "load";
152
+
163
153
  /**
164
154
  * Update attributes and eventName if source is a mp4 video
165
155
  */
166
-
167
156
  if (tag === "VIDEO") {
168
157
  /**
169
158
  * Add attributes for playing muted mp4 as a gif
@@ -174,54 +163,52 @@ var Ui = /*#__PURE__*/function () {
174
163
  attributes.loop = true;
175
164
  attributes.muted = true;
176
165
  attributes.playsinline = true;
166
+
177
167
  /**
178
168
  * Change event to be listened
179
169
  *
180
170
  * @type {string}
181
171
  */
182
-
183
172
  eventName = "loadeddata";
184
173
  }
174
+
185
175
  /**
186
176
  * Compose tag with defined attributes
187
177
  *
188
178
  * @type {Element}
189
179
  */
190
-
191
-
192
180
  this.nodes.imageEl = make(tag, this.CSS.imageEl, attributes);
181
+
193
182
  /**
194
183
  * Add load event listener
195
184
  */
196
-
197
185
  this.nodes.imageEl.addEventListener(eventName, function () {
198
186
  _this2.toggleStatus(Ui.status.FILLED);
199
187
  });
200
188
  this.nodes.imageContainer.appendChild(this.nodes.imageEl);
201
189
  }
190
+
202
191
  /**
203
192
  * Shows caption input
204
193
  *
205
194
  * @param {string} text - caption text
206
195
  * @returns {void}
207
196
  */
208
-
209
197
  }, {
210
198
  key: "fillCaption",
211
199
  value: function fillCaption(text) {
212
200
  if (!this.nodes.caption) {
213
201
  return;
214
202
  }
215
-
216
203
  this.nodes.caption.innerHTML = text;
217
204
  }
205
+
218
206
  /**
219
207
  * Changes UI status
220
208
  *
221
209
  * @param {string} status - see {@link Ui.status} constants
222
210
  * @returns {void}
223
211
  */
224
-
225
212
  }, {
226
213
  key: "toggleStatus",
227
214
  value: function toggleStatus(status) {
@@ -229,11 +216,11 @@ var Ui = /*#__PURE__*/function () {
229
216
  if (Object.prototype.hasOwnProperty.call(Ui.status, statusType) === false) {
230
217
  continue;
231
218
  }
232
-
233
219
  var newStatus = Ui.status[statusType];
234
220
  this.nodes.wrapper.classList.toggle("".concat(this.CSS.wrapper, "--").concat(newStatus), status === newStatus);
235
221
  }
236
222
  }
223
+
237
224
  /**
238
225
  * Apply visual representation of activated tune
239
226
  *
@@ -241,7 +228,6 @@ var Ui = /*#__PURE__*/function () {
241
228
  * @param {boolean} status - true for enable, false for disable
242
229
  * @returns {void}
243
230
  */
244
-
245
231
  }, {
246
232
  key: "applyTune",
247
233
  value: function applyTune(tuneName, status) {
@@ -266,27 +252,20 @@ var Ui = /*#__PURE__*/function () {
266
252
  * @param {object} attributes - any attributes
267
253
  * @returns {HTMLElement}
268
254
  */
269
-
270
-
271
255
  exports.default = Ui;
272
-
273
256
  var make = function make(tagName) {
274
257
  var classNames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
275
258
  var attributes = arguments.length > 2 ? arguments[2] : undefined;
276
259
  var el = document.createElement(tagName);
277
-
278
260
  if (Array.isArray(classNames)) {
279
261
  var _el$classList;
280
-
281
262
  (_el$classList = el.classList).add.apply(_el$classList, (0, _toConsumableArray2.default)(classNames));
282
263
  } else if (classNames) {
283
264
  el.classList.add(classNames);
284
265
  }
285
-
286
266
  if (!attributes) {
287
267
  return el;
288
268
  }
289
-
290
269
  for (var attrName in attributes) {
291
270
  /**
292
271
  * Unfortunately it is a problem to map attributes to element because element is complaining
@@ -294,8 +273,6 @@ var make = function make(tagName) {
294
273
  */
295
274
  el[attrName] = attributes[attrName];
296
275
  }
297
-
298
276
  return el;
299
277
  };
300
-
301
278
  exports.make = make;
@@ -1 +1 @@
1
- {"version":3,"names":["Ui","api","config","onSelectFile","readOnly","nodes","wrapper","make","CSS","baseClass","imageContainer","fileButton","createFileButton","imageEl","undefined","caption","input","contentEditable","dataset","captionPlaceholder","appendChild","styles","block","button","toolData","file","Object","keys","length","toggleStatus","status","EMPTY","innerHTML","i18n","t","addEventListener","url","tag","test","attributes","src","eventName","autoplay","loop","muted","playsinline","FILLED","text","statusType","prototype","hasOwnProperty","call","newStatus","classList","toggle","tuneName","tagName","classNames","el","document","createElement","Array","isArray","add","attrName"],"sources":["ui.ts"],"sourcesContent":["import { API } from \"@editorjs/editorjs\";\nimport { ImageToolConfig, ImageToolData } from \"./types\";\n\ninterface OnSelectFileCallable {\n (): void;\n}\ninterface UiStatus {\n EMPTY: \"empty\";\n FILLED: \"filled\";\n [key: string]: string;\n}\ninterface UiParams {\n api: API;\n config: ImageToolConfig;\n onSelectFile: OnSelectFileCallable;\n readOnly: boolean;\n}\n/**\n * Class for working with UI:\n * - rendering base structure\n * - show/hide preview\n * - apply tune view\n */\nexport default class Ui {\n private api: API;\n private config: ImageToolConfig;\n private readonly readOnly: boolean;\n private readonly onSelectFile: OnSelectFileCallable;\n\n public readonly nodes: {\n wrapper: HTMLElement;\n imageContainer: HTMLElement;\n fileButton: HTMLElement;\n imageEl?: HTMLElement;\n caption: HTMLElement;\n };\n\n /**\n * @param ui - image tool Ui module\n * @param ui.api - Editor.js API\n * @param ui.config - user config\n * @param ui.onSelectFile - callback for clicks on Select file button\n * @param ui.readOnly - read-only mode flag\n */\n constructor({ api, config, onSelectFile, readOnly }: UiParams) {\n this.api = api;\n this.config = config;\n this.onSelectFile = onSelectFile;\n this.readOnly = readOnly;\n this.nodes = {\n wrapper: make(\"div\", [this.CSS.baseClass, this.CSS.wrapper]),\n imageContainer: make(\"div\", [this.CSS.imageContainer]),\n fileButton: this.createFileButton(),\n imageEl: undefined,\n caption: make(\"div\", [this.CSS.input, this.CSS.caption], {\n contentEditable: !this.readOnly\n })\n };\n\n /**\n * Create base structure\n * <wrapper>\n * <image-container/>\n * <caption />\n * </wrapper>\n */\n this.nodes.caption.dataset[\"placeholder\"] = this.config.captionPlaceholder;\n this.nodes.wrapper.appendChild(this.nodes.imageContainer);\n this.nodes.wrapper.appendChild(this.nodes.caption);\n this.nodes.wrapper.appendChild(this.nodes.fileButton);\n }\n\n /**\n * CSS classes\n *\n * @returns {object}\n */\n get CSS() {\n return {\n baseClass: this.api.styles.block,\n input: this.api.styles.input,\n button: this.api.styles.button,\n\n /**\n * Tool's classes\n */\n wrapper: \"image-tool\",\n imageContainer: \"image-tool__image\",\n imageEl: \"image-tool__image-picture\",\n caption: \"image-tool__caption\"\n };\n }\n\n /**\n * Ui statuses:\n * - empty\n * - filled\n *\n * @returns {{EMPTY: string, UPLOADING: string, FILLED: string}}\n */\n static get status(): UiStatus {\n return {\n EMPTY: \"empty\",\n FILLED: \"filled\"\n };\n }\n\n /**\n * Renders tool UI\n *\n * @param {ImageToolData} toolData - saved tool data\n * @returns {Element}\n */\n render(toolData: ImageToolData) {\n if (!toolData.file || Object.keys(toolData.file).length === 0) {\n this.toggleStatus(Ui.status.EMPTY);\n }\n\n return this.nodes.wrapper;\n }\n\n /**\n * Creates upload-file button\n *\n * @returns {Element}\n */\n createFileButton() {\n const button = make(\"div\", [this.CSS.button]);\n\n button.innerHTML = this.api.i18n.t(\"Select an Image\");\n\n button.addEventListener(\"click\", () => {\n this.onSelectFile();\n });\n\n return button;\n }\n\n /**\n * Shows an image\n *\n * @param {string} url - image source\n * @returns {void}\n */\n public fillImage(url: string): void {\n /**\n * Check for a source extension to compose element correctly: video tag for mp4, img — for others\n */\n const tag = /\\.mp4$/.test(url) ? \"VIDEO\" : \"IMG\";\n\n const attributes: any = {\n src: url\n };\n\n /**\n * We use eventName variable because IMG and VIDEO tags have different event to be called on source load\n * - IMG: load\n * - VIDEO: loadeddata\n *\n * @type {string}\n */\n let eventName = \"load\";\n\n /**\n * Update attributes and eventName if source is a mp4 video\n */\n if (tag === \"VIDEO\") {\n /**\n * Add attributes for playing muted mp4 as a gif\n *\n * @type {boolean}\n */\n attributes.autoplay = true;\n attributes.loop = true;\n attributes.muted = true;\n attributes.playsinline = true;\n\n /**\n * Change event to be listened\n *\n * @type {string}\n */\n eventName = \"loadeddata\";\n }\n\n /**\n * Compose tag with defined attributes\n *\n * @type {Element}\n */\n this.nodes.imageEl = make(tag, this.CSS.imageEl, attributes);\n\n /**\n * Add load event listener\n */\n this.nodes.imageEl.addEventListener(eventName, () => {\n this.toggleStatus(Ui.status.FILLED);\n });\n\n this.nodes.imageContainer.appendChild(this.nodes.imageEl);\n }\n\n /**\n * Shows caption input\n *\n * @param {string} text - caption text\n * @returns {void}\n */\n public fillCaption(text: string): void {\n if (!this.nodes.caption) {\n return;\n }\n this.nodes.caption.innerHTML = text;\n }\n\n /**\n * Changes UI status\n *\n * @param {string} status - see {@link Ui.status} constants\n * @returns {void}\n */\n public toggleStatus(status: string): void {\n for (const statusType in Ui.status) {\n if (Object.prototype.hasOwnProperty.call(Ui.status, statusType) === false) {\n continue;\n }\n const newStatus = Ui.status[statusType];\n this.nodes.wrapper.classList.toggle(\n `${this.CSS.wrapper}--${newStatus}`,\n status === newStatus\n );\n }\n }\n\n /**\n * Apply visual representation of activated tune\n *\n * @param {string} tuneName - one of available tunes {@link Tunes.tunes}\n * @param {boolean} status - true for enable, false for disable\n * @returns {void}\n */\n public applyTune(tuneName: string, status: boolean) {\n this.nodes.wrapper.classList.toggle(`${this.CSS.wrapper}--${tuneName}`, status);\n }\n}\n\n/**\n * Helper for making Elements with attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {Array|string} classNames - list or name of CSS class\n * @param {object} attributes - any attributes\n * @returns {HTMLElement}\n */\nexport const make = function make(\n tagName: string,\n classNames: string[] | string | null = null,\n attributes?: Record<string, string | number | boolean>\n): HTMLElement {\n const el: HTMLElement = document.createElement(tagName);\n\n if (Array.isArray(classNames)) {\n el.classList.add(...classNames);\n } else if (classNames) {\n el.classList.add(classNames);\n }\n\n if (!attributes) {\n return el;\n }\n for (const attrName in attributes) {\n /**\n * Unfortunately it is a problem to map attributes to element because element is complaining\n * that attrName is a string, which cannot index the HTMLElement\n */\n (el as any)[attrName] = (attributes as any)[attrName];\n }\n\n return el;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["Ui","api","config","onSelectFile","readOnly","nodes","wrapper","make","CSS","baseClass","imageContainer","fileButton","createFileButton","imageEl","undefined","caption","input","contentEditable","dataset","captionPlaceholder","appendChild","styles","block","button","toolData","file","Object","keys","length","toggleStatus","status","EMPTY","innerHTML","i18n","t","addEventListener","url","tag","test","attributes","src","eventName","autoplay","loop","muted","playsinline","FILLED","text","statusType","prototype","hasOwnProperty","call","newStatus","classList","toggle","tuneName","tagName","classNames","el","document","createElement","Array","isArray","add","attrName"],"sources":["ui.ts"],"sourcesContent":["import { API } from \"@editorjs/editorjs\";\nimport { ImageToolConfig, ImageToolData } from \"./types\";\n\ninterface OnSelectFileCallable {\n (): void;\n}\ninterface UiStatus {\n EMPTY: \"empty\";\n FILLED: \"filled\";\n [key: string]: string;\n}\ninterface UiParams {\n api: API;\n config: ImageToolConfig;\n onSelectFile: OnSelectFileCallable;\n readOnly: boolean;\n}\n/**\n * Class for working with UI:\n * - rendering base structure\n * - show/hide preview\n * - apply tune view\n */\nexport default class Ui {\n private api: API;\n private config: ImageToolConfig;\n private readonly readOnly: boolean;\n private readonly onSelectFile: OnSelectFileCallable;\n\n public readonly nodes: {\n wrapper: HTMLElement;\n imageContainer: HTMLElement;\n fileButton: HTMLElement;\n imageEl?: HTMLElement;\n caption: HTMLElement;\n };\n\n /**\n * @param ui - image tool Ui module\n * @param ui.api - Editor.js API\n * @param ui.config - user config\n * @param ui.onSelectFile - callback for clicks on Select file button\n * @param ui.readOnly - read-only mode flag\n */\n constructor({ api, config, onSelectFile, readOnly }: UiParams) {\n this.api = api;\n this.config = config;\n this.onSelectFile = onSelectFile;\n this.readOnly = readOnly;\n this.nodes = {\n wrapper: make(\"div\", [this.CSS.baseClass, this.CSS.wrapper]),\n imageContainer: make(\"div\", [this.CSS.imageContainer]),\n fileButton: this.createFileButton(),\n imageEl: undefined,\n caption: make(\"div\", [this.CSS.input, this.CSS.caption], {\n contentEditable: !this.readOnly\n })\n };\n\n /**\n * Create base structure\n * <wrapper>\n * <image-container/>\n * <caption />\n * </wrapper>\n */\n this.nodes.caption.dataset[\"placeholder\"] = this.config.captionPlaceholder;\n this.nodes.wrapper.appendChild(this.nodes.imageContainer);\n this.nodes.wrapper.appendChild(this.nodes.caption);\n this.nodes.wrapper.appendChild(this.nodes.fileButton);\n }\n\n /**\n * CSS classes\n *\n * @returns {object}\n */\n get CSS() {\n return {\n baseClass: this.api.styles.block,\n input: this.api.styles.input,\n button: this.api.styles.button,\n\n /**\n * Tool's classes\n */\n wrapper: \"image-tool\",\n imageContainer: \"image-tool__image\",\n imageEl: \"image-tool__image-picture\",\n caption: \"image-tool__caption\"\n };\n }\n\n /**\n * Ui statuses:\n * - empty\n * - filled\n *\n * @returns {{EMPTY: string, UPLOADING: string, FILLED: string}}\n */\n static get status(): UiStatus {\n return {\n EMPTY: \"empty\",\n FILLED: \"filled\"\n };\n }\n\n /**\n * Renders tool UI\n *\n * @param {ImageToolData} toolData - saved tool data\n * @returns {Element}\n */\n render(toolData: ImageToolData) {\n if (!toolData.file || Object.keys(toolData.file).length === 0) {\n this.toggleStatus(Ui.status.EMPTY);\n }\n\n return this.nodes.wrapper;\n }\n\n /**\n * Creates upload-file button\n *\n * @returns {Element}\n */\n createFileButton() {\n const button = make(\"div\", [this.CSS.button]);\n\n button.innerHTML = this.api.i18n.t(\"Select an Image\");\n\n button.addEventListener(\"click\", () => {\n this.onSelectFile();\n });\n\n return button;\n }\n\n /**\n * Shows an image\n *\n * @param {string} url - image source\n * @returns {void}\n */\n public fillImage(url: string): void {\n /**\n * Check for a source extension to compose element correctly: video tag for mp4, img — for others\n */\n const tag = /\\.mp4$/.test(url) ? \"VIDEO\" : \"IMG\";\n\n const attributes: any = {\n src: url\n };\n\n /**\n * We use eventName variable because IMG and VIDEO tags have different event to be called on source load\n * - IMG: load\n * - VIDEO: loadeddata\n *\n * @type {string}\n */\n let eventName = \"load\";\n\n /**\n * Update attributes and eventName if source is a mp4 video\n */\n if (tag === \"VIDEO\") {\n /**\n * Add attributes for playing muted mp4 as a gif\n *\n * @type {boolean}\n */\n attributes.autoplay = true;\n attributes.loop = true;\n attributes.muted = true;\n attributes.playsinline = true;\n\n /**\n * Change event to be listened\n *\n * @type {string}\n */\n eventName = \"loadeddata\";\n }\n\n /**\n * Compose tag with defined attributes\n *\n * @type {Element}\n */\n this.nodes.imageEl = make(tag, this.CSS.imageEl, attributes);\n\n /**\n * Add load event listener\n */\n this.nodes.imageEl.addEventListener(eventName, () => {\n this.toggleStatus(Ui.status.FILLED);\n });\n\n this.nodes.imageContainer.appendChild(this.nodes.imageEl);\n }\n\n /**\n * Shows caption input\n *\n * @param {string} text - caption text\n * @returns {void}\n */\n public fillCaption(text: string): void {\n if (!this.nodes.caption) {\n return;\n }\n this.nodes.caption.innerHTML = text;\n }\n\n /**\n * Changes UI status\n *\n * @param {string} status - see {@link Ui.status} constants\n * @returns {void}\n */\n public toggleStatus(status: string): void {\n for (const statusType in Ui.status) {\n if (Object.prototype.hasOwnProperty.call(Ui.status, statusType) === false) {\n continue;\n }\n const newStatus = Ui.status[statusType];\n this.nodes.wrapper.classList.toggle(\n `${this.CSS.wrapper}--${newStatus}`,\n status === newStatus\n );\n }\n }\n\n /**\n * Apply visual representation of activated tune\n *\n * @param {string} tuneName - one of available tunes {@link Tunes.tunes}\n * @param {boolean} status - true for enable, false for disable\n * @returns {void}\n */\n public applyTune(tuneName: string, status: boolean) {\n this.nodes.wrapper.classList.toggle(`${this.CSS.wrapper}--${tuneName}`, status);\n }\n}\n\n/**\n * Helper for making Elements with attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {Array|string} classNames - list or name of CSS class\n * @param {object} attributes - any attributes\n * @returns {HTMLElement}\n */\nexport const make = function make(\n tagName: string,\n classNames: string[] | string | null = null,\n attributes?: Record<string, string | number | boolean>\n): HTMLElement {\n const el: HTMLElement = document.createElement(tagName);\n\n if (Array.isArray(classNames)) {\n el.classList.add(...classNames);\n } else if (classNames) {\n el.classList.add(classNames);\n }\n\n if (!attributes) {\n return el;\n }\n for (const attrName in attributes) {\n /**\n * Unfortunately it is a problem to map attributes to element because element is complaining\n * that attrName is a string, which cannot index the HTMLElement\n */\n (el as any)[attrName] = (attributes as any)[attrName];\n }\n\n return el;\n};\n"],"mappings":"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"}