jekyll-before-after 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8a21883c118e8086f562f69af0804ec131bf49ff1166485abe8e1f4b23c657e0
4
+ data.tar.gz: 724bb4a84e30680bd90f347a1c6ce4596790d49bf113bc5243dc5376976903b7
5
+ SHA512:
6
+ metadata.gz: ee01f6091029ec8d399a8331babc95b098135433ea150ebfae8cd7b5c77fc285e4cc6f03716e28d6d21ccf5947285c5473fab2878d102241b8315ecc2fb134fd
7
+ data.tar.gz: 33bae04da7fe2bcd3ecb8762a75ade05ee4d32e885f99630b06853328bd7f418b241ac1eb461b1383f4ca915f3a91b16dd32d693ee447d595fb56696124f2c16
data/CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ This project adheres to [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
5
+
6
+ ## [0.1.0] - 2026-08-22
7
+
8
+ ### Added
9
+ - `{% before_after %}` Liquid tag for drag-to-reveal image comparison sliders
10
+ - Horizontal and vertical orientation support
11
+ - Configurable start position (0–100, default 50)
12
+ - Before/after overlay labels
13
+ - Responsive image support with optional `srcset_before` / `srcset_after`
14
+ - Vanilla JS with Pointer Events API (mouse, touch, stylus)
15
+ - Keyboard navigation (arrow keys, shift for 1% increments)
16
+ - `ResizeObserver` for responsive recalculation
17
+ - Click-anywhere-to-jump behavior
18
+ - Script deduplication — single `<script>` block per page for multiple sliders
19
+ - Accessible: `role="slider"`, `aria-valuenow/min/max`, `tabindex`, alt text
20
+ - `_before-after.scss` with CSS custom property theming
21
+ - GitHub Pages compatible
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,19 @@
1
+ # Contributing to jekyll-before-after
2
+
3
+ Bug reports and pull requests are welcome on GitHub at https://github.com/jchance/jekyll-before-after.
4
+
5
+ ## Development
6
+
7
+ ```bash
8
+ git clone https://github.com/jchance/jekyll-before-after.git
9
+ cd jekyll-before-after
10
+ bundle install
11
+ bundle exec ruby -Ilib:test test/test_before_after_tag.rb
12
+ ```
13
+
14
+ ## Pull Requests
15
+
16
+ - Keep changes focused and minimal
17
+ - Add or update tests for any new behavior
18
+ - Update the README and CHANGELOG
19
+ - Follow the existing code style
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jason Chance
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # jekyll-before-after
2
+
3
+ A Jekyll plugin providing a `{% before_after %}` Liquid tag for rendering a polished, accessible drag-to-reveal image comparison slider. Supports horizontal and vertical orientations, overlay labels, responsive images, keyboard navigation, and full CSS custom property theming. Pure vanilla JS — no external dependencies, GitHub Pages compatible.
4
+
5
+ ## Installation
6
+
7
+ Add to your `Gemfile`:
8
+
9
+ ```ruby
10
+ gem "jekyll-before-after"
11
+ ```
12
+
13
+ Add to `_config.yml`:
14
+
15
+ ```yaml
16
+ plugins:
17
+ - jekyll-before-after
18
+ ```
19
+
20
+ Copy `_before-after.scss` to your site's CSS directory and import it.
21
+
22
+ Run `bundle install`.
23
+
24
+ ## Usage
25
+
26
+ ```liquid
27
+ {% before_after
28
+ before="/images/main-street-2018.jpg"
29
+ after="/images/main-street-2024.jpg"
30
+ before_label="2018"
31
+ after_label="2024"
32
+ %}
33
+ ```
34
+
35
+ ### All options
36
+
37
+ | Option | Default | Description |
38
+ |--------|---------|-------------|
39
+ | `before` | _(required)_ | Path to the "before" image |
40
+ | `after` | _(required)_ | Path to the "after" image |
41
+ | `before_label` | `"Before"` | Label overlaid on the before side |
42
+ | `after_label` | `"After"` | Label overlaid on the after side |
43
+ | `start` | `50` | Initial slider position (0–100) |
44
+ | `orientation` | `horizontal` | `horizontal` or `vertical` |
45
+ | `alt_before` | `""` | Alt text for the before image |
46
+ | `alt_after` | `""` | Alt text for the after image |
47
+ | `srcset_before` | `""` | `srcset` value for responsive before image |
48
+ | `srcset_after` | `""` | `srcset` value for responsive after image |
49
+ | `sizes` | `"(max-width: 768px) 100vw, 100vw"` | `sizes` attribute when using srcset |
50
+
51
+ ### Responsive images
52
+
53
+ Pass `srcset_before` and `srcset_after` to render a `<picture>` element:
54
+
55
+ ```liquid
56
+ {% before_after
57
+ before="/images/street-before.jpg"
58
+ after="/images/street-after.jpg"
59
+ srcset_before="/images/street-before-480.jpg 480w, /images/street-before-960.jpg 960w"
60
+ srcset_after="/images/street-after-480.jpg 480w, /images/street-after-960.jpg 960w"
61
+ sizes="(max-width: 600px) 100vw, 80vw"
62
+ %}
63
+ ```
64
+
65
+ ### Vertical orientation
66
+
67
+ ```liquid
68
+ {% before_after
69
+ before="/images/building-2015.jpg"
70
+ after="/images/building-2025.jpg"
71
+ orientation=vertical
72
+ before_label="2015"
73
+ after_label="2025"
74
+ %}
75
+ ```
76
+
77
+ ### Multiple sliders
78
+
79
+ Multiple sliders on the same page are fully supported. The JavaScript block is emitted only once per page regardless of how many sliders you include.
80
+
81
+ ## Configuration
82
+
83
+ Set site-wide defaults in `_config.yml`:
84
+
85
+ ```yaml
86
+ before_after:
87
+ start: 50
88
+ orientation: horizontal
89
+ before_label: "Before"
90
+ after_label: "After"
91
+ ```
92
+
93
+ ## Styling
94
+
95
+ Copy `_before-after.scss` to your project and import it. All visual properties are controlled via CSS custom properties:
96
+
97
+ | Variable | Default | Description |
98
+ |----------|---------|-------------|
99
+ | `--ba-handle-color` | `#fff` | Handle line and knob color |
100
+ | `--ba-knob-size` | `2.75rem` | Drag knob diameter |
101
+ | `--ba-knob-icon-color` | `#333` | Arrow icon color inside knob |
102
+ | `--ba-line-width` | `2px` | Divider line thickness |
103
+ | `--ba-label-bg` | `rgba(0,0,0,0.55)` | Label background |
104
+ | `--ba-label-color` | `#fff` | Label text color |
105
+ | `--ba-label-radius` | `3px` | Label border radius |
106
+ | `--ba-radius` | `4px` | Container border radius |
107
+ | `--ba-focus-ring` | `rgba(255,255,255,0.8)` | Keyboard focus ring color |
108
+
109
+ ### Example override
110
+
111
+ ```scss
112
+ .before-after {
113
+ --ba-handle-color: #e67e22;
114
+ --ba-knob-size: 3rem;
115
+ --ba-label-bg: rgba(0, 0, 0, 0.75);
116
+ }
117
+ ```
118
+
119
+ ## Interaction
120
+
121
+ - **Drag** the handle to reveal
122
+ - **Click** anywhere on the image to jump the slider to that position
123
+ - **Keyboard**: focus the handle and use arrow keys (5% steps; hold Shift for 1% steps)
124
+ - **Touch** and stylus supported via Pointer Events API
125
+
126
+ ## Requirements
127
+
128
+ - Jekyll >= 3.9
129
+ - Ruby >= 2.7
130
+
131
+ ## License
132
+
133
+ MIT — see [LICENSE.txt](LICENSE.txt).
@@ -0,0 +1,144 @@
1
+ // jekyll-before-after — copy to your site's CSS/SCSS directory and @import or @use it.
2
+
3
+ .before-after {
4
+ position: relative;
5
+ overflow: hidden;
6
+ cursor: col-resize;
7
+ user-select: none;
8
+ touch-action: none;
9
+ border-radius: var(--ba-radius, 4px);
10
+ background: var(--ba-bg, #000);
11
+
12
+ &[data-orientation="vertical"] {
13
+ cursor: row-resize;
14
+ }
15
+
16
+ &--dragging {
17
+ cursor: grabbing;
18
+ }
19
+ }
20
+
21
+ // After pane: normal flow — its img drives the container height
22
+ .before-after__after {
23
+ position: relative;
24
+ display: block;
25
+
26
+ img,
27
+ picture img {
28
+ display: block;
29
+ width: 100%;
30
+ height: auto;
31
+ pointer-events: none;
32
+ }
33
+ }
34
+
35
+ // Before pane: absolutely stacked on top, clipped by JS
36
+ .before-after__before {
37
+ position: absolute;
38
+ inset: 0;
39
+ z-index: 1;
40
+ clip-path: inset(0 50% 0 0); // overridden by JS on init
41
+
42
+ img,
43
+ picture img {
44
+ display: block;
45
+ width: 100%;
46
+ height: 100%;
47
+ object-fit: cover;
48
+ pointer-events: none;
49
+ }
50
+ }
51
+
52
+ // Labels
53
+ .before-after__label {
54
+ position: absolute;
55
+ bottom: 0.75rem;
56
+ z-index: 2;
57
+ padding: 0.25rem 0.6rem;
58
+ font-size: 0.75rem;
59
+ font-weight: 600;
60
+ letter-spacing: 0.04em;
61
+ text-transform: uppercase;
62
+ background: var(--ba-label-bg, rgba(0, 0, 0, 0.55));
63
+ color: var(--ba-label-color, #fff);
64
+ border-radius: var(--ba-label-radius, 3px);
65
+ pointer-events: none;
66
+
67
+ &--before {
68
+ left: 0.75rem;
69
+ }
70
+
71
+ &--after {
72
+ right: 0.75rem;
73
+ }
74
+ }
75
+
76
+ // Handle
77
+ .before-after__handle {
78
+ position: absolute;
79
+ top: 50%;
80
+ left: 50%; // overridden by JS
81
+ transform: translate(-50%, -50%);
82
+ z-index: 10;
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ outline: none;
87
+
88
+ &:focus-visible .before-after__handle-knob {
89
+ box-shadow: 0 0 0 3px var(--ba-focus-ring, rgba(255, 255, 255, 0.8));
90
+ }
91
+ }
92
+
93
+ .before-after__handle-line {
94
+ position: absolute;
95
+ background: var(--ba-handle-color, #fff);
96
+ opacity: 0.85;
97
+
98
+ .before-after:not([data-orientation="vertical"]) & {
99
+ width: var(--ba-line-width, 2px);
100
+ top: -200%;
101
+ bottom: -200%;
102
+ left: 50%;
103
+ transform: translateX(-50%);
104
+ }
105
+
106
+ [data-orientation="vertical"] & {
107
+ height: var(--ba-line-width, 2px);
108
+ left: -200%;
109
+ right: -200%;
110
+ top: 50%;
111
+ transform: translateY(-50%);
112
+ }
113
+ }
114
+
115
+ .before-after__handle-knob {
116
+ position: relative;
117
+ z-index: 1;
118
+ width: var(--ba-knob-size, 2.75rem);
119
+ height: var(--ba-knob-size, 2.75rem);
120
+ border-radius: 50%;
121
+ background: var(--ba-handle-color, #fff);
122
+ color: var(--ba-knob-icon-color, #333);
123
+ display: flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
127
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
128
+ cursor: grab;
129
+
130
+ svg {
131
+ width: 1.1rem;
132
+ height: 1.1rem;
133
+ }
134
+
135
+ .before-after--dragging & {
136
+ cursor: grabbing;
137
+ transform: scale(1.12);
138
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.45);
139
+ }
140
+
141
+ [data-orientation="vertical"] & svg {
142
+ transform: rotate(90deg);
143
+ }
144
+ }
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "jekyll-before-after"
5
+ spec.version = "0.1.0"
6
+ spec.authors = ["Jason Chance"]
7
+ spec.email = ["jason@jasonchance.com"]
8
+
9
+ spec.summary = "Jekyll plugin providing a before_after Liquid tag for drag-to-reveal image comparison sliders."
10
+ spec.description = "A Jekyll plugin that provides a {% before_after %} Liquid tag for rendering a polished, accessible drag-to-reveal image comparison slider. Supports horizontal and vertical orientations, configurable start position, overlay labels, responsive images, keyboard navigation, and full CSS custom property theming. Pure vanilla JS, no external dependencies, GitHub Pages compatible."
11
+ spec.homepage = "https://jasonchance.com/projects/jekyll-before-after/"
12
+ spec.license = "MIT"
13
+
14
+ spec.required_ruby_version = ">= 2.7"
15
+
16
+ spec.files = Dir["lib/**/*", "*.md", "*.txt", "*.gemspec", "_before-after.scss"]
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_runtime_dependency "jekyll", ">= 3.9", "< 5.0"
20
+ end
@@ -0,0 +1,193 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll"
4
+
5
+ module Jekyll
6
+ BEFORE_AFTER_ATTR_RE = /(\w+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S+))/
7
+
8
+ def self.parse_ba_attrs(markup)
9
+ attrs = {}
10
+ markup.scan(BEFORE_AFTER_ATTR_RE) do |key, double, single, bare|
11
+ attrs[key] = double || single || bare
12
+ end
13
+ attrs
14
+ end
15
+
16
+ # Dedup script: only emit the JS block once per page
17
+ BEFORE_AFTER_SCRIPT_FLAG = :before_after_script_emitted
18
+
19
+ class BeforeAfterTag < Liquid::Tag
20
+ def initialize(tag_name, markup, tokens)
21
+ super
22
+ @attributes = Jekyll.parse_ba_attrs(markup)
23
+ end
24
+
25
+ def render(context)
26
+ config = context.registers[:site]&.config&.dig("before_after") || {}
27
+ before = @attributes["before"] || ""
28
+ after = @attributes["after"] || ""
29
+ b_label = @attributes["before_label"] || config["before_label"] || "Before"
30
+ a_label = @attributes["after_label"] || config["after_label"] || "After"
31
+ start = (@attributes["start"] || config["start"] || 50).to_i
32
+ orient = @attributes["orientation"] || config["orientation"] || "horizontal"
33
+ alt_b = @attributes["alt_before"] || ""
34
+ alt_a = @attributes["alt_after"] || ""
35
+ srcset_b = @attributes["srcset_before"] || ""
36
+ srcset_a = @attributes["srcset_after"] || ""
37
+ sizes = @attributes["sizes"] || "(max-width: 768px) 100vw, 100vw"
38
+
39
+ before_img = build_img(before, alt_b, srcset_b, sizes)
40
+ after_img = build_img(after, alt_a, srcset_a, sizes)
41
+
42
+ script_block = emit_script(context)
43
+
44
+ <<~HTML
45
+ <div class="before-after" data-orientation="#{orient}" data-start="#{start}">
46
+ <div class="before-after__before">
47
+ #{before_img}
48
+ #{b_label.empty? ? "" : %(<span class="before-after__label before-after__label--before">#{b_label}</span>)}
49
+ </div>
50
+ <div class="before-after__after">
51
+ #{after_img}
52
+ #{a_label.empty? ? "" : %(<span class="before-after__label before-after__label--after">#{a_label}</span>)}
53
+ </div>
54
+ <div class="before-after__handle"
55
+ role="slider"
56
+ aria-label="Image comparison slider"
57
+ aria-valuenow="#{start}"
58
+ aria-valuemin="0"
59
+ aria-valuemax="100"
60
+ tabindex="0">
61
+ <div class="before-after__handle-line"></div>
62
+ <div class="before-after__handle-knob">
63
+ <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
64
+ <path d="M8 5l-5 7 5 7M16 5l5 7-5 7" stroke="currentColor" stroke-width="2"
65
+ stroke-linecap="round" stroke-linejoin="round" fill="none"/>
66
+ </svg>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ #{script_block}
71
+ HTML
72
+ end
73
+
74
+ private
75
+
76
+ def build_img(src, alt, srcset, sizes)
77
+ if srcset && !srcset.empty?
78
+ %(<picture><source srcset="#{srcset}" sizes="#{sizes}"><img src="#{src}" alt="#{alt}" loading="lazy" draggable="false"></picture>)
79
+ else
80
+ %(<img src="#{src}" alt="#{alt}" loading="lazy" draggable="false">)
81
+ end
82
+ end
83
+
84
+ def emit_script(context)
85
+ return "" if context.registers[BEFORE_AFTER_SCRIPT_FLAG]
86
+ context.registers[BEFORE_AFTER_SCRIPT_FLAG] = true
87
+ <<~JS
88
+ <script>
89
+ (function() {
90
+ function initSlider(el) {
91
+ var orientation = el.dataset.orientation === "vertical" ? "vertical" : "horizontal";
92
+ var handle = el.querySelector(".before-after__handle");
93
+ var beforePane = el.querySelector(".before-after__before");
94
+ var start = parseFloat(el.dataset.start) || 50;
95
+ var dragging = false;
96
+
97
+ function setPosition(pct) {
98
+ pct = Math.min(100, Math.max(0, pct));
99
+ if (orientation === "vertical") {
100
+ beforePane.style.clipPath = "inset(0 0 " + (100 - pct) + "% 0)";
101
+ handle.style.top = pct + "%";
102
+ handle.style.left = "";
103
+ } else {
104
+ beforePane.style.clipPath = "inset(0 " + (100 - pct) + "% 0 0)";
105
+ handle.style.left = pct + "%";
106
+ handle.style.top = "";
107
+ }
108
+ handle.setAttribute("aria-valuenow", Math.round(pct));
109
+ }
110
+
111
+ function pctFromEvent(e) {
112
+ var rect = el.getBoundingClientRect();
113
+ if (orientation === "vertical") {
114
+ return ((e.clientY - rect.top) / rect.height) * 100;
115
+ } else {
116
+ return ((e.clientX - rect.left) / rect.width) * 100;
117
+ }
118
+ }
119
+
120
+ handle.addEventListener("pointerdown", function(e) {
121
+ dragging = true;
122
+ handle.setPointerCapture(e.pointerId);
123
+ el.classList.add("before-after--dragging");
124
+ e.preventDefault();
125
+ });
126
+
127
+ handle.addEventListener("pointermove", function(e) {
128
+ if (!dragging) return;
129
+ setPosition(pctFromEvent(e));
130
+ });
131
+
132
+ handle.addEventListener("pointerup", function() {
133
+ dragging = false;
134
+ el.classList.remove("before-after--dragging");
135
+ });
136
+
137
+ handle.addEventListener("pointercancel", function() {
138
+ dragging = false;
139
+ el.classList.remove("before-after--dragging");
140
+ });
141
+
142
+ // Keyboard support
143
+ handle.addEventListener("keydown", function(e) {
144
+ var step = e.shiftKey ? 1 : 5;
145
+ var cur = parseFloat(handle.getAttribute("aria-valuenow")) || 50;
146
+ if (e.key === "ArrowRight" || e.key === "ArrowDown") {
147
+ setPosition(cur + step);
148
+ e.preventDefault();
149
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
150
+ setPosition(cur - step);
151
+ e.preventDefault();
152
+ }
153
+ });
154
+
155
+ // Click anywhere on container to jump
156
+ el.addEventListener("pointerdown", function(e) {
157
+ if (e.target === handle || handle.contains(e.target)) return;
158
+ setPosition(pctFromEvent(e));
159
+ });
160
+
161
+ // Recalculate on resize
162
+ if (window.ResizeObserver) {
163
+ new ResizeObserver(function() {
164
+ var cur = parseFloat(handle.getAttribute("aria-valuenow")) || start;
165
+ setPosition(cur);
166
+ }).observe(el);
167
+ }
168
+
169
+ setPosition(start);
170
+ }
171
+
172
+ function init() {
173
+ document.querySelectorAll(".before-after").forEach(function(el) {
174
+ if (!el.dataset.baInit) {
175
+ el.dataset.baInit = "1";
176
+ initSlider(el);
177
+ }
178
+ });
179
+ }
180
+
181
+ if (document.readyState === "loading") {
182
+ document.addEventListener("DOMContentLoaded", init);
183
+ } else {
184
+ init();
185
+ }
186
+ })();
187
+ </script>
188
+ JS
189
+ end
190
+ end
191
+ end
192
+
193
+ Liquid::Template.register_tag("before_after", Jekyll::BeforeAfterTag)
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll/before_after_tag"
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-before-after
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jason Chance
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2026-08-22 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: jekyll
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '3.9'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '5.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '3.9'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '5.0'
32
+ description: A Jekyll plugin that provides a {% before_after %} Liquid tag for rendering
33
+ a polished, accessible drag-to-reveal image comparison slider. Supports horizontal
34
+ and vertical orientations, configurable start position, overlay labels, responsive
35
+ images, keyboard navigation, and full CSS custom property theming. Pure vanilla
36
+ JS, no external dependencies, GitHub Pages compatible.
37
+ email:
38
+ - jason@jasonchance.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - CHANGELOG.md
44
+ - CONTRIBUTING.md
45
+ - LICENSE.txt
46
+ - README.md
47
+ - _before-after.scss
48
+ - jekyll-before-after.gemspec
49
+ - lib/jekyll-before-after.rb
50
+ - lib/jekyll/before_after_tag.rb
51
+ homepage: https://jasonchance.com/projects/jekyll-before-after/
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '2.7'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubygems_version: 3.6.2
70
+ specification_version: 4
71
+ summary: Jekyll plugin providing a before_after Liquid tag for drag-to-reveal image
72
+ comparison sliders.
73
+ test_files: []