Skip to content

Instantly share code, notes, and snippets.

View ulrischa's full-sized avatar

Uli Schäffler ulrischa

View GitHub Profile
@ulrischa
ulrischa / showstorage.js
Created December 25, 2025 16:27
Bookmarklet to show localStorage and sessionStorage
javascript:(()=>{try{const dump_storage=(name)=>{const result={name,ok:false,error:null,items:{}};let s=null;try{s=window[name];}catch(e){result.error=`Accessing window.${name} threw: ${String(e)}`;return result;}if(!s){result.error=`window.${name} is not available`;return result;}let len=0;try{len=s.length;}catch(e){result.error=`${name}.length threw: ${String(e)}`;return result;}const keys=[];for(let i=0;i<len;i++){try{keys.push(s.key(i));}catch(e){keys.push(null);result.error=(result.error?result.error+"\n":"")+`${name}.key(${i}) threw: ${String(e)}`;}}for(const k of keys){if(k===null)continue;try{result.items[k]=s.getItem(k);}catch(e){result.items[k]=null;result.error=(result.error?result.error+"\n":"")+`${name}.getItem(${JSON.stringify(k)}) threw: ${String(e)}`;}}result.ok=result.error===null;return result;};const payload={origin:location.origin,href:location.href,timestamp:new Date().toISOString(),localStorage:dump_storage("localStorage"),sessionStorage:dump_storage("sessionStorage")};const text=JSON.st
@ulrischa
ulrischa / ButtonInstall.js
Created November 29, 2025 19:17 — forked from adactio/ButtonInstall.js
Web Install HTML web component
class ButtonInstall extends HTMLElement {
connectedCallback () {
this.button = this.querySelector('button');
if (window.matchMedia('(display-mode: standalone)').matches) {
this.button.remove();
return;
}
if (!navigator.install) {
this.button.remove();
return;
javascript:(()=>{const selectedText=window.getSelection().toString().trim();if(!selectedText){alert("You need to select some text!");return;}const url=new URL(window.location);url.hash=`:~:text=${encodeURIComponent(selectedText)}`;navigator.clipboard.writeText(url.toString()).then(()=>{alert("Copied to clipboard:\n"+url.toString());}).catch(()=>{alert("Error: Could not copy to clipboard.\n"+url.toString());});})();
accordion-group {
background-color: #f7f7f7;
border-radius: 0.25em;
display: block;
margin-block-end: 1.5em;
padding: 0.5em 1em;
width: 100%;
}
accordion-group [accordion-trigger] {
/**
* Don't show button until JavaScript is instantiated
*/
share-me:not(:defined) {
display: none;
}
/**
* Visually hide an element, but leave it available for screen readers
* @link https://github.com/h5bp/html5-boilerplate/blob/master/dist/css/main.css
<h2 class="main-heading" id="specific-heading">Dies ist eine Überschrift</h2>
<div class="main-content">
<h2>Hauptinhalts-Titel</h2>
<p>Das ist der erste Absatz.</p>
<div class="sidebar">
<h2>Sidebar Titel</h2>
<p>Inhalt der Sidebar.</p>
</div>
<p>Das ist der zweite Absatz im Hauptinhalt.</p>
</div>
@ulrischa
ulrischa / htaccess
Created May 13, 2025 15:24 — forked from cferdinandi/htaccess
Gzip setup for .htaccess, taken from the old HTML5 Boilerplate template
# ----------------------------------------------------------------------
# | Compression |
# ----------------------------------------------------------------------
<IfModule mod_deflate.c>
# Force compression for mangled `Accept-Encoding` request headers
# https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
<IfModule mod_setenvif.c>