├── src ├── react-app-env.d.ts ├── index.css ├── config │ └── index.ts ├── setupTests.ts ├── data │ ├── compositors │ │ ├── README.md │ │ ├── gamescope.json │ │ ├── weston.json │ │ ├── muffin.json │ │ ├── cage.json │ │ ├── mir.json │ │ ├── louvre.json │ │ ├── mutter.json │ │ ├── wayfire.json │ │ └── niri.json │ ├── protocols │ │ ├── text-cursor-position.json │ │ ├── kde-primary-output-v1.json │ │ ├── treeland-output-manager-v1.json │ │ ├── kde-output-order-v1.json │ │ ├── kde-blur.json │ │ ├── kde-lockscreen-overlay-v1.json │ │ ├── treeland-wallpaper-color-v1.json │ │ ├── kde-server-decoration-palette.json │ │ ├── treeland-window-management-v1.json │ │ ├── kde-idle.json │ │ ├── kde-appmenu.json │ │ ├── xdg-system-bell-v1.json │ │ ├── treeland-shortcut-manager-v1.json │ │ ├── cosmic-image-capture-source-unstable-v1.json │ │ ├── kde-slide.json │ │ ├── kde-keystate.json │ │ ├── wlr-input-inhibitor-unstable-v1.json │ │ └── weston-direct-display.json │ └── compositor-registry.ts ├── App.test.tsx ├── components │ ├── layout │ │ ├── ScrollToTop.tsx │ │ ├── Logo.tsx │ │ ├── overlays │ │ │ ├── OverlayBackground.tsx │ │ │ ├── SidebarOverlay.tsx │ │ │ └── OutlineOverlay.tsx │ │ ├── Header.tsx │ │ ├── Footer.tsx │ │ └── MultiColumnLayout.tsx │ ├── content │ │ ├── Badge.tsx │ │ └── WaylandElementSignature.tsx │ ├── common │ │ ├── utils.ts │ │ ├── hooks-utils.ts │ │ ├── index.ts │ │ └── wayland-protocol-icons.ts │ ├── WaylandEntry.tsx │ ├── WaylandCopyright.tsx │ ├── sidebar-navigation │ │ └── SidebarNavLink.tsx │ ├── outline │ │ ├── WaylandProtocolOutline.tsx │ │ └── WaylandInterfaceOutline.tsx │ ├── WaylandDescription.tsx │ ├── WaylandProtocol.tsx │ ├── WaylandArg.tsx │ ├── WaylandEnum.tsx │ ├── WaylandEvent.tsx │ ├── WaylandRequest.tsx │ ├── WaylandInterface.tsx │ └── breadcrumbs │ │ └── Breadcrumbs.tsx ├── reportWebVitals.ts ├── pages │ └── 404.tsx ├── analytics │ └── plausible.ts ├── index.tsx ├── model │ ├── wayland-protocol-metadata.ts │ └── wayland.ts ├── App.tsx ├── logo.svg └── gitlab-api │ └── index.ts ├── .editorconfig ├── .prettierignore ├── public ├── favicon.ico ├── robots.txt ├── favicon-16x16.png ├── favicon-32x32.png ├── mstile-70x70.png ├── apple-touch-icon.png ├── mstile-144x144.png ├── mstile-150x150.png ├── mstile-310x150.png ├── mstile-310x310.png ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── browserconfig.xml ├── logos │ ├── cinnamon.svg │ ├── Steam_Deck.svg │ ├── gnome.svg │ ├── louvre.svg │ ├── mir.svg │ ├── labwc.svg │ ├── sway.svg │ ├── hyprland.svg │ ├── deepin.svg │ ├── cosmic.svg │ ├── wayfire.svg │ └── cage.svg ├── manifest.json ├── safari-pinned-tab.svg ├── index.html └── logo.svg ├── .prettierrc.json ├── tsconfig.scripts.json ├── .gitignore ├── tailwind.config.js ├── tsconfig.json ├── netlify.toml ├── .gitmodules ├── LICENSE ├── README.md ├── scripts ├── bin │ ├── print-protocol-registry-items.ts │ └── render-static-html.tsx └── lib │ └── utils.ts ├── package.json └── protocols └── external ├── gtk-shell.xml └── agl-screenshooter.xml /src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root=true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /protocols/ 2 | /src/data/protocols/ 3 | /src/data/compositors/ 4 | /build/ 5 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4, 3 | "semi": false, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/mstile-70x70.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/mstile-144x144.png -------------------------------------------------------------------------------- /public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/mstile-150x150.png -------------------------------------------------------------------------------- /public/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/mstile-310x150.png -------------------------------------------------------------------------------- /public/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/mstile-310x310.png -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vially/wayland-explorer/HEAD/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/config/index.ts: -------------------------------------------------------------------------------- 1 | export const appConfig = { 2 | domain: 'wayland.app', 3 | analyticsDomain: 'https://wayland.app', 4 | } 5 | -------------------------------------------------------------------------------- /tsconfig.scripts.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "module": "CommonJS", 6 | "lib": ["es2019", "DOM"] 7 | }, 8 | "include": ["src", "scripts"] 9 | } 10 | -------------------------------------------------------------------------------- /src/setupTests.ts: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom' 6 | -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/data/compositors/README.md: -------------------------------------------------------------------------------- 1 | # Regenerating or adding new files 2 | 3 | These files are generated via [`wlprobe`](https://github.com/PolyMeilex/wlprobe), a tool similar to `wayland-info` but [with JSON support](https://gitlab.freedesktop.org/wayland/wayland-utils/-/issues/2). Refer to its README for usage instructions. 4 | -------------------------------------------------------------------------------- /src/App.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { render, screen } from '@testing-library/react' 3 | import App from './App' 4 | 5 | test('renders learn react link', () => { 6 | render() 7 | const linkElement = screen.getByText(/learn react/i) 8 | expect(linkElement).toBeInTheDocument() 9 | }) 10 | -------------------------------------------------------------------------------- /src/components/layout/ScrollToTop.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react' 2 | import { useLocation } from 'wouter' 3 | 4 | export const ScrollToTop = () => { 5 | const [pathname] = useLocation() 6 | 7 | useEffect(() => { 8 | if (window.location.hash === '') { 9 | window.scrollTo(0, 0) 10 | } 11 | }, [pathname]) 12 | 13 | return null 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /public/logos/cinnamon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/logos/Steam_Deck.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/components/layout/Logo.tsx: -------------------------------------------------------------------------------- 1 | import { Link } from 'wouter' 2 | 3 | export const Logo: React.FC = () => ( 4 | 5 | 6 | Logo 7 | 11 | Wayland Explorer 12 | 13 | 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /src/components/content/Badge.tsx: -------------------------------------------------------------------------------- 1 | export const Badge: React.FC<{ 2 | bgColor?: string 3 | textColor?: string 4 | fontWeigth?: string 5 | title?: string 6 | children?: React.ReactNode 7 | }> = ({ children, bgColor, textColor, fontWeigth, title }) => ( 8 | 14 | {children} 15 | 16 | ) 17 | -------------------------------------------------------------------------------- /src/reportWebVitals.ts: -------------------------------------------------------------------------------- 1 | import { ReportHandler } from 'web-vitals' 2 | 3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => { 4 | if (onPerfEntry && onPerfEntry instanceof Function) { 5 | import('web-vitals').then( 6 | ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 7 | getCLS(onPerfEntry) 8 | getFID(onPerfEntry) 9 | getFCP(onPerfEntry) 10 | getLCP(onPerfEntry) 11 | getTTFB(onPerfEntry) 12 | } 13 | ) 14 | } 15 | } 16 | 17 | export default reportWebVitals 18 | -------------------------------------------------------------------------------- /src/components/common/utils.ts: -------------------------------------------------------------------------------- 1 | import { 2 | WaylandArg, 3 | WaylandEntry, 4 | WaylandEnum, 5 | WaylandEvent, 6 | WaylandRequest, 7 | } from '../../model/wayland' 8 | 9 | export function buildHashPathFor( 10 | interfaceName: string, 11 | parentElement: WaylandEvent | WaylandRequest | WaylandEnum, 12 | arg: WaylandArg | WaylandEntry, 13 | options?: { includeHashSymbol: boolean } 14 | ): string { 15 | return `${options?.includeHashSymbol ? '#' : ''}${interfaceName}:${ 16 | parentElement.type 17 | }:${parentElement.name}:${arg.type}:${arg.name}` 18 | } 19 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const colors = require('tailwindcss/colors') 2 | const defaultTheme = require('tailwindcss/defaultTheme') 3 | 4 | module.exports = { 5 | content: ['./src/**/*.{js,jsx,ts,tsx}', './public/index.html'], 6 | theme: { 7 | extend: { 8 | colors: { gray: colors.zinc }, 9 | }, 10 | fontFamily: { 11 | sans: ['Inter var', ...defaultTheme.fontFamily.sans], 12 | serif: [...defaultTheme.fontFamily.serif], 13 | mono: [...defaultTheme.fontFamily.mono], 14 | }, 15 | }, 16 | plugins: [require('tailwind-scrollbar')], 17 | } 18 | -------------------------------------------------------------------------------- /src/components/WaylandEntry.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | WaylandElementProps, 3 | WaylandEntryModel, 4 | WaylandEnumModel, 5 | } from './common' 6 | 7 | export const WaylandEntry: React.FC< 8 | WaylandElementProps & { 9 | interfaceName: string 10 | enumElement: WaylandEnumModel 11 | } 12 | > = ({ element, enumElement, interfaceName }) => ( 13 | 18 | {element.name} 19 | 20 | ) 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"] 20 | } 21 | -------------------------------------------------------------------------------- /src/components/common/hooks-utils.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react' 2 | 3 | const addBodyClass = (className: string) => 4 | document.body.classList.add(className) 5 | 6 | const removeBodyClass = (className: string) => 7 | document.body.classList.remove(className) 8 | 9 | export function useBodyClass(className: string) { 10 | useEffect(() => { 11 | // Set up 12 | addBodyClass(className) 13 | 14 | // Clean up 15 | return () => removeBodyClass(className) 16 | }, [className]) 17 | } 18 | 19 | export function usePageTitle(title: string) { 20 | useEffect(() => { 21 | document.title = `${title} | Wayland Explorer` 22 | }, [title]) 23 | } 24 | -------------------------------------------------------------------------------- /src/components/layout/overlays/OverlayBackground.tsx: -------------------------------------------------------------------------------- 1 | import { Transition } from '@headlessui/react' 2 | import { useBodyClass } from '../../common/hooks-utils' 3 | 4 | export function OverlayBackground() { 5 | useBodyClass('overflow-hidden') 6 | 7 | return ( 8 |