@mdn/fred 0.0.3 → 0.0.5

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 (173) hide show
  1. package/.github/workflows/npm-publish.yml +18 -4
  2. package/.prettierignore +1 -0
  3. package/.release-please-manifest.json +3 -0
  4. package/CHANGELOG.md +30 -0
  5. package/components/advertising/server.js +1 -1
  6. package/components/blog-index/server.js +1 -1
  7. package/components/blog-post/server.js +1 -1
  8. package/components/color/global.css +2 -0
  9. package/components/homepage-hero/server.css +6 -0
  10. package/components/homepage-hero/server.js +0 -1
  11. package/components/observatory-landing/faq.js +1 -1
  12. package/components/observatory-landing/feedback.js +1 -1
  13. package/components/observatory-landing/server.js +1 -1
  14. package/components/observatory-results/server.js +1 -1
  15. package/components/placement-sidebar/element.css +7 -0
  16. package/components/reference-layout/server.css +2 -0
  17. package/components/reference-toc/server.js +1 -1
  18. package/components/search-modal/element.css +131 -4
  19. package/components/search-modal/element.js +60 -25
  20. package/dist/client/1739.1435a6d3f1a2dd88.js +8 -0
  21. package/dist/client/1739.1435a6d3f1a2dd88.js.map +1 -0
  22. package/dist/client/2776.435ecffa5f77c7eb.js +43 -0
  23. package/dist/client/2776.435ecffa5f77c7eb.js.map +1 -0
  24. package/dist/client/{5837.f6d4c078ffaaacdd.js → 5837.52bd8ccde0085adc.js} +2 -2
  25. package/dist/client/5837.52bd8ccde0085adc.js.map +1 -0
  26. package/dist/client/{7293.b60a1f58515f31a2.js → 7293.b57f88f90b72c988.js} +2 -2
  27. package/dist/client/{7293.b60a1f58515f31a2.js.map → 7293.b57f88f90b72c988.js.map} +1 -1
  28. package/dist/client/{8483.0c0da6fab68fab50.js → 8483.651683d5e2cbae52.js} +2 -2
  29. package/dist/client/{8483.0c0da6fab68fab50.js.map → 8483.651683d5e2cbae52.js.map} +1 -1
  30. package/dist/client/{8551.e33e50ee71f44812.js → 8551.4cf05a456e8b9b36.js} +2 -2
  31. package/dist/client/8551.4cf05a456e8b9b36.js.map +1 -0
  32. package/dist/client/9551.23d0a332e0083e6c.js +16 -0
  33. package/dist/client/9551.23d0a332e0083e6c.js.map +1 -0
  34. package/dist/client/{9565.5e45ab3e0d622510.js → 9565.faafbc9f4c1268c1.js} +2 -2
  35. package/dist/client/9565.faafbc9f4c1268c1.js.map +1 -0
  36. package/dist/client/{index.a2573f654d416e75.js → index.f81a73f443949b54.js} +2 -2
  37. package/dist/client/{index.a2573f654d416e75.js.map → index.f81a73f443949b54.js.map} +1 -1
  38. package/dist/client/{runtime.25188d4f5ff249c3.js → runtime.a1cce37ae8fd8f1d.js} +2 -2
  39. package/dist/client/{runtime.25188d4f5ff249c3.js.map → runtime.a1cce37ae8fd8f1d.js.map} +1 -1
  40. package/dist/client/stats.json +462 -462
  41. package/dist/client/styles-a11y-menu.3ddb63a73a9c8c9b.js +1 -0
  42. package/dist/client/styles-advertising.89daa4b1babb5d7c.js +1 -0
  43. package/dist/client/styles-article-footer.aad4b81dfb2f25aa.js +1 -0
  44. package/dist/client/styles-banner.b00e4ed105869308.js +1 -0
  45. package/dist/client/styles-baseline-indicator.b4fff7b664a71278.js +1 -0
  46. package/dist/client/styles-blog-index.bfa0b41dd840cec9.js +1 -0
  47. package/dist/client/styles-blog-post.589bea0672ef6cfe.js +1 -0
  48. package/dist/client/styles-breadcrumbs-bar.1135acbe7353b72f.js +1 -0
  49. package/dist/client/styles-breadcrumbs.41165c22e7482511.js +1 -0
  50. package/dist/client/styles-button.9f72d7a8fee3a671.js +1 -0
  51. package/dist/client/styles-content-section.ff53f1079444e3be.js +1 -0
  52. package/dist/client/styles-contributor-spotlight.9a65604ef7cf6f72.js +1 -0
  53. package/dist/client/styles-curriculum-about.8da72a5697ee54c6.js +1 -0
  54. package/dist/client/styles-curriculum-default.36e79c6e85e661a6.js +1 -0
  55. package/dist/client/styles-curriculum-landing.92b1373346b15e6a.js +1 -0
  56. package/dist/client/styles-curriculum-module.45185c94b78788e1.js +1 -0
  57. package/dist/client/styles-curriculum-overview.61995cbb01819033.js +1 -0
  58. package/dist/client/styles-featured-articles.616852431f1e0ee4.js +1 -0
  59. package/dist/client/styles-footer.f16abca2043e46bb.js +1 -0
  60. package/dist/client/styles-generic-about.14bc0114374d65e7.js +1 -0
  61. package/dist/client/styles-generic-community.614ed8dfbcb62ea7.js +1 -0
  62. package/dist/client/styles-generic-content.32ed38732d0f3b45.js +1 -0
  63. package/dist/client/styles-generic-layout.b69ebe87382c0d4a.js +1 -0
  64. package/dist/client/styles-generic-sidebar.08698c1b14c8b476.js +1 -0
  65. package/dist/client/styles-generic-toc.30e78be425cba070.js +1 -0
  66. package/dist/client/{styles-global.a3ba01d8e2fca47b.js → styles-global.29cd4720c8834abd.js} +1 -1
  67. package/dist/client/{styles-global.3d9e085f0247e92c.css → styles-global.f515b2bde4d7df93.css} +2 -2
  68. package/dist/client/styles-global.f515b2bde4d7df93.css.map +1 -0
  69. package/dist/client/styles-heading-anchor.e8129df53b41bd49.js +1 -0
  70. package/dist/client/styles-homepage-body.0b19b0a2038d4e78.js +1 -0
  71. package/dist/client/styles-homepage-contributor-spotlight.8daa31290a0a5f18.js +1 -0
  72. package/dist/client/styles-homepage-footer.78ba9c3277b58bf3.js +1 -0
  73. package/dist/client/styles-homepage-header.be93cd932f41267d.js +1 -0
  74. package/dist/client/styles-homepage-hero.4ed7235d37aa37cf.js +1 -0
  75. package/dist/client/{styles-homepage-hero.ca54e4bc0c0b420e.css → styles-homepage-hero.6d83a175f7f76d29.css} +2 -2
  76. package/dist/client/styles-homepage-hero.6d83a175f7f76d29.css.map +1 -0
  77. package/dist/client/styles-homepage.4da96775e9ab92bf.js +1 -0
  78. package/dist/client/styles-latest-news.80e70c9afcc04226.js +1 -0
  79. package/dist/client/styles-left-sidebar.58bfaf3c10109a49.js +1 -0
  80. package/dist/client/styles-logo.53efe8dc644a9839.js +1 -0
  81. package/dist/client/styles-mandala.52b580d4cf59fa4f.js +1 -0
  82. package/dist/client/styles-menu.ab201de6ebb3686a.js +1 -0
  83. package/dist/client/styles-navigation.176cffc5e646d9a9.js +1 -0
  84. package/dist/client/styles-not-found.a35e816ca45b2bf5.js +1 -0
  85. package/dist/client/styles-observatory-landing.b162eac949784932.js +1 -0
  86. package/dist/client/styles-observatory-results.d902d3f1dbcf45d7.js +1 -0
  87. package/dist/client/styles-page-layout.a371293b6209ae16.js +1 -0
  88. package/dist/client/styles-pagination.1310b1c891cb6a5a.js +1 -0
  89. package/dist/client/styles-playground.88e73c644d4c1008.js +1 -0
  90. package/dist/client/styles-recent-contributions.c27a16f4c3f97461.js +1 -0
  91. package/dist/client/{styles-reference-layout.4b0aca3ae954f961.css → styles-reference-layout.ac37f9e3a27faaac.css} +2 -2
  92. package/dist/client/styles-reference-layout.ac37f9e3a27faaac.css.map +1 -0
  93. package/dist/client/styles-reference-layout.f009e8667518e87e.js +1 -0
  94. package/dist/client/styles-reference-toc.f201a765d7115477.js +1 -0
  95. package/dist/client/styles-sandbox.7d80ef02b6c1e504.js +1 -0
  96. package/dist/client/styles-translation-banner.ccf3c42b9943fc48.js +1 -0
  97. package/dist/client/{styles.911adb13c338ef51.js → styles.4f05a7e79fd0f3ee.js} +2 -2
  98. package/dist/client/{styles.911adb13c338ef51.js.map → styles.4f05a7e79fd0f3ee.js.map} +1 -1
  99. package/dist/legacy/{index.420b003bd21312e0.js → index.b481dadaaa935e27.js} +3 -3
  100. package/dist/legacy/{index.420b003bd21312e0.js.map → index.b481dadaaa935e27.js.map} +1 -1
  101. package/dist/legacy/stats.json +6 -6
  102. package/dist/ssr/7293.js +1 -1
  103. package/dist/ssr/7293.js.map +1 -1
  104. package/dist/ssr/9551.js +4 -4
  105. package/dist/ssr/9551.js.map +1 -1
  106. package/dist/ssr/index.js +23 -12
  107. package/dist/ssr/index.js.map +1 -1
  108. package/dist/ssr/stats.json +4 -4
  109. package/l10n/en-US.ftl +1 -1
  110. package/package.json +2 -2
  111. package/release-please-config.json +15 -0
  112. package/dist/client/1739.16064f8d04091fb6.js +0 -8
  113. package/dist/client/1739.16064f8d04091fb6.js.map +0 -1
  114. package/dist/client/2776.f1ca2b5f474ba69f.js +0 -32
  115. package/dist/client/2776.f1ca2b5f474ba69f.js.map +0 -1
  116. package/dist/client/5837.f6d4c078ffaaacdd.js.map +0 -1
  117. package/dist/client/8551.e33e50ee71f44812.js.map +0 -1
  118. package/dist/client/9551.495c74e2c7129b38.js +0 -16
  119. package/dist/client/9551.495c74e2c7129b38.js.map +0 -1
  120. package/dist/client/9565.5e45ab3e0d622510.js.map +0 -1
  121. package/dist/client/styles-a11y-menu.18fa89054eb7202a.js +0 -1
  122. package/dist/client/styles-advertising.90a05252519044ac.js +0 -1
  123. package/dist/client/styles-article-footer.2f72d43869e2fc04.js +0 -1
  124. package/dist/client/styles-banner.6c855e9feea9c071.js +0 -1
  125. package/dist/client/styles-baseline-indicator.0ee33f4434f78f8f.js +0 -1
  126. package/dist/client/styles-blog-index.63718eed7985555b.js +0 -1
  127. package/dist/client/styles-blog-post.e369a7b6bd7ee253.js +0 -1
  128. package/dist/client/styles-breadcrumbs-bar.0e5432b97f042a51.js +0 -1
  129. package/dist/client/styles-breadcrumbs.ffcf3e7f6aca4842.js +0 -1
  130. package/dist/client/styles-button.9ef7569f2eb2448b.js +0 -1
  131. package/dist/client/styles-content-section.8d683bcfa074d863.js +0 -1
  132. package/dist/client/styles-contributor-spotlight.08b1f6ed86daacc7.js +0 -1
  133. package/dist/client/styles-curriculum-about.399ca9fae70cdf42.js +0 -1
  134. package/dist/client/styles-curriculum-default.1d95308cf28d0cbe.js +0 -1
  135. package/dist/client/styles-curriculum-landing.75954cd6cee0580a.js +0 -1
  136. package/dist/client/styles-curriculum-module.1e885d2e7fbd00c6.js +0 -1
  137. package/dist/client/styles-curriculum-overview.7efe6d339fda7e6e.js +0 -1
  138. package/dist/client/styles-featured-articles.8a24cb5b80c4c61a.js +0 -1
  139. package/dist/client/styles-footer.c6cf58283ef90c67.js +0 -1
  140. package/dist/client/styles-generic-about.7b141a48f0710a55.js +0 -1
  141. package/dist/client/styles-generic-community.ab65d4d721e3667b.js +0 -1
  142. package/dist/client/styles-generic-content.c29785e714ffd1f5.js +0 -1
  143. package/dist/client/styles-generic-layout.5f207ab849f99ea7.js +0 -1
  144. package/dist/client/styles-generic-sidebar.7d35fed4f9bc1d3f.js +0 -1
  145. package/dist/client/styles-generic-toc.75b9d25451f88334.js +0 -1
  146. package/dist/client/styles-global.3d9e085f0247e92c.css.map +0 -1
  147. package/dist/client/styles-heading-anchor.723d7995b359e9c5.js +0 -1
  148. package/dist/client/styles-homepage-body.7804e89b5b1f5fb0.js +0 -1
  149. package/dist/client/styles-homepage-contributor-spotlight.99a49f2c25da44d8.js +0 -1
  150. package/dist/client/styles-homepage-footer.6110ddf33f932da9.js +0 -1
  151. package/dist/client/styles-homepage-header.9869e99567417f85.js +0 -1
  152. package/dist/client/styles-homepage-hero.ca54e4bc0c0b420e.css.map +0 -1
  153. package/dist/client/styles-homepage-hero.f3b9f1a51df08e48.js +0 -1
  154. package/dist/client/styles-homepage.3d3ddf3a45d9fb9f.js +0 -1
  155. package/dist/client/styles-latest-news.3ee704eb566845af.js +0 -1
  156. package/dist/client/styles-left-sidebar.b58f94d7797b94a3.js +0 -1
  157. package/dist/client/styles-logo.15cde079ff7cf413.js +0 -1
  158. package/dist/client/styles-mandala.fbf5df30c1569b80.js +0 -1
  159. package/dist/client/styles-menu.432117f56550a699.js +0 -1
  160. package/dist/client/styles-navigation.ae5b4029d77512c1.js +0 -1
  161. package/dist/client/styles-not-found.bb24f3d7153e6384.js +0 -1
  162. package/dist/client/styles-observatory-landing.6ccab12860b70065.js +0 -1
  163. package/dist/client/styles-observatory-results.8debe68c8c1054ba.js +0 -1
  164. package/dist/client/styles-page-layout.3855b7fd5c6c1e0f.js +0 -1
  165. package/dist/client/styles-pagination.5241370112fc2d33.js +0 -1
  166. package/dist/client/styles-playground.5fd947e80ea7bbbc.js +0 -1
  167. package/dist/client/styles-recent-contributions.96ef61f802ae3c05.js +0 -1
  168. package/dist/client/styles-reference-layout.4b0aca3ae954f961.css.map +0 -1
  169. package/dist/client/styles-reference-layout.f70ad6dcede0cc3e.js +0 -1
  170. package/dist/client/styles-reference-toc.4955096ec82f0e5e.js +0 -1
  171. package/dist/client/styles-sandbox.33cffca9447c527a.js +0 -1
  172. package/dist/client/styles-translation-banner.e5c9497137fa78db.js +0 -1
  173. /package/dist/legacy/{index.420b003bd21312e0.js.LICENSE.txt → index.b481dadaaa935e27.js.LICENSE.txt} +0 -0
@@ -1,9 +1,13 @@
1
1
  name: NPM Publish
2
2
 
3
3
  on:
4
- workflow_dispatch:
4
+ push:
5
+ branches:
6
+ - main
5
7
 
6
- permissions: {}
8
+ permissions:
9
+ contents: write
10
+ pull-requests: write
7
11
 
8
12
  jobs:
9
13
  build:
@@ -11,19 +15,29 @@ jobs:
11
15
  runs-on: ubuntu-latest
12
16
 
13
17
  steps:
14
- - uses: actions/checkout@v4
18
+ - name: Release
19
+ uses: googleapis/release-please-action@v4
20
+ id: release
21
+
22
+ - name: Checkout
23
+ uses: actions/checkout@v4
24
+ if: steps.release.outputs.release_created
15
25
 
16
26
  - name: Setup
17
27
  uses: actions/setup-node@v4
28
+ if: steps.release.outputs.release_created
18
29
  with:
19
30
  node-version-file: ".nvmrc"
20
- cache: npm
21
31
  registry-url: "https://registry.npmjs.org"
22
32
 
23
33
  - name: Install
34
+ if: steps.release.outputs.release_created
24
35
  run: npm ci
36
+ env:
37
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
25
38
 
26
39
  - name: Publish
40
+ if: steps.release.outputs.release_created
27
41
  run: npm publish --access public
28
42
  env:
29
43
  FRED_WRITER_MODE: true
@@ -0,0 +1 @@
1
+ CHANGELOG.md
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.0.5"
3
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # Changelog
2
+
3
+ ## [0.0.5](https://github.com/mdn/fred/compare/v0.0.4...v0.0.5) (2025-07-01)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **homepage-hero:** avoid non-link underline ([#287](https://github.com/mdn/fred/issues/287)) ([919f789](https://github.com/mdn/fred/commit/919f789b89e1afdb3610a509aa2e70c665616704))
9
+ * **placement:** add focus-visible to sidebar ([#280](https://github.com/mdn/fred/issues/280)) ([7381c00](https://github.com/mdn/fred/commit/7381c00b1fb9ca769d902da8bd7c76f1f6b33d76))
10
+
11
+
12
+ ### Enhancements
13
+
14
+ * **search-modal:** update blur, mark, links ([#309](https://github.com/mdn/fred/issues/309)) ([8ce49b3](https://github.com/mdn/fred/commit/8ce49b3b4f508ce0ba735e4c9d0b3f4155234b3c))
15
+
16
+
17
+ ### Miscellaneous
18
+
19
+ * **deps-dev:** bump the dev group with 2 updates ([#307](https://github.com/mdn/fred/issues/307)) ([48f89f3](https://github.com/mdn/fred/commit/48f89f3b1410bf7cb8d18d73a00cad6c396a012a))
20
+ * **search-modal:** add styles ([#304](https://github.com/mdn/fred/issues/304)) ([4e08eff](https://github.com/mdn/fred/commit/4e08effaf9a8080cea33c0b61ce44f509facee64))
21
+
22
+ ## [0.0.4](https://github.com/mdn/fred/compare/v0.0.3...v0.0.4) (2025-06-30)
23
+
24
+
25
+ ### Miscellaneous
26
+
27
+ * **deps-dev:** bump @mdn/browser-compat-data from 6.0.26 to 6.0.27 ([#302](https://github.com/mdn/fred/issues/302)) ([81f9a32](https://github.com/mdn/fred/commit/81f9a32abca921d42889a8538b7620409f540d00))
28
+ * **deps-dev:** bump @mdn/rari from 0.1.44 to 0.1.45 ([#297](https://github.com/mdn/fred/issues/297)) ([0766a79](https://github.com/mdn/fred/commit/0766a794231306e05b3216278576c3296d41b071))
29
+ * **deps-dev:** bump the dev group with 9 updates ([#303](https://github.com/mdn/fred/issues/303)) ([62d68ed](https://github.com/mdn/fred/commit/62d68edbb3fa1ed6caf27a7040f321f5dde21f02))
30
+ * **homepage-hero:** remove link underline on hover ([c92a8b8](https://github.com/mdn/fred/commit/c92a8b80b9e1c60e478a4007d8718f02a26269d5))
@@ -35,7 +35,7 @@ const STATS = [
35
35
 
36
36
  export class Advertising extends ServerComponent {
37
37
  /**
38
- * @param {import("@fred").Context<import("@rari").SpaPage>} context
38
+ * @param {import("@fred").Context<import("@rari").SPAPage>} context
39
39
  * @returns {import("@lit").TemplateResult}
40
40
  */
41
41
  render(context) {
@@ -60,7 +60,7 @@ function PostPreview(context, blogMeta) {
60
60
  export class BlogIndex extends ServerComponent {
61
61
  /**
62
62
  *
63
- * @param {import("@fred").Context<import("@rari").BlogPage>} context
63
+ * @param {import("@fred").Context<import("@rari").BlogPostPage>} context
64
64
  * @returns {import("@lit").TemplateResult}
65
65
  */
66
66
  render(context) {
@@ -74,7 +74,7 @@ function PrevNextLinks(context, { blogMeta }) {
74
74
  export class BlogPost extends ServerComponent {
75
75
  /**
76
76
  *
77
- * @param {import("@fred").Context<import("@rari").BlogPage>} context
77
+ * @param {import("@fred").Context<import("@rari").BlogPostPage>} context
78
78
  * @returns {import("@lit").TemplateResult}
79
79
  */
80
80
  render(context) {
@@ -16,9 +16,11 @@
16
16
  :root {
17
17
  --color-white: hsl(0deg 0% 100%);
18
18
  --color-white-alpha-25: hsl(0deg 0% 100% / 25%);
19
+ --color-white-alpha-75: hsl(0deg 0% 100% / 75%);
19
20
 
20
21
  --color-black: hsl(0deg 0% 0%);
21
22
  --color-black-alpha-25: hsl(0deg 0% 0% / 25%);
23
+ --color-black-alpha-75: hsl(0deg 0% 0% / 75%);
22
24
  }
23
25
 
24
26
  /* Gray */
@@ -14,5 +14,11 @@
14
14
 
15
15
  a {
16
16
  color: var(--color-link-normal);
17
+ text-decoration: underline;
18
+
19
+ &:focus,
20
+ &:hover {
21
+ text-decoration: none;
22
+ }
17
23
  }
18
24
  }
@@ -11,7 +11,6 @@ export class HomepageHero extends ServerComponent {
11
11
  <h1>
12
12
  ${context.l10n.raw({
13
13
  id: "homepage-hero-title",
14
- elements: { developers: { tag: "u" } },
15
14
  })}
16
15
  </h1>
17
16
  <p>
@@ -1,7 +1,7 @@
1
1
  import { html } from "lit";
2
2
 
3
3
  /**
4
- * @param {import("@fred").Context<import("@rari").SpaPage>} _context
4
+ * @param {import("@fred").Context<import("@rari").SPAPage>} _context
5
5
  * @returns {import("@lit").TemplateResult}
6
6
  */
7
7
  export function FAQ(_context) {
@@ -1,7 +1,7 @@
1
1
  import { html } from "lit";
2
2
 
3
3
  /**
4
- * @param {import("@fred").Context<import("@rari").SpaPage>} _context
4
+ * @param {import("@fred").Context<import("@rari").SPAPage>} _context
5
5
  * @returns {import("@lit").TemplateResult}
6
6
  */
7
7
  export function Feedback(_context) {
@@ -15,7 +15,7 @@ import { Feedback } from "./feedback.js";
15
15
 
16
16
  export class ObservatoryLanding extends ServerComponent {
17
17
  /**
18
- * @param {import("@fred").Context<import("@rari").SpaPage>} context
18
+ * @param {import("@fred").Context<import("@rari").SPAPage>} context
19
19
  * @returns {import("@lit").TemplateResult}
20
20
  */
21
21
  render(context) {
@@ -6,7 +6,7 @@ import { ServerComponent } from "../server/index.js";
6
6
 
7
7
  export class ObservatoryResults extends ServerComponent {
8
8
  /**
9
- * @param {import("@fred").Context<import("@rari").SpaPage>} context
9
+ * @param {import("@fred").Context<import("@rari").SPAPage>} context
10
10
  * @returns {import("@lit").TemplateResult}
11
11
  */
12
12
  render(context) {
@@ -35,9 +35,16 @@
35
35
  border: 1px solid var(--color-border-primary);
36
36
  border-radius: var(--border-radius);
37
37
 
38
+ &:has(> .placement-link:focus-visible) {
39
+ outline: auto;
40
+ }
41
+
38
42
  .placement-link {
43
+ display: block;
44
+
39
45
  width: 100%;
40
46
  height: 100%;
47
+
41
48
  padding: 0;
42
49
 
43
50
  > img {
@@ -59,6 +59,8 @@
59
59
 
60
60
  max-height: calc(100vh - var(--sticky-header-height));
61
61
 
62
+ padding-left: 2px;
63
+
62
64
  overflow-y: auto;
63
65
  }
64
66
 
@@ -6,7 +6,7 @@ import { ServerComponent } from "../server/index.js";
6
6
 
7
7
  export class ReferenceToc extends ServerComponent {
8
8
  /**
9
- * @param {import("@fred").Context<import("@rari").DocPage | import("@rari").BlogPage>} context
9
+ * @param {import("@fred").Context<import("@rari").DocPage | import("@rari").BlogPostPage>} context
10
10
  */
11
11
  render(context) {
12
12
  return html`<nav class="reference-toc">
@@ -5,11 +5,138 @@
5
5
  }
6
6
 
7
7
  dialog {
8
- width: 50vw;
9
- max-height: 90vh;
10
- margin: 5vh auto;
8
+ padding: 0;
9
+
10
+ background-color: var(--color-background-primary);
11
+ border: 1px solid var(--color-border-primary);
12
+ border-radius: 0.5rem;
13
+
14
+ /* Desktop menu */
15
+ @media (width > 1006px) {
16
+ width: calc(var(--layout-content-max) + 1rem);
17
+ max-height: calc(100% - var(--sticky-header-height) - 2rem);
18
+ margin: calc(var(--sticky-header-height) + 1rem) auto 1rem;
19
+ }
20
+
21
+ /* Mobile menu */
22
+ @media (width <= 1006px) {
23
+ width: 100%;
24
+ max-height: calc(100% - 2rem);
25
+ margin: 1rem auto;
26
+ }
27
+
28
+ &[open] {
29
+ display: flex;
30
+ flex-direction: column;
31
+ }
32
+
33
+ &::backdrop {
34
+ background-color: light-dark(
35
+ var(--color-white-alpha-75),
36
+ var(--color-black-alpha-75)
37
+ );
38
+ backdrop-filter: blur(3px);
39
+ }
40
+ }
41
+
42
+ progress {
43
+ width: calc(100% - 2rem);
44
+ margin: 0 auto 0.5rem;
45
+ }
46
+
47
+ form {
48
+ display: grid;
49
+
50
+ grid-template-columns: min-content 1fr;
51
+
52
+ gap: 0.5rem;
53
+ place-items: center;
54
+
55
+ padding: 1rem;
56
+
57
+ font-size: var(--font-size-large);
58
+
59
+ &::before {
60
+ width: 1em;
61
+ height: 1em;
62
+
63
+ content: "";
64
+
65
+ background-color: var(--color-border-secondary);
66
+
67
+ mask-image: url("../icon/search.svg");
68
+ mask-size: contain;
69
+ }
70
+ }
71
+
72
+ input {
73
+ width: 100%;
74
+
75
+ padding: 0;
76
+ margin: 0;
77
+
78
+ font-size: inherit;
79
+
80
+ outline: none;
81
+
82
+ background-color: transparent;
83
+ border: none;
84
+
85
+ &::placeholder {
86
+ color: var(--color-text-secondary);
87
+ }
88
+ }
89
+
90
+ ul {
91
+ padding: 0;
92
+ margin: 0;
93
+
94
+ overflow: auto;
95
+
96
+ overscroll-behavior: contain;
97
+
98
+ &:has(li) {
99
+ border-top: 1px solid var(--color-border-primary);
100
+ }
11
101
  }
12
102
 
13
103
  li[data-selected] {
14
- background: yellow;
104
+ background: var(--color-background-blue);
105
+ }
106
+
107
+ li {
108
+ list-style-type: none;
109
+
110
+ &:not([data-selected]):hover {
111
+ background-color: var(--color-background-secondary);
112
+ }
113
+ }
114
+
115
+ li > * {
116
+ width: 100%;
117
+ padding: 0.5rem 1.5rem;
118
+ }
119
+
120
+ a {
121
+ display: grid;
122
+ color: var(--color-link-normal);
123
+ text-decoration: none;
124
+
125
+ &:visited {
126
+ color: var(--color-link-visited);
127
+ }
128
+ }
129
+
130
+ .title {
131
+ font-size: var(--font-size-large);
132
+ }
133
+
134
+ .slug {
135
+ font-size: var(--font-size-small);
136
+ color: var(--color-text-secondary);
137
+ }
138
+
139
+ mark {
140
+ color: var(--color-text-primary);
141
+ background-color: light-dark(var(--color-yellow-80), var(--color-yellow-20));
15
142
  }
@@ -64,27 +64,46 @@ export class MDNSearchModal extends L10nMixin(LitElement) {
64
64
 
65
65
  /** @param {KeyboardEvent} event */
66
66
  _keydown(event) {
67
- const results = (this._queryIndex.value?.length || 0) + 1;
68
67
  switch (event.key) {
69
68
  case "ArrowUp": {
70
69
  event.preventDefault();
71
- const value = (this._selected - 1) % results;
72
- this._selected = value < 0 ? results + value : value;
70
+ this._select(this._selected - 1);
73
71
  break;
74
72
  }
75
73
  case "ArrowDown":
76
74
  event.preventDefault();
77
- this._selected = (this._selected + 1) % results;
75
+ this._select(this._selected + 1);
78
76
  break;
79
77
  default:
80
78
  return;
81
79
  }
82
80
  }
83
81
 
82
+ /** @returns {HTMLElement|null} */
83
+ _getSelectedItem() {
84
+ return this.shadowRoot?.querySelector("[data-selected] a") ?? null;
85
+ }
86
+
87
+ /** @param {number} index */
88
+ _select(index) {
89
+ const results = (this._queryIndex.value?.length || 0) + 1;
90
+ const value = index % results;
91
+ this._selected = value < 0 ? results + index : value;
92
+ setTimeout(() => {
93
+ const item = this._getSelectedItem();
94
+ if (item instanceof HTMLElement) {
95
+ item.scrollIntoView({
96
+ behavior: "smooth",
97
+ block: "nearest",
98
+ });
99
+ }
100
+ }, 0);
101
+ }
102
+
84
103
  /** @param {SubmitEvent} event */
85
104
  _submit(event) {
86
105
  event.preventDefault();
87
- const item = this.shadowRoot?.querySelector("[data-selected] a");
106
+ const item = this._getSelectedItem();
88
107
  if (item instanceof HTMLElement) {
89
108
  item.click();
90
109
  }
@@ -157,6 +176,12 @@ export class MDNSearchModal extends L10nMixin(LitElement) {
157
176
  document.removeEventListener("keydown", this._globalKeydown);
158
177
  }
159
178
 
179
+ _renderLoadingSearchIndex() {
180
+ return html`<progress
181
+ aria-label=${this.l10n`Loading search index…`}
182
+ ></progress>`;
183
+ }
184
+
160
185
  render() {
161
186
  const siteSearchIndex = this._queryIndex.value?.length || 0;
162
187
  return html`
@@ -167,24 +192,32 @@ export class MDNSearchModal extends L10nMixin(LitElement) {
167
192
  .value=${this._query}
168
193
  autofocus
169
194
  @input=${this._input}
195
+ placeholder=${this.l10n`Search`}
196
+ aria-label=${this.l10n`Search`}
170
197
  />
171
198
  </form>
199
+ ${this._queryIndex.render({
200
+ initial: this._renderLoadingSearchIndex.bind(this),
201
+ pending: this._renderLoadingSearchIndex.bind(this),
202
+ })}
172
203
  <ul>
173
204
  ${this._queryIndex.render({
174
- initial: () => html`<progress></progress>`,
175
- pending: () => html`<progress></progress>`,
176
205
  complete: (results) =>
177
206
  results?.map(
178
207
  ({ title, url }, i) => html`
179
208
  <li ?data-selected=${this._selected === i} data-result=${i}>
180
- <a href=${url}>${HighlightMatch(title, this._query)}</a>
181
- <small>
182
- ${url
183
- .split("/")
184
- .slice(1)
185
- .filter((p) => !["docs", this.locale].includes(p))
186
- .join(" / ")}
187
- </small>
209
+ <a href=${url}
210
+ ><span class="title"
211
+ >${HighlightMatch(title, this._query)}</span
212
+ >
213
+ <span class="slug"
214
+ >${url
215
+ .split("/")
216
+ .slice(1)
217
+ .filter((p) => !["docs", this.locale].includes(p))
218
+ .join(" / ")}</span
219
+ >
220
+ </a>
188
221
  </li>
189
222
  `,
190
223
  ),
@@ -196,15 +229,17 @@ export class MDNSearchModal extends L10nMixin(LitElement) {
196
229
  >
197
230
  <a
198
231
  href=${`/${this.locale}/search?${new URLSearchParams({ q: this._query })}`}
199
- >${this.l10n.raw({
200
- id: "search-modal-site-search",
201
- args: {
202
- query: this._query,
203
- },
204
- elements: {
205
- query: { tag: "code" },
206
- },
207
- })}</a
232
+ ><span class="title"
233
+ >${this.l10n.raw({
234
+ id: "search-modal-site-search",
235
+ args: {
236
+ query: this._query,
237
+ },
238
+ elements: {
239
+ query: { tag: "code" },
240
+ },
241
+ })}</span
242
+ ></a
208
243
  >
209
244
  </li>`
210
245
  : nothing}
@@ -215,7 +250,7 @@ export class MDNSearchModal extends L10nMixin(LitElement) {
215
250
 
216
251
  updated() {
217
252
  if (this._shiftFocus) {
218
- const selected = this.shadowRoot?.querySelector("[data-selected] a");
253
+ const selected = this._getSelectedItem();
219
254
  if (selected instanceof HTMLElement) {
220
255
  selected.focus();
221
256
  }
@@ -0,0 +1,8 @@
1
+ export const __webpack_ids__=["1739"];export const __webpack_modules__={73594:function(e,a,o){o.r(a),o.d(a,{MDNHomepageSearch:()=>MDNHomepageSearch});var r=o(14703),t=o(69535),n=o(39187),s=o(8036);let MDNHomepageSearch=class MDNHomepageSearch extends(0,t.q)(r.oi){static styles=s.Z;_showModal(){let e=document.querySelector("#search");e instanceof n.MDNSearchModal?e.showModal():console.error("MDNSearchModal not found!")}render(){return(0,r.dy)`<button
2
+ class="mdn-homepage-search"
3
+ title=${this.l10n`Search the site`}
4
+ @click=${this._showModal}
5
+ >
6
+ ${this.l10n`Search`}
7
+ </button>`}};customElements.define("mdn-homepage-search",MDNHomepageSearch)},8036:function(e,a,o){o.d(a,{Z:()=>p});var r=o(14703),t=o(8081),n=o.n(t),s=o(23645),c=o.n(s),i=o(61667),l=o.n(i),d=new o.U(o(99454)),m=c()(n()),h=l()(d);m.push([e.id,`.mdn-homepage-search{border-color:var(--color-border-primary);border-radius:2em;border-style:solid;display:flex;font-size:var(--font-size-large);gap:.5ch;justify-content:center;margin:0 auto;padding:1em}.mdn-homepage-search:after{background-color:var(--color-text-primary);content:"";display:inline-block;flex-shrink:0;height:1.1em;-webkit-mask-image:url(${h});mask-image:url(${h});-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.1em}button{cursor:pointer}`,""]);let p=(0,r.iv)([m.toString()])}};
8
+ //# sourceMappingURL=1739.1435a6d3f1a2dd88.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1739.1435a6d3f1a2dd88.js","sources":["webpack://@mdn/fred/./components/homepage-search/element.js","webpack://@mdn/fred/./components/homepage-search/element.css"],"sourcesContent":["import { LitElement, html } from \"lit\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\nimport { MDNSearchModal } from \"../search-modal/element.js\";\n\nimport styles from \"./element.css?lit\";\n\nexport class MDNHomepageSearch extends L10nMixin(LitElement) {\n static styles = styles;\n\n _showModal() {\n const search = document.querySelector(\"#search\");\n if (search instanceof MDNSearchModal) {\n search.showModal();\n } else {\n console.error(\"MDNSearchModal not found!\");\n }\n }\n\n render() {\n return html`<button\n class=\"mdn-homepage-search\"\n title=${this.l10n`Search the site`}\n @click=${this._showModal}\n >\n ${this.l10n`Search`}\n </button>`;\n }\n}\ncustomElements.define(\"mdn-homepage-search\", MDNHomepageSearch);\n","import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../icon/search.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.mdn-homepage-search{border-color:var(--color-border-primary);border-radius:2em;border-style:solid;display:flex;font-size:var(--font-size-large);gap:.5ch;justify-content:center;margin:0 auto;padding:1em}.mdn-homepage-search:after{background-color:var(--color-text-primary);content:\"\";display:inline-block;flex-shrink:0;height:1.1em;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.1em}button{cursor:pointer}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n"],"names":["MDNHomepageSearch","s","document","console","customElements"],"mappings":"qMAOO,IAAMA,kBAAN,MAAMA,yBAA0B,QAAU,IAAU,EACzD,OAAO,OAASC,EAAA,CAAM,AAAC,AAEvB,aAAa,CACX,IAAM,EAASC,SAAS,aAAa,CAAC,UAClC,cAAkB,gBAAc,CAClC,EAAO,SAAS,GAEhBC,QAAQ,KAAK,CAAC,4BAElB,CAEA,QAAS,CACP,MAAO,QAAI,CAAC;;YAEJ,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;aAC5B,EAAE,IAAI,CAAC,UAAU,CAAC;;MAEzB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACb,CAAC,AACZ,CACF,EACAC,eAAe,MAAM,CAAC,sBAAuBJ,kB,kHCxBzC,EAAgC,kBAChC,EAA0B,IAA4B,KACtD,EAAqC,IAAgC,GAEzE,EAAwB,IAAI,CAAC,CAAC,EAAO,EAAE,CAAE,CAAC,mWAAmW,EAAE,EAAmC,iBAAiB,EAAE,EAAmC,oIAAoI,CAAC,CAAE,GAAG,EAElnB,MAAe,SAAI,CAAC,EAAwB,QAAQ,GAAG,C"}
@@ -0,0 +1,43 @@
1
+ export const __webpack_ids__=["2776"];export const __webpack_modules__={61667:function(e){e.exports=function(e,t){return(t||(t={}),e&&(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]|(%20)/.test(e)||t.needQuotes))?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e}},99454:function(e,t,r){e.exports=r.p+"search.5dd31cbeea7d1af9.svg"},39187:function(e,t,r){r.r(t),r.d(t,{MDNSearchModal:()=>MDNSearchModal,splitQuery:()=>s});var o=r(35470),a=r(14703),i=r(69535),l=r(1613);let MDNSearchModal=class MDNSearchModal extends(0,i.q)(a.oi){static styles=l.Z;static properties={_index:{state:!0},_query:{state:!0},_selected:{state:!0},_shiftFocus:{state:!0}};constructor(){super(),this._index=void 0,this._query="",this._selected=0,this._shiftFocus=!1}async _loadIndex(){this._index||(this._index=this._fetchIndex())}async _fetchIndex(){let e=await fetch(`/${this.locale}/search-index.json`),t=await e.json();return{flex:t.map(({title:e,url:t},r)=>({index:r,title:e.toLowerCase(),slugTail:t.split("/").pop()?.toLowerCase()||""})),items:t}}showModal(){this._loadIndex(),this.shadowRoot?.querySelector("dialog")?.showModal(),this.shadowRoot?.querySelector("input")?.select()}_input({target:e}){e instanceof HTMLInputElement&&(this._query=e.value)}_keydown(e){switch(e.key){case"ArrowUp":e.preventDefault(),this._select(this._selected-1);break;case"ArrowDown":e.preventDefault(),this._select(this._selected+1);break;default:return}}_getSelectedItem(){return this.shadowRoot?.querySelector("[data-selected] a")??null}_select(e){let t=(this._queryIndex.value?.length||0)+1,r=e%t;this._selected=r<0?t+e:r,setTimeout(()=>{let e=this._getSelectedItem();e instanceof HTMLElement&&e.scrollIntoView({behavior:"smooth",block:"nearest"})},0)}_submit(e){e.preventDefault();let t=this._getSelectedItem();t instanceof HTMLElement&&t.click()}_focus({target:e}){if(e instanceof HTMLElement){let t=e.closest("[data-result]");if(t instanceof HTMLElement){let e=Number.parseInt(t.dataset.result||"NaN",10);Number.isNaN(e)||(this._selected=e,this._shiftFocus=!0)}else this._shiftFocus=!1}}_globalKeydown(e){let t=e.composedPath()?.[0]||e.target;if(t instanceof HTMLElement&&(["TEXTAREA","INPUT"].includes(t.tagName)||t.isContentEditable))return;let r=globalThis.getSelection()?.toString(),o=e.key,a=e.ctrlKey||e.metaKey,i="k"===o&&a&&!e.shiftKey;("/"===o&&!a||i)&&(e.preventDefault(),this.showModal(),r&&(this._query=r))}_queryIndex=new o.iQ(this,{args:()=>[this._index,this._query],task:async([e,t])=>{if(e&&t){var r=t,o=await e;let a=r.toLowerCase().trim(),i=s(r);return o.flex.filter(({title:e})=>i.every(t=>e.includes(t))).map(({index:e,title:t,slugTail:r})=>[Number([t,r].includes(a)),e]).sort(([e],[t])=>t-e).map(([e,t])=>t).slice(0,10).map(e=>e&&(o.items||[])[e]).filter(Boolean)}}});connectedCallback(){super.connectedCallback(),this._globalKeydown=this._globalKeydown.bind(this),document.addEventListener("keydown",this._globalKeydown),this._loadIndex=this._loadIndex.bind(this),this.renderRoot.addEventListener("mouseover",this._loadIndex)}disconnectedCallback(){super.disconnectedCallback(),this.renderRoot.removeEventListener("mouseover",this._loadIndex),document.removeEventListener("keydown",this._globalKeydown)}_renderLoadingSearchIndex(){return(0,a.dy)`<progress
2
+ aria-label=${this.l10n`Loading search index…`}
3
+ ></progress>`}render(){let e=this._queryIndex.value?.length||0;return(0,a.dy)`
4
+ <dialog @keydown=${this._keydown} @focusin=${this._focus} closedby="any">
5
+ <form @submit=${this._submit}>
6
+ <input
7
+ type="text"
8
+ .value=${this._query}
9
+ autofocus
10
+ @input=${this._input}
11
+ placeholder=${this.l10n`Search`}
12
+ aria-label=${this.l10n`Search`}
13
+ />
14
+ </form>
15
+ ${this._queryIndex.render({initial:this._renderLoadingSearchIndex.bind(this),pending:this._renderLoadingSearchIndex.bind(this)})}
16
+ <ul>
17
+ ${this._queryIndex.render({complete:e=>e?.map(({title:e,url:t},r)=>(0,a.dy)`
18
+ <li ?data-selected=${this._selected===r} data-result=${r}>
19
+ <a href=${t}
20
+ ><span class="title"
21
+ >${(function(e,t){let r=s(t),o=r.map(e=>e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)).map(e=>`(${e})`).join("|");return e.split(RegExp(o,"gi")).filter(Boolean).map(e=>r.includes(e.toLowerCase())?(0,a.dy)`<mark>${e}</mark>`:e)})(e,this._query)}</span
22
+ >
23
+ <span class="slug"
24
+ >${t.split("/").slice(1).filter(e=>!["docs",this.locale].includes(e)).join(" / ")}</span
25
+ >
26
+ </a>
27
+ </li>
28
+ `)})}
29
+ ${this._query?(0,a.dy)`<li
30
+ ?data-selected=${this._selected===e}
31
+ data-result=${e}
32
+ >
33
+ <a
34
+ href=${`/${this.locale}/search?${new URLSearchParams({q:this._query})}`}
35
+ ><span class="title"
36
+ >${this.l10n.raw({id:"search-modal-site-search",args:{query:this._query},elements:{query:{tag:"code"}}})}</span
37
+ ></a
38
+ >
39
+ </li>`:a.Ld}
40
+ </ul>
41
+ </dialog>
42
+ `}updated(){if(this._shiftFocus){let e=this._getSelectedItem();e instanceof HTMLElement&&e.focus()}}};function s(e){return(e=e.trim().toLowerCase()).startsWith(".")||e.endsWith(".")?e.split(/[ ,]+/):e.split(/[ ,.]+/)}customElements.define("mdn-search-modal",MDNSearchModal)},1613:function(e,t,r){r.d(t,{Z:()=>g});var o=r(14703),a=r(8081),i=r.n(a),l=r(23645),s=r.n(l),n=r(61667),d=r.n(n),c=new r.U(r(99454)),h=s()(i()),u=d()(c);h.push([e.id,`*,:after,:before{box-sizing:border-box}dialog{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;padding:0}@media (min-width:1006.02px){dialog{margin:calc(var(--sticky-header-height) + 1rem) auto 1rem;max-height:calc(100% - var(--sticky-header-height) - 2rem);width:calc(var(--layout-content-max) + 1rem)}}@media (max-width:1006px){dialog{margin:1rem auto;max-height:calc(100% - 2rem);width:100%}}dialog[open]{display:flex;flex-direction:column}dialog::backdrop{--csstools-light-dark-toggle--1:var(--csstools-color-scheme--light) var(--color-black-alpha-75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background-color:var(--csstools-light-dark-toggle--1,var(--color-white-alpha-75))}@supports (color:light-dark(red,red)){dialog::backdrop{background-color:light-dark(var(--color-white-alpha-75),var(--color-black-alpha-75))}}progress{margin:0 auto .5rem;width:calc(100% - 2rem)}form{display:grid;font-size:var(--font-size-large);gap:.5rem;grid-template-columns:min-content 1fr;padding:1rem;place-items:center}form:before{background-color:var(--color-border-secondary);content:"";height:1em;-webkit-mask-image:url(${u});mask-image:url(${u});-webkit-mask-size:contain;mask-size:contain;width:1em}input{background-color:initial;border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}input::placeholder{color:var(--color-text-secondary)}ul{margin:0;overflow:auto;overscroll-behavior:contain;padding:0}ul:has(li){border-top:1px solid var(--color-border-primary)}li[data-selected]{background:var(--color-background-blue)}li{list-style-type:none}li:not([data-selected]):hover{background-color:var(--color-background-secondary)}li>*{padding:.5rem 1.5rem;width:100%}a{color:var(--color-link-normal);display:grid;-webkit-text-decoration:none;text-decoration:none}a:visited{color:var(--color-link-visited)}.title{font-size:var(--font-size-large)}.slug{color:var(--color-text-secondary);font-size:var(--font-size-small)}mark{color:var(--color-text-primary);--csstools-light-dark-toggle--0:var(--csstools-color-scheme--light) var(--color-yellow-20);background-color:var(--csstools-light-dark-toggle--0,var(--color-yellow-80))}@supports (color:light-dark(red,red)){mark{background-color:light-dark(var(--color-yellow-80),var(--color-yellow-20))}}`,""]);let g=(0,o.iv)([h.toString()])}};
43
+ //# sourceMappingURL=2776.435ecffa5f77c7eb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2776.435ecffa5f77c7eb.js","sources":["webpack://@mdn/fred/./node_modules/css-loader/dist/runtime/getUrl.js","webpack://@mdn/fred/./components/search-modal/element.js","webpack://@mdn/fred/./components/search-modal/element.css"],"sourcesContent":["\"use strict\";\n\nmodule.exports = function (url, options) {\n if (!options) {\n options = {};\n }\n if (!url) {\n return url;\n }\n url = String(url.__esModule ? url.default : url);\n\n // If url is already wrapped in quotes, remove them\n if (/^['\"].*['\"]$/.test(url)) {\n url = url.slice(1, -1);\n }\n if (options.hash) {\n url += options.hash;\n }\n\n // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n if (/[\"'() \\t\\n]|(%20)/.test(url) || options.needQuotes) {\n return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n }\n return url;\n};","import { Task } from \"@lit/task\";\nimport { LitElement, html, nothing } from \"lit\";\n\nimport { L10nMixin } from \"../../l10n/mixin.js\";\n\nimport styles from \"./element.css?lit\";\n\nexport class MDNSearchModal extends L10nMixin(LitElement) {\n static styles = styles;\n\n static properties = {\n _index: { state: true },\n _query: { state: true },\n _selected: { state: true },\n _shiftFocus: { state: true },\n };\n\n constructor() {\n super();\n /** @type {Promise<import(\"./types.js\").SearchIndex> | undefined} */\n this._index = undefined;\n this._query = \"\";\n this._selected = 0;\n this._shiftFocus = false;\n }\n\n async _loadIndex() {\n if (this._index) {\n return;\n }\n\n this._index = this._fetchIndex();\n }\n\n async _fetchIndex() {\n const res = await fetch(`/${this.locale}/search-index.json`);\n /** @type {import(\"./types.js\").SearchIndexItem[]} */\n const items = await res.json();\n /** @type {import(\"./types.js\").SearchIndexFlexItem[]} */\n const flex = items.map(({ title, url }, index) => ({\n index,\n title: title.toLowerCase(),\n slugTail: url.split(\"/\").pop()?.toLowerCase() || \"\",\n }));\n\n return {\n flex,\n items,\n };\n }\n\n showModal() {\n this._loadIndex();\n this.shadowRoot?.querySelector(\"dialog\")?.showModal();\n this.shadowRoot?.querySelector(\"input\")?.select();\n }\n\n /** @param {InputEvent} event */\n _input({ target }) {\n if (target instanceof HTMLInputElement) {\n this._query = target.value;\n }\n }\n\n /** @param {KeyboardEvent} event */\n _keydown(event) {\n switch (event.key) {\n case \"ArrowUp\": {\n event.preventDefault();\n this._select(this._selected - 1);\n break;\n }\n case \"ArrowDown\":\n event.preventDefault();\n this._select(this._selected + 1);\n break;\n default:\n return;\n }\n }\n\n /** @returns {HTMLElement|null} */\n _getSelectedItem() {\n return this.shadowRoot?.querySelector(\"[data-selected] a\") ?? null;\n }\n\n /** @param {number} index */\n _select(index) {\n const results = (this._queryIndex.value?.length || 0) + 1;\n const value = index % results;\n this._selected = value < 0 ? results + index : value;\n setTimeout(() => {\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n item.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n });\n }\n }, 0);\n }\n\n /** @param {SubmitEvent} event */\n _submit(event) {\n event.preventDefault();\n const item = this._getSelectedItem();\n if (item instanceof HTMLElement) {\n item.click();\n }\n }\n\n /** @param {FocusEvent} event */\n _focus({ target }) {\n if (target instanceof HTMLElement) {\n const focused = target.closest(\"[data-result]\");\n if (focused instanceof HTMLElement) {\n const index = Number.parseInt(focused.dataset.result || \"NaN\", 10);\n if (!Number.isNaN(index)) {\n this._selected = index;\n this._shiftFocus = true;\n }\n } else {\n this._shiftFocus = false;\n }\n }\n }\n\n /** @param {KeyboardEvent} event */\n _globalKeydown(event) {\n const target = event.composedPath()?.[0] || event.target;\n const isTextField =\n target instanceof HTMLElement &&\n ([\"TEXTAREA\", \"INPUT\"].includes(target.tagName) ||\n target.isContentEditable);\n\n if (isTextField) {\n return;\n }\n\n const selection = globalThis.getSelection()?.toString();\n const keyPressed = event.key;\n const ctrlOrMetaPressed = event.ctrlKey || event.metaKey;\n const isSlash = keyPressed === \"/\" && !ctrlOrMetaPressed;\n const isCtrlK = keyPressed === \"k\" && ctrlOrMetaPressed && !event.shiftKey;\n\n if (isSlash || isCtrlK) {\n event.preventDefault();\n this.showModal();\n if (selection) {\n this._query = selection;\n }\n }\n }\n\n _queryIndex = new Task(this, {\n args: () => [this._index, this._query],\n task: async ([index, query]) => {\n if (!index || !query) {\n return;\n }\n return quickSearch(query, await index);\n },\n });\n\n connectedCallback() {\n super.connectedCallback();\n this._globalKeydown = this._globalKeydown.bind(this);\n document.addEventListener(\"keydown\", this._globalKeydown);\n this._loadIndex = this._loadIndex.bind(this);\n this.renderRoot.addEventListener(\"mouseover\", this._loadIndex);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.renderRoot.removeEventListener(\"mouseover\", this._loadIndex);\n document.removeEventListener(\"keydown\", this._globalKeydown);\n }\n\n _renderLoadingSearchIndex() {\n return html`<progress\n aria-label=${this.l10n`Loading search index…`}\n ></progress>`;\n }\n\n render() {\n const siteSearchIndex = this._queryIndex.value?.length || 0;\n return html`\n <dialog @keydown=${this._keydown} @focusin=${this._focus} closedby=\"any\">\n <form @submit=${this._submit}>\n <input\n type=\"text\"\n .value=${this._query}\n autofocus\n @input=${this._input}\n placeholder=${this.l10n`Search`}\n aria-label=${this.l10n`Search`}\n />\n </form>\n ${this._queryIndex.render({\n initial: this._renderLoadingSearchIndex.bind(this),\n pending: this._renderLoadingSearchIndex.bind(this),\n })}\n <ul>\n ${this._queryIndex.render({\n complete: (results) =>\n results?.map(\n ({ title, url }, i) => html`\n <li ?data-selected=${this._selected === i} data-result=${i}>\n <a href=${url}\n ><span class=\"title\"\n >${HighlightMatch(title, this._query)}</span\n >\n <span class=\"slug\"\n >${url\n .split(\"/\")\n .slice(1)\n .filter((p) => ![\"docs\", this.locale].includes(p))\n .join(\" / \")}</span\n >\n </a>\n </li>\n `,\n ),\n })}\n ${this._query\n ? html`<li\n ?data-selected=${this._selected === siteSearchIndex}\n data-result=${siteSearchIndex}\n >\n <a\n href=${`/${this.locale}/search?${new URLSearchParams({ q: this._query })}`}\n ><span class=\"title\"\n >${this.l10n.raw({\n id: \"search-modal-site-search\",\n args: {\n query: this._query,\n },\n elements: {\n query: { tag: \"code\" },\n },\n })}</span\n ></a\n >\n </li>`\n : nothing}\n </ul>\n </dialog>\n `;\n }\n\n updated() {\n if (this._shiftFocus) {\n const selected = this._getSelectedItem();\n if (selected instanceof HTMLElement) {\n selected.focus();\n }\n }\n }\n}\n\ncustomElements.define(\"mdn-search-modal\", MDNSearchModal);\n\n/**\n * @param {string} input\n * @param {import(\"./types.js\").SearchIndex} index\n * @returns {import(\"./types.js\").SearchResultItem[]}\n */\nfunction quickSearch(input, index) {\n const inputValueLC = input.toLowerCase().trim();\n const q = splitQuery(input);\n const indexResults = index.flex\n .filter(({ title }) => q.every((q) => title.includes(q)))\n .map(({ index, title, slugTail }) => {\n const exact = Number([title, slugTail].includes(inputValueLC));\n return /** @type {const} */ ([exact, index]);\n })\n .sort(([aExact], [bExact]) => bExact - aExact) // Boost exact matches.\n .map(([_, i]) => i)\n .slice(0, 10);\n\n return indexResults.map((i) => i && (index.items || [])[i]).filter(Boolean);\n}\n\n/**\n * Used by quicksearch and sidebar filters.\n * @param {string} term\n * @returns {string[]}\n */\nexport function splitQuery(term) {\n term = term.trim().toLowerCase();\n return term.startsWith(\".\") || term.endsWith(\".\")\n ? // Dot is probably meaningful.\n term.split(/[ ,]+/)\n : // Dot is probably just a word separator.\n term.split(/[ ,.]+/);\n}\n\n/**\n * @param {string} title\n * @param {string} query\n */\nfunction HighlightMatch(title, query) {\n // Split on highlight term and include term into parts, ignore case.\n const words = splitQuery(query);\n // $& means the whole matched string\n const regexWords = words.map((s) =>\n s.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`),\n );\n const regex = regexWords.map((word) => `(${word})`).join(\"|\");\n const parts = title.split(new RegExp(regex, \"gi\"));\n return parts\n .filter(Boolean)\n .map((part) =>\n words.includes(part.toLowerCase()) ? html`<mark>${part}</mark>` : part,\n );\n}\n","import { css } from \"lit\";\n// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../icon/search.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `*,:after,:before{box-sizing:border-box}dialog{background-color:var(--color-background-primary);border:1px solid var(--color-border-primary);border-radius:.5rem;padding:0}@media (min-width:1006.02px){dialog{margin:calc(var(--sticky-header-height) + 1rem) auto 1rem;max-height:calc(100% - var(--sticky-header-height) - 2rem);width:calc(var(--layout-content-max) + 1rem)}}@media (max-width:1006px){dialog{margin:1rem auto;max-height:calc(100% - 2rem);width:100%}}dialog[open]{display:flex;flex-direction:column}dialog::backdrop{--csstools-light-dark-toggle--1:var(--csstools-color-scheme--light) var(--color-black-alpha-75);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background-color:var(--csstools-light-dark-toggle--1,var(--color-white-alpha-75))}@supports (color:light-dark(red,red)){dialog::backdrop{background-color:light-dark(var(--color-white-alpha-75),var(--color-black-alpha-75))}}progress{margin:0 auto .5rem;width:calc(100% - 2rem)}form{display:grid;font-size:var(--font-size-large);gap:.5rem;grid-template-columns:min-content 1fr;padding:1rem;place-items:center}form:before{background-color:var(--color-border-secondary);content:\"\";height:1em;-webkit-mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});mask-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});-webkit-mask-size:contain;mask-size:contain;width:1em}input{background-color:initial;border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}input::placeholder{color:var(--color-text-secondary)}ul{margin:0;overflow:auto;overscroll-behavior:contain;padding:0}ul:has(li){border-top:1px solid var(--color-border-primary)}li[data-selected]{background:var(--color-background-blue)}li{list-style-type:none}li:not([data-selected]):hover{background-color:var(--color-background-secondary)}li>*{padding:.5rem 1.5rem;width:100%}a{color:var(--color-link-normal);display:grid;-webkit-text-decoration:none;text-decoration:none}a:visited{color:var(--color-link-visited)}.title{font-size:var(--font-size-large)}.slug{color:var(--color-text-secondary);font-size:var(--font-size-small)}mark{color:var(--color-text-primary);--csstools-light-dark-toggle--0:var(--csstools-color-scheme--light) var(--color-yellow-20);background-color:var(--csstools-light-dark-toggle--0,var(--color-yellow-80))}@supports (color:light-dark(red,red)){mark{background-color:light-dark(var(--color-yellow-80),var(--color-yellow-20))}}`, \"\"]);\n// Exports\nexport default css([___CSS_LOADER_EXPORT___.toString()]);\n"],"names":["String","MDNSearchModal","fetch","HTMLInputElement","e","setTimeout","HTMLElement","Number","t","globalThis","i","s","Boolean","document","RegExp","URLSearchParams","customElements"],"mappings":"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"}