diff --git a/.eslintrc.json b/.eslintrc.json index 8c5701a..7dc6ff5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -36,7 +36,7 @@ "parserOptions": { "ecmaFeatures": { "jsx": true }, "sourceType": "module", - "project": "./tsconfig.json" + "project": ["./tsconfig.json", "./tests/js/tsconfig.json"] }, "plugins": ["@typescript-eslint"], "rules": { diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c9a7561..b8f535a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,27 +34,22 @@ jobs: - name: Build Plugin ZIP run: make zip - - name: Create Release and Upload Asset - uses: softprops/action-gh-release@v1 - with: - tag_name: v${{ steps.get_version.outputs.VERSION }} - name: v${{ steps.get_version.outputs.VERSION }} - generate_release_notes: true - files: core-carousel.zip - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Prepare Distribution Bundle - run: | - mkdir dist-bundle - cp core-carousel.zip dist-bundle/ - - - name: Deploy to Dist Branch - uses: s0/git-publish-subdir-action@develop - env: - REPO: self - BRANCH: dist - FOLDER: dist-bundle - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - MESSAGE: "chore: distribution build v${{ steps.get_version.outputs.VERSION }}" - SKIP_EMPTY_COMMITS: true \ No newline at end of file + - name: Create Release and Upload Asset + + uses: softprops/action-gh-release@v1 + + with: + + tag_name: v${{ steps.get_version.outputs.VERSION }} + + name: v${{ steps.get_version.outputs.VERSION }} + + generate_release_notes: true + + files: carousel-kit.zip + + env: + + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + \ No newline at end of file diff --git a/.gitignore b/.gitignore index f904867..5000c74 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,4 @@ phpstan.neon # Build build/ tsconfig.tsbuildinfo -core-carousel.zip +carousel-kit.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 3efab97..72d6279 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.0.1](https://github.com/rtCamp/carousel-system-interactivity-api/compare/1.0.0...1.0.1) (2026-02-16) + +### Bug Fixes + +* **carousel:** resolve spacing issues in loop mode where gaps were missing between last and first slide +* **carousel:** allow infinite loop in editor viewport to match frontend behavior + # 1.0.0 (2026-02-03) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 249c6e0..1188ff2 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -69,7 +69,7 @@ npm run test:actions ## Directory Structure - `src/` - Source code for blocks (React/TypeScript/SCSS). -- `inc/` - PHP classes and traits (PSR-4 `Core_Carousel`). +- `inc/` - PHP classes and traits (PSR-4 `Carousel_Kit`). - `build/` - Compiled assets (generated by `npm run build`). - `docs/` - Documentation files. - `examples/` - Block patterns and examples. diff --git a/Makefile b/Makefile index 630e85f..d34a365 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Configuration -PLUGIN_SLUG := core-carousel +PLUGIN_SLUG := carousel-kit PLUGIN_VERSION := 1.0.0 BUILD_DIR := build-dist ZIP_NAME := $(PLUGIN_SLUG).zip diff --git a/README.md b/README.md index 6109183..531d3a2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# Core Carousel +# Carousel Kit -![Build Status](https://github.com/rtCamp/core-carousel/actions/workflows/release.yml/badge.svg?branch=main) -![Latest Release](https://img.shields.io/github/v/release/rtCamp/core-carousel) +![Build Status](https://github.com/rtCamp/carousel-kit/actions/workflows/release.yml/badge.svg?branch=main) +![Latest Release](https://img.shields.io/github/v/release/rtCamp/carousel-kit) **A modular, high-performance carousel block for WordPress, powered by the Interactivity API and Embla Carousel.** @@ -16,6 +16,29 @@ Easily create dynamic, accessible, and customizable carousels for any content ty - **Accessibility**: W3C-compliant roles, labels, and keyboard navigation. - **RTL Support**: Built-in support for Right-to-Left languages. +## Requirements + +| Requirement | Minimum | Recommended | +|-------------|---------|-------------| +| WordPress | 6.5+ | 6.6+ | +| PHP | 7.4+ | 8.2+ | +| Gutenberg | Not required | — | + +> **Note:** The Interactivity API became stable in WordPress 6.5. This plugin works with WordPress core—no Gutenberg plugin required. + +## Browser Support + +Carousel Kit supports all modern browsers: + +| Browser | Minimum Version | +|---------|-----------------| +| Chrome | 80+ | +| Firefox | 74+ | +| Safari | 14+ | +| Edge | 80+ | + +> **Note:** Internet Explorer is not supported. The plugin requires ES2020+ features (optional chaining, nullish coalescing) and CSS custom properties. + ## Documentation - **[Installation](docs/INSTALLATION.md)**: How to install via ZIP or Composer. @@ -35,14 +58,83 @@ The plugin provides a suite of blocks that work together: 4. **Carousel Controls**: Previous/Next buttons. 5. **Carousel Dots**: Pagination indicators. +## Screenshots + +### Editor View +![Editor View](https://github.com/user-attachments/assets/3117b2d6-33be-49ea-8dee-c4ca3a637ec8) +*Adding and configuring carousel blocks in the WordPress editor.* + +### Frontend View +![Frontend View](https://github.com/user-attachments/assets/32f719e5-5f20-4243-8967-4eef880519ae) +*The carousel in action on the frontend.* + +### Settings Panel +![Settings Panel](https://github.com/user-attachments/assets/e0510e0b-44ba-4c56-ab15-d0ce9bd47322) + +*Carousel configuration options in the block sidebar.* + +## FAQ + +### Does it work with Full Site Editing (FSE)? + +Yes! Carousel Kit is fully compatible with Full Site Editing. You can use the carousel block in templates, template parts, and anywhere blocks are supported. + +### Can I nest other blocks inside slides? + +Absolutely. Each slide is a container that accepts any WordPress block—images, paragraphs, groups, columns, and even other third-party blocks. + +### Does it support the Query Loop block? + +Yes. Simply add a Query Loop block inside the Carousel Viewport, and each post in the loop becomes a slide automatically. No special configuration needed. + +### Is it accessible? + +Yes. The carousel follows W3C accessibility guidelines with proper ARIA roles, labels, and full keyboard navigation support. + +### Can I have multiple carousels on the same page? + +Yes. Each carousel instance maintains its own independent state. + +## Changelog + +### 1.0.0 (2026-02-03) + +**Features:** +- Initial release with compound block architecture +- Embla Carousel integration with Interactivity API +- Query Loop support for dynamic content +- Autoplay with configurable delay and interaction controls +- Vertical and horizontal axis support +- Slides to scroll option +- Example patterns: Hero, Logo Showcase, Testimonials + +**Bug Fixes:** +- Fixed gap issue for carousel items + +See [CHANGELOG.md](CHANGELOG.md) for full release history. + +## Roadmap + +Planned features for upcoming releases: + +- [ ] **Parallax transition effect** — Parallax animation effect +- [ ] **Thumbnail navigation** — Visual slide previews for navigation +- [ ] **Lazy loading** — Defer off-screen slide content loading +- [ ] **Loop/infinite scroll** — Seamless continuous scrolling +- [ ] **Progress bar indicator** — Visual autoplay progress +- [ ] **Breakpoint-specific settings** — Different slides per view at different screen sizes +- [ ] **Additional patterns** — More pre-built carousel patterns + +Have a feature request? [Open an issue](https://github.com/rtCamp/carousel-kit/issues) on GitHub. + ## Live Demo -[**🚀 Try the Interactive Demo in WordPress Playground**](https://playground.wordpress.net/?blueprint-url=https://raw.githubusercontent.com/rtCamp/core-carousel/main/blueprint.json) +[**🚀 Try the Interactive Demo in WordPress Playground**](https://playground.wordpress.net/?blueprint-url=https://raw.githubusercontent.com/rtCamp/carousel-kit/main/blueprint.json) ## Contributors - [Danish Shakeel](https://github.com/danish17) -- [Masud Rana](https://github.com/mr-masudrana00) +- [Masud Rana](https://github.com/theMasudRana) ## License GPL-2.0-or-later diff --git a/blueprint.json b/blueprint.json index cb95e0e..1a3b44d 100644 --- a/blueprint.json +++ b/blueprint.json @@ -4,30 +4,29 @@ "php": "8.2", "wp": "latest" }, - "landingPage": "/core-carousel", + "landingPage": "/carousel-kit", "steps": [ { "step": "installPlugin", "pluginData": { "resource": "url", - "url": "https://cdn.statically.io/gh/rtCamp/core-carousel@dist/core-carousel.zip" + "url": "https://github.com/rtCamp/carousel-kit/releases/latest/download/carousel-kit.zip" } }, { "step": "login", - "username": "admin", - "password": "password" + "username": "admin" }, { "step": "importWxr", "file": { "resource": "url", - "url": "https://raw.githubusercontent.com/rtCamp/core-carousel/main/examples/data/core-carousel.xml" + "url": "https://raw.githubusercontent.com/rtCamp/carousel-kit/main/examples/data/carousel-kit.xml" } }, { "step": "runPHP", - "code": "'page', 'title'=>'Core Carousel Interactive Demo']); if($posts) { update_option('show_on_front', 'page'); update_option('page_on_front', $posts[0]->ID); }" + "code": "'page', 'title'=>'Carousel Kit Interactive Demo']); if($posts) { update_option('show_on_front', 'page'); update_option('page_on_front', $posts[0]->ID); }" } ] } \ No newline at end of file diff --git a/carousel-kit.php b/carousel-kit.php new file mode 100644 index 0000000..f00d170 --- /dev/null +++ b/carousel-kit.php @@ -0,0 +1,33 @@ + @@ -78,8 +78,8 @@ Highlight slide content when active using the `callbacks.isSlideActive` helper. ### Editor Interactivity: "Find & Bind" Gutenberg's `InnerBlocks` can isolate React Contexts, causing state sync issues between parent and deeply nested children in the editor. To guarantee reliable interactivity: -1. **Attach**: The Viewport component attaches the vanilla Embla instance directly to its DOM node using a Symbol key: `element[Symbol.for("core-carousel.carousel")] = embla`. -2. **Find**: Child components (Controls/Dots) attempt to find the API via Context first. If missing, they traverse the DOM up to the common wrapper (`.core-carousel`) and then search for the sibling `.embla` viewport. +1. **Attach**: The Viewport component attaches the vanilla Embla instance directly to its DOM node using a Symbol key: `element[Symbol.for("carousel-kit.carousel")] = embla`. +2. **Find**: Child components (Controls/Dots) attempt to find the API via Context first. If missing, they traverse the DOM up to the common wrapper (`.carousel-kit`) and then search for the sibling `.embla` viewport. 3. **Bind**: A retry mechanism (`setTimeout` + `useEffect`) ensures the Viewport has finished initializing before binding listeners. ### Dots Implementation diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 35840e5..e40a8c8 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contributing to Core Carousel +# Contributing to Carousel Kit Thank you for your interest in contributing! We welcome all contributions, from bug reports to feature requests and code changes. @@ -38,4 +38,4 @@ To create a production-ready ZIP file: make zip ``` -This will create `core-carousel.zip` in the project root, optimized for distribution (no dev dependencies). +This will create `carousel-kit.zip` in the project root, optimized for distribution (no dev dependencies). diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 398b800..22519ee 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -5,7 +5,7 @@ - PHP 8.2 or higher ## Manual Installation -1. Download the `core-carousel.zip` file from the [Releases](https://github.com/rtCamp/carousel-system-interactivity-api/releases) page. +1. Download the `carousel-kit.zip` file from the [Releases](https://github.com/rtCamp/carousel-system-interactivity-api/releases) page. 2. Log in to your WordPress admin dashboard. 3. Go to **Plugins > Add New Plugin**. 4. Click **Upload Plugin**. @@ -16,5 +16,5 @@ If you are managing your WordPress project with Composer: ```bash -composer require rtcamp/core-carousel +composer require rtcamp/carousel-kit ``` diff --git a/docs/THEMING.md b/docs/THEMING.md index 3efcb17..c88498d 100644 --- a/docs/THEMING.md +++ b/docs/THEMING.md @@ -7,32 +7,32 @@ Easily theme the carousel using CSS variables or block supports. Navigation bloc ### Core Layout | Variable | Description | | :--- | :--- | -| `--core-carousel-gap` | Controlled by the `slideGap` attribute. Applied as margin to slides. | -| `--core-carousel-slide-width` | Controls the width of each slide. Defaults to 100% or set by column variants. | +| `--carousel-kit-gap` | Controlled by the `slideGap` attribute. Applied as margin to slides. | +| `--carousel-kit-slide-width` | Controls the width of each slide. Defaults to 100% or set by column variants. | ### Controls (Buttons) | Variable | Default | Description | | ----------------------------------------- | ------------------------------------- | --------------------------- | -| `--core-carousel-control-bg` | `unset` | Background color of buttons | -| `--core-carousel-control-color` | `inherit` | Icon color | -| `--core-carousel-control-size` | `2.5rem` | Width/Height of buttons | -| `--core-carousel-control-padding` | `0.5rem` | Padding inside buttons | -| `--core-carousel-control-border` | `1.25px solid rgba(28, 28, 28, 0.3)` | Border style | -| `--core-carousel-control-radius` | `1rem` | Border radius | -| `--core-carousel-control-bg-hover` | `rgba(248, 248, 248, 1)` | Background on hover | -| `--core-carousel-control-border-hover` | `1.25px solid rgba(28, 28, 28, 0.75)` | Border on hover | -| `--core-carousel-control-color-hover` | `inherit` | Icon color on hover | +| `--carousel-kit-control-bg` | `unset` | Background color of buttons | +| `--carousel-kit-control-color` | `inherit` | Icon color | +| `--carousel-kit-control-size` | `2.5rem` | Width/Height of buttons | +| `--carousel-kit-control-padding` | `0.5rem` | Padding inside buttons | +| `--carousel-kit-control-border` | `1.25px solid rgba(28, 28, 28, 0.3)` | Border style | +| `--carousel-kit-control-radius` | `1rem` | Border radius | +| `--carousel-kit-control-bg-hover` | `rgba(248, 248, 248, 1)` | Background on hover | +| `--carousel-kit-control-border-hover` | `1.25px solid rgba(28, 28, 28, 0.75)` | Border on hover | +| `--carousel-kit-control-color-hover` | `inherit` | Icon color on hover | ### Dots (Pagination) | Variable | Default | Description | | ------------------------------------- | --------------------- | ---------------------- | -| `--core-carousel-dots-gap` | `0.5rem` | Gap between dots | -| `--core-carousel-dot-size` | `0.5rem` | Size of inactive dots | -| `--core-carousel-dot-color` | `rgb(221, 221, 221)` | Color of inactive dots | -| `--core-carousel-dot-radius` | `50%` | Shape of the dots | -| `--core-carousel-dot-border` | `none` | Border style for dots | -| `--core-carousel-dot-active-size` | `0.75rem` | Size of active dot | -| `--core-carousel-dot-active-color` | `rgba(28, 28, 28, 1)` | Color of active dot | +| `--carousel-kit-dots-gap` | `0.5rem` | Gap between dots | +| `--carousel-kit-dot-size` | `0.5rem` | Size of inactive dots | +| `--carousel-kit-dot-color` | `rgb(221, 221, 221)` | Color of inactive dots | +| `--carousel-kit-dot-radius` | `50%` | Shape of the dots | +| `--carousel-kit-dot-border` | `none` | Border style for dots | +| `--carousel-kit-dot-active-size` | `0.75rem` | Size of active dot | +| `--carousel-kit-dot-active-color` | `rgba(28, 28, 28, 1)` | Color of active dot | ## Overriding Styles @@ -41,9 +41,9 @@ You can override these variables globally in your theme's stylesheet or via `the ### Global CSS (`style.css`) ```css :root { - --core-carousel-control-bg: #000000; - --core-carousel-dot-active-color: #ff0000; - --core-carousel-gap: 20px; + --carousel-kit-control-bg: #000000; + --carousel-kit-dot-active-color: #ff0000; + --carousel-kit-gap: 20px; } ``` @@ -52,8 +52,8 @@ You can override these variables globally in your theme's stylesheet or via `the { "styles": { "blocks": { - "core-carousel/carousel": { - "css": "--core-carousel-control-bg: #000000;" + "carousel-kit/carousel": { + "css": "--carousel-kit-control-bg: #000000;" } } } diff --git a/docs/USAGE.md b/docs/USAGE.md index c9f3eb3..8918d62 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -2,7 +2,7 @@ ## Block Configuration -### Parent Block: `core-carousel/carousel` +### Parent Block: `carousel-kit/carousel` The parent block acts as the controller and wrapper. It handles configuration, state, and context for all child blocks. #### Attributes @@ -32,14 +32,14 @@ The parent block acts as the controller and wrapper. It handles configuration, s To create a specialized carousel (e.g., testimonials only), set the `allowedSlideBlocks` attribute on the parent block: ```json - + - - + + - - - + + + ``` --- @@ -62,5 +62,5 @@ You can create dynamic post sliders or content carousels using the WordPress Que | Use Case | Recommended Block | | :--- | :--- | | Dynamic Content (Posts, Pages, Products, Custom Post Types) | Query Loop (`core/query`) | -| Static Content (Hero Slider, Logo Showcase, Manual Testimonials) | Carousel Slide (`core-carousel/carousel-slide`) | -| Mixed Content (Slide 1 is a Video, Slide 2 is Text) | Carousel Slide (`core-carousel/carousel-slide`) | +| Static Content (Hero Slider, Logo Showcase, Manual Testimonials) | Carousel Slide (`carousel-kit/carousel-slide`) | +| Mixed Content (Slide 1 is a Video, Slide 2 is Text) | Carousel Slide (`carousel-kit/carousel-slide`) | diff --git a/examples/data/carousel-kit.xml b/examples/data/carousel-kit.xml new file mode 100644 index 0000000..06a26d9 --- /dev/null +++ b/examples/data/carousel-kit.xml @@ -0,0 +1,1814 @@ + + + + + +Carousel Kit by rtCamp +http://carousel-demo.local +Carousel system built for WordPress using Interactivity API +Mon, 16 Feb 2026 10:43:07 +0000 +en-US +1.2 +http://carousel-demo.local +http://carousel-demo.local + + 1 + danish + danish@local.com + + + + + + 1 + uncategorized + + + + + 4 + wp_template_part_area + footer + + + + + 3 + wp_template_part_area + header + + + + + 2 + wp_theme + twentytwentyfive + + + + + 1 + category + uncategorized + + + +https://wordpress.org/?v=6.9.1 + + <![CDATA[Hello world!]]> + http://carousel-demo.local/hello-world/ + Thu, 12 Feb 2026 02:37:17 +0000 + danish + http://carousel-demo.local/?p=1 + + +

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

+]]>
+ + 1 + 2026-02-12 02:37:17 + 2026-02-12 02:37:17 + 2026-02-12 02:37:17 + 2026-02-12 02:37:17 + open + open + hello-world + publish + 0 + 0 + post + + 0 + +
+ + <![CDATA[Sample Page]]> + http://carousel-demo.local/?page_id=2 + Thu, 12 Feb 2026 02:37:17 +0000 + danish + http://carousel-demo.local/?page_id=2 + + +

This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

+ + + +
+ +

Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)

+ +
+ + + +

...or something like this:

+ + + +
+ +

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

+ +
+ + + +

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

+]]>
+ + 2 + 2026-02-12 02:37:17 + 2026-02-12 02:37:17 + 2026-02-12 02:40:03 + 2026-02-12 02:40:03 + closed + open + sample-page__trashed + trash + 0 + 0 + page + + 0 + + _wp_page_template + + + + _wp_trash_meta_status + + + + _wp_trash_meta_time + + + + _wp_desired_post_slug + + +
+ + <![CDATA[Privacy Policy]]> + http://carousel-demo.local/?page_id=3 + Thu, 12 Feb 2026 02:37:17 +0000 + danish + http://carousel-demo.local/?page_id=3 + + +

Who we are

+ + +

Suggested text: Our website address is: http://carousel-demo.local.

+ + +

Comments

+ + +

Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.

+ + +

An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.

+ + +

Media

+ + +

Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website.

+ + +

Cookies

+ + +

Suggested text: If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.

+ + +

If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.

+ + +

When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.

+ + +

If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.

+ + +

Embedded content from other websites

+ + +

Suggested text: Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.

+ + +

These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.

+ + +

Who we share your data with

+ + +

Suggested text: If you request a password reset, your IP address will be included in the reset email.

+ + +

How long we retain your data

+ + +

Suggested text: If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.

+ + +

For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.

+ + +

What rights you have over your data

+ + +

Suggested text: If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.

+ + +

Where your data is sent

+ + +

Suggested text: Visitor comments may be checked through an automated spam detection service.

+ +]]>
+ + 3 + 2026-02-12 02:37:17 + 2026-02-12 02:37:17 + 2026-02-12 02:40:05 + 2026-02-12 02:40:05 + closed + open + privacy-policy__trashed + trash + 0 + 0 + page + + 0 + + _wp_page_template + + + + _wp_trash_meta_status + + + + _wp_trash_meta_time + + + + _wp_desired_post_slug + + +
+ + <![CDATA[Navigation]]> + http://carousel-demo.local/navigation/ + Thu, 12 Feb 2026 02:37:42 +0000 + + http://carousel-demo.local/navigation/ + + + + + + + + + + + + + + + +]]> + + 4 + 2026-02-12 02:37:42 + 2026-02-12 02:37:42 + 2026-02-16 09:23:50 + 2026-02-16 09:23:50 + closed + closed + navigation + publish + 0 + 0 + wp_navigation + + 0 + + + <![CDATA[Custom Styles]]> + http://carousel-demo.local/wp-global-styles-twentytwentyfive/ + Thu, 12 Feb 2026 02:38:11 +0000 + danish + http://carousel-demo.local/wp-global-styles-twentytwentyfive/ + + + + 6 + 2026-02-12 02:38:11 + 2026-02-12 02:38:11 + 2026-02-16 08:53:25 + 2026-02-16 08:53:25 + closed + closed + wp-global-styles-twentytwentyfive + publish + 0 + 0 + wp_global_styles + + 0 + + + + <![CDATA[Homepage]]> + http://carousel-demo.local/ + Thu, 12 Feb 2026 02:40:15 +0000 + danish + http://carousel-demo.local/?page_id=9 + + +

What is Carousel Kit?

+ + + +

Carousel Kit is a an Interactivity API-powered carousel system built for the WordPress Block Editor. It is designed for enterprise-grade performance and extensibility.

+ + + + + + + + + + + +

Examples

+ + + + +]]>
+ + 9 + 2026-02-12 02:40:15 + 2026-02-12 02:40:15 + 2026-02-16 09:14:28 + 2026-02-16 09:14:28 + closed + closed + homepage + publish + 0 + 0 + page + + 0 + + _wp_page_template + + +
+ + <![CDATA[Creating Autoplay Carousels]]> + http://carousel-demo.local/autoplay/ + Thu, 12 Feb 2026 03:02:02 +0000 + danish + http://carousel-demo.local/?page_id=12 + + +

Using Carousel Kit, you can easily create carousels which auto-play. You can configure the duration of each slide and different interactions which pause the auto-play such as hovering over a slide.

+ + + + + + + +

+]]>
+ + 12 + 2026-02-12 03:02:02 + 2026-02-12 03:02:02 + 2026-02-12 03:05:26 + 2026-02-12 03:05:26 + closed + closed + autoplay + publish + 0 + 0 + page + + 0 +
+ + <![CDATA[pexels-tahayasiryoney-30617939]]> + http://carousel-demo.local/autoplay/pexels-tahayasiryoney-30617939/ + Thu, 12 Feb 2026 02:51:02 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-tahayasiryoney-30617939.jpg + + + + 13 + 2026-02-12 02:51:02 + 2026-02-12 02:51:02 + 2026-02-12 02:51:02 + 2026-02-12 02:51:02 + open + closed + pexels-tahayasiryoney-30617939 + inherit + 12 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-tahayasiryoney-30617939-scaled.jpg + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[pexels-armin-forster-6000542-6441839]]> + http://carousel-demo.local/autoplay/pexels-armin-forster-6000542-6441839/ + Thu, 12 Feb 2026 02:53:28 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-armin-forster-6000542-6441839.jpg + + + + 14 + 2026-02-12 02:53:28 + 2026-02-12 02:53:28 + 2026-02-12 02:53:28 + 2026-02-12 02:53:28 + open + closed + pexels-armin-forster-6000542-6441839 + inherit + 12 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-armin-forster-6000542-6441839-scaled.jpg + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[pexels-anne-o-sullivan-1478092867-26887007]]> + http://carousel-demo.local/autoplay/pexels-anne-o-sullivan-1478092867-26887007/ + Thu, 12 Feb 2026 02:57:51 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-anne-o-sullivan-1478092867-26887007.jpg + + + + 15 + 2026-02-12 02:57:51 + 2026-02-12 02:57:51 + 2026-02-12 02:57:51 + 2026-02-12 02:57:51 + open + closed + pexels-anne-o-sullivan-1478092867-26887007 + inherit + 12 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-anne-o-sullivan-1478092867-26887007-scaled.jpg + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[Header]]> + http://carousel-demo.local/header/ + Thu, 12 Feb 2026 03:02:27 +0000 + danish + http://carousel-demo.local/header/ + + +
+
+
+
+
+]]>
+ + 17 + 2026-02-12 03:02:27 + 2026-02-12 03:02:27 + 2026-02-12 03:02:27 + 2026-02-12 03:02:27 + closed + closed + header + publish + 0 + 0 + wp_template_part + + 0 + + + + origin + + +
+ + <![CDATA[Pages]]> + http://carousel-demo.local/page/ + Thu, 12 Feb 2026 03:02:27 +0000 + danish + http://carousel-demo.local/page/ + + + + + + +
+
+ + + +
+
+ + +]]>
+ + 18 + 2026-02-12 03:02:27 + 2026-02-12 03:02:27 + 2026-02-13 02:13:27 + 2026-02-13 02:13:27 + closed + closed + page + publish + 0 + 0 + wp_template + + 0 + + + origin + + +
+ + <![CDATA[Footer]]> + http://carousel-demo.local/footer/ + Thu, 12 Feb 2026 03:02:27 +0000 + danish + http://carousel-demo.local/footer/ + + +
+
+
+
+
+

Carousel Kit with WordPress & Interactivity API

+ + + +

Created with ❤️ by rtCamp

+
+ + + +
+ +
+
+
+ + + + +
+
+]]>
+ + 20 + 2026-02-12 03:02:27 + 2026-02-12 03:02:27 + 2026-02-16 09:09:53 + 2026-02-16 09:09:53 + closed + closed + footer + publish + 0 + 0 + wp_template_part + + 0 + + + + origin + + +
+ + <![CDATA[Page without title]]> + http://carousel-demo.local/page-without-title/ + Thu, 12 Feb 2026 03:07:34 +0000 + danish + http://carousel-demo.local/page-without-title/ + + + + + + +
+
+ +
+
+ + +]]>
+ + 27 + 2026-02-12 03:07:34 + 2026-02-12 03:07:34 + 2026-02-12 03:08:04 + 2026-02-12 03:08:04 + closed + closed + page-without-title + publish + 0 + 0 + wp_template + + 0 + +
+ + <![CDATA[Add Infinite Loop to your Carousel]]> + http://carousel-demo.local/add-looping-to-your-carousel/ + Fri, 13 Feb 2026 01:27:26 +0000 + danish + http://carousel-demo.local/?page_id=32 + + +

To loop your carousel, all you need to do is select the Carousel block and toggle the "Loop" option.

+ + + + +]]>
+ + 32 + 2026-02-13 01:27:26 + 2026-02-13 01:27:26 + 2026-02-16 09:24:44 + 2026-02-16 09:24:44 + closed + closed + add-looping-to-your-carousel + publish + 0 + 0 + page + + 0 +
+ + <![CDATA[pexels-dzikilechu-5112627]]> + http://carousel-demo.local/add-looping-to-your-carousel/pexels-dzikilechu-5112627/ + Fri, 13 Feb 2026 01:36:26 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-dzikilechu-5112627.jpg + + + + 36 + 2026-02-13 01:36:26 + 2026-02-13 01:36:26 + 2026-02-13 01:36:26 + 2026-02-13 01:36:26 + open + closed + pexels-dzikilechu-5112627 + inherit + 32 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/pexels-dzikilechu-5112627-scaled.jpg + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[API]]> + http://carousel-demo.local/api/ + Fri, 13 Feb 2026 02:20:31 +0000 + danish + http://carousel-demo.local/?page_id=48 + + +

The blocks uses the WordPress Interactivity API to manage state and logic. You can consume this state in your own custom blocks to build advanced features like progress bars, slide counters, or synchronized sliders.

+ + + +

Store Namespace

+ + + +

carousel-kit/carousel

+ + + +

Context (CarouselContext)

+ + + +

The following properties are exposed in the Interactivity API context:

+ + + +
PropertyTypeDescription
isPlayingbooleanIf Autoplay is currently running
timerIterationIdnumberIncrements every time the Autoplay timer resets (slide change).

Bind to key to restart animations.
autoplayboolean|{ delay, ... }Autoplay config or false if disabled.
canScrollPrevbooleantrue if there are previous slides (or looping).
canScrollNextboolean|truetrue if there are next slides (or looping).
selectedIndexnumberThe zero-based index of the current slide.
scrollSnaps{ index: number }[]List of snap points (used by Dots block).
+]]>
+ + 48 + 2026-02-13 02:20:31 + 2026-02-13 02:20:31 + 2026-02-16 01:44:27 + 2026-02-16 01:44:27 + closed + closed + api + publish + 0 + 0 + page + + 0 +
+ + <![CDATA[Creating a Carousel]]> + http://carousel-demo.local/creating-a-carousel/ + Mon, 16 Feb 2026 01:34:02 +0000 + danish + http://carousel-demo.local/?page_id=59 + + +

Carousel Kit uses compound block architecture. Each functional component of a usual carousel is its own block which provides maximum flexibility.

+ + + +

Blocks

+ + + +

Carousel Kit comes with the following blocks out of the box:

+ + + +
    +
  1. Carousel (Parent): This parent block provides carousel context and configuration to the blocks inside it.
  2. + + + +
  3. Carousel Viewport: Carousel Viewport acts as the container for all the slides. It provides semantic and markup boundary.
  4. + + + +
  5. Carousel Slide: Carousel Slide holds the content of the individual slide. It can contain virtually any block. Like the viewport block, it also provides semantic and markup boundary.
  6. + + + +
  7. Carousel Controls: Inserts Previous and Next buttons.
  8. + + + +
  9. Carousel Dots:Inserts visual pagination indicators.
  10. +
+ + + +

Creating a Basic Carousel

+ + + +

1. From your Blocks Library, choose Carousel

+ + + +
+ + + +

2. Add contents to the Carousel Slide by choosing carousel slide and adding any block inside it.

+ + + +
+ + + +

3. To configure your carousel, select the Carousel block and from the right sidebar, configure it as per your needs.

+ + + +
+ + + +

Result

+ + + + + + + +

+]]>
+ + 59 + 2026-02-16 01:34:02 + 2026-02-16 01:34:02 + 2026-02-16 09:09:10 + 2026-02-16 09:09:10 + closed + closed + creating-a-carousel + publish + 0 + 0 + page + + 0 +
+ + <![CDATA[image]]> + http://carousel-demo.local/creating-a-carousel/image/ + Mon, 16 Feb 2026 01:27:41 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/image.png + + + + 60 + 2026-02-16 01:27:41 + 2026-02-16 01:27:41 + 2026-02-16 01:27:41 + 2026-02-16 01:27:41 + open + closed + image + inherit + 59 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/image.png + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[image]]> + http://carousel-demo.local/creating-a-carousel/image-2/ + Mon, 16 Feb 2026 01:30:58 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/image-1.png + + + + 61 + 2026-02-16 01:30:58 + 2026-02-16 01:30:58 + 2026-02-16 01:30:58 + 2026-02-16 01:30:58 + open + closed + image-2 + inherit + 59 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/image-1.png + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[image]]> + http://carousel-demo.local/creating-a-carousel/image-3/ + Mon, 16 Feb 2026 01:32:28 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/image-2.png + + + + 62 + 2026-02-16 01:32:28 + 2026-02-16 01:32:28 + 2026-02-16 01:32:28 + 2026-02-16 01:32:28 + open + closed + image-3 + inherit + 59 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/image-2.png + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[Styles]]> + http://carousel-demo.local/styles/ + Mon, 16 Feb 2026 01:42:21 +0000 + danish + http://carousel-demo.local/?page_id=64 + + +

To configure how many slides are visible at once, you can use the style options of the carousel.

+ + + +

100% Slides (1 slide per view)

+ + + + + + + +

50% Slides (2 slides per view)

+ + + + + + + +

33% Slides (3 slides per view)

+ + + + + + + +

25% Slides (4 slides per view)

+ + + + + + + +

Slide Gap

+ + + +

By default, slides don't have a gap between them. If you have more than 1 slide per view, it might be a good idea to have some gap.

+ + + +

You can add a gap between using style options.

+ + + +
    +
  1. Select the carousel
  2. + + + +
  3. In the right sidebar, choose the "Styles" option
  4. + + + +
  5. Specify the gap (in px) in Layout > Slide Gap
  6. +
+ + + +
+ + + +

+]]>
+ + 64 + 2026-02-16 01:42:21 + 2026-02-16 01:42:21 + 2026-02-16 09:07:55 + 2026-02-16 09:07:55 + closed + closed + styles + publish + 0 + 0 + page + + 0 +
+ + <![CDATA[Screen Recording 2026-02-16 at 02.40.13]]> + http://carousel-demo.local/styles/screen-recording-2026-02-16-at-02-40-13/ + Mon, 16 Feb 2026 01:42:08 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/Screen-Recording-2026-02-16-at-02.40.13.gif + + + + 65 + 2026-02-16 01:42:08 + 2026-02-16 01:42:08 + 2026-02-16 01:42:08 + 2026-02-16 01:42:08 + open + closed + screen-recording-2026-02-16-at-02-40-13 + inherit + 64 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/Screen-Recording-2026-02-16-at-02.40.13.gif + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[Orientation & Direction]]> + http://carousel-demo.local/orientation-direction/ + Mon, 16 Feb 2026 01:51:57 +0000 + danish + http://carousel-demo.local/?page_id=69 + + +

Using Carousel Kit, you can also choose orientation (axis) and direction of your carousels. This is important if you are creating content for different locales (RTL) or want more flexibility with the presentation of your content.

+ + + +

Orientation (Axis)

+ + + +

You can choose the orientation of your carousel by selecting the carousel block and choosing vertical/horizontal orientation.

+ + + +

If you choose vertical orientation, you will also need to specify a fixed height.

+ + + + + + + +

Direction

+ + + +

You can also specify direction of your carousel (LTR/RTL). Select the carousel block and in the "Direction" options, choose your desired direction.

+ + + + + + + +

+]]>
+ + 69 + 2026-02-16 01:51:57 + 2026-02-16 01:51:57 + 2026-02-16 01:53:41 + 2026-02-16 01:53:41 + closed + closed + orientation-direction + publish + 0 + 0 + page + + 0 +
+ + <![CDATA[Group 10]]> + http://carousel-demo.local/orientation-direction/group-10/ + Mon, 16 Feb 2026 01:51:05 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/Group-10.png + + + + 70 + 2026-02-16 01:51:05 + 2026-02-16 01:51:05 + 2026-02-16 01:51:05 + 2026-02-16 01:51:05 + open + closed + group-10 + inherit + 69 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/Group-10.png + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[image]]> + http://carousel-demo.local/styles/image-4/ + Mon, 16 Feb 2026 09:07:46 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/image-3.png + + + + 86 + 2026-02-16 09:07:46 + 2026-02-16 09:07:46 + 2026-02-16 09:07:46 + 2026-02-16 09:07:46 + open + closed + image-4 + inherit + 64 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/image-3.png + + _wp_attached_file + + + + _wp_attachment_metadata + + + + + <![CDATA[Query Loop]]> + http://carousel-demo.local/query-loop/ + Mon, 16 Feb 2026 09:22:45 +0000 + danish + http://carousel-demo.local/?page_id=93 + + +

When a Query Loop block is inserted inside Carousel Viewport, Carousel Kit automatically treats each post as an individual slide. This means that you can create dynamic carousels which can show your posts, pages, and any custom post type.

+ + + +
+ + + + + + + +

+]]>
+ + 93 + 2026-02-16 09:22:45 + 2026-02-16 09:22:45 + 2026-02-16 09:23:33 + 2026-02-16 09:23:33 + closed + closed + query-loop + publish + 0 + 0 + page + + 0 +
+ + <![CDATA[image]]> + http://carousel-demo.local/query-loop/image-5/ + Mon, 16 Feb 2026 09:23:24 +0000 + danish + http://carousel-demo.local/wp-content/uploads/2026/02/image-4.png + + + + 95 + 2026-02-16 09:23:24 + 2026-02-16 09:23:24 + 2026-02-16 09:23:24 + 2026-02-16 09:23:24 + open + closed + image-5 + inherit + 93 + 0 + attachment + + 0 + http://carousel-demo.local/wp-content/uploads/2026/02/image-4.png + + _wp_attached_file + + + + _wp_attachment_metadata + + + +
+
diff --git a/examples/data/core-carousel.xml b/examples/data/core-carousel.xml deleted file mode 100644 index cc31a4e..0000000 --- a/examples/data/core-carousel.xml +++ /dev/null @@ -1,507 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Core Carousel - https://carousel.local - - Mon, 09 Feb 2026 13:02:36 +0000 - en-US - 1.2 - https://carousel.local - https://carousel.local - - 1 - - - 1 - - - - - - 2 - - - - - - - 1 - - - - - - - https://wordpress.org/?v=6.9.1 - - - <![CDATA[Hello world!]]> - https://carousel.local/2026/02/09/hello-world/ - Mon, 09 Feb 2026 13:00:32 +0000 - - https://carousel.local/?p=1 - - -

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

-]]>
- - 1 - - - - - - - - - 0 - 0 - - - 0 - - - 1 - - - https://wordpress.org/ - - - - Gravatar.]]> - - - 0 - 0 - -
- - <![CDATA[Sample Page]]> - https://carousel.local/sample-page/ - Mon, 09 Feb 2026 13:00:32 +0000 - - https://carousel.local/?page_id=2 - - -

This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

- - - -
- -

Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)

- -
- - - -

...or something like this:

- - - -
- -

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

- -
- - - -

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

-]]>
- - 2 - - - - - - - - - 0 - 0 - - - 0 - - - - -
- - <![CDATA[Privacy Policy]]> - https://carousel.local/?page_id=3 - Mon, 09 Feb 2026 13:00:32 +0000 - - https://carousel.local/?page_id=3 - - -

Who we are

- - -

Suggested text: Our website address is: https://carousel.local.

- - -

Comments

- - -

Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.

- - -

An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.

- - -

Media

- - -

Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website.

- - -

Cookies

- - -

Suggested text: If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.

- - -

If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.

- - -

When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.

- - -

If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.

- - -

Embedded content from other websites

- - -

Suggested text: Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.

- - -

These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.

- - -

Who we share your data with

- - -

Suggested text: If you request a password reset, your IP address will be included in the reset email.

- - -

How long we retain your data

- - -

Suggested text: If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.

- - -

For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.

- - -

What rights you have over your data

- - -

Suggested text: If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.

- - -

Where your data is sent

- - -

Suggested text: Visitor comments may be checked through an automated spam detection service.

- -]]>
- - 3 - - - - - - - - - 0 - 0 - - - 0 - - - - -
- - <![CDATA[Navigation]]> - https://carousel.local/2026/02/09/navigation/ - Mon, 09 Feb 2026 13:00:32 +0000 - - https://carousel.local/2026/02/09/navigation/ - - ]]> - - 4 - - - - - - - - - 0 - 0 - - - 0 - - - <![CDATA[Core Carousel]]> - https://carousel.local/ - Mon, 09 Feb 2026 13:01:18 +0000 - - https://carousel.local/?page_id=6 - - - - - - - - - - - - - - - - - - - -]]> - - 6 - - - - - - - - - 0 - 0 - - - 0 - - - <![CDATA[Custom Styles]]> - https://carousel.local/2026/02/09/wp-global-styles-twentytwentyfive/ - Mon, 09 Feb 2026 13:01:04 +0000 - - https://carousel.local/2026/02/09/wp-global-styles-twentytwentyfive/ - - - - 7 - - - - - - - - - 0 - 0 - - - 0 - - -
-
- \ No newline at end of file diff --git a/examples/patterns/hero-carousel.php b/examples/patterns/hero-carousel.php index 2644ce8..564cd54 100644 --- a/examples/patterns/hero-carousel.php +++ b/examples/patterns/hero-carousel.php @@ -1,17 +1,17 @@ - -