@mdn/fred 2.0.2 → 2.1.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 (186) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/components/about-tabs/element.css +3 -2
  3. package/components/scrim-inline/element.css +0 -7
  4. package/components/scrim-inline/global.css +10 -0
  5. package/components/social-image/README.md +16 -0
  6. package/components/social-image/sandbox.js +23 -0
  7. package/components/social-image/server.css +28 -0
  8. package/components/social-image/server.js +13 -0
  9. package/l10n/fluent.js +8 -7
  10. package/out/service-worker.js +1 -1
  11. package/out/service-worker.js.map +1 -1
  12. package/out/static/client/5183.ed3575d7370b617c.js +64 -0
  13. package/out/static/client/5183.ed3575d7370b617c.js.map +1 -0
  14. package/out/static/client/7047.7084b7bcf9a47b7b.js +9 -0
  15. package/out/static/client/7047.7084b7bcf9a47b7b.js.map +1 -0
  16. package/out/static/client/{8292.88217634072b2959.js → 8292.5a4929a466c7b3ca.js} +2 -2
  17. package/out/static/client/{8292.88217634072b2959.js.map → 8292.5a4929a466c7b3ca.js.map} +1 -1
  18. package/out/static/client/{index.a7f592ef6e4f2a0e.js → index.0e1f202766cdb426.js} +3 -3
  19. package/out/static/client/{index.a7f592ef6e4f2a0e.js.map → index.0e1f202766cdb426.js.map} +1 -1
  20. package/out/static/client/{runtime.14f0bbf7912ff6c2.js → runtime.076e84c93222dfd0.js} +2 -2
  21. package/out/static/client/{runtime.14f0bbf7912ff6c2.js.map → runtime.076e84c93222dfd0.js.map} +1 -1
  22. package/out/static/client/stats.json +319 -283
  23. package/out/static/client/styles-a11y-menu.bf24a870a8a4969f.js +1 -0
  24. package/out/static/client/styles-advertising.9f2b7bddc08575fc.js +1 -0
  25. package/out/static/client/styles-article-footer.aa9f8d240980b0f4.js +1 -0
  26. package/out/static/client/styles-banner.e738836bac789a8b.js +1 -0
  27. package/out/static/client/styles-baseline-indicator.c062716f3d033dd8.js +1 -0
  28. package/out/static/client/styles-blog-index.818261c8123bc042.js +1 -0
  29. package/out/static/client/styles-blog-post.96ce1680245bbc86.js +1 -0
  30. package/out/static/client/styles-breadcrumbs-bar.ed7d1440bdccf98f.js +1 -0
  31. package/out/static/client/styles-breadcrumbs.7599a269dc584d75.js +1 -0
  32. package/out/static/client/styles-button.de6a7b9b7548d84b.js +1 -0
  33. package/out/static/client/styles-content-section.a8bd7fde04898354.js +1 -0
  34. package/out/static/client/styles-contributor-spotlight.adad2e813e1667fe.js +1 -0
  35. package/out/static/client/styles-curriculum-about.eefa128bb415258c.js +1 -0
  36. package/out/static/client/styles-curriculum-default.a2692218d2b1a1f9.js +1 -0
  37. package/out/static/client/styles-curriculum-landing.2d51b8fce8f12b8d.js +1 -0
  38. package/out/static/client/styles-curriculum-module.f4ae8920ee1c92ff.js +1 -0
  39. package/out/static/client/styles-curriculum-overview.2d7c17b0f0b9bd92.js +1 -0
  40. package/out/static/client/styles-featured-articles.c54e8f6b90567441.js +1 -0
  41. package/out/static/client/styles-footer.cff8d2b7669e06a9.js +1 -0
  42. package/out/static/client/styles-generic-about.b31b672a5d394108.js +1 -0
  43. package/out/static/client/styles-generic-community.f7e5df670c7aeaf3.js +1 -0
  44. package/out/static/client/styles-generic-content.1a9e4b87d8a12a85.js +1 -0
  45. package/out/static/client/styles-generic-layout.76e37948146a2f39.js +1 -0
  46. package/out/static/client/styles-generic-sidebar.c07d266d1382c357.js +1 -0
  47. package/out/static/client/styles-generic-toc.342bb77a42e3cc84.js +1 -0
  48. package/out/static/client/{styles-global.e813b635d036a38b.css → styles-global.63980d9c69df1f6a.css} +2 -2
  49. package/out/static/client/{styles-global.e813b635d036a38b.css.map → styles-global.63980d9c69df1f6a.css.map} +1 -1
  50. package/out/static/client/styles-global.c2e6118d3b833b4a.js +1 -0
  51. package/out/static/client/styles-heading-anchor.79390408a0c88875.js +1 -0
  52. package/out/static/client/styles-homepage-body.20c015a218d0bc96.js +1 -0
  53. package/out/static/client/styles-homepage-contributor-spotlight.21f37f11b3bd4bda.js +1 -0
  54. package/out/static/client/styles-homepage-footer.24e66b627b59d99f.js +1 -0
  55. package/out/static/client/styles-homepage-header.1a75fa94f8bab5a0.js +1 -0
  56. package/out/static/client/styles-homepage-hero.f1bf55f1be2d516d.js +1 -0
  57. package/out/static/client/styles-homepage.cd5bf6213bc06b4e.js +1 -0
  58. package/out/static/client/styles-latest-news.0f32a584ef1ed171.js +1 -0
  59. package/out/static/client/styles-left-sidebar.d7d52289da7ba969.js +1 -0
  60. package/out/static/client/styles-logo.1ff82941fc133017.js +1 -0
  61. package/out/static/client/styles-mandala.2a99de27a8c19d02.js +1 -0
  62. package/out/static/client/styles-menu.13c3394ada0512ef.js +1 -0
  63. package/out/static/client/styles-navigation.f857f577084aa7ef.js +1 -0
  64. package/out/static/client/styles-not-found.0bdc6a72643ebe34.js +1 -0
  65. package/out/static/client/styles-observatory-landing.e709efc8103ee08c.js +1 -0
  66. package/out/static/client/styles-observatory-results.e098740504c0c0f0.js +1 -0
  67. package/out/static/client/styles-page-layout.2ab75fc5b95edf1b.js +1 -0
  68. package/out/static/client/styles-pagination.667a2af3eaebe782.js +1 -0
  69. package/out/static/client/styles-playground.c1339745dabdf1f6.js +1 -0
  70. package/out/static/client/styles-recent-contributions.706333df420f227c.js +1 -0
  71. package/out/static/client/styles-reference-layout.6eaaea648e7e4dce.js +1 -0
  72. package/out/static/client/styles-reference-toc.dcb67aadb5032e3f.js +1 -0
  73. package/out/static/client/styles-sandbox.c14203f7b76d9e70.js +1 -0
  74. package/out/static/client/styles-site-search.ba674569591c3348.js +1 -0
  75. package/out/static/client/styles-social-image.47d082e57762bfb4.css +2 -0
  76. package/out/static/client/styles-social-image.47d082e57762bfb4.css.map +1 -0
  77. package/out/static/client/styles-social-image.f457942a12584899.js +1 -0
  78. package/out/static/client/styles-translation-banner.c0bf41a60bc2fe87.js +1 -0
  79. package/out/static/client/styles-writer-toolbar.e7438b6d8e7c99f4.js +1 -0
  80. package/out/static/client/{styles.519e2a3b2b0392d7.js → styles.cbf2ca4b84823096.js} +2 -2
  81. package/out/static/client/{styles.519e2a3b2b0392d7.js.map → styles.cbf2ca4b84823096.js.map} +1 -1
  82. package/out/static/legacy/{145.f57152daa80bc354.js → 145.e71ec0c1d16bfeb6.js} +2 -2
  83. package/out/static/legacy/{145.f57152daa80bc354.js.map → 145.e71ec0c1d16bfeb6.js.map} +1 -1
  84. package/out/static/legacy/{2439.db04dec0f2bfe008.js → 2439.152ddc8eff5390cc.js} +2 -2
  85. package/out/static/legacy/{2439.db04dec0f2bfe008.js.map → 2439.152ddc8eff5390cc.js.map} +1 -1
  86. package/out/static/legacy/{2569.2ed6f988d52f6cb2.js → 2569.41b52dfae9ff5dbd.js} +2 -2
  87. package/out/static/legacy/{2569.2ed6f988d52f6cb2.js.map → 2569.41b52dfae9ff5dbd.js.map} +1 -1
  88. package/out/static/legacy/{3097.5ee3eace96d8c3ea.js → 3097.89f8c27a39d2d759.js} +2 -2
  89. package/out/static/legacy/{3097.5ee3eace96d8c3ea.js.map → 3097.89f8c27a39d2d759.js.map} +1 -1
  90. package/out/static/legacy/{4624.5f395686fe61b4a3.js → 4624.831090754998070f.js} +2 -2
  91. package/out/static/legacy/{4624.5f395686fe61b4a3.js.map → 4624.831090754998070f.js.map} +1 -1
  92. package/out/static/legacy/{4944.dff54c3109113729.js → 4944.d5de2520acb6bc03.js} +2 -2
  93. package/out/static/legacy/{4944.dff54c3109113729.js.map → 4944.d5de2520acb6bc03.js.map} +1 -1
  94. package/out/static/legacy/{4968.12b8af0a52d054ac.js → 4968.c5c0429688b49438.js} +2 -2
  95. package/out/static/legacy/{4968.12b8af0a52d054ac.js.map → 4968.c5c0429688b49438.js.map} +1 -1
  96. package/out/static/legacy/{652.702c9f7893508b7f.js → 652.984bbafca5a127d6.js} +2 -2
  97. package/out/static/legacy/{652.702c9f7893508b7f.js.map → 652.984bbafca5a127d6.js.map} +1 -1
  98. package/out/static/legacy/{6542.8f8dc41c1b7b4f3d.js → 6542.9ae1d636a2097c7a.js} +2 -2
  99. package/out/static/legacy/{6542.8f8dc41c1b7b4f3d.js.map → 6542.9ae1d636a2097c7a.js.map} +1 -1
  100. package/out/static/legacy/{6786.d37ed4aa6d7a5c1a.js → 6786.c180a40232e02d98.js} +3 -3
  101. package/out/static/legacy/{6786.d37ed4aa6d7a5c1a.js.map → 6786.c180a40232e02d98.js.map} +1 -1
  102. package/out/static/legacy/{8292.88217634072b2959.js → 8292.5a4929a466c7b3ca.js} +2 -2
  103. package/out/static/legacy/{8292.88217634072b2959.js.map → 8292.5a4929a466c7b3ca.js.map} +1 -1
  104. package/out/static/legacy/{8315.525575601119f224.js → 8315.732f4f8af2f04044.js} +2 -2
  105. package/out/static/legacy/{8315.525575601119f224.js.map → 8315.732f4f8af2f04044.js.map} +1 -1
  106. package/out/static/legacy/{8769.d63b4369d16f3391.js → 8769.c0eb10a75d355ed3.js} +2 -2
  107. package/out/static/legacy/{8769.d63b4369d16f3391.js.map → 8769.c0eb10a75d355ed3.js.map} +1 -1
  108. package/out/static/legacy/{9380.d18451f1d350375d.js → 9380.2e09c0a94dc10112.js} +2 -2
  109. package/out/static/legacy/{9380.d18451f1d350375d.js.map → 9380.2e09c0a94dc10112.js.map} +1 -1
  110. package/out/static/legacy/asset-manifest.json +20 -20
  111. package/out/static/legacy/{index.0b85877f879160b2.js → index.5e65b9f52e86ad40.js} +5 -5
  112. package/out/static/legacy/{index.0b85877f879160b2.js.LICENSE.txt → index.5e65b9f52e86ad40.js.LICENSE.txt} +1 -1
  113. package/out/static/legacy/{index.0b85877f879160b2.js.map → index.5e65b9f52e86ad40.js.map} +1 -1
  114. package/out/static/legacy/{index.645247acbde1c666.html → index.6838304b64f32836.html} +1 -1
  115. package/out/static/legacy/stats.json +14 -14
  116. package/out/static/legacy/{yari.46e28128e98126d7.js → yari.c8f274d3a31b194e.js} +6 -6
  117. package/out/static/legacy/{yari.46e28128e98126d7.js.LICENSE.txt → yari.c8f274d3a31b194e.js.LICENSE.txt} +1 -1
  118. package/out/static/legacy/{yari.46e28128e98126d7.js.map → yari.c8f274d3a31b194e.js.map} +1 -1
  119. package/out/static/ssr/8292.js +1 -1
  120. package/out/static/ssr/8292.js.map +1 -1
  121. package/out/static/ssr/index.js +149 -142
  122. package/out/static/ssr/index.js.map +1 -1
  123. package/out/static/ssr/stats.json +4 -4
  124. package/out/twitter-card-summary.46ac2375.png +0 -0
  125. package/package.json +16 -15
  126. package/public/twitter-card-summary.46ac2375.png +0 -0
  127. package/server.js +12 -1
  128. package/out/static/client/5183.e4104aeffa888fd3.js +0 -64
  129. package/out/static/client/5183.e4104aeffa888fd3.js.map +0 -1
  130. package/out/static/client/7047.5a3c9165bf33e8ef.js +0 -9
  131. package/out/static/client/7047.5a3c9165bf33e8ef.js.map +0 -1
  132. package/out/static/client/styles-a11y-menu.49f604eb400e3a1b.js +0 -1
  133. package/out/static/client/styles-advertising.206d401ac1918107.js +0 -1
  134. package/out/static/client/styles-article-footer.bf7a12a8f26de9d8.js +0 -1
  135. package/out/static/client/styles-banner.045fd9429c0b4559.js +0 -1
  136. package/out/static/client/styles-baseline-indicator.1a9a989c5eed2bd0.js +0 -1
  137. package/out/static/client/styles-blog-index.07075fbe70ea701a.js +0 -1
  138. package/out/static/client/styles-blog-post.f096d7b72acc54c7.js +0 -1
  139. package/out/static/client/styles-breadcrumbs-bar.b6d2903779905507.js +0 -1
  140. package/out/static/client/styles-breadcrumbs.7b6a3fca16762395.js +0 -1
  141. package/out/static/client/styles-button.68557b262acc04d5.js +0 -1
  142. package/out/static/client/styles-content-section.8b58198fcbb512cd.js +0 -1
  143. package/out/static/client/styles-contributor-spotlight.65897b7d1c3de5e6.js +0 -1
  144. package/out/static/client/styles-curriculum-about.013603624423e8b7.js +0 -1
  145. package/out/static/client/styles-curriculum-default.8d3cc74e416d99c0.js +0 -1
  146. package/out/static/client/styles-curriculum-landing.95ce2c9c6203fda2.js +0 -1
  147. package/out/static/client/styles-curriculum-module.6bd730e94b6ab4b0.js +0 -1
  148. package/out/static/client/styles-curriculum-overview.31fd536067fb14e7.js +0 -1
  149. package/out/static/client/styles-featured-articles.122a3779cde55236.js +0 -1
  150. package/out/static/client/styles-footer.fedc4476f04ebc15.js +0 -1
  151. package/out/static/client/styles-generic-about.7e63ff8a4b7851ef.js +0 -1
  152. package/out/static/client/styles-generic-community.dae09a544431e63d.js +0 -1
  153. package/out/static/client/styles-generic-content.16d08aa39ea401b9.js +0 -1
  154. package/out/static/client/styles-generic-layout.3e4f2f4951ea186b.js +0 -1
  155. package/out/static/client/styles-generic-sidebar.b2e094fc3c0756ab.js +0 -1
  156. package/out/static/client/styles-generic-toc.cd70dab26a1241d4.js +0 -1
  157. package/out/static/client/styles-global.339e7f9a94da6256.js +0 -1
  158. package/out/static/client/styles-heading-anchor.0deb48e0e151aba3.js +0 -1
  159. package/out/static/client/styles-homepage-body.cb1b213bec93efdd.js +0 -1
  160. package/out/static/client/styles-homepage-contributor-spotlight.1a2acbf06be6d425.js +0 -1
  161. package/out/static/client/styles-homepage-footer.3435c9576666f4a5.js +0 -1
  162. package/out/static/client/styles-homepage-header.6a6b4ebaf675e721.js +0 -1
  163. package/out/static/client/styles-homepage-hero.de64115a608af810.js +0 -1
  164. package/out/static/client/styles-homepage.09583f85e229d2de.js +0 -1
  165. package/out/static/client/styles-latest-news.d7d8beb1f187d6f5.js +0 -1
  166. package/out/static/client/styles-left-sidebar.62e4bdb34c86bc43.js +0 -1
  167. package/out/static/client/styles-logo.15608a14aefd9e51.js +0 -1
  168. package/out/static/client/styles-mandala.18c6e16ec318e10a.js +0 -1
  169. package/out/static/client/styles-menu.8011e6627accb1f3.js +0 -1
  170. package/out/static/client/styles-navigation.507be0a6a4278751.js +0 -1
  171. package/out/static/client/styles-not-found.5abe16a37f65b63a.js +0 -1
  172. package/out/static/client/styles-observatory-landing.2bda92fc6d68c4fc.js +0 -1
  173. package/out/static/client/styles-observatory-results.090bb92b82d036eb.js +0 -1
  174. package/out/static/client/styles-page-layout.ca4cbe58578a57eb.js +0 -1
  175. package/out/static/client/styles-pagination.cacd3f49e3de0552.js +0 -1
  176. package/out/static/client/styles-playground.1c172c9a3a8d9b79.js +0 -1
  177. package/out/static/client/styles-recent-contributions.45d4f26778c7ba5b.js +0 -1
  178. package/out/static/client/styles-reference-layout.d26c1e2e7b6dcf90.js +0 -1
  179. package/out/static/client/styles-reference-toc.bb1b05755fbc1108.js +0 -1
  180. package/out/static/client/styles-sandbox.a14cc003eeaa8914.js +0 -1
  181. package/out/static/client/styles-site-search.76d1310c8fe1b8fb.js +0 -1
  182. package/out/static/client/styles-translation-banner.c9804ae977f28550.js +0 -1
  183. package/out/static/client/styles-writer-toolbar.e88f55bfa22d6f0e.js +0 -1
  184. /package/out/static/client/{5183.e4104aeffa888fd3.js.LICENSE.txt → 5183.ed3575d7370b617c.js.LICENSE.txt} +0 -0
  185. /package/out/static/client/{index.a7f592ef6e4f2a0e.js.LICENSE.txt → index.0e1f202766cdb426.js.LICENSE.txt} +0 -0
  186. /package/out/static/legacy/{6786.d37ed4aa6d7a5c1a.js.LICENSE.txt → 6786.c180a40232e02d98.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"6542.8f8dc41c1b7b4f3d.js","sources":["webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/ui/atoms/search/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/search-filter/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/common/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/updates/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/updates/api.ts","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/ui/atoms/container/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/ui/molecules/paginator/index.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport \"./index.scss\";\n\ntype SearchProps = {\n name: string;\n placeholder?: string;\n value?: string;\n isDisabled?: boolean;\n onBlurHandler?: (event: React.FocusEvent<HTMLInputElement>) => void;\n onChangeHandler?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n onClickHandler?: (event: React.MouseEvent<Element>) => void;\n onFocusHandler?: (event: React.FocusEvent<Element>) => void;\n onResetHandler?: () => void;\n};\n\nexport const Search = ({\n name,\n isDisabled = false,\n onBlurHandler,\n onChangeHandler,\n onClickHandler,\n onFocusHandler,\n onResetHandler,\n placeholder,\n value,\n}: SearchProps) => {\n return (\n <div className=\"search-form search-widget\">\n <input\n type=\"search\"\n className=\"search-input-field\"\n name={name}\n placeholder={placeholder}\n value={value}\n disabled={isDisabled}\n onBlur={(e) =>\n onBlurHandler &&\n !e.currentTarget.parentElement?.contains(e.relatedTarget) &&\n onBlurHandler(e)\n }\n onFocus={onFocusHandler}\n onChange={onChangeHandler}\n onClick={onClickHandler}\n />\n\n {onResetHandler && (\n <button\n type=\"button\"\n className=\"button action has-icon clear-search-button\"\n onClick={onResetHandler}\n >\n <span className=\"button-wrap\">\n <span className=\"icon icon-cancel\"></span>\n <span className=\"visually-hidden\">Clear search input</span>\n </span>\n </button>\n )}\n\n <button\n type=\"submit\"\n disabled={isDisabled}\n className=\"button action has-icon search-button search-filter-button\"\n >\n <span className=\"button-wrap\">\n <span className=\"icon icon-search\"></span>\n <span className=\"visually-hidden\">Search</span>\n </span>\n </button>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\n\nimport { Button } from \"../../ui/atoms/button\";\nimport { Search } from \"../../ui/atoms/search\";\nimport { Submenu } from \"../../ui/molecules/submenu\";\n\nimport \"./index.scss\";\nimport { DropdownMenu, DropdownMenuWrapper } from \"../../ui/molecules/dropdown\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { camelUnwrap } from \"../../utils\";\n\nexport type AnyFilter = SelectFilter;\n\ntype SelectFilter = {\n type: \"select\";\n key: string;\n label: string;\n multiple?: {\n encode: (...values: string[]) => string;\n decode: (value: string) => string[];\n };\n options: {\n label: string;\n value: string;\n isDefault?: true;\n }[];\n};\n\nexport type AnySort = { label: string; param: string; isDefault?: true };\n\nenum Params {\n PAGE = \"page\",\n QUERY = \"q\",\n}\n\nexport default function SearchFilter({\n isDisabled = false,\n filters = [],\n sorts = [],\n onChange = (key, newValue, oldValue) => {},\n}: {\n isDisabled?: boolean;\n filters?: AnyFilter[];\n sorts?: AnySort[];\n onChange?: (\n key: string,\n newValue: string | null,\n oldValue: string | null\n ) => unknown;\n}) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const [openFilter, setOpenFilter] = useState<string | null>(null);\n const [isSortingOpen, setIsSortingOpen] = useState<boolean>(false);\n const [terms, setTerms] = useState<string>(\"\");\n\n useEffect(\n () => setTerms(searchParams.get(Params.QUERY) ?? \"\"),\n [searchParams]\n );\n\n const sortedParams = (params: URLSearchParams): URLSearchParams =>\n new URLSearchParams(\n [...params.entries()].sort(([a], [b]) => a.localeCompare(b))\n );\n\n const replaceSearchParam = (key: string, value: string | null) => {\n setSearchParams((params) => {\n const oldValue = params.get(key);\n if (value) {\n params.set(key, value);\n } else {\n params.delete(key);\n }\n onChange(key, value, oldValue);\n params.delete(Params.PAGE);\n return sortedParams(params);\n });\n };\n\n const isDefaultFilter = (key: string, value: string) => {\n const filter = filters.find((filter) => filter.key === key) as AnyFilter;\n const option = filter.options.find((option) => option.value === value);\n return option?.isDefault ?? false;\n };\n\n const isCurrentFilter = (key: string, value: string) => {\n const currentValue = searchParams.get(key) ?? null;\n const filter = filters.find((filter) => filter.key === key) as AnyFilter;\n\n if (filter.multiple) {\n const values =\n typeof currentValue === \"string\"\n ? filter.multiple.decode(currentValue)\n : [];\n return values.includes(value);\n } else {\n return currentValue\n ? currentValue === value\n : isDefaultFilter(key, value);\n }\n };\n\n const isDefaultSort = (param: string) => {\n const sort = sorts.find((sort) => sort.param === param);\n return sort?.isDefault ?? false;\n };\n\n const isCurrentSort = (param: string) => {\n const [key, value] = param.split(\"=\", 2);\n const currentValue = searchParams.get(key) ?? null;\n return currentValue ? currentValue === value : isDefaultSort(param);\n };\n\n const toggleSelectedFilter = (key: string, value: string) => {\n const currentValue = searchParams.get(key) ?? null;\n const filter = filters.find((filter) => filter.key === key) as AnyFilter;\n let newValue: string | null;\n\n if (filter.multiple) {\n let values =\n typeof currentValue === \"string\"\n ? filter.multiple.decode(currentValue)\n : [];\n if (values.includes(value)) {\n values = values.filter((v) => v !== value);\n } else {\n values = [...values, value].sort();\n }\n if (values.length) {\n newValue = filter.multiple.encode(...values);\n } else {\n newValue = null;\n }\n } else if (isDefaultFilter(key, value)) {\n newValue = null;\n } else {\n newValue = currentValue !== value ? value : null;\n }\n\n replaceSearchParam(key, newValue);\n };\n\n const toggleSelectedSort = (param: string) => {\n const [key, value] = param.split(\"=\", 2);\n const newValue = isDefaultSort(param) ? \"\" : value;\n\n replaceSearchParam(key, newValue);\n };\n\n const setSelectedTerms = (newValue: string) => {\n replaceSearchParam(\"q\", newValue);\n };\n\n const filterMenus = filters.map((filter) => ({\n key: filter.key,\n label: filter.label,\n id: `filters-menu-${filter.key}`,\n items: filter.options.map((option) => ({\n component: () => (\n <Button\n isDisabled={isDisabled}\n type=\"action\"\n extraClasses={\n isCurrentFilter(filter.key, option.value) ? \"active-menu-item\" : \"\"\n }\n onClickHandler={() => {\n toggleSelectedFilter(filter.key, option.value);\n }}\n >\n {option.label}\n </Button>\n ),\n })),\n }));\n\n const sortMenu = {\n label: \"Sort\",\n id: \"sort-menu\",\n items: sorts.map((sort) => ({\n component: () => (\n <Button\n isDisabled={isDisabled}\n type=\"action\"\n extraClasses={isCurrentSort(sort.param) ? \"active-menu-item\" : \"\"}\n onClickHandler={() => toggleSelectedSort(sort.param)}\n >\n {sort.label}\n </Button>\n ),\n })),\n };\n\n return (\n <form\n className={`search-filter ${\n !filters.length ? \"inline-on-mobile\" : undefined\n }`}\n onSubmit={(event: React.FormEvent) => {\n event.preventDefault();\n setSelectedTerms(terms);\n }}\n >\n {filterMenus.map((filterMenu) => (\n <DropdownMenuWrapper\n key={filterMenu.key}\n className=\"search-filter-category search-filter-filters\"\n isOpen={openFilter === filterMenu.key}\n setIsOpen={(isOpen: boolean) =>\n setOpenFilter(isOpen ? filterMenu.key : null)\n }\n >\n <Button\n type=\"select\"\n aria-controls={filterMenu.id}\n aria-haspopup={\"menu\"}\n aria-expanded={openFilter === filterMenu.key}\n extraClasses={`${\n searchParams.get(filterMenu.key) ? \"active\" : \"\"\n } ${isDisabled ? \"inactive\" : \"\"}`}\n onClickHandler={() =>\n setOpenFilter(\n openFilter === filterMenu.key ? null : filterMenu.key\n )\n }\n isDisabled={filterMenu.items.length === 0}\n >\n {filterMenu.label}\n </Button>\n <DropdownMenu>\n <Submenu\n submenuId={filterMenu.id}\n menuEntry={filterMenu}\n isDropdown\n />\n </DropdownMenu>\n </DropdownMenuWrapper>\n ))}\n\n <Search\n isDisabled={isDisabled}\n name=\"terms\"\n placeholder=\"Filter by keyword\"\n value={terms}\n onBlurHandler={() =>\n // The updates event list uses `camelWrap()` to insert\n // zero-width spaces, so we `camelUnwrap()` them here.\n // Otherwise we would not find a copy-pasted feature.\n setSelectedTerms(camelUnwrap(terms))\n }\n onChangeHandler={(e) => setTerms(e.target.value)}\n onResetHandler={() => {\n setTerms(\"\");\n setSelectedTerms(\"\");\n }}\n />\n\n {sorts.length ? (\n <DropdownMenuWrapper\n className=\"search-filter-category search-filter-sorts\"\n isOpen={isSortingOpen}\n setIsOpen={setIsSortingOpen}\n >\n <Button\n type=\"select\"\n aria-controls={sortMenu.id}\n aria-haspopup={\"menu\"}\n aria-expanded={isSortingOpen || undefined}\n extraClasses={`${searchParams.get(\"sort\") ? \"active\" : \"\"} ${\n isDisabled ? \"inactive\" : \"\"\n }`}\n onClickHandler={() => {\n setIsSortingOpen(!isSortingOpen);\n }}\n >\n {sortMenu.label}\n </Button>\n <DropdownMenu>\n <Submenu submenuId={sortMenu.id} menuEntry={sortMenu} isDropdown />\n </DropdownMenu>\n </DropdownMenuWrapper>\n ) : null}\n </form>\n );\n}\n","import LogInLink from \"../../ui/atoms/login-link\";\nimport NoteCard from \"../../ui/molecules/notecards\";\nimport { getCategoryByPathname } from \"../../utils\";\n\nexport function NotSignedIn() {\n return (\n <div className=\"container\">\n <h3>You have not signed in</h3>\n <LogInLink />\n </div>\n );\n}\n\nexport function NotSubscriber() {\n return (\n <>\n <h2>You are signed in but not an active subscriber</h2>\n <LogInLink />\n </>\n );\n}\n\nexport function DataError({ error }: { error: Error }) {\n return (\n <NoteCard type=\"negative\">\n <h3>Server error</h3>\n <p>A server error occurred trying to get your collections.</p>\n <p>\n <code>{error.toString()}</code>\n </p>\n <a href={window.location.pathname}>Reload this page and try again.</a>\n </NoteCard>\n );\n}\n\nexport function _getIconLabel(url: string) {\n const category = getCategoryByPathname(url);\n\n if (!category) {\n return \"docs\";\n }\n\n if (category === \"javascript\") {\n return \"js\";\n }\n\n if (category === \"accessibility\") {\n return \"acc\";\n }\n\n return category;\n}\n","import Container from \"../../ui/atoms/container\";\n\nimport useSWR from \"swr\";\nimport { DocMetadata } from \"../../../../libs/types/document\";\nimport { FeatureId, MDN_PLUS_TITLE } from \"../../constants\";\nimport { useLocale, useScrollToTop, useViewedState } from \"../../hooks\";\nimport { Button } from \"../../ui/atoms/button\";\nimport { Icon } from \"../../ui/atoms/icon\";\nimport { Loading } from \"../../ui/atoms/loading\";\nimport Mandala from \"../../ui/molecules/mandala\";\nimport { Paginator } from \"../../ui/molecules/paginator\";\nimport BookmarkMenu from \"../../ui/organisms/article-actions/bookmark-menu\";\nimport { useUserData } from \"../../user-context\";\nimport { camelWrap, range } from \"../../utils\";\nimport { Event, Group, useUpdates } from \"./api\";\nimport \"./index.scss\";\nimport { useGleanClick } from \"../../telemetry/glean-context\";\nimport { PLUS_UPDATES } from \"../../telemetry/constants\";\nimport SearchFilter, { AnyFilter, AnySort } from \"../search-filter\";\nimport { useEffect, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { DataError } from \"../common\";\nimport { useCollections } from \"../collections/api\";\nimport React from \"react\";\n\nconst LazyCompatTable = React.lazy(\n () => import(\"../../lit/compat/lazy-compat-table.js\")\n);\n\ntype EventWithStatus = Event & { status: Status };\ntype Status = \"added\" | \"removed\";\n\nconst CATEGORY_TO_NAME = {\n api: \"Web APIs\",\n css: \"CSS\",\n html: \"HTML\",\n http: \"HTTP\",\n javascript: \"JavaScript\",\n mathml: \"MathML\",\n svg: \"SVG\",\n webdriver: \"WebDriver\",\n webextensions: \"Web Extensions\",\n};\n\n// At some point, these should come from the API\n// or from @mdn/browser-compat-data directly.\nconst BROWSERS = {\n chrome: \"Chrome\",\n chrome_android: \"Chrome Android\",\n deno: \"Deno\",\n edge: \"Edge\",\n firefox: \"Firefox\",\n firefox_android: \"Firefox for Android\",\n ie: \"Internet Explorer\",\n nodejs: \"Node.js\",\n opera: \"Opera\",\n opera_android: \"Opera Android\",\n safari: \"Safari\",\n safari_ios: \"Safari on iOS\",\n samsunginternet_android: \"Samsung Internet\",\n webview_android: \"WebView Android\",\n};\n\nconst FILTERS: AnyFilter[] = [\n {\n type: \"select\",\n multiple: {\n encode: (...values: string[]) => values.join(\",\"),\n decode: (value: string) => value.split(\",\"),\n },\n label: \"Browser\",\n key: \"browsers\",\n options: Object.entries(BROWSERS).map(([value, label]) => ({\n label,\n value,\n })),\n },\n {\n type: \"select\",\n multiple: {\n encode: (...values: string[]) => values.join(\",\"),\n decode: (value: string) => value.split(\",\"),\n },\n label: \"Category\",\n key: \"category\",\n options: Object.entries(CATEGORY_TO_NAME)\n .sort(([, a], [, b]) => a.localeCompare(b))\n .map(([value, label]) => ({\n label,\n value,\n })),\n },\n {\n type: \"select\",\n label: \"Collections\",\n key: \"collections\",\n multiple: {\n encode: (...values: string[]) => values.join(\",\"),\n decode: (value: string) => value.split(\",\"),\n },\n options: [],\n },\n];\n\nconst SORTS: AnySort[] = [\n {\n label: \"Newest\",\n param: \"sort=desc\",\n isDefault: true,\n },\n {\n label: \"Oldest\",\n param: \"sort=asc\",\n },\n];\n\nexport default function Updates() {\n return <UpdatesLayout />;\n}\n\nconst useFilters = (canFilter: boolean) => {\n const [filters, setFilters] = useState(FILTERS);\n const { data, isLoading, error } = useCollections();\n useEffect(() => {\n if (!isLoading && data?.length && !error) {\n setFilters((old) =>\n old.map((val) => {\n if (val.key === \"collections\") {\n return {\n ...val,\n options: data\n ?.filter((collection) => collection.article_count > 0)\n .map((info) => {\n const label =\n info.name === \"Default\" ? \"Saved Articles\" : info.name;\n return {\n label,\n value: info.id,\n };\n }),\n };\n } else {\n return val;\n }\n })\n );\n }\n }, [isLoading, canFilter, data, error]);\n return filters;\n};\n\nfunction UpdatesLayout() {\n document.title = `Updates | ${MDN_PLUS_TITLE}`;\n useScrollToTop();\n const user = useUserData();\n const { data, error } = useUpdates();\n const gleanClick = useGleanClick();\n const [searchParams, setSearchParams] = useSearchParams();\n const { setViewed } = useViewedState();\n useEffect(() => setViewed(FeatureId.PLUS_UPDATES_V2));\n\n const hasFilters = [...searchParams.keys()].some((key) => key !== \"page\");\n\n const canFilter = user?.isAuthenticated === true;\n const filters = useFilters(canFilter);\n\n return (\n <div className=\"updates\">\n <header className=\"plus-header-mandala\">\n <Container>\n <h1>\n <div className=\"mandala-icon-wrapper\">\n <Mandala />\n <Icon name=\"bell-filled\" />\n </div>\n <span>Updates</span>\n </h1>\n <p>\n Stay up-to-date with the latest browser features.\n <br />\n <a\n href=\"https://survey.alchemer.com/s3/7149796/MDN-BCD-Updates\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"external\"\n >\n We'd love to hear your feedback!\n </a>\n </p>\n </Container>\n </header>\n <Container>\n {canFilter && (\n <SearchFilter\n filters={filters}\n sorts={SORTS}\n isDisabled={!canFilter}\n onChange={(key, newValue, oldValue) =>\n gleanClick(\n `${PLUS_UPDATES.FILTER_CHANGE}_${key}: ${\n oldValue ?? \"(default)\"\n } -> ${newValue ?? \"(default)\"}`\n )\n }\n />\n )}\n\n {canFilter && hasFilters && (\n <Button\n type=\"action\"\n extraClasses=\"reset-filters\"\n onClickHandler={() => setSearchParams(\"\")}\n >\n Reset all filters\n </Button>\n )}\n\n {error && <DataError error={error} />}\n\n {data ? (\n <>\n {data.data.length ? (\n data.data.map((group) => (\n <GroupComponent\n key={group.browser + group.version}\n group={group}\n />\n ))\n ) : (\n <div className=\"notecard\">\n {hasFilters\n ? \"No updates match your filters.\"\n : \"No updates found.\"}\n </div>\n )}\n <Paginator\n last={data.last}\n onChange={(page, oldPage) =>\n gleanClick(`${PLUS_UPDATES.PAGE_CHANGE}: ${oldPage} -> ${page}`)\n }\n />\n </>\n ) : (\n <Loading />\n )}\n </Container>\n </div>\n );\n}\n\nfunction GroupComponent({ group }: { group: Group }) {\n const { release_date, events, browser, version, name } = group;\n const length = events.added.length + events.removed.length;\n const metadata = {\n icon: browserToIconName(browser),\n title: `${name} ${version}`,\n };\n\n const allEvents = [\n ...events.added.map((e) => ({ status: \"added\", ...e })),\n ...events.removed.map((e) => ({ status: \"removed\", ...e })),\n ].sort((a, b) => a.path.localeCompare(b.path)) as EventWithStatus[];\n\n return metadata ? (\n <div className=\"group\">\n <header>\n <Icon name={metadata.icon} />\n {metadata.title}\n <span className=\"number-badge\">\n {length} {length === 1 ? \"update\" : \"updates\"}\n </span>\n <time dateTime={release_date}>\n {new Date(release_date).toLocaleDateString(undefined, {\n dateStyle: \"medium\",\n })}\n </time>\n </header>\n {collapseEvents(allEvents).map((event) => (\n <EventComponent key={event.path} event={event} status={event.status} />\n ))}\n </div>\n ) : null;\n}\n\nfunction collapseEvents<T extends { path: string }>(events: T[]): T[] {\n return events.filter(\n (event) =>\n events.findIndex(\n (e) => e.path === event.path.split(\".\").slice(0, -1).join(\".\")\n ) === -1\n );\n}\n\nfunction EventComponent({ event, status }: { event: Event; status: Status }) {\n const [isOpen, setIsOpen] = useState(false);\n const [category, ...displayPath] = event.path.split(\".\");\n const engines = event.compat.engines;\n const gleanClick = useGleanClick();\n\n return (\n <details\n className={`category-${category}`}\n onToggle={({ target }) => {\n if (target instanceof HTMLDetailsElement) {\n setIsOpen(target.open);\n const source = target.open\n ? PLUS_UPDATES.EVENT_EXPAND\n : PLUS_UPDATES.EVENT_COLLAPSE;\n gleanClick(source);\n }\n }}\n >\n <summary>\n <code>{camelWrap(displayPath.join(\".\"))}</code>\n <i>{CATEGORY_TO_NAME[category]}</i>\n <EventStatus status={status} />\n {Boolean(engines.length) && (\n <span className=\"status\" title={`Supported in ${engines.join(\", \")}`}>\n <svg width=\"32\" height=\"9\" viewBox=\"0 0 32 9\" role=\"img\">\n {range(0, 3).map((n) => (\n <circle\n key={n}\n cx={4 + n * 12}\n cy=\"4.5\"\n r=\"4\"\n className={engines.length > n ? \"active\" : undefined}\n />\n ))}\n </svg>\n </span>\n )}\n <Icon name=\"chevron\" />\n </summary>\n {isOpen && <EventInnerComponent event={event} />}\n </details>\n );\n}\n\nfunction EventStatus({ status }: { status: Status }) {\n return <span className={`badge status-${status}`}>{status}</span>;\n}\n\nfunction EventInnerComponent({\n event: {\n path,\n compat: { mdn_url },\n },\n}: {\n event: Event;\n}) {\n const locale = useLocale();\n return (\n <div>\n <ArticleActions path={path} mdn_url={mdn_url} />\n <LazyCompatTable query={path} locale={locale} />\n </div>\n );\n}\n\nfunction ArticleActions({ path, mdn_url }: { path: string; mdn_url?: string }) {\n const userData = useUserData();\n const locale = useLocale();\n const url = mdn_url?.replace(\"https://developer.mozilla.org\", `/${locale}`);\n const searchUrl = `/${locale}/search?sort=relevance&locale=en-US${\n locale !== \"en-US\" ? `&locale=${locale}` : \"\"\n }&q=${encodeURIComponent(path)}`;\n const { data: doc } = useSWR<DocMetadata>(\n () => userData?.isAuthenticated && url && `${url}/metadata.json`,\n async (url) => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw Error(response.statusText);\n }\n\n return (await response.json()) as DocMetadata;\n },\n {\n revalidateIfStale: false,\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n }\n );\n\n return (\n <nav>\n <Button\n type=\"action\"\n icon={url ? \"external\" : \"search\"}\n size=\"small\"\n href={url || searchUrl}\n target=\"_blank\"\n extraClasses=\"link-button\"\n >\n {url ? \"See full article\" : \"Search for article\"}\n </Button>\n {url && (\n <>\n <BookmarkMenu doc={doc} />\n </>\n )}\n </nav>\n );\n}\n\nfunction browserToIconName(browser: string) {\n if (browser.startsWith(\"firefox\")) {\n return \"simple-firefox\";\n } else if (browser === \"webview_android\") {\n return \"webview\";\n } else if (browser === \"webview_ios\") {\n return \"safari\";\n } else {\n const browserStart = browser.split(\"_\")[0];\n return browserStart;\n }\n}\n","import useSWR from \"swr\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { useUserData } from \"../../user-context\";\nimport { BCD_BASE_URL } from \"../../env\";\n\nexport interface Event {\n path: string;\n compat: {\n mdn_url?: string;\n source_file: string;\n spec_url?: string[];\n status: {\n deprecated: boolean;\n experimental: boolean;\n standard_track: boolean;\n };\n engines: string[];\n };\n}\n\nexport interface Group {\n browser: string;\n version: string;\n release_date: string;\n engine: string;\n engine_version: string;\n release_notes: string[];\n status: string;\n name: string;\n events: {\n added: Event[];\n removed: Event[];\n };\n}\n\ninterface Page {\n data: Group[];\n last: number;\n}\n\nfunction composeUrl({\n isAuthenticated,\n searchParams,\n}: {\n isAuthenticated: boolean;\n searchParams: URLSearchParams;\n}): string {\n let url = \"/api/v2/updates/\";\n let params = new URLSearchParams();\n\n for (const [key, value] of searchParams.entries()) {\n switch (key) {\n case \"page\":\n params.set(key, value);\n break;\n\n case \"collections\":\n if (isAuthenticated) {\n // Different endpoint for uncached personalized data.\n url += \"collections/\";\n params.set(key, value);\n }\n break;\n\n default:\n if (isAuthenticated) {\n params.set(key, value);\n }\n break;\n }\n }\n\n if ([...params.keys()].length) {\n url += `?${params.toString()}`;\n }\n\n return url;\n}\n\nexport function useUpdates() {\n const user = useUserData();\n const [searchParams] = useSearchParams();\n\n const url = composeUrl({\n isAuthenticated: user?.isAuthenticated || false,\n searchParams,\n });\n\n return useSWR(\n url,\n async (key) => {\n const res = await fetch(key);\n if (res.ok) {\n return (await res.json()) as Page;\n }\n if (res.status === 404) {\n return;\n }\n throw new Error(`${res.status}: ${res.statusText}`);\n },\n {\n revalidateOnFocus: false,\n revalidateIfStale: false,\n revalidateOnReconnect: false,\n }\n );\n}\n\nexport function useBCD(path: string) {\n return useSWR(\n `${BCD_BASE_URL}/bcd/api/v0/current/${path}.json`,\n async (key) => {\n const res = await fetch(key);\n if (res.ok) {\n return await res.json();\n }\n if (res.status === 404) {\n return;\n }\n throw new Error(`${res.status}: ${res.statusText}`);\n },\n {\n revalidateOnFocus: false,\n revalidateIfStale: false,\n revalidateOnReconnect: false,\n }\n );\n}\n","import \"./index.scss\";\n\nexport default function Container({\n children,\n extraClasses,\n optional,\n}: {\n children: React.ReactNode;\n extraClasses?: string;\n optional?: boolean;\n}) {\n return (\n <>\n {optional === true ? (\n <>{children}</>\n ) : (\n <div className={`container ${extraClasses || \"\"}`}>{children}</div>\n )}\n </>\n );\n}\n","import { Link, useSearchParams } from \"react-router-dom\";\nimport { range } from \"../../../utils\";\n\nconst PARAM = \"page\";\n\nfunction PageLink({\n page,\n children,\n onClick,\n disabled,\n}: {\n page: number;\n children?: React.ReactNode;\n onClick?: (page: number) => unknown;\n disabled?: boolean;\n}) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n return (\n <Link\n to={{}}\n className={disabled ? \"disabled\" : \"\"}\n onClick={(event) => {\n event.preventDefault();\n if (disabled) {\n return;\n }\n\n onClick && onClick(page);\n setSearchParams({\n ...Object.fromEntries(searchParams.entries()),\n [PARAM]: page.toString(),\n });\n\n window.setTimeout(() => document.documentElement.scrollTo());\n }}\n >\n {children || page}\n </Link>\n );\n}\n\nexport function Paginator({\n first = 1,\n last,\n endPadding = 2,\n middlePadding = 2,\n onChange,\n}: {\n first?: number;\n last: number;\n endPadding?: number;\n middlePadding?: number;\n onChange?: (page: number, oldPage: number) => unknown;\n}) {\n const [searchParams] = useSearchParams();\n const current = parseInt(searchParams.get(PARAM) || \"\", 10) || first;\n const middleFirst = Math.max(current - middlePadding, first);\n const middleLast = Math.min(middleFirst + middlePadding * 2 + 1, last + 1);\n const left = range(first, Math.min(endPadding, middleFirst));\n const middle = range(middleFirst, middleLast);\n const right = range(Math.max(last + 1 - endPadding, middleLast), last + 1);\n\n const onClick = (page: number) => {\n onChange && onChange(page, current);\n };\n\n if (first === last) {\n // There are no pages, so return nothing\n return <></>;\n }\n\n return (\n <div className=\"pagination\">\n <PageLink\n page={current - 1}\n onClick={onClick}\n disabled={current === first}\n >\n ← Previous\n </PageLink>\n {left.map((page) => (\n <PageLink key={page} page={page} onClick={onClick} />\n ))}\n {Boolean(left.length) && left[left.length - 1] + 1 !== middle[0] && \"…\"}\n {middle.map((page) =>\n current === page ? (\n <span className=\"current-page\" key={page}>\n {page}\n </span>\n ) : (\n <PageLink key={page} page={page} onClick={onClick} />\n )\n )}\n {Boolean(right.length) &&\n middle[middle.length - 1] + 1 !== right[0] &&\n \"…\"}\n {right.map((page) => (\n <PageLink key={page} page={page} onClick={onClick} />\n ))}\n <PageLink\n page={current + 1}\n onClick={onClick}\n disabled={current === last}\n >\n Next →\n </PageLink>\n </div>\n );\n}\n"],"names":["Search","name","isDisabled","onBlurHandler","onChangeHandler","onClickHandler","onFocusHandler","onResetHandler","placeholder","value","e","_e_currentTarget_parentElement","SearchFilter","param","filters","sorts","onChange","key","newValue","oldValue","_useSearchParams","searchParams","setSearchParams","_useState","openFilter","setOpenFilter","_useState1","isSortingOpen","setIsSortingOpen","_useState2","terms","setTerms","useEffect","_searchParams_get","replaceSearchParam","params","URLSearchParams","a","b","isDefaultFilter","option","filter","isCurrentFilter","currentValue","values","isDefaultSort","sort","isCurrentSort","_param_split","toggleSelectedFilter","_filter_multiple","v","toggleSelectedSort","setSelectedTerms","filterMenus","Button","sortMenu","undefined","event","filterMenu","DropdownMenuWrapper","isOpen","DropdownMenu","Submenu","camelUnwrap","DataError","error","NoteCard","window","LazyCompatTable","React","CATEGORY_TO_NAME","FILTERS","Object","label","SORTS","Updates","UpdatesLayout","useFilters","canFilter","setFilters","_useCollections","data","isLoading","old","val","collection","info","document","MDN_PLUS_TITLE","useScrollToTop","user","url","useUserData","_useUpdates","composeUrl","isAuthenticated","_iteratorError","useSWR","res","fetch","Error","gleanClick","useGleanClick","setViewed","useViewedState","FeatureId","hasFilters","Container","Mandala","Icon","PLUS_UPDATES","group","GroupComponent","Paginator","page","oldPage","Loading","browser","events","release_date","version","length","metadata","allEvents","Date","collapseEvents","EventComponent","status","setIsOpen","_event_path_split","category","displayPath","engines","target","HTMLDetailsElement","camelWrap","EventStatus","Boolean","range","n","EventInnerComponent","path","mdn_url","locale","useLocale","ArticleActions","userData","searchUrl","encodeURIComponent","doc","_useSWR","response","BookmarkMenu","children","extraClasses","optional","PARAM","PageLink","onClick","disabled","Link","first","last","endPadding","middlePadding","current","parseInt","middleFirst","Math","middleLast","left","middle","right"],"mappings":"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"}
1
+ {"version":3,"file":"6542.9ae1d636a2097c7a.js","sources":["webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/ui/atoms/search/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/search-filter/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/common/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/updates/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/plus/updates/api.ts","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/ui/atoms/container/index.tsx","webpack://@mdn/fred/./node_modules/@mdn/yari/client/src/ui/molecules/paginator/index.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport \"./index.scss\";\n\ntype SearchProps = {\n name: string;\n placeholder?: string;\n value?: string;\n isDisabled?: boolean;\n onBlurHandler?: (event: React.FocusEvent<HTMLInputElement>) => void;\n onChangeHandler?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n onClickHandler?: (event: React.MouseEvent<Element>) => void;\n onFocusHandler?: (event: React.FocusEvent<Element>) => void;\n onResetHandler?: () => void;\n};\n\nexport const Search = ({\n name,\n isDisabled = false,\n onBlurHandler,\n onChangeHandler,\n onClickHandler,\n onFocusHandler,\n onResetHandler,\n placeholder,\n value,\n}: SearchProps) => {\n return (\n <div className=\"search-form search-widget\">\n <input\n type=\"search\"\n className=\"search-input-field\"\n name={name}\n placeholder={placeholder}\n value={value}\n disabled={isDisabled}\n onBlur={(e) =>\n onBlurHandler &&\n !e.currentTarget.parentElement?.contains(e.relatedTarget) &&\n onBlurHandler(e)\n }\n onFocus={onFocusHandler}\n onChange={onChangeHandler}\n onClick={onClickHandler}\n />\n\n {onResetHandler && (\n <button\n type=\"button\"\n className=\"button action has-icon clear-search-button\"\n onClick={onResetHandler}\n >\n <span className=\"button-wrap\">\n <span className=\"icon icon-cancel\"></span>\n <span className=\"visually-hidden\">Clear search input</span>\n </span>\n </button>\n )}\n\n <button\n type=\"submit\"\n disabled={isDisabled}\n className=\"button action has-icon search-button search-filter-button\"\n >\n <span className=\"button-wrap\">\n <span className=\"icon icon-search\"></span>\n <span className=\"visually-hidden\">Search</span>\n </span>\n </button>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\n\nimport { Button } from \"../../ui/atoms/button\";\nimport { Search } from \"../../ui/atoms/search\";\nimport { Submenu } from \"../../ui/molecules/submenu\";\n\nimport \"./index.scss\";\nimport { DropdownMenu, DropdownMenuWrapper } from \"../../ui/molecules/dropdown\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { camelUnwrap } from \"../../utils\";\n\nexport type AnyFilter = SelectFilter;\n\ntype SelectFilter = {\n type: \"select\";\n key: string;\n label: string;\n multiple?: {\n encode: (...values: string[]) => string;\n decode: (value: string) => string[];\n };\n options: {\n label: string;\n value: string;\n isDefault?: true;\n }[];\n};\n\nexport type AnySort = { label: string; param: string; isDefault?: true };\n\nenum Params {\n PAGE = \"page\",\n QUERY = \"q\",\n}\n\nexport default function SearchFilter({\n isDisabled = false,\n filters = [],\n sorts = [],\n onChange = (key, newValue, oldValue) => {},\n}: {\n isDisabled?: boolean;\n filters?: AnyFilter[];\n sorts?: AnySort[];\n onChange?: (\n key: string,\n newValue: string | null,\n oldValue: string | null\n ) => unknown;\n}) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const [openFilter, setOpenFilter] = useState<string | null>(null);\n const [isSortingOpen, setIsSortingOpen] = useState<boolean>(false);\n const [terms, setTerms] = useState<string>(\"\");\n\n useEffect(\n () => setTerms(searchParams.get(Params.QUERY) ?? \"\"),\n [searchParams]\n );\n\n const sortedParams = (params: URLSearchParams): URLSearchParams =>\n new URLSearchParams(\n [...params.entries()].sort(([a], [b]) => a.localeCompare(b))\n );\n\n const replaceSearchParam = (key: string, value: string | null) => {\n setSearchParams((params) => {\n const oldValue = params.get(key);\n if (value) {\n params.set(key, value);\n } else {\n params.delete(key);\n }\n onChange(key, value, oldValue);\n params.delete(Params.PAGE);\n return sortedParams(params);\n });\n };\n\n const isDefaultFilter = (key: string, value: string) => {\n const filter = filters.find((filter) => filter.key === key) as AnyFilter;\n const option = filter.options.find((option) => option.value === value);\n return option?.isDefault ?? false;\n };\n\n const isCurrentFilter = (key: string, value: string) => {\n const currentValue = searchParams.get(key) ?? null;\n const filter = filters.find((filter) => filter.key === key) as AnyFilter;\n\n if (filter.multiple) {\n const values =\n typeof currentValue === \"string\"\n ? filter.multiple.decode(currentValue)\n : [];\n return values.includes(value);\n } else {\n return currentValue\n ? currentValue === value\n : isDefaultFilter(key, value);\n }\n };\n\n const isDefaultSort = (param: string) => {\n const sort = sorts.find((sort) => sort.param === param);\n return sort?.isDefault ?? false;\n };\n\n const isCurrentSort = (param: string) => {\n const [key, value] = param.split(\"=\", 2);\n const currentValue = searchParams.get(key) ?? null;\n return currentValue ? currentValue === value : isDefaultSort(param);\n };\n\n const toggleSelectedFilter = (key: string, value: string) => {\n const currentValue = searchParams.get(key) ?? null;\n const filter = filters.find((filter) => filter.key === key) as AnyFilter;\n let newValue: string | null;\n\n if (filter.multiple) {\n let values =\n typeof currentValue === \"string\"\n ? filter.multiple.decode(currentValue)\n : [];\n if (values.includes(value)) {\n values = values.filter((v) => v !== value);\n } else {\n values = [...values, value].sort();\n }\n if (values.length) {\n newValue = filter.multiple.encode(...values);\n } else {\n newValue = null;\n }\n } else if (isDefaultFilter(key, value)) {\n newValue = null;\n } else {\n newValue = currentValue !== value ? value : null;\n }\n\n replaceSearchParam(key, newValue);\n };\n\n const toggleSelectedSort = (param: string) => {\n const [key, value] = param.split(\"=\", 2);\n const newValue = isDefaultSort(param) ? \"\" : value;\n\n replaceSearchParam(key, newValue);\n };\n\n const setSelectedTerms = (newValue: string) => {\n replaceSearchParam(\"q\", newValue);\n };\n\n const filterMenus = filters.map((filter) => ({\n key: filter.key,\n label: filter.label,\n id: `filters-menu-${filter.key}`,\n items: filter.options.map((option) => ({\n component: () => (\n <Button\n isDisabled={isDisabled}\n type=\"action\"\n extraClasses={\n isCurrentFilter(filter.key, option.value) ? \"active-menu-item\" : \"\"\n }\n onClickHandler={() => {\n toggleSelectedFilter(filter.key, option.value);\n }}\n >\n {option.label}\n </Button>\n ),\n })),\n }));\n\n const sortMenu = {\n label: \"Sort\",\n id: \"sort-menu\",\n items: sorts.map((sort) => ({\n component: () => (\n <Button\n isDisabled={isDisabled}\n type=\"action\"\n extraClasses={isCurrentSort(sort.param) ? \"active-menu-item\" : \"\"}\n onClickHandler={() => toggleSelectedSort(sort.param)}\n >\n {sort.label}\n </Button>\n ),\n })),\n };\n\n return (\n <form\n className={`search-filter ${\n !filters.length ? \"inline-on-mobile\" : undefined\n }`}\n onSubmit={(event: React.FormEvent) => {\n event.preventDefault();\n setSelectedTerms(terms);\n }}\n >\n {filterMenus.map((filterMenu) => (\n <DropdownMenuWrapper\n key={filterMenu.key}\n className=\"search-filter-category search-filter-filters\"\n isOpen={openFilter === filterMenu.key}\n setIsOpen={(isOpen: boolean) =>\n setOpenFilter(isOpen ? filterMenu.key : null)\n }\n >\n <Button\n type=\"select\"\n aria-controls={filterMenu.id}\n aria-haspopup={\"menu\"}\n aria-expanded={openFilter === filterMenu.key}\n extraClasses={`${\n searchParams.get(filterMenu.key) ? \"active\" : \"\"\n } ${isDisabled ? \"inactive\" : \"\"}`}\n onClickHandler={() =>\n setOpenFilter(\n openFilter === filterMenu.key ? null : filterMenu.key\n )\n }\n isDisabled={filterMenu.items.length === 0}\n >\n {filterMenu.label}\n </Button>\n <DropdownMenu>\n <Submenu\n submenuId={filterMenu.id}\n menuEntry={filterMenu}\n isDropdown\n />\n </DropdownMenu>\n </DropdownMenuWrapper>\n ))}\n\n <Search\n isDisabled={isDisabled}\n name=\"terms\"\n placeholder=\"Filter by keyword\"\n value={terms}\n onBlurHandler={() =>\n // The updates event list uses `camelWrap()` to insert\n // zero-width spaces, so we `camelUnwrap()` them here.\n // Otherwise we would not find a copy-pasted feature.\n setSelectedTerms(camelUnwrap(terms))\n }\n onChangeHandler={(e) => setTerms(e.target.value)}\n onResetHandler={() => {\n setTerms(\"\");\n setSelectedTerms(\"\");\n }}\n />\n\n {sorts.length ? (\n <DropdownMenuWrapper\n className=\"search-filter-category search-filter-sorts\"\n isOpen={isSortingOpen}\n setIsOpen={setIsSortingOpen}\n >\n <Button\n type=\"select\"\n aria-controls={sortMenu.id}\n aria-haspopup={\"menu\"}\n aria-expanded={isSortingOpen || undefined}\n extraClasses={`${searchParams.get(\"sort\") ? \"active\" : \"\"} ${\n isDisabled ? \"inactive\" : \"\"\n }`}\n onClickHandler={() => {\n setIsSortingOpen(!isSortingOpen);\n }}\n >\n {sortMenu.label}\n </Button>\n <DropdownMenu>\n <Submenu submenuId={sortMenu.id} menuEntry={sortMenu} isDropdown />\n </DropdownMenu>\n </DropdownMenuWrapper>\n ) : null}\n </form>\n );\n}\n","import LogInLink from \"../../ui/atoms/login-link\";\nimport NoteCard from \"../../ui/molecules/notecards\";\nimport { getCategoryByPathname } from \"../../utils\";\n\nexport function NotSignedIn() {\n return (\n <div className=\"container\">\n <h3>You have not signed in</h3>\n <LogInLink />\n </div>\n );\n}\n\nexport function NotSubscriber() {\n return (\n <>\n <h2>You are signed in but not an active subscriber</h2>\n <LogInLink />\n </>\n );\n}\n\nexport function DataError({ error }: { error: Error }) {\n return (\n <NoteCard type=\"negative\">\n <h3>Server error</h3>\n <p>A server error occurred trying to get your collections.</p>\n <p>\n <code>{error.toString()}</code>\n </p>\n <a href={window.location.pathname}>Reload this page and try again.</a>\n </NoteCard>\n );\n}\n\nexport function _getIconLabel(url: string) {\n const category = getCategoryByPathname(url);\n\n if (!category) {\n return \"docs\";\n }\n\n if (category === \"javascript\") {\n return \"js\";\n }\n\n if (category === \"accessibility\") {\n return \"acc\";\n }\n\n return category;\n}\n","import Container from \"../../ui/atoms/container\";\n\nimport useSWR from \"swr\";\nimport { DocMetadata } from \"../../../../libs/types/document\";\nimport { FeatureId, MDN_PLUS_TITLE } from \"../../constants\";\nimport { useLocale, useScrollToTop, useViewedState } from \"../../hooks\";\nimport { Button } from \"../../ui/atoms/button\";\nimport { Icon } from \"../../ui/atoms/icon\";\nimport { Loading } from \"../../ui/atoms/loading\";\nimport Mandala from \"../../ui/molecules/mandala\";\nimport { Paginator } from \"../../ui/molecules/paginator\";\nimport BookmarkMenu from \"../../ui/organisms/article-actions/bookmark-menu\";\nimport { useUserData } from \"../../user-context\";\nimport { camelWrap, range } from \"../../utils\";\nimport { Event, Group, useUpdates } from \"./api\";\nimport \"./index.scss\";\nimport { useGleanClick } from \"../../telemetry/glean-context\";\nimport { PLUS_UPDATES } from \"../../telemetry/constants\";\nimport SearchFilter, { AnyFilter, AnySort } from \"../search-filter\";\nimport { useEffect, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { DataError } from \"../common\";\nimport { useCollections } from \"../collections/api\";\nimport React from \"react\";\n\nconst LazyCompatTable = React.lazy(\n () => import(\"../../lit/compat/lazy-compat-table.js\")\n);\n\ntype EventWithStatus = Event & { status: Status };\ntype Status = \"added\" | \"removed\";\n\nconst CATEGORY_TO_NAME = {\n api: \"Web APIs\",\n css: \"CSS\",\n html: \"HTML\",\n http: \"HTTP\",\n javascript: \"JavaScript\",\n mathml: \"MathML\",\n svg: \"SVG\",\n webdriver: \"WebDriver\",\n webextensions: \"Web Extensions\",\n};\n\n// At some point, these should come from the API\n// or from @mdn/browser-compat-data directly.\nconst BROWSERS = {\n chrome: \"Chrome\",\n chrome_android: \"Chrome Android\",\n deno: \"Deno\",\n edge: \"Edge\",\n firefox: \"Firefox\",\n firefox_android: \"Firefox for Android\",\n ie: \"Internet Explorer\",\n nodejs: \"Node.js\",\n opera: \"Opera\",\n opera_android: \"Opera Android\",\n safari: \"Safari\",\n safari_ios: \"Safari on iOS\",\n samsunginternet_android: \"Samsung Internet\",\n webview_android: \"WebView Android\",\n};\n\nconst FILTERS: AnyFilter[] = [\n {\n type: \"select\",\n multiple: {\n encode: (...values: string[]) => values.join(\",\"),\n decode: (value: string) => value.split(\",\"),\n },\n label: \"Browser\",\n key: \"browsers\",\n options: Object.entries(BROWSERS).map(([value, label]) => ({\n label,\n value,\n })),\n },\n {\n type: \"select\",\n multiple: {\n encode: (...values: string[]) => values.join(\",\"),\n decode: (value: string) => value.split(\",\"),\n },\n label: \"Category\",\n key: \"category\",\n options: Object.entries(CATEGORY_TO_NAME)\n .sort(([, a], [, b]) => a.localeCompare(b))\n .map(([value, label]) => ({\n label,\n value,\n })),\n },\n {\n type: \"select\",\n label: \"Collections\",\n key: \"collections\",\n multiple: {\n encode: (...values: string[]) => values.join(\",\"),\n decode: (value: string) => value.split(\",\"),\n },\n options: [],\n },\n];\n\nconst SORTS: AnySort[] = [\n {\n label: \"Newest\",\n param: \"sort=desc\",\n isDefault: true,\n },\n {\n label: \"Oldest\",\n param: \"sort=asc\",\n },\n];\n\nexport default function Updates() {\n return <UpdatesLayout />;\n}\n\nconst useFilters = (canFilter: boolean) => {\n const [filters, setFilters] = useState(FILTERS);\n const { data, isLoading, error } = useCollections();\n useEffect(() => {\n if (!isLoading && data?.length && !error) {\n setFilters((old) =>\n old.map((val) => {\n if (val.key === \"collections\") {\n return {\n ...val,\n options: data\n ?.filter((collection) => collection.article_count > 0)\n .map((info) => {\n const label =\n info.name === \"Default\" ? \"Saved Articles\" : info.name;\n return {\n label,\n value: info.id,\n };\n }),\n };\n } else {\n return val;\n }\n })\n );\n }\n }, [isLoading, canFilter, data, error]);\n return filters;\n};\n\nfunction UpdatesLayout() {\n document.title = `Updates | ${MDN_PLUS_TITLE}`;\n useScrollToTop();\n const user = useUserData();\n const { data, error } = useUpdates();\n const gleanClick = useGleanClick();\n const [searchParams, setSearchParams] = useSearchParams();\n const { setViewed } = useViewedState();\n useEffect(() => setViewed(FeatureId.PLUS_UPDATES_V2));\n\n const hasFilters = [...searchParams.keys()].some((key) => key !== \"page\");\n\n const canFilter = user?.isAuthenticated === true;\n const filters = useFilters(canFilter);\n\n return (\n <div className=\"updates\">\n <header className=\"plus-header-mandala\">\n <Container>\n <h1>\n <div className=\"mandala-icon-wrapper\">\n <Mandala />\n <Icon name=\"bell-filled\" />\n </div>\n <span>Updates</span>\n </h1>\n <p>\n Stay up-to-date with the latest browser features.\n <br />\n <a\n href=\"https://survey.alchemer.com/s3/7149796/MDN-BCD-Updates\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"external\"\n >\n We'd love to hear your feedback!\n </a>\n </p>\n </Container>\n </header>\n <Container>\n {canFilter && (\n <SearchFilter\n filters={filters}\n sorts={SORTS}\n isDisabled={!canFilter}\n onChange={(key, newValue, oldValue) =>\n gleanClick(\n `${PLUS_UPDATES.FILTER_CHANGE}_${key}: ${\n oldValue ?? \"(default)\"\n } -> ${newValue ?? \"(default)\"}`\n )\n }\n />\n )}\n\n {canFilter && hasFilters && (\n <Button\n type=\"action\"\n extraClasses=\"reset-filters\"\n onClickHandler={() => setSearchParams(\"\")}\n >\n Reset all filters\n </Button>\n )}\n\n {error && <DataError error={error} />}\n\n {data ? (\n <>\n {data.data.length ? (\n data.data.map((group) => (\n <GroupComponent\n key={group.browser + group.version}\n group={group}\n />\n ))\n ) : (\n <div className=\"notecard\">\n {hasFilters\n ? \"No updates match your filters.\"\n : \"No updates found.\"}\n </div>\n )}\n <Paginator\n last={data.last}\n onChange={(page, oldPage) =>\n gleanClick(`${PLUS_UPDATES.PAGE_CHANGE}: ${oldPage} -> ${page}`)\n }\n />\n </>\n ) : (\n <Loading />\n )}\n </Container>\n </div>\n );\n}\n\nfunction GroupComponent({ group }: { group: Group }) {\n const { release_date, events, browser, version, name } = group;\n const length = events.added.length + events.removed.length;\n const metadata = {\n icon: browserToIconName(browser),\n title: `${name} ${version}`,\n };\n\n const allEvents = [\n ...events.added.map((e) => ({ status: \"added\", ...e })),\n ...events.removed.map((e) => ({ status: \"removed\", ...e })),\n ].sort((a, b) => a.path.localeCompare(b.path)) as EventWithStatus[];\n\n return metadata ? (\n <div className=\"group\">\n <header>\n <Icon name={metadata.icon} />\n {metadata.title}\n <span className=\"number-badge\">\n {length} {length === 1 ? \"update\" : \"updates\"}\n </span>\n <time dateTime={release_date}>\n {new Date(release_date).toLocaleDateString(undefined, {\n dateStyle: \"medium\",\n })}\n </time>\n </header>\n {collapseEvents(allEvents).map((event) => (\n <EventComponent key={event.path} event={event} status={event.status} />\n ))}\n </div>\n ) : null;\n}\n\nfunction collapseEvents<T extends { path: string }>(events: T[]): T[] {\n return events.filter(\n (event) =>\n events.findIndex(\n (e) => e.path === event.path.split(\".\").slice(0, -1).join(\".\")\n ) === -1\n );\n}\n\nfunction EventComponent({ event, status }: { event: Event; status: Status }) {\n const [isOpen, setIsOpen] = useState(false);\n const [category, ...displayPath] = event.path.split(\".\");\n const engines = event.compat.engines;\n const gleanClick = useGleanClick();\n\n return (\n <details\n className={`category-${category}`}\n onToggle={({ target }) => {\n if (target instanceof HTMLDetailsElement) {\n setIsOpen(target.open);\n const source = target.open\n ? PLUS_UPDATES.EVENT_EXPAND\n : PLUS_UPDATES.EVENT_COLLAPSE;\n gleanClick(source);\n }\n }}\n >\n <summary>\n <code>{camelWrap(displayPath.join(\".\"))}</code>\n <i>{CATEGORY_TO_NAME[category]}</i>\n <EventStatus status={status} />\n {Boolean(engines.length) && (\n <span className=\"status\" title={`Supported in ${engines.join(\", \")}`}>\n <svg width=\"32\" height=\"9\" viewBox=\"0 0 32 9\" role=\"img\">\n {range(0, 3).map((n) => (\n <circle\n key={n}\n cx={4 + n * 12}\n cy=\"4.5\"\n r=\"4\"\n className={engines.length > n ? \"active\" : undefined}\n />\n ))}\n </svg>\n </span>\n )}\n <Icon name=\"chevron\" />\n </summary>\n {isOpen && <EventInnerComponent event={event} />}\n </details>\n );\n}\n\nfunction EventStatus({ status }: { status: Status }) {\n return <span className={`badge status-${status}`}>{status}</span>;\n}\n\nfunction EventInnerComponent({\n event: {\n path,\n compat: { mdn_url },\n },\n}: {\n event: Event;\n}) {\n const locale = useLocale();\n return (\n <div>\n <ArticleActions path={path} mdn_url={mdn_url} />\n <LazyCompatTable query={path} locale={locale} />\n </div>\n );\n}\n\nfunction ArticleActions({ path, mdn_url }: { path: string; mdn_url?: string }) {\n const userData = useUserData();\n const locale = useLocale();\n const url = mdn_url?.replace(\"https://developer.mozilla.org\", `/${locale}`);\n const searchUrl = `/${locale}/search?sort=relevance&locale=en-US${\n locale !== \"en-US\" ? `&locale=${locale}` : \"\"\n }&q=${encodeURIComponent(path)}`;\n const { data: doc } = useSWR<DocMetadata>(\n () => userData?.isAuthenticated && url && `${url}/metadata.json`,\n async (url) => {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw Error(response.statusText);\n }\n\n return (await response.json()) as DocMetadata;\n },\n {\n revalidateIfStale: false,\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n }\n );\n\n return (\n <nav>\n <Button\n type=\"action\"\n icon={url ? \"external\" : \"search\"}\n size=\"small\"\n href={url || searchUrl}\n target=\"_blank\"\n extraClasses=\"link-button\"\n >\n {url ? \"See full article\" : \"Search for article\"}\n </Button>\n {url && (\n <>\n <BookmarkMenu doc={doc} />\n </>\n )}\n </nav>\n );\n}\n\nfunction browserToIconName(browser: string) {\n if (browser.startsWith(\"firefox\")) {\n return \"simple-firefox\";\n } else if (browser === \"webview_android\") {\n return \"webview\";\n } else if (browser === \"webview_ios\") {\n return \"safari\";\n } else {\n const browserStart = browser.split(\"_\")[0];\n return browserStart;\n }\n}\n","import useSWR from \"swr\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { useUserData } from \"../../user-context\";\nimport { BCD_BASE_URL } from \"../../env\";\n\nexport interface Event {\n path: string;\n compat: {\n mdn_url?: string;\n source_file: string;\n spec_url?: string[];\n status: {\n deprecated: boolean;\n experimental: boolean;\n standard_track: boolean;\n };\n engines: string[];\n };\n}\n\nexport interface Group {\n browser: string;\n version: string;\n release_date: string;\n engine: string;\n engine_version: string;\n release_notes: string[];\n status: string;\n name: string;\n events: {\n added: Event[];\n removed: Event[];\n };\n}\n\ninterface Page {\n data: Group[];\n last: number;\n}\n\nfunction composeUrl({\n isAuthenticated,\n searchParams,\n}: {\n isAuthenticated: boolean;\n searchParams: URLSearchParams;\n}): string {\n let url = \"/api/v2/updates/\";\n let params = new URLSearchParams();\n\n for (const [key, value] of searchParams.entries()) {\n switch (key) {\n case \"page\":\n params.set(key, value);\n break;\n\n case \"collections\":\n if (isAuthenticated) {\n // Different endpoint for uncached personalized data.\n url += \"collections/\";\n params.set(key, value);\n }\n break;\n\n default:\n if (isAuthenticated) {\n params.set(key, value);\n }\n break;\n }\n }\n\n if ([...params.keys()].length) {\n url += `?${params.toString()}`;\n }\n\n return url;\n}\n\nexport function useUpdates() {\n const user = useUserData();\n const [searchParams] = useSearchParams();\n\n const url = composeUrl({\n isAuthenticated: user?.isAuthenticated || false,\n searchParams,\n });\n\n return useSWR(\n url,\n async (key) => {\n const res = await fetch(key);\n if (res.ok) {\n return (await res.json()) as Page;\n }\n if (res.status === 404) {\n return;\n }\n throw new Error(`${res.status}: ${res.statusText}`);\n },\n {\n revalidateOnFocus: false,\n revalidateIfStale: false,\n revalidateOnReconnect: false,\n }\n );\n}\n\nexport function useBCD(path: string) {\n return useSWR(\n `${BCD_BASE_URL}/bcd/api/v0/current/${path}.json`,\n async (key) => {\n const res = await fetch(key);\n if (res.ok) {\n return await res.json();\n }\n if (res.status === 404) {\n return;\n }\n throw new Error(`${res.status}: ${res.statusText}`);\n },\n {\n revalidateOnFocus: false,\n revalidateIfStale: false,\n revalidateOnReconnect: false,\n }\n );\n}\n","import \"./index.scss\";\n\nexport default function Container({\n children,\n extraClasses,\n optional,\n}: {\n children: React.ReactNode;\n extraClasses?: string;\n optional?: boolean;\n}) {\n return (\n <>\n {optional === true ? (\n <>{children}</>\n ) : (\n <div className={`container ${extraClasses || \"\"}`}>{children}</div>\n )}\n </>\n );\n}\n","import { Link, useSearchParams } from \"react-router-dom\";\nimport { range } from \"../../../utils\";\n\nconst PARAM = \"page\";\n\nfunction PageLink({\n page,\n children,\n onClick,\n disabled,\n}: {\n page: number;\n children?: React.ReactNode;\n onClick?: (page: number) => unknown;\n disabled?: boolean;\n}) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n return (\n <Link\n to={{}}\n className={disabled ? \"disabled\" : \"\"}\n onClick={(event) => {\n event.preventDefault();\n if (disabled) {\n return;\n }\n\n onClick && onClick(page);\n setSearchParams({\n ...Object.fromEntries(searchParams.entries()),\n [PARAM]: page.toString(),\n });\n\n window.setTimeout(() => document.documentElement.scrollTo());\n }}\n >\n {children || page}\n </Link>\n );\n}\n\nexport function Paginator({\n first = 1,\n last,\n endPadding = 2,\n middlePadding = 2,\n onChange,\n}: {\n first?: number;\n last: number;\n endPadding?: number;\n middlePadding?: number;\n onChange?: (page: number, oldPage: number) => unknown;\n}) {\n const [searchParams] = useSearchParams();\n const current = parseInt(searchParams.get(PARAM) || \"\", 10) || first;\n const middleFirst = Math.max(current - middlePadding, first);\n const middleLast = Math.min(middleFirst + middlePadding * 2 + 1, last + 1);\n const left = range(first, Math.min(endPadding, middleFirst));\n const middle = range(middleFirst, middleLast);\n const right = range(Math.max(last + 1 - endPadding, middleLast), last + 1);\n\n const onClick = (page: number) => {\n onChange && onChange(page, current);\n };\n\n if (first === last) {\n // There are no pages, so return nothing\n return <></>;\n }\n\n return (\n <div className=\"pagination\">\n <PageLink\n page={current - 1}\n onClick={onClick}\n disabled={current === first}\n >\n ← Previous\n </PageLink>\n {left.map((page) => (\n <PageLink key={page} page={page} onClick={onClick} />\n ))}\n {Boolean(left.length) && left[left.length - 1] + 1 !== middle[0] && \"…\"}\n {middle.map((page) =>\n current === page ? (\n <span className=\"current-page\" key={page}>\n {page}\n </span>\n ) : (\n <PageLink key={page} page={page} onClick={onClick} />\n )\n )}\n {Boolean(right.length) &&\n middle[middle.length - 1] + 1 !== right[0] &&\n \"…\"}\n {right.map((page) => (\n <PageLink key={page} page={page} onClick={onClick} />\n ))}\n <PageLink\n page={current + 1}\n onClick={onClick}\n disabled={current === last}\n >\n Next →\n </PageLink>\n </div>\n );\n}\n"],"names":["Search","name","isDisabled","onBlurHandler","onChangeHandler","onClickHandler","onFocusHandler","onResetHandler","placeholder","value","e","_e_currentTarget_parentElement","SearchFilter","param","filters","sorts","onChange","key","newValue","oldValue","_useSearchParams","searchParams","setSearchParams","_useState","openFilter","setOpenFilter","_useState1","isSortingOpen","setIsSortingOpen","_useState2","terms","setTerms","useEffect","_searchParams_get","replaceSearchParam","params","URLSearchParams","a","b","isDefaultFilter","option","filter","isCurrentFilter","currentValue","values","isDefaultSort","sort","isCurrentSort","_param_split","toggleSelectedFilter","_filter_multiple","v","toggleSelectedSort","setSelectedTerms","filterMenus","Button","sortMenu","undefined","event","filterMenu","DropdownMenuWrapper","isOpen","DropdownMenu","Submenu","camelUnwrap","DataError","error","NoteCard","window","LazyCompatTable","React","CATEGORY_TO_NAME","FILTERS","Object","label","SORTS","Updates","UpdatesLayout","useFilters","canFilter","setFilters","_useCollections","data","isLoading","old","val","collection","info","document","MDN_PLUS_TITLE","useScrollToTop","user","url","useUserData","_useUpdates","composeUrl","isAuthenticated","_iteratorError","useSWR","res","fetch","Error","gleanClick","useGleanClick","setViewed","useViewedState","FeatureId","hasFilters","Container","Mandala","Icon","PLUS_UPDATES","group","GroupComponent","Paginator","page","oldPage","Loading","browser","events","release_date","version","length","metadata","allEvents","Date","collapseEvents","EventComponent","status","setIsOpen","_event_path_split","category","displayPath","engines","target","HTMLDetailsElement","camelWrap","EventStatus","Boolean","range","n","EventInnerComponent","path","mdn_url","locale","useLocale","ArticleActions","userData","searchUrl","encodeURIComponent","doc","_useSWR","response","BookmarkMenu","children","extraClasses","optional","PARAM","PageLink","onClick","disabled","Link","first","last","endPadding","middlePadding","current","parseInt","middleFirst","Math","middleLast","left","middle","right"],"mappings":"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"}