Learn the curriculum with Scrimba and become job ready
diff --git a/components/dropdown/element.js b/components/dropdown/element.js
index d4f1bb98c..eb3bf04ba 100644
--- a/components/dropdown/element.js
+++ b/components/dropdown/element.js
@@ -22,7 +22,7 @@ export class MDNDropdown extends LitElement {
static styles = styles;
static properties = {
- open: { type: Boolean },
+ open: { type: Boolean, reflect: true },
loaded: { type: Boolean, reflect: true },
};
@@ -96,8 +96,14 @@ export class MDNDropdown extends LitElement {
`;
}
- updated() {
+ /**
+ * @param {import("lit").PropertyValues} changedProperties
+ */
+ updated(changedProperties) {
this._setAriaAttributes();
+ if (changedProperties.has("open")) {
+ this.dispatchEvent(new Event("toggle", { bubbles: true }));
+ }
}
firstUpdated() {
diff --git a/components/featured-articles/server.js b/components/featured-articles/server.js
index f4e13a29e..58ba441c4 100644
--- a/components/featured-articles/server.js
+++ b/components/featured-articles/server.js
@@ -10,16 +10,23 @@ export class FeaturedArticles extends ServerComponent {
render(articles) {
return html`
${articles.map(
- (article) =>
+ (article, index) =>
html`-
${article.tag
- ? html`${article.tag.title}`
: nothing}
${article.summary}
diff --git a/components/footer/server.js b/components/footer/server.js
index b88fb866a..655d3c530 100644
--- a/components/footer/server.js
+++ b/components/footer/server.js
@@ -178,6 +178,7 @@ export class Footer extends ServerComponent {
rel="noopener"
aria-label=${item.ariaLabel}
data-icon=${item.icon}
+ data-glean-id=${`footer: social -> ${item.icon}`}
>
`,
@@ -198,6 +199,7 @@ export class Footer extends ServerComponent {
class=${link.external ? "external" : ""}
target=${link.external ? "_blank" : undefined}
rel=${link.external ? "noopener" : undefined}
+ data-glean-id=${`footer: link -> ${link.href}`}
>
${link.text}
@@ -222,7 +224,10 @@ export class Footer extends ServerComponent {
${mozillaLinks(context).map(
(item) => html`
-
- ${item.href}`}
>${item.text}
diff --git a/components/generic-toc/server.js b/components/generic-toc/server.js
index 54f893d65..5e35def83 100644
--- a/components/generic-toc/server.js
+++ b/components/generic-toc/server.js
@@ -25,7 +25,12 @@ export class GenericToc extends ServerComponent {
${context.hyData.toc.map(
({ id, text }) =>
html`-
- ${text}
+ ${text}
`,
)}
diff --git a/components/language-always-redirect-button/element.js b/components/language-always-redirect-button/element.js
index e44f2b2ca..63a889f39 100644
--- a/components/language-always-redirect-button/element.js
+++ b/components/language-always-redirect-button/element.js
@@ -1,5 +1,6 @@
import { LitElement, html } from "lit";
+import { gleanClick } from "../../utils/glean.js";
import { setPreferredLocale } from "../preferred-locale/utils.js";
export class MDNLanguageAlwaysRedirectButton extends LitElement {
@@ -15,6 +16,7 @@ export class MDNLanguageAlwaysRedirectButton extends LitElement {
}
_handleClick() {
+ gleanClick(`language: ${this.locale} -> ${this.to} (always)`);
setPreferredLocale(this.to);
const url = document.location.pathname.replace(
`/${this.locale}/`,
diff --git a/components/language-switcher/element.js b/components/language-switcher/element.js
index 646c2ef83..4683ba4ab 100644
--- a/components/language-switcher/element.js
+++ b/components/language-switcher/element.js
@@ -2,6 +2,7 @@ import { Task } from "@lit/task";
import { LitElement, html, nothing } from "lit";
import { L10nMixin } from "../../l10n/mixin.js";
+import { gleanClick } from "../../utils/glean.js";
import infoIcon from "../icon/info.svg?lit";
import { getEnglishDoc } from "../not-found/utils.js";
@@ -63,12 +64,15 @@ export class MDNLanguageSwitcher extends L10nMixin(LitElement) {
_togglePreferredLocale() {
if (this.notFound) return;
+ const oldValue = this._preferredLocale ?? "0";
if (this._isLocalePreferred) {
resetPreferredLocale();
this._preferredLocale = undefined;
+ gleanClick(`language_remember: ${oldValue} -> 0`);
} else {
setPreferredLocale(this.locale);
this._preferredLocale = this.locale;
+ gleanClick(`language_remember: ${oldValue} -> ${this.locale}`);
}
}
@@ -155,6 +159,7 @@ export class MDNLanguageSwitcher extends L10nMixin(LitElement) {
`/${notFound ? "en-US" : locale}/`,
`/${translation.locale}/`,
)}
+ data-glean-id=${`language: ${locale} -> ${translation.locale}`}
>${translation.native}
diff --git a/components/latest-news/server.js b/components/latest-news/server.js
index 8c3c02194..22e18d2ff 100644
--- a/components/latest-news/server.js
+++ b/components/latest-news/server.js
@@ -14,16 +14,21 @@ export class LatestNews extends ServerComponent {
return html`
${items.map(
- (item) =>
+ (item, index) =>
html`-
${item.source
- ? html`${item.source.name}`
: nothing}
diff --git a/components/placement-top/element.js b/components/placement-top/element.js
index e3ccfaf30..4e7bfc41c 100644
--- a/components/placement-top/element.js
+++ b/components/placement-top/element.js
@@ -1,12 +1,14 @@
import { LitElement, html, nothing } from "lit";
-import { ref } from "lit/directives/ref.js";
+import { createRef, ref } from "lit/directives/ref.js";
import { styleMap } from "lit/directives/style-map.js";
+import { gleanClick } from "../../utils/glean.js";
+import { PlacementMixin } from "../placement/mixin.js";
+import { ViewedController } from "../viewed-controller/viewed-controller.js";
+
import "../placement-note/element.js";
import "../placement-no/element.js";
-import { PlacementMixin } from "../placement/mixin.js";
-
import styles from "./element.css?lit";
/**
@@ -17,6 +19,16 @@ import styles from "./element.css?lit";
export class MDNPlacementTop extends PlacementMixin(LitElement) {
static styles = styles;
+ /** @type {import("lit/directives/ref.js").Ref
} */
+ _ref = createRef();
+
+ constructor() {
+ super();
+ new ViewedController(this, this._ref, () => {
+ gleanClick("banner_scrimba_view");
+ });
+ }
+
/**
*
* @returns {TemplateResult | symbol}
@@ -27,7 +39,7 @@ export class MDNPlacementTop extends PlacementMixin(LitElement) {
renderFallback() {
return html`
-