<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kreetive Digital Marketing</title>
    <description>The latest articles on DEV Community by Kreetive Digital Marketing (@kreetiveqatar).</description>
    <link>https://dev.to/kreetiveqatar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4099255%2F4bdc3093-95d1-41b5-a68a-46684afe18c0.png</url>
      <title>DEV Community: Kreetive Digital Marketing</title>
      <link>https://dev.to/kreetiveqatar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kreetiveqatar"/>
    <language>en</language>
    <item>
      <title>How to Turn Search Demand into a Website Information Architecture</title>
      <dc:creator>Kreetive Digital Marketing</dc:creator>
      <pubDate>Fri, 28 Aug 2026 16:54:40 +0000</pubDate>
      <link>https://dev.to/kreetiveqatar/how-to-turn-search-demand-into-a-website-information-architecture-9g2</link>
      <guid>https://dev.to/kreetiveqatar/how-to-turn-search-demand-into-a-website-information-architecture-9g2</guid>
      <description>&lt;p&gt;Many websites begin with a template and then try to fit the business into its navigation. A stronger process begins with customer demand, groups related needs, and turns those groups into pages with a clear purpose.&lt;/p&gt;

&lt;p&gt;This is not about creating hundreds of thin pages for search engines. It is about using evidence to decide what deserves a page, what belongs in one section, and how visitors should move through the site.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Collect demand from more than one source
&lt;/h2&gt;

&lt;p&gt;Start with a small, traceable dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;search queries related to the service&lt;/li&gt;
&lt;li&gt;Search Console queries from an existing website&lt;/li&gt;
&lt;li&gt;sales and support questions&lt;/li&gt;
&lt;li&gt;Google Business Profile categories and services&lt;/li&gt;
&lt;li&gt;competitor page structures&lt;/li&gt;
&lt;li&gt;internal site-search terms&lt;/li&gt;
&lt;li&gt;questions asked during client discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store the source with every phrase. A keyword without its origin, location, and date becomes difficult to validate later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"emergency dentist near me"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search-research"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"market"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Doha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"observedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-28"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Normalize without destroying meaning
&lt;/h2&gt;

&lt;p&gt;Remove obvious duplicates, normalize capitalization, and separate language variants. Do not merge phrases only because they share words.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dentist near me
emergency dentist near me
cosmetic dentist in Doha
children's dentist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All concern dentistry, but they represent different needs. A useful cluster reflects intent, not only lexical similarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Assign intent before creating pages
&lt;/h2&gt;

&lt;p&gt;A simple intent model is often enough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service intent:&lt;/strong&gt; the visitor is evaluating or requesting a service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local intent:&lt;/strong&gt; the visitor needs a provider in a specific place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Informational intent:&lt;/strong&gt; the visitor is learning or comparing options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigational intent:&lt;/strong&gt; the visitor is looking for a specific brand or resource.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intent can be stored explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;SearchIntent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;informational&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;navigational&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review borderline queries manually. Automatic clustering is useful for speed, but the final page decision should reflect what a real visitor expects to find.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Build topic clusters, then choose page roles
&lt;/h2&gt;

&lt;p&gt;Each cluster should map to a page role:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cluster&lt;/th&gt;
&lt;th&gt;Page role&lt;/th&gt;
&lt;th&gt;Primary action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;general dentistry&lt;/td&gt;
&lt;td&gt;core service page&lt;/td&gt;
&lt;td&gt;request appointment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;emergency dentist&lt;/td&gt;
&lt;td&gt;urgent service page&lt;/td&gt;
&lt;td&gt;call now&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dental implants&lt;/td&gt;
&lt;td&gt;specialist service page&lt;/td&gt;
&lt;td&gt;book consultation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cost and recovery questions&lt;/td&gt;
&lt;td&gt;educational guide&lt;/td&gt;
&lt;td&gt;continue to service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This prevents every keyword from becoming a separate URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Define a “one page, one job” rule
&lt;/h2&gt;

&lt;p&gt;Every important page should answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who is this page for?&lt;/li&gt;
&lt;li&gt;What question or need does it resolve?&lt;/li&gt;
&lt;li&gt;What evidence supports the claim?&lt;/li&gt;
&lt;li&gt;What should the visitor do next?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If two proposed pages have the same audience, evidence, and action, they probably belong together. If one page tries to serve unrelated needs, it may need to be split.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Turn clusters into a route map
&lt;/h2&gt;

&lt;p&gt;A route map makes the information architecture reviewable before design begins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
├── services/
│   ├── web-design/
│   ├── search-engine-optimization/
│   └── social-media-management/
├── industries/
│   ├── healthcare/
│   └── hospitality/
├── work/
├── insights/
└── contact/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid repeating the same page under multiple folders. Navigation can link to one canonical route from several places without duplicating the content.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Design internal links around decisions
&lt;/h2&gt;

&lt;p&gt;Internal links should help visitors take the next logical step.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a guide about website speed links to the relevant web-development service&lt;/li&gt;
&lt;li&gt;a case study links to the service that produced the result&lt;/li&gt;
&lt;li&gt;a service page links to related questions and proof&lt;/li&gt;
&lt;li&gt;a location page links to the services actually offered there&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anchor text should describe the destination naturally. Repeating one commercial phrase across every link creates a poor reading experience and an artificial pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Connect the architecture to analytics
&lt;/h2&gt;

&lt;p&gt;Define page roles and events before implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PageRole&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;location&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;guide&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;case-study&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ConversionEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;form_started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;form_submitted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phone_clicked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;whatsapp_clicked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows reporting to compare pages with similar jobs instead of treating every URL as an unrelated item.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Validate with real results
&lt;/h2&gt;

&lt;p&gt;After launch, review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;queries and impressions by page&lt;/li&gt;
&lt;li&gt;conversion actions by page role&lt;/li&gt;
&lt;li&gt;navigation paths&lt;/li&gt;
&lt;li&gt;pages competing for the same queries&lt;/li&gt;
&lt;li&gt;searches that have no satisfying destination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is a hypothesis. Search and conversion data should be used to improve it over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating one page per keyword
&lt;/h3&gt;

&lt;p&gt;Minor wording differences rarely justify separate pages. This approach produces duplication and weakens maintenance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copying competitor navigation
&lt;/h3&gt;

&lt;p&gt;A competitor's menu reveals its current structure, not necessarily customer demand or business priorities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mixing research with design decisions too early
&lt;/h3&gt;

&lt;p&gt;A visually attractive template can pressure the team into keeping sections that have no clear user purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Treating AI clusters as final truth
&lt;/h3&gt;

&lt;p&gt;Clustering tools can accelerate analysis, but market context, language, and service reality still require human review.&lt;/p&gt;

&lt;h2&gt;
  
  
  A compact deliverable before design
&lt;/h2&gt;

&lt;p&gt;Before moving to wireframes, produce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a cleaned query and customer-question dataset&lt;/li&gt;
&lt;li&gt;intent and topic clusters&lt;/li&gt;
&lt;li&gt;a page inventory with one job per page&lt;/li&gt;
&lt;li&gt;the route hierarchy&lt;/li&gt;
&lt;li&gt;internal-link relationships&lt;/li&gt;
&lt;li&gt;primary action and measurement event for each page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives designers, developers, writers, and stakeholders one shared model of what the website needs to accomplish.&lt;/p&gt;

&lt;p&gt;The key idea is simple: a website should not begin as a collection of attractive sections. It should begin as an organized response to what customers need and how the business can help them.&lt;/p&gt;

&lt;p&gt;For an example of a market-led approach to service websites, visit &lt;a href="https://kreetive.com/en/" rel="noopener noreferrer"&gt;our website&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>architecture</category>
      <category>analytics</category>
    </item>
    <item>
      <title>A Practical Core Web Vitals Checklist for Service Business Websites</title>
      <dc:creator>Kreetive Digital Marketing</dc:creator>
      <pubDate>Fri, 28 Aug 2026 16:53:20 +0000</pubDate>
      <link>https://dev.to/kreetiveqatar/a-practical-core-web-vitals-checklist-for-service-business-websites-3kng</link>
      <guid>https://dev.to/kreetiveqatar/a-practical-core-web-vitals-checklist-for-service-business-websites-3kng</guid>
      <description>&lt;p&gt;Service websites often look simple but load like large applications. A hero video, several font files, tracking scripts, chat widgets, sliders, maps, and oversized portfolio images can turn a small homepage into a slow experience.&lt;/p&gt;

&lt;p&gt;Performance work becomes easier when it is connected to the three Core Web Vitals: Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with field data
&lt;/h2&gt;

&lt;p&gt;Lab tools are useful for debugging, but field data describes what real users experience across different devices and networks.&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome User Experience Report data when available&lt;/li&gt;
&lt;li&gt;Search Console's Core Web Vitals report&lt;/li&gt;
&lt;li&gt;Real User Monitoring for page-level diagnosis&lt;/li&gt;
&lt;li&gt;Lighthouse for repeatable local investigations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not treat one Lighthouse score as proof that a site is fast. Record the page, device profile, network conditions, and test date.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Improve LCP by finding the real largest element
&lt;/h2&gt;

&lt;p&gt;On a service homepage, the LCP element is commonly the hero heading or hero image. Inspect it before changing anything.&lt;/p&gt;

&lt;p&gt;If the LCP element is an image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/images/hero-1280.webp"&lt;/span&gt;
  &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"/images/hero-640.webp 640w,
          /images/hero-1280.webp 1280w"&lt;/span&gt;
  &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"100vw"&lt;/span&gt;
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1280"&lt;/span&gt;
  &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"720"&lt;/span&gt;
  &lt;span class="na"&gt;fetchpriority=&lt;/span&gt;&lt;span class="s"&gt;"high"&lt;/span&gt;
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Team planning a website project"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not lazy-load the LCP image.&lt;/li&gt;
&lt;li&gt;Serve the correct dimensions through &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Include intrinsic width and height.&lt;/li&gt;
&lt;li&gt;Prefer AVIF or WebP when the visual quality remains acceptable.&lt;/li&gt;
&lt;li&gt;Avoid placing the hero image only in a late-loaded CSS background.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the hero contains a video, use a lightweight poster and delay the video until the page is interactive or the user requests playback.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Reduce render-blocking work
&lt;/h2&gt;

&lt;p&gt;The first screen needs very little CSS and JavaScript compared with the whole website.&lt;/p&gt;

&lt;p&gt;Split styles by route or component, remove unused framework styles, and avoid loading slider or gallery assets on pages that do not contain those widgets.&lt;/p&gt;

&lt;p&gt;Third-party scripts should have a business reason. Load analytics, chat, heatmaps, and ad pixels according to consent and interaction needs rather than placing every script in the document head.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/analytics.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;defer&lt;/code&gt; prevents classic scripts from blocking HTML parsing, but it does not make a large script cheap. Measure execution time as well as download size.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Protect INP from long tasks
&lt;/h2&gt;

&lt;p&gt;INP measures how quickly the page responds to interactions. A site can display quickly and still feel slow when a menu, filter, or form triggers too much JavaScript.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;long main-thread tasks&lt;/li&gt;
&lt;li&gt;large hydration costs&lt;/li&gt;
&lt;li&gt;event handlers that perform layout reads and writes repeatedly&lt;/li&gt;
&lt;li&gt;third-party widgets that initialize during the first interaction&lt;/li&gt;
&lt;li&gt;form validation that runs across the entire document&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Break expensive work into smaller tasks and update only the component that changed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sending…&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;submitForm&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sent successfully&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Immediate visual feedback does not replace performance work, but it prevents an interaction from feeling broken while asynchronous work completes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Eliminate CLS at the source
&lt;/h2&gt;

&lt;p&gt;Common layout-shift causes include images without dimensions, late cookie banners, injected form messages, font swaps, and sliders that calculate their height after JavaScript runs.&lt;/p&gt;

&lt;p&gt;Reserve space explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.portfolio-card__media&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;aspect-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.portfolio-card__media&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;object-fit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Place validation errors inside reserved containers, and render consent interfaces in stable overlays instead of pushing the entire page downward.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Set a font budget
&lt;/h2&gt;

&lt;p&gt;Fonts are often overlooked because each file appears small in isolation. A multilingual site may load multiple families, scripts, weights, and italics.&lt;/p&gt;

&lt;p&gt;A practical starting budget is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one body family per writing system&lt;/li&gt;
&lt;li&gt;one or two critical weights&lt;/li&gt;
&lt;li&gt;subset files for required character ranges&lt;/li&gt;
&lt;li&gt;&lt;code&gt;font-display: swap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;preload only the font used above the fold&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measure whether a decorative display font is worth delaying the main message.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Load widgets only when needed
&lt;/h2&gt;

&lt;p&gt;Maps, review embeds, booking tools, and chat widgets are useful, but they do not need to execute immediately on every page.&lt;/p&gt;

&lt;p&gt;Use an interaction placeholder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"load-map"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Show location map&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Load the heavy provider only after the user selects the action. This approach also gives consent controls a clearer boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Create performance budgets
&lt;/h2&gt;

&lt;p&gt;Without a budget, performance gradually degrades as each new tool adds “only one more script.”&lt;/p&gt;

&lt;p&gt;Example limits for a service landing page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Initial JavaScript: &amp;lt;= 150 KB compressed
Initial CSS:        &amp;lt;= 60 KB compressed
Hero image:         &amp;lt;= 180 KB
Third-party scripts: documented owner and purpose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact numbers depend on the project, but having limits creates an explicit decision when a new feature exceeds them.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Test representative pages
&lt;/h2&gt;

&lt;p&gt;Do not optimize only the homepage. Test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the homepage&lt;/li&gt;
&lt;li&gt;the heaviest service page&lt;/li&gt;
&lt;li&gt;a portfolio or gallery page&lt;/li&gt;
&lt;li&gt;a blog article&lt;/li&gt;
&lt;li&gt;the contact or lead form&lt;/li&gt;
&lt;li&gt;Arabic and English variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Averages can hide one route that performs poorly and receives valuable commercial traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  A repeatable workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Capture field and lab baselines.&lt;/li&gt;
&lt;li&gt;Identify the actual LCP element and long tasks.&lt;/li&gt;
&lt;li&gt;Remove unused assets before compressing everything.&lt;/li&gt;
&lt;li&gt;Fix image dimensions and unstable components.&lt;/li&gt;
&lt;li&gt;delay noncritical widgets and third-party scripts.&lt;/li&gt;
&lt;li&gt;Retest with the same conditions.&lt;/li&gt;
&lt;li&gt;Monitor real users after deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most effective performance work is usually not a clever optimization. It is removing unnecessary work from the critical path and protecting the result with budgets and monitoring.&lt;/p&gt;

&lt;p&gt;You can see more web performance and digital experience work from &lt;a href="https://kreetive.com/en/" rel="noopener noreferrer"&gt;Kreetive&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>seo</category>
    </item>
    <item>
      <title>How to Build a Fast Bilingual Website with RTL and LTR Support</title>
      <dc:creator>Kreetive Digital Marketing</dc:creator>
      <pubDate>Fri, 28 Aug 2026 16:31:14 +0000</pubDate>
      <link>https://dev.to/kreetiveqatar/how-to-build-a-fast-bilingual-website-with-rtl-and-ltr-support-44bc</link>
      <guid>https://dev.to/kreetiveqatar/how-to-build-a-fast-bilingual-website-with-rtl-and-ltr-support-44bc</guid>
      <description>&lt;p&gt;Building a bilingual website is not the same as translating a few strings. The direction of the interface changes, typography behaves differently, components need to survive longer text, and search engines need a clear relationship between language versions.&lt;/p&gt;

&lt;p&gt;This guide presents a practical architecture for websites that support both English and Arabic without duplicating the entire frontend.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Treat language and direction as document state
&lt;/h2&gt;

&lt;p&gt;Set both &lt;code&gt;lang&lt;/code&gt; and &lt;code&gt;dir&lt;/code&gt; on the root element. Do not rely on CSS classes alone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt; &lt;span class="na"&gt;dir=&lt;/span&gt;&lt;span class="s"&gt;"rtl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For English:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;dir=&lt;/span&gt;&lt;span class="s"&gt;"ltr"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps browsers, screen readers, form controls, punctuation, and bidirectional text behave correctly.&lt;/p&gt;

&lt;p&gt;In a React application, derive both values from the active locale:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rtl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ltr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;direction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Use CSS logical properties
&lt;/h2&gt;

&lt;p&gt;Directional declarations such as &lt;code&gt;margin-left&lt;/code&gt; and &lt;code&gt;padding-right&lt;/code&gt; create avoidable RTL bugs. Logical properties describe the purpose of the spacing instead of a physical side.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;padding-inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;margin-block-end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;border-inline-start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ff6b00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;margin-inline-end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same component now adapts automatically when the document direction changes.&lt;/p&gt;

&lt;p&gt;Use these replacements whenever possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;margin-inline-start&lt;/code&gt; instead of &lt;code&gt;margin-left&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;padding-inline-end&lt;/code&gt; instead of &lt;code&gt;padding-right&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;inset-inline-start&lt;/code&gt; instead of &lt;code&gt;left&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;border-start-start-radius&lt;/code&gt; for direction-aware corners&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Do not mirror everything
&lt;/h2&gt;

&lt;p&gt;Layout direction should change, but not every visual element should flip. Logos, photographs, media controls, phone numbers, code snippets, and many charts should preserve their original orientation.&lt;/p&gt;

&lt;p&gt;For directional icons, flip only the icons that communicate movement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"rtl"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;.directional-icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scaleX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid applying &lt;code&gt;scaleX(-1)&lt;/code&gt; to a whole container. It may reverse images and text rendering in surprising ways.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keep translation content separate from components
&lt;/h2&gt;

&lt;p&gt;A component should receive content rather than contain language-specific copy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;en&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;heroTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Build a website around real customer demand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start a project&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;heroTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ابنِ موقعك بناءً على طلب العملاء الحقيقي&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ابدأ مشروعك&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For production systems, validate message keys during the build so a missing translation cannot silently reach the interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Design for text expansion
&lt;/h2&gt;

&lt;p&gt;Arabic and English strings rarely occupy identical widths. Navigation labels, buttons, cards, and validation messages should grow naturally.&lt;/p&gt;

&lt;p&gt;Avoid fixed widths for text controls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;min-inline-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fit-content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;max-inline-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test components with deliberately long labels. A layout that survives difficult content is more reliable than one tested only with short placeholder text.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Choose and load fonts carefully
&lt;/h2&gt;

&lt;p&gt;A font may look excellent in Latin characters but offer weak Arabic glyphs. Choose a family with deliberate Arabic support, or define a compatible pair.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--font-latin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Inter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system-ui&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-arabic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Noto Sans Arabic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system-ui&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"en"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-latin&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"ar"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-arabic&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subset font files, preload only the critical weight, and use &lt;code&gt;font-display: swap&lt;/code&gt;. Loading five weights for two writing systems can quickly become one of the page's largest performance costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Give each language a stable URL
&lt;/h2&gt;

&lt;p&gt;Use separate, indexable URLs such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/services/web-design/
/ar/services/web-design/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/en/services/web-design/
/ar/services/web-design/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not change visible language only through JavaScript while keeping one URL. Separate URLs make sharing, analytics, caching, and search indexing more predictable.&lt;/p&gt;

&lt;p&gt;Connect equivalent pages with &lt;code&gt;hreflang&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/en/service/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/ar/service/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/en/service/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each page should also use a self-referencing canonical URL. Do not canonicalize the Arabic version to the English version; they are alternate language pages, not duplicates.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Test mixed-direction content
&lt;/h2&gt;

&lt;p&gt;Arabic interfaces often contain English product names, email addresses, URLs, and numbers. Wrap isolated fragments when the browser may infer the wrong direction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;راسلنا على &lt;span class="nt"&gt;&amp;lt;bdi&amp;gt;&lt;/span&gt;hello@example.com&lt;span class="nt"&gt;&amp;lt;/bdi&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arabic text containing an English brand name&lt;/li&gt;
&lt;li&gt;phone numbers and prices&lt;/li&gt;
&lt;li&gt;form validation messages&lt;/li&gt;
&lt;li&gt;breadcrumbs and pagination&lt;/li&gt;
&lt;li&gt;icons inside buttons&lt;/li&gt;
&lt;li&gt;mobile navigation&lt;/li&gt;
&lt;li&gt;copied URLs and email addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Make direction part of automated testing
&lt;/h2&gt;

&lt;p&gt;A small end-to-end test can catch many regressions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Arabic page uses RTL direction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/ar/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lang&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rtl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add visual snapshots for a few shared components in both languages. The goal is not pixel-perfect mirroring; it is consistent hierarchy, readable text, and correct interaction order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;lang&lt;/code&gt; and &lt;code&gt;dir&lt;/code&gt; at document level.&lt;/li&gt;
&lt;li&gt;Prefer CSS logical properties.&lt;/li&gt;
&lt;li&gt;Mirror only directional UI elements.&lt;/li&gt;
&lt;li&gt;Keep translated content outside components.&lt;/li&gt;
&lt;li&gt;Allow labels and controls to expand.&lt;/li&gt;
&lt;li&gt;Load fonts with strong Arabic support efficiently.&lt;/li&gt;
&lt;li&gt;Give every language version a stable URL.&lt;/li&gt;
&lt;li&gt;Implement reciprocal &lt;code&gt;hreflang&lt;/code&gt; links.&lt;/li&gt;
&lt;li&gt;Test mixed-direction content and keyboard navigation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A bilingual website becomes much easier to maintain when direction is treated as a core system property instead of a late visual patch.&lt;/p&gt;

&lt;p&gt;Kreetive applies these principles when planning and building multilingual service websites as a &lt;a href="https://kreetive.com/en/" rel="noopener noreferrer"&gt;Digital marketing company in Qatar&lt;/a&gt;.``&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>a11y</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
