umberto 7.0.2 → 8.0.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 (554) hide show
  1. package/CHANGELOG.md +20 -1799
  2. package/LICENSE.md +44 -5
  3. package/README.md +194 -9
  4. package/package.json +4 -8
  5. package/scripts/filter/after-post-render/gloria/append-copy-heading-buttons.js +99 -0
  6. package/scripts/filter/after-post-render/gloria/apply-design-doc-classes.js +145 -0
  7. package/scripts/filter/after-post-render/gloria/wrap-table-into-wrappers.js +30 -0
  8. package/scripts/filter/after-post-render/img-linker.js +1 -1
  9. package/scripts/filter/after-post-render/insert-error-codes.js +1 -1
  10. package/scripts/filter/after-post-render/linker.js +1 -1
  11. package/scripts/filter/after-post-render/snippets.js +5 -1
  12. package/scripts/filter/after-render/gloria/inline-svg.js +14 -0
  13. package/scripts/filter/after-render/gloria/spritesheet-svg.js +14 -0
  14. package/scripts/filter/before-post-render/add-project-info-to-page.js +1 -1
  15. package/scripts/filter/before-post-render/code-switcher.js +4 -0
  16. package/scripts/filter/before-post-render/execute-and-insert-function-results.js +3 -1
  17. package/scripts/filter/before-post-render/gloria/add-breadcrumbs-data-to-page.js +269 -0
  18. package/scripts/filter/before-post-render/gloria/prerender-admonitions.js +27 -0
  19. package/scripts/filter/before-post-render/gloria/prerender-xml-pug-components.js +339 -0
  20. package/scripts/filter/before-post-render/gloria/render-post-render-pug-components.js +94 -0
  21. package/scripts/filter/before-post-render/set-layout.js +4 -2
  22. package/scripts/helper/parse-href.js +28 -0
  23. package/scripts/helper/u-capitalize.js +13 -0
  24. package/scripts/helper/u-random-id.js +16 -0
  25. package/scripts/helper/u-remove-indentation.js +13 -0
  26. package/scripts/helper/u-toc.js +2 -63
  27. package/scripts/utils/add-indention.js +16 -0
  28. package/scripts/utils/capitalize.js +17 -0
  29. package/scripts/utils/concat-url-parts.js +19 -0
  30. package/scripts/utils/decode-html-entities.js +25 -0
  31. package/scripts/utils/drop-init-slash.js +14 -0
  32. package/scripts/utils/drop-trailing-slash.js +14 -0
  33. package/scripts/utils/drop-url-protocol.js +10 -0
  34. package/scripts/utils/inline-svg.js +152 -0
  35. package/scripts/utils/measure-call.js +16 -0
  36. package/scripts/utils/parse-href.js +37 -0
  37. package/scripts/utils/parseicontag.js +1 -1
  38. package/scripts/utils/parselinks.js +27 -6
  39. package/scripts/utils/parser-cursor.js +280 -0
  40. package/scripts/utils/pipe.js +17 -0
  41. package/scripts/utils/pug-renderer/create-prerender-pug-template.js +172 -0
  42. package/scripts/utils/pug-renderer/render-pug-component.js +73 -0
  43. package/scripts/utils/pug-to-xml-binding/parser/walk-xml-tree.js +150 -0
  44. package/scripts/utils/pug-to-xml-binding/parser/xml-components-parser.js +414 -0
  45. package/scripts/utils/pug-to-xml-binding/render-xml-pug-components-in-markdown.js +193 -0
  46. package/scripts/utils/pug-to-xml-binding/transform-xml-tree-to-pug.js +144 -0
  47. package/scripts/utils/random-id.js +67 -0
  48. package/scripts/utils/remove-indentation.js +48 -0
  49. package/scripts/utils/spritesheet-svg.js +183 -0
  50. package/scripts/utils/toc.js +71 -0
  51. package/scripts/utils/transform-markdown-admonitions.js +98 -0
  52. package/scripts/utils/uniq-by-last.js +32 -0
  53. package/src/api-builder/api-builder.js +49 -18
  54. package/src/api-builder/classes/description-parser.js +61 -10
  55. package/src/api-builder/classes/doc-data-factory.js +2 -2
  56. package/src/helpers/github-url.js +1 -1
  57. package/src/helpers/templates/scripts/default.js +1 -1
  58. package/src/helpers/templates/scripts/group.js +1 -1
  59. package/src/hexo/filter/project-locals.js +9 -0
  60. package/src/hexo/get-repo-urls.js +1 -1
  61. package/src/hexo/project-globals.js +4 -0
  62. package/src/hexo-manager.js +7 -2
  63. package/src/sdk-builder/sdk-builder.js +4 -4
  64. package/src/tasks/build-api-docs.js +5 -5
  65. package/src/tasks/build-documentation.js +45 -22
  66. package/src/tasks/cache-files.js +2 -2
  67. package/src/tasks/compile-sass.js +12 -0
  68. package/src/tasks/copy-assets.js +4 -0
  69. package/src/tasks/copy-project-icons.js +1 -1
  70. package/src/tasks/get-extra-files.js +1 -1
  71. package/src/tasks/get-project-config.js +1 -1
  72. package/src/tasks/overwrite-api-guides.js +1 -1
  73. package/themes/umberto/layout/gloria/404.pug +25 -16
  74. package/themes/umberto/layout/gloria/_api-docs/_header/_style.scss +31 -0
  75. package/themes/umberto/layout/gloria/_api-docs/_header/index.pug +50 -0
  76. package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-see-source.pug +1 -4
  77. package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-tree-item.pug +34 -26
  78. package/themes/umberto/layout/gloria/_api-docs/_mixin/_class-item.pug +20 -13
  79. package/themes/umberto/layout/gloria/_api-docs/_mixin/_dev-names.pug +1 -1
  80. package/themes/umberto/layout/gloria/_api-docs/_mixin/_error.pug +10 -5
  81. package/themes/umberto/layout/gloria/_api-docs/_mixin/_hierarchy-list.pug +1 -1
  82. package/themes/umberto/layout/gloria/_api-docs/_mixin/_link-or-text.pug +1 -1
  83. package/themes/umberto/layout/gloria/_api-docs/_mixin/_method.pug +45 -39
  84. package/themes/umberto/layout/gloria/_api-docs/_mixin/_property.pug +26 -20
  85. package/themes/umberto/layout/gloria/_api-docs/_mixin/_related.pug +1 -1
  86. package/themes/umberto/layout/gloria/_api-docs/_mixin/_toc-list-item.pug +11 -0
  87. package/themes/umberto/layout/gloria/_api-docs/_partial/api-subheader.pug +0 -11
  88. package/themes/umberto/layout/gloria/_api-docs/_partial/api-toc.pug +33 -0
  89. package/themes/umberto/layout/gloria/_api-docs/_partial/classes.pug +5 -4
  90. package/themes/umberto/layout/gloria/_api-docs/_partial/config-options.pug +5 -4
  91. package/themes/umberto/layout/gloria/_api-docs/_partial/constants.pug +1 -1
  92. package/themes/umberto/layout/gloria/_api-docs/_partial/description.pug +2 -2
  93. package/themes/umberto/layout/gloria/_api-docs/_partial/events.pug +5 -4
  94. package/themes/umberto/layout/gloria/_api-docs/_partial/functions.pug +5 -4
  95. package/themes/umberto/layout/gloria/_api-docs/_partial/interfaces.pug +1 -1
  96. package/themes/umberto/layout/gloria/_api-docs/_partial/methods.pug +14 -13
  97. package/themes/umberto/layout/gloria/_api-docs/_partial/namespaces.pug +1 -1
  98. package/themes/umberto/layout/gloria/_api-docs/_partial/navtree.pug +4 -11
  99. package/themes/umberto/layout/gloria/_api-docs/_partial/properties.pug +14 -13
  100. package/themes/umberto/layout/gloria/_api-docs/_partial/type-parameters.pug +15 -12
  101. package/themes/umberto/layout/gloria/_api-docs/_partial/typedefs.pug +5 -4
  102. package/themes/umberto/layout/gloria/_api-docs/_subheader/_style.scss +5 -0
  103. package/themes/umberto/layout/gloria/_api-docs/_subheader/index.pug +10 -0
  104. package/themes/umberto/layout/gloria/_api-docs/_toc/_style.scss +227 -0
  105. package/themes/umberto/layout/gloria/_api-docs/_toc/index.pug +11 -0
  106. package/themes/umberto/layout/gloria/_api-docs/api-base.pug +24 -24
  107. package/themes/umberto/layout/gloria/_api-docs/class.pug +4 -4
  108. package/themes/umberto/layout/gloria/_api-docs/errors.pug +3 -3
  109. package/themes/umberto/layout/gloria/_api-docs/index.pug +3 -0
  110. package/themes/umberto/layout/gloria/_api-docs/interface.pug +4 -4
  111. package/themes/umberto/layout/gloria/_api-docs/mixin.pug +4 -4
  112. package/themes/umberto/layout/gloria/_api-docs/module.pug +4 -4
  113. package/themes/umberto/layout/gloria/_api-docs/namespace.pug +4 -4
  114. package/themes/umberto/layout/gloria/_api-docs/typedef.pug +22 -22
  115. package/themes/umberto/layout/gloria/_components/badge/_style.scss +27 -0
  116. package/themes/umberto/layout/gloria/_components/badge/index.pug +30 -0
  117. package/themes/umberto/layout/gloria/_components/banner/_style.scss +133 -0
  118. package/themes/umberto/layout/gloria/_components/banner/index.pug +3 -0
  119. package/themes/umberto/layout/gloria/_components/button/_style.scss +183 -0
  120. package/themes/umberto/layout/gloria/_components/button/index.pug +140 -0
  121. package/themes/umberto/layout/gloria/_components/callout/_style.scss +56 -0
  122. package/themes/umberto/layout/gloria/_components/callout/index.pug +87 -0
  123. package/themes/umberto/layout/gloria/_components/card/_style.scss +101 -0
  124. package/themes/umberto/layout/gloria/_components/card/index.pug +131 -0
  125. package/themes/umberto/layout/gloria/_components/card-learn-more-links/_style.scss +9 -0
  126. package/themes/umberto/layout/gloria/_components/card-learn-more-links/index.pug +56 -0
  127. package/themes/umberto/layout/gloria/_components/checkbox/_style.scss +117 -0
  128. package/themes/umberto/layout/gloria/_components/checkbox/index.pug +35 -0
  129. package/themes/umberto/layout/gloria/_components/cke5-code-switcher/index.pug +39 -0
  130. package/themes/umberto/layout/gloria/_components/code-block/_style.scss +111 -0
  131. package/themes/umberto/layout/gloria/_components/code-block/index.pug +67 -0
  132. package/themes/umberto/layout/gloria/_components/code-switcher/_style.scss +41 -0
  133. package/themes/umberto/layout/gloria/_components/code-switcher/index.pug +31 -0
  134. package/themes/umberto/layout/gloria/_components/columns/_style.scss +54 -0
  135. package/themes/umberto/layout/gloria/_components/columns/index.pug +30 -0
  136. package/themes/umberto/layout/gloria/_components/divider/_style.scss +6 -0
  137. package/themes/umberto/layout/gloria/_components/divider/index.pug +13 -0
  138. package/themes/umberto/layout/gloria/_components/dropdown/_style.scss +88 -0
  139. package/themes/umberto/layout/gloria/_components/dropdown/index.pug +77 -0
  140. package/themes/umberto/layout/gloria/_components/fake-devtools/_style.scss +233 -0
  141. package/themes/umberto/layout/gloria/_components/fake-devtools/index.pug +27 -0
  142. package/themes/umberto/layout/gloria/_components/heading-badge/index.pug +17 -0
  143. package/themes/umberto/layout/gloria/_components/heading-link/_style.scss +47 -0
  144. package/themes/umberto/layout/gloria/_components/heading-link/index.pug +26 -0
  145. package/themes/umberto/layout/gloria/_components/icon/_style.scss +12 -0
  146. package/themes/umberto/layout/gloria/_components/icon/index.pug +75 -0
  147. package/themes/umberto/layout/gloria/_components/icon-message/_style.scss +13 -0
  148. package/themes/umberto/layout/gloria/_components/icon-message/index.pug +17 -0
  149. package/themes/umberto/layout/gloria/_components/iframe/_style.scss +10 -0
  150. package/themes/umberto/layout/gloria/_components/iframe/index.pug +22 -0
  151. package/themes/umberto/layout/gloria/_components/img/index.pug +17 -0
  152. package/themes/umberto/layout/gloria/_components/index.pug +31 -0
  153. package/themes/umberto/layout/gloria/_components/input/_style.scss +82 -0
  154. package/themes/umberto/layout/gloria/_components/input/index.pug +34 -0
  155. package/themes/umberto/layout/gloria/_components/json-ld/index.pug +3 -0
  156. package/themes/umberto/layout/gloria/_components/keyboard-shortcut/_style.scss +49 -0
  157. package/themes/umberto/layout/gloria/_components/keyboard-shortcut/index.pug +23 -0
  158. package/themes/umberto/layout/gloria/_components/menu-dropdown/_style.scss +27 -0
  159. package/themes/umberto/layout/gloria/_components/menu-dropdown/index.pug +40 -0
  160. package/themes/umberto/layout/gloria/_components/mobile-overlay/_style.scss +70 -0
  161. package/themes/umberto/layout/gloria/_components/mobile-overlay/index.pug +37 -0
  162. package/themes/umberto/layout/gloria/_components/nav-tree/_style.scss +104 -0
  163. package/themes/umberto/layout/gloria/_components/nav-tree/index.pug +6 -0
  164. package/themes/umberto/layout/gloria/_components/nav-tree/nav-tree-item.pug +23 -0
  165. package/themes/umberto/layout/gloria/{_mixin → _components/nav-tree}/nav-tree-level.pug +31 -11
  166. package/themes/umberto/layout/gloria/_components/skeleton/_style.scss +22 -0
  167. package/themes/umberto/layout/gloria/_components/skeleton/index.pug +16 -0
  168. package/themes/umberto/layout/gloria/_components/spacer/_style.scss +9 -0
  169. package/themes/umberto/layout/gloria/_components/spacer/index.pug +19 -0
  170. package/themes/umberto/layout/gloria/_components/svg/index.pug +70 -0
  171. package/themes/umberto/layout/gloria/_components/tabs/_style.scss +80 -0
  172. package/themes/umberto/layout/gloria/_components/tabs/index.pug +81 -0
  173. package/themes/umberto/layout/gloria/_components/tag/_style.scss +79 -0
  174. package/themes/umberto/layout/gloria/_components/tag/index.pug +17 -0
  175. package/themes/umberto/layout/gloria/_components/tooltip-popover/_style.scss +194 -0
  176. package/themes/umberto/layout/gloria/_components/tooltip-popover/index.pug +38 -0
  177. package/themes/umberto/layout/gloria/_head/head-preloads.pug +32 -0
  178. package/themes/umberto/layout/gloria/{_partial → _head}/head.pug +8 -4
  179. package/themes/umberto/layout/gloria/_head/index.pug +1 -0
  180. package/themes/umberto/layout/gloria/_modules/algolia-search/_style.scss +202 -0
  181. package/themes/umberto/layout/gloria/_modules/algolia-search/_third-party.scss +1 -0
  182. package/themes/umberto/layout/gloria/_modules/algolia-search/index.pug +38 -0
  183. package/themes/umberto/layout/gloria/_modules/breadcrumbs/_style.scss +68 -0
  184. package/themes/umberto/layout/gloria/_modules/breadcrumbs/index.pug +18 -0
  185. package/themes/umberto/layout/gloria/_modules/footer/_style.scss +40 -0
  186. package/themes/umberto/layout/gloria/_modules/footer/index.pug +87 -0
  187. package/themes/umberto/layout/gloria/_modules/header/_style.scss +181 -0
  188. package/themes/umberto/layout/gloria/_modules/header/index.pug +70 -0
  189. package/themes/umberto/layout/gloria/_modules/header/nav-link.pug +19 -0
  190. package/themes/umberto/layout/gloria/_modules/header/nav-links.pug +11 -0
  191. package/themes/umberto/layout/gloria/_modules/header/nav-project-select-dropdown.pug +16 -0
  192. package/themes/umberto/layout/gloria/_modules/header/nav-suffix-links.pug +20 -0
  193. package/themes/umberto/layout/gloria/_modules/header-bar/_style.scss +56 -0
  194. package/themes/umberto/layout/gloria/_modules/header-bar/index.pug +40 -0
  195. package/themes/umberto/layout/gloria/_modules/header-legacy-warning/index.pug +11 -0
  196. package/themes/umberto/layout/gloria/_modules/header-nightly-info/index.pug +20 -0
  197. package/themes/umberto/layout/gloria/_modules/header-promobar/index.pug +18 -0
  198. package/themes/umberto/layout/gloria/_modules/index.pug +14 -0
  199. package/themes/umberto/layout/gloria/_modules/main/_style.scss +54 -0
  200. package/themes/umberto/layout/gloria/_modules/main/index.pug +10 -0
  201. package/themes/umberto/layout/gloria/_modules/mobile-nav/_style.scss +106 -0
  202. package/themes/umberto/layout/gloria/_modules/mobile-nav/index.pug +121 -0
  203. package/themes/umberto/layout/gloria/_modules/mobile-nav/slide-parts.pug +67 -0
  204. package/themes/umberto/layout/gloria/_modules/not-found/_style.scss +38 -0
  205. package/themes/umberto/layout/gloria/_modules/not-found/index.pug +16 -0
  206. package/themes/umberto/layout/gloria/_modules/sidebar/_style.scss +147 -0
  207. package/themes/umberto/layout/gloria/_modules/sidebar/index.pug +24 -0
  208. package/themes/umberto/layout/gloria/_modules/sidebar-api/_style.scss +2 -0
  209. package/themes/umberto/layout/gloria/_modules/sidebar-api/index.pug +6 -0
  210. package/themes/umberto/layout/gloria/_modules/toc/_style.scss +201 -0
  211. package/themes/umberto/layout/gloria/_modules/toc/index.pug +10 -0
  212. package/themes/umberto/layout/gloria/_trackers/google-tag-manager.pug +14 -0
  213. package/themes/umberto/layout/gloria/_trackers/index.pug +2 -0
  214. package/themes/umberto/layout/gloria/api.pug +43 -20
  215. package/themes/umberto/layout/gloria/base.pug +23 -32
  216. package/themes/umberto/layout/gloria/index.pug +19 -13
  217. package/themes/umberto/layout/gloria/page.pug +30 -11
  218. package/themes/umberto/layout/gloria/sdk.pug +1 -1
  219. package/themes/umberto/layout/gloria/theme.pug +304 -0
  220. package/themes/umberto/layout/umberto/404.pug +0 -1
  221. package/themes/umberto/layout/umberto/_partial/report-issue-widget.pug +0 -3
  222. package/themes/umberto/source/gloria/assets/_fonts/Menlo/Menlo-Regular.ttf +0 -0
  223. package/themes/umberto/source/gloria/assets/_fonts/Menlo/Menlo-Regular.woff +0 -0
  224. package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-Italic-VariableFont_wght.ttf +0 -0
  225. package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-Italic-VariableFont_wght.woff2 +0 -0
  226. package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-VariableFont_wght.ttf +0 -0
  227. package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-VariableFont_wght.woff2 +0 -0
  228. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Black.ttf +0 -0
  229. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-BlackItalic.ttf +0 -0
  230. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Bold.ttf +0 -0
  231. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-BoldItalic.ttf +0 -0
  232. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraBold.ttf +0 -0
  233. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraBoldItalic.ttf +0 -0
  234. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraLight.ttf +0 -0
  235. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraLightItalic.ttf +0 -0
  236. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Italic.ttf +0 -0
  237. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Light.ttf +0 -0
  238. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-LightItalic.ttf +0 -0
  239. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Medium.ttf +0 -0
  240. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-MediumItalic.ttf +0 -0
  241. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Regular.ttf +0 -0
  242. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-SemiBold.ttf +0 -0
  243. package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-SemiBoldItalic.ttf +0 -0
  244. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-Italic-VariableFont_wght.ttf +0 -0
  245. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-Italic-VariableFont_wght.woff2 +0 -0
  246. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-VariableFont_wght.ttf +0 -0
  247. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-VariableFont_wght.woff2 +0 -0
  248. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Black.ttf +0 -0
  249. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-BlackItalic.ttf +0 -0
  250. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Bold.ttf +0 -0
  251. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-BoldItalic.ttf +0 -0
  252. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraBold.ttf +0 -0
  253. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraBoldItalic.ttf +0 -0
  254. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraLight.ttf +0 -0
  255. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraLightItalic.ttf +0 -0
  256. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Italic.ttf +0 -0
  257. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Light.ttf +0 -0
  258. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-LightItalic.ttf +0 -0
  259. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Medium.ttf +0 -0
  260. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-MediumItalic.ttf +0 -0
  261. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Regular.ttf +0 -0
  262. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-SemiBold.ttf +0 -0
  263. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-SemiBoldItalic.ttf +0 -0
  264. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Thin.ttf +0 -0
  265. package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ThinItalic.ttf +0 -0
  266. package/themes/umberto/source/gloria/assets/_img/404-billboard.svg +181 -0
  267. package/themes/umberto/source/gloria/assets/_img/ckeditor-logo.svg +15 -0
  268. package/themes/umberto/source/gloria/assets/_img/hex-bg-2.svg +10 -0
  269. package/themes/umberto/source/gloria/assets/_img/hex-bg.svg +10 -0
  270. package/themes/umberto/source/gloria/assets/_img/icons/api-class.svg +10 -0
  271. package/themes/umberto/source/gloria/assets/_img/icons/api-folder.svg +3 -0
  272. package/themes/umberto/source/gloria/assets/_img/icons/api-interface.svg +3 -0
  273. package/themes/umberto/source/gloria/assets/_img/icons/api-module.svg +3 -0
  274. package/themes/umberto/source/gloria/assets/_img/icons/api-package.svg +4 -0
  275. package/themes/umberto/source/gloria/assets/_img/icons/api-typedef.svg +3 -0
  276. package/themes/umberto/source/gloria/assets/_img/icons/bulb.svg +3 -0
  277. package/themes/umberto/source/gloria/assets/_img/icons/check-circle.svg +4 -0
  278. package/themes/umberto/source/gloria/assets/_img/icons/check.svg +3 -0
  279. package/themes/umberto/source/gloria/assets/_img/icons/chevron-down.svg +3 -0
  280. package/themes/umberto/source/gloria/assets/_img/icons/chevron-right.svg +3 -0
  281. package/themes/umberto/source/gloria/assets/_img/icons/close-circle.svg +4 -0
  282. package/themes/umberto/source/gloria/assets/_img/icons/close.svg +3 -0
  283. package/themes/umberto/source/gloria/assets/_img/icons/copy.svg +10 -0
  284. package/themes/umberto/source/gloria/assets/_img/icons/dislike.svg +3 -0
  285. package/themes/umberto/source/gloria/assets/_img/icons/download.svg +3 -0
  286. package/themes/umberto/source/gloria/assets/_img/icons/edit.svg +3 -0
  287. package/themes/umberto/source/gloria/assets/_img/icons/exclamation-circle.svg +4 -0
  288. package/themes/umberto/source/gloria/assets/_img/icons/experiment.svg +3 -0
  289. package/themes/umberto/source/gloria/assets/_img/icons/export.svg +4 -0
  290. package/themes/umberto/source/gloria/assets/_img/icons/eye.svg +3 -0
  291. package/themes/umberto/source/gloria/assets/_img/icons/filter.svg +3 -0
  292. package/themes/umberto/source/gloria/assets/_img/icons/github.svg +10 -0
  293. package/themes/umberto/source/gloria/assets/_img/icons/info-circle.svg +4 -0
  294. package/themes/umberto/source/gloria/assets/_img/icons/like.svg +3 -0
  295. package/themes/umberto/source/gloria/assets/_img/icons/link.svg +3 -0
  296. package/themes/umberto/source/gloria/assets/_img/icons/lock.svg +3 -0
  297. package/themes/umberto/source/gloria/assets/_img/icons/menu-fold.svg +3 -0
  298. package/themes/umberto/source/gloria/assets/_img/icons/menu-list.svg +3 -0
  299. package/themes/umberto/source/gloria/assets/_img/icons/menu.svg +3 -0
  300. package/themes/umberto/source/gloria/assets/_img/icons/more.svg +3 -0
  301. package/themes/umberto/source/gloria/assets/_img/icons/notification.svg +3 -0
  302. package/themes/umberto/source/gloria/assets/_img/icons/number.svg +3 -0
  303. package/themes/umberto/source/gloria/assets/_img/icons/premium.svg +3 -0
  304. package/themes/umberto/source/gloria/assets/_img/icons/right.svg +3 -0
  305. package/themes/umberto/source/gloria/assets/_img/icons/search.svg +3 -0
  306. package/themes/umberto/source/gloria/assets/_img/icons/status.svg +3 -0
  307. package/themes/umberto/source/gloria/assets/_img/icons/trash.svg +3 -0
  308. package/themes/umberto/source/gloria/assets/_img/icons/unordered-list.svg +5 -0
  309. package/themes/umberto/source/gloria/assets/_img/icons/warning.svg +10 -0
  310. package/themes/umberto/src/gloria/css/_fonts.scss +51 -0
  311. package/themes/umberto/src/gloria/css/_layers.scss +1 -0
  312. package/themes/umberto/src/gloria/css/_normalize.scss +118 -0
  313. package/themes/umberto/src/gloria/css/a11y/_focusable.scss +7 -0
  314. package/themes/umberto/src/gloria/css/a11y/_index.scss +4 -0
  315. package/themes/umberto/src/gloria/css/a11y/_mixins.scss +32 -0
  316. package/themes/umberto/src/gloria/css/a11y/_reduce-motion.scss +9 -0
  317. package/themes/umberto/src/gloria/css/a11y/_screen-reader.scss +15 -0
  318. package/themes/umberto/src/gloria/css/base/_buttons.scss +13 -0
  319. package/themes/umberto/src/gloria/css/base/_descriptions-list.scss +33 -0
  320. package/themes/umberto/src/gloria/css/base/_details.scss +7 -0
  321. package/themes/umberto/src/gloria/css/base/_headings.scss +111 -0
  322. package/themes/umberto/src/gloria/css/base/_iframes.scss +7 -0
  323. package/themes/umberto/src/gloria/css/base/_index.scss +12 -0
  324. package/themes/umberto/src/gloria/css/base/_inline-code.scss +15 -0
  325. package/themes/umberto/src/gloria/css/base/_links.scss +30 -0
  326. package/themes/umberto/src/gloria/css/base/_lists.scss +58 -0
  327. package/themes/umberto/src/gloria/css/base/_mixins.scss +3 -0
  328. package/themes/umberto/src/gloria/css/base/_paragraphs.scss +15 -0
  329. package/themes/umberto/src/gloria/css/base/_tables.scss +68 -0
  330. package/themes/umberto/src/gloria/css/base/_typography.scss +62 -0
  331. package/themes/umberto/src/gloria/css/components/_api-collapsing-list.scss +148 -0
  332. package/themes/umberto/src/gloria/css/components/_api-filter-dropdown.scss +17 -0
  333. package/themes/umberto/src/gloria/css/components/_api-item-heading.scss +58 -0
  334. package/themes/umberto/src/gloria/css/components/_api-tree.scss +202 -0
  335. package/themes/umberto/src/gloria/css/components/_hierarchy-list.scss +35 -0
  336. package/themes/umberto/src/gloria/css/components/_image-zoom.scss +13 -0
  337. package/themes/umberto/src/gloria/css/components/_index.scss +55 -0
  338. package/themes/umberto/src/gloria/css/components/_notification.scss +36 -0
  339. package/themes/umberto/src/gloria/css/components/_utils.scss +5 -0
  340. package/themes/umberto/src/gloria/css/doc/_details.scss +11 -0
  341. package/themes/umberto/src/gloria/css/doc/_editor-icons.scss +21 -0
  342. package/themes/umberto/src/gloria/css/doc/_images.scss +9 -0
  343. package/themes/umberto/src/gloria/css/doc/_index.scss +5 -0
  344. package/themes/umberto/src/gloria/css/doc/_snippets.scss +126 -0
  345. package/themes/umberto/src/gloria/css/doc/_typography.scss +5 -0
  346. package/themes/umberto/src/gloria/css/layout/_base.scss +27 -0
  347. package/themes/umberto/src/gloria/css/layout/_breakpoints.scss +88 -0
  348. package/themes/umberto/src/gloria/css/layout/_container.scss +38 -0
  349. package/themes/umberto/src/gloria/css/layout/_index.scss +6 -0
  350. package/themes/umberto/src/gloria/css/layout/_layout.scss +64 -0
  351. package/themes/umberto/src/gloria/css/layout/_mixins.scss +34 -0
  352. package/themes/umberto/src/gloria/css/layout/_zindex.scss +12 -0
  353. package/themes/umberto/src/gloria/css/modules/_index.scss +29 -0
  354. package/themes/umberto/src/gloria/css/modules/_utils.scss +7 -0
  355. package/themes/umberto/src/gloria/css/styles.scss +11 -117
  356. package/themes/umberto/src/gloria/css/theme/_light.scss +344 -0
  357. package/themes/umberto/src/gloria/css/utilities/_animation.scss +32 -0
  358. package/themes/umberto/src/gloria/css/utilities/_colors.scss +14 -0
  359. package/themes/umberto/src/gloria/css/utilities/_display.scss +13 -0
  360. package/themes/umberto/src/gloria/css/utilities/_flex.scss +33 -0
  361. package/themes/umberto/src/gloria/css/utilities/_gap.scss +8 -0
  362. package/themes/umberto/src/gloria/css/utilities/_index.scss +11 -0
  363. package/themes/umberto/src/gloria/css/utilities/_radius.scss +21 -0
  364. package/themes/umberto/src/gloria/css/utilities/_rotation.scss +8 -0
  365. package/themes/umberto/src/gloria/css/utilities/_shadows.scss +13 -0
  366. package/themes/umberto/src/gloria/css/utilities/_spacing.scss +96 -0
  367. package/themes/umberto/src/gloria/css/utilities/_stop-scrolling.scss +9 -0
  368. package/themes/umberto/src/gloria/css/utilities/_text.scss +42 -0
  369. package/themes/umberto/src/gloria/js/app.js +92 -54
  370. package/themes/umberto/src/gloria/js/components/api-nav-tree.js +171 -0
  371. package/themes/umberto/src/gloria/js/components/api-toggle.js +92 -0
  372. package/themes/umberto/src/gloria/js/components/base-component.js +41 -0
  373. package/themes/umberto/src/gloria/js/components/breadcrumbs.js +115 -0
  374. package/themes/umberto/src/gloria/js/components/code-block.js +226 -0
  375. package/themes/umberto/src/gloria/js/components/code-switcher.js +177 -0
  376. package/themes/umberto/src/gloria/js/components/dropdown.js +516 -0
  377. package/themes/umberto/src/gloria/js/components/expandable.js +79 -0
  378. package/themes/umberto/src/gloria/js/components/fake-devtools.js +722 -0
  379. package/themes/umberto/src/gloria/js/components/hash-link.js +60 -0
  380. package/themes/umberto/src/gloria/js/components/heading-link.js +135 -0
  381. package/themes/umberto/src/gloria/js/components/iframe.js +158 -0
  382. package/themes/umberto/src/gloria/js/{_imageModal.js → components/image-zoom.js} +1 -1
  383. package/themes/umberto/src/gloria/js/components/mobile-overlay.js +315 -0
  384. package/themes/umberto/src/gloria/js/components/nav-tree.js +164 -0
  385. package/themes/umberto/src/gloria/js/components/tabs.js +284 -0
  386. package/themes/umberto/src/gloria/js/components/tooltip-popover.js +576 -0
  387. package/themes/umberto/src/gloria/js/helpers/after-dom-ready.js +16 -0
  388. package/themes/umberto/src/gloria/js/helpers/animate-element.js +78 -0
  389. package/themes/umberto/src/gloria/js/helpers/body-scroll.js +22 -0
  390. package/themes/umberto/src/gloria/js/helpers/clamp.js +16 -0
  391. package/themes/umberto/src/gloria/js/helpers/classnames.js +64 -0
  392. package/themes/umberto/src/gloria/js/helpers/copy-to-clipboard.js +19 -0
  393. package/themes/umberto/src/gloria/js/helpers/create-anchor-positioning-watcher.js +46 -0
  394. package/themes/umberto/src/gloria/js/helpers/create-cleanup-registry.js +88 -0
  395. package/themes/umberto/src/gloria/js/helpers/create-hover-manager.js +93 -0
  396. package/themes/umberto/src/gloria/js/helpers/create-keyboard-blur-watcher.js +90 -0
  397. package/themes/umberto/src/gloria/js/helpers/create-keyboard-focus-cycler.js +251 -0
  398. package/themes/umberto/src/gloria/js/helpers/create-mutation-observer.js +49 -0
  399. package/themes/umberto/src/gloria/js/helpers/create-outside-click-watcher.js +39 -0
  400. package/themes/umberto/src/gloria/js/helpers/cubic-bezier.js +55 -0
  401. package/themes/umberto/src/gloria/js/helpers/date-time.js +21 -0
  402. package/themes/umberto/src/gloria/js/helpers/decode-html-entities.js +23 -0
  403. package/themes/umberto/src/gloria/js/helpers/escape-handler.js +59 -0
  404. package/themes/umberto/src/gloria/js/helpers/fetch-stylesheet.js +25 -0
  405. package/themes/umberto/src/gloria/js/helpers/find-code-lang.js +85 -0
  406. package/themes/umberto/src/gloria/js/helpers/focus-first-interactive.js +50 -0
  407. package/themes/umberto/src/gloria/js/helpers/format-html.js +181 -0
  408. package/themes/umberto/src/gloria/js/helpers/get-all-scrollable-parents.js +34 -0
  409. package/themes/umberto/src/gloria/js/helpers/get-parents-until.js +26 -0
  410. package/themes/umberto/src/gloria/js/helpers/highlight-code.js +18 -0
  411. package/themes/umberto/src/gloria/js/helpers/html-builder.js +69 -0
  412. package/themes/umberto/src/gloria/js/helpers/identity.js +8 -0
  413. package/themes/umberto/src/gloria/js/helpers/inject-resource-preload.js +51 -0
  414. package/themes/umberto/src/gloria/js/helpers/inject-script.js +79 -0
  415. package/themes/umberto/src/gloria/js/helpers/inject-stylesheet.js +108 -0
  416. package/themes/umberto/src/gloria/js/helpers/is-element-attached.js +28 -0
  417. package/themes/umberto/src/gloria/js/helpers/is-focusable.js +14 -0
  418. package/themes/umberto/src/gloria/js/helpers/is-hidden-element.js +8 -0
  419. package/themes/umberto/src/gloria/js/helpers/is-mobile.js +8 -0
  420. package/themes/umberto/src/gloria/js/helpers/is-unsafe-key.js +14 -0
  421. package/themes/umberto/src/gloria/js/helpers/lerp.js +27 -0
  422. package/themes/umberto/src/gloria/js/helpers/local-storage-helper.js +133 -0
  423. package/themes/umberto/src/gloria/js/helpers/pipe.js +8 -0
  424. package/themes/umberto/src/gloria/js/helpers/prefers-reduced-motion.js +13 -0
  425. package/themes/umberto/src/gloria/js/helpers/random-id.js +51 -0
  426. package/themes/umberto/src/gloria/js/helpers/sanitize-text.js +27 -0
  427. package/themes/umberto/src/gloria/js/helpers/scroll-to-hash.js +31 -0
  428. package/themes/umberto/src/gloria/js/helpers/take-last.js +19 -0
  429. package/themes/umberto/src/gloria/js/helpers/tap.js +11 -0
  430. package/themes/umberto/src/gloria/js/helpers/throttle.js +46 -0
  431. package/themes/umberto/src/gloria/js/helpers/timeout.js +14 -0
  432. package/themes/umberto/src/gloria/js/helpers/toggle-height.js +46 -0
  433. package/themes/umberto/src/gloria/js/helpers/tween.js +100 -0
  434. package/themes/umberto/src/gloria/js/helpers/wrap-around.js +39 -0
  435. package/themes/umberto/src/gloria/js/modules/algolia-search.js +168 -0
  436. package/themes/umberto/src/gloria/js/modules/api-filter.js +184 -0
  437. package/themes/umberto/src/gloria/js/modules/header-bar.js +154 -0
  438. package/themes/umberto/src/gloria/js/modules/header.js +242 -0
  439. package/themes/umberto/src/gloria/js/modules/links-prefetch.js +196 -0
  440. package/themes/umberto/src/gloria/js/modules/mobile-nav.js +327 -0
  441. package/themes/umberto/src/gloria/js/modules/sidebar.js +114 -0
  442. package/themes/umberto/src/gloria/js/modules/table-of-contents-api.js +214 -0
  443. package/themes/umberto/src/gloria/js/modules/table-of-contents.js +287 -0
  444. package/themes/umberto/src/gloria/js/public-api.js +75 -0
  445. package/themes/umberto/src/gloria/js/web-components/svg-icon.js +117 -0
  446. package/themes/umberto/src/umberto/js/_codeswitcherbuttons.js +1 -1
  447. package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-title.pug +0 -17
  448. package/themes/umberto/layout/gloria/_mixin/nav-tree-item.pug +0 -13
  449. package/themes/umberto/layout/gloria/_partial/docsearch.pug +0 -21
  450. package/themes/umberto/layout/gloria/_partial/dropdown.pug +0 -12
  451. package/themes/umberto/layout/gloria/_partial/feedback-widget.pug +0 -20
  452. package/themes/umberto/layout/gloria/_partial/footer.pug +0 -6
  453. package/themes/umberto/layout/gloria/_partial/gh-contribute.pug +0 -8
  454. package/themes/umberto/layout/gloria/_partial/google-tag-manager.pug +0 -18
  455. package/themes/umberto/layout/gloria/_partial/header.pug +0 -64
  456. package/themes/umberto/layout/gloria/_partial/nav-tree.pug +0 -9
  457. package/themes/umberto/layout/gloria/_partial/report-issue-widget.pug +0 -26
  458. package/themes/umberto/layout/gloria/_partial/rwd-breadcrumbs.pug +0 -13
  459. package/themes/umberto/layout/gloria/_partial/search-box.pug +0 -6
  460. package/themes/umberto/layout/gloria/_partial/vwo.pug +0 -11
  461. package/themes/umberto/source/gloria/assets/_img/arrows.svg +0 -1
  462. package/themes/umberto/source/gloria/assets/_img/book.svg +0 -1
  463. package/themes/umberto/source/gloria/assets/_img/box-brown.svg +0 -1
  464. package/themes/umberto/source/gloria/assets/_img/box-orange.svg +0 -1
  465. package/themes/umberto/source/gloria/assets/_img/box-red.svg +0 -1
  466. package/themes/umberto/source/gloria/assets/_img/bulb.svg +0 -1
  467. package/themes/umberto/source/gloria/assets/_img/clipboard.svg +0 -1
  468. package/themes/umberto/source/gloria/assets/_img/cog.svg +0 -1
  469. package/themes/umberto/source/gloria/assets/_img/data.svg +0 -1
  470. package/themes/umberto/source/gloria/assets/_img/documentation.svg +0 -1
  471. package/themes/umberto/source/gloria/assets/_img/download.svg +0 -1
  472. package/themes/umberto/source/gloria/assets/_img/edit.svg +0 -2
  473. package/themes/umberto/source/gloria/assets/_img/exclamation-circle.svg +0 -2
  474. package/themes/umberto/source/gloria/assets/_img/eye.svg +0 -1
  475. package/themes/umberto/source/gloria/assets/_img/filter.svg +0 -1
  476. package/themes/umberto/source/gloria/assets/_img/filtering.svg +0 -1
  477. package/themes/umberto/source/gloria/assets/_img/folder.svg +0 -1
  478. package/themes/umberto/source/gloria/assets/_img/github.svg +0 -6
  479. package/themes/umberto/source/gloria/assets/_img/header-info-configs.svg +0 -1
  480. package/themes/umberto/source/gloria/assets/_img/header-info-events.svg +0 -1
  481. package/themes/umberto/source/gloria/assets/_img/header-info-methods.svg +0 -1
  482. package/themes/umberto/source/gloria/assets/_img/header-info-properties.svg +0 -1
  483. package/themes/umberto/source/gloria/assets/_img/heart.svg +0 -1
  484. package/themes/umberto/source/gloria/assets/_img/info-circle.svg +0 -4
  485. package/themes/umberto/source/gloria/assets/_img/info.svg +0 -1
  486. package/themes/umberto/source/gloria/assets/_img/list-nest.svg +0 -1
  487. package/themes/umberto/source/gloria/assets/_img/loupe.svg +0 -1
  488. package/themes/umberto/source/gloria/assets/_img/menu.svg +0 -4
  489. package/themes/umberto/source/gloria/assets/_img/plug.svg +0 -1
  490. package/themes/umberto/source/gloria/assets/_img/star-in-circle.svg +0 -1
  491. package/themes/umberto/source/gloria/assets/_img/tick.svg +0 -1
  492. package/themes/umberto/source/gloria/assets/_img/triangle-down.svg +0 -1
  493. package/themes/umberto/source/gloria/assets/_img/triangle-right.svg +0 -1
  494. package/themes/umberto/src/gloria/css/_api-content.scss +0 -32
  495. package/themes/umberto/src/gloria/css/_api-info-box.scss +0 -86
  496. package/themes/umberto/src/gloria/css/_api-props-filter.scss +0 -106
  497. package/themes/umberto/src/gloria/css/_api-see-source.scss +0 -35
  498. package/themes/umberto/src/gloria/css/_api-subheader.scss +0 -167
  499. package/themes/umberto/src/gloria/css/_api-tree.scss +0 -121
  500. package/themes/umberto/src/gloria/css/_badge.scss +0 -74
  501. package/themes/umberto/src/gloria/css/_code-switcher.scss +0 -61
  502. package/themes/umberto/src/gloria/css/_collapsinglist.scss +0 -262
  503. package/themes/umberto/src/gloria/css/_content.scss +0 -236
  504. package/themes/umberto/src/gloria/css/_docsearch.scss +0 -109
  505. package/themes/umberto/src/gloria/css/_dropdown.scss +0 -63
  506. package/themes/umberto/src/gloria/css/_editor-icon.scss +0 -26
  507. package/themes/umberto/src/gloria/css/_feedback-widget.scss +0 -11
  508. package/themes/umberto/src/gloria/css/_font-external.scss +0 -8
  509. package/themes/umberto/src/gloria/css/_footer.scss +0 -40
  510. package/themes/umberto/src/gloria/css/_formatted.scss +0 -285
  511. package/themes/umberto/src/gloria/css/_guide-content.scss +0 -37
  512. package/themes/umberto/src/gloria/css/_guide-sdk-tree.scss +0 -14
  513. package/themes/umberto/src/gloria/css/_loading-spinner.scss +0 -33
  514. package/themes/umberto/src/gloria/css/_main.scss +0 -59
  515. package/themes/umberto/src/gloria/css/_navigation.scss +0 -35
  516. package/themes/umberto/src/gloria/css/_notice.scss +0 -116
  517. package/themes/umberto/src/gloria/css/_print.scss +0 -20
  518. package/themes/umberto/src/gloria/css/_prism.scss +0 -223
  519. package/themes/umberto/src/gloria/css/_rwd-breadcrumbs.scss +0 -28
  520. package/themes/umberto/src/gloria/css/_rwd-menu.scss +0 -89
  521. package/themes/umberto/src/gloria/css/_secondary-navigation.scss +0 -152
  522. package/themes/umberto/src/gloria/css/_theme-dark.scss +0 -175
  523. package/themes/umberto/src/gloria/css/_toggler.scss +0 -46
  524. package/themes/umberto/src/gloria/css/_top.scss +0 -350
  525. package/themes/umberto/src/gloria/css/_tree.scss +0 -218
  526. package/themes/umberto/src/gloria/css/_warning-banner.scss +0 -46
  527. package/themes/umberto/src/gloria/css/components/_lightbox.scss +0 -12
  528. package/themes/umberto/src/gloria/css/helpers/_color.scss +0 -49
  529. package/themes/umberto/src/gloria/css/helpers/_font.scss +0 -60
  530. package/themes/umberto/src/gloria/css/helpers/_globals.scss +0 -129
  531. package/themes/umberto/src/gloria/css/helpers/_reset.scss +0 -52
  532. package/themes/umberto/src/gloria/css/helpers/_spacing.scss +0 -21
  533. package/themes/umberto/src/gloria/css/pages/_sdk.scss +0 -111
  534. package/themes/umberto/src/gloria/js/_anchors.js +0 -57
  535. package/themes/umberto/src/gloria/js/_apisearch.js +0 -126
  536. package/themes/umberto/src/gloria/js/_apitree.js +0 -67
  537. package/themes/umberto/src/gloria/js/_attachpermalinklistener.js +0 -50
  538. package/themes/umberto/src/gloria/js/_codeswitcherbuttons.js +0 -146
  539. package/themes/umberto/src/gloria/js/_collapsables.js +0 -135
  540. package/themes/umberto/src/gloria/js/_copymobileapinavigation.js +0 -26
  541. package/themes/umberto/src/gloria/js/_devnames.js +0 -37
  542. package/themes/umberto/src/gloria/js/_dropdowns.js +0 -55
  543. package/themes/umberto/src/gloria/js/_filtering.js +0 -139
  544. package/themes/umberto/src/gloria/js/_pagenavigation.js +0 -93
  545. package/themes/umberto/src/gloria/js/_prism.js +0 -104
  546. package/themes/umberto/src/gloria/js/_rwdmenu.js +0 -15
  547. package/themes/umberto/src/gloria/js/_samplecode.js +0 -23
  548. package/themes/umberto/src/gloria/js/_sidenavigation.js +0 -59
  549. package/themes/umberto/src/gloria/js/_toc.js +0 -93
  550. package/themes/umberto/src/gloria/js/_tooltips.js +0 -39
  551. package/themes/umberto/src/gloria/js/_warningbanner.js +0 -18
  552. package/themes/umberto/src/gloria/js/vendor/prism.js +0 -45
  553. /package/themes/umberto/layout/gloria/_api-docs/_partial/{api-info-box.pug → api-hierarchy.pug} +0 -0
  554. /package/themes/umberto/layout/gloria/{_partial → _trackers}/google-analytics.pug +0 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ /**
7
+ * Transforms XML tree structure to Pug mixin format.
8
+ * This module converts parsed XML nodes into Pug template syntax with proper indentation and attribute handling.
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const { TreeWalkActions, walkXMLTree } = require( './parser/walk-xml-tree' );
14
+
15
+ /**
16
+ * Transforms an XML tree structure into Pug mixin syntax.
17
+ *
18
+ * @param tree - The XML tree object to transform
19
+ * @param nesting - Base nesting level for indentation
20
+ * @param options - Configuration options
21
+ * @param options.nestingCharacter - Character used for indentation (default: '\t')
22
+ * @returns The transformed Pug mixin string
23
+ */
24
+ function transformXMLTreeToPug( tree, nesting, options = {} ) {
25
+ const {
26
+ nestingCharacter = '\t',
27
+ parseText = str => str,
28
+ fallbackGlobalRequire
29
+ } = options;
30
+
31
+ let hasMissingImports = false;
32
+
33
+ // Walk through the XML tree and transform each node
34
+ const requireTags = new Set( [] );
35
+ const result = walkXMLTree( tree, {
36
+ leave( node, depth, parents ) {
37
+ // Calculate indentation based on nesting level and current depth
38
+ const indent = nestingCharacter.repeat( nesting + depth );
39
+
40
+ switch ( node.type ) {
41
+ case 'text': {
42
+ const parent = parents[ parents.length - 1 ];
43
+ let mappedContent = node.content;
44
+
45
+ if ( parent && parent.type === 'element' ) {
46
+ mappedContent = parseText( parent, mappedContent );
47
+ }
48
+
49
+ if ( !mappedContent ) {
50
+ return TreeWalkActions.remove();
51
+ }
52
+
53
+ return TreeWalkActions.replace( `${ indent }| ${ mappedContent }\n` );
54
+ }
55
+
56
+ case 'element': {
57
+ if ( !node.patternElement?.requires?.length ) {
58
+ hasMissingImports = true;
59
+ } else if ( !hasMissingImports ) {
60
+ for ( const requirePath of node.patternElement.requires ) {
61
+ requireTags.add( requirePath );
62
+ }
63
+ }
64
+
65
+ const mappedAttributes = (
66
+ node.patternElement?.attributesMapper ?
67
+ node.patternElement.attributesMapper( node ) :
68
+ node.attributes
69
+ );
70
+
71
+ return TreeWalkActions.replace( [
72
+ `${ indent }+${ node.patternElement.mixinName || node.name }(${ serializeMixinAttributes( mappedAttributes ) })`,
73
+ ...( node.children || [] )
74
+ ].join( '\n' ) );
75
+ }
76
+ }
77
+ }
78
+ } );
79
+
80
+ // There is no need to duplicate requires if the fallback global require is already included.
81
+ if ( hasMissingImports ) {
82
+ requireTags.clear();
83
+ requireTags.add( fallbackGlobalRequire );
84
+ }
85
+
86
+ return [
87
+ ...Array.from( requireTags ).map( requirePath => `include ${ requirePath }` ),
88
+ result
89
+ ].join( '\n' );
90
+ }
91
+
92
+ /**
93
+ * Serializes XML attributes into JSON format for Pug mixin parameters.
94
+ * Normalizes attribute names and values according to Pug conventions.
95
+ *
96
+ * @param attributes - Object containing XML attributes
97
+ * @returns JSON string representation of normalized attributes
98
+ */
99
+ function serializeMixinAttributes( attributes ) {
100
+ const entries = Object.fromEntries(
101
+ Object
102
+ .entries( attributes )
103
+ .map( ( [ key, value ] ) => {
104
+ const normalizedKey = normalizeMixinAttributeName( key );
105
+ const normalizedValue = normalizeMixinAttributeValue( value );
106
+
107
+ return [ normalizedKey, normalizedValue ];
108
+ } )
109
+ );
110
+
111
+ return JSON.stringify( entries );
112
+ }
113
+
114
+ /**
115
+ * Normalizes XML attribute values to appropriate JavaScript types.
116
+ * Converts string representations of booleans to actual boolean values.
117
+ *
118
+ * @param value - The XML attribute value to normalize
119
+ * @returns Normalized value (boolean for 'true'/'false', string otherwise)
120
+ */
121
+ function normalizeMixinAttributeValue( value ) {
122
+ if ( value === 'true' || value === '' ) {
123
+ return true;
124
+ }
125
+
126
+ if ( value === 'false' ) {
127
+ return false;
128
+ }
129
+
130
+ return value;
131
+ }
132
+
133
+ /**
134
+ * Normalizes attribute names from kebab-case to camelCase.
135
+ * e.g., data-foo-bar -> dataFooBar
136
+ *
137
+ * @param name - The kebab-case attribute name
138
+ * @returns The camelCase attribute name
139
+ */
140
+ function normalizeMixinAttributeName( name ) {
141
+ return name.replace( /-([a-z])/g, g => g[ 1 ].toUpperCase() );
142
+ }
143
+
144
+ module.exports = transformXMLTreeToPug;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const crypto = require( 'crypto' );
9
+
10
+ /**
11
+ * Generates a random ID with a single segment. If a prefix is provided, it will be prepended to the ID.
12
+ *
13
+ * The `gen-` prefix is always used to easier extract the generated IDs from the output.
14
+ *
15
+ * @param [prefix] Optional prefix to add to the ID
16
+ * @param [maskable=true] Whether the ID should be replaceable by regenerateRandomIds.
17
+ * @return The generated ID with optional prefix
18
+ */
19
+ function randomId( prefix, maskable = true ) {
20
+ const shortId = crypto.randomBytes( 3 ).toString( 'hex' ).substring( 0, 5 );
21
+
22
+ let id = prefix ? `${ prefix }-${ shortId }` : shortId;
23
+
24
+ if ( maskable ) {
25
+ id = `gen-${ id }`;
26
+ }
27
+
28
+ return id;
29
+ };
30
+
31
+ /**
32
+ * Regenerates random IDs in a string.
33
+ *
34
+ * It finds all occurrences of IDs generated by `randomId()` and replaces them with new random IDs.
35
+ * If an ID is repeated in the input string, it will be replaced with the same new ID.
36
+ * It preserves the prefix of the original ID.
37
+ *
38
+ * @param str The string to process.
39
+ * @returns The string with regenerated IDs.
40
+ */
41
+ function regenerateRandomIds( str ) {
42
+ const idCache = new Map();
43
+ const idRegex = /(gen-(?:[a-zA-Z0-9]+-)*[a-f0-9]{5})/g;
44
+
45
+ return str.replace( idRegex, oldId => {
46
+ if ( idCache.has( oldId ) ) {
47
+ return idCache.get( oldId );
48
+ }
49
+
50
+ // Everything after 'gen-'.
51
+ const idContent = oldId.substring( 4 );
52
+ const parts = idContent.split( '-' );
53
+
54
+ // The ID has 1 segment at the end. If there are more parts, it means a prefix is present.
55
+ const prefix = parts.length > 1 ? parts.slice( 0, -1 ).join( '-' ) : undefined;
56
+ const newId = randomId( prefix );
57
+
58
+ idCache.set( oldId, newId );
59
+
60
+ return newId;
61
+ } );
62
+ }
63
+
64
+ module.exports = {
65
+ randomId,
66
+ regenerateRandomIds
67
+ };
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ /**
9
+ * Removes indentation from content preserving the relative indentation within the content.
10
+ * @param content The content to remove indentation from
11
+ * @returns Content with common indentation removed
12
+ */
13
+ module.exports = function removeIndentation( content ) {
14
+ // Remove unwanted indentation.
15
+ const lines = content.split( /\n/ );
16
+
17
+ // Skip empty lines when detecting indentation level
18
+ let indentationLine = 1;
19
+ while ( indentationLine < lines.length && !lines[ indentationLine ].trim() ) {
20
+ indentationLine++;
21
+ }
22
+
23
+ // Get the indentation of the first non-empty line, or empty string if no valid lines
24
+ const indentation = indentationLine < lines.length ? lines[ indentationLine ].match( /^\s*/ )[ 0 ] : '';
25
+
26
+ if ( !indentation ) {
27
+ return content.trim();
28
+ }
29
+
30
+ let pattern;
31
+
32
+ // When using spaces as indentation, some editors may mix them with tabs.
33
+ // In such case, let's try to remove tabs as well. 4 spaces are treat as a single tab character.
34
+ if ( indentation[ 0 ] === ' ' ) {
35
+ pattern = new RegExp( `^${ indentation }|${ '\\t'.repeat( Math.ceil( indentation.length / 4 ) ) }` );
36
+ } else {
37
+ pattern = new RegExp( `^${ indentation }` );
38
+ }
39
+
40
+ // Process each line to remove common indentation
41
+ content = lines.map( line => line.replace( pattern, '' ) ).join( '\n' );
42
+
43
+ // Remove first linebreak and last linebreak.
44
+ content = content.replace( /^\n/, '' );
45
+ content = content.replace( /\n$/, '' );
46
+
47
+ return content;
48
+ };
@@ -0,0 +1,183 @@
1
+ /**
2
+ * @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const cheerio = require( 'cheerio' );
9
+ const fs = require( 'fs' );
10
+ const path = require( 'path' );
11
+
12
+ const HexoManager = require( '../../src/hexo-manager' );
13
+
14
+ /**
15
+ * Cache for parsed SVG elements.
16
+ */
17
+ const SVG_CACHE = new Map();
18
+
19
+ module.exports = function spritesheetSvg( str, isDocument = true ) {
20
+ const $ = cheerio.load( str, null, isDocument );
21
+ const elements = $( '[data-spritesheet-svg]' );
22
+
23
+ // Skip if there are no elements with data-spritesheet-svg
24
+ if ( elements.length === 0 ) {
25
+ return str;
26
+ }
27
+
28
+ // Collect all unique SVG files to include in the spritesheet
29
+ const svgFiles = new Map();
30
+
31
+ // Helper function to extract SVG file information
32
+ function collectSvgFileInfo( element ) {
33
+ const svgPath = element.attr( 'data-spritesheet-svg' );
34
+ const iconId = element.attr( 'data-spritesheet-id' );
35
+
36
+ if ( !svgFiles.has( iconId ) ) {
37
+ svgFiles.set( iconId, svgPath );
38
+ }
39
+ }
40
+
41
+ // Process normal SVG elements
42
+ elements.each( function() {
43
+ const $element = $( this );
44
+
45
+ collectSvgFileInfo( $element );
46
+ } );
47
+
48
+ // Process and remove preload elements
49
+ const preloadElements = $( '[data-spritesheet-preload="true"]' );
50
+ preloadElements.each( function() {
51
+ const $element = $( this );
52
+
53
+ collectSvgFileInfo( $element );
54
+ $element.remove();
55
+ } );
56
+
57
+ if ( svgFiles.size === 0 ) {
58
+ return str;
59
+ }
60
+
61
+ // Create spritesheet and get viewBox data
62
+ const { spritesheetElement, iconViewBoxes } = createSpritesheet( $, svgFiles );
63
+
64
+ // Add spritesheet to the beginning of the body
65
+ if ( $( 'body' ).length ) {
66
+ $( 'body' ).prepend( spritesheetElement );
67
+ }
68
+
69
+ // Set viewBox for original SVG elements
70
+ elements.each( function() {
71
+ const element = $( this );
72
+ const iconId = element.attr( 'data-spritesheet-id' );
73
+ const viewBox = iconViewBoxes.get( iconId );
74
+
75
+ if ( viewBox && this.tagName.toLowerCase() === 'svg' ) {
76
+ element.attr( 'viewBox', viewBox );
77
+ }
78
+ } );
79
+
80
+ $( '[data-spritesheet-svg]' ).removeAttr( 'data-spritesheet-svg' );
81
+ $( '[data-spritesheet-id]' ).removeAttr( 'data-spritesheet-id' );
82
+
83
+ return $.html();
84
+ };
85
+
86
+ /**
87
+ * Creates an SVG spritesheet from the provided SVG files.
88
+ * Returns an object containing the spritesheet element and a map of icon IDs to their viewBox strings.
89
+ */
90
+ function createSpritesheet( $, svgFiles ) {
91
+ const symbols = [];
92
+ const iconViewBoxes = new Map();
93
+
94
+ for ( const [ iconId, svgPath ] of svgFiles.entries() ) {
95
+ const absolutePath = path.join( HexoManager.hexo.theme_dir, svgPath );
96
+
97
+ if ( !fs.existsSync( absolutePath ) ) {
98
+ console.warn( `SVG file not found: ${ absolutePath }` );
99
+ continue;
100
+ }
101
+
102
+ // Check if we have the SVG in cache
103
+ if ( !SVG_CACHE.has( absolutePath ) ) {
104
+ try {
105
+ const svgContent = fs.readFileSync( absolutePath, 'utf8' );
106
+ const $svg = cheerio.load( svgContent, { xmlMode: true } )( 'svg' );
107
+ SVG_CACHE.set( absolutePath, $svg );
108
+ } catch ( error ) {
109
+ console.error( `Error reading SVG file: ${ absolutePath }`, error );
110
+ continue;
111
+ }
112
+ }
113
+
114
+ const $svg = SVG_CACHE.get( absolutePath ).clone();
115
+
116
+ // Create symbol element from SVG
117
+ const $symbol = $( '<symbol></symbol>' );
118
+ $symbol.attr( 'id', iconId );
119
+
120
+ // Copy viewBox and other relevant attributes
121
+ let viewBoxValue;
122
+ if ( $svg.attr( 'viewBox' ) ) {
123
+ viewBoxValue = $svg.attr( 'viewBox' );
124
+ } else if ( $svg.attr( 'width' ) && $svg.attr( 'height' ) ) {
125
+ viewBoxValue = `0 0 ${ $svg.attr( 'width' ) } ${ $svg.attr( 'height' ) }`;
126
+ }
127
+
128
+ if ( viewBoxValue ) {
129
+ $symbol.attr( 'viewBox', viewBoxValue );
130
+ iconViewBoxes.set( iconId, viewBoxValue );
131
+ }
132
+
133
+ // Copy all child elements from SVG to symbol
134
+ $svg.children().each( function() {
135
+ const $child = $( this );
136
+ // Skip title elements as they'll be provided by the consuming SVG
137
+ if ( $child[ 0 ].tagName.toLowerCase() !== 'title' ) {
138
+ $symbol.append( $child.clone() );
139
+ }
140
+ } );
141
+
142
+ symbols.push(
143
+ resetFillColor( $, $symbol )
144
+ );
145
+ }
146
+
147
+ // Create the spritesheet container
148
+ const $spritesheet = $( '<svg></svg>' );
149
+ $spritesheet.attr( {
150
+ 'class': 'svg-spritesheet',
151
+ 'xmlns': 'http://www.w3.org/2000/svg',
152
+ 'style': 'display: none;',
153
+ 'aria-hidden': 'true'
154
+ } );
155
+
156
+ // Add all symbols to the spritesheet
157
+ symbols.forEach( $symbol => {
158
+ $spritesheet.append( $symbol );
159
+ } );
160
+
161
+ return {
162
+ spritesheetElement: $spritesheet,
163
+ iconViewBoxes
164
+ };
165
+ }
166
+
167
+ /**
168
+ * Resets the fill color of an SVG element to 'currentColor'.
169
+ * This is useful for ensuring that the SVG inherits the text color from its parent.
170
+ */
171
+ function resetFillColor( $, $svg ) {
172
+ // Replace all fill attributes with the specified color.
173
+ $svg.find( '[fill]' ).each( function() {
174
+ $( this ).attr( 'fill', 'currentColor' );
175
+ } );
176
+
177
+ // Also check the root SVG for fill attribute.
178
+ if ( $svg.attr( 'fill' ) ) {
179
+ $svg.attr( 'fill', 'currentColor' );
180
+ }
181
+
182
+ return $svg;
183
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const cheerio = require( 'cheerio' );
9
+
10
+ module.exports = function toc( data, options = {} ) {
11
+ const $ = cheerio.load( data, null, false );
12
+
13
+ let usedHeadings = [ 'h2', 'h3', 'h4', 'h5', 'h6' ];
14
+
15
+ if ( options.tocLimit >= 0 ) {
16
+ usedHeadings = usedHeadings.slice( 0, options.tocLimit );
17
+ }
18
+
19
+ usedHeadings = usedHeadings.join( ',' );
20
+
21
+ const headings = $( usedHeadings )
22
+ .filter( function() {
23
+ return !$( this ).parents( '.live-snippet, .collapsing-list__item' ).length;
24
+ } );
25
+ const className = options.class || 'secondary-navigation';
26
+
27
+ if ( !headings.length ) {
28
+ return '';
29
+ }
30
+
31
+ const $r = cheerio.load( `<nav class=${ className }><h3>Table of contents</h3></nav>`, null, false ); // result object
32
+ const tocLastLevels = [ $r( 'nav' ), 0, 0, 0, 0, 0, 0 ];
33
+
34
+ headings.each( function() {
35
+ const hLevel = Number( this.name[ 1 ] );
36
+ const id = $r( this ).attr( 'id' );
37
+ const text = $r( this ).find( '.headerlink' ).remove().end().text().trim()
38
+ // Replace the chevrons with their HTML escape characters to avoid rendering HTML in ToC.
39
+ .replace( /</g, '&lt;' )
40
+ .replace( />/g, '&gt;' );
41
+
42
+ const newItem = `<li><a class="a11y-focusable" href="#${ id }" title="${ text }">${ text }</a></li>`;
43
+
44
+ if ( tocLastLevels[ hLevel ] ) {
45
+ // If there already is a parent node for current heading level, append the new toc item there.
46
+ tocLastLevels[ hLevel ].append( newItem );
47
+ } else {
48
+ // If there's no parent node for current heading level, create it and append.
49
+ if ( $r( 'li' ).length ) {
50
+ $r( 'li' ).last().append( `<ol>${ newItem }</ol>` );
51
+ } else {
52
+ $r( 'nav' ).append( `<ol>${ newItem }</ol>` );
53
+ }
54
+
55
+ // Assign new created <ol> element to the helper array.
56
+ tocLastLevels[ hLevel ] = $r( 'ol' ).last();
57
+ }
58
+
59
+ // After adding new toc item, lower heading levels in helper array must be cleared.
60
+ // If e.g. level 2 <ol> was added, then level 3 nd lower <ol>s are no longer needed because they belong to upper toc nodes.
61
+ clearLowerLevels( tocLastLevels, hLevel );
62
+ } );
63
+
64
+ return $r.html();
65
+ };
66
+
67
+ function clearLowerLevels( levels, current ) {
68
+ for ( let i = current + 1; i < levels.length; i++ ) {
69
+ levels[ i ] = 0;
70
+ }
71
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const ParserCursor = require( './parser-cursor' );
9
+
10
+ /**
11
+ * Transforms Github style admonitions in markdown to a rendered callouts.
12
+ *
13
+ * For example:
14
+ *
15
+ * > [!IMPORTANT]
16
+ * > This is an important message.
17
+ * > It should be highlighted.
18
+ *
19
+ * @param mapperFn - A function that takes an admonition object and returns a string.
20
+ * @param str - The string to transform.
21
+ * @returns The transformed string with admonitions replaced by the result of the mapper function.
22
+ */
23
+ function transformMarkdownAdmonitions( mapperFn, str ) {
24
+ const cursor = new ParserCursor( str );
25
+ let acc = '';
26
+
27
+ for ( ; cursor.index < cursor.text.length; ) {
28
+ const ch = cursor.text[ cursor.index ];
29
+
30
+ if ( ch === '>' ) {
31
+ const maybeAdmonition = cursor.try( eatAdmonition );
32
+
33
+ if ( maybeAdmonition ) {
34
+ acc += mapperFn( maybeAdmonition );
35
+ continue;
36
+ }
37
+ }
38
+
39
+ acc += ch;
40
+ cursor.index++;
41
+ }
42
+
43
+ return acc;
44
+ };
45
+
46
+ /**
47
+ * Fast check if the string contains an admonition block.
48
+ */
49
+ function fastCheckIfContainsAdmonition( str ) {
50
+ return str.includes( '> [!' ) && str.includes( ']' );
51
+ }
52
+
53
+ /**
54
+ * Eats an admonition block if it matches the expected pattern.
55
+ *
56
+ * @param cursor - The cursor to use for parsing.
57
+ * @returns An object representing the admonition type and content, or undefined (if not matched)
58
+ */
59
+ function eatAdmonition( cursor ) {
60
+ if ( !cursor.eatTerminals( '> [!' ) ) {
61
+ return;
62
+ }
63
+
64
+ const type = cursor.eatUntilTerminal( ']' ).trim();
65
+
66
+ cursor.eatAllNextTerminals( ' \t\n ' );
67
+
68
+ const content = cursor.accumulateEaters( eatAdmonitionLine );
69
+
70
+ // Let's revert cursor back to the ending newline if it was consumed.
71
+ if ( content.length > 0 && cursor.text[ cursor.index - 1 ] === '\n' ) {
72
+ cursor.index--;
73
+ }
74
+
75
+ return {
76
+ type,
77
+ content
78
+ };
79
+ }
80
+
81
+ /**
82
+ * Eats a line of an admonition block.
83
+ *
84
+ * @param cursor - The cursor to use for parsing.
85
+ * @returns The content of the admonition line, or undefined if not matched.
86
+ */
87
+ function eatAdmonitionLine( cursor ) {
88
+ cursor.eatIndent();
89
+
90
+ if ( !cursor.eatTerminal( '>' ) ) {
91
+ return;
92
+ }
93
+
94
+ return cursor.eatUntilEOL().trim();
95
+ }
96
+
97
+ exports.transformMarkdownAdmonitions = transformMarkdownAdmonitions;
98
+ exports.fastCheckIfContainsAdmonition = fastCheckIfContainsAdmonition;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ /**
9
+ * Returns a new array with unique elements based on a specified property.
10
+ * When duplicates are found, the last occurrence is preferred.
11
+ *
12
+ * @param array - The array to process
13
+ * @param key - The property name to check for uniqueness or a function that extracts the value
14
+ * @returns A new array with unique elements
15
+ */
16
+ module.exports = function uniqByLast( key, array ) {
17
+ const seen = new Map();
18
+
19
+ // Process from right to left to keep last occurrences
20
+ return array
21
+ .slice()
22
+ .reverse()
23
+ .filter( item => {
24
+ const value = typeof key === 'function' ? key( item ) : item[ key ];
25
+ if ( seen.has( value ) ) {
26
+ return false;
27
+ }
28
+ seen.set( value, true );
29
+ return true;
30
+ } )
31
+ .reverse();
32
+ };