@runwell/shopify-toolkit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +87 -0
  2. package/bin/runwell-shopify +98 -0
  3. package/lib/add.js +66 -0
  4. package/lib/config-loader.js +47 -0
  5. package/lib/doctor.js +66 -0
  6. package/lib/list.js +31 -0
  7. package/lib/remove.js +37 -0
  8. package/lib/sync.js +107 -0
  9. package/lib/template.js +57 -0
  10. package/lib/validate.js +23 -0
  11. package/modules/comparison-table/README.md +17 -0
  12. package/modules/comparison-table/module.json +50 -0
  13. package/modules/comparison-table/sections/runwell-comparison-table.liquid +157 -0
  14. package/modules/delivery-estimate/README.md +17 -0
  15. package/modules/delivery-estimate/module.json +14 -0
  16. package/modules/delivery-estimate/snippets/runwell-delivery-estimate.liquid +39 -0
  17. package/modules/editorial-block/README.md +17 -0
  18. package/modules/editorial-block/module.json +40 -0
  19. package/modules/editorial-block/sections/runwell-editorial-block.liquid +155 -0
  20. package/modules/editorial-hero/README.md +17 -0
  21. package/modules/editorial-hero/module.json +61 -0
  22. package/modules/editorial-hero/sections/runwell-video-hero.liquid +151 -0
  23. package/modules/exit-intent/README.md +18 -0
  24. package/modules/exit-intent/assets/runwell-exit-intent.js +54 -0
  25. package/modules/exit-intent/module.json +33 -0
  26. package/modules/exit-intent/sections/runwell-exit-intent.liquid +48 -0
  27. package/modules/faq/README.md +17 -0
  28. package/modules/faq/module.json +35 -0
  29. package/modules/faq/sections/runwell-faq.liquid +66 -0
  30. package/modules/how-it-works/README.md +17 -0
  31. package/modules/how-it-works/module.json +57 -0
  32. package/modules/how-it-works/sections/runwell-how-it-works.liquid +99 -0
  33. package/modules/inventory-urgency/README.md +17 -0
  34. package/modules/inventory-urgency/module.json +14 -0
  35. package/modules/inventory-urgency/snippets/runwell-inventory-urgency.liquid +19 -0
  36. package/modules/pdp-ingredients/README.md +17 -0
  37. package/modules/pdp-ingredients/module.json +40 -0
  38. package/modules/pdp-ingredients/sections/runwell-ingredients.liquid +139 -0
  39. package/modules/pdp-journal-link/README.md +17 -0
  40. package/modules/pdp-journal-link/module.json +53 -0
  41. package/modules/pdp-journal-link/sections/runwell-pdp-journal.liquid +124 -0
  42. package/modules/pdp-trust-checks/README.md +17 -0
  43. package/modules/pdp-trust-checks/module.json +49 -0
  44. package/modules/pdp-trust-checks/sections/runwell-pdp-trust.liquid +141 -0
  45. package/modules/post-purchase-upsell/README.md +52 -0
  46. package/modules/post-purchase-upsell/admin/discount-setup.md +25 -0
  47. package/modules/post-purchase-upsell/admin/order-status-paste.html +31 -0
  48. package/modules/post-purchase-upsell/assets/runwell-thank-you.css +119 -0
  49. package/modules/post-purchase-upsell/assets/runwell-thank-you.js +162 -0
  50. package/modules/post-purchase-upsell/module.json +44 -0
  51. package/modules/press-bar/README.md +17 -0
  52. package/modules/press-bar/module.json +30 -0
  53. package/modules/press-bar/sections/runwell-press-bar.liquid +119 -0
  54. package/modules/recently-viewed/README.md +18 -0
  55. package/modules/recently-viewed/assets/runwell-recently-viewed.js +57 -0
  56. package/modules/recently-viewed/module.json +33 -0
  57. package/modules/recently-viewed/sections/runwell-recently-viewed.liquid +38 -0
  58. package/modules/reviews/README.md +17 -0
  59. package/modules/reviews/module.json +20 -0
  60. package/modules/reviews/sections/runwell-pdp-reviews.liquid +93 -0
  61. package/modules/risk-reversal/README.md +17 -0
  62. package/modules/risk-reversal/module.json +49 -0
  63. package/modules/risk-reversal/sections/runwell-risk-reversal.liquid +94 -0
  64. package/modules/shipping-bar/README.md +17 -0
  65. package/modules/shipping-bar/module.json +45 -0
  66. package/modules/shipping-bar/sections/runwell-shipping-bar.liquid +95 -0
  67. package/modules/sticky-atc/README.md +17 -0
  68. package/modules/sticky-atc/module.json +14 -0
  69. package/modules/sticky-atc/sections/runwell-pdp-sticky.liquid +78 -0
  70. package/modules/testimonials/README.md +17 -0
  71. package/modules/testimonials/module.json +35 -0
  72. package/modules/testimonials/sections/runwell-testimonials.liquid +87 -0
  73. package/modules/trust-badges/README.md +17 -0
  74. package/modules/trust-badges/module.json +25 -0
  75. package/modules/trust-badges/sections/runwell-trust-badges.liquid +93 -0
  76. package/package.json +45 -0
@@ -0,0 +1,87 @@
1
+ {%- comment -%}
2
+ Lushi testimonials / UGC strip. Three-up grid of customer quotes with
3
+ source name + product/lifestyle context. CRO tips 6, 8, 9: social proof
4
+ scattered across the site, unique angles, customer voices.
5
+ {%- endcomment -%}
6
+
7
+ <section
8
+ class="runwell-testimonials"
9
+ style="background: {{ section.settings.background_color | default: '#F5F0EE' }}; color: {{ section.settings.text_color | default: '#0B3D38' }};">
10
+ <div class="runwell-testimonials__inner">
11
+ {%- if section.settings.eyebrow != blank -%}
12
+ <p class="runwell-testimonials__eyebrow">{{ section.settings.eyebrow }}</p>
13
+ {%- endif -%}
14
+ {%- if section.settings.heading != blank -%}
15
+ <h2 class="runwell-testimonials__heading">{{ section.settings.heading }}</h2>
16
+ {%- endif -%}
17
+ <div class="runwell-testimonials__grid">
18
+ {%- for block in section.blocks -%}
19
+ <figure {{ block.shopify_attributes }} class="runwell-testimonials__card">
20
+ {%- if block.settings.rating != blank -%}
21
+ <div class="runwell-testimonials__stars" aria-label="{{ block.settings.rating }} out of 5">
22
+ {%- assign s = block.settings.rating | times: 1 -%}
23
+ {%- for i in (1..5) -%}
24
+ {%- if i <= s -%}★{%- else -%}☆{%- endif -%}
25
+ {%- endfor -%}
26
+ </div>
27
+ {%- endif -%}
28
+ {%- if block.settings.quote != blank -%}
29
+ <blockquote class="runwell-testimonials__quote">{{ block.settings.quote }}</blockquote>
30
+ {%- endif -%}
31
+ <figcaption class="runwell-testimonials__caption">
32
+ {%- if block.settings.author != blank -%}
33
+ <span class="runwell-testimonials__author">{{ block.settings.author }}</span>
34
+ {%- endif -%}
35
+ {%- if block.settings.context != blank -%}
36
+ <span class="runwell-testimonials__context">{{ block.settings.context }}</span>
37
+ {%- endif -%}
38
+ </figcaption>
39
+ </figure>
40
+ {%- endfor -%}
41
+ </div>
42
+ </div>
43
+ </section>
44
+
45
+ {% schema %}
46
+ {
47
+ "name": "Lushi testimonials",
48
+ "tag": "section",
49
+ "class": "section-runwell-testimonials",
50
+ "settings": [
51
+ { "type": "text", "id": "eyebrow", "label": "Eyebrow", "default": "From the inbox" },
52
+ { "type": "text", "id": "heading", "label": "Heading", "default": "What customers are writing in." },
53
+ { "type": "color", "id": "background_color", "label": "Background", "default": "#F5F0EE" },
54
+ { "type": "color", "id": "text_color", "label": "Text", "default": "#0B3D38" }
55
+ ],
56
+ "blocks": [
57
+ {
58
+ "type": "quote",
59
+ "name": "Quote",
60
+ "settings": [
61
+ { "type": "textarea", "id": "quote", "label": "Quote" },
62
+ { "type": "text", "id": "author", "label": "Author" },
63
+ { "type": "text", "id": "context", "label": "Context (city, product, etc.)" },
64
+ { "type": "select", "id": "rating", "label": "Star rating", "default": "5",
65
+ "options": [
66
+ { "value": "0", "label": "None" },
67
+ { "value": "3", "label": "3" },
68
+ { "value": "4", "label": "4" },
69
+ { "value": "5", "label": "5" }
70
+ ]
71
+ }
72
+ ]
73
+ }
74
+ ],
75
+ "max_blocks": 6,
76
+ "presets": [
77
+ {
78
+ "name": "Lushi testimonials",
79
+ "blocks": [
80
+ { "type": "quote", "settings": { "quote": "First magnesium I have actually felt working. Read the journal post twice before ordering and now I get why they only carry the glycinate form.", "author": "Margaux, Brooklyn", "context": "Daily Magnesium Glycinate", "rating": "5" } },
81
+ { "type": "quote", "settings": { "quote": "I have tried four collagen brands. This one mixes clean in cold coffee and does not have that fishy aftertaste I gave up trying to mask.", "author": "Priya, Austin", "context": "Marine Collagen Peptides", "rating": "5" } },
82
+ { "type": "quote", "settings": { "quote": "The way you explain the why on every product is unlike anything else in wellness. Half the reason I bought was the journal post, not the marketing.", "author": "Jordan, Los Angeles", "context": "Lipid Repair Face Oil", "rating": "5" } }
83
+ ]
84
+ }
85
+ ]
86
+ }
87
+ {% endschema %}
@@ -0,0 +1,17 @@
1
+ # trust-badges
2
+
3
+ Lushi trust badges. Migrated from Lushi (`sections/lushi-trust-badges.liquid`) into the Runwell Shopify Toolkit.
4
+
5
+ Category: `social-proof`
6
+
7
+ ## Files
8
+
9
+ - `sections/runwell-trust-badges.liquid`
10
+
11
+ ## Config
12
+
13
+ See `module.json` config schema. Defaults match the original Lushi defaults; override per client in `runwell.config.json`.
14
+
15
+ ## Lineage
16
+
17
+ This module was extracted from the Lushi build (Capital V) and generalised. The original lives at `lushi-shopify/sections/lushi-trust-badges.liquid`. The toolkit version uses `runwell-` class prefixes and pulls brand vars from the client config.
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "trust-badges",
3
+ "version": "0.1.0",
4
+ "category": "social-proof",
5
+ "description": "Lushi trust badges module migrated from Lushi.",
6
+ "files": {
7
+ "sections": [
8
+ "sections/runwell-trust-badges.liquid"
9
+ ]
10
+ },
11
+ "config": {
12
+ "schema": {
13
+ "background_color": {
14
+ "type": "string",
15
+ "default": "#F5F0EE",
16
+ "label": "Background color"
17
+ },
18
+ "text_color": {
19
+ "type": "string",
20
+ "default": "#0B3D38",
21
+ "label": "Text color"
22
+ }
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,93 @@
1
+ {%- comment -%}
2
+ Lushi trust badges row. Drops on PDP under the buy form (or on cart,
3
+ collection, or homepage). Renders 3 to 6 trust signals: secure
4
+ checkout, returns, shipping, payment logos. Per Blueprint §3.4 and
5
+ CRO §5.3 (foundational trust signals).
6
+ {%- endcomment -%}
7
+
8
+ <section
9
+ class="runwell-trust-badges"
10
+ style="background: {{ section.settings.background_color }}; color: {{ section.settings.text_color }};"
11
+ >
12
+ <div style="max-width: 1200px; margin: 0 auto; padding: clamp(1.6rem, 3vw, 2.4rem) 6vw;">
13
+ <div style="display: flex; flex-wrap: wrap; align-items: center; justify-content: space-around; gap: 1.5rem;">
14
+ {%- for block in section.blocks -%}
15
+ <div {{ block.shopify_attributes }} style="display: flex; align-items: center; gap: 0.6rem; min-width: 0;">
16
+ <div style="font-size: 1.6rem; line-height: 1; opacity: 0.7;">
17
+ {{ block.settings.icon }}
18
+ </div>
19
+ <div style="min-width: 0;">
20
+ <div style="font-family: var(--font-body-family); font-size: 0.78rem; font-weight: 700; letter-spacing: 0.04em; line-height: 1.2;">
21
+ {{ block.settings.title }}
22
+ </div>
23
+ {%- if block.settings.body != blank -%}
24
+ <div style="font-family: var(--font-body-family); font-size: 0.72rem; opacity: 0.7; line-height: 1.3; margin-top: 0.15rem;">
25
+ {{ block.settings.body }}
26
+ </div>
27
+ {%- endif -%}
28
+ </div>
29
+ </div>
30
+ {%- endfor -%}
31
+ </div>
32
+ </div>
33
+ </section>
34
+
35
+ {% schema %}
36
+ {
37
+ "name": "Lushi trust badges",
38
+ "tag": "section",
39
+ "class": "section-runwell-trust-badges",
40
+ "settings": [
41
+ {
42
+ "type": "color",
43
+ "id": "background_color",
44
+ "label": "Background color",
45
+ "default": "#F5F0EE"
46
+ },
47
+ {
48
+ "type": "color",
49
+ "id": "text_color",
50
+ "label": "Text color",
51
+ "default": "#0B3D38"
52
+ }
53
+ ],
54
+ "blocks": [
55
+ {
56
+ "type": "badge",
57
+ "name": "Badge",
58
+ "settings": [
59
+ {
60
+ "type": "text",
61
+ "id": "icon",
62
+ "label": "Icon (emoji or single char)",
63
+ "info": "Use an emoji or single character; rendered at 1.6rem.",
64
+ "default": "✓"
65
+ },
66
+ {
67
+ "type": "text",
68
+ "id": "title",
69
+ "label": "Title",
70
+ "default": "Free shipping over $75"
71
+ },
72
+ {
73
+ "type": "text",
74
+ "id": "body",
75
+ "label": "Subtitle"
76
+ }
77
+ ]
78
+ }
79
+ ],
80
+ "max_blocks": 6,
81
+ "presets": [
82
+ {
83
+ "name": "Lushi trust badges",
84
+ "blocks": [
85
+ { "type": "badge", "settings": { "icon": "✓", "title": "Free shipping over $75", "body": "On all US orders" } },
86
+ { "type": "badge", "settings": { "icon": "↺", "title": "30-day returns", "body": "No-hassle satisfaction promise" } },
87
+ { "type": "badge", "settings": { "icon": "★", "title": "Editorially curated", "body": "Every product on Lushi clears 4 checks" } },
88
+ { "type": "badge", "settings": { "icon": "⊕", "title": "Secure checkout", "body": "Encrypted at every step" } }
89
+ ]
90
+ }
91
+ ]
92
+ }
93
+ {% endschema %}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@runwell/shopify-toolkit",
3
+ "version": "0.1.0",
4
+ "description": "Reusable Shopify theme modules from Runwell. Replaces typically app-driven features (reviews, wishlist, urgency, FAQ, post-purchase upsell, exit popups, free-ship progress, sticky ATC, testimonials, badges, bundles) with native Liquid + JS + CSS that ship across multiple client themes via a config-driven sync CLI.",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "bin": {
8
+ "runwell-shopify": "bin/runwell-shopify"
9
+ },
10
+ "files": [
11
+ "bin/",
12
+ "lib/",
13
+ "modules/",
14
+ "schemas/",
15
+ "README.md",
16
+ "ARCHITECTURE.md",
17
+ "LICENSE"
18
+ ],
19
+ "scripts": {
20
+ "test": "node --test test/",
21
+ "lint": "echo 'todo: eslint config'",
22
+ "release": "npm publish --access restricted"
23
+ },
24
+ "keywords": [
25
+ "shopify",
26
+ "liquid",
27
+ "theme",
28
+ "cro",
29
+ "ecommerce",
30
+ "runwell"
31
+ ],
32
+ "author": "Runwell <hello@runwell.systems>",
33
+ "license": "UNLICENSED",
34
+ "publishConfig": {
35
+ "registry": "https://registry.npmjs.org/",
36
+ "access": "restricted"
37
+ },
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/louayelbiche/runwell-shopify-toolkit.git"
44
+ }
45
+ }