Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add browsers list, linting plugin and Docs section with supported browsers #1956

Open
wants to merge 34 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
22ef304
feat: add browser list and linting rule
Oct 14, 2024
bb1de08
feat: load browser statistics based on browserslist
Oct 14, 2024
8e9ad9c
refactor: convert to typescript
Oct 14, 2024
b40bd7c
feat: render browser table
Oct 14, 2024
197701a
feat: 2 col tables
Oct 14, 2024
b33eed1
fix: storybook compile error
Oct 15, 2024
2e00f51
chore: add comment
Oct 15, 2024
730cebd
feat: browsers table component
Oct 15, 2024
fdfeecc
refactor: HomePage
Oct 15, 2024
daa2ede
feat: mock browser data for Storybook
Oct 15, 2024
04b8363
refactor: home page
Oct 15, 2024
6c3d1f6
docs(changeset): Adding a browserslist config file and corresponding …
Oct 15, 2024
0ec93f6
fix: browserslist link
Oct 15, 2024
e5fa503
Update .changeset/brave-days-happen.md
oemueller Oct 16, 2024
c46b9df
Update apps/docs/src/.vitepress/browser-loader.data.ts
oemueller Oct 16, 2024
2838c82
Update apps/docs/src/.vitepress/browser-loader.data.ts
oemueller Oct 16, 2024
e7dcc88
refactor: rule parsing
Oct 18, 2024
36637a1
refactor: fetch browserslist data
Oct 18, 2024
0850eb6
refactor
Oct 18, 2024
4578055
refactor: remove browsers from homepage
Oct 18, 2024
5fa5586
feat: add browsers to get started
Oct 18, 2024
7f58a1b
feat: browser images + css
Oct 18, 2024
e7f586b
fix: text
Oct 18, 2024
3b1a69d
refactor: wording
Oct 18, 2024
3d9c8c1
refactor: text
Oct 18, 2024
6a115c8
fix: filter browsers
Oct 18, 2024
37d5c0b
refactor
Oct 18, 2024
6811655
browser-loader error handling
oemueller Oct 21, 2024
98bf326
use Flexbox for Browser items
oemueller Oct 21, 2024
bca0410
Update apps/docs/src/development/index.md
oemueller Oct 21, 2024
ebc7026
reject promise on error
oemueller Oct 21, 2024
ba6e4e0
optimize filteredBrowsers
oemueller Oct 21, 2024
8637a7b
fix next steps hierarchy
Oct 21, 2024
701907c
fix: image size
Oct 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .browserslistrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Browsers that we support

> 0.5%, last 2 versions, Firefox ESR,
not dead, not op_mini all, not KaiOS < 4.0
5 changes: 5 additions & 0 deletions .changeset/brave-days-happen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"docs": minor
---

Adding a browserslist config file and corresponding Eslint plugin (compat). Code will be linted based on supported browsers. Docs now show a section on the homepage listing all supported browsers and versions.
5 changes: 5 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ module.exports = {
parserOptions: {
ecmaVersion: "latest",
},
plugins: ["compat"],
env: {
browser: true,
},
extends: [
"plugin:vue/vue3-recommended",
"eslint:recommended",
Expand All @@ -18,6 +22,7 @@ module.exports = {
// see: https://github.com/vuejs/eslint-config-typescript#vueeslint-config-typescriptrecommended
"@vue/eslint-config-typescript/recommended",
"@vue/eslint-config-prettier/skip-formatting",
"plugin:compat/recommended",
oemueller marked this conversation as resolved.
Show resolved Hide resolved
],
rules: {
// Allow usage of @ts-ignore if a description for the reason was provided
Expand Down
7 changes: 7 additions & 0 deletions apps/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"@sit-onyx/icons": "workspace:^",
"@sit-onyx/shared": "workspace:^",
"@sit-onyx/vitepress-theme": "workspace:^",
"@vueuse/core": "^11.1.0",
"chart.js": "^4.4.4",
"postcss": "^8.4.47",
"sass-embedded": "catalog:",
Expand All @@ -26,5 +27,11 @@
"vitepress": "^1.4.0",
"vue": "catalog:",
"vue-chartjs": "^5.3.1"
},
"imports": {
"#src/.vitepress/browser-loader.data": {
"storybook": "./src/.vitepress/browser-loader.data.mock.ts",
"default": "./src/.vitepress/browser-loader.data.ts"
}
oemueller marked this conversation as resolved.
Show resolved Hide resolved
}
}
27 changes: 27 additions & 0 deletions apps/docs/src/.vitepress/browser-loader.data.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import type { Data } from "./browser-loader.data";

// We need to mock the Data for Storybook
export const data: Data = {
browsers: [
{
coverage: 96.86,
id: "chrome",
name: "Chrome",
versions: {
"108.0.0": 108,
"107.0.0": 107,
},
},
{
coverage: 91.86,
id: "firefox",
name: "Firefox",
versions: {
"108.0.0": 108,
"107.0.0": 107,
},
},
],
coverage: 96.86,
browserRules: "default",
};
61 changes: 61 additions & 0 deletions apps/docs/src/.vitepress/browser-loader.data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import fs from "fs";
import { fileURLToPath } from "url";
import { defineLoader } from "vitepress";

const browserslistRcPath = fileURLToPath(new URL("../../../../.browserslistrc", import.meta.url));

export type Browser = {
coverage: number;
id: string;
name: string;
versions: Record<string, number | undefined>;
};

export interface Data {
browsers: Browser[];
coverage: number;
browserRules: string;
}

declare const data: Data;

export { data };

/**
* Based on our browserslist config we load information about supported browser version and coverage from the
* official browserlist API. This happens only on build time.
* More information can be found on https://browsersl.ist
*/
export default defineLoader({
async load(): Promise<Data> {
return new Promise((resolve, reject) => {
let browserRules = "";

try {
const data = fs.readFileSync(browserslistRcPath, "utf8");
const lines = data.split("\n").filter((l) => !!l && !l.startsWith("#"));
browserRules = lines.join("").trim();
} catch (e) {
reject("could not read .browserslistrc")
}

const fetchBrowserslistData = async () => {
const url = `https://browsersl.ist/api/browsers?q=${browserRules}`;
const response = await fetch(url);

if (!response.ok) {
throw new Error("failed to fetch browserslist API data");
}

const data = await response.json();
resolve({ browserRules, ...data });
};

try {
fetchBrowserslistData();
} catch {
reject("error loading browserslist API data");
}
});
},
});
14 changes: 14 additions & 0 deletions apps/docs/src/.vitepress/components/BrowsersList.stories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Meta, StoryObj } from "@storybook/vue3";
import Component from "./BrowsersList.vue";

const meta: Meta<typeof Component> = {
title: "BrowsersList",
component: Component,
};

export default meta;
type Story = StoryObj<typeof Component>;

export const Default = {
args: {},
} satisfies Story;
64 changes: 64 additions & 0 deletions apps/docs/src/.vitepress/components/BrowsersList.vue
oemueller marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<script lang="ts" setup>
import { data as browsersData } from "#src/.vitepress/browser-loader.data";

const browsers = browsersData.browsers.filter((b) => b.coverage > 0);

const popularBrowsers = ["chrome", "edge", "firefox", "safari", "samsung", "ios_saf"];

const filteredBrowsers = browsers
.filter((browser) => popularBrowsers.includes(browser.id))
.map((browser) => {
return {
...browser,
minVersion: Object.keys(browser.versions).sort()[0],
};
});
</script>

<template>
<ul class="browsersList">
<li v-for="{ name, minVersion, id } in filteredBrowsers" :key="name" class="browser">
<img
:src="`/assets/browsers/${id}.svg`"
:alt="`${name} icon`"
width="40px"
height="40px"
oemueller marked this conversation as resolved.
Show resolved Hide resolved
class="browser__image"
loading="lazy"
/>
<p class="browser__name">{{ name }}</p>
<p>Version ≥ {{ minVersion }}</p>
</li>
</ul>
</template>

<style lang="scss" scoped>
.browsersList {
display: flex;
flex-wrap: wrap;
gap: var(--onyx-spacing-xl);
margin: 0;
padding: 0;
margin-bottom: var(--onyx-spacing-lg);
}

.browser {
list-style: none;
padding: 0;
margin: 0;
p {
margin: 0;
line-height: 1.3;
}
&__name {
padding-top: var(--onyx-spacing-xs);
font-weight: 600;
}
&__image {
position: relative;
width: 40px;
height: 40px;
transform: translateX(-4px);
}
}
</style>
1 change: 1 addition & 0 deletions apps/docs/src/assets/browsers/chrome.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions apps/docs/src/assets/browsers/edge.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions apps/docs/src/assets/browsers/firefox.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading