+ * Returns the renderable array of slick instances.
+ * @code
+ * function my_module_render_slick_asnavfor() {
+ * // Invoke the plugin class, or use a DI service container accordingly.
+ * $slick = \Drupal::service('slick.manager');
+ *
+ * // Access the formatter service for image related methods:
+ * $formatter = \Drupal::service('slick.formatter');
+ *
+ * $build = [];
+ *
+ * // 1. Main slider ---------------------------------------------------------
+ * // Add the main display items.
+ * $build['items'] = [];
+ *
+ * $images = [1, 2, 3, 4, 6, 7];
+ * foreach ($images as $key) {
+ * // Each item has keys: slide, caption, settings.
+ * $build['items'][] = [
+ *
+ * // Use $formatter->getImage($element) to have lazyLoad where $element
+ * // contains:
+ * // item: Drupal\image\Plugin\Field\FieldType\ImageItem.
+ * 'slide' => '<img src="/path/to/image-0' . $key . '.jpg">',
+ *
+ * // Main caption contains: alt, data, link, overlay, title keys which
+ * // serve the purpose to have consistent markups and skins without
+ * // bothering much nor remembering what HTML tags and where to place to
+ * // provide for each purpose cosnsitently. CSS will do layout regardless
+ * // HTML composition.
+ * // If having more complex caption data, use 'data' key instead.
+ * // If the common layout doesn't satisfy the need, just override twig.
+ * 'caption' => ['title' => 'Description #' . $key],
+ * ];
+ * }
+ *
+ * // Optionally override the optionset.
+ * $build['options'] = [
+ * 'arrows' => FALSE,
+ * 'centerMode' => TRUE,
+ * 'centerPadding' => '',
+ * ];
+ *
+ * // Satisfy the asnavfor main settings.
+ * // @see \Drupal\slick\SlickDefault for most supported settings.
+ * $build['settings'] = [
+ * // The only required is 'optionset_thumbnail'.
+ * // Define both main and thumbnail optionset names at the main display.
+ * 'optionset' => 'optionset_main_name',
+ * 'optionset_thumbnail' => 'optionset_thumbnail_name',
+ *
+ * // The rest is optional, just FYI.
+ * 'id' => 'slick-asnavfor',
+ * 'skin' => 'skin-main-name',
+ * 'skin_thumbnail' => 'skin-thumbnail-name',
+ * ];
+ *
+ * // 2. Thumbnail slider ----------------------------------------------------
+ * // The thumbnail array is grouped by 'thumb'.
+ * $build['thumb'] = ['items' => []];
+ * foreach ($images as $key) {
+ * // Each item has keys: slide, caption, settings.
+ * $build['thumb']['items'][] = [
+ * // Use $formatter->getThumbnail($settings) where $settings contain:
+ * // uri, image_style, height, width, alt, title.
+ * 'slide' => '<img src="/path/to/image-0' . $key . '.jpg">',
+ *
+ * // Thumbnail caption accepts direct markup or custom renderable array
+ * // without any special key to be simple as much as complex.
+ * // Think Youtube playlist with scrolling nav: thumbnail, text, etc.
+ * 'caption' => ['#markup' => 'Description #' . $key],
+ * ];
+ * }
+ *
+ * // Optionally override 'optionset_thumbnail_name' with custom JS options.
+ * $build['thumb']['options'] = [
+ * 'arrows' => TRUE,
+ * 'centerMode' => TRUE,
+ * 'centerPadding' => '10px',
+ *
+ * // Be sure to have multiple slides for the thumbnail, otherwise nonsense.
+ * 'slidesToShow' => 5,
+ * ];
+ *
+ * // Build the slick once.
+ * $element = $slick->build($build);
+ *
+ * // Prepare variables to pass into a .twig.html file.
+ * $variables['slick'] = $element;
+ *
+ * // Render the slick at a .twig.html file.
+ * // {{ slick }}
+ * // Or simply return the $element if a renderable array is expected.
+ * return $element;
+ * }
+ * @endcode
+ * @see \Drupal\slick\SlickManager::build()
+ * @see template_preprocess_slick_wrapper()
+ *
+ * @section sec_skin Registering Slick skins
+ *
+ * To register a skin, implement hook_slick_skins_info() in a module file, and
+ * defines skins at the registered class which implements SlickSkinInterface.
+ *
+ * The class must implement \Drupal\slick\SlickSkinInterface, and it has 3
+ * supported methods: ::skins(), ::dots(), ::arrows() to have skin options for
+ * main/thumbnail/overlay/nested displays, dots, and arrows skins respectively.
+ * The declared skins will be available for custom coded, or UI selections.
+ *
+ * @see \Drupal\slick\SlickSkinInterface
+ * @see \Drupal\slick_example\SlickExampleSkin
+ * @see \Drupal\slick_extras\SlickExtrasSkin
+ *
+ * Add the needed methods accordingly.
+ * This can be used to register skins for the Slick. Skins will be
+ * available when configuring the Optionset, Field formatter, or Views style,
+ * or custom coded slicks.
+ *
+ * Slick skins get a unique CSS class to use for styling, e.g.:
+ * If your skin name is "my_module_slick_carousel_rounded", the CSS class is:
+ * slick--skin--my-module-slick-carousel-rounded
+ *
+ * A skin can specify CSS and JS files to include when Slick is displayed,
+ * except for a thumbnail skin which accepts CSS only.
+ *
+ * Each skin supports 5 keys:
+ * - name: The human readable name of the skin.
+ * - description: The description about the skin, for help and manage pages.
+ * - css: An array of CSS files to attach.
+ * - js: An array of JS files to attach, e.g.: image zoomer, reflection, etc.
+ * - group: A string grouping the current skin: main, thumbnail.
+ * - provider: A module name registering the skins.
+ *
+ * @section sec_skins Defines the Slick main and thumbnail skins
+ *
+ * @code
+ * public function skins() {
+ * $theme_path = base_path() . drupal_get_path('theme', 'my_theme');
+ *
+ * return [
+ * 'skin_name' => [
+ * // Human readable skin name.
+ * 'name' => 'Skin name',
+ *
+ * // Description of the skin.
+ * 'description' => t('Skin description.'),
+ *
+ * // Group skins to reduce confusion on form selection: main, thumbnail.
+ * 'group' => 'main',
+ *
+ * // Optional module name to prefix the library name.
+ * 'provider' => 'my_module',
+ *
+ * // Custom assets to be included within a skin, e.g.: Zoom, Reflection,
+ * // Slicebox, etc.
+ * 'css' => [
+ * 'theme' => [
+ * // Full path to a CSS file to include with the skin.
+ * $theme_path . '/css/my-theme--slider.css' => [],
+ * $theme_path . '/css/my-theme--carousel.css' => [],
+ * ],
+ * ],
+ * 'js' => [
+ * // Full path to a JS file to include with the skin.
+ * $theme_path . '/js/my-theme--slider.js' => [],
+ * $theme_path . '/js/my-theme--carousel.js' => [],
+ * // To act on afterSlick event, or any other slick events,
+ * // put a lighter weight before slick.load.min.js (0).
+ * $theme_path . '/js/slick.skin.menu.min.js' => ['weight' => -2],
+ * ],
+ *
+ * // Alternatively, add extra library dependencies for re-usable
+ * // libraries. These must be registered as module libraries first.
+ * // Use above CSS and JS directly if reluctant to register libraries.
+ * 'dependencies' => [
+ * 'my_module/d3',
+ * 'my_module/slicebox',
+ * 'my_module/zoom',
+ * ],
+ *
+ * // Add custom options to be merged into [data-slick] attribute.
+ * // Below is a sample of Slicebox options merged into Slick options.
+ * // These options later can be accessed in the custom JS acccordingly.
+ * 'options' => [
+ * 'orientation' => 'r',
+ * 'cuboidsCount' => 7,
+ * 'maxCuboidsCount' => 7,
+ * 'cuboidsRandom' => TRUE,
+ * 'disperseFactor' => 30,
+ * 'itemAnimation' => TRUE,
+ * 'perspective' => 1300,
+ * 'reflection' => TRUE,
+ * 'effect' => ['slicebox', 'zoom'],
+ * ],
+ * ],
+ * ];
+ * }
+ * @endcode
+ *
+ * @section sec_dots Defines Slick dot skins
+ *
+ * The provided dot skins will be available at sub-module UI form.
+ * A skin dot named 'hop' will have a class 'slick-dots--hop' for the UL.
+ *
+ * The array is similar to the self::skins(), excluding group, JS.
+ * @code
+ * public function dots() {
+ * // Create an array of dot skins.
+ * return [];
+ * }
+ * @endcode
+ *
+ * @section sec_arrows Defines Slick arrow skins
+ *
+ * The provided arrow skins will be available at sub-module UI form.
+ * A skin arrow 'slit' will have a class 'slick__arrow--slit' for the NAV.
+ *
+ * The array is similar to the self::skins(), excluding group, JS.
+ *