Swiper is a robust and modular javascript library to implement responsive, accessible, versatile, touch-enabled carouses/sliders in your cell web sites and apps. Can be utilized as a jQuery plugin.
Options:
- Responsive design
- Small and quick
- Absolutely accessible
- Helps any html parts, not solely photos
- Helps Vertical/Horizontal animations and swipes
- Cool transition results: Fade, Flip, 3D Dice, 3D Coverflow, Parallax
- Hash navigation
- Grid structure
- Picture lazy load
- Digital Slides for higher efficiency
- Keyboard interactions
- RTL structure
- Works on iOS, Android and newest Desktop browsers
- Accessible for Angular, React, Vue, and Svelte.
View extra:
Desk Of Contents:
Primary Utilization (v7+):
1. Set up the bundle with NPM.
# NPM $ npm i swiper --save
2. Import the Swiper and modules of your selection as an ES module into your mission. All accessible modules:
- a11y
- autoplay
- controller
- effect-cards
- effect-coverflow
- effect-creative
- effect-cube
- effect-fade
- effect-flip
- free-mode
- grid
- hash-navigation
- historical past
- keyboard
- lazy
- manipulation
- mousewheel
- navigation
- pagination
- parallax
- scrollbar
- thumbs
- digital
- zoom
// Core import Swiper from 'swiper'; import 'swiper/css'; // With OPTIONAL modules import Swiper, { Navigation, ... } from 'swiper'; import 'swiper/css'; import 'swiper/css/navigation'; ... Swiper.use([Navigation, ...]);
3. Or load the mandatory JavaScript and CSS information from a CDN.
<hyperlink rel="stylesheet" href="https://cdn.jsdelivr.web/npm/swiper/swiper-bundle.min.css" /> <script src="https://cdn.jsdelivr.web/npm/swiper/swiper-bundle.min.js"></script> <!-- OR --> <hyperlink rel="stylesheet" href="https://cdn.jsdelivr.web/npm/swiper/swiper-bundle.min.css" /> <script sort="module"> import Swiper from 'https://cdn.jsdelivr.web/npm/swiper/swiper-bundle.esm.browser.min.js' </script>
4. Add slides to the swiper.
<div class="swiper"> <div class="swiper-wrapper"> <div class="swiper-slide">Slide 1</div> <div class="swiper-slide">Slide 2</div> <div class="swiper-slide">Slide 3</div> <div class="swiper-slide">Slide 4</div> ... </div> </div>
5. Initialize the swiper and finished.
const swiper = new Swiper('.swiper', { // choices right here });
6. Add pagination & navigation controls to the swiper if wanted.
<div class="swiper"> <div class="swiper-wrapper"> <div class="swiper-slide">Slide 1</div> <div class="swiper-slide">Slide 2</div> <div class="swiper-slide">Slide 3</div> <div class="swiper-slide">Slide 4</div> ... </div> <div class="swiper-pagination"></div> <div class="swiper-button-prev"></div> <div class="swiper-button-next"></div> <div class="swiper-scrollbar"></div> </div>
const swiper = new Swiper('.swiper', { pagination: { el: '.swiper-pagination', }, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, scrollbar: { el: '.swiper-scrollbar', } });
7. It is a full listing of availble configurations that can be utilized to customise your swiper.
var swiper = new Swiper('.swiper-container',{ // auto init the intance init: true, // 'horizontal' or 'vertical' route: 'horizontal', // goal component to pay attention contact occasions on. touchEventsTarget: 'container', // preliminary slide index initialSlide: 0, // animation velocity velocity: 300, // whether or not to make use of trendy CSS Scroll Snap API. cssMode: false, // auto update on window resize updateOnWindowResize: true, // Overrides width: null, top: null, // enable to alter slides by swiping or navigation/pagination buttons throughout transition preventInteractionOnTransition: false, // for ssr userAgent: null, url: null, // To help iOS's swipe-to-go-back gesture (when getting used in-app). edgeSwipeDetection: false, edgeSwipeThreshold: 20, // Free mode // If true then slides won't have mounted positions freeMode: false, freeModeMomentum: true, freeModeMomentumRatio: 1, freeModeMomentumBounce: true, freeModeMomentumBounceRatio: 1, freeModeMomentumVelocityRatio: 1, freeModeSticky: false, freeModeMinimumVelocity: 0.02, // Autoheight autoHeight: false, // Set wrapper width setWrapperSize: false, // Digital Translate virtualTranslate: false, // slide' or 'fade' or 'dice' or 'coverflow' or 'flip' impact: 'slide', // Breakpoints /* eg breakpoints: { // when window width is >= 320px 320: { slidesPerView: 2, spaceBetween: 20 }, // when window width is >= 480px 480: { slidesPerView: 3, spaceBetween: 30 }, // when window width is >= 640px 640: { slidesPerView: 4, spaceBetween: 40 } } */ breakpoints: undefined, // Slides grid spaceBetween: 0, slidesPerView: 1, slidesPerColumn: 1, slidesPerColumnFill: 'column', slidesPerGroup: 1, slidesPerGroupSkip: 0, centeredSlides: false, centeredSlidesBounds: false, slidesOffsetBefore: 0, // in px slidesOffsetAfter: 0, // in px normalizeSlideIndex: true, centerInsufficientSlides: false, // Disable swiper and conceal navigation when container not overflow watchOverflow: false, // Spherical size roundLengths: false, // Choices for contact occasions touchRatio: 1, touchAngle: 45, simulateTouch: true, shortSwipes: true, longSwipes: true, longSwipesRatio: 0.5, longSwipesMs: 300, followFinger: true, allowTouchMove: true, threshold: 0, touchMoveStopPropagation: false, touchStartPreventDefault: true, touchStartForcePreventDefault: false, touchReleaseOnEdges: false, // Distinctive Navigation Components uniqueNavElements: true, // Resistance resistance: true, resistanceRatio: 0.85, // Use ResizeObserver (if supported by browser) on swiper container to detect container resize (as an alternative of waiting for window resize) resizeObserver: false, // Progress watchSlidesProgress: false, watchSlidesVisibility: false, // Cursor grabCursor: false, // Clicks preventClicks: true, preventClicksPropagation: true, slideToClickedSlide: false, // Photographs preloadImages: true, updateOnImagesReady: true, // loop loop: false, loopAdditionalSlides: 0, loopedSlides: null, loopFillGroupWithBlank: false, loopPreventsSlide: true, // Swiping/no swiping allowSlidePrev: true, allowSlideNext: true, swipeHandler: null, // '.swipe-handler', noSwiping: true, noSwipingClass: 'swiper-no-swiping', noSwipingSelector: null, // Passive Listeners passiveListeners: true, // Default courses containerModifierClass: 'swiper-container-', slideClass: 'swiper-slide', slideBlankClass: 'swiper-slide-invisible-blank', slideActiveClass: 'swiper-slide-active', slideDuplicateActiveClass: 'swiper-slide-duplicate-active', slideVisibleClass: 'swiper-slide-visible', slideDuplicateClass: 'swiper-slide-duplicate', slideNextClass: 'swiper-slide-next', slideDuplicateNextClass: 'swiper-slide-duplicate-next', slidePrevClass: 'swiper-slide-prev', slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', wrapperClass: 'swiper-wrapper', // Callbacks runCallbacksOnInit: true });
8. API strategies.
// go to subsequent slide at a given velocity mySwiper.slideNext(velocity, runCallbacks); // again to earlier slide at a given velocity mySwiper.slidePrev(velocity, runCallbacks); // slide to a selected slide at a given velocity mySwiper.slideTo(index, velocity, runCallbacks); // Does the identical as .slideTo however for the case when used with enabled loop. mySwiper.slideToLoop(index, velocity, runCallbacks); // Reset swiper place to at the moment energetic slide mySwiper.slideReset(velocity, runCallbacks); // Reset swiper place to closest slide/snap level mySwiper.slideToClosest(velocity, runCallbacks); // Replace top mySwiper.updateAutoHeight(velocity); // Replace swiper mySwiper.replace(); // Modifications slider route from horizontal to vertical and again. mySwiper.changeDirection(route); // replace dimension mySwiper.updateSize() ; // replace slides mySwiper.updateSlides(); // replace progress mySwiper.updateProgress(); // replace courses mySwiper.updateSlidesClasses(); // detach all occasion listeners mySwiper.detachEvents(); // connect all occasion listeners mySwiper.attachEvents(); // destroy the swiper occasion mySwiper.destroy(deleteInstance, cleanStyles); // append new slides to the slider mySwiper.appendSlide(slides); // prepend new slides to the slider mySwiper.prependSlide(slides); // add new slides mySwiper.addSlide(index, slides); // take away a slide mySwiper.removeSlide(slideIndex); // take away all slides mySwiper.removeAllSlides(); // set customized CSS transforms mySwiper.setTranslate(translate); // animate customized css3 rework's translate worth for swiper wrapper mySwiper.translateTo(translate, velocity, runCallbacks, translateBounds); // get the present rework worth mySwiper.getTranslate(); // add occasion listener mySwiper.on(occasion, handler); // that shall be executed solely as soon as mySwiper.as soon as(occasion, handler); // take away occasion listener for specified occasion mySwiper.off(occasion, handler); // take away all listeners mySwiper.off(occasion); // unset seize cursor mySwiper.unsetGrabCursor(); // set seize cursor mySwiper.setGrabCursor();
9. Occasion listeners.
mySwiper.on('beforeDestroy', operate(){ // do one thing }) mySwiper.on('slideChange', operate(){ // do one thing }) mySwiper.on('slideChangeTransitionStart', operate(){ // do one thing }) mySwiper.on('slideChangeTransitionEnd', operate(){ // do one thing }) mySwiper.on('slideNextTransitionStart', operate(){ // do one thing }) mySwiper.on('slideNextTransitionEnd', operate(){ // do one thing }) mySwiper.on('slidePrevTransitionStart', operate(){ // do one thing }) mySwiper.on('slidePrevTransitionEnd', operate(){ // do one thing }) mySwiper.on('transitionStart', operate(){ // do one thing }) mySwiper.on('transitionEnd', operate(){ // do one thing }) mySwiper.on('imagesReady', operate(){ // do one thing }) mySwiper.on('reachBeginning', operate(){ // do one thing }) mySwiper.on('reachEnd', operate(){ // do one thing }) mySwiper.on('fromEdge', operate(){ // do one thing }) mySwiper.on('toEdge', operate(){ // do one thing }) mySwiper.on('resize', operate(){ // do one thing }) mySwiper.on('observerUpdate', operate(){ // do one thing }) mySwiper.on('touchStart', operate(e){ // do one thing }) mySwiper.on('touchMove', operate(e){ // do one thing }) mySwiper.on('touchMoveOpposite', operate(e){ // do one thing }) mySwiper.on('sliderMove', operate(e){ // do one thing }) mySwiper.on('touchEnd', operate(e){ // do one thing }) mySwiper.on('click on', operate(e){ // do one thing }) mySwiper.on('faucet', operate(e){ // do one thing }) mySwiper.on('doubleTap', operate(e){ // do one thing }) mySwiper.on('progress', operate(progress){ // do one thing }) mySwiper.on('setTranslate', operate(translate){ // do one thing }) mySwiper.on('setTransition', operate(transition){ // do one thing }) mySwiper.on('hashChange', operate(){ // do one thing }) mySwiper.on('hashSet', operate(){ // do one thing }) mySwiper.on('beforeLoopFix', operate(){ // do one thing }) mySwiper.on('loopFix', operate(){ // do one thing }) mySwiper.on('breakpoint', operate(){ // do one thing })
10. Accessible Props.
mySwiper.params mySwiper.$el mySwiper.$wrapperEl mySwiper.slides mySwiper.width mySwiper.top mySwiper.translate mySwiper.progress mySwiper.activeIndex mySwiper.realIndex mySwiper.previousIndex mySwiper.isBeginning mySwiper.isEnd mySwiper.animating mySwiper.touches mySwiper.touches.startX mySwiper.touches.startY mySwiper.touches.currentX mySwiper.touches.currentY mySwiper.touches.diff mySwiper.clickedIndex mySwiper.clickedSlide mySwiper.allowSlideNext mySwiper.allowSlidePrev mySwiper.allowTouchMove
11. Try the Full API for extra info.
Primary Utilization (v5):
1. Obtain the Swiper v5 after which Embrace jQuery library (OPTIONAL) and the Swiper.js in your webpage
<script src="jquery.min.js"></script> <script src="swiper.min.js"></script>
2. Embrace required stylesheet on the web page.
<hyperlink rel="stylesheet" href="swiper.min.css">
3. Create the html for the swiper.
<div class="swiper-container"> <div class="swiper-wrapper"> <!--First Slide--> <div class="swiper-slide"> <!-- Any HTML content material of the primary slide goes right here --> </div> <!--Second Slide--> <div class="swiper-slide"> <!-- Any HTML content material of the second slide goes right here --> </div> <!--Third Slide--> <div class="swiper-slide"> <!-- Any HTML content material of the third slide goes right here --> </div> <!--And so forth..--> </div> </div>
4. Initialize the swiper with optionally available settings.
var mySwiper = new Swiper ('.swiper-container', { // choices right here })
Changelog:
v8.4.1/2 (2022-09-15)
v8.4.0 (2022-09-14)
- Bug Fixes
- cards-effect: add perSlideRotate and perSlideOffset parameters
- core: new loopedSlidesLimit parameter to re-duplicate slides
- react: Permit SwiperSlide youngsters so long as displayName consists of SwiperSlide
- stable: hold stable elements incompiled
v8.3.1 (2022-07-14)
v8.2.6 (2022-07-01)
- core: add changeLanguageDirection technique to alter it to RTL/LTR after init
- navigation: add navigationPrev and navigationNext occasions
- bugfixed
v8.2.4 (2022-06-13)
v8.2.3 (2022-06-10)
- a11y: enable slideLabelMessage: null
- angular: replace to angular v14
- scrollbar: add directional courses to scrollbar container
v8.1.4 (2022-04-24)
v8.1.3 (2022-04-20)
v8.1.2 (2022-04-20)
- Bug Fixes
- cube-effect: set –swiper-cube-translate-z CSS property on swiper-wrapper
v8.1.1 (2022-04-16)
- lazy: repair lazy preloader in iOS 15
- digital: repair leaked results translate when Digital enabled
v8.1.0 (2022-04-11)
- a11y: add id parameter
- angular: help [ngClass] in swiperSlide
- effect-cards: add rotate parameter
- bugfixes
v8.0.7 (2022-03-04)
- bugfixes
- effect-cards: help to be used with Digital Slides
- digital: higher help for different results quite than slide
v8.0.6 (2022-02-14)
v8.0.5 (2022-02-10)
v8.0.4 (2022-02-10)
- angular: occasions varieties
- angular: lock output
- core: enable nesting of kinds in SASS
- core: rewind on swipes
- bugfix
v8.0.3 (2022-02-05)
v8.0.2 (2022-02-03)
- core: repair slider freeze with enabled observer
v8.0.1 (2022-02-02)
- angular: repair angular export
- react: varieties for useSwiper and useSwiperSlide hooks
- angular: take away deprecated index property
v8.0.0 (2022-02-01)
- a11y: routinely change slides on focus (Tab) in inactive slides
- angular: replace to angular 13 and allow tsconfig strict
- autoplay: autoplayPause and autoplayResume occasions
- free-mode: cease scrolling when contact occasion occurs in freeMode
- react: useSwiper and useSwiperSlide context hooks
- svelte: swiper and swiperSlide context
- svelte: import index
- digital: help rewind performance with Digital slides
- vue: useSwiper and useSwiperSlide context hooks
- new maxBackfaceHiddenSlides param to stop flicker in Safari
- new maxBackfaceHiddenSlides param to stop flicker in Safari
- svelte: varieties for Swiper slot virtualData
- svelte: varieties for SwiperSlide slot information
- vue: present – inject swiper and swiperSlide context
- replace dom7 to newest
- bugfixes
v7.4.1 (2021-12-25)
v7.4.0 (2021-12-24)
v7.3.4 (2021-12-22)
- repair(angular): repair nativeElement verify
- Added “svelte”: “./swiper.esm.js”
- repair(angular): setElement checks
- refactor(core/slide/slideTo): take away duplicate code
v7.3.3 (2021-12-16)
v7.3.2 (2021-12-13)
- repair(angular): toggle enter
- feat: replace dom7 and ssr-window to newest
- feat(a11y): add aria-current to present bullet
v7.3.1 (2021-12-09)
- angular: help on params
- Mounted cannot get clicked slider in shadow root problem
v7.3.0 (2021-11-20)
- react: export SwiperProps and SwiperSlideProps varieties
- Bugfixes
v7.2.0 (2021-10-27)
- add “foremost” and “module” bundle fields
- replace dom7 and ssr-window to newest
v7.1.0 (2021-10-25)
- Bug Fixes
- core: add help to loop with slotted parts
v7.0.8 (2021-10-18)
v7.0.8 (2021-10-04)
- digital: enhance conduct with cssMode
v7.0.7 (2021-09-29)
v7.0.6 (2021-09-20)
- Bug Fixes
- angular: enabled prop
- angular: help data-swiper-autoplay
v7.0.5 (2021-09-10)
v7.0.4 (2021-09-09)
- bugfix
- pagination: extra pagination bullet CSS variables
v7.0.3 (2021-09-06)
v7.0.1 (2021-08-26)
- autoplay: add lacking .begin() technique
- pagination: verify for bullets earlier than destroy
v7.0.0 (2021-08-25)
v6.8.2 (2021-08-20)
v6.8.1 (2021-08-06)
- Bug Fixes
- pagination: conceal 1 dot pagination
v6.8.0 (2021-07-23)
v6.7.1 (2021-06-30)
- core: add ParallaxOptions varieties
- core: enable wrapperClass to be a number of courses
- core: make focusableElements configurable
- core: use window.matchMedia to detect window width for breakpoints
- bugfixes
v6.7.0 (2021-05-31)
- core: starter html structure may be optionally available with new createElements: true parameter
- autoplay: if disableOnInteraction and pauseOnMouseEnter, it’ll cease autoplay on interplay
- vue: add help to be used Swiper as async part
- bugfixes
v6.6.2 (2021-05-23)
- core: repair breakpoints enabled detection
v6.6.1 (2021-05-12)
- core: repair breakpoints enabled detection
v6.6.0 (2021-05-12)
- core: make autoHeight work with Digital slides
- zoom: do not toggle zoom on slides with out zoom-container
- autoplay: new pauseOnMouseEnter parameter to pause autoplay on mouse enter over container
- core: new parameters and strategies to allow/disable Swiper dynamically
- react: add the lacking render operate sort
v6.5.5 (2021-04-09)
v6.5.4 (2021-04-06)
- Bug Fixes
- a11y.slideLabelMessage
- customized html component help
- navigation: set disabled prop on nav component if it’s a <button> component
v6.5.0 (2021-03-06)
- elements: added “resizeObserver” boolean possibility/prop to allow ResizeObserver
- core: added help to make use of ResizeObserver with new “resizeObserver” parameter
- core: potential to allow breakpoints based mostly on container width (as an alternative of window width)
- Bugs mounted
v6.4.15 (2021-02-27)
v6.3.1 – v6.3.5 (2020-11-06)
v6.2.0 (2020-09-04)
- A11y: Added new parameters containerMessage, containerRoleDescriptionMessage and itemRoleDescriptionMessage
- React & Vue elements up to date
v6.2.0 (2020-09-04)
- All new Swiper Vue.js (v3) elements
v6.1.3 (2020-09-03)
- Pagination: Now it will not set a11y attributes on customly rendered bullets
v6.0.0 – v6.1.2 (2020-08-19)
- All scripts transpiled to ES5
v5.4.1 (2020-05-26)
- Mounted dependencies variations
v5.4.0 (2020-05-21)
- Added hashChange and hashSet occasions
- Added help for <image> lazy loading
- Doubtlessly improved vertical scrolling points on Home windows/Linux OS
- Minor fixes
v5.3.7 (2020-04-15)
- Mounted cssMode conduct in RTL structure
- Mounted problem with not working double-tap to toggle with digital slides
v5.3.7 (2020-02-29)
- Mounted improper auto top calculation with centeredSlides enabled
- Now it’ll replace auto top (if enabled) on lazy picture loaded
- Mounted problem when beforehand energetic slide could possibly be zoomed with zoom.in() API
- Mounted problem when zoom did not work on <image> component
- Added help for customized zoom-target component by including swiper-zoom-target class to such parts
- stretch parameter now may be set in %
v5.3.1 (2020-02-09)
- New slidesPerGroupSkip conduct
v5.3.0 (2020-01-15)
- New slidesPerGroupSkip conduct
- New ratio-based breakpoints
- Added SCSS interpolation
- Mousehweel: Mounted problem when it might probably fail on load
- Minor fixes
v5.2.1 (2019-11-18)
- New loop occasions beforeLoopFix and loopFix
- New parameter updateOnWindowResize (by default true) that may replace/recalc swiper on window resize/orientationchange
- Added SCSS interpolation for –swiper-theme-color variable when not constructing from supply
- Quote SCSS coloration names
- Mounted problem when .as soon as could possibly be known as greater than as soon as
- Mounted scroll wheel undesirable frozen impact
- New multipleActiveThumbs (by default true) possibility to regulate whether or not a number of thumbnail slides might get activated or not.
- Minor fixes
v5.2.0 (2019-10-26)
- New centeredSlidesBounds parameter that when enabled will hold first and final slides at bounds
- Mounted problem when freeMode might break place on resize
- Mounted transitin length problem with freeModeSticky
- Mounted problem with improper row/column if not full teams
- Mounted problem when watchOverflow and slidesOffsetBefore/slidesOffsetAfter could not work collectively
- Sooner & smoother mousewheel inertial scrolling
- Added supply maps to bundle builds
- Added minified model of browser.esm.bundle
- Minor fixes
v5.1.0 (2019-10-16)
- Mounted points with contact on iOS 13
- New translateTo technique
- Improved dynamic bullets conduct when loop: true
- Mounted problem with pinch to zoom on Android
- Minor fixes
v5.0.4 (2019-09-30)
- Now on quick swipes over navigation buttons, it’ll deal with it like nav button click on
- Mounted problem when passing float slidesPerView might break loop mode
- Mounted problem with improper “pointer” place calculation on scroll bar faucet
- Mounted problem when it was paused after coming back from hidden tab
- Minor fixes
v5.0.3 (2019-09-19)
- touchEventsTarget defaults again to container
- Added dealing with of touchcancel occasion
- Mounted problem with improper order calculation in slidesPerColumnFill: ‘row’ mode
- Mounted problem with slides missplacing when prepending slides in virutal mode
- Mounted problem when zoomed picture nonetheless swiped to a different slide on mobiles
v5.0.0 (2019-09-19)
- All new CSS Scroll Snap mode (may be enabled with cssMode: true). It would not help all of Swiper’s options, however probably ought to convey a a lot better efficiency in easy configurations
- Absolutely eliminated Web Explorer help
- breakpointsInverse parameter has been eliminated and now breakpoints behave like with breakpointsInverse: true earlier than.
- touchMoveStopPropagation parameter now defaults to false
- click on occasion will not be fired with 300ms delay anymore. Now it will likely be fired similtaneously faucet occasion
- When slidesPerColumnFill: ‘column’ it now makes use of flex-direction: column structure which requires specified top on swiper-container
- touchEventsTarget now defaults to wrapper (quite than container like earlier than)
- slidesPerColumn now can be utilized with breakpoints
- Now Swiper kinds use CSS Customized Properties (CSS Customized Variables) to specify swiper’s coloration theme (coloration of navigation buttons/pagination). It’s now –swiper-theme-color: #007aff;
- Improved es module “tree-shake-ability”
- New swiper.esm.browser.bundle.js bundle that can be utilized instantly in browser (import Swiper from ‘swiper.esm.browser.bundle.js’)
- Now it will likely be paused when doc turns into hidden (in not energetic tab) and continued once more when doc turns into seen
- Swiper preloader picture changed with somewhat bit less complicated loader. Now its coloration may be modified with –swiper-preloader-color CSS customized property (which is defaults to –swiper-theme-color)
- Energetic pagination bullets and pagination theme colours now use CSS Customized Properties. It may be outlined with –swiper-pagination-color property (which is defaults to –swiper-theme-color)
- Navigation icons reworked with built-in (base64) icon font. It permits to use any coloration and dimension with out changing picture
- Navigation buttons colours now use CSS Customized Properties. It may be outlined with –swiper-navigation-color property (which is defaults to –swiper-theme-color)
- With –swiper-navigation-size (defaults to 44px) it’s now potential to alter dimension of the navigation buttons (and icons)
- Minor fixes and enhancements
This superior jQuery plugin is developed by nolimits4web. For extra Superior Usages, please verify the demo web page or go to the official web site.