From 38ca45eab525d50c92cbb8caea0a6b1ef84c2ea6 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Wed, 21 May 2025 01:09:24 +0900 Subject: [PATCH 1/2] chore: add @html-eslint --- docs/_includes/layouts/pages/element.11ty.ts | 4 +- docs/_includes/layouts/pages/tokens.11ty.ts | 2 +- .../rh-accordion/test/rh-accordion.spec.ts | 2 +- .../rh-audio-player/rh-audio-player-about.ts | 2 +- elements/rh-audio-player/rh-audio-player.ts | 4 +- .../rh-avatar/random-pattern-controller.ts | 2 +- elements/rh-button/rh-button.ts | 2 +- .../rh-disclosure/test/rh-disclosure.spec.ts | 2 +- elements/rh-footer/rh-footer-universal.ts | 4 +- elements/rh-footer/test/rh-footer.spec.ts | 2 +- .../rh-navigation-primary/test/fixtures.ts | 4 +- elements/rh-pagination/rh-pagination.ts | 2 +- elements/rh-spinner/rh-spinner.ts | 4 +- eslint.config.js | 17 +++++ package-lock.json | 70 +++++++++++++++++-- package.json | 1 + uxdot/uxdot-pattern.ts | 6 +- 17 files changed, 105 insertions(+), 25 deletions(-) diff --git a/docs/_includes/layouts/pages/element.11ty.ts b/docs/_includes/layouts/pages/element.11ty.ts index ed04f7b75f..86aa17a8c5 100644 --- a/docs/_includes/layouts/pages/element.11ty.ts +++ b/docs/_includes/layouts/pages/element.11ty.ts @@ -204,7 +204,7 @@ export default class ElementsPage extends Renderer { `))} ${this.#actionsLabels} -

To learn more about installing RHDS elements on your site using an import map read our getting started docs. +

To learn more about installing RHDS elements on your site using an import map read our getting started docs. `, @@ -634,7 +634,7 @@ export default class ElementsPage extends Renderer { ${!cssProperties.length ? html` None` : html` - +
diff --git a/docs/_includes/layouts/pages/tokens.11ty.ts b/docs/_includes/layouts/pages/tokens.11ty.ts index cd33953769..1d75dd5441 100644 --- a/docs/_includes/layouts/pages/tokens.11ty.ts +++ b/docs/_includes/layouts/pages/tokens.11ty.ts @@ -244,7 +244,7 @@ export default class TokensPage extends Renderer {
CSS Property ${( isDimension ? html`${token.$value}` - : isColor ? html`${token.$value} ` + : isColor ? html`${token.$value}` : isWeight ? html` ${token.$value} ${(token.attributes?.aliases as string[])?.[0] ?? ''}` diff --git a/elements/rh-accordion/test/rh-accordion.spec.ts b/elements/rh-accordion/test/rh-accordion.spec.ts index 6b55f341d8..e38d9704b0 100644 --- a/elements/rh-accordion/test/rh-accordion.spec.ts +++ b/elements/rh-accordion/test/rh-accordion.spec.ts @@ -69,7 +69,7 @@ describe('', function() { ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.

-
+ `); headers = Array.from(element.querySelectorAll('rh-accordion-header')); panels = Array.from(element.querySelectorAll('rh-accordion-panel')); diff --git a/elements/rh-audio-player/rh-audio-player-about.ts b/elements/rh-audio-player/rh-audio-player-about.ts index d2aa0900e6..dadb5f7735 100644 --- a/elements/rh-audio-player/rh-audio-player-about.ts +++ b/elements/rh-audio-player/rh-audio-player-about.ts @@ -56,7 +56,7 @@ export class RhAudioPlayerAbout extends LitElement { ${heading} `} -
+
`; } diff --git a/elements/rh-audio-player/rh-audio-player.ts b/elements/rh-audio-player/rh-audio-player.ts index 3d1e46ccc4..2e238a4698 100644 --- a/elements/rh-audio-player/rh-audio-player.ts +++ b/elements/rh-audio-player/rh-audio-player.ts @@ -452,9 +452,9 @@ export class RhAudioPlayer extends LitElement { ${this.#renderIcon()} - + `; } diff --git a/elements/rh-disclosure/test/rh-disclosure.spec.ts b/elements/rh-disclosure/test/rh-disclosure.spec.ts index 7eebd3a20c..8a178d3dbd 100644 --- a/elements/rh-disclosure/test/rh-disclosure.spec.ts +++ b/elements/rh-disclosure/test/rh-disclosure.spec.ts @@ -121,7 +121,7 @@ describe('', function() { element = await createFixture(html` Summary title - + `); await element.updateComplete; diff --git a/elements/rh-footer/rh-footer-universal.ts b/elements/rh-footer/rh-footer-universal.ts index 8771c3537a..03749c9c6e 100644 --- a/elements/rh-footer/rh-footer-universal.ts +++ b/elements/rh-footer/rh-footer-universal.ts @@ -100,8 +100,8 @@ export class RhFooterUniversal extends LitElement { } - - + + diff --git a/elements/rh-footer/test/rh-footer.spec.ts b/elements/rh-footer/test/rh-footer.spec.ts index 53d72e593d..dbf0d8577f 100644 --- a/elements/rh-footer/test/rh-footer.spec.ts +++ b/elements/rh-footer/test/rh-footer.spec.ts @@ -10,7 +10,7 @@ const KITCHEN_SINK_TEMPLATE = html` Red Hat logo + loading="lazy"/> LinkedIn diff --git a/elements/rh-navigation-primary/test/fixtures.ts b/elements/rh-navigation-primary/test/fixtures.ts index 3f54ec6181..60cf3a9d8b 100644 --- a/elements/rh-navigation-primary/test/fixtures.ts +++ b/elements/rh-navigation-primary/test/fixtures.ts @@ -3,7 +3,7 @@ import { html } from '@open-wc/testing'; export const NAV = html` - Item 1 Content + Item 1 Content @@ -59,7 +59,7 @@ export const NAV = html` Item 8 Content - + `; diff --git a/elements/rh-pagination/rh-pagination.ts b/elements/rh-pagination/rh-pagination.ts index c739e5a4e6..c68f288134 100644 --- a/elements/rh-pagination/rh-pagination.ts +++ b/elements/rh-pagination/rh-pagination.ts @@ -211,7 +211,7 @@ export class RhPagination extends LitElement { - - + + `; diff --git a/eslint.config.js b/eslint.config.js index 816f030f05..f0149c30e5 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,9 +1,26 @@ import globals from 'globals'; import tseslint from 'typescript-eslint'; import pfe from '@patternfly/eslint-config-elements'; +import htmleslint from '@html-eslint/eslint-plugin'; export default tseslint.config( ...pfe, + { + plugins: { + '@html-eslint': htmleslint, + }, + rules: { + '@html-eslint/no-trailing-spaces': 'error', + '@html-eslint/no-extra-spacing-attrs': 'error', + '@html-eslint/no-duplicate-class': 'error', + '@html-eslint/no-extra-spacing-text': 'error', + '@html-eslint/no-duplicate-attrs': 'error', + '@html-eslint/no-abstract-roles': 'error', + '@html-eslint/prefer-https': 'error', + '@html-eslint/no-target-blank': 'error', + '@html-eslint/quotes': 'error', + }, + }, { name: 'local/ignores', ignores: [ diff --git a/package-lock.json b/package-lock.json index 2386d223d9..f3075900e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@11ty/eleventy-plugin-rss": "^2.0.3", "@commitlint/cli": "^19.8.0", "@commitlint/config-conventional": "^19.8.0", + "@html-eslint/eslint-plugin": "^0.40.3", "@lit-labs/eleventy-plugin-lit": "^1.0.5", "@lit-labs/ssr": "^3.3.1", "@lit-labs/ssr-client": "^1.1.7", @@ -2303,19 +2304,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.12.0", + "@eslint/core": "^0.13.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@esm-bundle/chai": { "version": "4.3.4-fix.0", "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz", @@ -2368,6 +2382,47 @@ "license": "BSD-3-Clause", "peer": true }, + "node_modules/@html-eslint/eslint-plugin": { + "version": "0.40.3", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.40.3.tgz", + "integrity": "sha512-ju0BTpo60/NOqh2VIQzBz2d+cekzmvqJZ2BHFRfg3oDQqWzp8nIrgNiKws0ILfs82su/w4zZBqKtMMQp4WvsvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/plugin-kit": "0.2.8", + "@html-eslint/parser": "^0.40.0", + "@html-eslint/template-parser": "^0.40.0", + "@html-eslint/template-syntax-parser": "^0.40.0" + } + }, + "node_modules/@html-eslint/parser": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.40.0.tgz", + "integrity": "sha512-xvySQLPogafK2aTOPBD6V7+4qpr1AnOZXO8zM2z0b4i3BB9ISk5PTWu5+ofOekKxjxUh7Z+QWaoezu1SIi33YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@html-eslint/template-syntax-parser": "^0.40.0", + "es-html-parser": "0.2.0" + } + }, + "node_modules/@html-eslint/template-parser": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.40.0.tgz", + "integrity": "sha512-f1S70T88yRe3zStT0CiDDgRw24Fgi1wgbW74YNUocEVuXvh2snxBEufY46Yg2udGlOz+SnQaygshacW45L+JWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-html-parser": "0.2.0" + } + }, + "node_modules/@html-eslint/template-syntax-parser": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.40.0.tgz", + "integrity": "sha512-Rq3UmjiWreKnXrN95Nt6vLlKgQrV8PhoYrlADn3u7X7vtgCccTmjV6aUHJCw7AyNXmcSNNpN2KPsBmQfH3y58A==", + "dev": true, + "license": "MIT" + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -12370,6 +12425,13 @@ "node": ">= 0.4" } }, + "node_modules/es-html-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.2.0.tgz", + "integrity": "sha512-snJ7uJC8Dkx/yT0eYZrWcY57rkPU6Zui6YphPynw8r52AWf57gjqMC0GWe7OxSDipwXowFpa3rqckEeAPTOz7w==", + "dev": true, + "license": "MIT" + }, "node_modules/es-module-lexer": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", diff --git a/package.json b/package.json index 46f413cc72..b41ed6ccec 100644 --- a/package.json +++ b/package.json @@ -287,6 +287,7 @@ "@11ty/eleventy-plugin-rss": "^2.0.3", "@commitlint/cli": "^19.8.0", "@commitlint/config-conventional": "^19.8.0", + "@html-eslint/eslint-plugin": "^0.40.3", "@lit-labs/eleventy-plugin-lit": "^1.0.5", "@lit-labs/ssr": "^3.3.1", "@lit-labs/ssr-client": "^1.1.7", diff --git a/uxdot/uxdot-pattern.ts b/uxdot/uxdot-pattern.ts index bae2e3737e..192fb4c9c9 100644 --- a/uxdot/uxdot-pattern.ts +++ b/uxdot/uxdot-pattern.ts @@ -101,7 +101,7 @@ export class UxdotPattern extends SSRFailureRecoverableElement { active-index="${ifDefined(!this.#picked ? ['html', 'css', 'js'].indexOf(activeTab) : undefined)}" ?hidden="${this.noCodeTabs}" @expand="${this.#onExpand}"> - HTML + HTML - CSS + CSS - JS + JS Date: Wed, 21 May 2025 11:25:11 +0300 Subject: [PATCH 2/2] style: lint with sort-attrs --- docs/_includes/layouts/pages/element.11ty.ts | 22 ++-- docs/_includes/layouts/pages/tokens.11ty.ts | 10 +- docs/_plugins/markdown-it.ts | 2 +- docs/_plugins/tokensHelpers.ts | 4 +- .../iconography/iconography.11ty.js | 4 +- docs/foundations/iconography/icons.js | 2 +- elements/rh-accordion/rh-accordion-header.ts | 4 +- .../rh-accordion/test/rh-accordion.spec.ts | 4 +- elements/rh-alert/demo/dismissable.html | 2 +- elements/rh-alert/rh-alert.ts | 24 ++-- elements/rh-announcement/rh-announcement.ts | 10 +- .../test/rh-announcement.spec.ts | 6 +- .../rh-audio-player-rate-stepper.ts | 22 ++-- ...rh-audio-player-scrolling-text-overflow.ts | 6 +- .../rh-audio-player-subscribe.ts | 2 +- elements/rh-audio-player/rh-audio-player.ts | 122 +++++++++--------- elements/rh-audio-player/rh-cue.ts | 4 +- elements/rh-audio-player/rh-transcript.ts | 2 +- .../test/rh-audio-player.spec.ts | 20 +-- elements/rh-avatar/rh-avatar.ts | 12 +- elements/rh-back-to-top/rh-back-to-top.ts | 4 +- elements/rh-blockquote/rh-blockquote.ts | 2 +- elements/rh-breadcrumb/rh-breadcrumb.ts | 2 +- .../rh-breadcrumb/test/rh-breadcrumb.spec.ts | 4 +- elements/rh-button/demo/form-control.html | 2 +- elements/rh-button/rh-button.ts | 14 +- elements/rh-card/rh-card.ts | 20 +-- elements/rh-card/test/rh-card.spec.ts | 4 +- elements/rh-chip/rh-chip.ts | 10 +- elements/rh-code-block/rh-code-block.ts | 44 +++---- elements/rh-cta/demo/analytics.html | 2 +- elements/rh-cta/rh-cta.ts | 8 +- elements/rh-dialog/rh-dialog.ts | 10 +- elements/rh-dialog/test/rh-dialog.spec.ts | 8 +- elements/rh-disclosure/rh-disclosure.ts | 2 +- elements/rh-footer/rh-footer-links.ts | 4 +- elements/rh-footer/rh-footer-social-link.ts | 4 +- elements/rh-footer/rh-footer-universal.ts | 8 +- elements/rh-footer/rh-footer.ts | 2 +- elements/rh-footer/test/rh-footer.spec.ts | 8 +- elements/rh-health-index/rh-health-index.ts | 4 +- elements/rh-icon/rh-icon.ts | 4 +- elements/rh-jump-links/rh-jump-link.ts | 4 +- elements/rh-jump-links/rh-jump-links.ts | 20 +-- .../rh-navigation-primary.ts | 6 +- .../rh-navigation-primary/test/fixtures.ts | 14 +- .../rh-navigation-secondary-dropdown.ts | 2 +- .../rh-navigation-secondary.ts | 14 +- .../rh-navigation-secondary/test/fixtures.ts | 22 ++-- elements/rh-pagination/rh-pagination.ts | 32 ++--- elements/rh-site-status/rh-site-status.ts | 8 +- elements/rh-spinner/rh-spinner.ts | 6 +- elements/rh-stat/test/rh-stat.spec.ts | 4 +- elements/rh-subnav/rh-subnav.ts | 20 +-- elements/rh-subnav/test/rh-subnav.spec.ts | 2 +- elements/rh-switch/rh-switch.ts | 12 +- elements/rh-switch/test/rh-switch.spec.ts | 12 +- elements/rh-table/rh-sort-button.ts | 10 +- elements/rh-tabs/rh-tab.ts | 8 +- elements/rh-tabs/rh-tabs.ts | 24 ++-- elements/rh-tag/rh-tag.ts | 2 +- elements/rh-tag/test/rh-tag.spec.ts | 2 +- elements/rh-tile/rh-tile.ts | 18 +-- elements/rh-tile/test/rh-tile.spec.ts | 4 +- .../rh-timestamp/test/rh-timestamp.spec.ts | 6 +- elements/rh-tooltip/rh-tooltip.ts | 4 +- elements/rh-tooltip/test/rh-tooltip.spec.ts | 2 +- elements/rh-video-embed/rh-video-embed.ts | 32 ++--- .../test/rh-video-embed.spec.ts | 34 ++--- eslint.config.js | 3 + lib/context/headings/consumer.ts | 12 +- .../rh-context-demo/rh-context-demo.ts | 4 +- .../rh-context-picker/rh-context-picker.ts | 8 +- scripts/validate-prs.js | 3 - uxdot/uxdot-best-practice.ts | 2 +- uxdot/uxdot-color-scheme-picker.ts | 12 +- uxdot/uxdot-copy-button.ts | 2 +- uxdot/uxdot-copy-permalink.ts | 6 +- uxdot/uxdot-demo.ts | 14 +- uxdot/uxdot-example.ts | 2 +- uxdot/uxdot-feedback.ts | 2 +- uxdot/uxdot-header.ts | 8 +- uxdot/uxdot-masthead.ts | 12 +- uxdot/uxdot-pattern.ts | 22 ++-- uxdot/uxdot-repo-status-checklist.ts | 6 +- uxdot/uxdot-repo-status-list.ts | 8 +- uxdot/uxdot-repo-status-table.ts | 10 +- uxdot/uxdot-search.ts | 26 ++-- uxdot/uxdot-sidenav.ts | 6 +- uxdot/uxdot-spacer-tokens-table.ts | 10 +- uxdot/uxdot-toc.ts | 8 +- 91 files changed, 482 insertions(+), 482 deletions(-) diff --git a/docs/_includes/layouts/pages/element.11ty.ts b/docs/_includes/layouts/pages/element.11ty.ts index 86aa17a8c5..51ecabc7eb 100644 --- a/docs/_includes/layouts/pages/element.11ty.ts +++ b/docs/_includes/layouts/pages/element.11ty.ts @@ -79,7 +79,7 @@ export default class ElementsPage extends Renderer { ].filter(Boolean); return html`${stylesheets.map(x => html` - `).join('')} + `).join('')}