@zeix/ui-element
Version:
UIElement - minimal reactive framework based on Web Components
147 lines (145 loc) • 28.1 kB
HTML
<tab-group>
<div role="tablist">
<button type="button" role="tab" id="trigger_media-context.ts" aria-controls="panel_media-context.ts" aria-selected="true" tabindex="0">TypeScript</button>
</div>
<div role="tabpanel" id="panel_media-context.ts" aria-labelledby="trigger_media-context.ts">
<code-block language="ts" copy-success="Copied!" copy-error="Error trying to copy to clipboard!">
<p class="meta">
<span class="file">media-context.ts</span>
<span class="language">ts</span>
</p>
<pre class="shiki monokai" style="background-color:#272822;color:#F8F8F2" tabindex="0"><code><span class="line"><span style="color:#F92672">import</span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F92672"> type</span><span style="color:#F8F8F2"> Component,</span></span>
<span class="line"><span style="color:#F92672"> type</span><span style="color:#F8F8F2"> Context,</span></span>
<span class="line"><span style="color:#F92672"> type</span><span style="color:#F8F8F2"> SignalProducer,</span></span>
<span class="line"><span style="color:#F92672"> type</span><span style="color:#F8F8F2"> State,</span></span>
<span class="line"><span style="color:#F8F8F2"> component,</span></span>
<span class="line"><span style="color:#F8F8F2"> provide,</span></span>
<span class="line"><span style="color:#F8F8F2"> state,</span></span>
<span class="line"><span style="color:#F8F8F2">} </span><span style="color:#F92672">from</span><span style="color:#E6DB74"> "../../../"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F92672">export</span><span style="color:#66D9EF;font-style:italic"> type</span><span> </span><span style="color:#A6E22E;text-decoration:underline">MediaContextProps</span><span style="color:#F92672"> =</span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#E6DB74"> "media-motion"</span><span style="color:#F92672">:</span><span style="color:#66D9EF;font-style:italic"> boolean</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#E6DB74"> "media-theme"</span><span style="color:#F92672">:</span><span style="color:#E6DB74"> "light"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "dark"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#E6DB74"> "media-viewport"</span><span style="color:#F92672">:</span><span style="color:#E6DB74"> "xs"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "sm"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "md"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "lg"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "xl"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#E6DB74"> "media-orientation"</span><span style="color:#F92672">:</span><span style="color:#E6DB74"> "portrait"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "landscape"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#F8F8F2">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:#88846F">/* === Exported Contexts === */</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F92672">export</span><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> MEDIA_MOTION </span><span style="color:#F92672">=</span><span style="color:#E6DB74"> "media-motion"</span><span style="color:#F92672"> as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">Context</span><span style="color:#F8F8F2"><</span></span>
<span class="line"><span style="color:#E6DB74"> "media-motion"</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span> </span><span style="color:#A6E22E;text-decoration:underline">State</span><span style="color:#F8F8F2"><</span><span style="color:#66D9EF;font-style:italic">boolean</span><span style="color:#F8F8F2">></span></span>
<span class="line"><span style="color:#F8F8F2">>;</span></span>
<span class="line"><span style="color:#F92672">export</span><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> MEDIA_THEME </span><span style="color:#F92672">=</span><span style="color:#E6DB74"> "media-theme"</span><span style="color:#F92672"> as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">Context</span><span style="color:#F8F8F2"><</span></span>
<span class="line"><span style="color:#E6DB74"> "media-theme"</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span> </span><span style="color:#A6E22E;text-decoration:underline">State</span><span style="color:#F8F8F2"><</span><span style="color:#E6DB74">"light"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "dark"</span><span style="color:#F8F8F2">></span></span>
<span class="line"><span style="color:#F8F8F2">>;</span></span>
<span class="line"><span style="color:#F92672">export</span><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> MEDIA_VIEWPORT </span><span style="color:#F92672">=</span><span style="color:#E6DB74"> "media-viewport"</span><span style="color:#F92672"> as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">Context</span><span style="color:#F8F8F2"><</span></span>
<span class="line"><span style="color:#E6DB74"> "media-viewport"</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span> </span><span style="color:#A6E22E;text-decoration:underline">State</span><span style="color:#F8F8F2"><</span><span style="color:#E6DB74">"xs"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "sm"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "md"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "lg"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "xl"</span><span style="color:#F8F8F2">></span></span>
<span class="line"><span style="color:#F8F8F2">>;</span></span>
<span class="line"><span style="color:#F92672">export</span><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> MEDIA_ORIENTATION </span><span style="color:#F92672">=</span><span style="color:#E6DB74"> "media-orientation"</span><span style="color:#F92672"> as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">Context</span><span style="color:#F8F8F2"><</span></span>
<span class="line"><span style="color:#E6DB74"> "media-orientation"</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span> </span><span style="color:#A6E22E;text-decoration:underline">State</span><span style="color:#F8F8F2"><</span><span style="color:#E6DB74">"portrait"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "landscape"</span><span style="color:#F8F8F2">></span></span>
<span class="line"><span style="color:#F8F8F2">>;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#88846F">/* === Component === */</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F92672">export</span><span style="color:#F92672"> default</span><span style="color:#A6E22E"> component</span><span style="color:#F8F8F2">(</span></span>
<span class="line"><span style="color:#E6DB74"> "media-context"</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#88846F"> // Context for reduced motion preference</span></span>
<span class="line"><span style="color:#F8F8F2"> [MEDIA_MOTION]: (() </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> mql </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> matchMedia</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"(prefers-reduced-motion: reduce)"</span><span style="color:#F8F8F2">);</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> reducedMotion </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> state</span><span style="color:#F8F8F2">(mql.matches);</span></span>
<span class="line"><span style="color:#F8F8F2"> mql.</span><span style="color:#A6E22E">addEventListener</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"change"</span><span style="color:#F8F8F2">, (</span><span style="color:#FD971F;font-style:italic">e</span><span style="color:#F8F8F2">) </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> reducedMotion.</span><span style="color:#A6E22E">set</span><span style="color:#F8F8F2">(e.matches);</span></span>
<span class="line"><span style="color:#F8F8F2"> });</span></span>
<span class="line"><span style="color:#F92672"> return</span><span style="color:#F8F8F2"> reducedMotion;</span></span>
<span class="line"><span style="color:#F8F8F2"> }) </span><span style="color:#F92672">as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">SignalProducer</span><span style="color:#F8F8F2"><</span><span style="color:#A6E22E;text-decoration:underline">HTMLElement</span><span style="color:#F8F8F2">, </span><span style="color:#66D9EF;font-style:italic">boolean</span><span style="color:#F8F8F2">>,</span></span>
<span class="line"></span>
<span class="line"><span style="color:#88846F"> // Context for preferred color scheme</span></span>
<span class="line"><span style="color:#F8F8F2"> [MEDIA_THEME]: (() </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> mql </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> matchMedia</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"(prefers-color-scheme: dark)"</span><span style="color:#F8F8F2">);</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> colorScheme </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> state</span><span style="color:#F8F8F2">(mql.matches </span><span style="color:#F92672">?</span><span style="color:#E6DB74"> "dark"</span><span style="color:#F92672"> :</span><span style="color:#E6DB74"> "light"</span><span style="color:#F8F8F2">);</span></span>
<span class="line"><span style="color:#F8F8F2"> mql.</span><span style="color:#A6E22E">addEventListener</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"change"</span><span style="color:#F8F8F2">, (</span><span style="color:#FD971F;font-style:italic">e</span><span style="color:#F8F8F2">) </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> colorScheme.</span><span style="color:#A6E22E">set</span><span style="color:#F8F8F2">(e.matches </span><span style="color:#F92672">?</span><span style="color:#E6DB74"> "dark"</span><span style="color:#F92672"> :</span><span style="color:#E6DB74"> "light"</span><span style="color:#F8F8F2">);</span></span>
<span class="line"><span style="color:#F8F8F2"> });</span></span>
<span class="line"><span style="color:#F92672"> return</span><span style="color:#F8F8F2"> colorScheme;</span></span>
<span class="line"><span style="color:#F8F8F2"> }) </span><span style="color:#F92672">as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">SignalProducer</span><span style="color:#F8F8F2"><</span><span style="color:#A6E22E;text-decoration:underline">HTMLElement</span><span style="color:#F8F8F2">, </span><span style="color:#E6DB74">"light"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "dark"</span><span style="color:#F8F8F2">>,</span></span>
<span class="line"></span>
<span class="line"><span style="color:#88846F"> // Context for screen viewport size</span></span>
<span class="line"><span style="color:#F8F8F2"> [MEDIA_VIEWPORT]: ((</span><span style="color:#FD971F;font-style:italic">el</span><span style="color:#F8F8F2">) </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#A6E22E"> getBreakpoint</span><span style="color:#F92672"> =</span><span style="color:#F8F8F2"> (</span><span style="color:#FD971F;font-style:italic">attr</span><span style="color:#F92672">:</span><span style="color:#66D9EF;font-style:italic"> string</span><span style="color:#F8F8F2">, </span><span style="color:#FD971F;font-style:italic">fallback</span><span style="color:#F92672">:</span><span style="color:#66D9EF;font-style:italic"> string</span><span style="color:#F8F8F2">) </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> value </span><span style="color:#F92672">=</span><span style="color:#F8F8F2"> el.</span><span style="color:#A6E22E">getAttribute</span><span style="color:#F8F8F2">(attr);</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> trimmed </span><span style="color:#F92672">=</span><span style="color:#F8F8F2"> value?.</span><span style="color:#A6E22E">trim</span><span style="color:#F8F8F2">();</span></span>
<span class="line"><span style="color:#F92672"> if</span><span style="color:#F8F8F2"> (</span><span style="color:#F92672">!</span><span style="color:#F8F8F2">trimmed) </span><span style="color:#F92672">return</span><span style="color:#F8F8F2"> fallback;</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> unit </span><span style="color:#F92672">=</span><span style="color:#F8F8F2"> trimmed.</span><span style="color:#A6E22E">match</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">/em</span><span style="color:#F92672">$</span><span style="color:#E6DB74">/</span><span style="color:#F8F8F2">) </span><span style="color:#F92672">?</span><span style="color:#E6DB74"> "em"</span><span style="color:#F92672"> :</span><span style="color:#E6DB74"> "px"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> v </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> parseFloat</span><span style="color:#F8F8F2">(trimmed);</span></span>
<span class="line"><span style="color:#F92672"> return</span><span style="color:#F8F8F2"> Number.</span><span style="color:#A6E22E">isFinite</span><span style="color:#F8F8F2">(v) </span><span style="color:#F92672">?</span><span style="color:#F8F8F2"> v </span><span style="color:#F92672">+</span><span style="color:#F8F8F2"> unit </span><span style="color:#F92672">:</span><span style="color:#F8F8F2"> fallback;</span></span>
<span class="line"><span style="color:#F8F8F2"> };</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> mqlSM </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> matchMedia</span><span style="color:#F8F8F2">(</span></span>
<span class="line"><span style="color:#E6DB74"> `(min-width: </span><span style="color:#F92672">${</span><span style="color:#A6E22E">getBreakpoint</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"sm"</span><span style="color:#F8F8F2">, </span><span style="color:#E6DB74">"32em"</span><span style="color:#F8F8F2">)</span><span style="color:#F92672">}</span><span style="color:#E6DB74">)`</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> );</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> mqlMD </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> matchMedia</span><span style="color:#F8F8F2">(</span></span>
<span class="line"><span style="color:#E6DB74"> `(min-width: </span><span style="color:#F92672">${</span><span style="color:#A6E22E">getBreakpoint</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"md"</span><span style="color:#F8F8F2">, </span><span style="color:#E6DB74">"48em"</span><span style="color:#F8F8F2">)</span><span style="color:#F92672">}</span><span style="color:#E6DB74">)`</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> );</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> mqlLG </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> matchMedia</span><span style="color:#F8F8F2">(</span></span>
<span class="line"><span style="color:#E6DB74"> `(min-width: </span><span style="color:#F92672">${</span><span style="color:#A6E22E">getBreakpoint</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"lg"</span><span style="color:#F8F8F2">, </span><span style="color:#E6DB74">"72em"</span><span style="color:#F8F8F2">)</span><span style="color:#F92672">}</span><span style="color:#E6DB74">)`</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> );</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> mqlXL </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> matchMedia</span><span style="color:#F8F8F2">(</span></span>
<span class="line"><span style="color:#E6DB74"> `(min-width: </span><span style="color:#F92672">${</span><span style="color:#A6E22E">getBreakpoint</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"xl"</span><span style="color:#F8F8F2">, </span><span style="color:#E6DB74">"104em"</span><span style="color:#F8F8F2">)</span><span style="color:#F92672">}</span><span style="color:#E6DB74">)`</span><span style="color:#F8F8F2">,</span></span>
<span class="line"><span style="color:#F8F8F2"> );</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#A6E22E"> getViewport</span><span style="color:#F92672"> =</span><span style="color:#F8F8F2"> () </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F92672"> if</span><span style="color:#F8F8F2"> (mqlXL.matches) </span><span style="color:#F92672">return</span><span style="color:#E6DB74"> "xl"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#F92672"> if</span><span style="color:#F8F8F2"> (mqlLG.matches) </span><span style="color:#F92672">return</span><span style="color:#E6DB74"> "lg"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#F92672"> if</span><span style="color:#F8F8F2"> (mqlMD.matches) </span><span style="color:#F92672">return</span><span style="color:#E6DB74"> "md"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#F92672"> if</span><span style="color:#F8F8F2"> (mqlSM.matches) </span><span style="color:#F92672">return</span><span style="color:#E6DB74"> "sm"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#F92672"> return</span><span style="color:#E6DB74"> "xs"</span><span style="color:#F8F8F2">;</span></span>
<span class="line"><span style="color:#F8F8F2"> };</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> viewport </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> state</span><span style="color:#F8F8F2">(</span><span style="color:#A6E22E">getViewport</span><span style="color:#F8F8F2">());</span></span>
<span class="line"><span style="color:#F8F8F2"> mqlSM.</span><span style="color:#A6E22E">addEventListener</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"change"</span><span style="color:#F8F8F2">, () </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> viewport.</span><span style="color:#A6E22E">set</span><span style="color:#F8F8F2">(</span><span style="color:#A6E22E">getViewport</span><span style="color:#F8F8F2">());</span></span>
<span class="line"><span style="color:#F8F8F2"> });</span></span>
<span class="line"><span style="color:#F8F8F2"> mqlMD.</span><span style="color:#A6E22E">addEventListener</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"change"</span><span style="color:#F8F8F2">, () </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> viewport.</span><span style="color:#A6E22E">set</span><span style="color:#F8F8F2">(</span><span style="color:#A6E22E">getViewport</span><span style="color:#F8F8F2">());</span></span>
<span class="line"><span style="color:#F8F8F2"> });</span></span>
<span class="line"><span style="color:#F8F8F2"> mqlLG.</span><span style="color:#A6E22E">addEventListener</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"change"</span><span style="color:#F8F8F2">, () </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> viewport.</span><span style="color:#A6E22E">set</span><span style="color:#F8F8F2">(</span><span style="color:#A6E22E">getViewport</span><span style="color:#F8F8F2">());</span></span>
<span class="line"><span style="color:#F8F8F2"> });</span></span>
<span class="line"><span style="color:#F8F8F2"> mqlXL.</span><span style="color:#A6E22E">addEventListener</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"change"</span><span style="color:#F8F8F2">, () </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> viewport.</span><span style="color:#A6E22E">set</span><span style="color:#F8F8F2">(</span><span style="color:#A6E22E">getViewport</span><span style="color:#F8F8F2">());</span></span>
<span class="line"><span style="color:#F8F8F2"> });</span></span>
<span class="line"><span style="color:#F92672"> return</span><span style="color:#F8F8F2"> viewport;</span></span>
<span class="line"><span style="color:#F8F8F2"> }) </span><span style="color:#F92672">as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">SignalProducer</span><span style="color:#F8F8F2"><</span><span style="color:#A6E22E;text-decoration:underline">HTMLElement</span><span style="color:#F8F8F2">, </span><span style="color:#E6DB74">"xs"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "sm"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "md"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "lg"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "xl"</span><span style="color:#F8F8F2">>,</span></span>
<span class="line"></span>
<span class="line"><span style="color:#88846F"> // Context for screen orientation</span></span>
<span class="line"><span style="color:#F8F8F2"> [MEDIA_ORIENTATION]: (() </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> mql </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> matchMedia</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"(orientation: landscape)"</span><span style="color:#F8F8F2">);</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> const</span><span style="color:#F8F8F2"> orientation </span><span style="color:#F92672">=</span><span style="color:#A6E22E"> state</span><span style="color:#F8F8F2">(mql.matches </span><span style="color:#F92672">?</span><span style="color:#E6DB74"> "landscape"</span><span style="color:#F92672"> :</span><span style="color:#E6DB74"> "portrait"</span><span style="color:#F8F8F2">);</span></span>
<span class="line"><span style="color:#F8F8F2"> mql.</span><span style="color:#A6E22E">addEventListener</span><span style="color:#F8F8F2">(</span><span style="color:#E6DB74">"change"</span><span style="color:#F8F8F2">, (</span><span style="color:#FD971F;font-style:italic">e</span><span style="color:#F8F8F2">) </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#F8F8F2"> orientation.</span><span style="color:#A6E22E">set</span><span style="color:#F8F8F2">(e.matches </span><span style="color:#F92672">?</span><span style="color:#E6DB74"> "landscape"</span><span style="color:#F92672"> :</span><span style="color:#E6DB74"> "portrait"</span><span style="color:#F8F8F2">);</span></span>
<span class="line"><span style="color:#F8F8F2"> });</span></span>
<span class="line"><span style="color:#F92672"> return</span><span style="color:#F8F8F2"> orientation;</span></span>
<span class="line"><span style="color:#F8F8F2"> }) </span><span style="color:#F92672">as</span><span> </span><span style="color:#A6E22E;text-decoration:underline">SignalProducer</span><span style="color:#F8F8F2"><</span><span style="color:#A6E22E;text-decoration:underline">HTMLElement</span><span style="color:#F8F8F2">, </span><span style="color:#E6DB74">"landscape"</span><span style="color:#F92672"> |</span><span style="color:#E6DB74"> "portrait"</span><span style="color:#F8F8F2">>,</span></span>
<span class="line"><span style="color:#F8F8F2"> },</span></span>
<span class="line"><span style="color:#F8F8F2"> () </span><span style="color:#66D9EF;font-style:italic">=></span><span style="color:#F8F8F2"> [</span></span>
<span class="line"><span style="color:#A6E22E"> provide</span><span style="color:#F8F8F2">([MEDIA_MOTION, MEDIA_THEME, MEDIA_VIEWPORT, MEDIA_ORIENTATION]),</span></span>
<span class="line"><span style="color:#F8F8F2"> ],</span></span>
<span class="line"><span style="color:#F8F8F2">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F92672">declare</span><span style="color:#F8F8F2"> global {</span></span>
<span class="line"><span style="color:#66D9EF;font-style:italic"> interface</span><span> </span><span style="color:#A6E22E;text-decoration:underline">HTMLElementTagNameMap</span><span style="color:#F8F8F2"> {</span></span>
<span class="line"><span style="color:#E6DB74"> "media-context"</span><span style="color:#F92672">:</span><span> </span><span style="color:#A6E22E;text-decoration:underline">Component</span><span style="color:#F8F8F2"><</span><span style="color:#A6E22E;text-decoration:underline">MediaContextProps</span><span style="color:#F8F8F2">>;</span></span>
<span class="line"><span style="color:#F8F8F2"> }</span></span>
<span class="line"><span style="color:#F8F8F2">}</span></span>
<span class="line"></span></code></pre>
<input-button class="copy">
<button type="button" class="secondary small">
<span class="label">Copy</span>
</button>
</input-button>
</code-block>
</div>
</tab-group>