This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Apr 6, 2025. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Hyperapp Router

Travis CICodecovnpmSlack

Hyperapp Router provides declarative routing for Hyperapp using the History API.

Try this example online.

import{h,app}from"hyperapp"import{Link,Route,location}from"@hyperapp/router"constHome=()=><h2>Home</h2>constAbout=()=><h2>About</h2>constTopic=({ match })=><h3>{match.params.topicId}</h3>constTopicsView=({ match })=>(<divkey="topics"><h2>Topics</h2><ul><li><Linkto={`${match.url}/components`}>Components</Link></li><li><Linkto={`${match.url}/single-state-tree`}>Single State Tree</Link></li><li><Linkto={`${match.url}/routing`}>Routing</Link></li></ul>{match.isExact&&<h3>Please select a topic.</h3>}<Routeparentpath={`${match.path}/:topicId`}render={Topic}/></div>)conststate={location: location.state}constactions={location: location.actions}constview=state=>(<div><ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul><hr/><Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/></div>)constmain=app(state,actions,view,document.body)constunsubscribe=location.subscribe(main.location)

Installation

npm i @hyperapp/router

Then with a module bundler like Rollup or Webpack, use as you would anything else.

import{Link,Route,Switch,Redirect,location}from"@hyperapp/router"

If you don't want to set up a build environment, you can download Hyperapp Router from a CDN like unpkg.com and it will be globally available through the window.hyperappRouter object. We support all ES5-compliant browsers, including Internet Explorer 10 and above.

Usage

Add the location module to your state and actions and start the application.

conststate={location: location.state}constactions={location: location.actions}constmain=app(state,actions,(state,actions)=><Routerender={()=><h1>Hello!</h1>}/>,document.body)

Then call subscribe to listen to location change events.

constunsubscribe=location.subscribe(main.location)

Components

Route

Render a component when the given path matches the current window location. A route without a path is always a match. Routes can have nested routes.

<Routepath="/"render={Home}/><Routepath="/about"render={About}/><Routeparentpath="/topics"render={TopicsView}/>

parent

The route contains child routes.

path

The path to match against the current location.

render

The component to render when there is a match.

Render Props

Rendered components are passed the following props.

constRouteInfo=({ location, match })=>(<div><h3>Url: {match.url}</h3><h3>Path: {match.path}</h3><ul>{Object.keys(match.params).map(key=>(<li>{key}: {match.params[key]}</li>))}</ul><h3>Location: {location.pathname}</h3></div>)

location

The window location.

match.url

The matched part of the url. Use to assemble links inside routes. See Link.

match.path

The route path.

match.isExact

Indicates whether the given path matched the url exactly or not.

Link

Use the Link component to update the current window location and navigate between views without a page reload. The new location will be pushed to the history stack using history.pushState.

constNavigation=(<ul><li><Linkto="/">Home</Link></li><li><Linkto="/about">About</Link></li><li><Linkto="/topics">Topics</Link></li></ul>)

to

The link's destination url.

Redirect

Use the Redirect component to navigate to a new location. The new location will override the current location in the history stack using history.replaceState.

constLogin=({ from, login, redirectToReferrer })=>props=>{if(redirectToReferrer){return<Redirectto={from}/>}return(<div><p>You must log in to view the page at {from}.</p><buttononclick={()=>{auth.authenticate(userId=>login(userId))}}>
Log in
</button></div>)}

to

The redirect's destination url.

from

Overwrite the previous pathname. See location.previous.

Switch

Use the Switch component when you want to ensure only one out of several routes is rendered. It always renders the first matching child.

constNoMatchExample=(<Switch><Routepath="/"render={Home}/><Routepath="/old-match"render={()=><Redirectfrom="/old-match"to="/will-match"/>}/><Routepath="/will-match"render={WillMatch}/><Routerender={NoMatch}/></Switch>)

Modules

location

pathname

Same as window.location.pathname.

previous

The previous location.pathname. Useful when redirecting back to the referrer url/pathname after leaving a protected route.

go(url)

Navigate to the given url.

License

Hyperapp Router is MIT licensed. See LICENSE.

About

Declarative routing for Hyperapp V1 using the History API.

Topics

Resources

Stars

253 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages