├── static ├── .nojekyll ├── favicon.png └── robots.txt ├── .npmrc ├── src ├── lib │ ├── components │ │ ├── Blocks │ │ │ ├── IconButton │ │ │ │ └── README.md │ │ │ ├── Progress │ │ │ │ ├── README.md │ │ │ │ └── Progress.svelte │ │ │ ├── Link │ │ │ │ ├── README.md │ │ │ │ └── Link.svelte │ │ │ ├── WriteBarIcon │ │ │ │ └── README.md │ │ │ ├── Banner │ │ │ │ ├── BannerSubheader.svelte │ │ │ │ └── BannerHeader.svelte │ │ │ ├── Div │ │ │ │ ├── README.md │ │ │ │ └── Div.svelte │ │ │ ├── Header │ │ │ │ ├── HeaderSubtitle.svelte │ │ │ │ ├── HeaderAside.svelte │ │ │ │ └── HeaderContent.svelte │ │ │ ├── PanelSpinner │ │ │ │ ├── PanelSpinner.svelte │ │ │ │ └── README.md │ │ │ ├── Counter │ │ │ │ └── CounterTypography.svelte │ │ │ ├── Footer │ │ │ │ ├── Footer.svelte │ │ │ │ └── README.md │ │ │ ├── Spinner │ │ │ │ ├── README.md │ │ │ │ └── Spinner.svelte │ │ │ ├── Search │ │ │ │ ├── SearchPlaceholderTypography.svelte │ │ │ │ └── README.md │ │ │ ├── Switch │ │ │ │ └── README.md │ │ │ ├── List │ │ │ │ ├── README.md │ │ │ │ └── List.svelte │ │ │ ├── Card │ │ │ │ └── README.md │ │ │ ├── SimpleCell │ │ │ │ └── SimpleCellTypography.svelte │ │ │ ├── GridAvatar │ │ │ │ └── README.md │ │ │ ├── InfoRow │ │ │ │ ├── README.md │ │ │ │ └── InfoRow.svelte │ │ │ ├── Badge │ │ │ │ ├── Badge.svelte │ │ │ │ └── README.md │ │ │ ├── CardGrid │ │ │ │ └── README.md │ │ │ ├── InitialsAvatar │ │ │ │ └── README.md │ │ │ ├── Placeholder │ │ │ │ └── README.md │ │ │ ├── Separator │ │ │ │ ├── README.md │ │ │ │ └── Separator.svelte │ │ │ ├── Cell │ │ │ │ ├── CellDragger.svelte │ │ │ │ └── CellCheckbox.svelte │ │ │ ├── Gradient │ │ │ │ └── README.md │ │ │ ├── CellButton │ │ │ │ ├── README.md │ │ │ │ └── CellButton.svelte │ │ │ ├── CardScroll │ │ │ │ └── CardScroll.svelte │ │ │ ├── ModalCardBase │ │ │ │ └── README.md │ │ │ ├── RichCell │ │ │ │ └── README.md │ │ │ ├── Button │ │ │ │ └── ButtonTypography.svelte │ │ │ ├── MiniInfoCell │ │ │ │ └── README.md │ │ │ ├── Removable │ │ │ │ └── RemovableIos.svelte │ │ │ └── Spacing │ │ │ │ └── Spacing.svelte │ │ ├── Layout │ │ │ ├── Panel │ │ │ │ └── README.md │ │ │ ├── SplitCol │ │ │ │ ├── README.md │ │ │ │ ├── SplitColContext.svelte │ │ │ │ └── SplitCol.svelte │ │ │ ├── SplitLayout │ │ │ │ ├── README.md │ │ │ │ └── SplitLayout.svelte │ │ │ ├── PanelHeader │ │ │ │ ├── README.md │ │ │ │ └── PanelHeaderIn.svelte │ │ │ ├── Tabbar │ │ │ │ ├── README.md │ │ │ │ └── Tabbar.svelte │ │ │ ├── PanelHeaderBack │ │ │ │ ├── README.md │ │ │ │ └── PanelHeaderBack.svelte │ │ │ ├── PanelHeaderEdit │ │ │ │ ├── README.md │ │ │ │ └── PanelHeaderEdit.svelte │ │ │ ├── PanelHeaderButton │ │ │ │ ├── ButtonTypography.svelte │ │ │ │ └── README.md │ │ │ ├── PanelHeaderClose │ │ │ │ ├── README.md │ │ │ │ └── PanelHeaderClose.svelte │ │ │ ├── PanelHeaderSubmit │ │ │ │ ├── README.md │ │ │ │ └── PanelHeaderSubmit.svelte │ │ │ ├── FixedLayout │ │ │ │ └── README.md │ │ │ ├── HorizontalScroll │ │ │ │ └── HorizontalScroll.svelte │ │ │ └── AppRoot │ │ │ │ ├── AppRootContext.svelte │ │ │ │ └── ScrollContext.svelte │ │ ├── Service │ │ │ ├── ConfigProvider │ │ │ │ ├── README.md │ │ │ │ └── DOMContext.svelte │ │ │ ├── AdaptivityProvider │ │ │ │ └── README.md │ │ │ ├── SSRWrapper │ │ │ │ └── SSRWrapper.svelte │ │ │ ├── DropdownIcon │ │ │ │ └── DropdownIcon.svelte │ │ │ ├── Tappable │ │ │ │ └── Wave.svelte │ │ │ └── AppearanceProvider │ │ │ │ └── AppearanceProvider.svelte │ │ ├── Modals │ │ │ └── ModalDismissButton │ │ │ │ ├── README.md │ │ │ │ └── ModalDismissButton.svelte │ │ ├── Forms │ │ │ ├── FormLayout │ │ │ │ ├── README.md │ │ │ │ └── FormLayout.svelte │ │ │ ├── Checkbox │ │ │ │ ├── README.md │ │ │ │ └── CheckboxContent.svelte │ │ │ ├── NativeSelect │ │ │ │ └── README.md │ │ │ ├── VisuallyHiddenInput │ │ │ │ └── VisuallyHiddenInput.svelte │ │ │ ├── FormStatus │ │ │ │ ├── README.md │ │ │ │ └── FormStatus.svelte │ │ │ ├── Textarea │ │ │ │ └── README.md │ │ │ ├── SelectMimicry │ │ │ │ └── README.md │ │ │ ├── File │ │ │ │ ├── README.md │ │ │ │ └── File.svelte │ │ │ ├── FormField │ │ │ │ └── README.md │ │ │ ├── FormLayoutGroup │ │ │ │ └── README.md │ │ │ ├── Select │ │ │ │ └── Select.css │ │ │ ├── Input │ │ │ │ └── README.md │ │ │ ├── CustomSelectOption │ │ │ │ └── README.md │ │ │ └── FormItem │ │ │ │ └── README.md │ │ ├── Popouts │ │ │ ├── Tooltip │ │ │ │ └── TooltipContainer.svelte │ │ │ ├── PopoutWrapper │ │ │ │ └── README.md │ │ │ ├── Alert │ │ │ │ ├── AlertHeader.svelte │ │ │ │ ├── AlertText.svelte │ │ │ │ └── AlertAction.svelte │ │ │ └── ScreenSpinner │ │ │ │ ├── README.md │ │ │ │ └── ScreenSpinner.svelte │ │ ├── Typography │ │ │ ├── Text │ │ │ │ ├── README.md │ │ │ │ └── Text.svelte │ │ │ ├── Subhead │ │ │ │ ├── README.md │ │ │ │ └── Subhead.svelte │ │ │ ├── Headline │ │ │ │ ├── README.md │ │ │ │ └── Headline.svelte │ │ │ ├── Title │ │ │ │ └── README.md │ │ │ └── Caption │ │ │ │ └── README.md │ │ └── Advertisement │ │ │ └── PromoBanner │ │ │ └── README.md │ ├── fonts │ │ ├── VK_Sans_Display_Medium.woff │ │ ├── VK_Sans_Display_Medium.woff2 │ │ └── fonts.css │ ├── lib │ │ ├── utils.ts │ │ ├── testing.ts │ │ ├── getClassName.ts │ │ ├── offset.ts │ │ ├── portal.ts │ │ ├── platform.ts │ │ ├── ssr.ts │ │ ├── config.ts │ │ ├── classNames.ts │ │ ├── dom.ts │ │ ├── supportEvents.ts │ │ ├── accessibility.ts │ │ ├── browser.ts │ │ └── touch.ts │ ├── styles │ │ ├── animations.css │ │ ├── themes.ts │ │ ├── common.css │ │ ├── themes.css │ │ └── constants.css │ ├── helpers │ │ ├── avatar.ts │ │ ├── getScheme.ts │ │ ├── math.ts │ │ └── scheme.ts │ ├── hooks │ │ ├── useAppearance.ts │ │ ├── usePlatform.ts │ │ ├── useBrowserInfo.ts │ │ ├── useAdaptivity.ts │ │ ├── useWaitTransitionFinish.ts │ │ ├── useFocusVisible.ts │ │ ├── useGlobalEventListener.ts │ │ └── useKeyboardInputTracker.ts │ └── types.ts ├── routes │ ├── structure.md │ ├── icons.md │ ├── fonts.md │ ├── components │ │ ├── Blocks │ │ │ ├── Div.svelte │ │ │ ├── Card.svelte │ │ │ ├── Cell.svelte │ │ │ ├── Link.svelte │ │ │ ├── List.svelte │ │ │ ├── Badge.svelte │ │ │ ├── Group.svelte │ │ │ ├── Avatar.svelte │ │ │ ├── Banner.svelte │ │ │ ├── Button.svelte │ │ │ ├── Footer.svelte │ │ │ ├── Header.svelte │ │ │ ├── Search.svelte │ │ │ ├── Switch.svelte │ │ │ ├── CardGrid.svelte │ │ │ ├── Counter.svelte │ │ │ ├── Gradient.svelte │ │ │ ├── InfoRow.svelte │ │ │ ├── Progress.svelte │ │ │ ├── RichCell.svelte │ │ │ ├── Spacing.svelte │ │ │ ├── Spinner.svelte │ │ │ ├── WriteBar.svelte │ │ │ ├── Separator.svelte │ │ │ ├── CellButton.svelte │ │ │ ├── GridAvatar.svelte │ │ │ ├── IconButton.svelte │ │ │ ├── Pagination.svelte │ │ │ ├── SimpleCell.svelte │ │ │ ├── UsersStack.svelte │ │ │ ├── ButtonGroup.svelte │ │ │ ├── Placeholder.svelte │ │ │ ├── MiniInfoCell.svelte │ │ │ ├── ModalCardBase.svelte │ │ │ ├── PanelSpinner.svelte │ │ │ ├── WriteBarIcon.svelte │ │ │ └── InitialsAvatar.svelte │ │ ├── Forms │ │ │ ├── File.svelte │ │ │ ├── Input.svelte │ │ │ ├── Checkbox.svelte │ │ │ ├── FormItem.svelte │ │ │ ├── Textarea.svelte │ │ │ ├── FormField.svelte │ │ │ ├── FormLayout.svelte │ │ │ ├── FormStatus.svelte │ │ │ ├── NativeSelect.svelte │ │ │ ├── SelectMimicry.svelte │ │ │ ├── FormLayoutGroup.svelte │ │ │ ├── SegmentedControl.svelte │ │ │ └── CustomSelectOption.svelte │ │ ├── Layout │ │ │ ├── Panel.svelte │ │ │ ├── Tabbar.svelte │ │ │ ├── SplitCol.svelte │ │ │ ├── TabbarItem.svelte │ │ │ ├── FixedLayout.svelte │ │ │ ├── PanelHeader.svelte │ │ │ ├── SplitLayout.svelte │ │ │ ├── PanelHeaderBack.svelte │ │ │ ├── PanelHeaderEdit.svelte │ │ │ ├── PanelHeaderClose.svelte │ │ │ ├── PanelHeaderButton.svelte │ │ │ └── PanelHeaderSubmit.svelte │ │ ├── Popouts │ │ │ ├── Alert.svelte │ │ │ ├── Snackbar.svelte │ │ │ ├── PopoutWrapper.svelte │ │ │ └── ScreenSpinner.svelte │ │ ├── Service │ │ │ ├── Touch.svelte │ │ │ ├── ConfigProvider.svelte │ │ │ └── AdaptivityProvider.svelte │ │ ├── Typography │ │ │ ├── Text.svelte │ │ │ ├── Title.svelte │ │ │ ├── Caption.svelte │ │ │ ├── Subhead.svelte │ │ │ └── Headline.svelte │ │ ├── Advertisement │ │ │ └── PromoBanner.svelte │ │ └── Modals │ │ │ └── ModalDismissButton.svelte │ ├── utils.md │ ├── ssr.md │ ├── design.md │ └── modes.md ├── site │ └── lib │ │ ├── index.ts │ │ ├── Sidebar │ │ ├── types.ts │ │ ├── Components.svelte │ │ ├── Sidebar.svelte │ │ └── Group.svelte │ │ └── Icon28TokenizedOutline │ │ └── Icon28TokenizedOutline.svelte ├── global.d.ts └── app.html ├── .husky └── pre-commit ├── .markdownlint.yml ├── .prettierrc ├── .gitignore ├── .eslintrc.cjs ├── tasks └── generate_scheme.cjs ├── tsconfig.json ├── .github └── workflows │ └── publish.yml ├── LICENSE ├── README.md ├── svelte.config.js └── remark-example.js /static/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/IconButton/README.md: -------------------------------------------------------------------------------- 1 | # IconButton 2 | -------------------------------------------------------------------------------- /src/routes/structure.md: -------------------------------------------------------------------------------- 1 | # Структура экранов 2 | 3 | TODO: написать 4 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn lint 5 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveltevk/VKSUI/HEAD/static/favicon.png -------------------------------------------------------------------------------- /src/site/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Showcase } from './Showcase/Showcase.svelte'; 2 | -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/lib/components/Layout/Panel/README.md: -------------------------------------------------------------------------------- 1 | # Panel 2 | 3 | `Panel` – это контейнер для контента. 4 | -------------------------------------------------------------------------------- /.markdownlint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | no-hard-tabs: false 3 | line_length: false 4 | no-emphasis-as-heading: false 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100 6 | } 7 | -------------------------------------------------------------------------------- /src/lib/fonts/VK_Sans_Display_Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveltevk/VKSUI/HEAD/src/lib/fonts/VK_Sans_Display_Medium.woff -------------------------------------------------------------------------------- /src/lib/components/Layout/SplitCol/README.md: -------------------------------------------------------------------------------- 1 | # SplitCol 2 | 3 | Компонент-обертка для отрисовки колонки в многоколоночном интерфейсе. 4 | -------------------------------------------------------------------------------- /src/lib/fonts/VK_Sans_Display_Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sveltevk/VKSUI/HEAD/src/lib/fonts/VK_Sans_Display_Medium.woff2 -------------------------------------------------------------------------------- /src/lib/lib/utils.ts: -------------------------------------------------------------------------------- 1 | export const generateRandomId = () => { 2 | return Math.random() 3 | .toString(36) 4 | .replace(/[^a-z]+/g, ''); 5 | }; 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | .vercel 10 | .output 11 | 12 | *.log 13 | -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | declare const __version__: string; 4 | declare module '*.md'; 5 | -------------------------------------------------------------------------------- /src/lib/components/Layout/SplitLayout/README.md: -------------------------------------------------------------------------------- 1 | # SplitLayout 2 | 3 | Компонент-контейнер для реализации интерфейса с многоколоночной структурой. Тесно связан со [SplitCol](SplitCol). 4 | -------------------------------------------------------------------------------- /src/lib/components/Service/ConfigProvider/README.md: -------------------------------------------------------------------------------- 1 | # ConfigProvider 2 | 3 | Компонент для пробрасывания конфигурации приложению. Помимо прочего, отвечает за установку темы и платформы. 4 | -------------------------------------------------------------------------------- /src/site/lib/Sidebar/types.ts: -------------------------------------------------------------------------------- 1 | export interface Tree { 2 | header: string; 3 | child: { 4 | name: string; 5 | link: string; 6 | tokenized?: true; 7 | }[]; 8 | tree?: Tree[]; 9 | } 10 | -------------------------------------------------------------------------------- /src/lib/lib/testing.ts: -------------------------------------------------------------------------------- 1 | import { canUseDOM } from '@vkontakte/vkjs'; 2 | 3 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 4 | export const isTesting = Boolean(canUseDOM && (window as any).__isVkuiTesting); 5 | -------------------------------------------------------------------------------- /src/lib/lib/getClassName.ts: -------------------------------------------------------------------------------- 1 | import { Platform, platform } from '../lib/platform'; 2 | 3 | export default function getClassName(base: string, osName: Platform = platform()): string { 4 | return `${base} ${base}--${osName}`; 5 | } 6 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Progress/README.md: -------------------------------------------------------------------------------- 1 | # Progress 2 | 3 | ```svelte scroll 4 | 7 | 8 |
9 | 10 |
11 | ``` 12 | -------------------------------------------------------------------------------- /src/lib/fonts/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'VK Sans Display'; 3 | src: url('./VK_Sans_Display_Medium.woff2') format('woff2'), 4 | url('./VK_Sans_Display_Medium.woff') format('woff'); 5 | font-weight: 500; 6 | font-display: fallback; 7 | } 8 | -------------------------------------------------------------------------------- /src/routes/icons.md: -------------------------------------------------------------------------------- 1 | # Иконки 2 | 3 | Иконки хранятся отдельно в пакете `@sveltevk/icons`. У пакета есть отдельная 4 | [документация с полным списком иконок](https://sveltevk.github.io/icons). Сама 5 | библиотека использует иконки в качестве зависимости для различных компонентов. 6 | -------------------------------------------------------------------------------- /src/lib/components/Modals/ModalDismissButton/README.md: -------------------------------------------------------------------------------- 1 | # ModalDismissButton 2 | 3 | Кнопка для закрытия модальных окон на широком экране. Для правильной отрисовки нужно расположить в контейнере с `position: "relative"` и отображать при достаточной ширине экрана (от `ViewWidth.SMALL_TABLET`) 4 | -------------------------------------------------------------------------------- /src/routes/fonts.md: -------------------------------------------------------------------------------- 1 | # VK Sans Display 2 | 3 | Этот шрифт используется в PanelHeader, PanelHeaderContent и ModalPageHeader. 4 | 5 | В библиотеке есть отдельный css-энтрипойнт для подключения шрифта на страницу. 6 | 7 | ```js 8 | import '@vkontakte/vkui/fonts/fonts.css'; 9 | ``` 10 | -------------------------------------------------------------------------------- /src/lib/styles/animations.css: -------------------------------------------------------------------------------- 1 | @keyframes vkui-rotator { 2 | 0% { 3 | transform: rotate(0deg); 4 | } 5 | 6 | 100% { 7 | transform: rotate(360deg); 8 | } 9 | } 10 | 11 | @keyframes vkui-popper-fadein { 12 | from { 13 | opacity: 0; 14 | } 15 | 16 | to { 17 | opacity: 1; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeader/README.md: -------------------------------------------------------------------------------- 1 | # PanelHeader 2 | 3 | Практически всегда содержимое панели должно начинаться с `Separator`, поэтому он рисуется в `PanelHeader` по-умолчанию. 4 | 5 | > **Важно** 6 | > 7 | > Правая часть шапки будет скрыта, если в `ConfigProvider` передан `webviewType={WebviewType.VKAPPS}`. 8 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Div.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Card.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Cell.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Link.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/List.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/File.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/Input.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Badge.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Group.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Layout/Panel.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Link/README.md: -------------------------------------------------------------------------------- 1 | # Link 2 | 3 | Надстройка над ``. Компонент принимает все валидные для этого элемента свойства. 4 | 5 | ```svelte 6 | 9 | 10 | Google 11 | Profile 12 | ``` 13 | -------------------------------------------------------------------------------- /src/lib/components/Layout/Tabbar/README.md: -------------------------------------------------------------------------------- 1 | # Tabbar 2 | 3 | Компонент для навигации внутри Epic. 4 | 5 | > **Важно** 6 | > 7 | > `Tabbar` располагается фиксированно. Если внутри панели вы используете `FixedLayout`, например располагаете внизу панели `Tabs`, то у `Tabbar` нужно указать `shadow={false}`, чтобы его тень не наeзжала на "прижатый" книзу контент панели. 8 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Avatar.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Banner.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Button.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Footer.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Header.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Search.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Switch.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Layout/Tabbar.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Popouts/Alert.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Service/Touch.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/CardGrid.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Counter.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Gradient.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/InfoRow.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Progress.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/RichCell.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Spacing.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Spinner.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/WriteBar.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/Checkbox.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/FormItem.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/Textarea.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Layout/SplitCol.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Typography/Text.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Typography/Title.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/lib/components/Forms/FormLayout/README.md: -------------------------------------------------------------------------------- 1 | # FormLayout 2 | 3 | Компонент для создания form. Содержит скрытый ``, обеспечивающий отправку формы по enter. 4 | 5 | Чтобы избежать перезагрузки страницы, необходимо вызвать `e.preventDefault()` 6 | 7 | ```svelte 8 | e.preventDefault()}>... 9 | ``` 10 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Separator.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/FormField.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/FormLayout.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/FormStatus.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Popouts/Snackbar.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/CellButton.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/GridAvatar.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/IconButton.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Pagination.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/SimpleCell.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/UsersStack.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Layout/TabbarItem.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Typography/Caption.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Typography/Subhead.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/ButtonGroup.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/Placeholder.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/NativeSelect.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Layout/FixedLayout.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Layout/PanelHeader.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Layout/SplitLayout.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Typography/Headline.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/lib/components/Service/AdaptivityProvider/README.md: -------------------------------------------------------------------------------- 1 | # AdaptivityProvider 2 | 3 | Компонент, прокидывающий вниз данные об адаптивности. Все параметры, которые можно прокинуть через props, компонент по умолчанию вычисляет самостоятельно. Передавать их с помощью props стоит в тех случаях, когда вы точно уверены, что ваш сайт, например, будет открываться только на мобильных устройствах. 4 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/MiniInfoCell.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/ModalCardBase.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/PanelSpinner.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/WriteBarIcon.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/SelectMimicry.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Blocks/InitialsAvatar.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Forms/FormLayoutGroup.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Popouts/PopoutWrapper.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/routes/components/Popouts/ScreenSpinner.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/WriteBarIcon/README.md: -------------------------------------------------------------------------------- 1 | Компонент для отрисовки кнопок-иконок в [`WriteBar`](WriteBar). 2 | 3 | Надстройка над ` 14 | 15 | ``` 16 | -------------------------------------------------------------------------------- /src/lib/components/Service/ConfigProvider/DOMContext.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Header/HeaderSubtitle.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | {#if mode === 'secondary'} 9 | 10 | {:else} 11 | 12 | {/if} 13 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/PanelSpinner/PanelSpinner.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/components/Forms/Checkbox/README.md: -------------------------------------------------------------------------------- 1 | # Checkbox 2 | 3 | ```svelte scroll 4 | 7 | 8 | 9 | 10 | Я участвую в сборе 11 | Закрепить сообщение 12 | Автоматически зачислять на карту 13 | 14 | 15 | ``` 16 | -------------------------------------------------------------------------------- /src/routes/ssr.md: -------------------------------------------------------------------------------- 1 | # Серверный рендеринг 2 | 3 | Библиотека полностью поддерживает SSR и [Svelte Kit](https://kit.svelte.dev/). Для корректного рендеринга компонентов на сервере, достаточно обернуть ваше приложение в `SSRWrapper`, передав туда значение заголовка `userAgent`. Это нужно для определения платформы пользователя (iOS или Android) на стороне сервера. 4 | 5 | ```svelte 6 | 7 | 8 | 9 | ``` 10 | -------------------------------------------------------------------------------- /src/lib/hooks/useAppearance.ts: -------------------------------------------------------------------------------- 1 | import { getContext } from 'svelte'; 2 | import { writable } from 'svelte/store'; 3 | import type { Writable } from 'svelte/store'; 4 | import { ContextKey } from '../lib/config'; 5 | import type { AppearanceType } from '@vkontakte/vk-bridge'; 6 | 7 | export function useAppearance(): Writable { 8 | const wAppearance = getContext(ContextKey.appearance) as Writable; 9 | 10 | return wAppearance || writable('light'); 11 | } 12 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/PanelSpinner/README.md: -------------------------------------------------------------------------------- 1 | # PanelSpinner 2 | 3 | Этот компонент - обёртка над `` с заданными отступами и размером. Удобно использовать его во время загрузки данных. 4 | 5 | ```svelte 6 | {#await promise} 7 | 8 | {:then value} 9 | 10 |
Информация
11 | ... 12 |
13 | {:catch error} 14 | 15 |
Ошибка
16 | ... 17 |
18 | {/await} 19 | ``` 20 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | %sveltekit.head% 12 | 13 | 14 | 15 |
%sveltekit.body%
16 | 17 | 18 | -------------------------------------------------------------------------------- /src/lib/components/Popouts/Tooltip/TooltipContainer.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
22 | 23 |
24 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Header/HeaderAside.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {#if platform === Platform.IOS} 10 | 11 | {:else} 12 | 13 | {/if} 14 | -------------------------------------------------------------------------------- /src/lib/hooks/usePlatform.ts: -------------------------------------------------------------------------------- 1 | import { getContext } from 'svelte'; 2 | import { writable } from 'svelte/store'; 3 | import type { Writable } from 'svelte/store'; 4 | import { platform } from '../lib/platform'; 5 | import type { PlatformType } from '../lib/platform'; 6 | import { ContextKey } from '../lib/config'; 7 | 8 | export function usePlatform(): Writable { 9 | const wPlatform = getContext(ContextKey.platform) as Writable; 10 | 11 | return wPlatform || writable(platform()); 12 | } 13 | -------------------------------------------------------------------------------- /src/lib/types.ts: -------------------------------------------------------------------------------- 1 | import type { PlatformType } from './lib/platform'; 2 | import type { Insets } from '@vkontakte/vk-bridge'; 3 | 4 | export type AlignType = 'left' | 'center' | 'right'; 5 | 6 | export interface HasPlatform { 7 | /** 8 | * @ignore 9 | */ 10 | platform?: PlatformType; 11 | } 12 | 13 | export interface HasInsets { 14 | /** 15 | * @ignore 16 | */ 17 | insets?: Partial; 18 | } 19 | 20 | export interface Version { 21 | major: number; 22 | minor?: number; 23 | patch?: number; 24 | } 25 | -------------------------------------------------------------------------------- /src/lib/components/Forms/NativeSelect/README.md: -------------------------------------------------------------------------------- 1 | # NativeSelect 2 | 3 | ```svelte frame 4 | 7 | 8 | 9 | NativeSelect 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ``` 20 | -------------------------------------------------------------------------------- /src/lib/components/Service/SSRWrapper/SSRWrapper.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/lib/lib/portal.ts: -------------------------------------------------------------------------------- 1 | export function portal(el: HTMLElement, target: HTMLElement | null) { 2 | let targetEl: HTMLElement; 3 | async function update(newTarget: HTMLElement | null) { 4 | if (newTarget === null) { 5 | return; 6 | } 7 | 8 | targetEl = newTarget; 9 | targetEl.appendChild(el); 10 | el.hidden = false; 11 | } 12 | 13 | function destroy() { 14 | if (el.parentNode) { 15 | el.parentNode.removeChild(el); 16 | } 17 | } 18 | 19 | update(target); 20 | return { 21 | update, 22 | destroy 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeaderBack/README.md: -------------------------------------------------------------------------------- 1 | # PanelHeaderBack 2 | 3 | Этот компонент используется для показа кнопки назад в панелях в рамках одного `View`. Внутри инкапсулирована логика показа нужной иконки для платформы. 4 | 5 | ```svelte frame mini 6 | 11 | 12 | 13 | 14 | Заголовок панели 15 | 16 | ``` 17 | -------------------------------------------------------------------------------- /src/lib/components/Typography/Text/README.md: -------------------------------------------------------------------------------- 1 | # Text 2 | 3 | Упрощения в Android-версии (происходят автоматически): 4 | 5 | - `semibold` превращается в `medium` 6 | 7 | ## Пример реализации 8 | 9 | ```svelte mini 10 | 13 | 14 |
15 | Text regular 16 | Text medium 17 | Text semibold 18 |
19 | ``` 20 | -------------------------------------------------------------------------------- /src/lib/components/Popouts/PopoutWrapper/README.md: -------------------------------------------------------------------------------- 1 | # PopoutWrapper 2 | 3 | Компонент-обертка для отрисовки всплывающих окон с затемнением фона. Используется внутри `Alert`, `ActionSheet` и `ScreenSpinner`. Свойства `alignY` и `alignX` служат для удобного позиционирования контента. Пример: 4 | 5 | ```svelte 6 | 9 | 10 | Some content 11 | ``` 12 | 13 | Все всплывающие окна передаются в слот `popout` компонентов `View` или `Root`. 14 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Counter/CounterTypography.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | {#if size === 's'} 11 | 12 | {:else} 13 | 14 | {/if} 15 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeaderEdit/README.md: -------------------------------------------------------------------------------- 1 | # PanelHeaderEdit 2 | 3 | Компонент для отрисовки кнопки Редактировать в шапке. Принимает свойство `isActive`, которое определяет состояние кнопки (включен ли режим редактирования). 4 | 5 | ```svelte frame mini 6 | 11 | 12 | 13 | (isActive = !isActive)} /> 14 | Заголовок окна 15 | 16 | ``` 17 | 18 | ``` 19 | 20 | ``` 21 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeaderButton/ButtonTypography.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | {#if platform === IOS} 11 | 12 | <slot /> 13 | 14 | {:else} 15 | 16 | {/if} 17 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeaderClose/README.md: -------------------------------------------------------------------------------- 1 | # PanelHeaderClose 2 | 3 | Этот компонент используется для показа кнопки "Отмена" в модальных окнах для закрытия текущего `View` в рамках `Root`. На iOS будет показан текст, передаваемый как `text`, на Android - ``: 4 | 5 | ```svelte frame mini 6 | 11 | 12 | 13 | 14 | Заголовок модального окна 15 | 16 | ``` 17 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Footer/Footer.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 10 | 11 | 12 | 13 | 14 | 15 | 25 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeaderSubmit/README.md: -------------------------------------------------------------------------------- 1 | # PanelHeaderSubmit 2 | 3 | Этот компонент используется для показа кнопки "Отмена" в модальных окнах для закрытия текущего `View` в рамках `Root`. На iOS будет показан текст, передаваемый как `text`, на Android - ``: 4 | 5 | ```svelte frame mini 6 | 11 | 12 | 13 | 14 | Заголовок модального окна 15 | 16 | ``` 17 | -------------------------------------------------------------------------------- /src/lib/components/Layout/FixedLayout/README.md: -------------------------------------------------------------------------------- 1 | # FixedLayout 2 | 3 | `{ position: fixed }` не дружит с `{ transform: translate }` на родителе, поэтому для позиционирования фиксированных блоков внутри панели, необходимо использовать FixedLayout в качестве обертки. 4 | 5 | Для удобства есть свойство `vertical`, с помощью которого можно "прижать" контент к верху или низу. При этому будут учитываться высота шапки и прочие системные отступы. 6 | 7 | **Важно**: блок с `{ position: fixed }` находится не в потоке. В примере можно увидеть, что у блока с основным контентом есть паддинги. Они там не случайны. 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/lib/lib/platform.ts: -------------------------------------------------------------------------------- 1 | import { canUseDOM } from './dom'; 2 | 3 | export enum Platform { 4 | ANDROID = 'android', 5 | IOS = 'ios', 6 | VKCOM = 'vkcom' 7 | } 8 | 9 | export const ANDROID: Platform = Platform.ANDROID; 10 | export const IOS: Platform = Platform.IOS; 11 | export const VKCOM: Platform = Platform.VKCOM; 12 | 13 | export type PlatformType = Platform.ANDROID | Platform.IOS | Platform.VKCOM; 14 | // | string; 15 | 16 | export function platform(useragent?: string): PlatformType { 17 | const ua = useragent || (canUseDOM && navigator.userAgent) || ''; 18 | 19 | return /iphone|ipad|ipod/i.test(ua) ? IOS : ANDROID; 20 | } 21 | -------------------------------------------------------------------------------- /src/lib/lib/ssr.ts: -------------------------------------------------------------------------------- 1 | import type { Writable } from 'svelte/store'; 2 | import { writable } from 'svelte/store'; 3 | import { Platform, platform } from './platform'; 4 | 5 | export interface SSRContextInterface { 6 | platform: Writable; 7 | userAgent?: string; 8 | } 9 | 10 | export const SSRContextKey = 'SSRContext'; 11 | 12 | export interface SSRBuildContextProps { 13 | userAgent?: string; 14 | } 15 | 16 | export const SSRBuildContext = (props: SSRBuildContextProps): SSRContextInterface => { 17 | const { userAgent } = props; 18 | 19 | const contextValue = { 20 | platform: writable(platform(userAgent)), 21 | userAgent 22 | }; 23 | 24 | return contextValue; 25 | }; 26 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Footer/README.md: -------------------------------------------------------------------------------- 1 | # Footer 2 | 3 | Подвал для списков. 4 | 5 | ## Пример 6 | 7 | ```svelte scroll 8 | 11 | 12 | 13 | 14 | 15 | 16 | Команда ВКонтакте 17 | 18 | 19 | 20 | Robbie Williams 21 | 22 | 23 | 24 | ПостНаука 25 | 26 | 27 | 28 |
3 сообщества
29 | ``` 30 | -------------------------------------------------------------------------------- /src/lib/components/Forms/Checkbox/CheckboxContent.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | {#if platform === VKCOM || sizeY === SizeType.COMPACT} 12 | 13 | {:else} 14 | 15 | {/if} 16 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeaderClose/PanelHeaderClose.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/lib/hooks/useBrowserInfo.ts: -------------------------------------------------------------------------------- 1 | import { getContext } from 'svelte'; 2 | import { SSRContextKey } from '../lib/ssr'; 3 | import type { SSRContextInterface } from '../lib/ssr'; 4 | import { canUseDOM } from '../lib/dom'; 5 | import { computeBrowserInfo } from '../lib/browser'; 6 | import type { BrowserInfo } from '../lib/browser'; 7 | 8 | export default function useBrowserInfo(): BrowserInfo { 9 | const ssrContext = getContext(SSRContextKey) as SSRContextInterface; 10 | 11 | let userAgent = canUseDOM && navigator.userAgent ? navigator.userAgent : ''; 12 | if (ssrContext && ssrContext.platform) { 13 | userAgent = ssrContext.userAgent; 14 | } 15 | 16 | return computeBrowserInfo(userAgent); 17 | } 18 | -------------------------------------------------------------------------------- /src/lib/components/Layout/PanelHeaderSubmit/PanelHeaderSubmit.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/lib/components/Popouts/Alert/AlertHeader.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {#if platform === VKCOM} 10 | 11 | 12 | 13 | {:else if platform === IOS} 14 | 15 | <slot /> 16 | 17 | {:else if platform === ANDROID} 18 | 19 | <slot /> 20 | 21 | {/if} 22 | -------------------------------------------------------------------------------- /src/lib/components/Typography/Subhead/README.md: -------------------------------------------------------------------------------- 1 | # Subhead 2 | 3 | Семейство заголовков. 4 | 5 | ## Пример реализации 6 | 7 | ```svelte mini 8 | 11 | 12 |
13 | Subhead 14 |
15 | ``` 16 | 17 | ## Кастомизация 18 | 19 | Есть возможность переопределить жирность. 20 | 21 | ## Пример реализации 22 | 23 | ```svelte mini 24 |
25 | Subhead 3 weight 1 26 | Subhead 3 weight 2 27 | Subhead 3 weight 3 28 |
29 | ``` 30 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | rules: { 16 | '@typescript-eslint/ban-ts-comment': 'off', 17 | '@typescript-eslint/no-non-null-assertion': 'off' 18 | }, 19 | env: { 20 | browser: true, 21 | es2017: true, 22 | node: true 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/lib/components/Forms/VisuallyHiddenInput/VisuallyHiddenInput.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 21 | 22 | 33 | -------------------------------------------------------------------------------- /src/lib/components/Popouts/Alert/AlertText.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | {#if platform === VKCOM} 10 | 11 | 12 | 13 | {:else if platform === IOS} 14 | 15 | 16 | 17 | {:else if platform === ANDROID} 18 | 19 | 20 | 21 | {/if} 22 | -------------------------------------------------------------------------------- /src/lib/components/Typography/Headline/README.md: -------------------------------------------------------------------------------- 1 | # Headline 2 | 3 | ```svelte mini 4 | 7 | 8 |
9 | Headline 1 10 | Headline 2 11 |
12 | ``` 13 | 14 | ## Кастомизация 15 | 16 | Есть возможность переопределить жирность. 17 | 18 | ```svelte mini 19 |
20 | Headline 2 weight 1 21 | Headline 2 weight 2 22 | Headline 2 weight 3 23 |
24 | ``` 25 | -------------------------------------------------------------------------------- /src/lib/lib/config.ts: -------------------------------------------------------------------------------- 1 | export enum ContextKey { 2 | isWebView = 'vkui_isWebView', 3 | webviewType = 'vkui_webviewType', 4 | scheme = 'vkui_scheme', 5 | appearance = 'vkui_appearance', 6 | classAppearance = 'vkui_classAppearance', 7 | app = 'vkui_app', 8 | transitionMotionEnabled = 'vkui_transitionMotionEnabled', 9 | platform = 'vkui_platform', 10 | hasNewTokens = 'vkui_hasNewTokens' 11 | } 12 | 13 | export enum Appearance { 14 | DARK = 'dark', 15 | LIGHT = 'light' 16 | } 17 | 18 | export enum Scheme { 19 | BRIGHT_LIGHT = 'bright_light', 20 | SPACE_GRAY = 'space_gray', 21 | VKCOM_LIGHT = 'vkcom_light', 22 | VKCOM_DARK = 'vkcom_dark' 23 | } 24 | 25 | export enum WebviewType { 26 | VKAPPS = 'vkapps', 27 | INTERNAL = 'internal' 28 | } 29 | -------------------------------------------------------------------------------- /tasks/generate_scheme.cjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const path = require('path'); 3 | const schemeVKUI = require('@vkontakte/appearance/main.valette/scheme'); 4 | const paletteVKUI = require('@vkontakte/appearance/main.valette/palette'); 5 | const schemeWeb = require('@vkontakte/appearance/main.valette/scheme_web'); 6 | const paletteWeb = require('@vkontakte/appearance/main.valette/palette_web'); 7 | const pkg = require('../package.json'); 8 | const generateScheme = require('@vkontakte/vkjs/build/tasks/generate_scheme'); 9 | 10 | const stylesDir = path.resolve(__dirname, '../src/lib/styles'); 11 | 12 | generateScheme(schemeVKUI, paletteVKUI, pkg.defaultSchemeId, stylesDir); 13 | generateScheme(schemeWeb, paletteWeb, pkg.defaultSchemeId, stylesDir); 14 | -------------------------------------------------------------------------------- /src/lib/components/Blocks/Spinner/README.md: -------------------------------------------------------------------------------- 1 | # Spinner 2 | 3 | Используется для визуализации выполнения асинхронного процесса (например ajax запроса). Если нужно на момент загрузки заблокировать интерфейс, то можно использовать надстройку над Spinner – ScreenSpinner. 4 | 5 | ```svelte mini 6 | 9 | 10 |
11 | 12 | 13 | 14 | 15 |
16 | 17 | 24 | ``` 25 | -------------------------------------------------------------------------------- /src/lib/components/Forms/FormStatus/README.md: -------------------------------------------------------------------------------- 1 | # FormStatus 2 | 3 | Компонент используется для отображения статуса формы. Например, когда в форме допущена ошибка, и нет возможности указать на конкретное поле. Заголовок и текст опциональны. 4 | 5 | ```svelte scroll 6 | 9 | 10 | 11 | 12 | 13 | Необходимо корректно ввести номер в международном формате 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ``` 24 | -------------------------------------------------------------------------------- /src/lib/components/Forms/Textarea/README.md: -------------------------------------------------------------------------------- 1 | # Textarea 2 | 3 | Надстройка над `