A free, production-ready astro.js template powered by Tailwind CSS and TypeScript, specifically designed for Shopify. Utilizes the Shopify Storefront API through GraphQL and providing everything you need to jumpstart your Astro project and save valuable time.
+
+## 📌 Key Features
+
+- 🌐 Dynamic Products from Shopify Storefront API
+- 💸 Checkout and Payments with Shopify
+- 🌞 Automatic Light/Dark Mode
+- 🚀 Fetching and Caching Paradigms
+- 🔗 Server Actions for Mutations
+- 🔐 User Authentication
+- 🧩 Similar Products Suggestions
+- 🔍 Search, Sort, Different Views Functionality
+- 🏷️ Tags & Categories & Vendors & Price Range & Product Variants Functionality
+- 🖼️ Single Product Image Zoom, Hover Effect, Slider
+- 🛒 Cart & Easy editing options for cart items
+- 📝 Product Description on Multiple Tabs
+- 🔗 Netlify Setting Pre-configured
+- 📞 Support Contact Form
+- 📱 Fully Responsive
+- 🔄 Dynamic Home Banner Slider
+- 📝 Write and Update Content in Markdown / MDX
+- ⌛ Infinite Product Load on Scrolling
+
+### 📄 10+ Pre-designed Pages
+
+- 🏠 Homepage
+- 👤 About
+- 📞 Contact
+- 🛍️ Products
+- 📦 Product Single
+- 💡 Terms of services
+- 📄 Privacy Policy
+- 🔐 Login
+- 🔑 Register
+- 🚫 Custom 404
+
+## 🚀 Getting Started
+
+### 📦 Dependencies
+
+- shopify
+- astro 5.1+
+- node v20.10+
+- npm v10.2+
+- tailwind v3.4+
+
+
+
+## 🛒 Retrieve Shopify Token & Add Demo Products
+
+- To get the tokens needed, create a Shopify partner account.
+ 
+
+- Now go to 'stores' and select 'Add store.' Create a development store using the option 'Create development store'.
+ 
+
+- Click on import products.
+ 
+
+- Locate the 'products' CSV file in the public folder of the repository and upload it for demo products.
+ 
+
+- On the admin dashboard, click on ‘Settings’ at the bottom of the left sidebar.
+ 
+
+- On the Settings page, click on ‘Apps and sales channels’ on the left sidebar.
+ 
+
+- In the Apps and sales channels page that opens, click on ‘Develop apps’ on the top right.
+ 
+
+- Now, on the App development page that opens, click on ‘Create an app’.
+ 
+
+- A ‘Create an app’ popup opens. Fill in any name in the ‘App Name’ text box. In the App Developer text box, your name and email id is automatically fetched. Else type in the same email id you used while signing up for the Shopify store.
+ 
+
+- Next, click on ‘Configure’ in the Storefront API integration section.
+ 
+
+- In the Storefront API access scopes, select and check all the boxes and click on ‘Save’ and then ‘Install app’.
+ 
+
+- Navigate to the 'API credentials' tab and locate three essential pieces of information. Subsequently, update your `.env` file by replacing the placeholder quotes("") in the `.env.example` file with your Shopify credentials.
+ 
+
+- When adding your product, use the same alt title for images with the same color. This helps the first image appear as the color variant in the selector.
+ 
+ 
+
+- We have the option to create additional collections for products.
+ 
+
+### 👉 Install Dependencies
+
+```bash
+npm install
+```
+
+### 👉 Development Command
+
+```bash
+npm run dev
+```
+
+### 👉 Build Command
+
+```bash
+npm run build
+```
+
+
+
+## 🐞 Reporting Issues
+
+We use GitHub Issues as the official bug tracker for this Template. Please Search [existing issues](https://github.com/themefisher/astrofront/issues). It’s possible someone has already reported the same problem.
+If your problem or idea has not been addressed yet, feel free to [open a new issue](https://github.com/themefisher/astrofront/issues).
+
+
+
+## 📝 License
+
+Copyright (c) 2024 - Present, Designed & Developed by [Themefisher](https://themefisher.com/)
+
+**Code License:** Released under the [MIT](https://github.com/themefisher/astrofront/blob/main/LICENSE) license.
+
+**Image license:** The images are only for demonstration purposes. They have their license, we don't have permission to share those images.
+
+## 💻 Need Custom Development Services?
+
+If you need a custom theme, theme customization, or complete website development services from scratch you can [Hire Us](https://themefisher.com/).
diff --git a/astro.config.mjs b/astro.config.mjs
new file mode 100644
index 0000000..37bd1b5
--- /dev/null
+++ b/astro.config.mjs
@@ -0,0 +1,56 @@
+import mdx from "@astrojs/mdx";
+import react from "@astrojs/react";
+import sitemap from "@astrojs/sitemap";
+import tailwind from "@astrojs/tailwind";
+import AutoImport from "astro-auto-import";
+import { defineConfig } from "astro/config";
+import remarkCollapse from "remark-collapse";
+import remarkToc from "remark-toc";
+import config from "./src/config/config.json";
+
+import vercel from "@astrojs/vercel";
+
+// https://astro.build/config
+export default defineConfig({
+ site: config.site.base_url ? config.site.base_url : "http://examplesite.com",
+ base: config.site.base_path ? config.site.base_path : "/",
+ trailingSlash: config.site.trailing_slash ? "always" : "never",
+ output: "server",
+
+ integrations: [
+ react(),
+ sitemap(),
+ tailwind({ applyBaseStyles: false }),
+ AutoImport({
+ imports: [
+ "@/shortcodes/Button",
+ "@/shortcodes/Accordion",
+ "@/shortcodes/Notice",
+ "@/shortcodes/Video",
+ "@/shortcodes/Youtube",
+ "@/shortcodes/Tabs",
+ "@/shortcodes/Tab",
+ ],
+ }),
+ mdx(),
+ ],
+
+ markdown: {
+ remarkPlugins: [
+ remarkToc,
+ [
+ remarkCollapse,
+ {
+ test: "Table of contents",
+ },
+ ],
+ ],
+ shikiConfig: {
+ theme: "one-dark-pro",
+ wrap: true,
+ },
+ extendDefaultPlugins: true,
+ },
+
+ adapter: vercel(),
+});
\ No newline at end of file
diff --git a/config/nginx/nginx.conf b/config/nginx/nginx.conf
new file mode 100644
index 0000000..6f810a3
--- /dev/null
+++ b/config/nginx/nginx.conf
@@ -0,0 +1,31 @@
+worker_processes 1;
+
+events {
+ worker_connections 1024;
+}
+
+http {
+ server {
+ listen 80;
+ server_name _;
+
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ include /etc/nginx/mime.types;
+
+ gzip on;
+ gzip_min_length 1000;
+ gzip_proxied expired no-cache no-store private auth;
+ gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
+
+ error_page 404 /404.html;
+ location = /404.html {
+ root /usr/share/nginx/html;
+ internal;
+ }
+
+ location / {
+ try_files $uri ${uri}.html $uri/index.html =404;
+ }
+ }
+}
diff --git a/netlify.toml b/netlify.toml
new file mode 100644
index 0000000..4b04bea
--- /dev/null
+++ b/netlify.toml
@@ -0,0 +1,6 @@
+[build]
+publish = "dist"
+command = "yarn build"
+
+[build.environment]
+NODE_VERSION = "20"
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..e27ea3c
--- /dev/null
+++ b/package.json
@@ -0,0 +1,73 @@
+{
+ "name": "Astrofront",
+ "version": "2.0.0",
+ "description": "Astro and Tailwindcss boilerplate",
+ "author": "Themefisher",
+ "license": "MIT",
+ "packageManager": "yarn@1.22.19",
+ "scripts": {
+ "dev": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "format": "prettier -w ./src",
+ "check": "astro check",
+ "remove-darkmode": "node scripts/removeDarkmode.js && yarn format"
+ },
+ "dependencies": {
+ "@astrojs/check": "^0.9.4",
+ "@astrojs/mdx": "4.0.5",
+ "@astrojs/netlify": "6.0.1",
+ "@astrojs/node": "^9.0.0",
+ "@astrojs/react": "4.1.3",
+ "@astrojs/rss": "4.0.11",
+ "@astrojs/sitemap": "^3.2.1",
+ "@astrojs/tailwind": "5.1.4",
+ "@astrojs/vercel": "^8.0.1",
+ "@nanostores/react": "^0.8.4",
+ "astro": "5.1.5",
+ "astro-auto-import": "^0.4.4",
+ "astro-font": "^0.1.81",
+ "date-fns": "^4.1.0",
+ "github-slugger": "^2.0.0",
+ "gray-matter": "^4.0.3",
+ "js-cookie": "^3.0.5",
+ "marked": "^15.0.6",
+ "multi-range-slider-react": "^2.0.7",
+ "nanostores": "^0.11.3",
+ "prettier-plugin-astro": "^0.14.1",
+ "prettier-plugin-tailwindcss": "^0.6.9",
+ "prop-types": "^15.8.1",
+ "react": "^19.0.0",
+ "react-collapsed": "^4.2.0",
+ "react-dom": "^19.0.0",
+ "react-gravatar": "^2.6.3",
+ "react-icons": "^5.4.0",
+ "react-inner-image-zoom": "^3.0.2",
+ "react-lite-youtube-embed": "^2.4.0",
+ "remark-collapse": "^0.1.2",
+ "remark-toc": "^9.0.0",
+ "swiper": "^11.2.1"
+ },
+ "devDependencies": {
+ "@tailwindcss/forms": "^0.5.10",
+ "@tailwindcss/typography": "^0.5.16",
+ "@types/js-cookie": "^3.0.6",
+ "@types/marked": "^5.0.2",
+ "@types/node": "22.10.5",
+ "@types/react": "19.0.4",
+ "@types/react-dom": "19.0.2",
+ "@types/react-gravatar": "^2.6.14",
+ "@types/react-inner-image-zoom": "^3.0.3",
+ "autoprefixer": "^10.4.20",
+ "eslint": "^9.18.0",
+ "postcss": "^8.4.49",
+ "prettier": "^3.4.2",
+ "prettier-plugin-astro": "^0.14.1",
+ "prettier-plugin-tailwindcss": "^0.6.9",
+ "sass": "^1.83.1",
+ "sharp": "0.33.5",
+ "tailwind-bootstrap-grid": "^5.1.0",
+ "tailwindcss": "^3.4.17",
+ "typescript": "^5.7.3"
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..12a703d
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..cf0c6ba
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,88 @@
+##### Optimize default expiration time - BEGIN
+
+
+ ## Enable expiration control
+ ExpiresActive On
+
+ ## CSS and JS expiration: 1 week after request
+ ExpiresByType text/css "now plus 1 week"
+ ExpiresByType application/javascript "now plus 1 week"
+ ExpiresByType application/x-javascript "now plus 1 week"
+
+ ## Image files expiration: 1 month after request
+ ExpiresByType image/bmp "now plus 1 month"
+ ExpiresByType image/gif "now plus 1 month"
+ ExpiresByType image/jpeg "now plus 1 month"
+ ExpiresByType image/webp "now plus 1 month"
+ ExpiresByType image/jp2 "now plus 1 month"
+ ExpiresByType image/pipeg "now plus 1 month"
+ ExpiresByType image/png "now plus 1 month"
+ ExpiresByType image/svg+xml "now plus 1 month"
+ ExpiresByType image/tiff "now plus 1 month"
+ ExpiresByType image/x-icon "now plus 1 month"
+ ExpiresByType image/ico "now plus 1 month"
+ ExpiresByType image/icon "now plus 1 month"
+ ExpiresByType text/ico "now plus 1 month"
+ ExpiresByType application/ico "now plus 1 month"
+ ExpiresByType image/vnd.wap.wbmp "now plus 1 month"
+
+ ## Font files expiration: 1 month after request
+ ExpiresByType application/x-font-ttf "now plus 1 month"
+ ExpiresByType application/x-font-opentype "now plus 1 month"
+ ExpiresByType application/x-font-woff "now plus 1 month"
+ ExpiresByType font/woff2 "now plus 1 month"
+ ExpiresByType image/svg+xml "now plus 1 month"
+
+ ## Audio files expiration: 1 month after request
+ ExpiresByType audio/ogg "now plus 1 month"
+ ExpiresByType application/ogg "now plus 1 month"
+ ExpiresByType audio/basic "now plus 1 month"
+ ExpiresByType audio/mid "now plus 1 month"
+ ExpiresByType audio/midi "now plus 1 month"
+ ExpiresByType audio/mpeg "now plus 1 month"
+ ExpiresByType audio/mp3 "now plus 1 month"
+ ExpiresByType audio/x-aiff "now plus 1 month"
+ ExpiresByType audio/x-mpegurl "now plus 1 month"
+ ExpiresByType audio/x-pn-realaudio "now plus 1 month"
+ ExpiresByType audio/x-wav "now plus 1 month"
+
+ ## Movie files expiration: 1 month after request
+ ExpiresByType application/x-shockwave-flash "now plus 1 month"
+ ExpiresByType x-world/x-vrml "now plus 1 month"
+ ExpiresByType video/x-msvideo "now plus 1 month"
+ ExpiresByType video/mpeg "now plus 1 month"
+ ExpiresByType video/mp4 "now plus 1 month"
+ ExpiresByType video/quicktime "now plus 1 month"
+ ExpiresByType video/x-la-asf "now plus 1 month"
+ ExpiresByType video/x-ms-asf "now plus 1 month"
+
+##### Optimize default expiration time - END
+
+##### 1 Month for most static resources
+
+ Header set Cache-Control "max-age=2592000, public"
+
+
+##### Enable gzip compression for resources
+
+ mod_gzip_on Yes
+ mod_gzip_dechunk Yes
+ mod_gzip_item_include file .(html?|txt|css|js|php)$
+ mod_gzip_item_include handler ^cgi-script$
+ mod_gzip_item_include mime ^text/.*
+ mod_gzip_item_include mime ^application/x-javascript.*
+ mod_gzip_item_exclude mime ^image/.*
+ mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
+
+
+##### Or, compress certain file types by extension:
+
+ SetOutputFilter DEFLATE
+
+
+##### Set Header Vary: Accept-Encoding
+
+
+ Header append Vary: Accept-Encoding
+
+
\ No newline at end of file
diff --git a/public/images/404.png b/public/images/404.png
new file mode 100644
index 0000000..cefbfb3
Binary files /dev/null and b/public/images/404.png differ
diff --git a/public/images/aboutUs.png b/public/images/aboutUs.png
new file mode 100644
index 0000000..4d8ddef
Binary files /dev/null and b/public/images/aboutUs.png differ
diff --git a/public/images/avatar-sm.png b/public/images/avatar-sm.png
new file mode 100644
index 0000000..e1699dc
Binary files /dev/null and b/public/images/avatar-sm.png differ
diff --git a/public/images/avatar.png b/public/images/avatar.png
new file mode 100644
index 0000000..387b035
Binary files /dev/null and b/public/images/avatar.png differ
diff --git a/public/images/banner.png b/public/images/banner.png
new file mode 100644
index 0000000..109a87d
Binary files /dev/null and b/public/images/banner.png differ
diff --git a/public/images/call-to-action.png b/public/images/call-to-action.png
new file mode 100644
index 0000000..894926c
Binary files /dev/null and b/public/images/call-to-action.png differ
diff --git a/public/images/category-1.png b/public/images/category-1.png
new file mode 100644
index 0000000..ac97291
Binary files /dev/null and b/public/images/category-1.png differ
diff --git a/public/images/category-2.png b/public/images/category-2.png
new file mode 100644
index 0000000..60dc213
Binary files /dev/null and b/public/images/category-2.png differ
diff --git a/public/images/favicon.png b/public/images/favicon.png
new file mode 100644
index 0000000..ed03218
Binary files /dev/null and b/public/images/favicon.png differ
diff --git a/public/images/image-placeholder.png b/public/images/image-placeholder.png
new file mode 100644
index 0000000..a61a0c0
Binary files /dev/null and b/public/images/image-placeholder.png differ
diff --git a/public/images/logo-darkmode.png b/public/images/logo-darkmode.png
new file mode 100644
index 0000000..9bd3f47
Binary files /dev/null and b/public/images/logo-darkmode.png differ
diff --git a/public/images/logo.png b/public/images/logo.png
new file mode 100644
index 0000000..b57573d
Binary files /dev/null and b/public/images/logo.png differ
diff --git a/public/images/no-search-found copy.png b/public/images/no-search-found copy.png
new file mode 100644
index 0000000..d88966b
Binary files /dev/null and b/public/images/no-search-found copy.png differ
diff --git a/public/images/no-search-found.png b/public/images/no-search-found.png
new file mode 100644
index 0000000..d88966b
Binary files /dev/null and b/public/images/no-search-found.png differ
diff --git a/public/images/og-image.png b/public/images/og-image.png
new file mode 100644
index 0000000..86531d5
Binary files /dev/null and b/public/images/og-image.png differ
diff --git a/public/images/payment/bkash.png b/public/images/payment/bkash.png
new file mode 100644
index 0000000..67512e6
Binary files /dev/null and b/public/images/payment/bkash.png differ
diff --git a/public/images/payment/express.png b/public/images/payment/express.png
new file mode 100644
index 0000000..2b71076
Binary files /dev/null and b/public/images/payment/express.png differ
diff --git a/public/images/payment/mastercard.png b/public/images/payment/mastercard.png
new file mode 100644
index 0000000..d419554
Binary files /dev/null and b/public/images/payment/mastercard.png differ
diff --git a/public/images/payment/nagad.png b/public/images/payment/nagad.png
new file mode 100644
index 0000000..30e59c8
Binary files /dev/null and b/public/images/payment/nagad.png differ
diff --git a/public/images/payment/upay.png b/public/images/payment/upay.png
new file mode 100644
index 0000000..44aa9fb
Binary files /dev/null and b/public/images/payment/upay.png differ
diff --git a/public/images/payment/visa.png b/public/images/payment/visa.png
new file mode 100644
index 0000000..0f59990
Binary files /dev/null and b/public/images/payment/visa.png differ
diff --git a/public/images/product-1.png b/public/images/product-1.png
new file mode 100644
index 0000000..48180db
Binary files /dev/null and b/public/images/product-1.png differ
diff --git a/public/images/product_image404.jpg b/public/images/product_image404.jpg
new file mode 100644
index 0000000..ca0848f
Binary files /dev/null and b/public/images/product_image404.jpg differ
diff --git a/public/images/quote.svg b/public/images/quote.svg
new file mode 100644
index 0000000..666fb97
--- /dev/null
+++ b/public/images/quote.svg
@@ -0,0 +1,4 @@
+
diff --git a/public/images/staff/staff.png b/public/images/staff/staff.png
new file mode 100644
index 0000000..f2f77b8
Binary files /dev/null and b/public/images/staff/staff.png differ
diff --git a/public/products.csv b/public/products.csv
new file mode 100644
index 0000000..36c9566
--- /dev/null
+++ b/public/products.csv
@@ -0,0 +1,177 @@
+Handle,Title,Body (HTML),Vendor,Product Category,Type,Tags,Published,Option1 Name,Option1 Value,Option2 Name,Option2 Value,Option3 Name,Option3 Value,Variant SKU,Variant Grams,Variant Inventory Tracker,Variant Inventory Qty,Variant Inventory Policy,Variant Fulfillment Service,Variant Price,Variant Compare At Price,Variant Requires Shipping,Variant Taxable,Variant Barcode,Image Src,Image Position,Image Alt Text,Gift Card,SEO Title,SEO Description,Google Shopping / Google Product Category,Google Shopping / Gender,Google Shopping / Age Group,Google Shopping / MPN,Google Shopping / Condition,Google Shopping / Custom Product,Google Shopping / Custom Label 0,Google Shopping / Custom Label 1,Google Shopping / Custom Label 2,Google Shopping / Custom Label 3,Google Shopping / Custom Label 4,Variant Image,Variant Weight Unit,Variant Tax Code,Cost per item,Included / Bangladesh,Price / Bangladesh,Compare At Price / Bangladesh,Included / International,Price / International,Compare At Price / International,Included / Mexico,Price / Mexico,Compare At Price / Mexico,Status
+iron-lantern-desk,Iron Lantern Desk,"
About this item
+
+
Matte Black Finish
+
Clear Glass Shade
+
Convenient ON/OFF cord switch
+
Lamp measures: L:9"" x W:5.75"" x H:19""
+
Uses 1 x 40W equivalent standard medium base bulb (not included). For full vintage look, Type T45 Edison bulb is recommended
+
Available in a variety of finishes
Note: Products with electrical plugs are designed for use in the US. Outlets and voltage differ internationally and this product may require an adapter or converter for use in your destination. Please check compatibility before purchasing.
",Nextcart Nexus,,,,TRUE,Title,Default Title,,,,,SKU: HP-400,0,shopify,0,deny,manual,6400,,FALSE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11062497_48473_Converted_5_1.png?v=1700128020,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+experience-modern-elegance-in-innovative-lighting-designs,Experience Modern Elegance in Innovative Lighting Designs,"
+
Sleek, Contemporary Glow
+
",Nextcart Nexus,,,,TRUE,Title,Default Title,,,,,SKU: HP-300,0,shopify,0,deny,manual,5300,,FALSE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11062497_48473_Converted_5.png?v=1700127953,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+explore-radiant-illumination-for-your-space,Explore Radiant Illumination for Your Space,"
+
Radiant, Stylish Table Lamps
+
",Nextcart Nexus,,,,FALSE,Title,Default Title,,,,,SKU:HP-200,0,shopify,0,deny,manual,5200,,FALSE,FALSE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11062497_48473_Converted_3.png?v=1700127894,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+styles-accessories-new-table-lamp,Styles Accessories & New Table Lamp,"
+
Work light, LED, white
+
",Nextcart Nexus,,,,TRUE,Title,Default Title,,,,,SKU:HP-100,0,shopify,0,deny,manual,5100,,FALSE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/Group1000005037.png?v=1700127851,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+single-pendant,Single Pendant,"Endsley 1-Light Globe LED Pendant Available in a range of contemporary colour choices to suit any existing décor, this three-light pendant is ideal for casting a spotlight on special areas of your home. Well-suited for kitchen islands or highlighting a standout item of furniture, the pendant is also height adjustable.",Urban Lights Emporium,Home & Garden > Lighting > Lamps,Indoor,"Shine, Spotlight, Wood",TRUE,Size,Long,,,,,SKU: LU-100,20000,shopify,54,deny,manual,4200,5999,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/14.2.webp?v=1700106487,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+single-pendant,,,,,,,,,Medium,,,,,SKU: LU-101,20000,shopify,54,deny,manual,4200,5999,TRUE,TRUE,,,,,,,,,,,,,,,,,,,,kg,,,,,,,,,,,,
+single-pendant,,,,,,,,,Short,,,,,SKU: LU-102,20000,shopify,54,deny,manual,4200,5999,TRUE,TRUE,,,,,,,,,,,,,,,,,,,,kg,,,,,,,,,,,,
+light-drum-pendant,Light Drum Pendant,"Endsley 1-Light Globe LED Pendant Available in a range of contemporary colour choices to suit any existing décor, this three-light pendant is ideal for casting a spotlight on special areas of your home. Well-suited for kitchen islands or highlighting a standout item of furniture, the pendant is also height adjustable.",Company 123,,,"Ambient, Glow, Modern, Wood",TRUE,Title,Default Title,,,,,SKU: WC-100,7000,shopify,54,deny,manual,2567,,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/13.1.webp?v=1700105562,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+silk-drum-lamp-shade-silk-drum-lamp-shade-silk-drum-lamp-shade-silk-drum-lamp-shade,Silk Drum Lamp Shade,"Endsley 1-Light Globe LED Pendant Available in a range of contemporary colour choices to suit any existing décor, this three-light pendant is ideal for casting a spotlight on special areas of your home. Well-suited for kitchen islands or highlighting a standout item of furniture, the pendant is also height adjustable",Company 123,Home & Garden > Lighting Accessories > Lamp Shades,Indoor,"Bedroom, Elegant, Shine, Style",TRUE,Title,Default Title,,,,,SKU: LS-100,2000,shopify,0,deny,manual,3200,4200,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/9.2.webp?v=1700105177,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+light-ceiling-light,Light Ceiling Light,"Endsley 1-Light Globe LED Pendant Available in a range of contemporary colour choices to suit any existing décor, this three-light pendant is ideal for casting a spotlight on special areas of your home. Well-suited for kitchen islands or highlighting a standout item of furniture, the pendant is also height adjustable",Artisan Globe Lamps,,,"Bedroom, Shine, Spotlight, Style",TRUE,Size,Height: 6 inches,Color,55555E,,,SKU: CL-001,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.1.webp?v=1700060656,1,55555E,FALSE,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.1.webp?v=1700060656,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+light-ceiling-light,,,,,,,,,Height: 6 inches,,C08C60,,,SKU: CL-002,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.2.webp?v=1700060664,2,C08C60,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.2.webp?v=1700060664,kg,,,,,,,,,,,,
+light-ceiling-light,,,,,,,,,Height: 6 inches,,D1D6D4,,,SKU: CL-003,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.3.webp?v=1700060673,3,D1D6D4,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.3.webp?v=1700060673,kg,,,,,,,,,,,,
+light-ceiling-light,,,,,,,,,Height: 8 inches,,55555E,,,SKU: CL-004,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.1.webp?v=1700060656,kg,,,,,,,,,,,,
+light-ceiling-light,,,,,,,,,Height: 8 inches,,C08C60,,,SKU: CL-005,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.2.webp?v=1700060664,kg,,,,,,,,,,,,
+light-ceiling-light,,,,,,,,,Height: 8 inches,,D1D6D4,,,SKU: CL-006,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.3.webp?v=1700060673,kg,,,,,,,,,,,,
+light-ceiling-light,,,,,,,,,Height: 10 inches,,55555E,,,SKU: CL-007,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.1.webp?v=1700060656,kg,,,,,,,,,,,,
+light-ceiling-light,,,,,,,,,Height: 10 inches,,C08C60,,,SKU: CL-008,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.2.webp?v=1700060664,kg,,,,,,,,,,,,
+light-ceiling-light,,,,,,,,,Height: 10 inches,,D1D6D4,,,SKU: CL-009,15000,shopify,54,deny,manual,3600,5600,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/8.3.webp?v=1700060673,kg,,,,,,,,,,,,
+bedside-lamp,Bedside Lamp,"
+
Product Details
+
The Flos Arco Terra is a timeless piece of design created by the famous Castiglioni brothers for Flos. It features a white marble base, a satin stainless steel stem and a shiny aluminum reflector. The light source is a dimmable LED, making it perfect for any space. This classic Table lamp comes in a size of 232 h. 175, with a height of 175 cm. The E27 socket and the 1x70w E27 bulb make it dimmable, though the dimmer is not included. The lamp can be used in multiple environments: bedroom, kitchen, living room, corridor or study. This arco lamp is one of the latest additions to Flos, a leading brand in floor lamp production. It is highly versatile, capable of fitting in different styles and adding a touch of elegance to a room's décor. The Arco Terra lamp is an excellent lighting solution that provides diffused and pleasant lighting, ideal for creating a warm and welcoming atmosphere.
+
+
Coffee
+
Tea
+
Milk
+
+
+
+
+
+
Delivery & Return
+
We want you to be happy with your purchase and we apologize if it is not...
The Flos Arco Terra is a timeless piece of design created by the famous Castiglioni brothers for Flos. It features a white marble base, a satin stainless steel stem and a shiny aluminum reflector. The light source is a dimmable LED, making it perfect for any space. This classic Table lamp comes in a size of 232 h. 175, with a height of 175 cm. The E27 socket and the 1x70w E27 bulb make it dimmable, though the dimmer is not included. The lamp can be used in multiple environments: bedroom, kitchen, living room, corridor or study. This arco lamp is one of the latest additions to Flos, a leading brand in floor lamp production. It is highly versatile, capable of fitting in different styles and adding a touch of elegance to a room's décor. The Arco Terra lamp is an excellent lighting solution that provides diffused and pleasant lighting, ideal for creating a warm and welcoming atmosphere.
+
+
asdf
+
sdafdfh
+
sdg
+
+
+
+
+
--- split content ---
+
+
+
+
+
+
Delivery & Return
+
We want you to be happy with your purchase and we apologize if it is not. For whatever reason that you are not satisfied, we would be most happy to provide exchanges and returns for all items purchased from us if the following conditions are met.
+
+
All exchanges and returns would need to be raised within 10 days of the invoice date for Singaporeorders, and 20 days for overseas orders. For local deliveries, there is an option to exchange at any of our boutiques within Singaporeor through our online portal at www.company.com. All requests for returns however, would need to be strictly made online at www.company.com for both local and overseas deliveries.
+
+
+
+
Weight
+
1KG
+
+
+
Height
+
2Feet
+
+
+
",Company 123,,Indoor,"Bedroom, Copper, Shedding",TRUE,Title,Default Title,,,,,,0,shopify,0,deny,manual,59.99,75,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/copper_light.jpg?v=1700127477,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+polyester-empire-lamp,Polyester Empire Lamp,"Endsley 1-Light Globe LED Pendant Available in a range of contemporary colour choices to suit any existing décor, this three-light pendant is ideal for casting a spotlight on special areas of your home. Well-suited for kitchen islands or highlighting a standout item of furniture, the pendant is also height adjustable.",Nextcart Nexus,Home & Garden > Lighting Accessories > Lamp Shades,Indoor,"Ambient, Cotton, Wireless",TRUE,Size,Diameter: 8 inches,Color,363638,,,SKU: PL-001,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.1.webp?v=1700056902,1,363638,FALSE,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.1.webp?v=1700056902,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+polyester-empire-lamp,,,,,,,,,Diameter: 8 inches,,D8D6D2,,,SKU: PL-002,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.3.webp?v=1700056918,2,D8D6D2,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.3.webp?v=1700056918,kg,,,,,,,,,,,,
+polyester-empire-lamp,,,,,,,,,Diameter: 8 inches,,C5C8C7,,,SKU: PL-003,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.2.webp?v=1700056929,3,C5C8C7,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.2.webp?v=1700056929,kg,,,,,,,,,,,,
+polyester-empire-lamp,,,,,,,,,Diameter: 10 inches,,363638,,,SKU: PL-004,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.1.webp?v=1700056902,kg,,,,,,,,,,,,
+polyester-empire-lamp,,,,,,,,,Diameter: 10 inches,,D8D6D2,,,SKU: PL-005,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.3.webp?v=1700056918,kg,,,,,,,,,,,,
+polyester-empire-lamp,,,,,,,,,Diameter: 10 inches,,C5C8C7,,,SKU: PL-006,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.2.webp?v=1700056929,kg,,,,,,,,,,,,
+polyester-empire-lamp,,,,,,,,,Diameter: 12 inches,,363638,,,SKU: PL-007,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.1.webp?v=1700056902,kg,,,,,,,,,,,,
+polyester-empire-lamp,,,,,,,,,Diameter: 12 inches,,D8D6D2,,,SKU: PL-008,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.3.webp?v=1700056918,kg,,,,,,,,,,,,
+polyester-empire-lamp,,,,,,,,,Diameter: 12 inches,,C5C8C7,,,SKU: PL-009,2000,shopify,13,deny,manual,1890,2100,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/11.2.webp?v=1700056929,kg,,,,,,,,,,,,
+cotton-novelty-pendant,Cotton Novelty Pendant,"
if you change your mind. Get a refund/replacement & free return shipping if it arrives damaged or not as describedsdfsadf
+
+
+
",Urban Lights Emporium,,Indoor,"Cotton, Glowing, Style",TRUE,Title,Default Title,,,,,,4000,shopify,13,deny,manual,29.99,40,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/12.4_70960657-8474-4871-b445-4bd05ca28cc4.webp?v=1700043545,1,,FALSE,,,,,,,,,,,,,,,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+novelty-pendant,Novelty Pendant,"Endsley 1-Light Globe LED Pendant Available in a range of contemporary colour choices to suit any existing décor, this three-light pendant is ideal for casting a spotlight on special areas of your home. Well-suited for kitchen islands or highlighting a standout item of furniture, the pendant is also height adjustable...",Ecoglow Designs,,Indoor,"Shine, Spotlight, Style",TRUE,Color,697978,Size,Long Wire,,,TL-RD-001,10000,shopify,45,deny,manual,780,820,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.1.webp?v=1700028934,1,697978,FALSE,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.1.webp?v=1700028934,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+novelty-pendant,,,,,,,,,697978,,Short Wire,,,TL-RD-003,10000,shopify,45,deny,manual,780,820,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.2.webp?v=1700028944,2,DCDBD7,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.1.webp?v=1700028934,kg,,,,,,,,,,,,
+novelty-pendant,,,,,,,,,697978,,Medium Wire,,,TL-RD-005,10000,shopify,45,deny,manual,780,820,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.1.webp?v=1700028934,kg,,,,,,,,,,,,
+novelty-pendant,,,,,,,,,DCDBD7,,Long Wire,,,TL-RD-002,10000,shopify,45,deny,manual,780,820,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.2.webp?v=1700028944,kg,,,,,,,,,,,,
+novelty-pendant,,,,,,,,,DCDBD7,,Short Wire,,,TL-RD-004,10000,shopify,45,deny,manual,780,820,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.2.webp?v=1700028944,kg,,,,,,,,,,,,
+novelty-pendant,,,,,,,,,DCDBD7,,Medium Wire,,,TL-RD-006,10000,shopify,45,deny,manual,780,820,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/16.2.webp?v=1700028944,kg,,,,,,,,,,,,
+dome-pendant,Dome Pendant,"Endsley 1-Light Globe LED Pendant Available in a range of contemporary colour choices to suit any existing décor, this three-light pendant is ideal for casting a spotlight on special areas of your home. Well-suited for kitchen islands or highlighting a standout item of furniture, the pendant is also height adjustable.",Urban Lights Emporium,,Outdoor,"Ambient, Outdoor, Spotlight",TRUE,Size,Long Wire,Color,1D1D1D,,,CH-BR-001,6000,shopify,45,deny,manual,345,380,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/17.1.webp?v=1700027943,1,1D1D1D,FALSE,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/17.1.webp?v=1700027943,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+dome-pendant,,,,,,,,,Long Wire,,F4B390,,,,6000,shopify,45,deny,manual,345,380,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/17.2.webp?v=1700027969,2,F4B390,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/17.2.webp?v=1700027969,kg,,,,,,,,,,,,
+dome-pendant,,,,,,,,,Short Wire,,1D1D1D,,,CH-BR-002,6000,shopify,45,deny,manual,345,380,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/17.1.webp?v=1700027943,kg,,,,,,,,,,,,
+dome-pendant,,,,,,,,,Short Wire,,F4B390,,,,6000,shopify,45,deny,manual,345,380,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/17.2.webp?v=1700027969,kg,,,,,,,,,,,,
+mini-desk-lamp,Mini Desk Lamp,"Suspendisse eu ligula. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Nullam cursus lacinia erat. Nam at tortor in tellus interdum sagittis. Phasellus magna.",Artisan Globe Lamps,Home & Garden > Lighting > Lamps,Indoor,"Ambient, Elegant, Modern",TRUE,Color,413F3A,Size,Bedside: 24 inches,,,SKU: DL-001,0,shopify,45,deny,manual,99,110,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_carbon_black_2_2.jpg?v=1700459051,1,413F3A,FALSE,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_carbon_black_2_2.jpg?v=1700459051,kg,,,TRUE,,,TRUE,,,TRUE,,,active
+mini-desk-lamp,,,,,,,,,413F3A,,Living Room: 30 inches,,,SKU: DL-002,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_berry_red_2.jpg?v=1700459051,2,4B212A,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_carbon_black_2_2.jpg?v=1700459051,kg,,,,,,,,,,,,
+mini-desk-lamp,,,,,,,,,413F3A,,Reading: 60 inches,,,SKU: DL-003,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_steel_blue_2_3.jpg?v=1700459051,3,455562,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_carbon_black_2_2.jpg?v=1700459051,kg,,,,,,,,,,,,
+mini-desk-lamp,,,,,,,,,4B212A,,Bedside: 24 inches,,,SKU: DL-004,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_berry_red_2.jpg?v=1700459051,kg,,,,,,,,,,,,
+mini-desk-lamp,,,,,,,,,4B212A,,Living Room: 30 inches,,,SKU: DL-005,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_berry_red_2.jpg?v=1700459051,kg,,,,,,,,,,,,
+mini-desk-lamp,,,,,,,,,4B212A,,Reading: 60 inches,,,SKU: DL-006,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_berry_red_2.jpg?v=1700459051,kg,,,,,,,,,,,,
+mini-desk-lamp,,,,,,,,,455562,,Bedside: 24 inches,,,SKU: DL-007,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_steel_blue_2_3.jpg?v=1700459051,kg,,,,,,,,,,,,
+mini-desk-lamp,,,,,,,,,455562,,Living Room: 30 inches,,,SKU: DL-008,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_steel_blue_2_3.jpg?v=1700459051,kg,,,,,,,,,,,,
+mini-desk-lamp,,,,,,,,,455562,,Reading: 60 inches,,,SKU: DL-009,0,shopify,78,deny,manual,99,110,TRUE,TRUE,,,,,,,,,,,,,,,,,,,https://cdn.shopify.com/s/files/1/0631/6815/1720/files/90_mini_mini_desk_lamp_steel_blue_2_3.jpg?v=1700459051,kg,,,,,,,,,,,,
\ No newline at end of file
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..9ea0e6f
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Disallow: /api/*
\ No newline at end of file
diff --git a/scripts/removeDarkmode.js b/scripts/removeDarkmode.js
new file mode 100644
index 0000000..b04b2e7
--- /dev/null
+++ b/scripts/removeDarkmode.js
@@ -0,0 +1,96 @@
+const fs = require("fs");
+const path = require("path");
+
+(function () {
+ const rootDirs = ["src/pages", "src/hooks", "src/layouts", "src/styles"];
+
+ const deleteAssetList = [
+ "public/images/logo-darkmode.png",
+ "src/layouts/components/ThemeSwitcher.astro",
+ ];
+
+ const configFiles = [
+ {
+ filePath: "tailwind.config.js",
+ patterns: ["darkmode:\\s*{[^}]*},", 'darkMode:\\s*"class",'],
+ },
+ { filePath: "src/config/theme.json", patterns: ["colors.darkmode"] },
+ ];
+
+ const filePaths = [
+ {
+ filePath: "src/layouts/partials/Header.astro",
+ patterns: [
+ "]+)?\\s*(?:\\/\\>|>([\\s\\S]*?)<\\/ThemeSwitchers*>)",
+ ],
+ },
+ ];
+
+ filePaths.forEach(({ filePath, patterns }) => {
+ removeDarkModeFromFiles(filePath, patterns);
+ });
+
+ deleteAssetList.forEach(deleteAsset);
+ function deleteAsset(asset) {
+ try {
+ fs.unlinkSync(asset);
+ console.log(`${path.basename(asset)} deleted successfully!`);
+ } catch (error) {
+ console.error(`${asset} not found`);
+ }
+ }
+
+ rootDirs.forEach(removeDarkModeFromPages);
+ configFiles.forEach(removeDarkMode);
+
+ function removeDarkModeFromFiles(filePath, regexPatterns) {
+ const fileContent = fs.readFileSync(filePath, "utf8");
+ let updatedContent = fileContent;
+ regexPatterns.forEach((pattern) => {
+ const regex = new RegExp(pattern, "g");
+ updatedContent = updatedContent.replace(regex, "");
+ });
+ fs.writeFileSync(filePath, updatedContent, "utf8");
+ }
+
+ function removeDarkModeFromPages(directoryPath) {
+ const files = fs.readdirSync(directoryPath);
+
+ files.forEach((file) => {
+ const filePath = path.join(directoryPath, file);
+ const stats = fs.statSync(filePath);
+ if (stats.isDirectory()) {
+ removeDarkModeFromPages(filePath);
+ } else if (stats.isFile()) {
+ removeDarkModeFromFiles(filePath, [
+ '(?:(?!["])\\S)*dark:(?:(?![,;"])\\S)*',
+ ]);
+ }
+ });
+ }
+
+ function removeDarkMode(configFile) {
+ const { filePath, patterns } = configFile;
+ if (filePath === "tailwind.config.js") {
+ removeDarkModeFromFiles(filePath, patterns);
+ } else {
+ const contentFile = JSON.parse(fs.readFileSync(filePath, "utf8"));
+ patterns.forEach((pattern) => deleteNestedProperty(contentFile, pattern));
+ fs.writeFileSync(filePath, JSON.stringify(contentFile));
+ }
+ }
+
+ function deleteNestedProperty(obj, propertyPath) {
+ const properties = propertyPath.split(".");
+ let currentObj = obj;
+ for (let i = 0; i < properties.length - 1; i++) {
+ const property = properties[i];
+ if (currentObj.hasOwnProperty(property)) {
+ currentObj = currentObj[property];
+ } else {
+ return; // Property not found, no need to continue
+ }
+ }
+ delete currentObj[properties[properties.length - 1]];
+ }
+})();
diff --git a/src/.gitignore b/src/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/src/cartStore.ts b/src/cartStore.ts
new file mode 100644
index 0000000..a722740
--- /dev/null
+++ b/src/cartStore.ts
@@ -0,0 +1,74 @@
+import { atom, computed } from "nanostores";
+import Cookies from "js-cookie";
+import { getCart } from "@/lib/shopify";
+import {
+ addItem,
+ removeItem,
+ updateItemQuantity,
+} from "@/lib/utils/cartActions";
+import type { Cart } from "@/lib/shopify/types";
+
+// Atom to hold the cart state
+export const cart = atom(null);
+
+// Computed store for total quantity in the cart
+export const totalQuantity = computed(cart, (c) => (c ? c.totalQuantity : 0));
+
+// Atom to manage the layout view state (card or list)
+export const layoutView = atom<"card" | "list">("card");
+
+// Function to set a new layout view
+export function setLayoutView(view: "card" | "list") {
+ layoutView.set(view);
+}
+
+// Function to get the current layout view
+export function getLayoutView() {
+ return layoutView.get();
+}
+
+// Update cart state in the store
+export async function refreshCartState() {
+ const cartId = Cookies.get("cartId");
+ if (cartId) {
+ const currentCart = await getCart(cartId);
+ cart.set(currentCart as any);
+ }
+}
+
+// Add item to the cart and update state
+export async function addItemToCart(selectedVariantId: string) {
+ try {
+ await addItem(selectedVariantId);
+ await refreshCartState();
+ return "Added to cart";
+ } catch (error: any) {
+ throw new Error(error.message || "Failed to add to cart");
+ }
+}
+
+// Remove item from the cart and update state
+export async function removeItemFromCart(lineId: string) {
+ try {
+ await removeItem(lineId);
+ await refreshCartState();
+ return "Removed from cart";
+ } catch (error: any) {
+ throw new Error(error.message || "Failed to remove item from cart");
+ }
+}
+
+// Update item quantity in the cart and update state
+export async function updateCartItemQuantity(payload: {
+ lineId: string;
+ variantId: string;
+ quantity: number;
+}) {
+ try {
+ await updateItemQuantity(payload);
+ await refreshCartState();
+ return "Cart updated";
+ } catch (error: any) {
+ throw new Error(error.message || "Failed to update cart");
+ }
+}
diff --git a/src/config/config.json b/src/config/config.json
new file mode 100644
index 0000000..205bf7b
--- /dev/null
+++ b/src/config/config.json
@@ -0,0 +1,48 @@
+{
+ "site": {
+ "title": "Astrofront",
+ "base_url": "https://astrofront.vercel.app/",
+ "base_path": "/",
+ "trailing_slash": false,
+ "favicon": "/images/favicon.png",
+ "logo": "/images/logo.png",
+ "logo_darkmode": "/images/logo-darkmode.png",
+ "logo_width": "150",
+ "logo_height": "33",
+ "logo_text": "Astrofront"
+ },
+
+ "settings": {
+ "search": true,
+ "account": true,
+ "sticky_header": true,
+ "theme_switcher": true,
+ "default_theme": "system"
+ },
+
+ "params": {
+ "contact_form_action": "#",
+ "copyright": "Designed And Developed by [Themefisher](https://themefisher.com/)"
+ },
+
+ "navigation_button": {
+ "enable": true,
+ "label": "Get Started",
+ "link": "https://github.com/themefisher/astrofront"
+ },
+
+ "metadata": {
+ "meta_author": "Themefisher",
+ "meta_image": "/images/og-image.png",
+ "meta_description": "Shopify Storefront Boilerplate"
+ },
+
+ "shopify": {
+ "currencySymbol": "৳",
+ "currencyCode": "BDT",
+ "collections": {
+ "hero_slider": "hidden-homepage-carousel",
+ "featured_products": "featured-products"
+ }
+ }
+}
diff --git a/src/config/menu.json b/src/config/menu.json
new file mode 100644
index 0000000..2214f16
--- /dev/null
+++ b/src/config/menu.json
@@ -0,0 +1,59 @@
+{
+ "main": [
+ {
+ "name": "Home",
+ "url": "/"
+ },
+ {
+ "name": "Products",
+ "url": "/products"
+ },
+ {
+ "name": "Pages",
+ "url": "",
+ "hasChildren": true,
+ "children": [
+ {
+ "name": "About",
+ "url": "/about"
+ },
+ {
+ "name": "Contact",
+ "url": "/contact"
+ },
+ {
+ "name": "404 Page",
+ "url": "/404"
+ }
+ ]
+ },
+ {
+ "name": "Contact",
+ "url": "/contact"
+ }
+ ],
+ "footer": [
+ {
+ "name": "About",
+ "url": "/about"
+ },
+ {
+ "name": "Products",
+ "url": "/products"
+ },
+ {
+ "name": "Contact",
+ "url": "/contact"
+ }
+ ],
+ "footerCopyright": [
+ {
+ "name": "Privacy & Policy",
+ "url": "/privacy-policy"
+ },
+ {
+ "name": "Terms of Service",
+ "url": "/terms-services"
+ }
+ ]
+}
diff --git a/src/config/social.json b/src/config/social.json
new file mode 100644
index 0000000..733bce2
--- /dev/null
+++ b/src/config/social.json
@@ -0,0 +1,24 @@
+{
+ "main": [
+ {
+ "name": "facebook",
+ "icon": "FaFacebookF",
+ "link": "https://www.facebook.com/themefisher"
+ },
+ {
+ "name": "twitter",
+ "icon": "FaXTwitter",
+ "link": "https://x.com/themefisher"
+ },
+ {
+ "name": "linkedin",
+ "icon": "FaLinkedinIn",
+ "link": "https://bd.linkedin.com/company/themefisher"
+ },
+ {
+ "name": "github",
+ "icon": "FaGithub",
+ "link": "https://github.com/themefisher/astrofront"
+ }
+ ]
+}
diff --git a/src/config/theme.json b/src/config/theme.json
new file mode 100644
index 0000000..98e2abd
--- /dev/null
+++ b/src/config/theme.json
@@ -0,0 +1,44 @@
+{
+ "colors": {
+ "default": {
+ "theme_color": {
+ "primary": "#121212",
+ "body": "#fff",
+ "border": "#eaeaea",
+ "theme_light": "#f2f2f2",
+ "theme_dark": "#000"
+ },
+ "text_color": {
+ "default": "#444",
+ "dark": "#000",
+ "light": "#666"
+ }
+ },
+ "darkmode": {
+ "theme_color": {
+ "primary": "#fff",
+ "body": "#252525",
+ "border": "#3E3E3E",
+ "theme_light": "#222222",
+ "theme_dark": "#000"
+ },
+ "text_color": {
+ "default": "#DDD",
+ "dark": "#fff",
+ "light": "#DDD"
+ }
+ }
+ },
+ "fonts": {
+ "font_family": {
+ "primary": "Karla:wght@400;500;700",
+ "primary_type": "sans-serif",
+ "secondary": "",
+ "secondary_type": ""
+ },
+ "font_size": {
+ "base": "16",
+ "scale": "1.2"
+ }
+ }
+}
diff --git a/src/content.config.ts b/src/content.config.ts
new file mode 100644
index 0000000..d116772
--- /dev/null
+++ b/src/content.config.ts
@@ -0,0 +1,30 @@
+import { glob } from "astro/loaders";
+import { defineCollection, z } from "astro:content";
+import { aboutCollection } from "./types/pages/aboutCollection";
+import { contactCollection } from "./types/pages/contactCollection";
+import { ctaSectionCollection } from "./types/sections/ctaSectionCollection";
+import { paymentCollection } from "./types/sections/paymentCollection";
+
+// Pages collection schema
+const pagesCollection = defineCollection({
+ loader: glob({ pattern: "**/*.{md,mdx}", base: "src/content/pages" }),
+ schema: z.object({
+ title: z.string(),
+ meta_title: z.string().optional(),
+ description: z.string().optional(),
+ image: z.string().optional(),
+ draft: z.boolean().optional(),
+ }),
+});
+
+// Export collections
+export const collections = {
+ // Pages
+ pages: pagesCollection,
+ about: aboutCollection,
+ contact: contactCollection,
+
+ // sections
+ ctaSection: ctaSectionCollection,
+ paymentSection: paymentCollection,
+};
diff --git a/src/content/about/-index.md b/src/content/about/-index.md
new file mode 100644
index 0000000..0675ddc
--- /dev/null
+++ b/src/content/about/-index.md
@@ -0,0 +1,85 @@
+---
+title: "About Us"
+meta_title: "About"
+description: ""
+image: ""
+draft: false
+
+#About Us
+about_us:
+ - title: "Our Company"
+ image: "/images/aboutUs.png"
+ content: "Welcome to **Astrofront** where brilliance meets innovation. We take pride in being your ultimate destination for exquisite lighting solutions that illuminate spaces and lives alike. With a passion for creating luminous experiences, we curate a diverse range of cutting-edge light fixtures designed to elevate any environment. Our commitment to quality craftsmanship and a keen eye for aesthetic appeal ensures that each product we offer is not just a source of light,
but a work of art in its own right. Whether you're seeking ambient elegance for your home or functional brilliance for a commercial space, [Your Company Name] is dedicated to bringing your vision to light. Explore our collection and let your surroundings shine with a touch of our radiant expertise. Elevate your space, embrace the light, only with **Astrofront**."
+
+ - title: "Who We Are ?"
+ image: "/images/aboutUs.png"
+ content: "At **Astrofront** we illuminate your world with a curated collection of exceptional lighting solutions. Established with a passion for transforming spaces and creating ambiance, we stand as a beacon of quality and style in the realm of lighting. With a keen eye for design and a commitment to sourcing the finest materials, we pride ourselves on offering a diverse range of work that not only brighten spaces but also elevate aesthetics.
Committed to delivering excellence, we prioritize customer satisfaction and provide expert guidance to help you find the perfect lighting solution for any setting. Welcome to **Astrofront** where light meets inspiration. Illuminate your world today!"
+
+# Frequently Asked Questions
+faq_section_title: "Frequently Asked Questions"
+faq_section_subtitle: "Our expertly crafted FAQ guide provides valuable insights on selecting the perfect table lamp to complement your decor and meet your specific lighting needs."
+button:
+ enable: true
+ label: "Contact Us"
+ link: "/contact"
+faqs:
+ - title: "Can I customize lamps for client projects?"
+ content: "Yes, our platform allows customization for client projects, ensuring unique and tailored solutions. Yes, our platform allows customization for client projects, ensuring unique and tailored solutions."
+
+ - title: "Where are your lamps crafted?"
+ content: "Our lamps are meticulously crafted, combining quality materials and skilled workmanship to deliver exceptional products. Our lamps are meticulously crafted, combining quality materials and skilled workmanship to deliver exceptional products."
+
+ - title: "What's included in the 'free updates' policy?"
+ content: "Free updates encompass enhancements to lamp designs and features, ensuring your collection stays current and appealing. Free updates encompass enhancements to lamp designs and features, ensuring your collection stays current and appealing"
+
+ - title: "Can I use your lamps for open source projects?"
+ content: "Certainly! Our lamps are open for integration into various projects, fostering creativity and innovation. Certainly! Our lamps are open for integration into various projects, fostering creativity and innovation."
+
+ - title: "Can I retail themes featuring your lamps?"
+ content: "Absolutely! You can sell themes created with our lamps, providing stylish solutions for diverse design needs. Absolutely! You can sell themes created with our lamps, providing stylish solutions for diverse design needs."
+
+# Testimonials
+testimonials_section_enable: true
+testimonials_section_title: "What Our Client Says"
+testimonials:
+ - name: "Ava Sinclair"
+ designation: "Lead Frontend Architect"
+ avatar: "/images/avatar-sm.png"
+ content: "Astrofront has been a game-changer for our e-commerce setup. This Astro-Shopify boilerplate blends the speed and flexibility of Astro with the powerful e-commerce capabilities of Shopify, giving us the perfect foundation for a high-performance, modern storefront. Setup was smooth, and it’s optimized for seamless integration with Shopify’s API, so we were able to get our site up and running quickly without compromising on customizations or functionality. Astrofront’s clean codebase and scalability make it an ideal solution for any team looking to leverage Astro’s benefits in an e-commerce context. Highly recommended for anyone looking to streamline their Shopify store with the speed of Astro!"
+
+ - name: "Jordan Patel"
+ designation: "E-commerce Solutions Strategist"
+ avatar: "/images/avatar-sm.png"
+ content: "Astrofront has been a game-changer for our e-commerce setup. This Astro-Shopify boilerplate blends the speed and flexibility of Astro with the powerful e-commerce capabilities of Shopify, giving us the perfect foundation for a high-performance, modern storefront. Setup was smooth, and it’s optimized for seamless integration with Shopify’s API, so we were able to get our site up and running quickly without compromising on customizations or functionality. Astrofront’s clean codebase and scalability make it an ideal solution for any team looking to leverage Astro’s benefits in an e-commerce context. Highly recommended for anyone looking to streamline their Shopify store with the speed of Astro!"
+
+ - name: "Lena Brooks"
+ designation: "Digital Experience Specialist"
+ avatar: "/images/avatar-sm.png"
+ content: "Astrofront has been a game-changer for our e-commerce setup. This Astro-Shopify boilerplate blends the speed and flexibility of Astro with the powerful e-commerce capabilities of Shopify, giving us the perfect foundation for a high-performance, modern storefront. Setup was smooth, and it’s optimized for seamless integration with Shopify’s API, so we were able to get our site up and running quickly without compromising on customizations or functionality. Astrofront’s clean codebase and scalability make it an ideal solution for any team looking to leverage Astro’s benefits in an e-commerce context. Highly recommended for anyone looking to streamline their Shopify store with the speed of Astro!"
+
+ - name: "Marvin McKinney"
+ designation: "Web Designer"
+ avatar: "/images/avatar-sm.png"
+ content: "Astrofront has been a game-changer for our e-commerce setup. This Astro-Shopify boilerplate blends the speed and flexibility of Astro with the powerful e-commerce capabilities of Shopify, giving us the perfect foundation for a high-performance, modern storefront. Setup was smooth, and it’s optimized for seamless integration with Shopify’s API, so we were able to get our site up and running quickly without compromising on customizations or functionality. Astrofront’s clean codebase and scalability make it an ideal solution for any team looking to leverage Astro’s benefits in an e-commerce context. Highly recommended for anyone looking to streamline their Shopify store with the speed of Astro!"
+
+# Our Staff
+staff_section_enable: true
+staff:
+ - name: "Marvin McKinney"
+ designation: "Web Designer"
+ avatar: "/images/staff/staff.png"
+
+ - name: "Noah Anderson"
+ designation: "Java Engineer"
+ avatar: "/images/staff/staff.png"
+
+ - name: "Olivia Harper"
+ designation: "UI Designer"
+ avatar: "/images/staff/staff.png"
+
+ - name: "Benjamin Clarke"
+ designation: "Product Marketer"
+ avatar: "/images/staff/staff.png"
+---
+
+Lorem ipsum dolor sit amet consectetur adipisicing elit. Corporis illum nesciunt commodi vel nisi ut alias excepturi ipsum, totam, labore tempora, odit ex iste tempore sed. Fugit voluptatibus perspiciatis assumenda nulla ad nihil, omnis vel, doloremque sit quam autem optio maiores, illum eius facilis et quo consectetur provident dolor similique! Enim voluptatem dicta expedita veritatis repellat dolorum impedit, provident quasi at.
diff --git a/src/content/contact/-index.md b/src/content/contact/-index.md
new file mode 100644
index 0000000..3814471
--- /dev/null
+++ b/src/content/contact/-index.md
@@ -0,0 +1,20 @@
+---
+title: "Connect with Us"
+meta_title: ""
+description: "this is meta description"
+draft: false
+
+#Contact Options
+contact_meta:
+ - name: "Address"
+ contact: "123 Main Street, Anytown, CA 12335 - USA"
+
+ - name: "Email"
+ contact: "yourmail@domain.com support@domain.com"
+
+ - name: "Phone"
+ contact: "Mobile: (08) 123 456 789 Hotline: 1009 678 456"
+
+ - name: "Shop Time"
+ contact: "Available at 10am-8pm "
+---
diff --git a/src/content/pages/privacy-policy.md b/src/content/pages/privacy-policy.md
new file mode 100644
index 0000000..85d3dc8
--- /dev/null
+++ b/src/content/pages/privacy-policy.md
@@ -0,0 +1,59 @@
+---
+title: "Privacy Policy"
+meta_title: ""
+description: "this is meta description"
+draft: false
+---
+
+## This Privacy policy was published on 04 May 2023
+
+### GDPR Compliance
+
+We collect certain identifying personal data when you sign up to our Service such as your name, email address, PayPal address (if different from email address), and telephone number. The personal data we collect from you is disclosed only in accordance with our Terms of Service and/or this Privacy Policy.Conclude collects Slack account and access information from Users for the purposes of connecting to the Slack API and to authenticate access to information on the Conclude website. Whenever you visit our Site, we may
+
+collect non-identifying information from you, such as referring URL, browser, operating system, cookie information, and Internet Service Provider. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, this information alone cannot usually be used to identify you.The term "personal data" does not include any anonymized and aggregated data made on the basis of personal data, which are wholly owned by Conclude.
+
+
+### About Astrofront
+
+#### Service Provided As
+
+The discovery was made by Richard McClintock , a professor of Latin at Hampden-Sydney College in Virginia, who faced the impetuous recurrence of the dark word consectetur in the text Lorem ipsum researched its origins to identify them in sections 1.10.32 and 1.10.33 of the aforementioned Cicero's
+
+When referring to Lorem ipsum, different expressions are used, namely fill text , fictitious text , blind text or placeholder text : in short, its meaning can also be zero, but its usefulness is so clear as to go
+
+
+#### Company Liability
+
+The choice of font and font size with which Lorem ipsum is reproduced answers to specific needs that go beyond the simple and simple filling of spaces dedicated to accepting real texts and allowing to have hands an advertising/publishing product, both web and paper, true to reality.
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
+
+
+#### When we collect personal data about you
+
+In order to use our Service, you must meet a number of conditions, including but not limited to:
+
+- Enhance or improve User experience, our Site, or our Service.
+- Send emails and updates about Conclude, Process transactions.
+- Send emails about our Site or respond to inquiries.
+- Including news and requests for agreement to amended legal documents such as this
+ Privacy Policy and our Terms of Service.
+
+
+#### Why we collect and use personal data
+
+Users of Conclude (i) must keep passwords secure and confidential; (ii) are solely responsible for User Data and all activity in their account while using the Service; (iii) must use commercially reasonable efforts access to their account, and notify Conclude promptly
+
+- Enhance or improve User experience, our Site, or our Service.
+- Send emails and updates about Conclude, Process transactions.
+- Send emails about our Site or respond to inquiries.
+- Including news and requests for agreement to amended legal documents such as this
+ Privacy Policy and our Terms of Service.
+
+
+#### Type of personal data collected
+
+Your information may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the privacy laws may not be as protective as those in your jurisdiction. If you choose to provide information to us, Conclude transfers Personal Information to Google Cloud Platform and processes it there. Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.
+
+Your information may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the privacy laws may not be as protective as those in your jurisdiction. If you choose to provide information to us, Conclude transfers Personal Information to Google Cloud Platform and processes it there. Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.
diff --git a/src/content/pages/terms-services.md b/src/content/pages/terms-services.md
new file mode 100644
index 0000000..cfc7f3c
--- /dev/null
+++ b/src/content/pages/terms-services.md
@@ -0,0 +1,97 @@
+---
+title: "Terms of Service"
+meta_title: ""
+description: "this is meta description"
+draft: false
+---
+
+## Astrofront Solutions License Agreement
+
+Your Rights Roxboro Lighting Limited trading as Onlinelightshop is a UK based company and complies with UK consumer law including the Distance Selling Regulations. This means that shopping with Onlinelightshop is safe. With 30 years experience in lighting retailing we aim to give a thorough and relable sevice, you’ll get your items delivered and we’ll sort out any problems you have. Our Terms and Conditions do not affect your statutory rights. Distance Selling Regulations give you the right to cancel an order and return any goods that may already have been dispatched, (see Returns for Refund) up to 7 days from receipt. Our returns policy allows 21 days.
+
+##### [Download our Returns Form here.](#http://localhost:4321/terms-services)
+
+
+
+### Sales terms and conditions
+
+#### Pricing
+
+Prices include VAT (Value Added Tax)\*, standard UK rate 20%. VAT does not apply to orders that are to be shipped outside the E.U. or to Tax Free areas such as the Channel Islands. These areas will be priced and billed with VAT deducted. The prices on the site are shown including VAT.
+
+If you select a currency or a delivery country outside the E.U., prices will be displayed VAT free, for example, an item which costs 19.99 GBP will be shown and billed as 17.00 GBP when it is VAT free.
+
+While we do our best to ensure prices are up to date and correct, errors may occur and in this case you will be contacted before your order is shipped.
+
+
+#### Payment
+
+Onlinelightshop accept most major credit cards for online orders. You will be asked to enter your card details and the name and the address of the card holder when you place the order. These details will be checked and we may hold an order until we receive the correct details. You will be contacted if we find the card or address details to be incorrect. We only bill your card when your order is ready to be dispatched.
+
+For offline orders Onlinelightshop accept (£) Sterling Postal Orders, Personal Cheques, (£) Sterling Bank Drafts and (£) Sterling Bank Transfers. We recommend that you do not send cash through the post. Due to varying Exchange Rates all payments made to CRC must be in UK Pounds (£) Sterling.
+
+
+#### Product Availability
+
+Onlinelightshop endeavours to carry most of the items displayed on the site in stock. If an item you order is out of stock we will contact you with a due date. You may then wish to cancel the order or wait until the item becomes available.
+
+
+#### Out of Stock Orders
+
+There are times when items become temporarily out of stock. If you order an 'Out Of Stock' product, we will send out the order to you as soon as the product becomes available again. If we cannot source the item we will contact you to inform you. Your credit card will not be debited until we dispatch the product.
+
+There are times when items become temporarily out of stock. If you order an 'Out Of Stock' product, we will send out the order to you as soon as the product becomes available again. If we cannot source the item we will contact you to inform you. Your credit card will not be debited until we dispatch the product.
+
+
+#### Accuracy of Information
+
+We put a lot of time and effort into describing and photographing the products we sell using manufacturer's websites, catalogues, our own photography studio and often our own descriptions of the products. Although we aim to ensure that every picture and description is 100% accurate, mistakes do occur so let us know if you see or read something that isn’t correct. If you have purchased something based on a picture or description on the website which turns out to be incorrect we will be happy to replace or refund the product (unused).
+
+
+#### Changes
+
+If we decide to change our Terms and Conditions, we will post those changes on this page so that you are always aware of what information we collect, how we use it and under what circumstances we disclose it.
+
+
+#### Site Usage
+
+Onlinelightshop disclaims damages of any kind, compensatory, direct, indirect or consequential damages, loss of data, income or profit, loss of or damage to property and claims of third parties implied or otherwise relating to use of this site.
+
+
+#### Credit Card Security
+
+We take online security extremely seriously and have taken several steps to ensure that your payment information is processed confidentially and accurately. We use Sagepay, a world leader in secure online payments.
+
+Onlinelightshop offer the use of secure servers where information is protected by Secure Sockets Layer (SSL), the industry standard encryption technology. SSL works with Netscape Navigator, Microsoft Internet Explorer, AOL and other browsers. This encryption makes it virtually impossible for unauthorised parties to read any information that you send us.
+
+
+#### Price and Payment
+
+- The Price of the Goods shall be that stipulated on the Seller’s Website. The Price is NOT INCLUSIVE of VAT. The Price EXCLUDES delivery charges.
+- The total purchase price, including VAT and delivery charges, if any, will be displayed in the Buyer’s shopping cart prior to confirming the order.
+- Payment of the Price plus VAT and delivery charges must be made in full before dispatch of the Goods.
+- Payment must be made by secure credit or debit transactions (please see Privacy Statement).
+
+
+#### Warranty
+
+- The Seller warrants that the Goods will at the time of dispatch correspond to the description given by the Seller.
+- After 7 Working days from the date of delivery goods will be repaired or replaced dependant upon the nature of the fault.
+
+
+#### Delivery
+
+- Goods supplied within the UK will normally be delivered within 3-5 working days of acceptance of order.
+- Where a specific delivery date has been agreed, and where this delivery date cannot be met, the Buyer will be notified and given the opportunity to agree a new delivery date or cancel the order.
+- Title and risk in the Goods shall pass to the Buyer upon delivery of the Goods.
+
+
+#### Cancellation and Return
+
+The Buyer shall inspect the Goods immediately upon receipt and shall notify the Seller via the designated Returns Submission Form within 7 working days of delivery if the Goods are damaged or do not comply with any of the Contract. If the Buyer fails to do so the Buyer shall be deemed to have accepted the Goods.
+
+Where a claim of defect or damage is made the Seller shall be responsible for the recovery of the Goods from the Buyer. The Buyer shall be entitled to a full refund (including delivery costs) if the Goods are in fact defective.
+
+The Seller reserves the right to refuse a refund if:
+
+The Goods have been used.
diff --git a/src/content/sections/call-to-action.md b/src/content/sections/call-to-action.md
new file mode 100644
index 0000000..f35805d
--- /dev/null
+++ b/src/content/sections/call-to-action.md
@@ -0,0 +1,12 @@
+---
+enable: true
+title: "Curved Collection for Your
+Bedroom Get 25% Off"
+sub_title: "Deal of the Week"
+image: "/images/call-to-action.png"
+description: "Subscribe our Newsletter and get all latest information and offers"
+button:
+ enable: true
+ label: "Shop Now"
+ link: "/products"
+---
diff --git a/src/content/sections/payments-and-delivery.md b/src/content/sections/payments-and-delivery.md
new file mode 100644
index 0000000..00f5f75
--- /dev/null
+++ b/src/content/sections/payments-and-delivery.md
@@ -0,0 +1,17 @@
+---
+payment_methods:
+ - name: "Visa"
+ image_url: "/images/payment/visa.png"
+ - name: "MasterCard"
+ image_url: "/images/payment/mastercard.png"
+ - name: "Express"
+ image_url: "/images/payment/express.png"
+ - name: "Bkash"
+ image_url: "/images/payment/bkash.png"
+ - name: "Nagad"
+ image_url: "/images/payment/nagad.png"
+ - name: "Upay"
+ image_url: "/images/payment/upay.png"
+
+estimated_delivery: "Est. Delivery between 0 - 3 days"
+---
\ No newline at end of file
diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro
new file mode 100644
index 0000000..809a170
--- /dev/null
+++ b/src/layouts/Base.astro
@@ -0,0 +1,180 @@
+---
+import TwSizeIndicator from "@/components/TwSizeIndicator.astro";
+import config from "@/config/config.json";
+import theme from "@/config/theme.json";
+import { plainify } from "@/lib/utils/textConverter";
+import Footer from "@/partials/Footer.astro";
+import Header from "@/partials/Header.astro";
+import "@/styles/main.scss";
+import { AstroFont } from "astro-font";
+import { ClientRouter } from "astro:transitions";
+
+// font families
+const pf = theme.fonts.font_family.primary;
+const sf = theme.fonts.font_family.secondary;
+
+let fontPrimary, fontSecondary;
+if (theme.fonts.font_family.primary) {
+ fontPrimary = theme.fonts.font_family.primary
+ .replace(/\+/g, " ")
+ .replace(/:[ital,]*[ital@]*[wght@]*[0-9,;.]+/gi, "");
+}
+if (theme.fonts.font_family.secondary) {
+ fontSecondary = theme.fonts.font_family.secondary
+ .replace(/\+/g, " ")
+ .replace(/:[ital,]*[ital@]*[wght@]*[0-9,;.]+/gi, "");
+}
+
+// types for frontmatters
+export interface Props {
+ title?: string;
+ meta_title?: string;
+ description?: string;
+ image?: string;
+ noindex?: boolean;
+ canonical?: string;
+}
+
+// destructure frontmatter
+const { title, meta_title, description, image, noindex, canonical } =
+ Astro.props;
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {plainify(meta_title ? meta_title : title ? title : config.site.title)}
+
+
+
+ {canonical && }
+
+
+ {noindex && }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layouts/components/AuthorCard.astro b/src/layouts/components/AuthorCard.astro
new file mode 100644
index 0000000..bd00f86
--- /dev/null
+++ b/src/layouts/components/AuthorCard.astro
@@ -0,0 +1,32 @@
+---
+import { plainify } from "@/lib/utils/textConverter";
+import ImageMod from "./ImageMod.astro";
+import Social from "./Social.astro";
+
+const { data } = Astro.props;
+const { title, image, social } = data.data;
+---
+
+