<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ananya Kittane Yogananda on Medium]]></title>
        <description><![CDATA[Stories by Ananya Kittane Yogananda on Medium]]></description>
        <link>https://medium.com/@ananyaky?source=rss-7f1898e591b6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*p5dL4YAGppD2U13c</url>
            <title>Stories by Ananya Kittane Yogananda on Medium</title>
            <link>https://medium.com/@ananyaky?source=rss-7f1898e591b6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 20:39:38 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ananyaky/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[When CSS Went to Math Class: Sin() & Cos()]]></title>
            <link>https://medium.com/@ananyaky/when-css-went-to-math-class-sin-cos-0831bd695b5f?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/0831bd695b5f</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[css]]></category>
            <category><![CDATA[html]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Sun, 21 Jun 2026 20:49:58 GMT</pubDate>
            <atom:updated>2026-06-21T20:49:58.285Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Student writing mathematical formulas on a blackboard" src="https://cdn-images-1.medium.com/max/1024/1*AC-Y6JlP4e6SdZyfaMuYfw.jpeg" /><figcaption>Image by Vitaly Gariev from <a href="https://unsplash.com/photos/student-writing-mathematical-formulas-on-a-blackboard-QSZQqYs9s5k">Unsplash</a></figcaption></figure><p>As a high school kid, I would always question why I was learning Trigonometric functions and if I’d ever use them in real life problem solving. Those mysterious squiggly functions that haunted me during high school are back. But this time, they’re not here to make me cry over a calculator but it’s here to make CSS come alive!</p><blockquote>Surprise, surprise — those Math class nightmares didn’t stay behind. The <a href="https://2025.stateofcss.com/en-US/awards/">2025.stateofcss</a> lists Trigonometric functions among the ‘Most Hated Feature’</blockquote><p>In this 2 (or even 3) part series, we will uncover some real use cases for CSS trigonometric functions and hopefully, you might even start looking forward to a little CSS trigonometry. In this article, I will cover the most popular functions of the ‘most hated’ feature: Sin()and Cos()</p><h4>The Basics — What do Sin() and cos() even do?</h4><p>If you slept through trigonometry, here’s the cheat sheet:</p><ul><li>Sin(0)gives you how <strong>high</strong> you are on a circle (the Y-axis).</li><li>Cos(0)gives you how <strong>wide</strong> you are on a circle (the X-axis).</li></ul><p>In CSS they work just like how they do in Math — you give them an angle, and they return a number between -1 and 1.</p><p>You can then multiply that by a length to create oscillation or circular movement.</p><h4>Use cases</h4><p>The best way to understand trigonometry is by actually ‘seeing’ it.</p><ol><li><strong>Circular layouts — The easiest way to understand </strong><strong>Sin() and </strong><strong>Cos()</strong></li></ol><p>Let’s arrange some dots evenly around a circle using only CSS and some math.</p><pre>&lt;div class=&quot;parent-container&quot;&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;<br>&lt;/div&gt;</pre><pre>.parent {<br>  position: relative;<br>  width: 0; <br>  height: 0;<br>}<br><br>/* the “dots” */<br>.circle {<br>  --size: 25px;<br>  --offset: 100px;<br>  width: var(--size);<br>  aspect-ratio: 1;<br>  border-radius: 50%;<br>  background-color: lightgreen;<br>  position: absolute;<br>  left: 0;<br>  top: 0;<br>  transform: translate(<br>    calc(cos(var(--degrees)) * var(--offset)),<br>    calc(sin(var(--degrees)) * var(--offset))<br>  );<br>}<br><br>/* Set angle for each dot */<br>.circle:nth-of-type(1)  { --degrees: 0deg; }<br>.circle:nth-of-type(2)  { --degrees: 30deg; }<br>.circle:nth-of-type(3)  { --degrees: 60deg; }<br>.circle:nth-of-type(4)  { --degrees: 90deg; }<br>.circle:nth-of-type(5)  { --degrees: 120deg; }<br>.circle:nth-of-type(6)  { --degrees: 150deg; }<br>.circle:nth-of-type(7)  { --degrees: 180deg; }<br>.circle:nth-of-type(8)  { --degrees: 210deg; }<br>.circle:nth-of-type(9)  { --degrees: 240deg; }<br>.circle:nth-of-type(10) { --degrees: 270deg; }<br>.circle:nth-of-type(11) { --degrees: 300deg; }<br>.circle:nth-of-type(12) { --degrees: 330deg; }</pre><p>Sin() and Cos()are used to position each dot around a circle. Cos()controls the x position (horizontal), and Sin()controls the y position (vertical). Each dot gets a different — degrees value (0, 30, 60, …), and multiplying those by a radius ( — offset) places them evenly in a circular layout.</p><p><strong>2. Wavy patterns</strong></p><p>Waves are everywhere — in nature, sound, and even in design. Using the Sin()function in CSS, we can translate the same natural rhythm into our layouts, creating smooth, balanced curves that feel organic yet precise.</p><pre>&lt;div class=&quot;wave-line&quot;&gt;<br>  &lt;div style=&quot;--i:0&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:1&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:2&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:3&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:4&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:5&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:6&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:7&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:8&quot;&gt;&lt;/div&gt;<br>  &lt;div style=&quot;--i:9&quot;&gt;&lt;/div&gt;<br>&lt;/div&gt;</pre><pre>.wave-line {<br>display: flex;<br>justify-content: center;<br>align-items: center;<br>gap: 1.5rem;<br>height: 200px;<br>background: #f6f8ff;<br>}<br><br>.wave-line div {<br>--t: 0deg;<br>--angle: calc(var(--i) * 36deg + var(--t));<br>width: 16px;<br>height: 16px;<br>border-radius: 50%;<br>background: hotpink;<br>transform: translateY(calc(sin(var(--angle)) * 40px));<br>animation: wave 2s linear infinite;<br>}</pre><p>Each dot gets its own i(index), which we multiply by 36 deg to spread them evenly across 360 deg. Sin()then maps those angles to values between -1 and 1which is perfect for positioning dots along a gentle curve. This creates a visually rhythmic, wave-like pattern.</p><p><strong>What can you do with this?</strong></p><ul><li>Create decorative dividers or flowing separators between sections.</li><li>Build magazine-style layouts with wave-shaped image alignments.</li></ul><p><strong>3. Animations</strong></p><p>Trigonometric functions in CSS aren’t just for static layouts — they could also be used for perfect for smooth, natural animations. By updating angles over time, elements can move along curves, orbit around points, or create rhythmic wave patterns.</p><pre>&lt;div class=&quot;orbit-container&quot;&gt;<br>  &lt;div class=&quot;planet&quot;&gt;&lt;/div&gt;<br>&lt;/div&gt;<br><br>&lt;button id=&quot;toggle-btn&quot;&gt;Start Animation&lt;/button&gt;</pre><pre>@property --angle {<br>  syntax: &quot;&lt;angle&gt;&quot;;<br>  inherits: false;<br>  initial-value: 0deg;<br>}<br><br>body {<br>  display: flex;<br>  flex-direction: column;<br>  justify-content: center;<br>  align-items: center;<br>  height: 100vh;<br>  background: linear-gradient(135deg, #0d1b2a, #1b263b);<br>  gap: 2rem;<br>  margin: 0;<br>}<br><br>.orbit-container {<br>  position: relative;<br>  width: 300px;<br>  height: 300px;<br>  --angle: 0deg; /* CSS variable for animation */<br>}<br><br>.planet {<br>  position: absolute;<br>  top: 50%;<br>  left: 50%;<br>  width: 25px;<br>  height: 25px;<br>  border-radius: 50%;<br>  background: radial-gradient(circle at 30% 30%, #f97316, #ff4500);<br>  box-shadow: 0 0 20px rgba(255, 87, 34, 0.7);<br>  transform: translate(<br>    calc(cos(var(--angle)) * 120px),<br>    calc(sin(var(--angle)) * 120px)<br>  );<br>  transition: transform 0.016s linear;<br>}<br><br>/* Define CSS animation */<br>@keyframes orbit {<br>  to {<br>    --angle: 360deg;<br>  }<br>}<br><br>.orbit-container.animate .planet {<br>  animation: orbit 5s linear infinite;<br>}</pre><pre>const container = document.querySelector(&#39;.orbit-container&#39;);<br>const btn = document.getElementById(&#39;toggle-btn&#39;);<br><br>btn.addEventListener(&#39;click&#39;, () =&gt; {<br>  container.classList.toggle(&#39;animate&#39;);<br>  btn.textContent = container.classList.contains(&#39;animate&#39;)<br>    ? &quot;Stop Animation&quot;<br>    : &quot;Start Animation&quot;;<br>});</pre><p>We start by defining a custom property angle, which represents the current rotation in degrees. They keyframes orbit animation gradually increases this angle from 0 deg to 360 deg. As the angle updates, the element’s position is recalculated using Cos()and Sin()</p><p><strong>What can you do with this?</strong></p><p>Floating animations can use Sin()to create gentle up-and-down movements, while Cos()can drive side-to-side motions.</p><p>Both Sin()and Cos()could be combined to produce complex orbital movements which could be useful for loading indicators, decorative elements, or interactive components that need to follow curved trajectories.</p><h4>Some general trips</h4><ul><li>Leverage transform properties for hardware-accelerated animations</li><li>Combine with calc() to scale results from the unit circle’s -1 to 1 range</li><li>Use responsive units like vw or cqi for scalable layouts</li><li>Use CSS custom properties for reusable values and easier maintenance</li></ul><h4>Performance</h4><p>CSS trigonometric functions perform better than JavaScript equivalents because calculations happen during the browser’s style computation phase. This eliminates runtime overhead and provides smoother animations, especially when combined with CSS transforms.</p><h4>Browser support</h4><p>Both <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/sin#browser_compatibility">sin()</a>and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/cos#browser_compatibility">cos()</a> are widely supported across all browsers.</p><h4>Final thoughts</h4><p>At the end of the day, using trigonometry in CSS might feel like owning a treadmill — it’s impressive that you have it, and you will tell everyone you use it, but most of the time you are just staring at them with a sense of existential dread. Well, don’t be that person. Maybe, we should start showing some love to those ‘most hated features’ (and also your treadmill).</p><p>Now go forth and rotate things — responsibly!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0831bd695b5f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The web is always talking: Link pings, Beacon, CSP]]></title>
            <link>https://medium.com/samsung-internet-dev/the-web-is-always-talking-link-pings-beacon-csp-9e91a393378a?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/9e91a393378a</guid>
            <category><![CDATA[user-tracking]]></category>
            <category><![CDATA[content-security-policy]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[privacy]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 11:01:02 GMT</pubDate>
            <atom:updated>2026-03-31T11:01:02.438Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Q9hD0n-Dlf_nK9UdFlOMZw.jpeg" /><figcaption>Image from Unsplash.com by <a href="https://unsplash.com/photos/person-holding-black-binoculars-cUxF-FcFwL4">Mostafa Moraji</a></figcaption></figure><p>In the modern web ecosystem , pages are not just rendered — user interactions are tracked and analyzed to optimize user experience, and gather insights. When you click a link on a website, something else may happen besides navigation. When you close a tab, something might still be sent. Most users never see this traffic. Behind the scenes, the web is constantly talking.</p><p>This is the privacy story of sendBeacon(), ping, CSP reports.</p><h4>sendBeacon()</h4><p>navigator.sendBeacon() was created to solve a practical problem “<em>What if the user leaves before your analytics request finishes</em>”?</p><p>If not for sendBeacon(), developers had to use fetch()or XMLHttpRequestduring unload events where the browser must wait for the request to complete before allowing navigation to proceed. The problem with that approach was that it created a poor user experience and unreliable data transmission.</p><p>The Beacon API on the other hand, operates differently. It queues requests asynchronously and handles transmission in the background, even after the page has closed. The browser manages the entire process without blocking navigation or requiring your JavaScript to remain active.</p><p><strong>Example</strong></p><p>The navigator.sendBeacon() method accepts two parameters: a URL endpoint and optional data. It returns a boolean indicating whether the request was successfully queued (not whether it reached the server).</p><pre>const success = navigator.sendBeacon(url, data)</pre><p><strong>Use cases</strong></p><p>The fire and forget approach of navigator.sendBeacon()could be used for —</p><ul><li>Analytics</li><li>User action tracking</li><li>Error reporting</li></ul><p><strong>Privacy implications</strong></p><p>The sendBeacon()API, while a valuable tool for developers to send data asynchronously to a server without disrupting page navigation, raises significant privacy concerns that needs careful consideration.</p><ul><li>This API allows websites to transmit user data, such as browsing behaviour or session information, even after a user has left the page, potentially enabling tracking across multiple sites or sessions.</li><li>Without proper safeguards, this functionality could be exploited to collect sensitive information without explicit user consent.</li></ul><p>Developers must ensure transparency and implement robust privacy measures, such as anonymizing data and obtaining informed consent, to mitigate these risks and maintain user trust. As privacy regulations like <a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation (GDPR)</a> and <a href="https://en.wikipedia.org/wiki/California_Consumer_Privacy_Act">California Consumer Privacy Act (CCPA)</a> become increasingly prevalent, understanding and addressing the implications of sendBeacon()is essential for ethical web development.</p><p><strong>Best practices</strong></p><p>To responsibly use the sendBeacon()API while protecting user privacy, developers should adhere to several best practices —</p><ul><li>Ensure that any data transmitted is minimized and anonymized, avoiding the collection of <a href="https://en.wikipedia.org/wiki/Personal_data">Personally Identifiable Information (PII)</a> unless absolutely necessary</li><li>Implement clear and transparent user consent mechanisms, such as privacy notices or opt-in checkboxes, to inform users about data collection and obtain their explicit permission.</li><li>Encrypt sensitive data before transmission to protect it from interception or unauthorized access</li><li>Provide users with control over their data by offering options to opt out or delete their information.</li><li>Finally, regularly audit and update your implementation to comply with evolving privacy regulations and standards, ensuring that your use of sendBeacon()aligns with ethical and legal requirements</li></ul><p>By prioritizing these practices, developers can leverage the API’s benefits while respecting user privacy and building trust.</p><h4><strong>&lt;a ping&gt;: The click that tells two stories</strong></h4><p>The ping attribute is an optional attribute for the &lt;a&gt; tag that specifies one or more URLs to notify when a link is clicked. These notifications are sent as HTTP POST requests to the specified URLs.</p><p><strong>Example</strong></p><pre>&lt;a href=&quot;https://example.com&quot; ping=&quot;https://tracker.com/logs&quot;&gt;Visit me&lt;/a&gt;</pre><p>In this example — Clicking the link navigates to <a href="http://example.com/">example.com</a> and at the same time, an HTTP POST request is sent to <a href="https://tracker.com/logs">https://tracker.com/logs</a></p><p><strong>How does it work?</strong></p><p>When a user clicks a link with a ping attribute:</p><ul><li>The browser sends an HTTP POST request to the specified ping URL(s).</li><li>The link destination i.e href is loaded as usual.</li><li>The ping POST request contains basic information, such as the URL of the link clicked.</li></ul><p><strong>Use cases</strong></p><ul><li><strong>Click tracking</strong> — Allows websites to send a small POST request when a link is clicked, enabling basic analytics.</li><li><strong>Outbound Link &amp; Affiliate attribution</strong> — Helps measure which external link users click, commonly used for affiliate programs, ad attribution, and marketing analytics — without slowing navigation via redirects.</li><li><strong>Audit &amp; Logging</strong> — In enterprise or internal systems, it can log user navigation events for monitoring and compliance purposes.</li></ul><p><strong>Privacy implications</strong></p><p>The ping attribute in the &lt;a&gt; tag, designed to notify servers when a user navigates away from a page, introduces notable privacy implications that require careful handling —</p><ul><li>This attribute can be used to track user behaviour, such as click patterns or navigation paths, potentially enabling cross-site tracking without the user’s knowledge.</li><li>Such tracking can lead to the profiling of users based on their browsing habits, raising concerns about data misuse and lack of transparency</li></ul><p>To mitigate these risks, developers should ensure that any data sent via the ping attribute is anonymized and not tied to individual users. Additionally, websites should clearly disclose the use of this attribute in their privacy policies and provide users with the ability to opt out of tracking. By adopting these measures, developers can balance the utility of the ping attribute with the need to protect user privacy and maintain trust.</p><p><strong>Best practices</strong></p><p>To responsibly implement the ping attribute in the &lt;a&gt; tag while protecting user privacy, developers should follow these best practices.</p><ul><li>Limit the use of the ping attribute to essential purposes, such as analytics or user engagement tracking, and avoid using it for unnecessary or intrusive monitoring</li><li>Ensure that any data transmitted via the ping attribute is anonymized and does not include personally identifiable information (PII).</li><li>Provide clear and transparent disclosure about the use of the ping attribute in your privacy policy, explaining its purpose and how user data will be handled.</li><li>Offer users the ability to opt out of tracking through mechanisms like browser settings or privacy controls on your website</li><li>Regularly review and update your implementation to comply with privacy regulations such as GDPR or CCPA</li></ul><p>By adhering to these practices, developers can leverage the ping attribute effectively while respecting user privacy.</p><h4>Content Security Policy (CSP) headers</h4><p>CSP is one of the many security headers that gives us a granular control over what resources (images, scripts, stylesheets etc.)a browser is allowed to load for your site.</p><p>CSP is the number one defense against <a href="https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting">Cross-site scripting (XSS)</a>. By specifying a whitelist of trusted sources, you can prevent the browser from executing malicious scripts injected by an attacker. Other use cases of CSP could be defending against <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Attacks/Clickjacking">clickjacking</a> and helping to ensure that a site’s pages will be loaded over HTTPS.</p><p><strong>Example</strong></p><pre>Content-Security-Policy: default-src &#39;self&#39;; script-src &#39;self&#39; https://apis.random.com</pre><p>This policy tells the browser to only load resources from your own domain (&#39;self&#39;) by default, and to only execute scripts from your domain or <a href="https://apis.random.com/">https://apis.random.com</a>.</p><p><strong>Use cases</strong></p><p>Since complex web applications are more sensitive to XSS, CSP should be used for any application that manages sensitive data, such as administrative UIs, device management consoles, or any products hosting files, documents or messages created by users.</p><p><strong>Privacy implications</strong></p><p>Content Security Policy (CSP) headers play a critical role in enhancing web security by mitigating risks such as cross-site scripting (XSS) and data injection attacks, but they also have privacy implications that must be carefully managed —</p><ul><li>CSP headers can inadvertently expose information about a website’s security practices, potentially revealing details about the resources it loads or the domains it interacts with. For instance, overly restrictive CSP configurations might lead to blocked resources, resulting in broken functionality or degraded user experiences, which could indirectly impact user trust.</li><li>Additionally, CSP headers can be used to track users by analysing which policies are enforced across different sites, raising concerns about potential privacy leaks.</li></ul><p>To address these issues, developers should craft CSP headers that balance security and privacy, ensuring they are neither too permissive nor overly restrictive. Regular audits and updates to CSP configurations are essential to adapt to evolving threats and maintain user privacy while safeguarding against security vulnerabilities.</p><p><strong>Best practices</strong></p><p>To implement Content Security Policy (CSP) headers effectively while prioritizing both security and privacy, developers should follow these best practices —</p><ul><li>Adopt a <a href="https://en.wikipedia.org/wiki/Principle_of_least_privilege">principle of least privilege</a> by specifying only the necessary sources for resources like scripts, styles, and images, avoiding overly permissive policies such as ‘unsafe-inline’ or ‘unsafe-eval’.</li><li>Use nonces or hashes to allow specific inline scripts or styles, reducing reliance on broad directives that could compromise security.</li><li>Include reporting mechanisms, such as the report-uri or report-to directives, to monitor and address violations without exposing sensitive information.</li><li>Ensure that CSP headers do not inadvertently reveal sensitive details about your website’s architecture or third-party integrations by carefully configuring directives like default-srcand connect-src</li><li>Regularly test and update your CSP configurations to align with evolving security standards and privacy regulations.</li></ul><p>By adhering to these practices, developers can enhance web security while minimizing privacy risks and maintaining a seamless user experience.</p><h4>Final thoughts</h4><p>As the web grows more complex, so does the responsibility of those building it. Thoughtful implementation — grounded in clarity, restraint, and purpose is what turns these powerful features into trustworthy experiences. So next time you reach for one of these tools/APIs, consider not just the functionality it enables, but the responsibility that comes with it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9e91a393378a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/the-web-is-always-talking-link-pings-beacon-csp-9e91a393378a">The web is always talking: Link pings, Beacon, CSP</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Beyond media queries: How CSS clamp( ) redefines responsive design]]></title>
            <link>https://medium.com/samsung-internet-dev/beyond-media-queries-how-css-clamp-redefines-responsive-design-a9293f6b5c25?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/a9293f6b5c25</guid>
            <category><![CDATA[css]]></category>
            <category><![CDATA[responsive-design]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Mon, 30 Mar 2026 09:31:00 GMT</pubDate>
            <atom:updated>2026-03-30T09:31:00.973Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*auwMp0LA-Ru2xQOW0rjONQ.jpeg" /></figure><p>Have you ever found yourself juggling endless @mediaqueries, tweaking calc()expressions, and still struggling to make your design scale just right?</p><p>I have been there too — adjusting font sizes that look perfect on one screen and completely off on another.</p><p>Meet clamp(), a versatile CSS function that can become your go-to tool for creating flexible and responsive layouts. It lets you define flexible, fluid values that grow and shrink naturally — without breaking your layout (or your patience!!)</p><h4>What is clamp( )</h4><p>The clamp()CSS function lets you set a value that stays within a defined range — between a minimum and a maximum — while growing or shrinking based on a preferred middle value.</p><pre>&lt;property&gt;: clamp(minimum, preferred, maximum)</pre><p>Here’s how it works:</p><ul><li><strong>Minimum</strong>: The smallest value it can be</li><li><strong>Preferred</strong>: The ideal, fluid value (often viewport-based)</li><li><strong>Maximum</strong>: The largest value it can grow to</li></ul><h4>Example</h4><pre>h1 {<br> font-size: clamp(1.5rem, 4vw, 3rem)<br>};</pre><p>This means:</p><ul><li>The heading’s font size will never go below 1.5rem.</li><li>It will grow fluidly with 4vw (viewport width)</li><li>It won’t exceed 3 rem.</li></ul><p>So you get smooth scaling across screen sizes <strong>without</strong> needing multiple queries.</p><h4>clamp( ) vs calc( )</h4><p>At first glance, you might think — can’t I just use calc() for this?</p><pre>font-size: calc(1rem + 2vw);</pre><p>Yes, calc()gives fluidity, but <strong>without boundaries</strong>. On very small screens, text can become tiny and on ultra-wide monitors, it can balloon uncontrollably.</p><h4>clamp( ) vs media queries</h4><p>Before clamp(), we’d often write something like this:</p><pre>h1 {<br>  font-size: 1.5rem;<br>}<br><br>@media (min-width: 768px) {<br>  h1{<br>    font-size: 2.5rem;<br>  }<br>}<br><br>@media (min-width: 1200px) {<br>  h1{<br>    font-size: 3rem;<br>  }<br>}</pre><p>With clamp(), that’s just:</p><pre>h1 {<br>  font-size: clamp(1.5rem, 4vw, 3rem);<br>}</pre><p>It’s cleaner, easier to tweak, and automatically adapts across every viewport width in between those sizes. With just a single line of code, we achieve a fluid and responsive typography that adapts seamlessly to different screen sizes.</p><h4>Use cases</h4><p>You can use clamp() for much more than font sizes:</p><pre>.container {<br>  width: clamp(300px, 80%, 1000px);<br>}<br><br>button {<br>  padding: clamp(0.5rem, 1vw, 1rem);<br>}<br><br>section {<br>  margin: clamp(1rem, 5vw, 4rem);<br>}</pre><p>It’s perfect for anything that should scale fluidly but within sensible bounds — padding, margins, widths, or even grid gaps.</p><h4>Best practices</h4><ul><li>Use vwor %for the fluid middle value.</li><li>Prefer remor emfor minand maxfor consistency</li></ul><h4>When <strong>NOT</strong> to use clamp( )</h4><ul><li>You need pixel-perfect layouts (icons, logos etc.)</li><li>For animations or transitions that require good consistency.</li></ul><h4>Accessibility and clamp( )</h4><p>When used well, clamp()can actually improve accessibility. It helps maintain readable font sizes and smooth scaling without abrupt jumps between breakpoints. By setting sensible minimums, you ensure text never gets too small on compact screens.</p><p>A very important thing to note though — overly tight minor maxvalues can stop users who zoom or increase text size from seeing changes. Use relative units like remor em, allow enough range, and always test with zoom to ensure your design remains flexible for everyone.</p><h4>Browser support</h4><p>clamp()is widely supported across all major browsers. You can check the latest compatibility details here — <a href="https://caniuse.com/?search=clamp">caniuse.com</a></p><h4>Final thoughts</h4><p>I personally see clamp()as a smarter way to think about responsive design. Try using clamp()whenever you find yourself juggling calc()and @mediaqueries. It’s a cleaner and smoother way to make your layouts fluid.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a9293f6b5c25" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/beyond-media-queries-how-css-clamp-redefines-responsive-design-a9293f6b5c25">Beyond media queries: How CSS clamp( ) redefines responsive design</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reflections from W3C’s annual conference — Kobe, Japan (2025)]]></title>
            <link>https://medium.com/samsung-internet-dev/reflections-from-w3cs-annual-conference-kobe-japan-2025-4cf1c233bdb8?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/4cf1c233bdb8</guid>
            <category><![CDATA[w3c]]></category>
            <category><![CDATA[web-standards]]></category>
            <category><![CDATA[web]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Wed, 25 Mar 2026 11:56:18 GMT</pubDate>
            <atom:updated>2026-03-25T11:56:18.194Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Group photo of five conference attendees standing infront of a branded event backdrop. They are wearing lanyards and smiling at the camera in an indoor venue." src="https://cdn-images-1.medium.com/max/1024/1*1aDErK-HRVtXPz1udaBh7g.png" /><figcaption>SRUK’s Web Standards Team (with honourary member Janina, Matthew’s co-chair)— in all its glory</figcaption></figure><p>A few months ago — though it still feels like yesterday — our Web Standards group at SRUK attended the W3C TPAC conference. Standing on the shoulders of giants — the previous incarnations of our team — this was the first time that many of us had attended the W3C’s annual conference. As such, this post captures our experiences and learnings from TPAC 2025 (Kobe, Japan), and also presents the perfect opportunity to officially introduce ourselves to all the great developer communities out there:</p><ul><li><strong>Matthew Atkinson:</strong> Web Standards Group lead at SRUK.</li><li><strong>Muadh Al Kalbani: </strong>Web Standards Technologist (XR).</li><li><strong>Ehsan Toreini: </strong>Web Standards Technologist (Privacy).</li><li><strong>Ananya Kittane Yogananda:</strong> Web Standards Technologist (DX/UX).</li></ul><p>We had heard people describe TPAC as ‘<strong>the most intense week of the year</strong>’ for anyone working on the Web platform. After attending our first TPAC this year in Kobe, Japan, we can confirm — it absolutely lived up to that description! We would see it as part conference, part meeting marathon, part reunion (for a few people) — and also a space where ideas crystallize at remarkable speed.</p><h4>What is “TPAC” anyway?</h4><p>The <strong>W3C</strong> (World Wide Web Consortium) is the convening body that brings together browser vendors, standards bodies, and the broader web community to collaborate and develop the specifications for the web features that web browsers implement today.</p><p><strong>TPAC</strong> (Technical Plenary &amp; Advisory Committee) is the W3C’s annual gathering where working groups (WG), community groups (CG), interest groups (IG) meet in person to coordinate, discuss specs, resolve issues, and plan for the future of the web. Throughout the year, these groups meet over regular teleconference calls to review specs, resolve issues, and coordinate work. But when TPAC happens, the groups come together in one physical location for face-to-face meetings. This really helps groups reach consensus, make key decisions faster, and collaborate more deeply with other groups.</p><p>To us, this first TPAC was largely about meeting people, going around and introducing ourselves to as many folks as we could, and making connections. It felt amazing to be under the same roof as hundred other smart people who make the web what it is today. It was a fantastic opportunity to meet people personally, ease into conversations, and many of those connections have already blossomed into friendships.</p><h4>Location</h4><p>TPAC 2025 was hosted at the Kobe International Conference Center in Japan. It’s a modern, beautifully designed venue with views of the Port Island waterfront — large enough to hold dozens of simultaneous meetings, but compact enough that you constantly bump into people in hallways, cafeterias. Those hallway conversations are often as valuable and meaningful as formal conversations.</p><figure><img alt="Kobe International Conference Centre" src="https://cdn-images-1.medium.com/max/1024/1*Ly6AalpXsU1-adBnWglVlA.jpeg" /><figcaption>Kobe International Conference Centre</figcaption></figure><figure><img alt="Kobe port waterfront view during sunset" src="https://cdn-images-1.medium.com/max/1024/1*5p2SS3Hg7KS-3J-J1brEOw.jpeg" /><figcaption>Kobe port waterfront view</figcaption></figure><p>For some of us, being vegetarian — food turned out to be more of an adventure than we’d expected and planning this repeatedly, across language barriers required patience. Finding “Veggie Street” and enjoying a warm bowl of vegan ramen was a highlight, and a reminder that persistence often pays off deliciously.</p><figure><img alt="Veggie street in Kobe, Japan" src="https://cdn-images-1.medium.com/max/1024/1*WRTOu6S-bTEKKMAzHbCFuA.jpeg" /><figcaption>Veggie Street, Kobe</figcaption></figure><figure><img alt="Vegan ramen menu board from Veggie street, Kobe." src="https://cdn-images-1.medium.com/max/1024/1*ZX0rbcuyiPSgNUTrJUM9Og.jpeg" /><figcaption>Vegan ramen menu board</figcaption></figure><h4>How do W3C meetings typically work?</h4><p>We were so impressed with how equipped all the meetings were. The tools, processes in place and everything felt like a smooth stream of water.</p><ul><li>Groups meet in structured sessions with chair/s driving the agenda.</li><li>An IRC channel runs in parallel for queue management with a set of commands for participants to signal their presence (present+), get added/removed (q+/q-) into the question queue and so on — for quick logging, comments, taking down minutes.</li><li>A scribe takes notes in real time, capturing what each person said, decisions, resolutions etc.</li><li>There is a bot ‘Zakim’ (and NO, Zakim is not a person) that helps manage the speaker queue, generation of minutes.</li><li>Some groups also use shared Google Docs for collaborative minute-taking.</li></ul><p>Overall, it felt like a super structured way to run meetings.</p><h4>Highlights</h4><p><strong>The meetings</strong></p><p>One of the best parts of TPAC is the sheer amount of great and valuable conversations one can have in every corner of the conference. Whether you’re in a meeting, a breakout session, a coffee break or having lunch, you were almost guaranteed a great conversation with other attendees. This is a great testament to the great work that happens across different groups within W3C — from browser engineers, spec editors, designers and fellow first time TPAC attendees, practically everyone is working on something interesting and great for the Web.</p><p>The meetings provided great opportunities to learn more about the latest updates across different facets of the Web Platform, some of the highlights include (but definitely not limited to): WCAG updates on Web Accessibility, new features in the WebRTC spec, more optimised formats for delivering media over the web, potential new pointer events to cater for more devices, new features in the Web Audio and Web speech specs and many, many, others. The meetings that particularly piqued our interest however, were those that introduced emerging and bold ideas that aim to lay solid foundations to ensure a bright and responsible future for the Web Platform. Global and societal topics such as sustainability, AI, monetization, privacy, smart cities, digital identities and many more were actively being discussed and tackled in TPAC, to ensure that W3C is not only working to make the Web a great place <em>today</em>, but also advancing the Web Platform to be great for many future generations to come. To be part of these conversations and contribute to them felt surreal, as we collectively — across different organisations, bodies and interests — work in tandem as one to push the Web Platform forward.</p><p><strong>The breakouts</strong></p><p>Breakouts are where most of the incubations and futuristic proposals get a chance to showcase their ideas for the future of the platform. Breakout sessions during TPAC are specialized meetings that focus on specific (usually novel and out-of-box) topics within the W3C ecosystem. These sessions provide a platform for experts, developers, and stakeholders to collaborate, share insights, and address challenges related to web technologies. They often cover a wide range of subjects, including web accessibility, privacy, security, and emerging technologies like Agentic AI and Web Monetization.</p><p>During these breakout sessions, participants engage in detailed discussions, brainstorming, and decision-making processes to shape the future of web standards. These sessions are crucial for fostering innovation and ensuring that the web remains open, interoperable, and inclusive.</p><p>During the week, breakouts are scheduled before the official start of the group meetings (8:00–9:00) or end of the day (17:00–18:00). However, one day is solely dedicated to the breakouts. It was an intense, and creative day with many interesting topics discussed. This ranged from research-focused study on threat modelling digital credentials API to how Agentic Web will impact the future of the web. The sessions dedicated to Agentic AI were particularly very popular. This indicates there is a clear hype for the topic and the web ecosystem is adapting to the coming wave.</p><p><strong>Socialising and most used phrases — The TPAC way</strong></p><p>Being part of TPAC was not limited to simply attending different meetings and breakout sessions, the conference also presented great opportunities to meet new people, make new friends and share ideas — adding a much needed fun aspect to an intense and productive week.</p><figure><img alt="Three people sit together at a wooden restaurant table filled with plates of food and drinks. The person on the right is taking a smiling selfie, the person in the middle makes a playful hand gesture and the person on the left looks towards the camera with a neutral expression." src="https://cdn-images-1.medium.com/max/1024/1*70uK5a8NWRCoJIMRlDZoKA.png" /></figure><figure><img alt="Five people stand together indoors in a bright lobby, smiling at the camera. The group is dressed in smart-casual clothing with other attendees and a large column visible in the background." src="https://cdn-images-1.medium.com/max/1024/1*9LpfBdU7tq9PE1a1uBbH_Q.png" /></figure><figure><img alt="Four people pose together outside at night beneath a row of red paper lanterns. three stand side by side while one crunches slightly at the front, and several of them make playful hand signs toward the camera." src="https://cdn-images-1.medium.com/max/1024/1*jaR6CgbE_cyf18HThB7RJA.png" /><figcaption>Socialising in and around Kobe</figcaption></figure><p>Given how much we enjoyed our first in-person TPAC experience, it feels right to end this post on a fun note. Picture this — our whole team is having a final dinner in Kobe with a few newly made friends before heading back to London. It was a normal fun dinner to unwind and reflect on an intense, productive week with all the expected conversation taking place: jetlag (past, present and future), food options, cold vs hot food, deciphering receipts, tiredness (past, preset and future), but then someone said the word “queue” — turning our meal into one of the funniest dinners we’ve had at TPAC, because that one word prompted every one around the table to say — out loud — a TPAC specific term that they’ve repeatedly heard in almost every meeting attended, so here goes some of the most used terms, for your amusement:</p><ul><li><em>“Can you share the link to the slides?”</em></li><li><em>“Anyone on the queue?”</em></li><li><em>“I will ACK myself” [term used to acknowledge a person that asked to speak (using “q+”) and removes the person from the queue accordingly].</em></li><li><em>“Any volunteers to scribe?”</em></li><li><em>“Can the people on the call hear us?”</em></li><li><em>“RESOLUTION” [term used if participants of a group reach consensus on resolving a particular issue].</em></li><li><em>“This is out of scope for this group”</em></li><li><em>“Add an issue on GitHub”</em></li><li><em>“Let’s continue this conversation over the break”</em></li></ul><h4>Looking back</h4><p>A successful event is definitely one in which a lot of key, and high-quality, decisions were made, and blockers to progress resolved. Another way of measuring success is in the connections that we make, and the ongoing work that results. By all of these measures, we are happy to report TPAC 2025 was a great event. Here are some highlights…</p><ul><li>Having some engaging dialogue around the horizontal review process, particularly around accessibility, and how it can be improved for spec authors, and documented better for the members of our review group.</li><li>Getting involved with revisions to the exciting work of the Second Screen Working Group — a group that allows web content to take advantage of additional displays attached to devices.</li><li>Learning about the latest XR developments, particularly the impact of the work being done by different groups across the Web Platform, like pointer-events, media and sustainability, on the future of the immersive web.</li><li>We were inspired by the dynamic discussions within the Web Machine Learning Working Group and the thought-provoking brainstorming sessions on agentic web and emerging trends. Therefore, the team has taken on a new role as the editor of the Translation API. This task-specific API represents a critical stepping stone toward the seamless integration of trustworthy machine learning (ML) and large language models (LLMs) into the web ecosystem.</li><li>The Technical Architecture Group (TAG) getting an insight on upcoming work across the platform.</li></ul><p>We also returned home with: a boatload of GitHub issues to work on, across a wide range of W3C repositories; a new appreciation for the power of ‘in real life’ (IRL) meetings; huge respect for the event organisers, and for the way that the W3C community conducts itself, to create positive fora for debate and solving the challenges we face.</p><h4>Closing thoughts</h4><p>We hope you’ve enjoyed this broad and personal view of what participating in this great and important annual event. Hopefully it has illuminated parts of the standards process for you. If it has inspired you to get involved in any W3C work, please do so! If you are working for a member organisation, we encourage you to talk with your Advisory Committee (AC) rep. If not, you can still join any Community Group (CG), where ideas are often incubated, and you have the option of applying to join a Working Group (WG), which can publish specifications, as an Invited Expert.</p><p>We hope to see you at a TPAC in future!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4cf1c233bdb8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/reflections-from-w3cs-annual-conference-kobe-japan-2025-4cf1c233bdb8">Reflections from W3C’s annual conference — Kobe, Japan (2025)</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The art of saying STOP — The JavaScript way]]></title>
            <link>https://medium.com/samsung-internet-dev/the-art-of-saying-stop-the-javascript-way-16843b19d0a7?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/16843b19d0a7</guid>
            <category><![CDATA[samsung-internet]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Mon, 02 Feb 2026 10:35:40 GMT</pubDate>
            <atom:updated>2026-02-02T10:50:10.245Z</atom:updated>
            <content:encoded><![CDATA[<h3>The art of saying STOP — The JavaScript way</h3><figure><img alt="STOP sign" src="https://cdn-images-1.medium.com/max/1024/1*v2QwKr3ABv8gmWpQoCejqg.jpeg" /><figcaption>Image of STOP sign by NickyPe on <a href="https://pixabay.com/photos/warning-sign-construction-site-sign-4240442/">pixabay.com</a></figcaption></figure><p>If JavaScript were a city, asynchronous tasks would be the traffic (requests zipping in and out), promises waiting at red lights, and callbacks merging onto the highway. What about stoplight? Once a request starts, how to politely tell it to stop?</p><p>Meet AbortController — a small API that gives developers the ability to say no to runaway async work.</p><h4>Why do we care?</h4><p>Imagine you are building a search box that fetches results as the user types.</p><pre>fetch(`/api/search?q=${query}`).then(renderResults);</pre><p>If the user types fast, multiple fetches pile up, older ones might complete after newer ones, causing stale data to appear. You could just ignore old responses, but browser is still doing work for nothing (Network wasted! CPU wasted!) What if you could cancel those outdated fetches cleanly? That’s exactly what AbortController does.</p><h4>The Basics</h4><p>The AbortControllerAPI works by creating a signal that you can pass to certain JavaScript functions. The signal is basically an indicator that tells the function if it should continue or abort. To abort a function, you need to call controller.abortand any function that listens to that signal will stop what it is doing (just like how vehicles stop when there’s a red light).</p><pre>const controller = new AbortController()<br>const signal = controller.signal<br><br>fetch(&quot;/api/data&quot;, { signal })<br>  .then(res =&gt; res.json())<br>  .then(data =&gt; console.log(data))<br>  .catch(err =&gt; {<br>    if (err.name === &quot;AbortError&quot;) {<br>      console.log(&quot;Request was aborted&quot;)<br>    } else {<br>      throw err<br>    }<br>  })<br><br>// Cancel the request<br>controller.abort()</pre><p>When controller.abort is called, the fetch immediately stops, freeing up network and memory resources.</p><p>fetch() is the most common use case but we could use AbortController with any API that accepts signal.</p><h4>Other useful use cases</h4><p><strong>Use it with </strong><strong>addEventListener()</strong></p><p>You can pass an AbortSignal directly into event listeners — this automatically <strong>removes the listener</strong> when the signal is aborted, as if you called the removeEventListener(). This works particularly well when you have many event listeners to remove at the same time.</p><pre>const controller = new AbortController();<br>const {signal} = controller;<br><br>window.addEventListener(&#39;mousemove&#39; , e =&gt; {<br>console.log(&#39;Mouse moving..&#39;);<br>} , {signal});<br><br>setTimeout(() =&gt; controller.abort(), 3000);<br>//After 3 seconds, listener is gone automatically.Use it with your own async functions</pre><p>You can make your own async code to respond to abort signals.</p><pre>async function simulateWork(signal) {<br>  for(let i=0 ; i &lt; 10 ; i++) {<br>    if(signal.aborted) throw new DOMException(&#39;Aborted&#39; , &#39;AbortError&#39;);<br>      console.log(&#39;Working step&#39; , i);<br>      await new Promise(r =&gt; setTimeout(r, 500));<br>}<br>}<br><br>const controller = new AbortController();<br>simulateWork(controller.signal)<br>  .catch(e =&gt; console.log(&#39;Stopped:&#39;, e.name));<br><br>setTimeout(() =&gt; controller.abort(), 1800);</pre><p>This pattern is perfect for UI tasks, background jobs, or data processing where you want graceful exits.</p><p><strong>Combine multiple Signals with </strong><strong>AbortSignal.any()</strong></p><p>Sometimes you have multiple cancellation sources — for example, a user action or a timeout. Let’s say you want to combine a timeout and a manual abort signal. The request will be aborted if either the manual abort is called or the timeout is reached. So whichever happens first, cancels the whole thing.</p><pre>const controller = new AbortController()<br>const signal = AbortSignal.any(<br>  controller.signal,<br>  AbortSignal.timeout(2000), // 2 seconds<br>)</pre><p><strong>Link Controllers with </strong><strong>AbortSignal.timeout(ms)</strong></p><p>You can create a signal that automatically aborts after a given time.</p><pre>const signal = AbortSignal.timeout(5000) // 5 seconds<br><br>fetch(&quot;/api/slow&quot;, { signal }).catch(err =&gt; {<br>  if (err.name === &quot;TimeoutError&quot;) {<br>    console.log(&quot;Request timed out&quot;)<br>  }<br>})</pre><p>It’s simple and built in and a big improvement over manually scheduling setTimeout(() =&gt; controller.abort())</p><p><strong>Reuse and Chain Signals</strong></p><p>You can pass the same signal to multiple fetches, and aborting once cancels them all.</p><pre>const signal = AbortSignal.timeout(2000);<br>fetch(&#39;/user&#39;, {signal: controller.signal));<br>fetch(&#39;/posts&#39;, {signal: controller.signal));<br><br>//After 2 seconds, both requests will abort automatically</pre><h4><strong>Browser support</strong></h4><p>The AbortController and it’s instance methods are widely supported on all major browsers. For a more detailed information on the browser compatibility, you could check out the <a href="https://developer.mozilla.org/en-US/docs/Web/API/AbortController#browser_compatibility">mdn docs</a>.</p><h4>Final thoughts</h4><p>In JavaScript as in life — it’s easy to start things. A network request, a background task or even a fight with your partner or your mum. But stopping them gracefully? That’s the real skill.</p><p>AbortController and AbortSignal bring that missing balance to our async world — giving the power not just to begin, but to end thoughtfully. So next time you kick off a flurry of async operations, remember :</p><p><em>Knowing when to </em><em>abort() might just save your app — and maybe your evening too!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=16843b19d0a7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/the-art-of-saying-stop-the-javascript-way-16843b19d0a7">The art of saying STOP — The JavaScript way</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[When JavaScript hurts more than it helps]]></title>
            <link>https://medium.com/samsung-internet-dev/when-javascript-hurts-more-than-it-helps-1cd962c5ef71?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/1cd962c5ef71</guid>
            <category><![CDATA[samsung-internet]]></category>
            <category><![CDATA[browsers]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Tue, 13 Jan 2026 09:36:59 GMT</pubDate>
            <atom:updated>2026-01-13T09:36:59.073Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="User frustrated looking at her website." src="https://cdn-images-1.medium.com/max/1024/1*9iWu6euOUYTchDXTlnJySQ.jpeg" /><figcaption>Photo by <a href="https://www.pexels.com/photo/a-woman-in-blue-sweater-sitting-in-front-of-a-laptop-6214914/">Kaboompics.com</a> on Pexels.com</figcaption></figure><p>JavaScript is everywhere. It powers dynamic websites, interactive apps, and modern user experiences. But just because you <em>can</em> use JavaScript doesn’t always mean you <em>should.</em></p><p>This post isn’t about dismissing JavaScript — it’s an incredible language that makes the web what it is today! Instead, it’s about recognizing the moments where restraint can lead to faster, cleaner experience.</p><h4>Why the fuss?</h4><p>Because this isn’t just theory — we’re literally shipping megabytes of JavaScript every day.</p><p>The 2024 HTTP Archive study found:</p><ol><li>The median mobile site ships over 500KB of JavaScript.</li><li>Many popular sites cross the 2MB+ mark.</li><li>And remember: every single byte must be downloaded (network cost), parsed (CPU cost), and executed before it can do anything useful.</li></ol><p>Shipping excess JavaScript is like making every visitor pay an invisible “tax” — in terms of time, battery, and data.</p><h4>When simple HTML and CSS would do the job</h4><p>A surprising number of sites lean on JavaScript for things that HTML and CSS can already handle.</p><p>For example , Accordions and dropdowns — these can often be implemented with &lt;details&gt;and &lt;summary&gt;.</p><p>Over-engineering these with JavaScript increases maintenance burden and makes your site brittle. Sometimes, the web platform already has your back.</p><h4>When it slows down performance</h4><p>JavaScript is one of the heaviest assets on a page. Every byte needs to make the full journey — download, parse, run. If your site ships large bundles for simple tasks, users with slower devices or networks would feel the pain.</p><ol><li>Large SPA frameworks for content-heavy sites.</li><li>Client-side rendering everything, even when static HTML could be served.</li><li>Overuse of polyfills or unused libraries.</li></ol><p>A lean site with fewer dependencies often performs better and reaches more users.</p><h4>When it adds more complexity than value</h4><p>JavaScript libraries are often introduced to “save time”, but each dependency comes with:</p><ol><li>Extra code weight</li><li>Security updates to monitor</li></ol><p>For example, adding a 50kB date library just to format timestamps could be replaced with Intl.DateTimeFormat. Choosing native solutions over dependencies can reduce technical debt.</p><h4>When it reinvents the wheel</h4><p>It’s tempting to roll your own modal, carousel, or tooltip. But custom-built components often miss crucial edge cases (focus trapping, ARIA attributes, keyboard shortcuts). In these cases, it would be better to rely on HTML/CSS first.</p><h4>When it hurts accessibility</h4><p>JavaScript-driven components often re-create UI patterns that already exist natively. Unfortunately, these custom versions can confuse screen readers if not implemented with care.</p><p>Some examples:</p><ol><li>Custom dropdown menus that don’t expose proper ARIA roles.</li><li>Popups that don’t return focus to the triggering element.</li></ol><p>The safest approach is to start with semantic HTML and enhance it progressively with JavaScript, rather than replacing the baseline functionality.</p><h4>Finding the balance</h4><p>The goal isn’t to ban JavaScript. It’s to use it thoughtfully. Ask yourself:</p><ol><li>Can I <strong>enhance rather than replace</strong>? Am I using JavaScript to progressively improve what HTML and CSS already provide, instead of rebuilding the basics?</li><li>Have I <strong>measured the impact</strong>? Will this library or feature actually improve user experience, or just add weight and complexity?</li><li>Could I <strong>ship less to do more</strong>? Are there dependencies I can remove, or code I can lazy-load to reduce download, parse, and execution time?</li><li>Am I <strong>respecting the user’s device</strong>? Could this feature slow down users on slower phones or poor networks?</li><li>How does this affect performance, accessibility, and even battery?</li></ol><p>The best experiences often come from a progressive enhancement mindset: start with a solid HTML foundation, layer in CSS, and only then sprinkle JavaScript where it truly adds value.</p><h4>Final thoughts</h4><p>JavaScript is a powerful tool but as Uncle Ben famously said — <a href="https://en.wikipedia.org/wiki/With_great_power_comes_great_responsibility">With great power comes great responsibility</a>. Every byte shipped, every line executed, and every unnecessary library added has a cost — in performance, accessibility, and battery life.</p><p>Sometimes, the most elegant, faster, and most inclusive solution isn’t adding more JavaScript — it’s <strong>adding less a</strong>nd when you get that balance right, your site becomes faster, more reliable, and a joy for every user, on every device.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1cd962c5ef71" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/when-javascript-hurts-more-than-it-helps-1cd962c5ef71">When JavaScript hurts more than it helps</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Baseline: A feature adoption strategy for the web]]></title>
            <link>https://medium.com/samsung-internet-dev/baseline-a-feature-adoption-strategy-for-the-web-3a2e1efbb0b8?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/3a2e1efbb0b8</guid>
            <category><![CDATA[web]]></category>
            <category><![CDATA[web-features]]></category>
            <category><![CDATA[browsers]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Tue, 23 Dec 2025 09:53:40 GMT</pubDate>
            <atom:updated>2025-12-23T09:53:40.894Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Baseline logo" src="https://cdn-images-1.medium.com/max/540/1*ZnPVAWUmtUMOLK60I9Ledw.png" /><figcaption>Baseline logo from <a href="https://web-platform-dx.github.io/web-features/name-and-logo-usage-guidelines/">web-platform-dx</a></figcaption></figure><p>One of the most common questions developers ask when they discover new ways to do things on the web: “<em>Can I use this feature in production?”</em></p><p>Sometimes, a feature works perfectly in your browser but breaks for a chunk of other users on a different browser. Other times, you delay adopting a feature for longer than necessary, just to play it safe.</p><p>This is where <strong>Baseline</strong> steps in. It’s a signal that makes this decision a lot more clearer.</p><h4>What is Baseline?</h4><p>Baseline is an initiative that gives an idea of which web platform feature works across the core browser set and are safe to use. This tells us if a web feature is ready for <em>broad, reliable use</em>.</p><p>Think of Baseline as a common calendar that we could use to understand what’s safe to adopt right now.</p><h4>Why Baseline Matters?</h4><p>Baseline isn’t just a nice-to-have. It shifts how developers make decisions. Instead of “<em>I think it works everywhere</em>”, you can say “<em>This is Baseline — widely available, it’s safe!</em>” But that certainty breaks if a feature does not work with ATs (Assistive Technologies). If it isn’t usable with ATs, it isn&#39;t truly safe for everyone.</p><h4>Baseline — An evolving definition</h4><ul><li><strong>Newly available</strong> — The feature works across the latest devices and browser versions. The feature might not work in older devices or browsers.</li></ul><figure><img alt="Baseline: Newly available logo" src="https://cdn-images-1.medium.com/max/600/1*f2msF45kMuWYOj7kgRbTSw.png" /><figcaption>Baseline: Newly available logo (Image by <a href="https://web-platform-dx.github.io/web-features/name-and-logo-usage-guidelines/">web-platform-dx</a>)</figcaption></figure><ul><li><strong>Widely available</strong> — The point at which the feature is generally safe to use (usually within 30 months after the newly available point when most features become available to about 95% of users globally).</li></ul><figure><img alt="Baseline: Widely available logo" src="https://cdn-images-1.medium.com/max/600/1*8RlWmj6s1cO4tJXB652S2Q.png" /><figcaption>Baseline: Widely available logo (Image by <a href="https://web-platform-dx.github.io/web-features/name-and-logo-usage-guidelines/">web-platform-dx</a>)</figcaption></figure><ul><li><strong>Limited availability</strong> — Prior to being newly available, a feature has <em>Limited availability</em> when it’s not yet available across all browsers.</li></ul><figure><img alt="Baseline: Limited availability logo" src="https://cdn-images-1.medium.com/max/600/1*jpRu1cQws17dhJG3kmnbvA.png" /><figcaption>Baseline: Limited availability logo (Image by <a href="https://web-platform-dx.github.io/web-features/name-and-logo-usage-guidelines/">web-platform-dx</a>)</figcaption></figure><p><strong>Note</strong>: For a feature to be a part of the baseline, it has to be available across the <strong>core browser set</strong> -</p><ul><li>Apple Safari (macOS and iOS)</li><li>Google Chrome (desktop and Android)</li><li>Firefox (Desktop and Android)</li><li>Edge (Desktop)</li></ul><h4>How to find the Baseline status of a feature?</h4><p>The Baseline status entries could be found on <a href="https://caniuse.com/">caniuse</a>, and the <a href="https://developer.mozilla.org/en-US/">MDN Web Docs</a> pages or the <a href="https://github.com/mdn/browser-compat-data">mdn/browser-compat-data</a> repo— where the MDN publishes a npm package for the compatibility data.</p><h4>The missing piece: Accessibility in Baseline</h4><p>Baseline gives us confidence about broad browser support, but it doesn’t guarantee accessibility. A feature can be “widely available” in Baseline terms and still fall short for people who rely on assistive technologies.</p><p>As <a href="https://www.w3.org/about/#:~:text=Making%20the%20web%20work%20%E2%80%94%20for%20everyone">W3C</a> puts it, the web is for everyone. If something doesn’t work for any user, that code is definitely considered buggy.</p><p><strong>So how do we know if our website works with ATs?</strong></p><ol><li><a href="https://a11ysupport.io/">allysupport.io</a> — We could use this if we wanted to see support for ARIA roles. It covers support for browsers and screen readers. While in theory, this has to cover all of the HTML input elements that use ARIA mappings but the data is actually incomplete since it relies on volunteers to update and contribute.</li><li><a href="https://www.powermapper.com/">PowerMapper.com</a> — This is another good tool that takes a step further than <a href="https://a11ysupport.io/">allysupport.io</a>. It gives support data for HTML elements across screen readers and browsers. However, there isn’t a guarantee of how often the data is updated and mainly, this isn’t integrated with any popular developer tooling which means we, developers have to know this exists in order to go and give it a try.</li></ol><p>How about the <a href="https://wpt.fyi/results/?label=experimental&amp;label=master&amp;aligned">web-platform-tests</a> (WPTs)? It then occurred to me that the WPT gives a more in-depth information which is way more than what we actually need. Also, The WPTs were mainly built for browser vendors and it wasn’t really meant for developers.</p><p>We have seen how each of these tools have their own drawbacks. Imagine having all of the support data under one umbrella (The Baseline!).</p><h4><strong>What could a more complete baseline look like?</strong></h4><p>Baseline should take into consideration the accessibility support. A web feature should technically show ‘<strong>full support</strong>’ if it <strong>does</strong> expose the correct information in the accessibility tree, regardless of what the Assistive Technology does.<br>There’s already promising work in this direction, like <a href="https://lolaslab.co/blog/2025/accessibility-compat-data/">Lola Odelola’s accessibility-compat-data</a> project, which explores how assistive technologies actually handle web features. It is also about making that data machine readable so that, in theory, it could be integrated into Baseline later. It’s the kind of data that could one day complement Baseline, helping us build a web that’s both interoperable and accessible.</p><h4>Final thoughts</h4><p>Baseline is already helping teams to adopt features more confidently. But if we stop there, we risk shipping code that excludes some users. The real goal isn’t just a web that’s <strong>interoperable</strong> — it’s a web that’s also <strong>inclusive</strong>.</p><p>While I support the Baseline initiative wholeheartedly, I also believe that the web’s true “baseline” should be the one where accessibility is guaranteed, not optional or out of scope.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3a2e1efbb0b8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/baseline-a-feature-adoption-strategy-for-the-web-3a2e1efbb0b8">Baseline: A feature adoption strategy for the web</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The infinite scroll trap: Why “modern” isn’t always better]]></title>
            <link>https://medium.com/samsung-internet-dev/the-infinite-scroll-trap-why-modern-isnt-always-better-1442e9407de9?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/1442e9407de9</guid>
            <category><![CDATA[internet-browser]]></category>
            <category><![CDATA[infinite-scroll]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Mon, 13 Oct 2025 10:14:49 GMT</pubDate>
            <atom:updated>2025-10-13T10:14:49.209Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="User scrolling through their phone" src="https://cdn-images-1.medium.com/max/1024/1*XezRt7pOtmlJFjO6tGbVfA.jpeg" /><figcaption>Image by DuoNguyen on <a href="https://unsplash.com/photos/person-holding-black-android-smartphone-CrSf94jlDpE">Unsplash.com</a></figcaption></figure><p>Infinite scroll has become almost synonymous with modern web design. It might feel sleek, immersive, and frictionless — no ‘next page’ button to click, just a smooth river of content that never seems to end.</p><p>But here’s the reality — <strong>Infinite scroll is often a trap</strong>. While it looks modern, it can seriously hurt accessibility, performance, and user experience. In this post, we’ll unpack the infinite scroll trap, show you why it’s problematic!</p><h4>How infinite scroll works</h4><p>At its core, infinite scroll is a design approach which loads content continuously as the user scrolls down. Also called endless scroll, the point is that the user never reaches the end of the page. Instead, they’re presented with a perpetual content stream without having to click.</p><h4>Why infinite scroll seems modern</h4><ul><li><strong>Frictionless browsing</strong>: Arguably, the biggest advantage of infinite scrolling is that it reduces interruptions and that the users don’t have to click <strong>‘<em>next</em>’ </strong>button.</li><li><strong>Keeps users engaged</strong>: Endless feeds often feel immersive.</li></ul><h4>Why is it problematic?</h4><p><strong>Accessibility nightmares</strong></p><ul><li><em>Screen readers</em>: Continuous content updates can disorient users. Some screen reader users might think the page is very long and might miss the footer region completely, especially if it is pushed out of reach.</li><li><em>Focus issues:</em> Newly injected content can grab focus unexpectedly or leave the user lost.</li><li><em>Cognitive overload</em>: Users with ADHD, dyslexia may struggle with never -ending streams of content.</li><li><em>Keyboard traps</em>: Infinite scroll can make it impossible for keyboard users to reach controls at the bottom of the page.</li></ul><p>Here’s a great list of checkpoints from the article <a href="https://adrianroselli.com/2014/05/so-you-think-you-built-good-infinite.html">So You think You’ve built a Good Infinite Scroll</a> by Adrian Roselli that’s worth checking before you consider implementing infinite scroll.</p><p><strong>Performance costs</strong></p><ul><li><em>Memory bloat</em>: The DOM grows endlessly. Every new batch of items adds more DOM nodes, images, event listeners, and CSS reflows. This just keeps appending content indefinitely and this could lead to sluggish performance.</li><li><em>SEO challenges</em>: Infinite scroll often hides content outside of a crawler’s field of vision. Search engine crawlers typically only see the initially loaded content, not what appears later as you scroll. If the crawler can’t access that extra content, it can’t index it — which means large parts of your page may remain invisible in search results.</li></ul><h4><strong>Better alternatives</strong></h4><p>You don’t have to ditch dynamic loading — just give users the control.</p><ol><li><strong>Pagination</strong>: With pagination — simply splitting content into different pages and linking to these pages at the foot of a page — users have a sense of where they are in the information hierarchy. They know how many pages they have to navigate and they get to choose whether they go to those pages or not. Seen in that light, pagination gives users back the control that infinite scroll takes from them.</li><li><strong>“Load More” button</strong>: This involves showing a certain number of results per page; below these results there is a button that asks if a user wants to see more. Again, this lets users decide when to fetch more content. One thing to note — place new content <strong>after</strong> the “Load more” button, not before, so the focus order remains logical, and keyboard-only and screen reader users can continue navigating forward, without being disoriented. (If the additional content was placed before the button, and the focus remained on the button, how would a keyboard-only or screen reader user get back to the start of the content that had been added?)</li></ol><p>Some users rely on landmark regions (&lt;main&gt;, &lt;nav&gt; , &lt;footer&gt;, etc.) to quickly jump around content — so far, screen readers are the only assistive technology to fully support this. Providing landmarks for content that comes <em>after</em> the infinitely scrolling area of the page may seem like a solution — but it won’t help keyboard-only users. So, it’s not a complete fix today, though it might become more effective in the future.</p><p><em>If you’re a keyboard-only user, or a web content author, and would like to navigate landmark regions via the keyboard, or visualise the landmark structure of your page in the developer tools panel, you could use an extension such as </em><a href="https://matatk.agrip.org.uk/landmarks/"><em>the Landmarks browser extension</em></a><em>.</em></p><h4>Final thoughts</h4><p>Infinite scroll isn’t a one-size-fits-all solution. When used without due care, it creates more problems than it solves. However, with thoughtful design we could enhance the experience allowing all users to access the web content and functionality. Ultimately, giving users control is the key to a better experience.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1442e9407de9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/the-infinite-scroll-trap-why-modern-isnt-always-better-1442e9407de9">The infinite scroll trap: Why “modern” isn’t always better</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cool Samsung Internet Features You Didn’t Know About]]></title>
            <link>https://medium.com/samsung-internet-dev/cool-samsung-internet-features-you-didnt-know-about-2e1b85b42bd5?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/2e1b85b42bd5</guid>
            <category><![CDATA[samsung-internet]]></category>
            <category><![CDATA[web]]></category>
            <category><![CDATA[browsers]]></category>
            <category><![CDATA[web-browser]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Wed, 24 Sep 2025 10:04:08 GMT</pubDate>
            <atom:updated>2025-09-24T10:04:08.450Z</atom:updated>
            <content:encoded><![CDATA[<h3>Cool Samsung Internet features you might not know about</h3><figure><img alt="User with a Samsung phone, and the Samsung Internet logo" src="https://cdn-images-1.medium.com/max/550/1*IoSGAUCeuJEIS-YcA2jKeg.jpeg" /><figcaption>User with Samsung phone (image by <a href="https://unsplash.com/photos/a-man-holding-a-cell-phone-in-his-hands-pj409a_bfvw">Jonas Leupe</a> on <a href="https://unsplash.com/">unsplash.com</a>) and Samsung Internet logo</figcaption></figure><p>Samsung Internet has steadily expanded beyond Samsung devices, and today it’s available across the Android ecosystem, giving more people the opportunity to explore its capabilities.</p><p>Whether you’re using a Samsung phone or just want a better browsing experience on Android, here are some cool features of Samsung Internet that you probably might not know about — but definitely should.</p><h4>Customize the menu</h4><p>Samsung Internet lets you customize the browser menu giving more control over how the menu is laid out, to match your preferences and keep your most-used features within easy reach. Navigate to <strong>Settings</strong> <strong>→ Layout and menus → Customize menus</strong></p><figure><img alt="Customize menus option under Layout and menus section highlighted" src="https://cdn-images-1.medium.com/max/300/1*jZQyJVVqehBxqGHvXGNX5A.png" /><figcaption>Customize menus option under Layout and menus section highlighted</figcaption></figure><figure><img alt="Customize menu with options to set layout" src="https://cdn-images-1.medium.com/max/300/1*woiKrYKOfQiIdZdGAhy3CQ.png" /><figcaption>Customize menu with options</figcaption></figure><p>Customizing the menu ensures frequently used tools are always at your fingertips, making browsing more convenient.</p><h4>Play YouTube videos in the background</h4><p>Another neat feature, Samsung Internet supports <strong>background playback</strong> for videos, you can listen to podcasts or play music with the screen off. Navigate to Samsung Internet’s <strong>Settings</strong> <strong>→</strong> <strong>Useful features</strong> <strong>→</strong> Enable <strong>Background play</strong></p><p>Just open a video, switch apps or lock the phone — and the audio keeps playing (unless blocked by the site itself).</p><figure><img alt="Coldplay — Viva La Vida (Official Video), playing via the YouTube website." src="https://cdn-images-1.medium.com/max/427/1*eCTy8_8dCV_3mfQDvH5JGg.jpeg" /><figcaption>Coldplay video playing on YouTube</figcaption></figure><figure><img alt="Coldplay — Viva La Vida (Official Video) playing in the background via the live notifications section of the notifications screen" src="https://cdn-images-1.medium.com/max/417/1*YT4fcKf7wwYUSW65x9ZtTA.jpeg" /><figcaption>Coldplay video (via YouTube) playing in the background</figcaption></figure><h4>In-Built video assistant</h4><p>Watching videos in the browser? Samsung Internet includes a <strong>Video Assistant</strong> with some of the controls like Picture-in-picture mode, full-screen toggle etc.</p><figure><img alt="Video assistant option under Useful features section enabled and highlighted" src="https://cdn-images-1.medium.com/max/300/1*w_Ra0gw3y_sVIyw3PXL6UQ.jpeg" /><figcaption>Video assistant option under Useful features section highlighted</figcaption></figure><figure><img alt="Video playing within Samsung Internet, with in-built video assistant options highlighted." src="https://cdn-images-1.medium.com/max/300/1*UCKLYv_6shF8Af5qOb5E1w.jpeg" /><figcaption>Video on Samsung Internet with in-built video assistant options highlighted</figcaption></figure><h4>Secret Mode with Biometric Lock</h4><p>A private browsing mode is a staple in most browsers, allowing you to browse without saving history or form data. Samsung Internet’s <strong>Secret mode</strong> builds on this idea, offering a few extra layers of control.</p><figure><img alt="Samsung Internet tabs screen, with the ‘Turn on Secret mode’ option highlighted" src="https://cdn-images-1.medium.com/max/300/1*aFa-Iso-pflScLskNxh8Qg.jpeg" /><figcaption>Samsung Internet tabs — Turn on Secret mode option highlighted</figcaption></figure><p><strong>Biometric protection</strong> — Unlock Secret mode using your fingerprint or face</p><figure><img alt="Samsung Internet’s Secret mode settings" src="https://cdn-images-1.medium.com/max/300/1*62M4vF-hj-V8CAlXW_4N0A.jpeg" /><figcaption>Samsung Internet’s secret mode settings</figcaption></figure><figure><img alt="Fingerprint verification screen before entering Samsung Internet’s Secret mode" src="https://cdn-images-1.medium.com/max/300/1*D1bGTHgmJpIAiaxPru4O_A.jpeg" /><figcaption>Biometric verification screen before entering Samsung Internet’s secret mode</figcaption></figure><p>Whether you’re shopping for a gift, or just want extra privacy, Secret mode gives you peace of mind with a private space right in your pocket.</p><h4>Reader mode</h4><p>Tired of cluttered websites with popups and ads breaking your flow? Samsung Internet’s <strong>Reader mode</strong> clears away the noise so you can focus on what matters — the content. Additionally, you could also increase the font-size for a better reading experience, just like a kindle!</p><figure><img alt="Show reader mode option under Useful features enabled &amp; highlighted" src="https://cdn-images-1.medium.com/max/300/1*sqctLbd3QamshabSFBgXlA.jpeg" /><figcaption>Show reader mode option under Useful features section highlighted</figcaption></figure><figure><img alt="Website on Samsung Internet with reader mode option (at the right side of the address bar) enabled &amp; highlighted" src="https://cdn-images-1.medium.com/max/300/1*Hb-7naQPuz5nPgKfgAmDZQ.jpeg" /><figcaption>Website on Samsung Internet with reader mode option highlighted</figcaption></figure><p>This mode is perfect for reading articles, blogs, or long-form content on the go — without distractions.</p><h4>AI-powered smart browsing tools</h4><p>Samsung Internet offers some great tools to make your browsing smarter and more helpful.</p><ul><li><strong>Summarise: </strong>Get quick summaries of long articles to save time</li><li><strong>Read highlights aloud: </strong>Lets the browser read content for you</li><li><strong>Translate: </strong>Instantly translate webpages into your preferred language</li></ul><figure><img alt="Website on Samsung Internet with browser assist option highlighted" src="https://cdn-images-1.medium.com/max/300/1*mSDs3OpUg4qPvzHoYFe-5g.jpeg" /><figcaption>Website on Samsung Internet with browser assist option highlighted</figcaption></figure><figure><img alt="Website on Samsung Internet with Browser Assist options menu shown" src="https://cdn-images-1.medium.com/max/300/1*9-xCPOlLQjcGKeytECOScg.jpeg" /><figcaption>Website on Samsung Internet with Browser Assist options menu</figcaption></figure><p>These tools are designed to make information more accessible — whether you are trying to read on the go or just scanning through an article.</p><h4>Final thoughts</h4><p>Samsung Internet is one of the most capable and user-friendly browsers on mobile today. It packs thoughtful features that genuinely improve how you use the web — often in ways you never knew you needed.</p><p>So if you haven’t explored these features, now is a great time to give them a closer look. You might have just found your new favourite mobile browser!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2e1b85b42bd5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/cool-samsung-internet-features-you-didnt-know-about-2e1b85b42bd5">Cool Samsung Internet Features You Didn’t Know About</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Think Outside the Box: Creating Shapes with CSS clip-path & shape-outside]]></title>
            <link>https://medium.com/samsung-internet-dev/think-outside-the-box-creating-shapes-with-css-clip-path-shape-outside-015bdd8a1bdd?source=rss-7f1898e591b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/015bdd8a1bdd</guid>
            <category><![CDATA[samsung-internet]]></category>
            <category><![CDATA[css]]></category>
            <dc:creator><![CDATA[Ananya Kittane Yogananda]]></dc:creator>
            <pubDate>Tue, 19 Aug 2025 10:28:35 GMT</pubDate>
            <atom:updated>2025-08-19T10:28:35.901Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Images of Samsung phone on unsplash.com , hexagon and image clipped into the shape of hexagon" src="https://cdn-images-1.medium.com/max/919/1*Jv_v3d2odcgmscoKu2hAMg.jpeg" /><figcaption>Images of Samsung phone on <a href="https://unsplash.com/">unsplash.com</a> , hexagon and image clipped into the shape of hexagon</figcaption></figure><p>Most web layouts live inside neat rectangles — but what if you could think outside the box?</p><p>With CSS properties like clip-path and shape-outside, you can transform your images and content into dazzling shapes that break free from the box ( literally!)<br> <br> In this post, we will explore how we could:</p><ol><li>Clip images into circles, stars, and polygons</li><li>Add interactive animations to these shapes</li><li>Wrap text organically around custom shapes to create stunning, editorial style UIs</li></ol><p>For all of these examples, you could use any editor to follow along — I’ve used <a href="https://codepen.io/"><strong>CodePen</strong></a> for my demos.</p><h3>clip-path &amp; shape-outside in a nutshell</h3><p>At its core, <strong>clip-path</strong> lets you define a visible region of an element. It doesn’t affect how text flows or how readers interpret content — it’s purely visual masking. We could think of clip-path as akin to cutting a shape (circle, triangle etc.,) from a rectangular piece of paper.</p><p><strong>shape-outside</strong> on the other hand, lets us define a shape — which may be non-rectangular and let’s text flow around the floated element’s shape. It helps us create magazine-style layouts.</p><h4>Usage</h4><p>Use clip-path when you want to create custom shapes or masks for an element.</p><p>Use shape-outside when you want to wrap text or other content around a custom shape.</p><p>Use both clip-path and shape-outside together when you want to clip an element to one shape while wrapping content around another shape. This is useful for advanced designs where the element and its surrounding content interact in unique ways.</p><h4>Syntax Overview</h4><pre>/* clip-path */<br>.element {<br>   clip-path: &lt;shape-function&gt; | &lt;path()&gt; | &lt;url&gt; | &lt;geometry-box&gt;;<br>}<br><br>/* shape-outside */<br>.element {<br>   shape-outside: &lt;shape-function&gt; | &lt;image&gt; | &lt;path()&gt; | &lt;url&gt; | &lt;gradient&gt; | &lt;geometry-box&gt;;<br>   float: left; /* Required for text wrapping */<br>}<br><br>/* Using shape-outside &amp; clip-path together */<br>.element {<br>   clip-path: &lt;shape-function&gt;;<br>   shape-outside: &lt;shape-function&gt;;<br>   float: left;<br>}</pre><p><strong>Example values</strong>:</p><p>Shape-function: circle(), ellipse(), polygon(), inset()</p><p>Geometry Box: content-box, padding-box, border-box</p><p>For more detailed overview of the syntax, take a look at <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/shape-outside"><strong>shape-outside</strong></a><strong> </strong>and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/clip-path"><strong>clip-path</strong></a>’s MDN articles<strong>.</strong></p><h4>The Simplest Shape: Circles</h4><p>Let’s begin with the most common and easiest shape — a circle. This is perfect for avatars and logos.</p><p><strong>Clipping an Image into a Circle</strong></p><pre>.circle {<br>  width: 200px;<br>  height: 200px;<br>  object-fit: cover;<br>  clip-path: circle(50%);<br>}</pre><figure><img alt="Image of a girl clipped into the shape of a circle" src="https://cdn-images-1.medium.com/max/343/1*pkKNhgTRAo_MukwGLBZWCA.jpeg" /><figcaption>Clipped circular image of a girl(Image by <a href="https://unsplash.com/@thesilvafocus">thesilvafocus</a> on <a href="https://unsplash.com/photos/a-woman-taking-a-picture-of-herself-with-a-camera-0IgJIZnDmco">unsplash.com</a>)</figcaption></figure><h4>Spice things up: Creating different polygons</h4><p>Once we’ve mastered circles, we can create more interesting polygons like triangles, diamonds, trapeziums using clip-path() and polygon().</p><pre>&lt;div class=&quot;gallery&quot;&gt;<br><br>  &lt;div class=&quot;item&quot;&gt;<br>    &lt;img src=&quot;https://images.unsplash.com/photo-1472214103451-9374bd1c798e?q=80&amp;w=1170&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&quot; class=&quot;triangle&quot;&gt;<br>    &lt;p&gt;Triangle&lt;/p&gt;<br>  &lt;/div&gt;<br><br>  &lt;div class=&quot;item&quot;&gt;<br>    &lt;img src=&quot;https://images.unsplash.com/photo-1472214103451-9374bd1c798e?q=80&amp;w=1170&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&quot; alt=&quot;Diamond Shape&quot; class=&quot;diamond&quot;&gt;<br>    &lt;p&gt;Diamond&lt;/p&gt;<br>  &lt;/div&gt;<br><br>  &lt;div class=&quot;item&quot;&gt;<br>    &lt;img src=&quot;https://images.unsplash.com/photo-1472214103451-9374bd1c798e?q=80&amp;w=1170&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&quot; alt=&quot;Trapezium Shape&quot; class=&quot;trapezium&quot;&gt;<br>    &lt;p&gt;Trapezium&lt;/p&gt;<br>  &lt;/div&gt;<br><br>&lt;/div&gt;</pre><pre>body {<br>  font-family: sans-serif;<br>  background: #fafafa;<br>  padding: 2rem;<br>  text-align: center;<br>}<br><br>.gallery {<br>  display: flex;<br>  gap: 2rem;<br>  justify-content: center;<br>  flex-wrap: wrap;<br>}<br><br>.item {<br>  display: flex;<br>  flex-direction: column;<br>  align-items: center;<br>  width: 200px;<br>}<br><br>img {<br>  width: 200px;<br>  height: 200px;<br>  object-fit: cover;<br>  border: 3px solid #ccc;<br>  transition: clip-path 0.3s ease;<br>}<br><br>/* Shapes using clip-path */<br><br>.triangle {<br>  clip-path: polygon(50% 0%, 100% 100%, 0% 100%);<br>}<br><br>.diamond {<br>  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);<br>}<br><br>.trapezium {<br>  clip-path: polygon(20% 0%, 80% 0%, 100% 100%, 0% 100%);<br>}</pre><figure><img alt="Image of nature clipped into the shape of triangle, diamond and trapezium" src="https://cdn-images-1.medium.com/max/553/1*eOM7sPMDvYJGvStnLZkb2g.jpeg" /><figcaption>Image of nature by <a href="https://unsplash.com/@robertlukeman">robertlukeman</a> on <a href="https://unsplash.com/photos/green-grass-field-during-sunset-_RBcxo9AU-U">unsplash.com</a> clipped into different shapes</figcaption></figure><p><strong>Note</strong>: When applying clip-path to images, using object-fit: cover ensures they fill the shape properly without distortion.</p><h4>Want to create your own shapes?</h4><p>Try <a href="https://bennettfeely.com/clippy/"><strong>clippy- CSS clip-path maker</strong></a>. It helps create visually crafty shapes, from simple triangles to more intricate polygons.</p><h4>Level up: Adding interactivity</h4><p>So far we’ve used clip-path to statically crop images into different shapes. But CSS lets us go one step further — we can animate shapes using transitions!</p><p>Example: <strong>Hovering over a circular image that morphs into a diamond</strong> This can be a subtle but engaging visual cue, great for things like testimonials, profile images etc.</p><pre>&lt;div class=&quot;clip-animate-container&quot;&gt;<br>  &lt;h1&gt;Hover over the image to see magic! &lt;/h1&gt;<br>  &lt;div class=&quot;image-wrapper&quot;&gt;<br>  &lt;img<br>    src=&quot;https://images.unsplash.com/photo-1541515929569-1771522cbaa9?w=500&amp;auto=format&amp;fit=crop&amp;q=60&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxzZWFyY2h8N3x8Z2lybCUyMHdpdGglMjBjYW1lcmF8ZW58MHx8MHx8fDA%3D&quot;<br>    alt=&quot;Morphing Image&quot;<br>    class=&quot;clip-circle-to-diamond&quot;  /&gt;<br>  &lt;/div&gt;<br>&lt;/div&gt;</pre><pre>.clip-animate-container {<br>  text-align: center;<br>  margin: 2rem 0;<br>}<br><br>.image-wrapper{<br>  position: relative;<br>  width:219px;<br>  height:219px;<br>}<br><br>.clip-circle-to-diamond {<br>  width: 200px;<br>  height: 200px;<br>  object-fit: cover;<br>  transition: clip-path 0.5s ease-in-out;<br>  clip-path: circle(50%);<br>  border: 4px solid #ccc;<br>  border-radius: 12px;<br>  pointer-events: none;<br>}<br><br>/* Morph into a diamond on hover */<br>.image-wrapper:hover .clip-circle-to-diamond {<br>  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);<br>}</pre><p>The .image-wrapper CSS class is added to prevent flickering caused by shape changes — an important consideration for accessibility and for users sensitive to rapid visual shifts.</p><p>You can have a look at the output and the code here — <a href="https://codepen.io/Ananya-KY/pen/JoYjrzb"><strong>Hover demo</strong></a>.</p><p>I’ve also created a more advanced animation example. You could use this -<a href="https://codepen.io/Ananya-KY/pen/EaVYWJY"><strong>animation demo — clip-path()</strong></a> to view and play around.</p><h4>Magazine-style layouts with shape-outside</h4><p>For the longest time, web content has lived inside rigid rectangles. Thanks to modern CSS, we now have a tool that brings editorial elegance and fluidity to web layouts. Meet shape-outside!</p><p>Let’s see how we could float a circular image and have the paragraph naturally flow around it — creating a layout you’d usually expect from a magazine or a newsletter.</p><pre>&lt;img src=&quot;https://images.unsplash.com/photo-1563207937-508961e52353?q=80&amp;w=627&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&quot; class=&quot;circle-small&quot;&gt;<br>&lt;img src=&quot;https://images.unsplash.com/photo-1622017634176-8da750043c54?q=80&amp;w=1170&amp;auto=format&amp;fit=crop&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&quot; class=&quot;circle-small&quot;&gt;<br>&lt;p&gt;<br>  These images float side by side, and the text wraps around both to simulate a multi-column layout of headshots in an editorial feature. These images float side by side, and the text wraps around both to simulate a multi-column layout of headshots in an editorial feature. How amazing is the capability to just use CSS to create such fluid layouts. The web isn&#39;t just a rectangle anymore. And nope, we dont need just figma or other design tools to do any of these fancy stuff! These images float side by side, and the text wraps around both to simulate a multi-column layout of headshots in an editorial feature. These images float side by side, and the text wraps around both to simulate a multi-column layout of headshots in an editorial feature. How amazing is the capability to just use CSS to create such fluid layouts. The web isn&#39;t just a rectangle anymore. And nope, we dont need just figma or other design tools to do any of these fancy stuff. The web isn&#39;t just a rectangle anymore. And nope, we dont need just figma or other design tools to do any of these fancy stuff.<br> The web isn&#39;t just a rectangle anymore. And nope, we dont need just figma or other design tools to do any of these fancy stuff.<br>&lt;/p&gt;</pre><pre>.circle-small {<br>  float: left;<br>  width: 120px;<br>  height: 120px;<br>  shape-outside: circle(50%);<br>  clip-path: circle(50%);<br>  object-fit: cover;<br>  margin: 0 1rem 1rem 0;<br>}<br><br>/* Media query for smaller screens (e.g., mobile) */<br>@media (max-width: 768px) {<br>  .circle-small {<br>    width: 30%; <br>    margin: 0 0.5rem 0.5rem 0; <br>  }<br>  p {<br>    font-size: 14px; <br>  }<br>}</pre><figure><img alt="Demo of how text wraps around an image in a circular fashion" src="https://cdn-images-1.medium.com/max/686/1*jArcBiNlQalbVaBoWAE0Bw.png" /><figcaption>Demo of how text wraps around an image</figcaption></figure><h4>Browser Support</h4><p>Both shape-outside (except &lt;path&gt;) and clip-path are widely supported across all the browsers.</p><h4>Conclusion</h4><p>We learnt how we could break the grid and make the web look interesting with just simple CSS. I hope this article inspires you to try out new stuff and make fancy-looking UIs outside of the regular box!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=015bdd8a1bdd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/samsung-internet-dev/think-outside-the-box-creating-shapes-with-css-clip-path-shape-outside-015bdd8a1bdd">Think Outside the Box: Creating Shapes with CSS clip-path &amp; shape-outside</a> was originally published in <a href="https://medium.com/samsung-internet-dev">Samsung Internet Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>