<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shopify Freelancer | WordPress Freelancer</title>
	<atom:link href="https://php-freelancer.in/feed/" rel="self" type="application/rss+xml" />
	<link>https://php-freelancer.in/</link>
	<description></description>
	<lastBuildDate>Tue, 16 Jun 2026 06:24:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://php-freelancer.in/feed/"/>
	<item>
		<title>Shopify Functions Discount: Build a Custom Coupon Code for 15% Off + Free Ground Shipping</title>
		<link>https://php-freelancer.in/2026/06/15/shopify-functions-custom-coupon-code-discount-free-shipping/</link>
					<comments>https://php-freelancer.in/2026/06/15/shopify-functions-custom-coupon-code-discount-free-shipping/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Mon, 15 Jun 2026 18:07:55 +0000</pubDate>
				<category><![CDATA[Shopify]]></category>
		<guid isPermaLink="false">https://php-freelancer.in/?p=700</guid>

					<description><![CDATA[<p>Shopify Functions Discount: Build a Custom Coupon Code for 15% Off + Free Ground Shipping If you&#8217;ve tried to build a Shopify discount that does two things at once — 15% off products AND free shipping — you&#8217;ve probably hit a wall. The built-in discount rules in Shopify Admin don&#8217;t let you combine a percentage [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2026/06/15/shopify-functions-custom-coupon-code-discount-free-shipping/">Shopify Functions Discount: Build a Custom Coupon Code for 15% Off + Free Ground Shipping</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">Shopify Functions Discount: Build a Custom Coupon Code for 15% Off + Free Ground Shipping</h1>



<p class="wp-block-paragraph">If you&#8217;ve tried to build a Shopify discount that does two things at once — 15% off products AND free shipping — you&#8217;ve probably hit a wall. The built-in discount rules in Shopify Admin don&#8217;t let you combine a percentage discount with free shipping under a single coupon code. The customer ends up needing to enter two separate codes, which is a terrible checkout experience and kills conversion.</p>



<p class="wp-block-paragraph">This is exactly the problem <strong>Shopify Functions</strong> were built to solve. They let you write custom discount logic server-side — compiled to WebAssembly and plugged directly into Shopify&#8217;s checkout pipeline. In this guide, I&#8217;ll walk you through the entire Shopify Functions discount setup from scratch: creating the app, writing the Function extension, deploying it, and activating the coupon code on a production store. I&#8217;ll explain things the way I wish someone had explained them to me when I was starting out.</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained" style="border-left: 4px solid #0070f3; padding: 16px 20px; background: #f0f7ff;">

<h3 class="wp-block-heading">What You&#8217;ll Learn in This Guide</h3>


<ul class="wp-block-list">
<li>How Shopify Functions work and when to use them for discounts</li>
<li>Setting up a Shopify app with a combined discount Function extension</li>
<li>Writing JavaScript logic that targets both products and shipping options</li>
<li>Creating and managing coupon codes via the GraphQL Admin API</li>
<li>Deploying to production and safely pre-creating a discount before a sale goes live</li>
</ul>

</div>



<h2 class="wp-block-heading">What Are Shopify Functions, and Why Do You Need Them?</h2>



<p class="wp-block-paragraph">Shopify Functions are small pieces of server-side code that run inside Shopify&#8217;s infrastructure at certain points in the checkout process. Unlike theme customizations (which run in the browser), Functions execute on Shopify&#8217;s servers before the customer sees anything. This makes them perfect for discount logic.</p>



<p class="wp-block-paragraph">There are different types of Functions for different purposes. For discounts, Shopify gives you two targets:</p>



<ul class="wp-block-list">
<li><strong>cart.lines.discounts.generate</strong> — this runs on the products in the cart (line items). Use this for percentage off or fixed amount off products.</li>
<li><strong>cart.delivery-options.discounts.generate</strong> — this runs on shipping options. Use this for free shipping or shipping discounts.</li>
</ul>



<p class="wp-block-paragraph">To apply a 15% product discount AND free shipping with a single code, you need both targets in the same extension. That&#8217;s what we&#8217;re building.</p>



<h2 class="wp-block-heading">What We&#8217;re Building: A Dual-Target Shopify Functions Discount</h2>



<p class="wp-block-paragraph">By the end of this post, you&#8217;ll have a working Shopify app with a custom Function that:</p>



<ul class="wp-block-list">
<li>Applies a <strong>15% discount</strong> to all products in the cart when the customer enters a specific code</li>
<li>Makes <strong>Ground shipping free</strong> (exact title match — so &#8220;Economy&#8221; shipping stays at full price)</li>
<li>Only activates for a specific discount code (in our case, <code>SHOP15</code>)</li>
<li>Can be created on the store and kept <strong>inactive</strong> until you&#8217;re ready to go live</li>
</ul>



<h2 class="wp-block-heading">Prerequisites: What You Need Before Writing Any Code</h2>



<p class="wp-block-paragraph">Before writing a single line of code, make sure you have these things set up:</p>



<ol class="wp-block-list">
<li><strong>Node.js</strong> installed (version 18 or higher). Check by running <code>node -v</code> in your terminal.</li>
<li><strong>A Shopify Partner account</strong> — sign up free at <a href="https://partners.shopify.com">partners.shopify.com</a>.</li>
<li><strong>A development store</strong> — create one from your Partner Dashboard. This is your sandbox where you test things without touching real orders.</li>
<li><strong>Shopify CLI</strong> — the command-line tool for building Shopify apps. You don&#8217;t need to install it globally; we&#8217;ll use <code>npx</code> to run it.</li>
</ol>



<p class="wp-block-paragraph">One thing to be clear about from the start: Shopify Functions are only available inside a Shopify app. You can&#8217;t deploy a Function directly to a theme or through the admin UI. You need to build a proper app, even if that app has no frontend UI at all (which ours won&#8217;t).</p>



<h2 class="wp-block-heading">Step 1 — Create the Shopify App</h2>



<p class="wp-block-paragraph">Open your terminal, navigate to the folder where you want to create the project, and run:</p>



<pre class="wp-block-code"><code>npx shopify app init</code></pre>



<p class="wp-block-paragraph">The CLI will ask you a few questions. Here&#8217;s what to select:</p>



<ul class="wp-block-list">
<li><strong>App name</strong>: give it any name you want. Something descriptive like <code>shop-discount-app</code> works.</li>
<li><strong>Start with template</strong>: choose &#8220;Start by adding your first extension&#8221;</li>
<li><strong>Which extension?</strong>: you can skip this for now — we&#8217;ll add extensions manually.</li>
</ul>



<p class="wp-block-paragraph">Once it&#8217;s done, you&#8217;ll have a new folder with a <code>shopify.app.toml</code> file inside. This file is the main configuration for your app. It contains a <code>client_id</code> which ties the local code to an app in your Partner Dashboard. Don&#8217;t share this publicly.</p>



<p class="wp-block-paragraph">Now <code>cd</code> into your new app directory:</p>



<pre class="wp-block-code"><code>cd shop-discount-app</code></pre>



<h2 class="wp-block-heading">Step 2 — Add the Discount Function Extension</h2>



<p class="wp-block-paragraph">Extensions are the actual pieces of functionality you add to Shopify. For our discount, we need to create a Function extension. Run this command inside your app directory:</p>



<pre class="wp-block-code"><code>npx shopify app generate extension</code></pre>



<p class="wp-block-paragraph">When it asks what type of extension to create, select <strong>Discount — Combined</strong> (sometimes listed as &#8220;Discount with Function&#8221;). This creates an extension that targets both product discounts and delivery discounts.</p>



<p class="wp-block-paragraph">Give the extension a name — I&#8217;ll use <code>shop15-discount</code>. The CLI will generate a folder at <code>extensions/shop15-discount/</code> with this structure:</p>



<pre class="wp-block-code"><code>extensions/
  shop15-discount/
    src/
      cart_lines_discounts_generate_run.js
      cart_lines_discounts_generate_run.graphql
      cart_delivery_options_discounts_generate_run.js
      cart_delivery_options_discounts_generate_run.graphql
    shopify.extension.toml
    schema.graphql</code></pre>



<p class="wp-block-paragraph">The two <code>.graphql</code> files define what data your function receives from Shopify. The two <code>.js</code> files contain the logic that decides what discounts to apply. You&#8217;ll edit all four files.</p>



<h2 class="wp-block-heading">Step 3 — Understand What Data You&#8217;re Working With</h2>



<p class="wp-block-paragraph">Before writing any logic, you need to understand how Shopify gives you data. Each Function receives an &#8220;input&#8221; — a GraphQL response that describes the current state of the cart. You control what fields you ask for in the <code>.graphql</code> file, and Shopify sends you exactly that.</p>



<p class="wp-block-paragraph">The most important field for code-based discounts is <code>triggeringDiscountCode</code>. This is the exact code the customer typed at checkout. Without this, you have no way of knowing which code was entered.</p>



<p class="wp-block-paragraph">There&#8217;s also a <code>discount.discountClasses</code> field that tells you what types of discounts are enabled on this particular discount code (PRODUCT, SHIPPING, or ORDER). Always check this — it prevents your function from running in contexts where it shouldn&#8217;t.</p>



<h3 class="wp-block-heading">GraphQL Query for Product Discounts</h3>



<p class="wp-block-paragraph">Open <code>src/cart_lines_discounts_generate_run.graphql</code> and replace its contents with:</p>



<pre class="wp-block-code"><code>query CartLinesInput {
  cart {
    lines {
      id
      quantity
      merchandise {
        __typename
        ... on ProductVariant {
          id
        }
      }
    }
  }
  triggeringDiscountCode
  discount {
    discountClasses
  }
}</code></pre>



<p class="wp-block-paragraph">This fetches all line items in the cart, the discount code the customer entered, and the discount classes. We need the line item IDs to target them with the discount.</p>



<h3 class="wp-block-heading">GraphQL Query for Delivery Discounts</h3>



<p class="wp-block-paragraph">Open <code>src/cart_delivery_options_discounts_generate_run.graphql</code> and replace it with:</p>



<pre class="wp-block-code"><code>query DeliveryInput {
  cart {
    deliveryGroups {
      id
      deliveryOptions {
        handle
        title
      }
    }
  }
  triggeringDiscountCode
  discount {
    discountClasses
  }
}</code></pre>



<p class="wp-block-paragraph">Notice that for delivery, we fetch <code>deliveryOptions</code> with their <code>handle</code> and <code>title</code>. The handle is a unique identifier for each shipping option — we&#8217;ll use it to target specific options. The title is the human-readable label shown to the customer (&#8220;Ground&#8221;, &#8220;Economy&#8221;, &#8220;Express&#8221;, etc.).</p>



<h2 class="wp-block-heading">Step 4 — Write the Product Discount Logic</h2>



<p class="wp-block-paragraph">Open <code>src/cart_lines_discounts_generate_run.js</code> and replace its contents with this:</p>



<pre class="wp-block-code"><code>import {
  DiscountApplicationStrategy,
  DiscountClass,
} from '../generated/api';

/**
 * @typedef {import("../generated/api").CartLinesInput} RunInput
 * @typedef {import("../generated/api").CartLineDiscountsGenerateRunResult} CartLineDiscountsGenerateRunResult
 */

/**
 * Applies 15% off all line items when the customer enters code SHOP15.
 *
 * @param {RunInput} input
 * @returns {CartLineDiscountsGenerateRunResult}
 */
export function cartLinesDiscountsGenerateRun(input) {
  // Get the code the customer entered, converted to uppercase for comparison
  const code = input.triggeringDiscountCode?.toUpperCase();

  // If the code isn't SHOP15, return nothing — no discounts
  if (code !== 'SHOP15') {
    return { operations: [] };
  }

  // Double-check that the PRODUCT discount class is enabled on this discount
  const hasProductClass = input.discount.discountClasses.includes(
    DiscountClass.Product
  );

  if (!hasProductClass) {
    return { operations: [] };
  }

  // Get all line items from the cart
  const lines = input.cart.lines;

  if (!lines.length) {
    return { operations: [] };
  }

  // Apply 15% off to every line item
  return {
    operations: [
      {
        lineDiscountsAdd: {
          candidates: lines.map((line) => ({
            message: '15% Off — SHOP15',
            targets: [{ cartLine: { id: line.id } }],
            value: { percentage: { value: 15 } },
          })),
          selectionStrategy: DiscountApplicationStrategy.All,
        },
      },
    ],
  };
}</code></pre>



<p class="wp-block-paragraph">Let&#8217;s walk through what this does step by step:</p>



<ol class="wp-block-list">
<li>We read <code>triggeringDiscountCode</code> — this is whatever the customer typed in the discount field at checkout.</li>
<li>We convert it to uppercase and check if it equals <code>SHOP15</code>. If not, we return an empty array which means &#8220;apply no discounts.&#8221;</li>
<li>We check that this discount has the <code>PRODUCT</code> class enabled. This is a safety check — you&#8217;ll set this when creating the discount code via GraphQL later.</li>
<li>We map over every line item and tell Shopify to give each one a 15% discount. The <code>message</code> text appears in the cart/checkout summary.</li>
</ol>



<h2 class="wp-block-heading">Step 5 — Write the Delivery Discount Logic</h2>



<p class="wp-block-paragraph">This is where it gets slightly more interesting. We don&#8217;t want to make ALL shipping free — only the option labeled exactly &#8220;Ground&#8221;. &#8220;Economy&#8221; and &#8220;Express&#8221; should stay at full price.</p>



<p class="wp-block-paragraph">Open <code>src/cart_delivery_options_discounts_generate_run.js</code> and replace it with:</p>



<pre class="wp-block-code"><code>import {
  DeliveryDiscountSelectionStrategy,
  DiscountClass,
} from '../generated/api';

/**
 * @typedef {import("../generated/api").DeliveryInput} RunInput
 * @typedef {import("../generated/api").CartDeliveryOptionsDiscountsGenerateRunResult} CartDeliveryOptionsDiscountsGenerateRunResult
 */

/**
 * Applies 100% off (free) ONLY to shipping options whose title is
 * exactly "Ground" (case-insensitive). "Economy", "Express", "Ground Delivery"
 * — none of these will match.
 *
 * @param {RunInput} input
 * @returns {CartDeliveryOptionsDiscountsGenerateRunResult}
 */
export function cartDeliveryOptionsDiscountsGenerateRun(input) {
  const code = input.triggeringDiscountCode?.toUpperCase();

  if (code !== 'SHOP15') {
    return { operations: [] };
  }

  const hasShippingClass = input.discount.discountClasses.includes(
    DiscountClass.Shipping
  );

  if (!hasShippingClass) {
    return { operations: [] };
  }

  const operations = [];

  for (const group of input.cart.deliveryGroups) {
    // Filter: only options where the title is EXACTLY "Ground" (case-insensitive)
    const groundOptions = group.deliveryOptions.filter(
      (option) => option.title?.trim().toLowerCase() === 'ground'
    );

    if (!groundOptions.length) {
      continue;
    }

    operations.push({
      deliveryDiscountsAdd: {
        candidates: groundOptions.map((option) => ({
          message: 'Free Ground Shipping — SHOP15',
          targets: [{ deliveryOption: { handle: option.handle } }],
          value: { percentage: { value: 100 } },
        })),
        selectionStrategy: DeliveryDiscountSelectionStrategy.All,
      },
    });
  }

  return { operations };
}</code></pre>



<p class="wp-block-paragraph">The key line is this filter:</p>



<pre class="wp-block-code"><code>option.title?.trim().toLowerCase() === 'ground'</code></pre>



<p class="wp-block-paragraph">This is a strict equality check, not a &#8220;contains&#8221; check. So &#8220;Ground Delivery&#8221; won&#8217;t match. &#8220;ground&#8221; (all lowercase) will match because we convert both sides to lowercase first. The <code>trim()</code> removes any accidental spaces around the title.</p>



<p class="wp-block-paragraph">We target the option using its <code>handle</code> — not the delivery group ID. This is intentional. Targeting the whole group would make ALL shipping methods in that group free. Targeting individual options lets us be selective.</p>



<h2 class="wp-block-heading">Step 6 — Run the App in Development Mode</h2>



<p class="wp-block-paragraph">Now let&#8217;s see it working. Start the development server:</p>



<pre class="wp-block-code"><code>npx shopify app dev --store your-dev-store.myshopify.com</code></pre>



<p class="wp-block-paragraph">Replace <code>your-dev-store.myshopify.com</code> with your actual development store domain. The first time you run this, the CLI might ask:</p>



<ul class="wp-block-list">
<li>Which organization to use — pick the Partner org your app belongs to</li>
<li>Whether to create a new app or connect to an existing one — create new for a first-time setup</li>
</ul>



<p class="wp-block-paragraph">Once it&#8217;s running, you&#8217;ll see something like:</p>



<pre class="wp-block-code"><code>shop15-discount │ Building function shop15-discount...
shop15-discount │ Done!
app-preview     │ ✅ Ready, watching for changes in your app</code></pre>



<p class="wp-block-paragraph">The app is now installed on your dev store and the Function is active. Any code changes you make will automatically rebuild — you don&#8217;t need to restart the server.</p>



<p class="wp-block-paragraph">You&#8217;ll also get a local GraphiQL URL that looks like:</p>



<pre class="wp-block-code"><code>http://localhost:3457/graphiql?key=...</code></pre>



<p class="wp-block-paragraph">Keep this URL handy — you&#8217;ll need it in the next step.</p>



<h2 class="wp-block-heading">Step 7 — Find Your Function ID</h2>



<p class="wp-block-paragraph">Before you can create a discount code, you need the ID of the Function you just deployed. Open the GraphiQL interface (the URL from above) and run this query:</p>



<pre class="wp-block-code"><code>{
  shopifyFunctions(first: 25) {
    nodes {
      id
      title
    }
  }
}</code></pre>



<p class="wp-block-paragraph">You&#8217;ll get a list of all Functions installed on your store. Find yours by its title — in our case it should appear as &#8220;SHOP15 Combined Discount&#8221; or whatever title you set in the extension. The ID looks something like:</p>



<pre class="wp-block-code"><code>01b4d7e2-af83-7c6b-d291-3e8f50a2bc74</code></pre>



<p class="wp-block-paragraph">Copy this ID. You&#8217;ll need it in the next mutation.</p>



<h2 class="wp-block-heading">Step 8 — Create the Discount Code via GraphQL</h2>



<p class="wp-block-paragraph">You can&#8217;t create a code-based Function discount from the Shopify admin UI — you have to do it via the Admin GraphQL API. This might feel unfamiliar at first, but it&#8217;s actually straightforward once you understand the mutation.</p>



<p class="wp-block-paragraph">In GraphiQL, run this mutation (replace the function ID with yours):</p>



<pre class="wp-block-code"><code>mutation {
  discountCodeAppCreate(codeAppDiscount: {
    title: "SHOP15 - 15% Off + Free Shipping"
    functionId: "gid://shopify/ShopifyFunction/01b4d7e2-af83-7c6b-d291-3e8f50a2bc74"
    code: "SHOP15"
    startsAt: "2026-06-01T00:00:00Z"
    appliesOncePerCustomer: false
    discountClasses: [PRODUCT, SHIPPING]
    combinesWith: {
      orderDiscounts: false
      productDiscounts: false
      shippingDiscounts: true
    }
  }) {
    codeAppDiscount {
      discountId
      title
      status
    }
    userErrors { field message }
  }
}</code></pre>



<p class="wp-block-paragraph">Let me explain each field so you know what you&#8217;re doing:</p>



<ul class="wp-block-list">
<li><strong>title</strong>: the name that appears in the Shopify admin Discounts list.</li>
<li><strong>functionId</strong>: the ID you found in the previous step. Note that you need to prefix it with <code>gid://shopify/ShopifyFunction/</code>.</li>
<li><strong>code</strong>: the actual code customers will type at checkout. This is case-insensitive in the checkout UI, but your Function logic should handle lowercase too (which ours does via <code>toUpperCase()</code>).</li>
<li><strong>startsAt</strong>: when the discount becomes valid. You can set this to a past date to make it active immediately, or a future date for a scheduled sale.</li>
<li><strong>appliesOncePerCustomer</strong>: if true, each customer can only use the code once. False means unlimited uses.</li>
<li><strong>discountClasses</strong>: this is important — it tells Shopify which types of discounts your function will apply. We set both PRODUCT and SHIPPING. If you leave out SHIPPING, the delivery discount won&#8217;t run at all.</li>
<li><strong>combinesWith</strong>: controls whether this discount can stack with other discounts. We allow combining with shipping discounts but not order or product discounts to prevent double-dipping.</li>
</ul>



<p class="wp-block-paragraph">If the mutation succeeds, you&#8217;ll see the <code>discountId</code> in the response. It looks like:</p>



<pre class="wp-block-code"><code>"discountId": "gid://shopify/DiscountCodeApp/7384920165831"</code></pre>



<p class="wp-block-paragraph"><strong>Save this ID.</strong> You&#8217;ll need it to deactivate the discount in the next step.</p>



<h2 class="wp-block-heading">Step 9 — Deactivate the Discount Until You&#8217;re Ready</h2>



<p class="wp-block-paragraph">The discount is now live, which means if anyone enters &#8220;SHOP15&#8221; at checkout right now, it&#8217;ll work. If you&#8217;re on a production store and you&#8217;re not ready to run the sale yet, deactivate it immediately:</p>



<pre class="wp-block-code"><code>mutation {
  discountCodeDeactivate(id: "gid://shopify/DiscountCodeApp/7384920165831") {
    codeAppDiscount {
      title
      status
    }
    userErrors { field message }
  }
}</code></pre>



<p class="wp-block-paragraph">After running this, the status will change to <code>EXPIRED</code>. The code still exists in the system — customers just can&#8217;t use it until you activate it again.</p>



<h3 class="wp-block-heading">Activating It When the Sale Starts</h3>



<p class="wp-block-paragraph">When you&#8217;re ready to go live, you have two options:</p>



<p class="wp-block-paragraph"><strong>Option A — Via Shopify Admin (no code required):</strong><br>Go to your Shopify Admin → Discounts → find &#8220;SHOP15&#8221; → click the three-dot menu → Activate. Anyone on your team can do this, no developer needed.</p>



<p class="wp-block-paragraph"><strong>Option B — Via GraphQL mutation:</strong></p>



<pre class="wp-block-code"><code>mutation {
  discountCodeActivate(id: "gid://shopify/DiscountCodeApp/7384920165831") {
    codeAppDiscount {
      title
      status
    }
    userErrors { field message }
  }
}</code></pre>



<p class="wp-block-paragraph">Pro tip: if you know the exact date and time the sale starts, you can set a future <code>startsAt</code> date when creating the discount and skip the deactivate/activate cycle entirely. The discount will turn itself on automatically at the scheduled time.</p>



<h2 class="wp-block-heading">Step 10 — Deploy to Production</h2>



<p class="wp-block-paragraph">Development mode (<code>shopify app dev</code>) only keeps your Function active as long as the terminal is running. For production, you need to deploy a released version:</p>



<pre class="wp-block-code"><code>npx shopify app deploy --allow-updates</code></pre>



<p class="wp-block-paragraph">This compiles your Function, uploads it to Shopify, and creates a released version. Once deployed, the Function runs on Shopify&#8217;s servers — no server, no terminal, no running process required on your end.</p>



<p class="wp-block-paragraph">After deploying, go to your Partner Dashboard → your app → Distribution. You&#8217;ll find a custom install link there. Share this link with the production store admin so they can install the app on the live store.</p>



<p class="wp-block-paragraph">Once the app is installed on production, repeat Steps 7 and 8 using the production store&#8217;s GraphiQL (Admin → Apps → Shopify GraphQL App) to create the discount code there. The Function ID will be different on production — always query <code>shopifyFunctions</code> first to get the correct ID for that store.</p>



<h2 class="wp-block-heading">A Few Things That Can Trip You Up</h2>



<p class="wp-block-paragraph">I ran into several issues while building this and I want to save you the time:</p>



<h3 class="wp-block-heading">1. You must include <code>discountClasses</code> in the mutation</h3>



<p class="wp-block-paragraph">If you omit the <code>discountClasses: [PRODUCT, SHIPPING]</code> field, you&#8217;ll get a validation error: &#8220;Functions configured to use the discounts API type require the discountClasses field to be set.&#8221; This is not documented clearly, but it&#8217;s required for any Function that uses the <code>discounts</code> API type.</p>



<h3 class="wp-block-heading">2. <code>functionId</code> needs the full GID prefix</h3>



<p class="wp-block-paragraph">The <code>shopifyFunctions</code> query returns IDs like <code>01b4d7e2-af83-7c6b-d291-3e8f50a2bc74</code>. In the <code>discountCodeAppCreate</code> mutation, you need to pass <code>gid://shopify/ShopifyFunction/01b4d7e2-af83-7c6b-d291-3e8f50a2bc74</code>. Without the prefix, you&#8217;ll get a validation error.</p>



<h3 class="wp-block-heading">3. The Function ID changes between stores</h3>



<p class="wp-block-paragraph">Every store where your app is installed gets its own Function ID for that installation. The ID you use on your dev store will NOT work on the production store. Always run <code>shopifyFunctions</code> query on the target store before creating the discount there.</p>



<h3 class="wp-block-heading">4. <code>triggeringDiscountCode</code> not <code>discountNode</code></h3>



<p class="wp-block-paragraph">Older blog posts and documentation examples might show you querying <code>discountNode</code> to get the discount details. This doesn&#8217;t work for code-based app discounts. Use <code>triggeringDiscountCode</code> instead — it returns the actual string the customer typed.</p>



<h3 class="wp-block-heading">5. Use <code>deliveryOption</code> targets, not <code>deliveryGroup</code> targets</h3>



<p class="wp-block-paragraph">If you target a <code>deliveryGroup</code>, ALL shipping options in that group become free. If you want to selectively make only &#8220;Ground&#8221; free, you must target individual <code>deliveryOption</code> handles. This requires fetching <code>deliveryOptions { handle title }</code> in your GraphQL query.</p>



<h2 class="wp-block-heading">Theme-Specific Enhancements</h2>



<p class="wp-block-paragraph">Everything we&#8217;ve built so far runs server-side through Shopify&#8217;s checkout and requires no theme changes at all. The discount applies automatically when the customer enters the code — Shopify handles displaying the discount in the checkout summary.</p>



<p class="wp-block-paragraph">However, if you want to show a promo banner or badge on the product page, collection page, or cart that advertises the discount code before checkout, that requires Liquid template changes. These modifications are theme-specific — the code I&#8217;d write for one theme won&#8217;t work as-is on a different theme because the structure and CSS class names differ.</p>



<p class="wp-block-paragraph">If you&#8217;re interested in adding frontend promo messaging specific to your theme — like a &#8220;Use code SHOP15 for 15% off + free ground shipping&#8221; banner — <a href="/contact">feel free to reach out and I can help with that</a>.</p>



<h2 class="wp-block-heading">Testing Your Discount</h2>



<p class="wp-block-paragraph">Before going live, test thoroughly on your dev store:</p>



<ol class="wp-block-list">
<li>Add any products to the cart</li>
<li>Go to checkout</li>
<li>Enter <code>SHOP15</code> in the discount field</li>
<li>Verify the order subtotal shows 15% off</li>
<li>Verify that &#8220;Ground&#8221; shipping shows $0.00</li>
<li>Verify that &#8220;Economy&#8221; or any other shipping method still shows its regular price</li>
<li>Remove the code — both discounts should disappear</li>
<li>Try entering a wrong code like <code>TEST123</code> — nothing should happen</li>
</ol>



<p class="wp-block-paragraph">If the shipping discount isn&#8217;t working, the most common reason is that the shipping option title doesn&#8217;t exactly match &#8220;Ground&#8221;. Double-check the exact name in Shopify Admin → Settings → Shipping and delivery. Even a single space difference will break the match.</p>



<h2 class="wp-block-heading">The Full File Reference</h2>



<p class="wp-block-paragraph">Here&#8217;s a summary of all four files you edited and what each one does:</p>



<figure class="wp-block-table"><table><thead><tr><th>File</th><th>What it does</th></tr></thead><tbody><tr><td><code>cart_lines_discounts_generate_run.graphql</code></td><td>Tells Shopify what cart data to send to your product discount function</td></tr><tr><td><code>cart_lines_discounts_generate_run.js</code></td><td>Applies 15% off to all line items when code is SHOP15</td></tr><tr><td><code>cart_delivery_options_discounts_generate_run.graphql</code></td><td>Tells Shopify what shipping data to send to your delivery discount function</td></tr><tr><td><code>cart_delivery_options_discounts_generate_run.js</code></td><td>Makes Ground shipping free (exact title match) when code is SHOP15</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Frequently Asked Questions About Shopify Functions Discounts</h2>



<h3 class="wp-block-heading">Do I need a paid Shopify plan to use Functions?</h3>



<p class="wp-block-paragraph">Shopify Functions are available on all Shopify plans. Discount Functions — which is what this guide covers — work on Basic, Shopify, Advanced, and Plus. Some other extension types (like certain checkout UI extensions) are Plus-only, but discount logic is not one of them.</p>



<h3 class="wp-block-heading">Can I use this with automatic discounts instead of a coupon code?</h3>



<p class="wp-block-paragraph">Yes. Instead of <code>discountCodeAppCreate</code>, you&#8217;d use <code>discountAutomaticAppCreate</code>. Automatic discounts apply to everyone at checkout without requiring them to enter a code. The Function JavaScript logic stays exactly the same — only the GraphQL mutation to create the discount changes.</p>



<h3 class="wp-block-heading">What happens to the discount code if I uninstall the app?</h3>



<p class="wp-block-paragraph">If the app is uninstalled, the Function is removed and the discount stops working — even if the code still appears in the Shopify admin Discounts list. The code becomes an empty shell. Always communicate this to store owners before uninstalling any app that powers discount Functions.</p>



<h3 class="wp-block-heading">Can I change the discount percentage without redeploying?</h3>



<p class="wp-block-paragraph">Not directly — the percentage is hardcoded in the JavaScript logic. To change it, update the code and run <code>shopify app deploy</code>. For a more flexible approach, you can store the percentage in a metafield on the discount object and read it inside the Function. This lets you update the value from the Shopify admin without any redeployment.</p>



<h3 class="wp-block-heading">Is building a custom Shopify Function better than using a third-party discount app?</h3>



<p class="wp-block-paragraph">For simple use cases, a third-party app is faster to set up. But Shopify Functions give you complete control: no monthly subscription for the discount logic, no dependency on another vendor&#8217;s uptime, and you can implement business rules that no off-the-shelf app supports. For agencies and developers building custom solutions for clients, Shopify Functions are the professional long-term choice.</p>



<h2 class="wp-block-heading">Wrapping Up</h2>



<p class="wp-block-paragraph">Shopify Functions have a learning curve — the tooling, the GraphQL input/output model, and the deployment process are all different from what you&#8217;d do in a theme. But once you&#8217;ve built one, the pattern clicks and you can adapt it to almost any discount scenario you can think of: tiered discounts, customer-tag-based pricing, BOGO deals, shipping rules based on product type — all of it is possible.</p>



<p class="wp-block-paragraph">The approach we used here — separating product and delivery logic into two distinct function targets, using exact string matching for shipping options, and creating the discount code via mutation rather than the admin UI — gives you full control and keeps the implementation clean and maintainable.</p>



<p class="wp-block-paragraph">If you run into issues or want to extend this to handle more complex scenarios, feel free to <a href="/contact">get in touch</a>. Happy to help.</p>

<p>The post <a href="https://php-freelancer.in/2026/06/15/shopify-functions-custom-coupon-code-discount-free-shipping/">Shopify Functions Discount: Build a Custom Coupon Code for 15% Off + Free Ground Shipping</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2026/06/15/shopify-functions-custom-coupon-code-discount-free-shipping/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CSS Selector Lens: The DevTools Extension That Instantly Suggests CSS Selectors for Chrome &#038; Firefox</title>
		<link>https://php-freelancer.in/2026/05/07/css-selector-lens-the-devtools-extension-that-instantly-suggests-css-selectors-for-chrome-firefox/</link>
					<comments>https://php-freelancer.in/2026/05/07/css-selector-lens-the-devtools-extension-that-instantly-suggests-css-selectors-for-chrome-firefox/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Thu, 07 May 2026 18:03:49 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://php-freelancer.in/?p=641</guid>

					<description><![CDATA[<p>Free · Chrome &#38; Firefox · DevTools Extension Stop Guessing.Instant CSS SelectorSuggestions in DevTools. Click any element in the Elements / Inspector panel and instantly see every child selector, descendant path, pseudo-class variant, and attribute selector — with syntax highlighting and one-click copy. ⬇ Add to Chrome — Free 🦊 Add to Firefox — Free [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2026/05/07/css-selector-lens-the-devtools-extension-that-instantly-suggests-css-selectors-for-chrome-firefox/">CSS Selector Lens: The DevTools Extension That Instantly Suggests CSS Selectors for Chrome &#038; Firefox</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<style>
.csl-hero{background:#070b14;padding:90px 24px 80px;text-align:center;position:relative;overflow:hidden;}
.csl-hero::before{content:'';position:absolute;top:-120px;left:50%;transform:translateX(-50%);width:800px;height:600px;background:radial-gradient(ellipse at center,rgba(56,189,248,.13) 0%,rgba(99,102,241,.08) 40%,transparent 70%);pointer-events:none;}
.csl-hero::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(99,102,241,.4),rgba(56,189,248,.4),transparent);}
.csl-badge{display:inline-flex;align-items:center;gap:8px;background:rgba(99,102,241,.1);border:1px solid rgba(99,102,241,.3);border-radius:100px;padding:6px 16px;font-size:11px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:#a5b4fc;margin-bottom:32px;}
.csl-badge span{width:6px;height:6px;border-radius:50%;background:#6366f1;display:inline-block;box-shadow:0 0 8px #6366f1;}
.csl-hero h1{font-size:clamp(32px,5.5vw,62px);font-weight:900;line-height:1.1;margin:0 0 24px;color:#f8fafc;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
.csl-hero h1 em{font-style:normal;background:linear-gradient(135deg,#38bdf8,#818cf8,#c084fc);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}
.csl-hero-sub{font-size:18px;line-height:1.75;color:#94a3b8;max-width:640px;margin:0 auto 44px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
.csl-btns{display:flex;gap:14px;justify-content:center;flex-wrap:wrap;margin-bottom:20px;}
.csl-btn-primary{display:inline-flex;align-items:center;gap:8px;background:linear-gradient(135deg,#3b82f6,#6366f1);color:#fff;font-size:15px;font-weight:700;padding:15px 32px;border-radius:10px;text-decoration:none;box-shadow:0 8px 24px rgba(99,102,241,.35);transition:all .2s;}
.csl-btn-primary:hover{transform:translateY(-2px);box-shadow:0 12px 32px rgba(99,102,241,.45);color:#fff;text-decoration:none;}
.csl-btn-outline{display:inline-flex;align-items:center;gap:8px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.15);color:#e2e8f0;font-size:15px;font-weight:600;padding:15px 32px;border-radius:10px;text-decoration:none;transition:all .2s;}
.csl-btn-outline:hover{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.25);transform:translateY(-2px);color:#fff;text-decoration:none;}
.csl-hero-note{font-size:12px;color:#475569;margin-top:12px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
/* Code preview mockup */
.csl-mockup{max-width:680px;margin:56px auto 0;background:#0f172a;border:1px solid rgba(255,255,255,.08);border-radius:14px;overflow:hidden;box-shadow:0 24px 80px rgba(0,0,0,.6),0 0 0 1px rgba(99,102,241,.1);text-align:left;}
.csl-mockup-bar{background:#1e293b;padding:12px 16px;display:flex;align-items:center;gap:8px;border-bottom:1px solid rgba(255,255,255,.06);}
.csl-dot{width:11px;height:11px;border-radius:50%;}
.csl-mockup-title{flex:1;text-align:center;font-size:11px;font-weight:600;color:#64748b;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;letter-spacing:.03em;}
.csl-tabs{display:flex;gap:2px;padding:8px 12px;background:#0f172a;border-bottom:1px solid rgba(255,255,255,.05);}
.csl-tab{font-size:10px;font-weight:600;color:#64748b;padding:4px 12px;border-radius:4px;font-family:monospace;cursor:pointer;}
.csl-tab.on{background:rgba(99,102,241,.15);color:#818cf8;}
.csl-rows{padding:8px 0 12px;}
.csl-row{display:flex;align-items:center;padding:7px 16px;gap:10px;cursor:pointer;}
.csl-row:hover{background:rgba(255,255,255,.03);}
.csl-typebar{width:3px;height:18px;border-radius:2px;flex-shrink:0;}
.csl-code{font-family:'JetBrains Mono',Consolas,'Courier New',monospace;font-size:12px;flex:1;}
.csl-badge-type{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:2px 7px;border-radius:20px;}
.csl-count{font-size:10px;color:#475569;font-family:monospace;}
.t-child{color:#4ade80;}.t-desc{color:#38bdf8;}.t-pseudo{color:#c084fc;}.t-attr{color:#fb923c;}.t-anc{color:#facc15;}
.b-child{background:rgba(74,222,128,.1);color:#4ade80;}.b-desc{background:rgba(56,189,248,.1);color:#38bdf8;}.b-pseudo{background:rgba(192,132,252,.1);color:#c084fc;}.b-attr{background:rgba(251,146,60,.1);color:#fb923c;}
</style>

<section class="csl-hero">
  <div class="csl-badge"><span></span> Free · Chrome &amp; Firefox · DevTools Extension</div>
  <h1>Stop Guessing.<br><em>Instant CSS Selector</em><br>Suggestions in DevTools.</h1>
  <p class="csl-hero-sub">Click any element in the Elements / Inspector panel and instantly see every child selector, descendant path, pseudo-class variant, and attribute selector — with syntax highlighting and one-click copy.</p>
  <div class="csl-btns">
    <a href="https://chromewebstore.google.com/detail/css-selector-lens/dkdmhnamegbgblimppjfemhjbdclnplc" target="_blank" class="csl-btn-primary">⬇ Add to Chrome — Free</a>
    <a href="https://addons.mozilla.org/en-US/firefox/addon/css-selector-lens/" target="_blank" class="csl-btn-outline">🦊 Add to Firefox — Free</a>
  </div>
  <p class="csl-hero-note">No account · No data collected · Works on any website</p>

  <div class="csl-mockup">
    <div class="csl-mockup-bar">
      <div class="csl-dot" style="background:#ff5f57;"></div>
      <div class="csl-dot" style="background:#febc2e;"></div>
      <div class="csl-dot" style="background:#28c840;"></div>
      <span class="csl-mockup-title">◈ CSS Selector Lens — DevTools Panel</span>
    </div>
    <div class="csl-tabs">
      <div class="csl-tab on">All</div>
      <div class="csl-tab">Child ›</div>
      <div class="csl-tab">Descendant</div>
      <div class="csl-tab">Pseudo</div>
      <div class="csl-tab">Attributes</div>
      <div class="csl-tab">↑ Ancestors</div>
    </div>
    <div class="csl-rows">
      <div class="csl-row"><div class="csl-typebar" style="background:#4ade80;"></div><span class="csl-code"><span class="t-desc">.nav</span> <span style="color:#64748b;">&gt;</span> <span class="t-child">a</span><span class="t-pseudo">:hover</span></span><span class="csl-badge-type b-child">child</span><span class="csl-count">3</span></div>
      <div class="csl-row"><div class="csl-typebar" style="background:#38bdf8;"></div><span class="csl-code"><span class="t-desc">.card</span> <span class="t-child">.title</span></span><span class="csl-badge-type b-desc">desc</span><span class="csl-count">12</span></div>
      <div class="csl-row"><div class="csl-typebar" style="background:#c084fc;"></div><span class="csl-code"><span class="t-desc">.btn</span><span class="t-pseudo">:focus-within</span></span><span class="csl-badge-type b-pseudo">pseudo</span><span class="csl-count">5</span></div>
      <div class="csl-row"><div class="csl-typebar" style="background:#fb923c;"></div><span class="csl-code"><span class="t-desc">.form</span> <span class="t-attr">[data-required]</span></span><span class="csl-badge-type b-attr">attr</span><span class="csl-count">4</span></div>
      <div class="csl-row"><div class="csl-typebar" style="background:#4ade80;"></div><span class="csl-code"><span class="t-desc">.header</span> <span style="color:#64748b;">&gt;</span> <span class="t-child">.logo</span> <span style="color:#64748b;">&gt;</span> <span class="t-child">img</span></span><span class="csl-badge-type b-child">child</span><span class="csl-count">1</span></div>
      <div class="csl-row"><div class="csl-typebar" style="background:#38bdf8;"></div><span class="csl-code"><span class="t-desc">#sidebar</span> <span class="t-child">.widget</span></span><span class="csl-badge-type b-desc">desc</span><span class="csl-count">7</span></div>
    </div>
  </div>
</section>




<style>
.csl-intro{background:#fff;padding:80px 24px;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
.csl-intro-label{font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:16px;}
.csl-intro h2{font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#0f172a;margin:0 0 20px;line-height:1.2;}
.csl-intro p{font-size:17px;line-height:1.85;color:#475569;max-width:700px;margin:0 auto 16px;}
.csl-intro strong{color:#0f172a;}
.csl-stats{display:flex;justify-content:center;gap:48px;margin-top:52px;flex-wrap:wrap;}
.csl-stat{text-align:center;}
.csl-stat-num{font-size:38px;font-weight:900;background:linear-gradient(135deg,#3b82f6,#8b5cf6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;line-height:1;}
.csl-stat-lbl{font-size:13px;color:#94a3b8;margin-top:4px;font-weight:500;}
.csl-stat-divider{width:1px;background:#e2e8f0;align-self:stretch;}
</style>

<section class="csl-intro">
  <p class="csl-intro-label">What Is CSS Selector Lens?</p>
  <h2>Your DevTools Just Got<br>a Superpower</h2>
  <p><strong>CSS Selector Lens</strong> is a free browser extension for <strong>Chrome and Firefox</strong> that plugs directly into DevTools. Select any element and instantly get a complete list of every CSS selector you can write for it — child combinators, descendant paths, pseudo-class variants, attribute selectors, and full ancestor chains.</p>
  <p>Whether you&#8217;re writing CSS, building test automation, scraping data, or overriding theme styles — this tool eliminates the guesswork and saves you real time.</p>
  <div class="csl-stats">
    <div class="csl-stat"><div class="csl-stat-num">6</div><div class="csl-stat-lbl">Selector Categories</div></div>
    <div class="csl-stat-divider"></div>
    <div class="csl-stat"><div class="csl-stat-num">6</div><div class="csl-stat-lbl">Depth Levels</div></div>
    <div class="csl-stat-divider"></div>
    <div class="csl-stat"><div class="csl-stat-num">2</div><div class="csl-stat-lbl">Browsers Supported</div></div>
    <div class="csl-stat-divider"></div>
    <div class="csl-stat"><div class="csl-stat-num">0</div><div class="csl-stat-lbl">Data Collected</div></div>
  </div>
</section>


<style>
.csl-features{background:#070b14;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;position:relative;overflow:hidden;}
.csl-features::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(99,102,241,.5),rgba(56,189,248,.5),transparent);}
.csl-section-label{text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;}
.csl-features h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#f1f5f9;margin:0 0 14px;line-height:1.2;}
.csl-features-sub{text-align:center;font-size:16px;color:#64748b;max-width:560px;margin:0 auto 60px;}
.csl-feat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1px;max-width:1100px;margin:0 auto;background:rgba(255,255,255,.05);border-radius:16px;overflow:hidden;border:1px solid rgba(255,255,255,.06);}
.csl-feat-card{background:#0d1117;padding:36px 32px;position:relative;overflow:hidden;transition:background .2s;}
.csl-feat-card::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--accent,linear-gradient(90deg,#6366f1,#38bdf8));}
.csl-feat-card:hover{background:#111827;}
.csl-feat-icon{width:48px;height:48px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:22px;margin-bottom:20px;background:var(--icon-bg,rgba(99,102,241,.1));}
.csl-feat-card h3{font-size:17px;font-weight:700;color:#e2e8f0;margin:0 0 10px;}
.csl-feat-card p{font-size:14px;line-height:1.75;color:#64748b;margin:0;}
.csl-feat-card .csl-feat-tag{display:inline-block;margin-top:16px;font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;padding:3px 10px;border-radius:20px;background:var(--tag-bg,rgba(99,102,241,.1));color:var(--tag-color,#818cf8);}
</style>

<section class="csl-features">
  <p class="csl-section-label">Core Features</p>
  <h2>Everything You Need,<br>Built Right Into DevTools</h2>
  <p class="csl-features-sub">Six powerful capabilities. Zero extra tools. Works the moment you install it.</p>

  <div class="csl-feat-grid">

    <div class="csl-feat-card" style="--accent:linear-gradient(90deg,#6366f1,#818cf8);--icon-bg:rgba(99,102,241,.12);">
      <div class="csl-feat-icon">🔍</div>
      <h3>Inspector Sidebar Pane</h3>
      <p>A dedicated sidebar in the Elements / Inspector panel that auto-refreshes every time you select a different element. Selectors appear instantly — no re-scan, no clicking.</p>
      <span class="csl-feat-tag" style="--tag-bg:rgba(99,102,241,.12);--tag-color:#818cf8;">Chrome &amp; Firefox</span>
    </div>

    <div class="csl-feat-card" style="--accent:linear-gradient(90deg,#0ea5e9,#38bdf8);--icon-bg:rgba(14,165,233,.12);">
      <div class="csl-feat-icon">🗂️</div>
      <h3>Full DevTools Panel</h3>
      <p>A standalone &#8220;CSS Selector Lens&#8221; tab in DevTools scans the entire page DOM. Use the live search bar and filter buttons (Child, Descendant, Pseudo, Attribute, Ancestor) to find exactly what you need.</p>
      <span class="csl-feat-tag" style="--tag-bg:rgba(14,165,233,.12);--tag-color:#38bdf8;">Search + Filter</span>
    </div>

    <div class="csl-feat-card" style="--accent:linear-gradient(90deg,#8b5cf6,#c084fc);--icon-bg:rgba(139,92,246,.12);">
      <div class="csl-feat-icon">⊕</div>
      <h3>Floating Overlay + Pick Mode</h3>
      <p>A draggable floating panel you can open on any live page. Activate Pick Mode, hover over elements to see a teal highlight ring, click to generate selectors — all without opening DevTools.</p>
      <span class="csl-feat-tag" style="--tag-bg:rgba(139,92,246,.12);--tag-color:#c084fc;">Live Interaction</span>
    </div>

    <div class="csl-feat-card" style="--accent:linear-gradient(90deg,#f59e0b,#fb923c);--icon-bg:rgba(245,158,11,.1);">
      <div class="csl-feat-icon">🎨</div>
      <h3>Syntax-Coloured Output</h3>
      <p>Every selector is colour-coded just like your IDE — IDs in amber, classes in cyan, pseudo-classes in purple, attribute selectors in orange, combinators in grey. Read at a glance.</p>
      <span class="csl-feat-tag" style="--tag-bg:rgba(245,158,11,.1);--tag-color:#fb923c;">VS Code Style</span>
    </div>

    <div class="csl-feat-card" style="--accent:linear-gradient(90deg,#10b981,#34d399);--icon-bg:rgba(16,185,129,.1);">
      <div class="csl-feat-icon">📊</div>
      <h3>Live Match Count Badge</h3>
      <p>Each selector shows how many elements it currently matches on the page. Instantly know if a selector is perfectly unique (1 match) or dangerously broad (50+ matches) before you use it.</p>
      <span class="csl-feat-tag" style="--tag-bg:rgba(16,185,129,.1);--tag-color:#34d399;">Precision Tool</span>
    </div>

    <div class="csl-feat-card" style="--accent:linear-gradient(90deg,#ec4899,#f472b6);--icon-bg:rgba(236,72,153,.1);">
      <div class="csl-feat-icon">⚙️</div>
      <h3>Granular Settings Control</h3>
      <p>Set scan depth (1–6 levels), toggle selector types individually, and handpick exactly which pseudo-classes to include. Settings sync across sessions via browser storage.</p>
      <span class="csl-feat-tag" style="--tag-bg:rgba(236,72,153,.1);--tag-color:#f472b6;">Fully Customisable</span>
    </div>

  </div>
</section>




<style>
.csl-howit{background:#fff;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
.csl-howit h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#0f172a;margin:0 0 12px;line-height:1.2;}
.csl-howit-sub{text-align:center;font-size:16px;color:#94a3b8;margin:0 auto 64px;max-width:520px;}
.csl-steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:0;max-width:960px;margin:0 auto;position:relative;}
.csl-steps::before{content:'';position:absolute;top:36px;left:calc(16.6% + 24px);right:calc(16.6% + 24px);height:1px;background:linear-gradient(90deg,#6366f1,#38bdf8,#8b5cf6);opacity:.3;}
.csl-step{padding:0 32px;text-align:center;position:relative;}
.csl-step-num{width:72px;height:72px;border-radius:50%;background:linear-gradient(135deg,#0f172a,#1e293b);border:1px solid rgba(99,102,241,.3);display:flex;align-items:center;justify-content:center;margin:0 auto 24px;font-size:22px;font-weight:900;color:#818cf8;position:relative;z-index:1;box-shadow:0 0 0 8px #fff,0 8px 24px rgba(99,102,241,.15);}
.csl-step h3{font-size:18px;font-weight:700;color:#0f172a;margin:0 0 10px;}
.csl-step p{font-size:14px;line-height:1.75;color:#64748b;margin:0;}
.csl-step code{background:#f1f5f9;color:#6366f1;padding:2px 6px;border-radius:4px;font-size:13px;}
</style>

<section class="csl-howit">
  <p class="csl-section-label" style="text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;">How It Works</p>
  <h2>Up and Running in 60 Seconds</h2>
  <p class="csl-howit-sub">Three steps. No configuration. No account. No page reload.</p>

  <div class="csl-steps">
    <div class="csl-step">
      <div class="csl-step-num">01</div>
      <h3>Install the Extension</h3>
      <p>Add CSS Selector Lens from the Chrome Web Store or Firefox Add-ons. One click, zero permissions beyond <code>storage</code> and <code>clipboard</code>. Works immediately.</p>
    </div>
    <div class="csl-step">
      <div class="csl-step-num">02</div>
      <h3>Open DevTools &amp; Inspect</h3>
      <p>Press <code>F12</code> or right-click → Inspect. Open the <strong>CSS Selector Lens</strong> tab or find the sidebar in the Inspector panel. Click any element on the page.</p>
    </div>
    <div class="csl-step">
      <div class="csl-step-num">03</div>
      <h3>Search, Filter &amp; Copy</h3>
      <p>Browse colour-coded selectors grouped by type. Filter by Child, Descendant, Pseudo, Attribute or Ancestor. Click any row to copy it straight to your clipboard.</p>
    </div>
  </div>
</section>


<style>
.csl-seltypes{background:#070b14;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;position:relative;}
.csl-seltypes::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(56,189,248,.4),rgba(99,102,241,.4),transparent);}
.csl-seltypes h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#f1f5f9;margin:0 0 12px;line-height:1.2;}
.csl-seltypes-sub{text-align:center;font-size:16px;color:#64748b;max-width:560px;margin:0 auto 60px;}
.csl-type-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;max-width:1100px;margin:0 auto;}
.csl-type-card{background:#0d1117;border:1px solid rgba(255,255,255,.06);border-radius:14px;padding:28px;}
.csl-type-header{display:flex;align-items:center;gap:12px;margin-bottom:14px;}
.csl-type-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;}
.csl-type-name{font-size:15px;font-weight:700;color:#e2e8f0;}
.csl-type-desc{font-size:13px;color:#64748b;line-height:1.65;margin-bottom:16px;}
.csl-type-code{background:#060a14;border:1px solid rgba(255,255,255,.06);border-radius:8px;padding:14px 16px;font-family:'JetBrains Mono',Consolas,monospace;font-size:12.5px;line-height:1.6;}
.csl-type-code .sel-tag{color:#f87171;}
.csl-type-code .sel-cls{color:#38bdf8;}
.csl-type-code .sel-id{color:#fbbf24;}
.csl-type-code .sel-pseudo{color:#c084fc;}
.csl-type-code .sel-attr{color:#fb923c;}
.csl-type-code .sel-comb{color:#475569;}
.csl-type-code div{padding:2px 0;}
</style>

<section class="csl-seltypes">
  <p style="text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;">Selector Categories</p>
  <h2>Six Types. Real Examples.<br>From Your Actual DOM.</h2>
  <p class="csl-seltypes-sub">Every selector is generated live from the page you&#8217;re currently inspecting — not hypothetical, not generic.</p>

  <div class="csl-type-grid">

    <div class="csl-type-card">
      <div class="csl-type-header">
        <div class="csl-type-dot" style="background:#4ade80;box-shadow:0 0 8px #4ade8066;"></div>
        <span class="csl-type-name">Child Selectors <code style="font-size:11px;color:#64748b;background:rgba(255,255,255,.04);padding:1px 5px;border-radius:3px;">›</code></span>
      </div>
      <p class="csl-type-desc">Direct child combinators — target only immediate children, not deeper descendants. Perfect for scoped, specific selectors.</p>
      <div class="csl-type-code">
        <div><span class="sel-cls">.nav</span> <span class="sel-comb">&gt;</span> <span class="sel-tag">a</span></div>
        <div><span class="sel-cls">.card</span> <span class="sel-comb">&gt;</span> <span class="sel-cls">.title</span></div>
        <div><span class="sel-cls">.header</span> <span class="sel-comb">&gt;</span> <span class="sel-cls">.logo</span> <span class="sel-comb">&gt;</span> <span class="sel-tag">img</span></div>
      </div>
    </div>

    <div class="csl-type-card">
      <div class="csl-type-header">
        <div class="csl-type-dot" style="background:#38bdf8;box-shadow:0 0 8px #38bdf866;"></div>
        <span class="csl-type-name">Descendant Selectors</span>
      </div>
      <p class="csl-type-desc">Space-separated paths — match elements nested at any depth inside a parent. Great for loose, reusable selectors.</p>
      <div class="csl-type-code">
        <div><span class="sel-cls">.card</span> <span class="sel-cls">.title</span></div>
        <div><span class="sel-cls">.sidebar</span> <span class="sel-tag">ul</span></div>
        <div><span class="sel-id">#main</span> <span class="sel-cls">.btn</span></div>
      </div>
    </div>

    <div class="csl-type-card">
      <div class="csl-type-header">
        <div class="csl-type-dot" style="background:#c084fc;box-shadow:0 0 8px #c084fc66;"></div>
        <span class="csl-type-name">Pseudo-class Variants</span>
      </div>
      <p class="csl-type-desc">State-based selectors generated for every element — hover, focus, active, checked, disabled, first-child and more.</p>
      <div class="csl-type-code">
        <div><span class="sel-cls">.btn</span><span class="sel-pseudo">:hover</span></div>
        <div><span class="sel-tag">input</span><span class="sel-pseudo">:focus</span></div>
        <div><span class="sel-tag">li</span><span class="sel-pseudo">:first-child</span></div>
        <div><span class="sel-cls">.item</span><span class="sel-pseudo">:not(:last-child)</span></div>
      </div>
    </div>

    <div class="csl-type-card">
      <div class="csl-type-header">
        <div class="csl-type-dot" style="background:#fb923c;box-shadow:0 0 8px #fb923c66;"></div>
        <span class="csl-type-name">Attribute Selectors</span>
      </div>
      <p class="csl-type-desc">Targets elements by their data-* attributes and ARIA roles — essential for scraping, testing, and ARIA-based styling.</p>
      <div class="csl-type-code">
        <div><span class="sel-cls">.card</span> <span class="sel-attr">[data-type]</span></div>
        <div><span class="sel-tag">input</span><span class="sel-attr">[data-required]</span></div>
        <div><span class="sel-cls">.btn</span> <span class="sel-attr">[aria-label]</span></div>
      </div>
    </div>

    <div class="csl-type-card">
      <div class="csl-type-header">
        <div class="csl-type-dot" style="background:#facc15;box-shadow:0 0 8px #facc1566;"></div>
        <span class="csl-type-name">Ancestor Path Chains</span>
      </div>
      <p class="csl-type-desc">Full contextual chains walking up the DOM — shows the complete selector path from a distant ancestor down to your element.</p>
      <div class="csl-type-code">
        <div><span class="sel-cls">.section</span> <span class="sel-comb">&gt;</span> <span class="sel-cls">.card</span> <span class="sel-comb">&gt;</span> <span class="sel-cls">.btn</span></div>
        <div><span class="sel-cls">.main</span> <span class="sel-cls">.widget</span></div>
        <div><span class="sel-tag">nav</span> <span class="sel-cls">.menu</span> <span class="sel-comb">&gt;</span> <span class="sel-tag">li</span></div>
      </div>
    </div>

    <div class="csl-type-card">
      <div class="csl-type-header">
        <div class="csl-type-dot" style="background:#94a3b8;box-shadow:0 0 8px #94a3b866;"></div>
        <span class="csl-type-name">Tag + Class Combos</span>
      </div>
      <p class="csl-type-desc">Qualified selectors that pair the HTML tag with a class — more specific than class alone, avoids cross-tag collisions.</p>
      <div class="csl-type-code">
        <div><span class="sel-tag">button</span><span class="sel-cls">.primary</span></div>
        <div><span class="sel-tag">span</span><span class="sel-cls">.label</span></div>
        <div><span class="sel-tag">div</span><span class="sel-cls">.card</span></div>
      </div>
    </div>

  </div>
</section>




<style>
.csl-settings{background:#fff;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
.csl-settings h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#0f172a;margin:0 0 12px;line-height:1.2;}
.csl-settings-sub{text-align:center;font-size:16px;color:#94a3b8;max-width:560px;margin:0 auto 60px;}
.csl-set-wrap{display:grid;grid-template-columns:1fr 1fr;gap:48px;max-width:1000px;margin:0 auto;}
@media(max-width:640px){.csl-set-wrap{grid-template-columns:1fr;}}
.csl-set-group h3{font-size:19px;font-weight:700;color:#0f172a;margin:0 0 28px;padding-bottom:14px;border-bottom:2px solid #f1f5f9;}
.csl-set-row{display:flex;align-items:flex-start;gap:14px;margin-bottom:22px;}
.csl-toggle{width:36px;height:20px;background:linear-gradient(135deg,#6366f1,#38bdf8);border-radius:10px;flex-shrink:0;margin-top:2px;position:relative;cursor:default;}
.csl-toggle::after{content:'';position:absolute;right:3px;top:3px;width:14px;height:14px;border-radius:50%;background:#fff;}
.csl-set-info h4{font-size:14px;font-weight:700;color:#1e293b;margin:0 0 4px;}
.csl-set-info p{font-size:13px;color:#64748b;margin:0;line-height:1.6;}
.csl-set-info code{background:#f1f5f9;color:#6366f1;padding:1px 5px;border-radius:3px;font-size:12px;}
.csl-depth-preview{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px 20px;margin-top:20px;}
.csl-depth-label{font-size:11px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px;}
.csl-depth-bar{height:6px;background:#e2e8f0;border-radius:3px;margin-bottom:8px;position:relative;overflow:visible;}
.csl-depth-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,#6366f1,#38bdf8);}
.csl-depth-code{font-family:monospace;font-size:12px;color:#64748b;}<br>
</style>

<section class="csl-settings">
  <p style="text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;">Settings</p>
  <h2>You&#8217;re in Full Control</h2>
  <p class="csl-settings-sub">A full three-section settings page lets you tailor every aspect of CSS Selector Lens to your workflow.</p>

  <div class="csl-set-wrap">
    <div class="csl-set-group">
      <h3>⚙ General Settings</h3>
      <div class="csl-set-row">
        <div class="csl-toggle"></div>
        <div class="csl-set-info">
          <h4>Auto-refresh on Element Select</h4>
          <p>Sidebar automatically updates when you click a different element in the Inspector panel — no manual re-scan needed.</p>
        </div>
      </div>
      <div class="csl-set-row">
        <div class="csl-toggle"></div>
        <div class="csl-set-info">
          <h4>Show Match Count Badge</h4>
          <p>Displays how many elements each selector matches on the current page — helps you write precise, non-greedy selectors first time.</p>
        </div>
      </div>
      <div class="csl-depth-preview">
        <div class="csl-depth-label">Selector Depth — currently set to 4</div>
        <div class="csl-depth-bar"><div class="csl-depth-fill" style="width:66%;"></div></div>
        <div class="csl-depth-code">.a &gt; .b &gt; .c &gt; .d</div>
        <div style="font-size:12px;color:#94a3b8;margin-top:6px;">Slide from 1 (shallow) to 6 (deep) — controls how many child levels are crawled per element.</div>
      </div>
    </div>

    <div class="csl-set-group">
      <h3>◎ Suggestion Types</h3>
      <div class="csl-set-row">
        <div class="csl-toggle"></div>
        <div class="csl-set-info"><h4>Child Selectors</h4><p><code>.parent &gt; .child</code> — Direct child combinators only.</p></div>
      </div>
      <div class="csl-set-row">
        <div class="csl-toggle"></div>
        <div class="csl-set-info"><h4>Descendant Selectors</h4><p><code>.parent .child</code> — Space-separated descendants at any depth.</p></div>
      </div>
      <div class="csl-set-row">
        <div class="csl-toggle"></div>
        <div class="csl-set-info"><h4>Pseudo-class Suggestions</h4><p><code>:hover</code>, <code>:focus</code>, <code>:first-child</code>, <code>:not()</code> and more — select exactly which ones to include.</p></div>
      </div>
      <div class="csl-set-row">
        <div class="csl-toggle"></div>
        <div class="csl-set-info"><h4>Attribute Selectors</h4><p><code>[data-*]</code> and ARIA attributes detected live from the DOM.</p></div>
      </div>
      <div class="csl-set-row">
        <div class="csl-toggle"></div>
        <div class="csl-set-info"><h4>Tag + Class Combos</h4><p><code>button.primary</code>, <code>span.label</code> — Qualified, specific selectors.</p></div>
      </div>
    </div>
  </div>
</section>


<style>
.csl-compare{background:#070b14;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;position:relative;}
.csl-compare::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(99,102,241,.5),rgba(56,189,248,.5),transparent);}
.csl-compare h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#f1f5f9;margin:0 0 12px;line-height:1.2;}
.csl-compare-sub{text-align:center;font-size:16px;color:#64748b;max-width:560px;margin:0 auto 52px;}
.csl-compare-wrap{max-width:860px;margin:0 auto;background:#0d1117;border:1px solid rgba(255,255,255,.06);border-radius:16px;overflow:hidden;}
.csl-compare-table{width:100%;border-collapse:collapse;font-size:14px;}
.csl-compare-table thead tr{background:#111827;border-bottom:1px solid rgba(255,255,255,.06);}
.csl-compare-table th{padding:18px 24px;text-align:left;font-size:13px;font-weight:700;color:#94a3b8;letter-spacing:.03em;}
.csl-compare-table th:nth-child(2){color:#facc15;}
.csl-compare-table th:nth-child(3){color:#fb923c;}
.csl-compare-table td{padding:14px 24px;border-bottom:1px solid rgba(255,255,255,.04);color:#cbd5e1;vertical-align:middle;}
.csl-compare-table tr:last-child td{border-bottom:none;}
.csl-compare-table tr:hover td{background:rgba(255,255,255,.02);}
.csl-compare-table td:first-child{color:#64748b;font-size:13px;}
.csl-check{color:#4ade80;font-size:16px;font-weight:700;}
.csl-partial{color:#fbbf24;font-size:13px;}
.csl-none{color:#475569;font-size:13px;}
.csl-tag-mv{display:inline-block;font-size:10px;font-weight:700;padding:2px 8px;border-radius:20px;background:rgba(99,102,241,.15);color:#818cf8;letter-spacing:.05em;}
</style>

<section class="csl-compare">
  <p style="text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;">Browser Support</p>
  <h2>Chrome vs Firefox —<br>Same Power, Both Browsers</h2>
  <p class="csl-compare-sub">Both versions share the same core engine. Here are the platform-specific differences.</p>

  <div class="csl-compare-wrap">
    <table class="csl-compare-table">
      <thead>
        <tr>
          <th>Feature</th>
          <th>🟡 Chrome Extension</th>
          <th>🟠 Firefox Add-on</th>
        </tr>
      </thead>
      <tbody>
        <tr><td>Manifest Version</td><td><span class="csl-tag-mv">MV3</span> — latest standard</td><td><span class="csl-tag-mv">MV2</span> — Firefox standard</td></tr>
        <tr><td>DevTools Panel Tab</td><td><span class="csl-check">✓</span> Full panel</td><td><span class="csl-check">✓</span> Full panel</td></tr>
        <tr><td>Inspector Sidebar Pane</td><td><span class="csl-check">✓</span> Elements sidebar</td><td><span class="csl-check">✓</span> Inspector sidebar</td></tr>
        <tr><td>Floating Overlay + Pick Mode</td><td><span class="csl-check">✓</span> via Scripting API</td><td><span class="csl-check">✓</span> via background.js</td></tr>
        <tr><td>Attribute Filter Tab (sidebar)</td><td><span class="csl-partial">Panel only</span></td><td><span class="csl-check">✓</span> Panel &amp; sidebar</td></tr>
        <tr><td>Selector Tooltip on Overflow</td><td><span class="csl-check">✓</span> Panel hover</td><td><span class="csl-check">✓</span> Sidebar hover</td></tr>
        <tr><td>Depth Setting (1–6 levels)</td><td><span class="csl-check">✓</span></td><td><span class="csl-check">✓</span></td></tr>
        <tr><td>One-click Copy to Clipboard</td><td><span class="csl-check">✓</span></td><td><span class="csl-check">✓</span></td></tr>
        <tr><td>Auto-rescan on Navigation</td><td><span class="csl-check">✓</span></td><td><span class="csl-check">✓</span></td></tr>
        <tr><td>Data Collected / Sent</td><td><span class="csl-none">None</span></td><td><span class="csl-none">None</span></td></tr>
        <tr><td>Minimum Browser Version</td><td>Chrome 88+</td><td>Firefox 109+</td></tr>
      </tbody>
    </table>
  </div>
</section>




<style>
.csl-usecases{background:#f8fafc;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
.csl-usecases h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#0f172a;margin:0 0 12px;line-height:1.2;}
.csl-usecases-sub{text-align:center;font-size:16px;color:#94a3b8;max-width:560px;margin:0 auto 56px;}
.csl-uc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;max-width:1100px;margin:0 auto;}
.csl-uc-card{background:#fff;border-radius:14px;padding:32px 28px;border:1px solid #e2e8f0;position:relative;overflow:hidden;transition:transform .2s,box-shadow .2s;}
.csl-uc-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:var(--uc-accent);}
.csl-uc-card:hover{transform:translateY(-4px);box-shadow:0 16px 40px rgba(0,0,0,.08);}
.csl-uc-icon{font-size:32px;margin-bottom:16px;line-height:1;}
.csl-uc-card h3{font-size:16px;font-weight:700;color:#0f172a;margin:0 0 10px;}
.csl-uc-card p{font-size:13px;line-height:1.75;color:#64748b;margin:0;}
.csl-uc-card code{background:#f1f5f9;color:#6366f1;padding:1px 5px;border-radius:3px;font-size:12px;}
</style>

<section class="csl-usecases">
  <p style="text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;">Who Is It For?</p>
  <h2>Built for Every Developer<br>Who Touches the DOM</h2>
  <p class="csl-usecases-sub">CSS Selector Lens fits naturally into a wide range of developer workflows — front-end, backend, QA, and beyond.</p>

  <div class="csl-uc-grid">
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#6366f1,#818cf8);">
      <div class="csl-uc-icon">🧑‍💻</div>
      <h3>Front-End Developers</h3>
      <p>Stop manually reading the DOM tree. Click any element and get the exact child and descendant selectors you need to style it — with context on how many elements match.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#10b981,#34d399);">
      <div class="csl-uc-icon">🤖</div>
      <h3>QA &amp; Test Automation</h3>
      <p>Get reliable, unique selectors for Playwright, Puppeteer, Cypress, and Selenium. The match count badge immediately tells you if a selector is stable enough for a test assertion.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#f59e0b,#fb923c);">
      <div class="csl-uc-icon">🕷️</div>
      <h3>Web Scrapers &amp; Data Engineers</h3>
      <p>Identify stable, meaningful selectors for Python (BeautifulSoup, Scrapy) or JavaScript scripts. Ancestor path chains give you the full contextual selector chain instantly.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#8b5cf6,#c084fc);">
      <div class="csl-uc-icon">🎨</div>
      <h3>WordPress &amp; Theme Developers</h3>
      <p>Override WooCommerce, Elementor, or block theme styles precisely — without resorting to <code>!important</code>. Get the exact specificity chain the extension generates.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#ec4899,#f472b6);">
      <div class="csl-uc-icon">📚</div>
      <h3>CSS Learners &amp; Students</h3>
      <p>See how real websites are structured with live DOM selectors. An interactive way to understand child vs descendant vs pseudo-class selectors using actual page examples.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#0ea5e9,#38bdf8);">
      <div class="csl-uc-icon">🔌</div>
      <h3>Browser Extension Developers</h3>
      <p>Quickly find DOM injection points and element targets for your own extensions or userscripts. The floating overlay Pick Mode is especially useful for this workflow.</p>
    </div>
  </div>
</section>


<style>
.csl-compare{background:#070b14;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;position:relative;}
.csl-compare::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(99,102,241,.5),rgba(56,189,248,.5),transparent);}
.csl-compare h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#f1f5f9;margin:0 0 12px;line-height:1.2;}
.csl-compare-sub{text-align:center;font-size:16px;color:#64748b;max-width:560px;margin:0 auto 52px;}
.csl-compare-wrap{max-width:860px;margin:0 auto;background:#0d1117;border:1px solid rgba(255,255,255,.06);border-radius:16px;overflow:hidden;}
.csl-compare-table{width:100%;border-collapse:collapse;font-size:14px;}
.csl-compare-table thead tr{background:#111827;border-bottom:1px solid rgba(255,255,255,.06);}
.csl-compare-table th{padding:18px 24px;text-align:left;font-size:13px;font-weight:700;color:#94a3b8;letter-spacing:.03em;}
.csl-compare-table th:nth-child(2){color:#facc15;}
.csl-compare-table th:nth-child(3){color:#fb923c;}
.csl-compare-table td{padding:14px 24px;border-bottom:1px solid rgba(255,255,255,.04);color:#cbd5e1;vertical-align:middle;}
.csl-compare-table tr:last-child td{border-bottom:none;}
.csl-compare-table tr:hover td{background:rgba(255,255,255,.02);}
.csl-compare-table td:first-child{color:#64748b;font-size:13px;}
.csl-check{color:#4ade80;font-size:16px;font-weight:700;}
.csl-partial{color:#fbbf24;font-size:13px;}
.csl-none{color:#475569;font-size:13px;}
.csl-tag-mv{display:inline-block;font-size:10px;font-weight:700;padding:2px 8px;border-radius:20px;background:rgba(99,102,241,.15);color:#818cf8;letter-spacing:.05em;}
</style>

<section class="csl-compare">
  <p style="text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;">Browser Support</p>
  <h2>Chrome vs Firefox —<br>Same Power, Both Browsers</h2>
  <p class="csl-compare-sub">Both versions share the same core engine. Here are the platform-specific differences.</p>

  <div class="csl-compare-wrap">
    <table class="csl-compare-table">
      <thead>
        <tr>
          <th>Feature</th>
          <th>🟡 Chrome Extension</th>
          <th>🟠 Firefox Add-on</th>
        </tr>
      </thead>
      <tbody>
        <tr><td>Manifest Version</td><td><span class="csl-tag-mv">MV3</span> — latest standard</td><td><span class="csl-tag-mv">MV2</span> — Firefox standard</td></tr>
        <tr><td>DevTools Panel Tab</td><td><span class="csl-check">✓</span> Full panel</td><td><span class="csl-check">✓</span> Full panel</td></tr>
        <tr><td>Inspector Sidebar Pane</td><td><span class="csl-check">✓</span> Elements sidebar</td><td><span class="csl-check">✓</span> Inspector sidebar</td></tr>
        <tr><td>Floating Overlay + Pick Mode</td><td><span class="csl-check">✓</span> via Scripting API</td><td><span class="csl-check">✓</span> via background.js</td></tr>
        <tr><td>Attribute Filter Tab (sidebar)</td><td><span class="csl-partial">Panel only</span></td><td><span class="csl-check">✓</span> Panel &amp; sidebar</td></tr>
        <tr><td>Selector Tooltip on Overflow</td><td><span class="csl-check">✓</span> Panel hover</td><td><span class="csl-check">✓</span> Sidebar hover</td></tr>
        <tr><td>Depth Setting (1–6 levels)</td><td><span class="csl-check">✓</span></td><td><span class="csl-check">✓</span></td></tr>
        <tr><td>One-click Copy to Clipboard</td><td><span class="csl-check">✓</span></td><td><span class="csl-check">✓</span></td></tr>
        <tr><td>Auto-rescan on Navigation</td><td><span class="csl-check">✓</span></td><td><span class="csl-check">✓</span></td></tr>
        <tr><td>Data Collected / Sent</td><td><span class="csl-none">None</span></td><td><span class="csl-none">None</span></td></tr>
        <tr><td>Minimum Browser Version</td><td>Chrome 88+</td><td>Firefox 109+</td></tr>
      </tbody>
    </table>
  </div>
</section>




<style>
.csl-usecases{background:#f8fafc;padding:88px 24px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;}
.csl-usecases h2{text-align:center;font-size:clamp(26px,3.5vw,40px);font-weight:800;color:#0f172a;margin:0 0 12px;line-height:1.2;}
.csl-usecases-sub{text-align:center;font-size:16px;color:#94a3b8;max-width:560px;margin:0 auto 56px;}
.csl-uc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;max-width:1100px;margin:0 auto;}
.csl-uc-card{background:#fff;border-radius:14px;padding:32px 28px;border:1px solid #e2e8f0;position:relative;overflow:hidden;transition:transform .2s,box-shadow .2s;}
.csl-uc-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:var(--uc-accent);}
.csl-uc-card:hover{transform:translateY(-4px);box-shadow:0 16px 40px rgba(0,0,0,.08);}
.csl-uc-icon{font-size:32px;margin-bottom:16px;line-height:1;}
.csl-uc-card h3{font-size:16px;font-weight:700;color:#0f172a;margin:0 0 10px;}
.csl-uc-card p{font-size:13px;line-height:1.75;color:#64748b;margin:0;}
.csl-uc-card code{background:#f1f5f9;color:#6366f1;padding:1px 5px;border-radius:3px;font-size:12px;}
</style>

<section class="csl-usecases">
  <p style="text-align:center;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6366f1;margin-bottom:14px;">Who Is It For?</p>
  <h2>Built for Every Developer<br>Who Touches the DOM</h2>
  <p class="csl-usecases-sub">CSS Selector Lens fits naturally into a wide range of developer workflows — front-end, backend, QA, and beyond.</p>

  <div class="csl-uc-grid">
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#6366f1,#818cf8);">
      <div class="csl-uc-icon">🧑‍💻</div>
      <h3>Front-End Developers</h3>
      <p>Stop manually reading the DOM tree. Click any element and get the exact child and descendant selectors you need to style it — with context on how many elements match.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#10b981,#34d399);">
      <div class="csl-uc-icon">🤖</div>
      <h3>QA &amp; Test Automation</h3>
      <p>Get reliable, unique selectors for Playwright, Puppeteer, Cypress, and Selenium. The match count badge immediately tells you if a selector is stable enough for a test assertion.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#f59e0b,#fb923c);">
      <div class="csl-uc-icon">🕷️</div>
      <h3>Web Scrapers &amp; Data Engineers</h3>
      <p>Identify stable, meaningful selectors for Python (BeautifulSoup, Scrapy) or JavaScript scripts. Ancestor path chains give you the full contextual selector chain instantly.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#8b5cf6,#c084fc);">
      <div class="csl-uc-icon">🎨</div>
      <h3>WordPress &amp; Theme Developers</h3>
      <p>Override WooCommerce, Elementor, or block theme styles precisely — without resorting to <code>!important</code>. Get the exact specificity chain the extension generates.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#ec4899,#f472b6);">
      <div class="csl-uc-icon">📚</div>
      <h3>CSS Learners &amp; Students</h3>
      <p>See how real websites are structured with live DOM selectors. An interactive way to understand child vs descendant vs pseudo-class selectors using actual page examples.</p>
    </div>
    <div class="csl-uc-card" style="--uc-accent:linear-gradient(90deg,#0ea5e9,#38bdf8);">
      <div class="csl-uc-icon">🔌</div>
      <h3>Browser Extension Developers</h3>
      <p>Quickly find DOM injection points and element targets for your own extensions or userscripts. The floating overlay Pick Mode is especially useful for this workflow.</p>
    </div>
  </div>
</section>

<p>The post <a href="https://php-freelancer.in/2026/05/07/css-selector-lens-the-devtools-extension-that-instantly-suggests-css-selectors-for-chrome-firefox/">CSS Selector Lens: The DevTools Extension That Instantly Suggests CSS Selectors for Chrome &#038; Firefox</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2026/05/07/css-selector-lens-the-devtools-extension-that-instantly-suggests-css-selectors-for-chrome-firefox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Preview Links for Shopify — Free Chrome Extension &#038; Mozilla Firefox Add-On</title>
		<link>https://php-freelancer.in/2026/04/27/preview-links-for-shopify-free-chrome-extension-mozilla-firefox-add-on/</link>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Mon, 27 Apr 2026 19:16:38 +0000</pubDate>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Add-on]]></category>
		<category><![CDATA[Extension]]></category>
		<guid isPermaLink="false">https://php-freelancer.in/?p=572</guid>

					<description><![CDATA[<p>Tired of navigating Admin → Themes → Preview every time you need a Shopify theme preview URL? This free Chrome Extension for Shopify — and its Mozilla Firefox Add-On for Shopify — lets you save, copy, and launch theme preview links in one click, right from your browser toolbar. 😤 The Problem Every Shopify Developer [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2026/04/27/preview-links-for-shopify-free-chrome-extension-mozilla-firefox-add-on/">Preview Links for Shopify — Free Chrome Extension &#038; Mozilla Firefox Add-On</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-center has-large-font-size wp-block-paragraph">Tired of navigating <strong>Admin → Themes → Preview</strong> every time you need a Shopify theme preview URL? This free <strong>Chrome Extension for Shopify</strong> — and its <strong>Mozilla Firefox Add-On for Shopify</strong> — lets you save, copy, and launch theme preview links in one click, right from your browser toolbar.</p>



<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-9e8ecbf6 wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-vivid-green-cyan-background-color has-background wp-element-button" href="https://chromewebstore.google.com/detail/preview-links-for-shopify/jiogmllbajhclohgppponhpaeijcoiel" style="border-radius:8px" target="_blank" rel="noopener noreferrer">🌐 Add to Chrome — Free</a></div>



<div class="wp-block-button"><a class="wp-block-button__link has-vivid-purple-background-color has-background wp-element-button" href="https://addons.mozilla.org/en-US/firefox/addon/shopify-theme-preview-links" style="border-radius:8px" target="_blank" rel="noopener noreferrer">🦊 Add to Firefox — Free</a></div>
</div>



<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>


<p class="has-text-align-center has-large-font-size wp-block-paragraph"><img decoding="async" src="https://php-freelancer.in/wp-content/uploads/2026/04/unnamed.jpg" /></p>


<h2 class="wp-block-heading">😤 The Problem Every Shopify Developer Knows</h2>



<p class="wp-block-paragraph">Every Shopify developer, theme designer, and store owner has wasted time on this exact workflow: open Shopify Admin → Online Store → Themes → click the three-dot menu → Preview → copy the URL from the address bar. Then do it again for the next store. And again the next day.</p>



<p class="wp-block-paragraph">Shopify theme preview URLs are long, unique, and impossible to memorise:</p>



<pre class="wp-block-code"><code>https:&#47;&#47;yourstore.myshopify.com/?preview_theme_id=123456789</code></pre>



<p class="wp-block-paragraph">There is no built-in browser tool to save and recall these per store — until this <strong>Shopify Chrome Extension</strong> and <strong>Shopify Firefox Add-On</strong> came along.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Preview Links for Shopify Stores</strong> is a free <strong>Chrome Extension</strong> and <strong>Mozilla Firefox Add-On</strong> that works as a dedicated preview link manager for Shopify themes. Save unlimited named links per store and access them in one click from your browser toolbar — no Admin navigation required.</p>
</blockquote>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">👥 Who Is This Chrome Extension &amp; Firefox Add-On For?</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading">🛒 Shopify Store Owners</h3>



<p class="wp-block-paragraph">Test and compare themes without touching the Admin each time. Use this <strong>Chrome Extension for Shopify</strong> to keep preview links for your live theme, staging theme, and any themes under review — all one click away.</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading">💻 Shopify Developers &amp; Agencies</h3>



<p class="wp-block-paragraph">Manage client preview links across multiple stores from a single popup. Whether you use Chrome or Firefox, this <strong>Shopify browser extension</strong> eliminates repetitive Admin navigation and lets you share preview URLs with clients in seconds.</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading">🎨 Theme Designers</h3>



<p class="wp-block-paragraph">Save a preview link for every iteration — &#8220;Dawn v2 test&#8221;, &#8220;Header Experiment&#8221;, &#8220;Client Approved&#8221;. Use the <strong>Mozilla Firefox Add-On for Shopify</strong> or the Chrome version and jump between theme variants instantly during design reviews.</p>
</div>
</div>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">⚡ Full Feature Breakdown</h2>



<p class="wp-block-paragraph">This <strong>Chrome Extension for Shopify</strong> and <strong>Mozilla Firefox Add-On for Shopify</strong> is purpose-built for one job and does it exceptionally well. Here is every feature in detail.</p>



<h3 class="wp-block-heading">1. 🌐 Automatic Shopify Store Detection</h3>



<p class="wp-block-paragraph">The moment you click the extension icon in Chrome or Firefox, it reads your active tab and <strong>automatically identifies which Shopify store you are on</strong> — no manual input needed. It handles three URL types:</p>



<figure class="wp-block-table"><table><thead><tr><th>URL Type</th><th>Example</th><th>How It&#8217;s Detected</th></tr></thead><tbody><tr><td><strong>Shopify Admin</strong></td><td><code>admin.shopify.com/store/handle</code></td><td>Store handle extracted from the Admin URL path</td></tr><tr><td><strong>myshopify.com subdomain</strong></td><td><code>handle.myshopify.com</code></td><td>Store handle extracted from the subdomain automatically</td></tr><tr><td><strong>Custom domain</strong></td><td><code>www.yourbrand.com</code></td><td>Auto-detected via <code>Shopify.shop</code> in page scripts, or one-time manual mapping</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A live <strong>status badge</strong> at the top of the popup always confirms which store&#8217;s links you are viewing — whether you are using the <strong>Chrome Extension</strong> or the <strong>Firefox Add-On</strong>.</p>



<h3 class="wp-block-heading">2. 🔗 Save Named Theme Preview Links Per Store</h3>



<p class="wp-block-paragraph">Add as many preview links as you need for each Shopify store. Each saved link holds:</p>



<ul class="wp-block-list">
<li><strong>Theme Name</strong> — a label you choose (e.g. &#8220;Dawn 5&#8221;, &#8220;Holiday Banner&#8221;, &#8220;Client Staging v3&#8221;)</li>



<li><strong>Preview URL</strong> — the full Shopify theme preview link</li>
</ul>



<p class="wp-block-paragraph">Links are <strong>organised per store automatically</strong>. Switch stores, the popup updates. No filters, no manual switching — whether you are in Chrome or Firefox.</p>



<h3 class="wp-block-heading">3. 📋 One-Click Copy with Visual Confirmation</h3>



<p class="wp-block-paragraph">Every link card has a <strong>Copy button</strong>. One click puts the preview URL on your clipboard instantly — ready to paste into Slack, email, or a client ticket. A visual <em>&#8220;Copied&#8221;</em> state on the button confirms it worked. No guesswork.</p>



<h3 class="wp-block-heading">4. 🚀 Open in New Tab or New Window</h3>



<p class="wp-block-paragraph">Each saved link has two direct launch options available in both the <strong>Chrome Extension</strong> and the <strong>Mozilla Add-On</strong>:</p>



<ul class="wp-block-list">
<li><strong>Open in New Tab</strong> — launches the preview URL in a new tab without closing the popup</li>



<li><strong>Open in New Window</strong> — perfect for side-by-side theme comparison across two monitors</li>
</ul>



<h3 class="wp-block-heading">5. 🗑️ Delete Links Instantly</h3>



<p class="wp-block-paragraph">Each link card has a delete button. Removing a link triggers a smooth fade-and-slide animation and the list refreshes instantly — no page reload, no confirmation dialogs in the way.</p>



<h3 class="wp-block-heading">6. 🔄 Smart Custom Domain Support</h3>



<p class="wp-block-paragraph">Shopify stores on custom domains (e.g. <code>www.yourbrand.com</code>) are fully supported in both the <strong>Chrome Extension for Shopify</strong> and the <strong>Firefox Add-On for Shopify</strong>, through two methods:</p>



<ul class="wp-block-list">
<li><strong>Auto-detection</strong> — the extension scans the page&#8217;s inline scripts for the standard <code>Shopify.shop</code> JavaScript variable present on all Shopify storefronts and maps the domain automatically. A green <em>&#8220;Auto-detected&#8221;</em> badge confirms success.</li>



<li><strong>Manual mapping</strong> — if auto-detection isn&#8217;t possible, a one-time prompt lets you type the store handle. The mapping is saved permanently — you never have to do it again.</li>
</ul>



<h3 class="wp-block-heading">7. 💾 Persistent Local Storage — Works Offline</h3>



<p class="wp-block-paragraph">All links are stored in the browser&#8217;s native <code>storage.local</code> API — the same secure mechanism used by both Chrome Extensions and Mozilla Firefox Add-Ons. This means:</p>



<ul class="wp-block-list">
<li>Links are <strong>available instantly, even offline</strong></li>



<li>Data <strong>survives browser restarts and extension updates</strong></li>



<li><strong>No account, no login, no server</strong> — your data never leaves your device</li>



<li>Unlimited stores, unlimited links</li>
</ul>



<h3 class="wp-block-heading">8. 🎨 Premium Dark-Mode UI</h3>



<p class="wp-block-paragraph">The popup uses a polished dark-mode interface with the Inter typeface — clean, compact, and distraction-free. Designed to get you in and out in under two seconds, whether you are using it as a <strong>Chrome Extension</strong> or a <strong>Mozilla Firefox Add-On</strong>.</p>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">🛠️ How to Use This Shopify Browser Extension</h2>



<ol class="wp-block-list">
<li><strong>Install</strong> the <strong>Chrome Extension for Shopify</strong> from the Chrome Web Store, or the <strong>Mozilla Firefox Add-On for Shopify</strong> from Firefox Add-Ons (AMO) — both linked below.</li>



<li><strong>Navigate</strong> to any Shopify store — admin panel, <code>.myshopify.com</code>, or a custom domain.</li>



<li><strong>Click the extension icon</strong> in your Chrome or Firefox toolbar. The store is detected automatically.</li>



<li><strong>Add a link</strong> — enter a theme name and paste the preview URL, then click <em>Save Link</em>.</li>



<li><strong>Use your links</strong> — copy to clipboard, open in a new tab, or open in a new window.</li>



<li><strong>Switch between stores</strong> freely. The popup always shows only the links for your current active store.</li>
</ol>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">🔒 Privacy &amp; Security</h2>



<p class="wp-block-paragraph">This <strong>Chrome Extension</strong> and <strong>Mozilla Add-On</strong> was built with a strict privacy-first approach:</p>



<ul class="wp-block-list">
<li><strong>Zero data sent to any server</strong> — all storage is local to your browser</li>



<li><strong>No analytics, no tracking, no telemetry</strong> of any kind</li>



<li><strong>Minimal permissions</strong> — only <code>storage</code>, <code>tabs</code>, <code>activeTab</code>, <code>scripting</code>, and <code>windows</code></li>



<li>The content script only scans for <code>Shopify.shop</code> in inline scripts — it never reads form fields, passwords, or personal data</li>
</ul>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading has-text-align-center">📦 Download the Free Shopify Chrome Extension &amp; Firefox Add-On</h2>



<p class="has-text-align-center wp-block-paragraph">Approved and listed on both official browser stores. 100% free, no account required.</p>



<div class="wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center">🌐 Chrome Extension for Shopify</h3>



<p class="has-text-align-center wp-block-paragraph">Download this <strong>Shopify Chrome Extension</strong> from the official Google Chrome Web Store. Also works on all Chromium-based browsers including <strong>Brave</strong>, <strong>Microsoft Edge</strong>, and <strong>Opera</strong>.</p>



<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe0a7de2 wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-vivid-green-cyan-background-color has-background wp-element-button" href="https://chromewebstore.google.com/detail/preview-links-for-shopify/jiogmllbajhclohgppponhpaeijcoiel" style="border-radius:8px" target="_blank" rel="noopener noreferrer">Install Chrome Extension →</a></div>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center">🦊 Mozilla Firefox Add-On for Shopify</h3>



<p class="has-text-align-center wp-block-paragraph">Download this <strong>Shopify Firefox Add-On</strong> from the official Mozilla Add-Ons site (addons.mozilla.org). Compatible with the latest Firefox on Windows, macOS, and Linux.</p>



<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe0a7de2 wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-vivid-purple-background-color has-background wp-element-button" href="https://addons.mozilla.org/en-US/firefox/addon/shopify-theme-preview-links" style="border-radius:8px" target="_blank" rel="noopener noreferrer">Install Firefox Add-On →</a></div>
</div>
</div>
</div>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">❓ Frequently Asked Questions</h2>



<h3 class="wp-block-heading">Is this Chrome Extension for Shopify free?</h3>



<p class="wp-block-paragraph">Yes — completely free. No paid plans, no premium tiers, no subscriptions. Both the <strong>Chrome Extension</strong> and the <strong>Mozilla Firefox Add-On</strong> are free to install and use forever.</p>



<h3 class="wp-block-heading">Does this Shopify Firefox Add-On work on custom domains?</h3>



<p class="wp-block-paragraph">Yes. Both the <strong>Chrome Extension for Shopify</strong> and the <strong>Mozilla Firefox Add-On for Shopify</strong> automatically detect Shopify stores on custom domains using the standard <code>Shopify.shop</code> JavaScript variable. If auto-detection fails, a simple one-time manual prompt lets you link the domain to your store handle permanently.</p>



<h3 class="wp-block-heading">Can I manage multiple Shopify stores?</h3>



<p class="wp-block-paragraph">Yes. Links are stored per store automatically in both the <strong>Chrome Extension</strong> and the <strong>Firefox Add-On</strong>. When you visit a different Shopify store, the popup shows only that store&#8217;s links. There is no limit on the number of stores or links.</p>



<h3 class="wp-block-heading">Will my links be saved after a browser restart?</h3>



<p class="wp-block-paragraph">Yes. Data is stored in the browser&#8217;s native local storage and persists across restarts and extension/add-on updates. Links are removed only when you manually delete them or uninstall the <strong>Chrome Extension</strong> or <strong>Mozilla Add-On</strong>.</p>



<h3 class="wp-block-heading">Does the Chrome Extension also work on Brave, Edge, or Opera?</h3>



<p class="wp-block-paragraph">Yes. Because it is built as a standard <strong>Chrome Extension</strong>, it works on any Chromium-based browser. Install it from the Chrome Web Store and it runs identically on Brave, Microsoft Edge, and Opera — no extra configuration needed.</p>



<h3 class="wp-block-heading">Is the Mozilla Firefox Add-On officially approved?</h3>



<p class="wp-block-paragraph">Yes. This <strong>Mozilla Firefox Add-On for Shopify</strong> is reviewed and officially listed on <a href="https://addons.mozilla.org/en-US/firefox/addon/shopify-theme-preview-links" target="_blank" rel="noopener noreferrer">addons.mozilla.org</a>. The <strong>Chrome Extension for Shopify</strong> is equally approved and listed on the <a href="https://chromewebstore.google.com/detail/preview-links-for-shopify/jiogmllbajhclohgppponhpaeijcoiel" target="_blank" rel="noopener noreferrer">Chrome Web Store</a>.</p>



<h3 class="wp-block-heading">Is my Shopify store data safe?</h3>



<p class="wp-block-paragraph">Absolutely. Neither the <strong>Chrome Extension</strong> nor the <strong>Mozilla Add-On</strong> sends any data to external servers. Everything is stored locally in your browser. There is no tracking, no analytics, and no network requests of any kind.</p>



<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="has-text-align-center has-large-font-size wp-block-paragraph">Stop repeating the Admin → Themes → Preview roundtrip. Install this free <strong>Chrome Extension for Shopify</strong> or <strong>Mozilla Firefox Add-On for Shopify</strong> today and get every theme preview link one click away — forever.</p>



<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-9e8ecbf6 wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-vivid-green-cyan-background-color has-background wp-element-button" href="https://chromewebstore.google.com/detail/preview-links-for-shopify/jiogmllbajhclohgppponhpaeijcoiel" style="border-radius:8px" target="_blank" rel="noopener noreferrer">🌐 Get Chrome Extension</a></div>



<div class="wp-block-button"><a class="wp-block-button__link has-vivid-purple-background-color has-background wp-element-button" href="https://addons.mozilla.org/en-US/firefox/addon/shopify-theme-preview-links" style="border-radius:8px" target="_blank" rel="noopener noreferrer">🦊 Get Firefox Add-On</a></div>
</div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://php-freelancer.in/2026/04/27/preview-links-for-shopify-free-chrome-extension-mozilla-firefox-add-on/">Preview Links for Shopify — Free Chrome Extension &#038; Mozilla Firefox Add-On</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Difference Between em, rem and vw in CSS (With Examples)</title>
		<link>https://php-freelancer.in/2026/03/27/difference-between-em-rem-and-vw-in-css-with-examples/</link>
					<comments>https://php-freelancer.in/2026/03/27/difference-between-em-rem-and-vw-in-css-with-examples/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Fri, 27 Mar 2026 13:07:04 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Frontend Development]]></category>
		<category><![CDATA[Web Design]]></category>
		<guid isPermaLink="false">https://php-freelancer.in/?p=482</guid>

					<description><![CDATA[<p>Choosing the right CSS unit can quietly make or break your layout. It affects readability, responsiveness, and how maintainable your code is over time. If you’ve ever wondered when to use em, rem, or vw, you’re not alone. Instead of just definitions, let’s walk through how these units actually behave in real projects—and which one [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2026/03/27/difference-between-em-rem-and-vw-in-css-with-examples/">Difference Between em, rem and vw in CSS (With Examples)</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="p3">Choosing the right CSS unit can quietly make or break your layout. It affects readability, responsiveness, and how maintainable your code is over time. If you’ve ever wondered when to use em, rem, or vw, you’re not alone.</p>
<p class="p3">Instead of just definitions, let’s walk through how these units actually behave in real projects—and which one you should rely on most of the time.</p>
<hr />
<h2><b>Understanding the Core Difference</b></h2>
<p class="p3">At a high level, all three units are relative, but they are relative to different things:</p>
<ul>
<li>
<p class="p1">em → relative to the parent element</p>
</li>
<li>
<p class="p1">rem → relative to the root (html)</p>
</li>
<li>
<p class="p1">vw → relative to the viewport width (screen size)</p>
</li>
</ul>
<p class="p3">That single difference changes everything in how they behave.</p>
<hr />
<h2><b>em: Flexible but Can Get Tricky</b></h2>
<p class="p3">The em unit scales based on its parent’s font size. This makes it powerful for components, but also easy to misuse.</p>
<pre><code>.parent {
font-size: 20px;
}

.child {
font-size: 2em; /* 40px */
}</code></pre>
<p class="p1">Now imagine nesting:</p>
<pre><code>.child {
  font-size: 2em; /* 40px */
}

.grandchild {
  font-size: 2em; /* 80px */
}</code></pre>
<p class="p1">This compounding effect is where things can go out of control in complex layouts.</p>
<p class="p1">Where em works well:</p>
<p class="p1">It shines inside self-contained components where you want elements to scale relative to each other—like buttons, cards, or modals.</p>
<hr />
<h2><b>rem: The Reliable Default</b></h2>
<p class="p1">If you want consistency across your entire project, rem is your best friend.</p>
<p class="p1">It always refers back to the root (html) font size:</p>
<pre><code>html {
  font-size: 16px;
}

h1 {
  font-size: 2.5rem; /* 40px */
}</code></pre>
<p class="p1">No matter where the element sits in the DOM, the value stays predictable.</p>
<p class="p1">This is why most modern CSS systems prefer rem for typography and spacing.</p>
<hr />
<h2><b>vw: Built for Responsiveness</b></h2>
<p class="p1">vw is tied directly to the screen width.</p>
<pre><code>.container {
  width: 90vw;
}</code></pre>
<p class="p1">This means your layout automatically adapts:</p>
<ul>
<li>
<p class="p1">Larger screen → bigger layout</p>
</li>
<li>
<p class="p1">Smaller screen → smaller layout</p>
</li>
</ul>
<p class="p1">It’s perfect for fluid designs, but using it alone for text can cause issues—text may become too small on mobile or too large on wide screens.</p>
<hr />
<h2><b>A Practical Base Setup</b></h2>
<p class="p1">Here’s a clean starting point that works for most websites:</p>
<pre><code>html {
  font-size: 16px;
}

body {
  font-size: 1rem;
}

h1 {
  font-size: 2.5rem;
}

.container {
  width: 90vw;
}</code></pre>
<p class="p1">This gives you consistency + responsiveness without complexity.</p>
<hr />
<h2><b>Modern Best Practice: Using clamp()</b></h2>
<p class="p1">One of the most practical techniques in modern CSS is combining rem and vw using clamp().</p>
<pre><code>h1 {
  font-size: clamp(1.5rem, 4vw, 3rem);
}</code></pre>
<p class="p1">What’s happening here:</p>
<ul>
<li>
<p class="p1">Minimum → 1.5rem (24px)</p>
</li>
<li>
<p class="p1">Fluid → 4vw (scales with screen)</p>
</li>
<li>
<p class="p1">Maximum → 3rem (48px cap)</p>
</li>
</ul>
<p class="p1">This ensures your text is always readable and never extreme.</p>
<hr />
<h2><b>More Real-World clamp() Examples</b></h2>
<h3><b>Responsive Heading</b></h3>
<pre><code>h2 {
  font-size: clamp(1.25rem, 3vw, 2.5rem);
}</code></pre>
<h3><b>Paragraph Text</b></h3>
<pre><code>p {
  font-size: clamp(0.9rem, 1.2vw, 1.1rem);
}</code></pre>
<h3><b>Section Spacing</b></h3>
<pre><code>.section {
  padding: clamp(1rem, 5vw, 4rem);
}</code></pre>
<h3><b>Container Width</b></h3>
<pre><code>.container {
  width: clamp(300px, 80vw, 1200px);
}</code></pre>
<hr />
<h2><b>Why clamp() is Better Than Media Queries (Sometimes)</b></h2>
<p class="p3">Instead of writing multiple breakpoints like this:</p>
<pre><code>@media (max-width: 768px) {
  h1 { font-size: 24px; }
}</code></pre>
<p class="p1">You can often replace it with one clean line using clamp().</p>
<p class="p1">Less code, smoother scaling.</p>
<hr />
<h2><b>So, Which One Should You Use?</b></h2>
<p class="p1">In real-world projects, the answer isn’t choosing one—it’s combining them smartly.</p>
<ul>
<li>
<p class="p1">Use rem for typography and spacing</p>
</li>
<li>
<p class="p1">Use vw for layout and responsiveness</p>
</li>
<li>
<p class="p1">Use em only when component-level scaling is needed</p>
</li>
<li>
<p class="p1">Use clamp() to balance everything</p>
</li>
</ul>
<p class="p1">If you stick to one rule:</p>
<p class="p1">Default to rem, enhance with vw, control with clamp().</p>
<hr />
<h2><b>Final Thoughts</b></h2>
<p class="p1">Good CSS isn’t about using fancy units—it’s about choosing predictable, scalable patterns.</p>
<p class="p1">Start simple:</p>
<ul>
<li>
<p class="p1">rem → foundation</p>
</li>
<li>
<p class="p1">vw → responsiveness</p>
</li>
<li>
<p class="p1">clamp() → control</p>
</li>
</ul>
<p class="p1">Once you get this combination right, your layouts become much easier to manage as your project grows.</p>
<p>The post <a href="https://php-freelancer.in/2026/03/27/difference-between-em-rem-and-vw-in-css-with-examples/">Difference Between em, rem and vw in CSS (With Examples)</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2026/03/27/difference-between-em-rem-and-vw-in-css-with-examples/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Logmatic.io &#8211; Data Analyzer Platform for Log and Events</title>
		<link>https://php-freelancer.in/2016/11/17/logmatic-io-data-analyzer-platform-log-events/</link>
					<comments>https://php-freelancer.in/2016/11/17/logmatic-io-data-analyzer-platform-log-events/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Thu, 17 Nov 2016 03:16:20 +0000</pubDate>
				<category><![CDATA[Review]]></category>
		<guid isPermaLink="false">http://php-freelancer.in/?p=440</guid>

					<description><![CDATA[<p>Many companies are using cloud computing for their system and data but saving data on cloud is not enough to get best results for business. To product best results every data, log, event need to analyze to find out where things are wrong and what need to do to improve it. Logmatic is a data [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2016/11/17/logmatic-io-data-analyzer-platform-log-events/">Logmatic.io &#8211; Data Analyzer Platform for Log and Events</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Many companies are using cloud computing for their system and data but saving data on cloud is not enough to get best results for business. To product best results every data, log, event need to analyze to find out where things are wrong and what need to do to improve it. <a href="http://logmatic.io/">Logmatic</a> is a data analyzer platform for Log and Events by which you can analyze any type of log or Machine Events. It will show lots of results in terms of charts, reports etc. We are explaning its features in this review with some videos.</p>
<ol>
<li>First of all when you heard about new thing, then you get many question in mind, that how it will work, how it will look, will it give best results etc..etc.. So for that Logmatic.io providing you free trial for 14 days. You can signup and use it free for 14 days and check all features and results. We know after signup for free trial you will love it because it have lots of features which you cant ignore.</li>
<li>Important is it is very easy to setup, you dont need to process or configure any log, data, events. You just send any type of logs to Logmatic.io and it will process that log, event for you. In short you will not need any agent to process your logs.</li>
<li>Many automated integration examples available for Logmatic like Windows, Linux, Heroku or docker logs, devices with iOS, code language with PHP Symfony or Ruby on Rails, browsers with JS library, servers with Apache &amp; NGINX.</li>
<li>You will find for other platforms you need to put provided code on your server, but for Logmatic no need to put any Logmatic.io code to your server.</li>
<li>It works with Apache, Ngnix, Firewalls, Syslogs, Key/value patterns. If you are working with nodejs then <a href="http://logmatic.io/blog/efficient-json-logging-with-nodejs/">your nodejs logging</a> can be effectively done by Logmatic.io.</li>
<li>To investigate user can use many complex queries like AND, OR, exclusions, Wildcards. It have very powerful investigate capacity.</li>
<li>Granular level bring down to log level. It also show you real time search and real time log.</li>
<li>Best things for user is it provide beautiful, dynamic dashboards for data visualization. There are many things available on dashboard are pie charts based on counts / sums / averages / percentiles / calculated metrics, Time series &amp; filtered metrics, geo flow charts, maps, pivot table. By a single click it will show you lots of log, data, filtered data which is very useful.</li>
<li>Logmatic have alert system too by which you can get alerts for log analyses, search queries, user thresholds via email, Slack, Pagerduty, HipChat.</li>
<li>For developers, they can integrate Logmatic to other apps, CRM, and BI tools via RESTful API.</li>
<li>Developers can run and deploy test from user interface, it can easily recognize Operating system,Smart phone Devices, Web browsers etc..</li>
</ol>
<p>&nbsp;</p>
<h2>Video for Dynamic Dashboard :</h2>
<p><iframe title="Dynamic dashboarding" src="https://player.vimeo.com/video/164403047?dnt=1&amp;app_id=122963" width="1290" height="726" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe></p>
<h2>Video of Investigation :</h2>
<p><iframe title="Smooth Investigation" src="https://player.vimeo.com/video/167433345?dnt=1&amp;app_id=122963" width="1290" height="726" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe></p>
<h2>Video of Data collection :</h2>
<p><iframe title="Simple Data Collection with Logmatic.io" src="https://player.vimeo.com/video/161001764?dnt=1&amp;app_id=122963" width="1290" height="726" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe></p>
<p>Logmatic is best log and event management plaform avaulable out there. Its feature are very useful and easy to use. Its design is cool. They have alomost eveything a log and event management platform should have. Signup and try it! We are sure you will surely like it. If you are using this then let us know your experience in comments or have any query then ask in comments!</p>
<p>The post <a href="https://php-freelancer.in/2016/11/17/logmatic-io-data-analyzer-platform-log-events/">Logmatic.io &#8211; Data Analyzer Platform for Log and Events</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2016/11/17/logmatic-io-data-analyzer-platform-log-events/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Remove Styling Of Telephone Numbers From Web Page</title>
		<link>https://php-freelancer.in/2015/07/09/remove-styling-of-telephone-numbers-from-web-page/</link>
					<comments>https://php-freelancer.in/2015/07/09/remove-styling-of-telephone-numbers-from-web-page/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Thu, 09 Jul 2015 09:21:10 +0000</pubDate>
				<category><![CDATA[HTML]]></category>
		<guid isPermaLink="false">http://php-freelancer.in/?p=428</guid>

					<description><![CDATA[<p>Hi, Is your website having default blue hyperlink colour from a telephone number when viewed on an iPhone? Sometimes if your site have telephone number on page then on iphone it shows link blue link and even after using CSS on it, it still shows blue. I also got this issue on one of my [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2015/07/09/remove-styling-of-telephone-numbers-from-web-page/">Remove Styling Of Telephone Numbers From Web Page</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hi, Is your website having default blue hyperlink colour from a telephone number when viewed on an iPhone? Sometimes if your site have telephone number on page then on iphone it shows link blue link and even after using CSS on it, it still shows blue. I also got this issue on one of my website I was working and then finally I found solution of it by Apple-Specific Meta Tag Keys.<span id="more-428"></span><br />
If you want to remove this default link on telephone number on iphone then you need to use below apple specific meta tag :</p>
<pre class="brush: plain; title: ; notranslate">&lt;meta name=&quot;format-detection&quot; content=&quot;telephone=no&quot;&gt;</pre>
<p>Put above meta tag in &#8220;&lt;head&gt;&#8221; tag of your webpage and then you will see that default link on telephone number will be removed.</p>
<p>I hope this post solve your time and issue. Let me know if you have any thoughts in comments.</p>
<p>The post <a href="https://php-freelancer.in/2015/07/09/remove-styling-of-telephone-numbers-from-web-page/">Remove Styling Of Telephone Numbers From Web Page</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2015/07/09/remove-styling-of-telephone-numbers-from-web-page/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Solution of Fatal error: Call to undefined function w3tc_button_link()</title>
		<link>https://php-freelancer.in/2013/10/23/solution-fatal-error-call-undefined-function-w3tc_button_link/</link>
					<comments>https://php-freelancer.in/2013/10/23/solution-fatal-error-call-undefined-function-w3tc_button_link/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Wed, 23 Oct 2013 14:24:04 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Call to undefined function w3tc_button_link()]]></category>
		<category><![CDATA[Fatal error: Call to undefined function w3tc_button_link()]]></category>
		<guid isPermaLink="false">http://php-freelancer.in/?p=410</guid>

					<description><![CDATA[<p>Hello Friends, WordPress have lots of plugins and we really like to use new plugins in our site to improve our site performance but sometimes some plugins create problems with another plugin and while installing new plugin or in already installed it gives errors. $20 00 USD Same situation I faced some days ago.While installing [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2013/10/23/solution-fatal-error-call-undefined-function-w3tc_button_link/">Solution of Fatal error: Call to undefined function w3tc_button_link()</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hello Friends, WordPress have lots of plugins and we really like to use new plugins in our site to improve our site performance but sometimes some plugins create problems with another plugin and while installing new plugin or in already installed it gives errors. $20 00 USD Same situation I faced some days ago.While installing a new plugin I was getting this error : Fatal error: Call to undefined function w3tc_button_link(), You might get this error in already installed plugin page.<span id="more-410"></span></p>
<p>Now I am working alone as <strong>PHP Freelancer</strong> and I have to solve this error from myself. So I knew that this error came because of W3 Total Cache plugin, Even you uninstalled this plugin you can get this error. So I was just amazed that I uninstalled plugin but still I am getting error related to this plugin.So after searching I found that we need to remove somethings related to w3 total cache plugin manually.</p>
<p>So below are one file and one folder which you have to remove manually to get rid of this error :</p>
<p>1. Folder: /wp-content/cache/</p>
<p>2. File: /wp-content/advanced-cache.php</p>
<p>Delete these one folder and one file from your wordpress site and Voila!~ You will see error solved.  This will surely solve your issue.</p>
<p>If you have any other problem related to this then you can post in comment or if you have any other easy solution write down in comments.</p>
<p>The post <a href="https://php-freelancer.in/2013/10/23/solution-fatal-error-call-undefined-function-w3tc_button_link/">Solution of Fatal error: Call to undefined function w3tc_button_link()</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2013/10/23/solution-fatal-error-call-undefined-function-w3tc_button_link/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Use Social Sharing Toolkit Plugin Outside Loop</title>
		<link>https://php-freelancer.in/2013/08/16/wordpress-use-social-sharing-toolkit-plugin-outside-loop/</link>
					<comments>https://php-freelancer.in/2013/08/16/wordpress-use-social-sharing-toolkit-plugin-outside-loop/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Fri, 16 Aug 2013 14:17:19 +0000</pubDate>
				<category><![CDATA[Wordpress Plugins]]></category>
		<category><![CDATA[social sharing toolkit outside loop]]></category>
		<guid isPermaLink="false">http://php-freelancer.in/?p=397</guid>

					<description><![CDATA[<p>Social Sharing Toolkit is very nice social plugin, it works smoothly. In this article I will show you how you can use Social Sharing Toolkit Plugin Outside Loop. Sometimes we need to show social icons outside wordpress loop and outside loop things doesn&#8217;t work properly, So thats why I thought to share it here. If [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2013/08/16/wordpress-use-social-sharing-toolkit-plugin-outside-loop/">WordPress Use Social Sharing Toolkit Plugin Outside Loop</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="http://wordpress.org/plugins/social-sharing-toolkit/" target="_blank">Social Sharing Toolkit</a> is very nice social plugin, it works smoothly. In this article I will show you how you can use Social Sharing Toolkit Plugin Outside Loop. Sometimes we need to show social icons outside wordpress loop and outside loop things doesn&#8217;t work properly, So thats why I thought to share it here.<span id="more-397"></span></p>
<p>If you got a condition where you want to show social icons but you want to show it outside loop then you can use it as shown below :</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
    $social_sharing_toolkit = new MR_Social_Sharing_Toolkit();
    echo $social_sharing_toolkit-&gt;create_bookmarks();
?&gt;
</pre>
<p>Also if above solution not working for you it means your global variable for post data not set and thats why it is not getting post data and hence not working. So in that case you can use below code snippet in which you can pass post link and post title.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
    $social_sharing_toolkit = new MR_Social_Sharing_Toolkit();
    echo $social_sharing_toolkit-&gt;create_bookmarks('{your-link}', '{your-title}');
?&gt;
</pre>
<p>So in above snippet you need to replace &#8216;{your-link}&#8217; with your post link variable and &#8216;{your-title}&#8217; variable with post title variable. So this is way by which you can use social sharing toolkit plugin outside loop.</p>
<p>If you are facing any issue to use this plugin then write down in comments I will try to help you.</p>
<p>The post <a href="https://php-freelancer.in/2013/08/16/wordpress-use-social-sharing-toolkit-plugin-outside-loop/">WordPress Use Social Sharing Toolkit Plugin Outside Loop</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2013/08/16/wordpress-use-social-sharing-toolkit-plugin-outside-loop/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How To Work With jQuery Multiple Elements With Same Id</title>
		<link>https://php-freelancer.in/2013/08/07/how-to-work-with-jquery-multiple-elements-with-same-id/</link>
					<comments>https://php-freelancer.in/2013/08/07/how-to-work-with-jquery-multiple-elements-with-same-id/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Wed, 07 Aug 2013 13:48:14 +0000</pubDate>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery multiple element with same id]]></category>
		<guid isPermaLink="false">http://php-freelancer.in/?p=391</guid>

					<description><![CDATA[<p>Hello Friends, In this post I wil explain how to Work with jQuery multiple elements with same id. In simple way if you use id to select all div having same ids then it will select first id only but if you want to select ,want go through each div or any other element with [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2013/08/07/how-to-work-with-jquery-multiple-elements-with-same-id/">How To Work With jQuery Multiple Elements With Same Id</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hello Friends, In this post I wil explain how to Work with jQuery multiple elements with same id. In simple way if you use id to select all div having same ids then it will select first id only but if you want to select ,want go through each div or any other element with same id then I will explain you how you can do that.<span id="more-391"></span></p>
<p>So we will take simple example in which there are six div tags three div have id &#8216;red&#8217; and other three have id &#8216;green&#8217;, on page load we will simple make background color red for id &#8216;red&#8217; divs and green for id &#8216;green&#8217;. So below is html :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;red&quot;&gt;1&lt;/div&gt;
&lt;div id=&quot;green&quot;&gt;2&lt;/div&gt;
&lt;div id=&quot;red&quot;&gt;3&lt;/div&gt;
&lt;div id=&quot;green&quot;&gt;4&lt;/div&gt;
&lt;div id=&quot;red&quot;&gt;5&lt;/div&gt;
&lt;div id=&quot;green&quot;&gt;6&lt;/div&gt;
</pre>
<p>Now below is jQuery code :</p>
<pre class="brush: jscript; title: ; notranslate">
$(function() {
 $('&#x5B;id=&quot;red&quot;]').css('background-color', 'red');
 $('&#x5B;id=&quot;green&quot;]').css('background-color', 'green');
});
</pre>
<p>So above code will make all red id div to red and green id div to green color. We have used attribute here by using id to go through each id. Usually we use simple &#8216;#&#8217; with id like this :</p>
<pre class="brush: jscript; title: ; notranslate">
$(function() {
 $('#red').css('background-color', 'red');
 $('#green').css('background-color', 'green');
});
</pre>
<p>mostly we use above code but above code only make first div red and first div green and dont do anything with other elements, So to go through each element with same id we can use attribute as I shown in second code.</p>
<p>Usually in html there shouldn&#8217;t be multiple elements with same id but if you got any case in which you have multiple elements with same id you can use this code it will work smoothly.</p>
<p>Below is jsfiddle in which you can see live preview of above code :</p>
<p><iframe loading="lazy" src="http://jsfiddle.net/phpaddicted/gQXgy/embedded/" height="200" width="625" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>I hope this code will help you. If you have any thoughts or suggestion you can post them in comments.</p>
<p>The post <a href="https://php-freelancer.in/2013/08/07/how-to-work-with-jquery-multiple-elements-with-same-id/">How To Work With jQuery Multiple Elements With Same Id</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2013/08/07/how-to-work-with-jquery-multiple-elements-with-same-id/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How To Get or Select Child Element Of Previous Element In jQuery</title>
		<link>https://php-freelancer.in/2013/08/05/how-to-get-or-select-child-element-of-previous-element-in-jquery/</link>
					<comments>https://php-freelancer.in/2013/08/05/how-to-get-or-select-child-element-of-previous-element-in-jquery/#respond</comments>
		
		<dc:creator><![CDATA[Ankur]]></dc:creator>
		<pubDate>Mon, 05 Aug 2013 15:58:30 +0000</pubDate>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Select Child element in jQuery]]></category>
		<guid isPermaLink="false">http://php-freelancer.in/?p=387</guid>

					<description><![CDATA[<p>Hello Friends,In this article I am going to explain how you can get first child element of previous element in jQuery. If you have ul li and a link below it then clicking on link you want to select first li of ul above link. Below I am going to explain how you can achieve [&#8230;]</p>
<p>The post <a href="https://php-freelancer.in/2013/08/05/how-to-get-or-select-child-element-of-previous-element-in-jquery/">How To Get or Select Child Element Of Previous Element In jQuery</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hello Friends,In this article I am going to explain how you can get first child element of previous element in jQuery. If you have ul li and a link below it then clicking on link you want to select first li of ul above link. Below I am going to explain how you can achieve it.<span id="more-387"></span></p>
<p>So I am taking one example, So I can explain all things easily. We have one ul with five li elements and below ul we have one link with id &#8216;test&#8217;. Now when page loads, on base of link we will select first li of above ul and make first li background color RED.Here is our HTML :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul&gt;
&lt;li&gt;list item 1&lt;/li&gt;
&lt;li&gt;list item 2&lt;/li&gt;
&lt;li&gt;list item 3&lt;/li&gt;
&lt;li&gt;list item 4&lt;/li&gt;
&lt;li&gt;list item 5&lt;/li&gt;
&lt;/ul&gt;
&lt;a id=&quot;test&quot;&gt;Select First li from above ul&lt;/div&gt;
</pre>
<p>Below is jQuery to select first li on the base of a link with id &#8220;test&#8221; :</p>
<pre class="brush: jscript; title: ; notranslate">
$(function() {
   $('#test').prevAll(&quot;ul&quot;).children(&quot;li:first&quot;).css('background-color', 'red');
});
</pre>
<p>Now you can see in above code we just call jquery code when page load to select first child element of previous element. So when page load jQuery will get to previous ul then find first children of selected ul by using &#8216;children(&#8220;li:first&#8221;)&#8217; and then make its background color RED.</p>
<p>Here is <a href="http://jsfiddle.net/phpaddicted/kDRBN/1/" target="_blank">jsfiddle</a> to see this example result live :<br />
<iframe loading="lazy" src="http://jsfiddle.net/phpaddicted/kDRBN/1/embedded/" height="300" width="625" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>If you want to select first child of previous element by click on link or button then you can call click event and then use above code accordingly. I hope this code help you and save your time. If you have any other idea or trick to achieve same result then do let us know in comments.</p>
<p>I am <a title="PHP Freelancer" href="http://php-freelancer.in/" target="_blank">PHP Freelancer</a>, <a title="Hire PHP Developer India" href="http://php-freelancer.in/" target="_blank">Hire PHP Developer India</a> and <a title="PHP Freelancer India" href="http://php-freelancer.in/" target="_blank">PHP Freelancer India</a>. If you have any projects related to WordPress or PHP you can <a href="http://php-freelancer.in/contact-me/" target="_blank">contact me</a>.</p>
<p>The post <a href="https://php-freelancer.in/2013/08/05/how-to-get-or-select-child-element-of-previous-element-in-jquery/">How To Get or Select Child Element Of Previous Element In jQuery</a> appeared first on <a href="https://php-freelancer.in">Shopify Freelancer | Wordpress Freelancer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://php-freelancer.in/2013/08/05/how-to-get-or-select-child-element-of-previous-element-in-jquery/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
