sliderpro-agentic-skills-etch 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.
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # sliderpro-agentic-skills-etch
2
+
3
+ Installs the Slider Pro for Etch AI Connector skills files and component prop docs into any
4
+ project, so users do not have to clone or download the docs repo by hand.
5
+
6
+ ```
7
+ npx sliderpro-agentic-skills-etch
8
+ ```
9
+
10
+ Installs into the current directory:
11
+
12
+ ```
13
+ slider-skills/slider-pro-skills.md
14
+ slider-skills/slider-pro-skills-reference.md
15
+ components/*.md
16
+ ```
17
+
18
+ Options: `--force` / `-f` to overwrite an existing install, a path argument to install elsewhere
19
+ (e.g. `npx sliderpro-agentic-skills-etch ./my-site-project`), `--help` / `-h`.
20
+
21
+ ## Maintaining this package
22
+
23
+ `skills-package/` is a **generated copy**, not a source of truth. The real files live at:
24
+
25
+ - `../slider-skills/slider-pro-skills.md`
26
+ - `../slider-skills/slider-pro-skills-reference.md`
27
+ - `../../components/*.md`
28
+
29
+ Whenever those change, regenerate the bundle before publishing:
30
+
31
+ ```
32
+ npm run build
33
+ ```
34
+
35
+ This also runs automatically via `prepublishOnly` before `npm publish`.
36
+
37
+ The build rewrites the links that only make sense inside the docs repo. `../../components/`
38
+ becomes `../components/`, because the installed layout is one folder shallower. Links to sibling
39
+ doc pages that do **not** ship in the package (`../../card-stack-templates.md` and friends) are
40
+ rewritten to the public GitBook URLs. The build fails if any `../../` link survives, so a broken
41
+ link cannot reach npm.
42
+
43
+ The prop tables inside the reference file are themselves generated, from the Etch component export
44
+ in the plugin repo:
45
+
46
+ ```
47
+ node tools/gen-prop-tables.mjs --splice "<docs>/ai-connector/slider-skills/slider-pro-skills-reference.md"
48
+ ```
49
+
50
+ Re-run that after any component change, then `npm run build` here.
51
+
52
+ ## Publishing a new version
53
+
54
+ ```
55
+ npm version patch # or minor/major
56
+ npm run build
57
+ npm publish
58
+ ```
59
+
60
+ (Requires `npm adduser` / `npm login` first.)
package/bin/cli.js ADDED
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { cpSync, existsSync, mkdirSync, readdirSync } from "node:fs";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const packageRoot = join(__dirname, "..");
9
+ const sourceRoot = join(packageRoot, "skills-package");
10
+
11
+ const DIRS = ["slider-skills", "components"];
12
+
13
+ function printHelp() {
14
+ console.log(`
15
+ sliderpro-agentic-skills-etch - install the Slider Pro AI Connector skills files into a project
16
+
17
+ Usage:
18
+ npx sliderpro-agentic-skills-etch [directory] [options]
19
+
20
+ Options:
21
+ --force, -f Overwrite existing slider-skills/ or components/
22
+ --help, -h Show this help message
23
+
24
+ Examples:
25
+ npx sliderpro-agentic-skills-etch
26
+ npx sliderpro-agentic-skills-etch ./my-site-project
27
+ npx sliderpro-agentic-skills-etch --force
28
+ `);
29
+ }
30
+
31
+ function parseArgs(argv) {
32
+ const options = { force: false, help: false, target: process.cwd() };
33
+
34
+ for (const arg of argv) {
35
+ if (arg === "--help" || arg === "-h") {
36
+ options.help = true;
37
+ } else if (arg === "--force" || arg === "-f") {
38
+ options.force = true;
39
+ } else if (!arg.startsWith("-")) {
40
+ options.target = resolve(arg);
41
+ } else {
42
+ console.error(`Unknown option: ${arg}`);
43
+ printHelp();
44
+ process.exit(1);
45
+ }
46
+ }
47
+
48
+ return options;
49
+ }
50
+
51
+ function listConflicts(target) {
52
+ return DIRS.filter((dir) => existsSync(join(target, dir))).map((dir) => `${dir}/`);
53
+ }
54
+
55
+ function copyPackageFiles(target, force) {
56
+ mkdirSync(target, { recursive: true });
57
+
58
+ for (const dir of DIRS) {
59
+ const source = join(sourceRoot, dir);
60
+ const dest = join(target, dir);
61
+
62
+ if (existsSync(dest) && !force) {
63
+ continue;
64
+ }
65
+
66
+ cpSync(source, dest, { recursive: true });
67
+ }
68
+ }
69
+
70
+ function countComponents() {
71
+ try {
72
+ return readdirSync(join(sourceRoot, "components")).filter((f) => f.endsWith(".md")).length;
73
+ } catch {
74
+ return 0;
75
+ }
76
+ }
77
+
78
+ function main() {
79
+ const { force, help, target } = parseArgs(process.argv.slice(2));
80
+
81
+ if (help) {
82
+ printHelp();
83
+ return;
84
+ }
85
+
86
+ const conflicts = listConflicts(target);
87
+
88
+ if (conflicts.length > 0 && !force) {
89
+ console.error("Installation blocked, the following already exist:");
90
+ for (const conflict of conflicts) {
91
+ console.error(` ${conflict}`);
92
+ }
93
+ console.error("\nRe-run with --force to overwrite.");
94
+ process.exit(1);
95
+ }
96
+
97
+ copyPackageFiles(target, force);
98
+
99
+ console.log(`Installed Slider Pro AI Connector skills to ${target}`);
100
+ console.log(` slider-skills/slider-pro-skills.md`);
101
+ console.log(` slider-skills/slider-pro-skills-reference.md`);
102
+ console.log(` components/ (${countComponents()} component prop docs)`);
103
+ console.log("\nPoint your AI coding agent at slider-skills/slider-pro-skills.md to load it.");
104
+ console.log('Then tell the agent: "npx @digital-gravy/etch-connector serve"');
105
+ }
106
+
107
+ main();
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "sliderpro-agentic-skills-etch",
3
+ "version": "0.1.0",
4
+ "description": "Installs the Slider Pro for Etch AI Connector skills files and component docs into any project",
5
+ "type": "module",
6
+ "bin": {
7
+ "sliderpro-agentic-skills-etch": "bin/cli.js"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "skills-package"
12
+ ],
13
+ "scripts": {
14
+ "build": "node scripts/build.js",
15
+ "prepublishOnly": "node scripts/build.js"
16
+ },
17
+ "engines": {
18
+ "node": ">=18"
19
+ },
20
+ "keywords": [
21
+ "agents",
22
+ "ai",
23
+ "wordpress",
24
+ "etch",
25
+ "slider-pro",
26
+ "sliderpro",
27
+ "splide"
28
+ ],
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/udoro/SliderPro-Etch-Docs.git",
33
+ "directory": "ai-connector/slider-skills-installer"
34
+ }
35
+ }
@@ -0,0 +1,35 @@
1
+ ---
2
+ icon: square
3
+ ---
4
+
5
+ # DWC Slide
6
+
7
+ A single slide, placed inside the **DWC Slider**'s `Slides` slot. It's a plain layout wrapper around whatever content you put inside it.
8
+
9
+ ***
10
+
11
+ ## Settings
12
+
13
+ | Setting | Renders to | Default | Description |
14
+ | --------- | ------------------------------- | ------- | --------------------------------------------------------- |
15
+ | **Class** | `class` (on the slide's inner wrap) | `[]` | Add your own CSS class in this **Class** field to style the slide. |
16
+
17
+ ***
18
+
19
+ ## Slots
20
+
21
+ | Slot | Description |
22
+ | --------- | --------------------------------------- |
23
+ | `Content` (`default`) | The slide's content: div, image, text, anything. |
24
+
25
+ ***
26
+
27
+ ## Slide title
28
+
29
+ A slide can have a **title** that other features can read, most notably [Nav Buttons](dwc-slider-nav-button.md) that show the next/previous slide's name. The title is resolved in this order:
30
+
31
+ 1. A `data-slide-title="…"` attribute on the slide (an explicit title).
32
+ 2. The text of any element inside the slide marked `data-slide-title` (point it at a heading you already have, so nothing is retyped).
33
+ 3. Otherwise, the slide's first heading (`h1`–`h6`).
34
+
35
+ If none of these exist, the slide simply has no title. Titles inside a nested slider or a nav button on the slide are ignored, so they can't leak up.
@@ -0,0 +1,56 @@
1
+ ---
2
+ icon: arrow-right
3
+ ---
4
+
5
+ # DWC Slider Nav Button
6
+
7
+ A clickable prev/next/first/last/jump-to-slide control. Drop it anywhere inside the Wrapper (the main slider, at wrapper level, or even inside a **thumbnail** slider) and it always drives the main slider. Use as many as you like: a prev button, a next button, and a row of "jump to slide" buttons can all coexist.
8
+
9
+ ***
10
+
11
+ ## Settings
12
+
13
+ | Setting | Renders to | Default | Options |
14
+ | --------------------------- | ---------------------------------------------- | ------- | --------- |
15
+ | **Navigation Type** | `data-go-to` | `next` | `Next Slide` / `Previous Slide` / `First Slide` / `Last Slide` / `Go to Slide` |
16
+ | **Custom Slide** | `data-go-to` (used instead, when type is `custom`) | `1` | Any slide number. Slide numbers are **1-based**, so the first slide is `1`, not `0`. |
17
+ | **Button Class** | `class` (on the button) | `[]` | Add your own CSS class in this **Button Class** field to style the button. |
18
+ | **Button Wrapper Class** | `class` (on the outer wrapper) | `[]` | Add a class to the button's outer wrapper, handy for positioning styles such as flex `order` when placing several nav buttons. |
19
+ | **Use Custom Arrow** | – | `false` | Shown only when Navigation Type is Next or Previous. Allows you to use a custom SVG instead of the default arrow icon. |
20
+ | **Custom SVG** | – | – | Shown only when Use Custom Arrow is on. Paste SVG markup here. **Note:** to use custom SVG, enable "Allow \"unsafe\" HTML" in Etch Settings. |
21
+
22
+ If Use Custom Arrow is off, Next and Previous buttons show a default chevron icon; First and Last always use their own default icons. Each button also gets an accessible label automatically (like "go to next slide") for screen readers.
23
+
24
+ ***
25
+
26
+ ## Slots
27
+
28
+ | Slot | Description |
29
+ | ---------------------- | ----------------------------------------------------------------------- |
30
+ | `content` (`Nav_Btn_Content`) | Optional. If left empty, the default icon (or custom SVG) is used. Fill it to replace the button's contents entirely. |
31
+
32
+ ***
33
+
34
+ ## Show the next / previous slide's title
35
+
36
+ A **Next** or **Previous** button can display the title of the slide it will move to (for example a "Next: Apple Watch →" button). Put an element with the `data-slide-title` attribute inside the button's `content` slot (an empty `<span data-slide-title></span>` is enough) and the plugin keeps its text in step with the slider:
37
+
38
+ - It shows the title of the slide that button navigates to, updating every time the slider moves.
39
+ - On a **looping** slider it wraps (Next on the last slide shows the first slide's title). On a non-looping slider it's blank at the end where the button is disabled.
40
+ - The title itself comes from each slide. See [DWC Slide → Slide title](dwc-slide.md#slide-title) for how it's sourced.
41
+
42
+ This applies to **Next** and **Previous** buttons only; other navigation types ignore it.
43
+
44
+ ### Animating the button (`--title-width`)
45
+
46
+ Alongside the text, the plugin sets a **`--title-width`** custom property on the button's outer wrapper (`.dwc-slider-nav-button-wrapper`) equal to the title's width, updated every time the title changes (and `0px` at a non-looping end, where it collapses). Use it to animate the wrapper's width as the text changes, to reveal the title only on hover:
47
+
48
+ ```css
49
+ .dwc-slider-nav-button-wrapper { overflow: hidden; transition: width .25s ease; }
50
+ .dwc-slider-nav-button-wrapper [data-slide-title] { white-space: nowrap; } /* measure the full single-line title */
51
+ .dwc-slider-nav-button-wrapper:hover { width: calc(var(--btn-base, 3rem) + var(--title-width)); }
52
+ ```
53
+
54
+ Give the title element `white-space: nowrap` so `--title-width` reflects the full title, and keep it in the flow: clip it with the wrapper's `overflow: hidden` rather than `display: none`, or its width can't be measured.
55
+
56
+ **Sync the text swap with the animation.** `--title-width` updates the instant the slider moves, but the *visible* text is held back briefly so the wrapper can finish resizing before the new (often longer) title appears. That delay is set on the **slider** with **Slide Title Delay** (`data-slide-title-delay`, milliseconds, default `200`; `0` swaps instantly). See [DWC Slider → Settings](dwc-slider.md#settings). Set it to roughly match your `width` transition duration.
@@ -0,0 +1,60 @@
1
+ ---
2
+ icon: ellipsis
3
+ ---
4
+
5
+ # DWC Slider Pagination
6
+
7
+ A standalone pagination component for full control over how each dot looks, as an alternative to the Slider's built-in **Pagination Dots** toggle (see [DWC Slider](dwc-slider.md#navigation)).
8
+
9
+ Drop it anywhere inside the Wrapper (the main slider, at wrapper level, or even inside a **thumbnail** slider) and it always drives the main slider. Use as many as you like: put one above the slider and one below, and they'll stay in step. Each one keeps its own **Custom Pagination Mode**, so a `Template` pagination and a `Default` one can sit on the same slider.
10
+
11
+ ***
12
+
13
+ ## Settings
14
+
15
+ | Setting | Renders to | Default | Options |
16
+ | -------------------------------- | ---------------------------------------------- | --------- | --------- |
17
+ | **Custom Pagination Mode** | `data-custom-pagination` (lowercased) | `Default` | `Default` / `Template` |
18
+
19
+ ### WRAPPER (shown when mode is Default)
20
+
21
+ | Setting | CSS variable | Default |
22
+ | -------------------------- | ------------------ | --------------------------- |
23
+ | **Background Color** | `--bg` | `rgba(0 0 0 / 40%)` |
24
+ | **Filter Blur** | `--blur` | `5px` |
25
+ | **Padding** | `--padding` | `0.5em 1em` |
26
+ | **Border Radius** | `--radius` | – |
27
+
28
+ ### DOT (shown when mode is Default)
29
+
30
+ | Setting | CSS variable | Default |
31
+ | -------------------------- | ------------------------- | -------------------------------------------------- |
32
+ | **Size** | `--dot-size` | `calc(var(--font-size) * 2)` |
33
+ | **Background** | `--dot-bg` | `color-mix(in oklch, white 20%, transparent)` |
34
+ | **Active Background** | `--dot-bg-active` | `#ff4d6a` |
35
+ | **Border Radius** | `--dot-radius` | `50%` |
36
+ | **Font Size** | `--font-size` | `1rem` |
37
+ | **Text Color** | `--dot-color` | – |
38
+ | **Active Text Color** | `--active-dot-color` | – |
39
+
40
+ ### LAYOUT (always shown)
41
+
42
+ | Setting | CSS variable | Default | Options |
43
+ | ------------------ | -------------------- | --------- | --------- |
44
+ | **Position** | `--position` (lowercased) | `Relative` | `Relative` / `Absolute` / `Static` / `Fixed` |
45
+ | **Z-index** | `--z-index` | `initial` | |
46
+ | **Direction** | `--direction` (lowercased) | `Row` | `Row` / `Column` |
47
+ | **Gap** | `--gap` | `1rem` | |
48
+
49
+ | Setting | Description |
50
+ | ------------ | -------------- |
51
+ | **Class** | Add your own CSS class in this **Class** field to style this component. |
52
+
53
+ ***
54
+
55
+ ## Template mode
56
+
57
+ Set **Custom Pagination Mode** to `Template` and design the *first* item as your template: it gets cloned once per slide automatically. Inside your template, put a number, letter, or roman numeral placeholder as its own word: any digits (`1`, `007`, `2003`), or `a`, `A`, `i`, `I`. It's automatically replaced with that slide's number in the matching format.
58
+
59
+ - **Numbers** count up starting from whatever number you type, so `1` produces `1, 2, 3, ...` while `2003` produces `2003, 2004, 2005, ...`. Leading zeros are preserved as the number grows (`007` → `007, 008, ..., 010, 011, ...`).
60
+ - **Letters and roman numerals** (`a`, `A`, `i`, `I`) always start at the beginning of their sequence (a/b/c…, i/ii/iii…). Only numbers support a custom starting point.
@@ -0,0 +1,25 @@
1
+ ---
2
+ icon: circle-play
3
+ ---
4
+
5
+ # DWC Slider Play-Pause
6
+
7
+ A standalone play/pause button for autoplay, with its own style controls. Drop it anywhere inside the Wrapper (the main slider, at wrapper level, or inside a **thumbnail** slider) and it always controls the main slider's autoplay. It only does anything when the tracked Slider's **Auto Play** setting is on. This is the richer alternative to the Slider's own built-in Play/Pause Button flag (see [DWC Slider](dwc-slider.md#autoplay)).
8
+
9
+ ***
10
+
11
+ ## Settings
12
+
13
+ These style the button. It connects to the main Slider on its own, so you don't need to switch anything on for it to be found. It works whenever the Slider's **Auto Play** is on, and stays active even if you turn the Slider's own built-in **Play/Pause Button** off. (With Auto Play off there's nothing to play or pause, so the button does nothing.)
14
+
15
+ | Setting | CSS variable | Default |
16
+ | --------------------------------- | ------------------------------------ | ---------------------------------------- |
17
+ | **Size** | `--play-pause-size` | `40px` |
18
+ | **Border Radius** | `--play-pause-radius` | `50vw` |
19
+ | **Border** | `--play-pause-border` | `1px solid rgba(255, 255, 255, 0.1)` |
20
+ | **Color** | `--play-pause-clr` | `#fff` |
21
+ | **Hover/Active Border Color** | `--play-pause-hover-border-clr` | `#ff4d6a` |
22
+ | **Background** | `--play-pause-bg` | `rgba(0, 0, 0, 0.4)` |
23
+ | **Hover/Active Background** | `--play-pause-hover-bg` | `rgba(255, 77, 106, 0.1)` |
24
+ | **Background Blur** | `--play-pause-bg-blur` | `8px` |
25
+ | **Class** | Add your own CSS class in this **Class** field to style the button. | `[]` |
@@ -0,0 +1,70 @@
1
+ ---
2
+ icon: gauge-circle-bolt
3
+ ---
4
+
5
+ # DWC Slider Progress
6
+
7
+ A standalone progress indicator (circular, bar, or counter) with its own full set of style controls. Drop it anywhere inside a Wrapper or Slider; it always tracks the **main** (or role-less) Slider, never a `thumbnails` Slider. This is the richer alternative to the Slider's own built-in Bar Progress / Circular Progress / Counter Progress flags (see [DWC Slider](dwc-slider.md#progress)).
8
+
9
+ ***
10
+
11
+ ## Settings
12
+
13
+ | Setting | Renders to | Default | Options |
14
+ | ---------------------- | ------------------------ | ---------- | --------- |
15
+ | **Progress type** | `data-progress-type` | `circular` | `Circular` / `Bar` / `Counter` |
16
+
17
+ ### Circular options (shown when Progress type is Circular)
18
+
19
+ | Setting | Renders to | Default | Description |
20
+ | --------------------------- | -------------------------- | ------- | -------------- |
21
+ | **-- Circular Size (px)** | `data-circular-size` | `52` | Must be more than twice the Circular Radius. |
22
+ | **-- Circular radius (px)** | `data-circular-radius` | `25` | Must be less than half the Circular Size. |
23
+ | **-- Circular Stroke (px)** | `data-circular-stroke` | `3` | Ring thickness. |
24
+ | **-- Circular Counter** | `data-circular-counter` | `true` | Shows/hides the number inside the ring. |
25
+ | **--- Counter Font Size (rem)** | `data-circular-font` | `0.6` | Shown only when Circular Counter is on. |
26
+
27
+ ### Mode (shown unless Progress type is Counter)
28
+
29
+ | Setting | Renders to | Default | Options |
30
+ | ---------------------- | -------------------- | -------- | --------- |
31
+ | **Progress Mode** | `data-progress-mode` | `slides` | `Slides` / `Timer`. Timer mode fills based on time remaining until the next autoplay advance (requires Auto Play to be on for the tracked Slider) |
32
+
33
+ | Setting | Description |
34
+ | ------------ | -------------- |
35
+ | **Class** | Add your own CSS class in this **Class** field to style this component. |
36
+
37
+ ***
38
+
39
+ ## STYLE
40
+
41
+ These control the colors, spacing, and look of the progress indicator.
42
+
43
+ Shown when Progress type is Counter, or when it's Circular with Circular Counter on:
44
+
45
+ | Setting | CSS variable | Default |
46
+ | -------------------------- | ---------------------------- | ---------------------------------- |
47
+ | **Visibility** | – | `Default`. Options: `Default` / `Hide Total` / `Hide Current` |
48
+ | **Total Color** | `--total-clr` | `#8888a0` |
49
+ | **Active Color** | `--progress-clr-active` | `#ff4d6a` |
50
+ | **Font Size** | `--progress-font-size` | `0.8rem` |
51
+ | **Active Font Size** | `--progress-font-size-active` | `var(--progress-font-size)` |
52
+ | **Padding** | `--progress-padding` | `4px 12px` |
53
+ | **Background Blur** | `--progress-bg-blur` | `8px` |
54
+ | **Separator Color** | `--separator-clr` | `var(--total-clr)` |
55
+ | **Separator Gap** | `--separator-gap` | `-0.08em` |
56
+
57
+ Shown when Progress type is Bar or Circular:
58
+
59
+ | Setting | CSS variable | Default |
60
+ | --------------------------- | ---------------------------- | ------------------------------------ |
61
+ | **Progress Fill Color** | `--progress-fill-clr` | `#ff4d6a` |
62
+ | **Progress Track Color** | `--progress-track-clr` | `rgba(255, 255, 255, 0.1)` |
63
+
64
+ Always shown:
65
+
66
+ | Setting | CSS variable | Default |
67
+ | ---------------------- | --------------------------- | ------------------------------------------ |
68
+ | **Background Color** | `--progress-bg` | `rgba(0, 0, 0, 0.4)` |
69
+ | **Border Radius** | `--progress-border-radius` | `20px` |
70
+ | **Border** | `--progress-border` | `1px solid rgba(255, 255, 255, 0.08)` |
@@ -0,0 +1,69 @@
1
+ ---
2
+ icon: rectangle
3
+ ---
4
+
5
+ # DWC Slider Wrapper
6
+
7
+ The outer container. It holds one Slider (or a main Slider plus a thumbnail Slider) and any extra pieces like a counter or progress component.
8
+
9
+ ***
10
+
11
+ ## Settings
12
+
13
+ | Setting | Renders to | Default | Description |
14
+ | ----------------------- | ------ | ------- | ----------------------------------------------------------------------------- |
15
+ | **Wrapper Height** | `--slider-wrapper-height` | `auto` | Sets a minimum height for the wrapper. |
16
+ | **Space Between Sliders** | `--sliders-gap` | – | The space between a main Slider and its thumbnail Slider (or any other items placed directly in the wrapper). |
17
+ | **Custom Class** | `class` | `[]` | Add your own CSS class in this **Custom Class** field to style the wrapper. |
18
+ | **Lazy Load Sliders** | `data-lazy-init` | `false` | Waits to build **every** slider in this wrapper until it's about to scroll into view, as one group. Good for wrappers below the fold. |
19
+ | **Lazy Preload Distance** | `data-lazy-preload` | `200` | Shown once Lazy Load Sliders is on. How many pixels before the wrapper reaches the screen it should start (e.g. `200` or `300px`). |
20
+ | **Pause Sliders on Hover** | `data-group-pause-on-hover` | `false` | When on, hovering or keyboard-focusing **any** slider in this wrapper pauses **all** of them together (both Infinite Scroll marquees and autoplay carousels); they resume once the pointer and focus have both left. See the note below. |
21
+ | **Edge Fade** | `data-edge-fade` | `false` | Fades the left and right edges of the whole wrapper into transparency. |
22
+ | **Fade Distance** | `--fade-width` | `15%` | Shown once Edge Fade is on. How far the fade reaches in from each edge (any CSS length/percentage). |
23
+ | **Fade Softness** | `--fade-softness` | `0.8` | Shown once Edge Fade is on. How gradual the fade is on a `0`–`1` scale, where `1` is softest, `0` a sharp edge. |
24
+ | **Fade Opacity** | `--fade-opacity` | `0%` | Shown once Edge Fade is on. How visible the very edge stays. `0%` fades it fully out (default), up to `100%` for no fade at the edge. |
25
+ | **Sliderless Sync → Custom Element** | `data-sync-custom-el` | – | A CSS selector for your own elements to cycle **without a slider**, in the **Sliderless Sync** group. In this mode the selector matches only elements **inside this wrapper**, so two decks that share a class stay independent. Filling it on a wrapper that has no slider inside turns on [Sync Without Slider](#sync-without-slider); the group's other fields (**Custom Element Nav**, **Loop**, **Leading Zeros**, **Title Delay**, **Arrow Keys**, **Auto Play**, **Interval**, **Pause on Hover**) appear once a selector is entered. Empty = off. |
26
+
27
+ > To lazy-load a **single** slider rather than the whole wrapper, use the **PERFORMANCE** panel on the [DWC Slider](dwc-slider.md#performance) instead. Full details, including the thumbnail-sync safety rule, are in [Lazy loading below-the-fold sliders](../styling-and-responsive.md#lazy-loading-below-the-fold-sliders).
28
+
29
+ > **Pause Sliders on Hover** makes the wrapper the single pause controller for its sliders, so it overrides each slider's own **Pause On Hover**, so moving the pointer from one row to the next won't restart the row you just left. Ideal for stacked logo-marquee rows that should behave as one unit. Nested sliders aren't affected.
30
+
31
+ > **Edge Fade** is also available per-slider on the [DWC Slider → EDGE FADE](dwc-slider.md#edge-fade) panel; enabling it on the wrapper fades a whole stack of sliders at once.
32
+
33
+ ***
34
+
35
+ ## Sync Without Slider
36
+
37
+ Normally [Sync Custom Element](dwc-slider.md#sync-custom-element) needs a real slider to follow: the slider moves, and the plugin mirrors its position onto your elements as `is-active` / `is-prev` / `is-next` classes. **Sync Without Slider** drops that requirement: the wrapper drives your elements directly, with no slider inside at all. It's built for designs that react purely to those three classes (a card stack, a step indicator, a set of tabs) where you never wanted a scrolling track in the first place.
38
+
39
+ **How it works**
40
+
41
+ 1. On the **wrapper**, open the **Sliderless Sync** group and fill in **Custom Element** (`data-sync-custom-el`), a CSS selector pointing at the elements you want to cycle. In sliderless mode the selector matches only elements **inside this wrapper**, so each wrapper drives its own elements and two decks that share a class never affect each other. That's the only switch: a wrapper with this selector and **no slider inside** runs in Sync Without Slider mode automatically. The **first** selector in the list sets both the count and the order, so those elements act as the "slides". (Extra comma-separated selectors still cycle on their own count, exactly as with a real slider.)
42
+ 2. Add your controls inside the wrapper: custom **Nav Buttons** (arrows), a **counter**, **progress**, and **custom pagination** all work, and if you turn on **Custom Element Nav** (in the Sliderless Sync group) the elements themselves become clickable go-to controls.
43
+
44
+ That's it, with no DWC Slider component required. The plugin puts `is-active` on the current element and `is-prev` / `is-next` on its neighbours, and your CSS does the rest.
45
+
46
+ **What works, and what doesn't**
47
+
48
+ - **Works:** custom arrows (including the next/previous [adjacent-slide title](dwc-slider-nav-button.md#show-the-next-previous-slides-title)), counter, bar and circular progress (in slides mode), custom pagination, and clickable synced elements via **Custom Element Nav**. Formatting fields in the **Sliderless Sync** group, **Leading Zeros** (counter) and **Title Delay** (nav-button title), are read from the wrapper.
49
+ - **Controls show up only when you place them:** each control appears simply because you put its component inside the wrapper. There are no separate on/off toggles for it in this mode, and nothing is ever added for you. Drop in a Nav Button, a Counter, a Progress, or a Pagination and it works; leave it out and it's not there.
50
+ - **Looping:** turn on **Loop** for the wrapper (`data-loop="true"`) to make the arrows wrap around; leave it off and the arrows dead-end and disable at the first and last element, just like a non-looping slider.
51
+ - **Arrow keys:** turn on **Arrow Keys** (`data-arrow-keys="true"`) and the Left and Right arrow keys move between elements **while the component has focus**: that is, when the wrapper itself or one of its controls (a Nav Button, or a clickable synced element) is focused. It's deliberately scoped to focus rather than the whole page, so several sliderless wrappers don't all respond to the same keypress and normal page scrolling is left alone. The wrapper is made focusable automatically. Off by default.
52
+ - **Overlapping elements (card stacks):** this mode is built for designs that react to the three classes, and those often stack their elements on top of each other, which makes **Custom Element Nav** clicks land on whichever element the browser decides received them, not the one that looks front-most. Before blaming the nav, read the overlap note under [DWC Slider → Sync Custom Element](dwc-slider.md#sync-custom-element): `opacity: 0` elements still take clicks, and depth applied to a *child* leaves the synced elements flat, so source order decides. It's fixed with `pointer-events` and `z-index` in your own CSS.
53
+ - **Autoplay:** turn on **Auto Play** (`data-autoplay="true"`) and set an **Interval** (`data-interval`, milliseconds, default `4000`) to advance on a timer. It pauses while you hover or keyboard-focus the wrapper (turn that off with **Pause on Hover** = `false`), pauses while the browser tab is in the background, and won't run at all for visitors who prefer reduced motion. On a non-looping wrapper it stops at the last element; turn on **Loop** to keep cycling. There's no play/pause button or timer progress bar in this mode, just the auto-advance.
54
+
55
+ > Leave the wrapper's **Sliderless Sync → Custom Element** empty (the default) and it behaves like a normal wrapper, looking for DWC Slider components inside it as usual. If the wrapper *does* contain a slider, this wrapper-level selector is ignored. Set **Sync Custom Element** on the [slider](dwc-slider.md#sync-custom-element) instead.
56
+
57
+ ***
58
+
59
+ ## Empty state
60
+
61
+ If the wrapper's default slot has no content, it shows a placeholder message in the Etch canvas ("Add **DWC Slider** components here") instead of an empty box. This is builder-only and has no effect on the live site.
62
+
63
+ ***
64
+
65
+ ## Slots
66
+
67
+ | Slot | Description |
68
+ | --------- | ----------------------------------------------------------------------------------------------- |
69
+ | `default` (`Sliders_and_Controls`) | Everything inside the wrapper: one or more DWC Slider components, plus any navigation, pagination, progress, or play/pause components. |