diff --git a/assets-to-refine/INDEX.csv b/assets-to-refine/INDEX.csv new file mode 100644 index 0000000..04f8efc --- /dev/null +++ b/assets-to-refine/INDEX.csv @@ -0,0 +1,40 @@ +category,refined_filename,original_source +hero,hero-01-viscose.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.40.jpeg +hero,hero-02-tencel-cotton.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.41.jpeg +hero,hero-03-blue-texture.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.55 (3).jpeg +hero,hero-04-polyester-tencel.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.10.51 (1).jpeg +hero,hero-05-cotton-viscose-comparison.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.10.49.jpeg +products/polyester,polyester-01.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.10.51 (1).jpeg +products/polyester,polyester-02.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.52.jpeg +products/polyester,polyester-03.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.55 (1).jpeg +products/polyester,polyester-04.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.00.jpeg +products/polyester,polyester-05.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.02.jpeg +products/active-wear,active-wear-01-football.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.00 (3).jpeg +products/active-wear,active-wear-02-osaka-rib.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.04 (1).jpeg +products/active-wear,active-wear-03-cotton-lycra.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.05 (1).jpeg +products/active-wear,active-wear-04-technical-mesh.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.06 (3).jpeg +products/active-wear,active-wear-05-structured.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.11.jpeg +products/imported-exclusive,exclusive-01-alpine-fleece.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.50.jpeg +products/imported-exclusive,exclusive-02-bamboo.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.49 (2).jpeg +products/imported-exclusive,exclusive-03-blue-construction.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.50 (1).jpeg +products/imported-exclusive,exclusive-04-madagascar.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.11 (2).jpeg +products/imported-exclusive,exclusive-05-premium-structure.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.14 (1).jpeg +products/cotton-viscose,cotton-viscose-01-comparison.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.10.49.jpeg +products/cotton-viscose,cotton-viscose-02-viscose.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.40.jpeg +products/cotton-viscose,cotton-viscose-03-tencel-cotton.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.41.jpeg +products/cotton-viscose,cotton-viscose-04-blue-blend.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.55 (3).jpeg +products/cotton-viscose,cotton-viscose-05-open-structure.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.07 (2).jpeg +gallery,gallery-01.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.10.53.jpeg +gallery,gallery-02.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.10.54.jpeg +gallery,gallery-03.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.53 (2).jpeg +gallery,gallery-04.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.56.jpeg +gallery,gallery-05.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.58 (1).jpeg +gallery,gallery-06.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.11.59.jpeg +gallery,gallery-07.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.00 (1).jpeg +gallery,gallery-08.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.02 (1).jpeg +gallery,gallery-09.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.06 (2).jpeg +gallery,gallery-10.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.07 (2).jpeg +gallery,gallery-11.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.08.jpeg +gallery,gallery-12.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.11 (2).jpeg +gallery,gallery-13.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.13.jpeg +gallery,gallery-14.jpeg,/mnt/1TB-HDD/WhatsApp Image 2026-09-25 at 12.12.14 (1).jpeg diff --git a/assets-to-refine/PROMPT.md b/assets-to-refine/PROMPT.md new file mode 100644 index 0000000..c22679e --- /dev/null +++ b/assets-to-refine/PROMPT.md @@ -0,0 +1,12 @@ +# General AI refinement prompt + +Refine this photographed textile sample into a clean, premium product image for a professional textile-manufacturing website. Preserve the exact knit structure, weave geometry, fibre texture, pattern scale, colour relationships, and all visible material characteristics of the original sample. Remove stickers, handwriting, printed labels, plastic wrapping, glare, harsh shadows, dust, background clutter, and camera distortion. Correct white balance and exposure, improve edge definition, and apply restrained photographic sharpening without inventing fibres or changing the construction. Place the fabric on a clean warm-neutral studio background (#F5F3EE) with soft, realistic, diffuse lighting. Extend the existing fabric naturally beyond the original frame where needed for the requested composition. Do not add garments, machinery, logos, text, labels, decorative props, new patterns, seams, folds, or surface details that are not present in the source. Do not make the fabric look synthetic, illustrated, plastic, overly smooth, or AI-generated. The result must remain an accurate commercial representation of the supplied fabric. + +Output variants: +1. Hero: 16:9 landscape, fabric filling the frame, quiet negative space on the left for website copy. +2. Product card: 4:3 landscape, evenly framed texture, no text. +3. Gallery: 1:1 square macro crop showing the construction clearly, no text. + +Quality: photorealistic, natural textile detail, high resolution, consistent colour, web-ready. + +Important: compare the result against the original before approval. Reject any output that alters the knit pattern, hole spacing, rib direction, yarn thickness, fibre content appearance, or colour. diff --git a/assets-to-refine/RefinedGallery/Gemini_Generated_Image_gwchf4gwchf4gwch.jpeg b/assets-to-refine/RefinedGallery/Gemini_Generated_Image_gwchf4gwchf4gwch.jpeg new file mode 100644 index 0000000..fa921e8 Binary files /dev/null and b/assets-to-refine/RefinedGallery/Gemini_Generated_Image_gwchf4gwchf4gwch.jpeg differ diff --git a/assets-to-refine/RefinedGallery/Gemini_Generated_Image_n36uden36uden36u.jpeg b/assets-to-refine/RefinedGallery/Gemini_Generated_Image_n36uden36uden36u.jpeg new file mode 100644 index 0000000..35227b9 Binary files /dev/null and b/assets-to-refine/RefinedGallery/Gemini_Generated_Image_n36uden36uden36u.jpeg differ diff --git a/assets-to-refine/RefinedGallery/Gemini_Generated_Image_v9lfrwv9lfrwv9lf.jpeg b/assets-to-refine/RefinedGallery/Gemini_Generated_Image_v9lfrwv9lfrwv9lf.jpeg new file mode 100644 index 0000000..324f171 Binary files /dev/null and b/assets-to-refine/RefinedGallery/Gemini_Generated_Image_v9lfrwv9lfrwv9lf.jpeg differ diff --git a/assets-to-refine/RefinedHero/Gemini_Generated_Image_41gc6n41gc6n41gc.jpeg b/assets-to-refine/RefinedHero/Gemini_Generated_Image_41gc6n41gc6n41gc.jpeg new file mode 100644 index 0000000..547ccfa Binary files /dev/null and b/assets-to-refine/RefinedHero/Gemini_Generated_Image_41gc6n41gc6n41gc.jpeg differ diff --git a/assets-to-refine/RefinedHero/Gemini_Generated_Image_al58e4al58e4al58.jpeg b/assets-to-refine/RefinedHero/Gemini_Generated_Image_al58e4al58e4al58.jpeg new file mode 100644 index 0000000..d4e7e1f Binary files /dev/null and b/assets-to-refine/RefinedHero/Gemini_Generated_Image_al58e4al58e4al58.jpeg differ diff --git a/assets-to-refine/RefinedHero/Gemini_Generated_Image_jqdm25jqdm25jqdm.jpeg b/assets-to-refine/RefinedHero/Gemini_Generated_Image_jqdm25jqdm25jqdm.jpeg new file mode 100644 index 0000000..1da1b18 Binary files /dev/null and b/assets-to-refine/RefinedHero/Gemini_Generated_Image_jqdm25jqdm25jqdm.jpeg differ diff --git a/assets-to-refine/RefinedHero/Gemini_Generated_Image_my47hhmy47hhmy47.jpeg b/assets-to-refine/RefinedHero/Gemini_Generated_Image_my47hhmy47hhmy47.jpeg new file mode 100644 index 0000000..e21a60c Binary files /dev/null and b/assets-to-refine/RefinedHero/Gemini_Generated_Image_my47hhmy47hhmy47.jpeg differ diff --git a/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_6iim9q6iim9q6iim.jpeg b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_6iim9q6iim9q6iim.jpeg new file mode 100644 index 0000000..f305620 Binary files /dev/null and b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_6iim9q6iim9q6iim.jpeg differ diff --git a/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_w9uvs8w9uvs8w9uv.jpeg b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_w9uvs8w9uvs8w9uv.jpeg new file mode 100644 index 0000000..5c68bca Binary files /dev/null and b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_w9uvs8w9uvs8w9uv.jpeg differ diff --git a/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_xc9waxc9waxc9wax.jpeg b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_xc9waxc9waxc9wax.jpeg new file mode 100644 index 0000000..63ed2de Binary files /dev/null and b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_xc9waxc9waxc9wax.jpeg differ diff --git a/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_ysg0d0ysg0d0ysg0.jpeg b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_ysg0d0ysg0d0ysg0.jpeg new file mode 100644 index 0000000..061536e Binary files /dev/null and b/assets-to-refine/RefinedProducts/RefinedActiveWear/Gemini_Generated_Image_ysg0d0ysg0d0ysg0.jpeg differ diff --git a/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_cl17jacl17jacl17.jpeg b/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_cl17jacl17jacl17.jpeg new file mode 100644 index 0000000..bcd7866 Binary files /dev/null and b/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_cl17jacl17jacl17.jpeg differ diff --git a/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_dsdddmdsdddmdsdd.jpeg b/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_dsdddmdsdddmdsdd.jpeg new file mode 100644 index 0000000..be1a5e1 Binary files /dev/null and b/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_dsdddmdsdddmdsdd.jpeg differ diff --git a/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_v0zjkuv0zjkuv0zj.jpeg b/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_v0zjkuv0zjkuv0zj.jpeg new file mode 100644 index 0000000..2842928 Binary files /dev/null and b/assets-to-refine/RefinedProducts/RefinedPolyster/Gemini_Generated_Image_v0zjkuv0zjkuv0zj.jpeg differ diff --git a/assets-to-refine/gallery/gallery-01.jpeg b/assets-to-refine/gallery/gallery-01.jpeg new file mode 100644 index 0000000..a8b4503 Binary files /dev/null and b/assets-to-refine/gallery/gallery-01.jpeg differ diff --git a/assets-to-refine/gallery/gallery-02.jpeg b/assets-to-refine/gallery/gallery-02.jpeg new file mode 100644 index 0000000..0f6adb4 Binary files /dev/null and b/assets-to-refine/gallery/gallery-02.jpeg differ diff --git a/assets-to-refine/gallery/gallery-03.jpeg b/assets-to-refine/gallery/gallery-03.jpeg new file mode 100644 index 0000000..fbbfd03 Binary files /dev/null and b/assets-to-refine/gallery/gallery-03.jpeg differ diff --git a/assets-to-refine/gallery/gallery-04.jpeg b/assets-to-refine/gallery/gallery-04.jpeg new file mode 100644 index 0000000..711613c Binary files /dev/null and b/assets-to-refine/gallery/gallery-04.jpeg differ diff --git a/assets-to-refine/gallery/gallery-05.jpeg b/assets-to-refine/gallery/gallery-05.jpeg new file mode 100644 index 0000000..747be62 Binary files /dev/null and b/assets-to-refine/gallery/gallery-05.jpeg differ diff --git a/assets-to-refine/gallery/gallery-06.jpeg b/assets-to-refine/gallery/gallery-06.jpeg new file mode 100644 index 0000000..bffd99f Binary files /dev/null and b/assets-to-refine/gallery/gallery-06.jpeg differ diff --git a/assets-to-refine/gallery/gallery-07.jpeg b/assets-to-refine/gallery/gallery-07.jpeg new file mode 100644 index 0000000..55dbd15 Binary files /dev/null and b/assets-to-refine/gallery/gallery-07.jpeg differ diff --git a/assets-to-refine/gallery/gallery-08.jpeg b/assets-to-refine/gallery/gallery-08.jpeg new file mode 100644 index 0000000..ff8c723 Binary files /dev/null and b/assets-to-refine/gallery/gallery-08.jpeg differ diff --git a/assets-to-refine/gallery/gallery-09.jpeg b/assets-to-refine/gallery/gallery-09.jpeg new file mode 100644 index 0000000..3b4ce0f Binary files /dev/null and b/assets-to-refine/gallery/gallery-09.jpeg differ diff --git a/assets-to-refine/gallery/gallery-10.jpeg b/assets-to-refine/gallery/gallery-10.jpeg new file mode 100644 index 0000000..6f973d2 Binary files /dev/null and b/assets-to-refine/gallery/gallery-10.jpeg differ diff --git a/assets-to-refine/gallery/gallery-11.jpeg b/assets-to-refine/gallery/gallery-11.jpeg new file mode 100644 index 0000000..8c97754 Binary files /dev/null and b/assets-to-refine/gallery/gallery-11.jpeg differ diff --git a/assets-to-refine/gallery/gallery-12.jpeg b/assets-to-refine/gallery/gallery-12.jpeg new file mode 100644 index 0000000..7de29fe Binary files /dev/null and b/assets-to-refine/gallery/gallery-12.jpeg differ diff --git a/assets-to-refine/gallery/gallery-13.jpeg b/assets-to-refine/gallery/gallery-13.jpeg new file mode 100644 index 0000000..1d9691e Binary files /dev/null and b/assets-to-refine/gallery/gallery-13.jpeg differ diff --git a/assets-to-refine/gallery/gallery-14.jpeg b/assets-to-refine/gallery/gallery-14.jpeg new file mode 100644 index 0000000..d136411 Binary files /dev/null and b/assets-to-refine/gallery/gallery-14.jpeg differ diff --git a/assets-to-refine/hero/hero-01-viscose.jpeg b/assets-to-refine/hero/hero-01-viscose.jpeg new file mode 100644 index 0000000..d3383e1 Binary files /dev/null and b/assets-to-refine/hero/hero-01-viscose.jpeg differ diff --git a/assets-to-refine/hero/hero-02-tencel-cotton.jpeg b/assets-to-refine/hero/hero-02-tencel-cotton.jpeg new file mode 100644 index 0000000..4526032 Binary files /dev/null and b/assets-to-refine/hero/hero-02-tencel-cotton.jpeg differ diff --git a/assets-to-refine/hero/hero-03-blue-texture.jpeg b/assets-to-refine/hero/hero-03-blue-texture.jpeg new file mode 100644 index 0000000..31eea9b Binary files /dev/null and b/assets-to-refine/hero/hero-03-blue-texture.jpeg differ diff --git a/assets-to-refine/hero/hero-04-polyester-tencel.jpeg b/assets-to-refine/hero/hero-04-polyester-tencel.jpeg new file mode 100644 index 0000000..6c175b2 Binary files /dev/null and b/assets-to-refine/hero/hero-04-polyester-tencel.jpeg differ diff --git a/assets-to-refine/hero/hero-05-cotton-viscose-comparison.jpeg b/assets-to-refine/hero/hero-05-cotton-viscose-comparison.jpeg new file mode 100644 index 0000000..b4e31df Binary files /dev/null and b/assets-to-refine/hero/hero-05-cotton-viscose-comparison.jpeg differ diff --git a/assets-to-refine/products/active-wear/active-wear-01-football.jpeg b/assets-to-refine/products/active-wear/active-wear-01-football.jpeg new file mode 100644 index 0000000..1f7c2e7 Binary files /dev/null and b/assets-to-refine/products/active-wear/active-wear-01-football.jpeg differ diff --git a/assets-to-refine/products/active-wear/active-wear-02-osaka-rib.jpeg b/assets-to-refine/products/active-wear/active-wear-02-osaka-rib.jpeg new file mode 100644 index 0000000..0fc32c1 Binary files /dev/null and b/assets-to-refine/products/active-wear/active-wear-02-osaka-rib.jpeg differ diff --git a/assets-to-refine/products/active-wear/active-wear-03-cotton-lycra.jpeg b/assets-to-refine/products/active-wear/active-wear-03-cotton-lycra.jpeg new file mode 100644 index 0000000..b0fba81 Binary files /dev/null and b/assets-to-refine/products/active-wear/active-wear-03-cotton-lycra.jpeg differ diff --git a/assets-to-refine/products/active-wear/active-wear-04-technical-mesh.jpeg b/assets-to-refine/products/active-wear/active-wear-04-technical-mesh.jpeg new file mode 100644 index 0000000..148013c Binary files /dev/null and b/assets-to-refine/products/active-wear/active-wear-04-technical-mesh.jpeg differ diff --git a/assets-to-refine/products/active-wear/active-wear-05-structured.jpeg b/assets-to-refine/products/active-wear/active-wear-05-structured.jpeg new file mode 100644 index 0000000..78509dc Binary files /dev/null and b/assets-to-refine/products/active-wear/active-wear-05-structured.jpeg differ diff --git a/assets-to-refine/products/cotton-viscose/cotton-viscose-01-comparison.jpeg b/assets-to-refine/products/cotton-viscose/cotton-viscose-01-comparison.jpeg new file mode 100644 index 0000000..b4e31df Binary files /dev/null and b/assets-to-refine/products/cotton-viscose/cotton-viscose-01-comparison.jpeg differ diff --git a/assets-to-refine/products/cotton-viscose/cotton-viscose-02-viscose.jpeg b/assets-to-refine/products/cotton-viscose/cotton-viscose-02-viscose.jpeg new file mode 100644 index 0000000..d3383e1 Binary files /dev/null and b/assets-to-refine/products/cotton-viscose/cotton-viscose-02-viscose.jpeg differ diff --git a/assets-to-refine/products/cotton-viscose/cotton-viscose-03-tencel-cotton.jpeg b/assets-to-refine/products/cotton-viscose/cotton-viscose-03-tencel-cotton.jpeg new file mode 100644 index 0000000..4526032 Binary files /dev/null and b/assets-to-refine/products/cotton-viscose/cotton-viscose-03-tencel-cotton.jpeg differ diff --git a/assets-to-refine/products/cotton-viscose/cotton-viscose-04-blue-blend.jpeg b/assets-to-refine/products/cotton-viscose/cotton-viscose-04-blue-blend.jpeg new file mode 100644 index 0000000..31eea9b Binary files /dev/null and b/assets-to-refine/products/cotton-viscose/cotton-viscose-04-blue-blend.jpeg differ diff --git a/assets-to-refine/products/cotton-viscose/cotton-viscose-05-open-structure.jpeg b/assets-to-refine/products/cotton-viscose/cotton-viscose-05-open-structure.jpeg new file mode 100644 index 0000000..6f973d2 Binary files /dev/null and b/assets-to-refine/products/cotton-viscose/cotton-viscose-05-open-structure.jpeg differ diff --git a/assets-to-refine/products/imported-exclusive/exclusive-01-alpine-fleece.jpeg b/assets-to-refine/products/imported-exclusive/exclusive-01-alpine-fleece.jpeg new file mode 100644 index 0000000..22ce062 Binary files /dev/null and b/assets-to-refine/products/imported-exclusive/exclusive-01-alpine-fleece.jpeg differ diff --git a/assets-to-refine/products/imported-exclusive/exclusive-02-bamboo.jpeg b/assets-to-refine/products/imported-exclusive/exclusive-02-bamboo.jpeg new file mode 100644 index 0000000..7212fca Binary files /dev/null and b/assets-to-refine/products/imported-exclusive/exclusive-02-bamboo.jpeg differ diff --git a/assets-to-refine/products/imported-exclusive/exclusive-03-blue-construction.jpeg b/assets-to-refine/products/imported-exclusive/exclusive-03-blue-construction.jpeg new file mode 100644 index 0000000..4c25398 Binary files /dev/null and b/assets-to-refine/products/imported-exclusive/exclusive-03-blue-construction.jpeg differ diff --git a/assets-to-refine/products/imported-exclusive/exclusive-04-madagascar.jpeg b/assets-to-refine/products/imported-exclusive/exclusive-04-madagascar.jpeg new file mode 100644 index 0000000..7de29fe Binary files /dev/null and b/assets-to-refine/products/imported-exclusive/exclusive-04-madagascar.jpeg differ diff --git a/assets-to-refine/products/imported-exclusive/exclusive-05-premium-structure.jpeg b/assets-to-refine/products/imported-exclusive/exclusive-05-premium-structure.jpeg new file mode 100644 index 0000000..d136411 Binary files /dev/null and b/assets-to-refine/products/imported-exclusive/exclusive-05-premium-structure.jpeg differ diff --git a/assets-to-refine/products/polyester/polyester-01.jpeg b/assets-to-refine/products/polyester/polyester-01.jpeg new file mode 100644 index 0000000..6c175b2 Binary files /dev/null and b/assets-to-refine/products/polyester/polyester-01.jpeg differ diff --git a/assets-to-refine/products/polyester/polyester-02.jpeg b/assets-to-refine/products/polyester/polyester-02.jpeg new file mode 100644 index 0000000..61b61b9 Binary files /dev/null and b/assets-to-refine/products/polyester/polyester-02.jpeg differ diff --git a/assets-to-refine/products/polyester/polyester-03.jpeg b/assets-to-refine/products/polyester/polyester-03.jpeg new file mode 100644 index 0000000..0c038d3 Binary files /dev/null and b/assets-to-refine/products/polyester/polyester-03.jpeg differ diff --git a/assets-to-refine/products/polyester/polyester-04.jpeg b/assets-to-refine/products/polyester/polyester-04.jpeg new file mode 100644 index 0000000..dde7a84 Binary files /dev/null and b/assets-to-refine/products/polyester/polyester-04.jpeg differ diff --git a/assets-to-refine/products/polyester/polyester-05.jpeg b/assets-to-refine/products/polyester/polyester-05.jpeg new file mode 100644 index 0000000..8221019 Binary files /dev/null and b/assets-to-refine/products/polyester/polyester-05.jpeg differ diff --git a/public/images/library/exclusive-04-madagascar.jpeg b/public/images/library/exclusive-04-madagascar.jpeg new file mode 100644 index 0000000..7de29fe Binary files /dev/null and b/public/images/library/exclusive-04-madagascar.jpeg differ diff --git a/public/images/library/exclusive-05-premium-structure.jpeg b/public/images/library/exclusive-05-premium-structure.jpeg new file mode 100644 index 0000000..d136411 Binary files /dev/null and b/public/images/library/exclusive-05-premium-structure.jpeg differ diff --git a/public/images/library/gallery-01.jpeg b/public/images/library/gallery-01.jpeg new file mode 100644 index 0000000..a8b4503 Binary files /dev/null and b/public/images/library/gallery-01.jpeg differ diff --git a/public/images/library/gallery-02.jpeg b/public/images/library/gallery-02.jpeg new file mode 100644 index 0000000..0f6adb4 Binary files /dev/null and b/public/images/library/gallery-02.jpeg differ diff --git a/public/images/library/gallery-03.jpeg b/public/images/library/gallery-03.jpeg new file mode 100644 index 0000000..fbbfd03 Binary files /dev/null and b/public/images/library/gallery-03.jpeg differ diff --git a/public/images/library/gallery-04.jpeg b/public/images/library/gallery-04.jpeg new file mode 100644 index 0000000..711613c Binary files /dev/null and b/public/images/library/gallery-04.jpeg differ diff --git a/public/images/library/hero-01-viscose.jpeg b/public/images/library/hero-01-viscose.jpeg new file mode 100644 index 0000000..d3383e1 Binary files /dev/null and b/public/images/library/hero-01-viscose.jpeg differ diff --git a/public/images/library/hero-02-tencel-cotton.jpeg b/public/images/library/hero-02-tencel-cotton.jpeg new file mode 100644 index 0000000..4526032 Binary files /dev/null and b/public/images/library/hero-02-tencel-cotton.jpeg differ diff --git a/public/images/library/hero-03-blue-texture.jpeg b/public/images/library/hero-03-blue-texture.jpeg new file mode 100644 index 0000000..31eea9b Binary files /dev/null and b/public/images/library/hero-03-blue-texture.jpeg differ diff --git a/public/images/library/polyester-04.jpeg b/public/images/library/polyester-04.jpeg new file mode 100644 index 0000000..dde7a84 Binary files /dev/null and b/public/images/library/polyester-04.jpeg differ diff --git a/public/images/library/polyester-05.jpeg b/public/images/library/polyester-05.jpeg new file mode 100644 index 0000000..8221019 Binary files /dev/null and b/public/images/library/polyester-05.jpeg differ diff --git a/public/images/refined/gallery/Gemini_Generated_Image_gwchf4gwchf4gwch.jpeg b/public/images/refined/gallery/Gemini_Generated_Image_gwchf4gwchf4gwch.jpeg new file mode 100644 index 0000000..fa921e8 Binary files /dev/null and b/public/images/refined/gallery/Gemini_Generated_Image_gwchf4gwchf4gwch.jpeg differ diff --git a/public/images/refined/gallery/Gemini_Generated_Image_n36uden36uden36u.jpeg b/public/images/refined/gallery/Gemini_Generated_Image_n36uden36uden36u.jpeg new file mode 100644 index 0000000..35227b9 Binary files /dev/null and b/public/images/refined/gallery/Gemini_Generated_Image_n36uden36uden36u.jpeg differ diff --git a/public/images/refined/gallery/Gemini_Generated_Image_v9lfrwv9lfrwv9lf.jpeg b/public/images/refined/gallery/Gemini_Generated_Image_v9lfrwv9lfrwv9lf.jpeg new file mode 100644 index 0000000..324f171 Binary files /dev/null and b/public/images/refined/gallery/Gemini_Generated_Image_v9lfrwv9lfrwv9lf.jpeg differ diff --git a/public/images/refined/hero/Gemini_Generated_Image_41gc6n41gc6n41gc.jpeg b/public/images/refined/hero/Gemini_Generated_Image_41gc6n41gc6n41gc.jpeg new file mode 100644 index 0000000..0a4bfca Binary files /dev/null and b/public/images/refined/hero/Gemini_Generated_Image_41gc6n41gc6n41gc.jpeg differ diff --git a/public/images/refined/hero/Gemini_Generated_Image_al58e4al58e4al58.jpeg b/public/images/refined/hero/Gemini_Generated_Image_al58e4al58e4al58.jpeg new file mode 100644 index 0000000..40fdf5d Binary files /dev/null and b/public/images/refined/hero/Gemini_Generated_Image_al58e4al58e4al58.jpeg differ diff --git a/public/images/refined/hero/Gemini_Generated_Image_jqdm25jqdm25jqdm.jpeg b/public/images/refined/hero/Gemini_Generated_Image_jqdm25jqdm25jqdm.jpeg new file mode 100644 index 0000000..727e1ec Binary files /dev/null and b/public/images/refined/hero/Gemini_Generated_Image_jqdm25jqdm25jqdm.jpeg differ diff --git a/public/images/refined/hero/Gemini_Generated_Image_my47hhmy47hhmy47.jpeg b/public/images/refined/hero/Gemini_Generated_Image_my47hhmy47hhmy47.jpeg new file mode 100644 index 0000000..32d8742 Binary files /dev/null and b/public/images/refined/hero/Gemini_Generated_Image_my47hhmy47hhmy47.jpeg differ diff --git a/public/images/refined/products/active-wear/Gemini_Generated_Image_6iim9q6iim9q6iim.jpeg b/public/images/refined/products/active-wear/Gemini_Generated_Image_6iim9q6iim9q6iim.jpeg new file mode 100644 index 0000000..7d836ac Binary files /dev/null and b/public/images/refined/products/active-wear/Gemini_Generated_Image_6iim9q6iim9q6iim.jpeg differ diff --git a/public/images/refined/products/active-wear/Gemini_Generated_Image_w9uvs8w9uvs8w9uv.jpeg b/public/images/refined/products/active-wear/Gemini_Generated_Image_w9uvs8w9uvs8w9uv.jpeg new file mode 100644 index 0000000..b2ff67f Binary files /dev/null and b/public/images/refined/products/active-wear/Gemini_Generated_Image_w9uvs8w9uvs8w9uv.jpeg differ diff --git a/public/images/refined/products/active-wear/Gemini_Generated_Image_xc9waxc9waxc9wax.jpeg b/public/images/refined/products/active-wear/Gemini_Generated_Image_xc9waxc9waxc9wax.jpeg new file mode 100644 index 0000000..1f29998 Binary files /dev/null and b/public/images/refined/products/active-wear/Gemini_Generated_Image_xc9waxc9waxc9wax.jpeg differ diff --git a/public/images/refined/products/active-wear/Gemini_Generated_Image_ysg0d0ysg0d0ysg0.jpeg b/public/images/refined/products/active-wear/Gemini_Generated_Image_ysg0d0ysg0d0ysg0.jpeg new file mode 100644 index 0000000..204ff91 Binary files /dev/null and b/public/images/refined/products/active-wear/Gemini_Generated_Image_ysg0d0ysg0d0ysg0.jpeg differ diff --git a/public/images/refined/products/cotton-viscose/cotton-viscose-02-viscose.jpeg b/public/images/refined/products/cotton-viscose/cotton-viscose-02-viscose.jpeg new file mode 100644 index 0000000..d3383e1 Binary files /dev/null and b/public/images/refined/products/cotton-viscose/cotton-viscose-02-viscose.jpeg differ diff --git a/public/images/refined/products/cotton-viscose/cotton-viscose-03-tencel-cotton.jpeg b/public/images/refined/products/cotton-viscose/cotton-viscose-03-tencel-cotton.jpeg new file mode 100644 index 0000000..4526032 Binary files /dev/null and b/public/images/refined/products/cotton-viscose/cotton-viscose-03-tencel-cotton.jpeg differ diff --git a/public/images/refined/products/cotton-viscose/cotton-viscose-04-blue-blend.jpeg b/public/images/refined/products/cotton-viscose/cotton-viscose-04-blue-blend.jpeg new file mode 100644 index 0000000..31eea9b Binary files /dev/null and b/public/images/refined/products/cotton-viscose/cotton-viscose-04-blue-blend.jpeg differ diff --git a/public/images/refined/products/imported-exclusive/exclusive-01-alpine-fleece.jpeg b/public/images/refined/products/imported-exclusive/exclusive-01-alpine-fleece.jpeg new file mode 100644 index 0000000..22ce062 Binary files /dev/null and b/public/images/refined/products/imported-exclusive/exclusive-01-alpine-fleece.jpeg differ diff --git a/public/images/refined/products/imported-exclusive/exclusive-02-bamboo.jpeg b/public/images/refined/products/imported-exclusive/exclusive-02-bamboo.jpeg new file mode 100644 index 0000000..7212fca Binary files /dev/null and b/public/images/refined/products/imported-exclusive/exclusive-02-bamboo.jpeg differ diff --git a/public/images/refined/products/imported-exclusive/exclusive-03-blue-construction.jpeg b/public/images/refined/products/imported-exclusive/exclusive-03-blue-construction.jpeg new file mode 100644 index 0000000..4c25398 Binary files /dev/null and b/public/images/refined/products/imported-exclusive/exclusive-03-blue-construction.jpeg differ diff --git a/public/images/refined/products/polyester/Gemini_Generated_Image_cl17jacl17jacl17.jpeg b/public/images/refined/products/polyester/Gemini_Generated_Image_cl17jacl17jacl17.jpeg new file mode 100644 index 0000000..1862d29 Binary files /dev/null and b/public/images/refined/products/polyester/Gemini_Generated_Image_cl17jacl17jacl17.jpeg differ diff --git a/public/images/refined/products/polyester/Gemini_Generated_Image_dsdddmdsdddmdsdd.jpeg b/public/images/refined/products/polyester/Gemini_Generated_Image_dsdddmdsdddmdsdd.jpeg new file mode 100644 index 0000000..51d9310 Binary files /dev/null and b/public/images/refined/products/polyester/Gemini_Generated_Image_dsdddmdsdddmdsdd.jpeg differ diff --git a/public/images/refined/products/polyester/Gemini_Generated_Image_v0zjkuv0zjkuv0zj.jpeg b/public/images/refined/products/polyester/Gemini_Generated_Image_v0zjkuv0zjkuv0zj.jpeg new file mode 100644 index 0000000..ffd228c Binary files /dev/null and b/public/images/refined/products/polyester/Gemini_Generated_Image_v0zjkuv0zjkuv0zj.jpeg differ diff --git a/scripts/optimize-carousel-images.py b/scripts/optimize-carousel-images.py new file mode 100644 index 0000000..9e8dea1 --- /dev/null +++ b/scripts/optimize-carousel-images.py @@ -0,0 +1,42 @@ +"""Pre-scale the carousel imagery so browsers never upscale it. + +The refined fabric shots top out at 1024-1376px, but the full-bleed hero paints +them across up to ~1920 CSS px (3840 device px on retina). Browsers enlarge them +at render time and the knit stitches smear. Resampling once with Lanczos plus a +light unsharp pass keeps the texture readable and, at these sizes, costs about +the same bytes as the originals. Requires Pillow. Generated assets are committed; +runtime needs nothing. +""" +from pathlib import Path +import sys +from PIL import Image, ImageFilter + +ROOT = Path(__file__).resolve().parents[1] +TARGETS = [ROOT / "public" / "images" / "refined" / "hero", + ROOT / "public" / "images" / "refined" / "products"] +LONG_EDGE = 2048 +QUALITY = 82 + + +def optimize(path): + with Image.open(path) as source: + image = source.convert("RGB") + scale = LONG_EDGE / max(image.size) + if scale > 1: + image = image.resize( + (round(image.width * scale), round(image.height * scale)), + Image.Resampling.LANCZOS, + ) + image = image.filter(ImageFilter.UnsharpMask(radius=1.0, percent=60, threshold=3)) + before = path.stat().st_size + image.save(path, quality=QUALITY, optimize=True, progressive=True) + after = path.stat().st_size + print(f"{path.relative_to(ROOT)} {image.size} {before // 1024}KB -> {after // 1024}KB") + + +if __name__ == "__main__": + files = sorted(p for target in TARGETS for p in target.rglob("*.jpeg")) + if not files: + sys.exit("no carousel images found") + for file in files: + optimize(file) diff --git a/src/components/Gallery.jsx b/src/components/Gallery.jsx index 8eef726..c311675 100644 --- a/src/components/Gallery.jsx +++ b/src/components/Gallery.jsx @@ -2,7 +2,15 @@ import { developments } from "../data"; import { Action, SectionHeading } from "./Primitives"; import "./Gallery.css"; -const textures = ["fine", "natural", "structured"]; +const textures = [ + "/images/refined/gallery/Gemini_Generated_Image_gwchf4gwchf4gwch.jpeg", + "/images/refined/gallery/Gemini_Generated_Image_n36uden36uden36u.jpeg", + "/images/refined/gallery/Gemini_Generated_Image_v9lfrwv9lfrwv9lf.jpeg", + "/images/library/gallery-01.jpeg", + "/images/library/gallery-02.jpeg", + "/images/library/gallery-03.jpeg", + "/images/library/gallery-04.jpeg", +]; export default function Gallery({ preview = false }) { const items = preview ? developments.slice(0, 3) : developments; @@ -22,7 +30,7 @@ export default function Gallery({ preview = false }) { ) : ( <> - From greige + From grey
to possibility. @@ -32,7 +40,7 @@ export default function Gallery({ preview = false }) {

{preview ? "A selection of knitted structures showing how yarn, composition and machine setup shape the final fabric character." - : "Selected developments are processed separately as reference samples to explore how a construction can translate after dyeing and finishing. RRS commercially manufactures greige fabric only."} + : "Selected developments are processed separately as reference samples to explore how a construction can translate after dyeing and finishing. RRS commercially manufactures grey fabric only."}

{preview && ( @@ -46,13 +54,12 @@ export default function Gallery({ preview = false }) {
{`Illustrative - Image placeholder

{name}

@@ -75,7 +82,7 @@ export default function Gallery({ preview = false }) { When supplied, processed images will be labelled{" "} Processed Development Reference. Processed samples are for visual reference; RRS commercially manufactures and supplies - greige fabric only. Finished appearance may vary depending on the + grey fabric only. Finished appearance may vary depending on the buyer’s processing and finishing method.

diff --git a/src/components/ImageCarousel.css b/src/components/ImageCarousel.css new file mode 100644 index 0000000..57f2bee --- /dev/null +++ b/src/components/ImageCarousel.css @@ -0,0 +1,78 @@ +.image-carousel { + position: absolute; + inset: 0; + overflow: hidden; + background: var(--wash); + /* Each image owns a 5s slot; the cycle must span every image or the last + one collides with the first and paints over it. */ + --carousel-count: 3; +} +.image-carousel--n2 { + --carousel-count: 2; +} +.image-carousel--n3 { + --carousel-count: 3; +} +.image-carousel--n4 { + --carousel-count: 4; +} +.image-carousel--n5 { + --carousel-count: 5; +} +.image-carousel--n6 { + --carousel-count: 6; +} +.image-carousel__image { + position: absolute; + inset: 0; + display: block; + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0; + animation: carousel-fade calc(var(--carousel-count) * 5s) infinite; +} +.image-carousel__image:nth-child(2) { + animation-delay: 5s; +} +.image-carousel__image:nth-child(3) { + animation-delay: 10s; +} +.image-carousel__image:nth-child(4) { + animation-delay: 15s; +} +.image-carousel__image:nth-child(5) { + animation-delay: 20s; +} +.image-carousel__image:nth-child(6) { + animation-delay: 25s; +} +/* Each slide fades IN over the previous one (which stays opaque beneath it), + so there is never a moment with no image on screen — works for any count. */ +@keyframes carousel-fade { + 0% { + opacity: 0; + transform: scale(1); + } + 4%, + 96% { + opacity: 1; + } + 96% { + transform: scale(1.015); + } + 100% { + opacity: 0; + transform: scale(1.015); + } +} +@media (prefers-reduced-motion: reduce) { + .image-carousel__image { + animation: none; + opacity: 0; + transform: none; + } + .image-carousel__image:first-child { + opacity: 1; + } +} diff --git a/src/components/ImageCarousel.jsx b/src/components/ImageCarousel.jsx new file mode 100644 index 0000000..951885f --- /dev/null +++ b/src/components/ImageCarousel.jsx @@ -0,0 +1,31 @@ +import "./ImageCarousel.css"; + +const defaultImages = [ + "/images/refined/hero/Gemini_Generated_Image_41gc6n41gc6n41gc.jpeg", + "/images/refined/hero/Gemini_Generated_Image_al58e4al58e4al58.jpeg", + "/images/refined/hero/Gemini_Generated_Image_jqdm25jqdm25jqdm.jpeg", + "/images/refined/hero/Gemini_Generated_Image_my47hhmy47hhmy47.jpeg", +]; + +export default function ImageCarousel({ + images = defaultImages, + className = "", +}) { + return ( + + ); +} diff --git a/src/components/Layout.css b/src/components/Layout.css index 05f0e09..7286460 100644 --- a/src/components/Layout.css +++ b/src/components/Layout.css @@ -31,10 +31,31 @@ top: 10px; } .site-header { - border-top: 4px solid var(--industrial); border-bottom: 1px solid var(--line); background: #faf9f5; } +.contact-strip { + display: flex; + justify-content: space-between; + gap: 24px; + padding: 9px var(--page-gutter); + background: #111; + color: #fff; + font-size: 10px; + letter-spacing: 0.04em; +} +.contact-strip__details { + display: flex; + gap: 12px; +} +.contact-strip a { + color: inherit; + text-decoration: none; +} +.contact-strip a:hover { + text-decoration: underline; + text-underline-offset: 3px; +} .site-header__inner { display: flex; justify-content: space-between; @@ -46,16 +67,26 @@ .brand { display: inline-flex; align-items: center; + gap: 16px; + color: var(--ink); + text-decoration: none; } .brand__logo { display: block; - width: 92px; + width: 76px; height: auto; } +.brand__name { + padding-left: 16px; + border-left: 1px solid var(--line); + font-size: 13px; + font-weight: 600; + white-space: nowrap; +} .site-nav { display: flex; align-items: center; - gap: 34px; + gap: 25px; } .site-nav__link { position: relative; @@ -84,7 +115,7 @@ display: flex; align-items: center; gap: 30px; - margin-left: 45px; + margin-left: 18px; padding: 12px 20px; border: 1px solid var(--industrial-deep); border-radius: 30px; @@ -262,14 +293,30 @@ gap: 30px; } } -@media (max-width: 760px) { +@media (max-width: 900px) { .site-header__inner { min-height: 80px; flex-wrap: wrap; gap: 0; } .brand__logo { - width: 78px; + width: 62px; + } + .brand__name { + padding-left: 10px; + font-size: 11px; + } + .contact-strip { + align-items: center; + padding-block: 8px; + } + .contact-strip > span { + display: none; + } + .contact-strip__details { + width: 100%; + justify-content: center; + gap: 8px; } .site-header__toggle { display: flex; diff --git a/src/components/Layout.jsx b/src/components/Layout.jsx index 92c8484..a096893 100644 --- a/src/components/Layout.jsx +++ b/src/components/Layout.jsx @@ -14,6 +14,7 @@ function Brand() { width="1024" height="809" /> + {company.shortName} ); } @@ -31,6 +32,22 @@ function Header() { } }} > +
+ Contact RRS +
+ {company.email ? ( + {company.email} + ) : ( + Email to be supplied + )} + + {company.phone ? ( + {company.phone} + ) : ( + Phone to be supplied + )} +
+
@@ -118,7 +135,7 @@ function Footer() { © {new Date().getFullYear()} Radhe Radhe Synthetics Pvt. Ltd. - Commercial supply: greige fabric only. + Commercial supply: grey fabric only. Back to top ↑ @@ -135,7 +152,7 @@ export function ContactBanner({ next construction? ), - text = "Talk to RRS about fabric structure, yarn combinations, bulk requirements or new developments.", + text = "Talk to us about fabric structure, yarn combinations, bulk requirements or new developments.", }) { return (
diff --git a/src/components/Primitives.jsx b/src/components/Primitives.jsx index a8ef64e..d63a2bc 100644 --- a/src/components/Primitives.jsx +++ b/src/components/Primitives.jsx @@ -33,7 +33,7 @@ export function Action({ children, to, variant = "dark" }) { } export function WhatsAppAction({ - children = "Talk to us on WhatsApp", + children = "Talk to us", variant = "dark", direct = false, }) { @@ -84,31 +84,31 @@ export function SectionHeading({ label, title, children, centered = false }) { } export function Textile({ - kind = "natural", + src, className = "", caption = true, eager = false, }) { return ( -
+
Illustrative knitted texture — not an RRS product photograph {caption && (
- Illustrative texture · RRS photography to follow + Reference fabric · Production photography to follow
)}
); } -export function PageHero({ label, title, children, texture = "natural" }) { +export function PageHero({ label, title, children, src }) { return (
@@ -116,10 +116,10 @@ export function PageHero({ label, title, children, texture = "natural" }) {

{title}

{children}
- Radhe Radhe Synthetics · Greige knitted fabrics + RadheRadhe Pvt. Ltd. · Grey knitted fabrics
- +
); } diff --git a/src/components/Stats.jsx b/src/components/Stats.jsx index d6bb422..7e71635 100644 --- a/src/components/Stats.jsx +++ b/src/components/Stats.jsx @@ -10,7 +10,7 @@ const facts = [ }, { label: "Our specialisation", - value: "Greige", + value: "Grey", unit: "Knitted fabrics only", text: "The starting point for a world of possibilities.", }, diff --git a/src/data.js b/src/data.js index ce6aa2d..9eb7f74 100644 --- a/src/data.js +++ b/src/data.js @@ -1,7 +1,8 @@ export const company = Object.freeze({ name: "Radhe Radhe Synthetics Pvt. Ltd.", + shortName: "RadheRadhe Pvt. Ltd.", description: - "Greige knitted fabrics engineered for diverse apparel applications.", + "Grey knitted fabrics engineered for diverse apparel applications.", whatsapp: "", // Supply the business number in international digits, without + or spaces. phone: "", email: "", @@ -12,28 +13,29 @@ export const company = Object.freeze({ export const navigation = [ { to: "/", label: "Home" }, { to: "/fabrics", label: "Fabrics" }, + { to: "/products", label: "Products" }, { to: "/about", label: "Manufacturing" }, { to: "/contact", label: "Contact" }, ]; export const capabilities = [ { - title: "01 · Develop", + title: "Develop", subtitle: "Define the construction", text: "The requirement begins with the intended application, yarn, blend, structure and fabric character.", }, { - title: "02 · Configure", + title: "Configure", subtitle: "Match yarn to machine", text: "Machine configuration and yarn selection are aligned to the construction being developed.", }, { - title: "03 · Manufacture", + title: "Manufacture", subtitle: "Circular knitting at scale", - text: "The approved construction moves into greige production across the appropriate circular-knitting setup.", + text: "The approved construction moves into grey production across the appropriate circular-knitting setup.", }, { - title: "04 · Repeat", + title: "Repeat", subtitle: "Maintain bulk consistency", text: "Successful developments are reproduced with repeatability across commercial manufacturing quantities.", }, @@ -42,7 +44,7 @@ export const capabilities = [ export const applications = [ { title: "Shirting constructions", - text: "Greige knitted fabrics developed for shirt and apparel applications.", + text: "Grey knitted fabrics developed for shirt and apparel applications.", }, { title: "Textured knits", @@ -58,6 +60,50 @@ export const applications = [ }, ]; +export const products = [ + { + title: "Polyester", + text: "Versatile knitted constructions developed for everyday apparel and repeat production.", + categories: ["Daily-wear T-shirts", "Joggers", "Innerwear"], + images: [ + "/images/refined/products/polyester/Gemini_Generated_Image_cl17jacl17jacl17.jpeg", + "/images/refined/products/polyester/Gemini_Generated_Image_dsdddmdsdddmdsdd.jpeg", + "/images/refined/products/polyester/Gemini_Generated_Image_v0zjkuv0zjkuv0zj.jpeg", + ], + }, + { + title: "Active Wear", + text: "Performance-led constructions for movement, stretch and active applications.", + categories: ["Sports fabrics", "Yoga", "Pilates"], + images: [ + "/images/refined/products/active-wear/Gemini_Generated_Image_6iim9q6iim9q6iim.jpeg", + "/images/refined/products/active-wear/Gemini_Generated_Image_w9uvs8w9uvs8w9uv.jpeg", + "/images/refined/products/active-wear/Gemini_Generated_Image_xc9waxc9waxc9wax.jpeg", + "/images/refined/products/active-wear/Gemini_Generated_Image_ysg0d0ysg0d0ysg0.jpeg", + ], + }, + { + title: "Imported / Exclusive Fabrics", + text: "Selected distinctive constructions for requirements beyond standard fabric programmes.", + categories: [], + images: [ + "/images/refined/products/imported-exclusive/exclusive-01-alpine-fleece.jpeg", + "/images/refined/products/imported-exclusive/exclusive-02-bamboo.jpeg", + "/images/refined/products/imported-exclusive/exclusive-03-blue-construction.jpeg", + ], + }, + { + title: "Cotton & Viscose", + text: "Soft, breathable constructions for varied garment and womenswear applications.", + categories: ["Garments", "Women’s wear"], + images: [ + "/images/refined/products/cotton-viscose/cotton-viscose-02-viscose.jpeg", + "/images/refined/products/cotton-viscose/cotton-viscose-03-tencel-cotton.jpeg", + "/images/refined/products/cotton-viscose/cotton-viscose-04-blue-blend.jpeg", + ], + }, +]; + export const yarns = [ "Polyester", "Cotton", diff --git a/src/main.jsx b/src/main.jsx index cde9b45..b2c6092 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -8,6 +8,7 @@ import Home from "./pages/Home"; import Fabrics from "./pages/Fabrics"; import About from "./pages/About"; import Contact from "./pages/Contact"; +import Products from "./pages/Products"; import "./base.css"; function NotFound() { @@ -31,6 +32,7 @@ createRoot(document.getElementById("root")).render( }> } /> } /> + } /> } /> } /> } /> diff --git a/src/pages/About.jsx b/src/pages/About.jsx index e8f3d2d..2c8ce8b 100644 --- a/src/pages/About.jsx +++ b/src/pages/About.jsx @@ -24,7 +24,7 @@ const process = [ }, { title: "Repeat.", - text: "Successful developments are reproduced consistently in commercial greige production.", + text: "Successful developments are reproduced consistently in commercial grey production.", }, ]; @@ -82,6 +82,7 @@ export default function About() { <> Built around @@ -92,7 +93,7 @@ export default function About() { > {" "}

- Radhe Radhe Synthetics is a specialist manufacturer of greige knitted + Radhe Radhe Synthetics is a specialist manufacturer of grey knitted fabrics with a focus on consistent bulk production and continuous fabric development.

diff --git a/src/pages/Contact.jsx b/src/pages/Contact.jsx index 5bd6a0a..03e552e 100644 --- a/src/pages/Contact.jsx +++ b/src/pages/Contact.jsx @@ -60,7 +60,7 @@ export default function Contact() { fabric requirement. } - texture="structured" + src="/images/library/hero-02-tencel-cotton.jpeg" >

Share an existing requirement, bulk quantity or new construction with diff --git a/src/pages/Fabrics.jsx b/src/pages/Fabrics.jsx index 60b1908..16aece2 100644 --- a/src/pages/Fabrics.jsx +++ b/src/pages/Fabrics.jsx @@ -10,6 +10,7 @@ export default function Fabrics() { <> Different yarns. @@ -19,8 +20,8 @@ export default function Fabrics() { } >

- RRS manufactures greige knitted fabrics across diverse yarns, fibres - and blends, with constructions developed according to the required + RRS manufactures grey knitted fabrics across diverse yarns, fibres and + blends, with constructions developed according to the required texture, appearance and apparel application.

diff --git a/src/pages/Home.css b/src/pages/Home.css index 5b704cd..85f3b9d 100644 --- a/src/pages/Home.css +++ b/src/pages/Home.css @@ -6,27 +6,24 @@ overflow: hidden; min-height: 768px; margin-inline: calc(0px - var(--page-gutter)); - color: var(--paper); - background: var(--ink); -} -.home-hero__image { - position: absolute; - inset: 0; - width: 100%; - height: 100%; - object-fit: cover; - object-position: center 65%; + color: var(--ink); + background: var(--wash); } .home-hero__shade { position: absolute; inset: 0; - background: - linear-gradient(90deg, #132630e8 0%, #1f3239a8 54%, #17262f73 100%), - linear-gradient(0deg, #111b22b5 0%, transparent 45%); + z-index: 1; + background: linear-gradient( + 90deg, + #f5f3eef5 0%, + #f5f3eed1 42%, + #f5f3ee5c 70%, + transparent 100% + ); } .home-hero__content { position: relative; - z-index: 1; + z-index: 2; max-width: 900px; padding: 65px 62px 90px; } @@ -41,7 +38,7 @@ .home-hero__description { max-width: 400px; margin: 0 0 30px; - color: #eeece5; + color: var(--muted); font-size: 15px; line-height: 1.8; } @@ -52,6 +49,7 @@ } .home-hero__bottom { position: absolute; + z-index: 2; bottom: 0; left: var(--page-gutter); right: var(--page-gutter); @@ -59,18 +57,18 @@ justify-content: space-between; gap: 20px; padding: 20px 0; - border-top: 1px solid #ffffff35; + border-top: 1px solid #282a2330; font-size: 11px; line-height: 1.6; } .home-hero__tagline { font-size: clamp(14px, 1.2vw, 16px); font-weight: 500; - color: #ffffff; + color: var(--ink); letter-spacing: 0.01em; } .home-hero__image-note { - color: #e2e2dc; + color: var(--muted); } .home-intro { display: grid; diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index d2de25e..75bc021 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -9,12 +9,18 @@ import { } from "../components/Primitives"; import { ContactBanner } from "../components/Layout"; import Gallery from "../components/Gallery"; +import ImageCarousel from "../components/ImageCarousel"; import Stats from "../components/Stats"; import "./Home.css"; const processItems = capabilities.map((capability, index) => ({ ...capability, - image: ["fine", "natural", "structured", "fine"][index], + image: [ + "/images/library/polyester-04.jpeg", + "/images/library/polyester-05.jpeg", + "/images/library/exclusive-04-madagascar.jpeg", + "/images/library/exclusive-05-premium-structure.jpeg", + ][index], href: index < 2 ? "/fabrics#applications" : "/fabrics#production", })); @@ -22,14 +28,7 @@ export default function Home() { return ( <>
- Original illustrative macro knit texture, pending RRS photography +
Specialist circular-knitting manufacturer · RRS @@ -39,15 +38,15 @@ export default function Home() { Built to repeat.

- Greige knitted fabrics developed around yarn, structure and + Grey knitted fabrics developed around yarn, structure and application—then manufactured for consistent commercial supply.

- + Explore our fabrics - - Request a quote + + Talk to us
@@ -66,14 +65,14 @@ export default function Home() {
Our fabrics

- Greige is where + Grey is where
it begins.

- RRS specialises in circular-knitted greige fabrics developed for + RRS specialises in circular-knitted grey fabrics developed for varied apparel applications.

@@ -118,7 +117,7 @@ export default function Home() { See our capability

- + ))}
diff --git a/src/pages/Products.css b/src/pages/Products.css new file mode 100644 index 0000000..649e579 --- /dev/null +++ b/src/pages/Products.css @@ -0,0 +1,156 @@ +.products-hero { + position: relative; + display: flex; + align-items: center; + min-height: 680px; + margin-inline: calc(0px - var(--page-gutter)); + overflow: hidden; + color: var(--ink); +} +.products-hero__shade { + position: absolute; + inset: 0; + z-index: 1; + background: linear-gradient( + 90deg, + #f5f3eef5 0%, + #f5f3eed1 42%, + #f5f3ee5c 70%, + transparent 100% + ); +} +.products-hero__content { + position: relative; + z-index: 2; + width: min(650px, 65%); + padding: 80px var(--page-gutter) 110px; +} +.products-hero__title { + margin: 28px 0 24px; + font-family: var(--serif); + font-size: clamp(54px, 6.5vw, 92px); + font-weight: 400; + line-height: 0.98; + letter-spacing: -0.045em; +} +.products-hero__text { + max-width: 460px; + margin: 0; + font-size: 15px; + line-height: 1.8; +} +.products-hero__note { + position: absolute; + z-index: 2; + right: var(--page-gutter); + bottom: 24px; + margin: 0; + font-size: 10px; + color: var(--muted); +} +.products-list { + padding-top: 95px; +} +.products-list__grid { + border-top: 1px solid var(--line); +} +.product { + display: grid; + grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr); + align-items: center; + gap: clamp(36px, 7vw, 110px); + padding: 58px 0; + border-bottom: 1px solid var(--line); +} +.product:nth-child(even) .product__visual { + order: 2; +} +.product__visual { + position: relative; + min-height: 0; + aspect-ratio: 16 / 10; + overflow: hidden; + background: var(--wash); +} +.product__visual img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} +.product__visual span { + position: absolute; + left: 14px; + bottom: 14px; + padding: 7px 10px; + background: #f5f3eedb; + font-size: 10px; +} +.product__copy { + max-width: 520px; +} +.product__title { + margin: 0 0 20px; + font-family: var(--serif); + font-size: clamp(38px, 4.5vw, 64px); + font-weight: 500; + line-height: 1; + letter-spacing: -0.035em; +} +.product__text { + max-width: 440px; + margin: 0; + color: var(--muted); + font-size: 14px; + line-height: 1.9; +} +.product__categories { + display: flex; + flex-wrap: wrap; + gap: 10px 0; + margin: 26px 0 0; + padding: 0; + list-style: none; +} +.product__categories li { + font-size: 12px; +} +.product__categories li + li::before { + content: "/"; + margin: 0 12px; + color: var(--muted); +} +@media (max-width: 700px) { + .products-hero { + min-height: 560px; + } + .products-hero__shade { + background: linear-gradient(90deg, #f5f3eef2, #f5f3ee8a); + } + .products-hero__content { + width: 100%; + padding-bottom: 100px; + } + .products-hero__title { + font-size: clamp(46px, 13vw, 72px); + } + .products-hero__note { + left: var(--page-gutter); + right: var(--page-gutter); + } + .products-list { + padding-top: 60px; + } + .product { + grid-template-columns: 1fr; + gap: 28px; + padding: 42px 0; + } + .product:nth-child(even) .product__visual { + order: 0; + } + .product__visual { + min-height: 0; + aspect-ratio: 4 / 3; + } +} diff --git a/src/pages/Products.jsx b/src/pages/Products.jsx new file mode 100644 index 0000000..3deb866 --- /dev/null +++ b/src/pages/Products.jsx @@ -0,0 +1,69 @@ +import { products } from "../data"; +import ImageCarousel from "../components/ImageCarousel"; +import { ContactBanner } from "../components/Layout"; +import { Eyebrow, SectionHeading } from "../components/Primitives"; +import "./Products.css"; + +export default function Products() { + return ( + <> +
+ +
+
+ Products +

+ Knitted for +
+ everyday performance. +

+

+ Explore the product families RRS manufactures across everyday, + active, exclusive and natural-fibre applications. +

+
+

+ Illustrative product imagery · RRS photography to follow +

+
+
+ + Built around +
+ the application. + + } + > +

+ Each family can be developed around the required structure, yarn, + handle and commercial quantity. +

+
+
+ {products.map(({ title, text, categories, images }) => ( +
+
+ +
+
+

{title}

+

{text}

+ {categories.length > 0 && ( +
    + {categories.map((category) => ( +
  • {category}
  • + ))} +
+ )} +
+
+ ))} +
+
+ + + ); +} diff --git a/tests/site.spec.js b/tests/site.spec.js index 060aeb6..1b46e51 100644 --- a/tests/site.spec.js +++ b/tests/site.spec.js @@ -4,6 +4,7 @@ import { whatsappUrl } from "../src/data.js"; const pages = [ ["/", "Built to develop."], ["/fabrics", "Different yarns."], + ["/products", "Knitted for"], ["/about", "Built around"], ["/contact", "Bring us your"], ]; @@ -79,12 +80,13 @@ test("desktop navigation, anchored CTA and browser back work", async ({ .getByRole("link", { name: "Fabrics", exact: true }), ).toHaveAttribute("aria-current", "page"); await page - .getByRole("link", { name: "Talk to us on WhatsApp", exact: true }) + .locator(".contact-banner") + .getByRole("link", { name: "Talk to us", exact: true }) .click(); await expect(page).toHaveURL("/contact#whatsapp"); await expect(page.locator("#whatsapp")).toBeInViewport(); await expect( - page.getByRole("button", { name: "Talk to us on WhatsApp", exact: true }), + page.getByRole("button", { name: "Talk to us", exact: true }), ).toBeDisabled(); await expect(page.locator("#whatsapp-status")).toContainText( "number to be supplied", @@ -93,7 +95,8 @@ test("desktop navigation, anchored CTA and browser back work", async ({ await expect(page).toHaveURL("/fabrics"); await page.goto("/contact#whatsapp"); await page - .getByRole("link", { name: "Talk to us on WhatsApp", exact: true }) + .locator(".contact-banner") + .getByRole("link", { name: "Talk to us", exact: true }) .click(); await expect(page.locator("#whatsapp")).toBeInViewport(); }); @@ -198,7 +201,7 @@ test("homepage presents proof, fabrics and process in that order", async ({ await page.goto("/"); const fabricsHeading = page.getByRole("heading", { level: 2, - name: "Greige is where it begins.", + name: "Grey is where it begins.", }); const developmentsHeading = page.getByRole("heading", { level: 2, @@ -215,6 +218,28 @@ test("homepage presents proof, fabrics and process in that order", async ({ expect(sections.indexOf("gallery")).toBeLessThan(sections.indexOf("process")); }); +test("home and products heroes cycle through four product images", async ({ + page, +}) => { + for (const path of ["/", "/products"]) { + await page.goto(path); + const slides = page + .locator(".image-carousel") + .first() + .locator(".image-carousel__image"); + await expect(slides).toHaveCount(4); + expect( + await slides.first().evaluate((image) => image.getAnimations().length), + ).toBeGreaterThan(0); + } + await page.goto("/products"); + await expect(page.locator(".product")).toHaveCount(4); + await expect( + page.getByText("Daily-wear T-shirts", { exact: true }), + ).toBeVisible(); + await expect(page.getByText("Women’s wear", { exact: true })).toBeVisible(); +}); + test("capacity values roll in opposite directions and settle at 60–70", async ({ page, }) => {