<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>1920s on Kosmik.my</title><link>https://kosmik.my/nebula/en/tags/1920s/</link><description>Recent content in 1920s on Kosmik.my</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Kosmik.my</copyright><lastBuildDate>Tue, 25 Aug 2026 21:05:59 +0000</lastBuildDate><atom:link href="https://kosmik.my/nebula/en/tags/1920s/index.xml" rel="self" type="application/rss+xml"/><item><title>Lunar Standstills — 1920s</title><link>https://kosmik.my/nebula/en/lunar-standstills/1920/</link><pubDate>Sat, 03 Jan 2026 00:00:00 +0800</pubDate><guid>https://kosmik.my/nebula/en/lunar-standstills/1920/</guid><description>&lt;style&gt;&#10;.ls-tbl{display:table;width:100%;overflow:visible}&#10;.ls-tbl td{vertical-align:top}&#10;.ls-moon{display:inline-flex;align-items:center;gap:.55em;text-align:left;vertical-align:middle}&#10;.ls-moon&gt;svg{flex:0 0 auto;display:block}&#10;.ls-moon-info{display:flex;flex-direction:column;line-height:1.3;min-width:0}&#10;.ls-moon-name{font-weight:600;white-space:nowrap}&#10;.ls-moon-pct{font-size:.82em;opacity:.82}&#10;.ls-moon-age{font-size:.78em;opacity:.68;white-space:normal}&#10;.ls-moon-age-lbl{font-weight:600;opacity:.85}&#10;@media(max-width:640px){&#10;.ls-tbl thead{display:none}&#10;.ls-tbl,.ls-tbl tbody,.ls-tbl tr{display:block}&#10;.ls-tbl tr{padding:.3em 0}&#10;.ls-tbl tbody tr{border-top-width:1px;border-top-color:var(--tw-prose-td-borders)}&#10;.ls-tbl tbody tr:first-child{border-top-color:var(--tw-prose-th-borders)}&#10;.ls-tbl tbody tr:last-child{border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}&#10;.ls-tbl td{display:flex;justify-content:space-between;align-items:baseline;padding:3px 0;text-align:right;white-space:normal}&#10;.ls-tbl td::before{content:attr(data-label);flex-shrink:0;text-align:left;font-weight:600;padding-right:.75em;white-space:nowrap;color:var(--tw-prose-headings,currentColor);opacity:.8}&#10; .ls-moon{align-items:center;flex-direction:row-reverse}&#10; .ls-moon-info{align-items:flex-end;text-align:right}&#10; }&#10;/* Chart SVG shared styles — repetitive stroke/font attributes live here&#10; so each marker/grid/legend element carries only its unique values. */&#10;.ls-c{cursor:pointer}&#10;.ls-mk{stroke:#fff;stroke-opacity:.5;stroke-width:1.2;opacity:.9}&#10;.ls-mt{font:bold 10px system-ui;fill:#fff;text-anchor:middle;dominant-baseline:middle;pointer-events:none}&#10;.ls-g0{stroke:#fff;stroke-opacity:.55;stroke-width:1.2}&#10;.ls-g1{stroke:#fff;stroke-opacity:.2;stroke-width:.6}&#10;.ls-gl{font:10px system-ui;fill:#fff;fill-opacity:.45;text-anchor:end;dominant-baseline:middle}&#10;.ls-tk{stroke:#fff;stroke-opacity:.3}&#10;.ls-tl{font:9px system-ui;fill:#fff;fill-opacity:.45;text-anchor:middle}&#10;.ls-lg{opacity:.85}&#10;.ls-lg2{opacity:.75}&#10;.ls-lt{font:9px system-ui;fill:#fff;fill-opacity:.6;dominant-baseline:middle}&#10;.ls-ax{stroke:#fff;stroke-opacity:.4}&#10;.ls-al{font:10px system-ui;fill:#fff;fill-opacity:.45;text-anchor:middle;dominant-baseline:middle}&#10;.ls-th{font:9px system-ui;fill:#fff;fill-opacity:.28;text-anchor:end}&#10;&lt;/style&gt;&#10;&lt;script&gt;//&lt;![CDATA[&#10;(function(){&#10;// ── Tooltip helpers — tooltip data lives in the SVG's data-tooltipmap&#10;// JSON attribute; clicking a marker renders its tooltip group on demand,&#10;// clicking anywhere else removes it. Works for inline charts and for&#10;// lightbox clones (attributes survive cloneNode) via one delegated listener.&#10;window.lsRemoveTip=function(svg){&#10;var ex=svg.querySelector('[data-active-tip]');&#10;if(ex)ex.parentNode.removeChild(ex);&#10;};&#10;window.lsMoonPath=function(pa,ill){&#10;var e=((pa%360)+360)%360;&#10;var waxing=e&lt;180;&#10;var gibbous=ill&gt;0.5;&#10;var r=46,c=50;&#10;var rx=r*Math.abs(2*ill-1);&#10;var top=c+' '+(c-r),bot=c+' '+(c+r);&#10;var s='&lt;circle cx="50" cy="50" r="46" fill="#3b4358"/&gt;';&#10;if(ill&gt;=0.995){&#10;s+='&lt;circle cx="50" cy="50" r="46" fill="#f2ecd0"/&gt;';&#10;}else if(ill&gt;0.005){&#10;var limb,term;&#10;if(waxing){&#10;limb='M '+top+' A '+r+' '+r+' 0 0 1 '+bot;&#10;term=gibbous?'A '+rx+' '+r+' 0 0 1 '+top:'A '+rx+' '+r+' 0 0 0 '+top;&#10;}else{&#10;limb='M '+top+' A '+r+' '+r+' 0 0 0 '+bot;&#10;term=gibbous?'A '+rx+' '+r+' 0 0 0 '+top:'A '+rx+' '+r+' 0 0 1 '+top;&#10;}&#10;s+='&lt;path d="'+limb+' '+term+' Z" fill="#f2ecd0"/&gt;';&#10;}&#10;s+='&lt;circle cx="50" cy="50" r="46" fill="none" stroke="#828b9c" stroke-width="2"/&gt;';&#10;return s;&#10;};&#10;window.lsShowTip=function(svg,key){&#10;lsRemoveTip(svg);&#10;var map;&#10;try{map=JSON.parse(svg.getAttribute('data-tooltipmap'));}catch(e){return;}&#10;var d=map[key];&#10;if(!d)return;&#10;var ns='http://www.w3.org/2000/svg';&#10;var g=document.createElementNS(ns,'g');&#10;g.setAttribute('data-active-tip',key);&#10;g.setAttribute('pointer-events','none');&#10;var rect=document.createElementNS(ns,'rect');&#10;rect.setAttribute('x',d.x);rect.setAttribute('y',d.y);&#10;rect.setAttribute('width',d.w);rect.setAttribute('height',d.h);&#10;rect.setAttribute('rx','5');&#10;rect.setAttribute('fill','black');rect.setAttribute('fill-opacity','0.62');&#10;rect.setAttribute('stroke',d.a);rect.setAttribute('stroke-width','1.2');rect.setAttribute('stroke-opacity','0.85');&#10;g.appendChild(rect);&#10;if(typeof d.p==='number'&amp;&amp;typeof d.i==='number'){&#10;var sz=Math.floor(d.h/2),m=5;&#10;var mpg=document.createElementNS(ns,'g');&#10;mpg.setAttribute('transform','translate('+(d.x+d.w-sz-m)+','+(d.y+m)+') scale('+(sz/100)+')');&#10;if(d.n){mpg.setAttribute('role','img');mpg.setAttribute('aria-label',d.n);}&#10;mpg.innerHTML=lsMoonPath(d.p,d.i);&#10;g.appendChild(mpg);&#10;}&#10;var lines=d.l.split('\n');&#10;for(var i=0;i&lt;lines.length;i++){&#10;var t=document.createElementNS(ns,'text');&#10;t.setAttribute('x',d.x+10);t.setAttribute('y',d.y+14+i*17);&#10;t.setAttribute('font-size','10');&#10;t.setAttribute('fill',i===0?d.a:'white');&#10;t.setAttribute('fill-opacity','0.95');&#10;t.setAttribute('font-weight',i===0?'bold':'normal');&#10;t.textContent=lines[i];&#10;g.appendChild(t);&#10;}&#10;svg.appendChild(g);&#10;};&#10;// ── Delegated clicks: marker shows its tooltip, background removes it ─&#10;document.addEventListener('click',function(e){&#10;var el=e.target.closest?e.target.closest('[data-tipkey]'):null;&#10;if(el){&#10;var svg=el.closest('svg[data-tooltipmap]');&#10;if(svg){e.stopPropagation();lsShowTip(svg,el.getAttribute('data-tipkey'));}&#10;return;&#10;}&#10;var svg2=e.target.closest?e.target.closest('svg[data-tooltipmap]'):null;&#10;if(svg2)lsRemoveTip(svg2);&#10;});&#10;// ── Lightbox — runs only once per page ───────────────────────────&#10;if(window._lsLbInit)return;&#10;window._lsLbInit=true;&#10;// Overlay — flex column so topBar stays fixed-height and holder fills the rest.&#10;// overflow:hidden on the overlay prevents any body scroll bleed-through.&#10;var ov=document.createElement('div');&#10;ov.style.cssText='display:none;position:fixed;inset:0;z-index:9000;background:#0d1117;flex-direction:column;overflow:hidden;';&#10;// ── Header row ────────────────────────────────────────────────────&#10;// lSpacer mirrors closeBtn's min-width so the titleGroup stays centred.&#10;var topBar=document.createElement('div');&#10;topBar.style.cssText='flex-shrink:0;background:#0d1117;display:flex;align-items:center;gap:10px;padding:8px 14px;';&#10;var lSpacer=document.createElement('div');&#10;lSpacer.style.cssText='flex-shrink:0;min-width:88px;';&#10;topBar.appendChild(lSpacer);&#10;var titleGroup=document.createElement('div');&#10;titleGroup.style.cssText='flex:1;text-align:center;overflow:hidden;pointer-events:none;';&#10;var titleEl=document.createElement('div');&#10;titleEl.style.cssText='color:#e6edf3;font-size:15px;font-family:system-ui,sans-serif;font-weight:600;line-height:1.3;';&#10;var hintEl=document.createElement('div');&#10;hintEl.style.cssText='color:rgba(230,237,243,0.35);font-size:11px;font-family:system-ui,sans-serif;margin-top:2px;line-height:1.4;';&#10;hintEl.textContent='Scroll or pinch to zoom · Drag to pan · Double-click to reset';&#10;titleGroup.appendChild(titleEl);&#10;titleGroup.appendChild(hintEl);&#10;topBar.appendChild(titleGroup);&#10;var closeBtn=document.createElement('button');&#10;closeBtn.textContent='✕ Close';&#10;closeBtn.style.cssText='padding:10px 24px;font-size:14px;font-family:system-ui,sans-serif;cursor:pointer;border:1px solid rgba(255,255,255,0.45);border-radius:6px;background:rgba(255,255,255,0.10);color:#e6edf3;flex-shrink:0;touch-action:manipulation;min-height:44px;min-width:88px;';&#10;topBar.appendChild(closeBtn);&#10;// ── Chart area — fills every pixel below the header ───────────────&#10;// min-height:0 is required: flex children default to min-height:auto&#10;// which prevents them shrinking below their content size.&#10;var holder=document.createElement('div');&#10;holder.style.cssText='flex:1;min-height:0;overflow:hidden;';&#10;ov.appendChild(topBar);&#10;ov.appendChild(holder);&#10;document.body.appendChild(ov);&#10;var _savedBodyOverflow='';&#10;function closeLb(){ov.style.display='none';holder.innerHTML='';document.body.style.overflow=_savedBodyOverflow;}&#10;closeBtn.addEventListener('click',closeLb);&#10;ov.addEventListener('click',function(e){if(e.target===ov)closeLb();});&#10;document.addEventListener('keydown',function(e){if(e.key==='Escape'&amp;&amp;ov.style.display!=='none')closeLb();});&#10;// ── Shared pan-state for lightbox mouse drag ──────────────────────&#10;var _lb={panFn:null,endFn:null};&#10;ov.addEventListener('mousemove',function(e){if(_lb.panFn)_lb.panFn(e);});&#10;ov.addEventListener('mouseup',function(){if(_lb.endFn)_lb.endFn();});&#10;ov.addEventListener('mouseleave',function(){if(_lb.endFn)_lb.endFn();});&#10;// ── Zoom / pan initialiser (called for each new lightbox SVG) ─────&#10;function initZoom(svg,W,H){&#10;var vb={x:0,y:0,w:W,h:H};&#10;var isPanning=false,panStart=null,panStartVB=null;&#10;var pinchDist=0,pinchMidX=0,pinchMidY=0,pinchStartVB=null;&#10;// Tap-detection state — a touch that barely moved within 350 ms is a tap.&#10;// initZoom calls e.preventDefault() in touchstart (needed to suppress the&#10;// browser's own pan/zoom), which stops the browser from synthesising a click&#10;// event from touch. We synthesise it ourselves in touchend so that marker&#10;// onclick handlers and the SVG background onclick both work on touchscreens.&#10;// _lastTap* tracks the previous tap for double-tap-to-reset detection&#10;// (Chromium on touch does not fire dblclick from touch events).&#10;var _tapEl=null,_tapT=0,_tapX=0,_tapY=0;&#10;var _lastTapT=0,_lastTapX=0,_lastTapY=0;&#10;function setVB(){svg.setAttribute('viewBox',vb.x+' '+vb.y+' '+vb.w+' '+vb.h);}&#10;// ── Rendering helpers ─────────────────────────────────────────────&#10;// The SVG uses preserveAspectRatio="xMidYMid meet", so the chart content&#10;// is letter-boxed inside the SVG element. Using the SVG element dimensions&#10;// directly (r.width / r.height) for pan calculations produces wildly&#10;// different sensitivities for x vs y on portrait phones (4-5× mismatch).&#10;// The correct divisor for both axes is the render scale:&#10;// renderScale = min(elementW/vbW, elementH/vbH)&#10;// which gives a uniform 1-screen-pixel = 1/renderScale chart-units feel.&#10;// The same correction is needed for zoom cursor anchoring.&#10;function renderScale(r,w,h){return Math.min(r.width/w,r.height/h);}&#10;function contentOff(r,w,h,rs){&#10;return{ox:(r.width-w*rs)/2,oy:(r.height-h*rs)/2};&#10;}&#10;svg.addEventListener('wheel',function(e){&#10;e.preventDefault();e.stopPropagation();&#10;var r=svg.getBoundingClientRect();&#10;var ratio=e.deltaY&gt;0?1.12:1/1.12;&#10;var rs=renderScale(r,vb.w,vb.h);&#10;var off=contentOff(r,vb.w,vb.h,rs);&#10;var nx=(e.clientX-r.left-off.ox)/(vb.w*rs);&#10;var ny=(e.clientY-r.top-off.oy)/(vb.h*rs);&#10;var fx=vb.x+nx*vb.w,fy=vb.y+ny*vb.h;&#10;vb.w*=ratio;vb.h*=ratio;&#10;vb.x=fx-nx*vb.w;vb.y=fy-ny*vb.h;&#10;setVB();&#10;},{passive:false});&#10;svg.addEventListener('mousedown',function(e){&#10;if(e.button!==0)return;&#10;e.preventDefault();&#10;isPanning=true;&#10;panStart={x:e.clientX,y:e.clientY};&#10;panStartVB={x:vb.x,y:vb.y,w:vb.w,h:vb.h};&#10;svg.style.cursor='grabbing';&#10;_lb.panFn=function(ev){&#10;if(!isPanning)return;&#10;var r=svg.getBoundingClientRect();&#10;var rs=renderScale(r,panStartVB.w,panStartVB.h);&#10;vb.x=panStartVB.x-(ev.clientX-panStart.x)/rs;&#10;vb.y=panStartVB.y-(ev.clientY-panStart.y)/rs;&#10;setVB();&#10;};&#10;_lb.endFn=function(){isPanning=false;svg.style.cursor='grab';_lb.panFn=null;_lb.endFn=null;};&#10;});&#10;svg.addEventListener('touchstart',function(e){&#10;e.preventDefault();&#10;if(e.touches.length===1){&#10;isPanning=true;&#10;panStart={x:e.touches[0].clientX,y:e.touches[0].clientY};&#10;panStartVB={x:vb.x,y:vb.y,w:vb.w,h:vb.h};&#10;// Record tap candidate — cleared on significant move or multi-touch&#10;_tapEl=e.target;&#10;_tapT=Date.now();&#10;_tapX=e.touches[0].clientX;&#10;_tapY=e.touches[0].clientY;&#10;}else if(e.touches.length&gt;=2){&#10;isPanning=false;panStart=null;&#10;_tapEl=null;&#10;pinchDist=Math.hypot(e.touches[0].clientX-e.touches[1].clientX,e.touches[0].clientY-e.touches[1].clientY);&#10;pinchMidX=(e.touches[0].clientX+e.touches[1].clientX)/2;&#10;pinchMidY=(e.touches[0].clientY+e.touches[1].clientY)/2;&#10;pinchStartVB={x:vb.x,y:vb.y,w:vb.w,h:vb.h};&#10;}&#10;},{passive:false});&#10;svg.addEventListener('touchmove',function(e){&#10;e.preventDefault();e.stopPropagation();&#10;// Cancel tap if finger moved more than 8 px — this is a pan, not a tap&#10;if(_tapEl&amp;&amp;e.touches.length===1){&#10;var dx=Math.abs(e.touches[0].clientX-_tapX);&#10;var dy=Math.abs(e.touches[0].clientY-_tapY);&#10;if(dx&gt;8||dy&gt;8)_tapEl=null;&#10;}&#10;var r=svg.getBoundingClientRect();&#10;if(e.touches.length===1&amp;&amp;isPanning&amp;&amp;panStart){&#10;var rs=renderScale(r,panStartVB.w,panStartVB.h);&#10;vb.x=panStartVB.x-(e.touches[0].clientX-panStart.x)/rs;&#10;vb.y=panStartVB.y-(e.touches[0].clientY-panStart.y)/rs;&#10;setVB();&#10;}else if(e.touches.length&gt;=2&amp;&amp;pinchDist&gt;0&amp;&amp;pinchStartVB){&#10;var dist=Math.hypot(e.touches[0].clientX-e.touches[1].clientX,e.touches[0].clientY-e.touches[1].clientY);&#10;var midX=(e.touches[0].clientX+e.touches[1].clientX)/2;&#10;var midY=(e.touches[0].clientY+e.touches[1].clientY)/2;&#10;var scale=pinchDist/dist;&#10;var lvb=pinchStartVB;&#10;var rs=renderScale(r,lvb.w,lvb.h);&#10;var off=contentOff(r,lvb.w,lvb.h,rs);&#10;var cw=lvb.w*rs,ch=lvb.h*rs;&#10;var nx=(midX-r.left-off.ox)/cw,ny=(midY-r.top-off.oy)/ch;&#10;var origNx=(pinchMidX-r.left-off.ox)/cw,origNy=(pinchMidY-r.top-off.oy)/ch;&#10;var fx=lvb.x+origNx*lvb.w,fy=lvb.y+origNy*lvb.h;&#10;vb.w=lvb.w*scale;vb.h=lvb.h*scale;&#10;vb.x=fx-nx*vb.w;vb.y=fy-ny*vb.h;&#10;setVB();&#10;}&#10;},{passive:false});&#10;svg.addEventListener('touchend',function(e){&#10;// Synthesise a click on a short tap so marker handlers fire on touchscreens.&#10;// For double-tap: Chromium on touch does not fire dblclick from touch events.&#10;// We detect two taps within 350 ms / 30 px and reset the view instead.&#10;if(_tapEl&amp;&amp;e.touches.length===0&amp;&amp;e.changedTouches.length===1){&#10;var now=Date.now();&#10;var dt=now-_tapT;&#10;if(dt&lt;350){&#10;var tdx=Math.abs(e.changedTouches[0].clientX-_lastTapX);&#10;var tdy=Math.abs(e.changedTouches[0].clientY-_lastTapY);&#10;if(now-_lastTapT&lt;350&amp;&amp;tdx&lt;30&amp;&amp;tdy&lt;30){&#10;// Double-tap detected — reset view (mirrors dblclick handler).&#10;// Clear _lastTapT so a third tap starts a new double-tap window.&#10;_lastTapT=0;&#10;vb={x:0,y:0,w:W,h:H};setVB();&#10;}else{&#10;// Single tap — fire click for tooltip toggle, record for next double-tap check.&#10;_lastTapT=now;&#10;_lastTapX=e.changedTouches[0].clientX;&#10;_lastTapY=e.changedTouches[0].clientY;&#10;_tapEl.dispatchEvent(new MouseEvent('click',{bubbles:true,cancelable:true,view:window}));&#10;}&#10;}&#10;}&#10;_tapEl=null;&#10;if(e.touches.length===0){isPanning=false;panStart=null;}&#10;if(e.touches.length&lt;2){pinchDist=0;pinchStartVB=null;}&#10;});&#10;svg.addEventListener('dblclick',function(){vb={x:0,y:0,w:W,h:H};setVB();});&#10;}&#10;// ── Open lightbox ─────────────────────────────────────────────────&#10;window.lsOpenLightbox=function(svgId,svgW,svgH,chartTitle){&#10;var W=svgW||900,H=svgH||390;&#10;titleEl.textContent=chartTitle||'';&#10;var orig=document.getElementById(svgId);&#10;if(!orig)return;&#10;var clone=orig.cloneNode(true);&#10;clone.querySelectorAll('script').forEach(function(s){s.parentNode.removeChild(s);});&#10;clone.removeAttribute('id');&#10;// width+height 100% fills the holder completely; the SVG's viewBox (managed by&#10;// initZoom) controls which part of the chart coordinate space is visible.&#10;// Changing the viewBox never changes the SVG element's screen size, so zoom and&#10;// pan always use the full screen area below the header — no clipping.&#10;// max-width is reset because the original inline style carries max-width:900px&#10;// which would cap the SVG at its inline-chart width regardless of screen size.&#10;clone.style.maxWidth='none';&#10;clone.style.width='100%';&#10;clone.style.height='100%';&#10;clone.style.touchAction='none';&#10;clone.style.cursor='grab';&#10;holder.innerHTML='';&#10;holder.appendChild(clone);&#10;_savedBodyOverflow=document.body.style.overflow||'';&#10;document.body.style.overflow='hidden';&#10;ov.style.display='flex';&#10;initZoom(clone,W,H);&#10;};&#10;})();&#10;//]]&gt;&lt;/script&gt;&#10;&#10;&lt;h2 class="relative group"&gt;1920s&#10; &lt;div id="1920s" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1920s" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&#10;&#10;&#10;&lt;h3 class="relative group"&gt;Standstill Extremes&#10; &lt;div id="standstill-extremes" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#standstill-extremes" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Northern Hemisphere&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>