Перейти к содержимому

Headless CMS

Веб-компоненты Wink — это фреймворк-независимые кастомные HTML-элементы. Если ваш headless CMS рендерит HTML — будь то через Next.js, Nuxt, Astro, SvelteKit или любой другой фреймворк — вы можете встроить компоненты Wink без какой-либо специальной интеграции.

Каждая интеграция Wink, независимо от платформы, проходит через одни и те же три шага.

Добавьте это в <head> вашего документа (или в эквивалентный глобальный лэйаут):

<link rel="stylesheet" href="https://elements.wink.travel/styles.css">

Добавьте это перед закрывающим тегом </body> (или в секцию скриптов вашего лэйаута):

<script src="https://elements.wink.travel/elements.js" type="module" defer></script>

Разместите это один раз на страницу, в любом месте тела документа (обычно в футере глобального лэйаута):

<wink-app-loader client-id="YOUR_CLIENT_ID"></wink-app-loader>
app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<head>
<link rel="stylesheet" href="https://elements.wink.travel/styles.css" />
</head>
<body>
{children}
<script src="https://elements.wink.travel/elements.js" type="module" defer />
<wink-app-loader client-id="YOUR_CLIENT_ID" />
</body>
</html>
);
}
layouts/default.vue
<template>
<div>
<slot />
<wink-app-loader client-id="YOUR_CLIENT_ID" />
</div>
</template>
<script setup>
useHead({
link: [{ rel: 'stylesheet', href: 'https://elements.wink.travel/styles.css' }],
script: [{ src: 'https://elements.wink.travel/elements.js', type: 'module', defer: true }],
})
</script>
src/layouts/Layout.astro
<html lang="en">
<head>
<link rel="stylesheet" href="https://elements.wink.travel/styles.css" />
</head>
<body>
<slot />
<script src="https://elements.wink.travel/elements.js" type="module" is:inline></script>
<wink-app-loader client-id="YOUR_CLIENT_ID"></wink-app-loader>
</body>
</html>
src/routes/+layout.svelte
<svelte:head>
<link rel="stylesheet" href="https://elements.wink.travel/styles.css" />
</svelte:head>
<slot />
<wink-app-loader client-id="YOUR_CLIENT_ID" />
<script>
import { onMount } from 'svelte';
onMount(async () => {
await import('https://elements.wink.travel/elements.js');
});
</script>

В вашем CMS в полях с богатым текстом или в пользовательских типах полей вставляйте теги компонентов напрямую в HTML-вывод:

<wink-content-loader
layout="HOTEL"
id="YOUR_LAYOUT_ID"
></wink-content-loader>

Для Contentful, Strapi, Sanity или подобных headless платформ используйте поле Rich Text или Custom Block, которое рендерит сырой HTML, и вставляйте туда тег компонента.

Для проектов на TypeScript пакет @wink/elements предоставляет:

  • Функцию load(), которая программно подключает скрипты CDN
  • Полные декларации типов TypeScript для всех атрибутов компонентов
Окно терминала
npm install @wink/elements
import { load } from '@wink/elements';
// Вызов один раз при запуске приложения
load({ clientId: 'YOUR_CLIENT_ID' });
КомпонентHTML тегНазначение
Content loader<wink-content-loader>Отображение карточек отелей, сеток, карт
Lookup<wink-lookup>Поисковая строка для направлений
Search button<wink-search-button>Открыть выбор маршрута
Account button<wink-account-button>Вход / меню пользователя
Itinerary button<wink-itinerary-button>Показать текущий маршрут
Itinerary picker<wink-itinerary-picker>Полная форма маршрута
Shopping cart<wink-shopping-cart-button>Кнопка с краткой информацией о корзине

Смотрите Web Components для полного справочника по атрибутам.