@ziyarago/ui 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +23 -2
- package/dist/llms-full.txt +32 -3
- package/dist/llms.txt +3 -2
- package/dist/manifest.json +123 -6
- package/dist/style.css +41 -0
- package/package.json +2 -2
- package/src/core/components.js +15 -14
- package/src/core/components2.js +37 -36
- package/src/core/components3.js +29 -7
- package/src/core/components4.js +23 -22
- package/src/core/components6.js +8 -7
- package/src/core/components7.js +10 -9
- package/src/core/index.js +1 -1
- package/src/core/pages.js +1 -0
- package/src/i18n/components/ActionCard.js +5 -0
- package/src/i18n/components/Actionsheet.js +5 -0
- package/src/i18n/components/Alert.js +5 -0
- package/src/i18n/components/Breadcrumbs.js +5 -0
- package/src/i18n/components/Calendar.js +5 -0
- package/src/i18n/components/CallCard.js +5 -0
- package/src/i18n/components/CallRow.js +5 -0
- package/src/i18n/components/Carousel.js +5 -0
- package/src/i18n/components/ChartCard.js +5 -0
- package/src/i18n/components/ChatAi.js +5 -0
- package/src/i18n/components/Chip.js +5 -0
- package/src/i18n/components/ChipInput.js +5 -0
- package/src/i18n/components/CodeInput.js +5 -0
- package/src/i18n/components/Combobox.js +5 -0
- package/src/i18n/components/CommandPalette.js +5 -0
- package/src/i18n/components/ConfirmDialog.js +5 -0
- package/src/i18n/components/ContactPanel.js +5 -0
- package/src/i18n/components/CopyButton.js +2 -0
- package/src/i18n/components/DataGroup.js +5 -0
- package/src/i18n/components/DataState.js +5 -0
- package/src/i18n/components/DataTable.js +5 -0
- package/src/i18n/components/DatePicker.js +5 -0
- package/src/i18n/components/DealCard.js +5 -0
- package/src/i18n/components/Drawer.js +5 -0
- package/src/i18n/components/ErrorPage.js +5 -0
- package/src/i18n/components/FileUpload.js +5 -0
- package/src/i18n/components/FullscreenDialog.js +5 -0
- package/src/i18n/components/Gallery.js +5 -0
- package/src/i18n/components/GuestCard.js +5 -0
- package/src/i18n/components/ImageUpload.js +5 -0
- package/src/i18n/components/ImageViewer.js +5 -0
- package/src/i18n/components/IncomingCall.js +5 -0
- package/src/i18n/components/InlineEdit.js +5 -0
- package/src/i18n/components/IntegrationCard.js +5 -0
- package/src/i18n/components/LoginForm.js +5 -0
- package/src/i18n/components/Map.js +5 -0
- package/src/i18n/components/Modal.js +5 -0
- package/src/i18n/components/MultiSelect.js +5 -0
- package/src/i18n/components/NotificationBell.js +5 -0
- package/src/i18n/components/NumberInput.js +5 -0
- package/src/i18n/components/Pagination.js +5 -0
- package/src/i18n/components/PasswordInput.js +5 -0
- package/src/i18n/components/Popconfirm.js +5 -0
- package/src/i18n/components/PricingCard.js +5 -0
- package/src/i18n/components/RamadanTracker.js +5 -0
- package/src/i18n/components/RangeCalendar.js +5 -0
- package/src/i18n/components/RangeSlider.js +5 -0
- package/src/i18n/components/Rating.js +5 -0
- package/src/i18n/components/RichEditor.js +5 -0
- package/src/i18n/components/Screensaver.js +5 -0
- package/src/i18n/components/SearchInput.js +5 -0
- package/src/i18n/components/SideNav.js +5 -0
- package/src/i18n/components/Snackbar.js +5 -0
- package/src/i18n/components/Sortable.js +5 -0
- package/src/i18n/components/Spinner.js +5 -0
- package/src/i18n/components/StatusPage.js +5 -0
- package/src/i18n/components/StepDialog.js +5 -0
- package/src/i18n/components/StepForm.js +5 -0
- package/src/i18n/components/TabTiles.js +5 -0
- package/src/i18n/components/Tag.js +5 -0
- package/src/i18n/components/TopNav.js +5 -0
- package/src/i18n/components/Tour.js +5 -0
- package/src/i18n/components/TourCard.js +5 -0
- package/src/i18n/components/TourPopover.js +5 -0
- package/src/i18n/components/TreeSelect.js +5 -0
- package/src/i18n/components/Validation.js +5 -0
- package/src/i18n/components/index.js +130 -0
- package/src/i18n/index.js +8 -6
- package/src/meta/domain.js +20 -0
- package/src/meta/groups.js +1 -1
- package/src/meta/pages.js +9 -1
- package/src/meta/templates.json +1 -1
- package/src/react/index.js +1 -0
- package/src/styles/components8.css +41 -0
- package/src/vue/index.js +1 -1
- package/types/i18n.d.ts +4 -2
- package/types/react.d.ts +80 -2
- package/types/vue-global.d.ts +1 -0
- package/types/vue.d.ts +83 -2
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
en: { required: 'This field is required', email: 'Enter a valid email', url: 'Enter a valid URL', digits: 'Exactly {n} digits', alpha: 'Letters only', alphaDash: 'Letters, digits, dash and underscore', minLength: 'At least {n} characters', maxLength: 'At most {n} characters', range: 'Between {a} and {b}', invalid: 'Invalid format', confirmed: 'Values do not match', password: '8+ characters, a digit and a capital letter' },
|
|
3
|
+
ar: { required: 'هذا الحقل مطلوب', email: 'أدخل بريدًا إلكترونيًا صالحًا', url: 'أدخل رابطًا صالحًا', digits: '{n} أرقام بالضبط', alpha: 'أحرف فقط', alphaDash: 'أحرف وأرقام وشرطة وشرطة سفلية', minLength: '{n} أحرف على الأقل', maxLength: '{n} أحرف كحد أقصى', range: 'بين {a} و {b}', invalid: 'تنسيق غير صالح', confirmed: 'القيمتان غير متطابقتين', password: '8 أحرف أو أكثر ورقم وحرف كبير' },
|
|
4
|
+
ru: { required: 'Обязательное поле', email: 'Введите корректный email', url: 'Введите корректный URL', digits: 'Ровно {n} цифр', alpha: 'Только буквы', alphaDash: 'Буквы, цифры, дефис и подчёркивание', minLength: 'Не менее {n} символов', maxLength: 'Не более {n} символов', range: 'От {a} до {b}', invalid: 'Неверный формат', confirmed: 'Значения не совпадают', password: '8+ символов, цифра и заглавная буква' },
|
|
5
|
+
};
|
|
@@ -1,5 +1,135 @@
|
|
|
1
1
|
// generated by scripts/i18n-index.mjs: do not edit
|
|
2
2
|
import { defineMessages } from '../index.js';
|
|
3
|
+
import ActionCard from './ActionCard.js';
|
|
4
|
+
import Actionsheet from './Actionsheet.js';
|
|
5
|
+
import Alert from './Alert.js';
|
|
6
|
+
import Breadcrumbs from './Breadcrumbs.js';
|
|
7
|
+
import Calendar from './Calendar.js';
|
|
8
|
+
import CallCard from './CallCard.js';
|
|
9
|
+
import CallRow from './CallRow.js';
|
|
10
|
+
import Carousel from './Carousel.js';
|
|
11
|
+
import ChartCard from './ChartCard.js';
|
|
12
|
+
import ChatAi from './ChatAi.js';
|
|
13
|
+
import Chip from './Chip.js';
|
|
14
|
+
import ChipInput from './ChipInput.js';
|
|
15
|
+
import CodeInput from './CodeInput.js';
|
|
16
|
+
import Combobox from './Combobox.js';
|
|
17
|
+
import CommandPalette from './CommandPalette.js';
|
|
18
|
+
import ConfirmDialog from './ConfirmDialog.js';
|
|
19
|
+
import ContactPanel from './ContactPanel.js';
|
|
3
20
|
import CopyButton from './CopyButton.js';
|
|
21
|
+
import DataGroup from './DataGroup.js';
|
|
22
|
+
import DataState from './DataState.js';
|
|
23
|
+
import DataTable from './DataTable.js';
|
|
24
|
+
import DatePicker from './DatePicker.js';
|
|
25
|
+
import DealCard from './DealCard.js';
|
|
26
|
+
import Drawer from './Drawer.js';
|
|
27
|
+
import ErrorPage from './ErrorPage.js';
|
|
28
|
+
import FileUpload from './FileUpload.js';
|
|
29
|
+
import FullscreenDialog from './FullscreenDialog.js';
|
|
30
|
+
import Gallery from './Gallery.js';
|
|
31
|
+
import GuestCard from './GuestCard.js';
|
|
32
|
+
import ImageUpload from './ImageUpload.js';
|
|
33
|
+
import ImageViewer from './ImageViewer.js';
|
|
34
|
+
import IncomingCall from './IncomingCall.js';
|
|
35
|
+
import InlineEdit from './InlineEdit.js';
|
|
36
|
+
import IntegrationCard from './IntegrationCard.js';
|
|
37
|
+
import LoginForm from './LoginForm.js';
|
|
38
|
+
import Map from './Map.js';
|
|
39
|
+
import Modal from './Modal.js';
|
|
40
|
+
import MultiSelect from './MultiSelect.js';
|
|
41
|
+
import NotificationBell from './NotificationBell.js';
|
|
42
|
+
import NumberInput from './NumberInput.js';
|
|
43
|
+
import Pagination from './Pagination.js';
|
|
44
|
+
import PasswordInput from './PasswordInput.js';
|
|
45
|
+
import Popconfirm from './Popconfirm.js';
|
|
46
|
+
import PricingCard from './PricingCard.js';
|
|
47
|
+
import RamadanTracker from './RamadanTracker.js';
|
|
48
|
+
import RangeCalendar from './RangeCalendar.js';
|
|
49
|
+
import RangeSlider from './RangeSlider.js';
|
|
50
|
+
import Rating from './Rating.js';
|
|
51
|
+
import RichEditor from './RichEditor.js';
|
|
52
|
+
import Screensaver from './Screensaver.js';
|
|
53
|
+
import SearchInput from './SearchInput.js';
|
|
54
|
+
import SideNav from './SideNav.js';
|
|
55
|
+
import Snackbar from './Snackbar.js';
|
|
56
|
+
import Sortable from './Sortable.js';
|
|
57
|
+
import Spinner from './Spinner.js';
|
|
58
|
+
import StatusPage from './StatusPage.js';
|
|
59
|
+
import StepDialog from './StepDialog.js';
|
|
60
|
+
import StepForm from './StepForm.js';
|
|
61
|
+
import TabTiles from './TabTiles.js';
|
|
62
|
+
import Tag from './Tag.js';
|
|
63
|
+
import TopNav from './TopNav.js';
|
|
64
|
+
import Tour from './Tour.js';
|
|
65
|
+
import TourCard from './TourCard.js';
|
|
66
|
+
import TourPopover from './TourPopover.js';
|
|
67
|
+
import TreeSelect from './TreeSelect.js';
|
|
68
|
+
import Validation from './Validation.js';
|
|
4
69
|
|
|
70
|
+
defineMessages('ActionCard', ActionCard);
|
|
71
|
+
defineMessages('Actionsheet', Actionsheet);
|
|
72
|
+
defineMessages('Alert', Alert);
|
|
73
|
+
defineMessages('Breadcrumbs', Breadcrumbs);
|
|
74
|
+
defineMessages('Calendar', Calendar);
|
|
75
|
+
defineMessages('CallCard', CallCard);
|
|
76
|
+
defineMessages('CallRow', CallRow);
|
|
77
|
+
defineMessages('Carousel', Carousel);
|
|
78
|
+
defineMessages('ChartCard', ChartCard);
|
|
79
|
+
defineMessages('ChatAi', ChatAi);
|
|
80
|
+
defineMessages('Chip', Chip);
|
|
81
|
+
defineMessages('ChipInput', ChipInput);
|
|
82
|
+
defineMessages('CodeInput', CodeInput);
|
|
83
|
+
defineMessages('Combobox', Combobox);
|
|
84
|
+
defineMessages('CommandPalette', CommandPalette);
|
|
85
|
+
defineMessages('ConfirmDialog', ConfirmDialog);
|
|
86
|
+
defineMessages('ContactPanel', ContactPanel);
|
|
5
87
|
defineMessages('CopyButton', CopyButton);
|
|
88
|
+
defineMessages('DataGroup', DataGroup);
|
|
89
|
+
defineMessages('DataState', DataState);
|
|
90
|
+
defineMessages('DataTable', DataTable);
|
|
91
|
+
defineMessages('DatePicker', DatePicker);
|
|
92
|
+
defineMessages('DealCard', DealCard);
|
|
93
|
+
defineMessages('Drawer', Drawer);
|
|
94
|
+
defineMessages('ErrorPage', ErrorPage);
|
|
95
|
+
defineMessages('FileUpload', FileUpload);
|
|
96
|
+
defineMessages('FullscreenDialog', FullscreenDialog);
|
|
97
|
+
defineMessages('Gallery', Gallery);
|
|
98
|
+
defineMessages('GuestCard', GuestCard);
|
|
99
|
+
defineMessages('ImageUpload', ImageUpload);
|
|
100
|
+
defineMessages('ImageViewer', ImageViewer);
|
|
101
|
+
defineMessages('IncomingCall', IncomingCall);
|
|
102
|
+
defineMessages('InlineEdit', InlineEdit);
|
|
103
|
+
defineMessages('IntegrationCard', IntegrationCard);
|
|
104
|
+
defineMessages('LoginForm', LoginForm);
|
|
105
|
+
defineMessages('Map', Map);
|
|
106
|
+
defineMessages('Modal', Modal);
|
|
107
|
+
defineMessages('MultiSelect', MultiSelect);
|
|
108
|
+
defineMessages('NotificationBell', NotificationBell);
|
|
109
|
+
defineMessages('NumberInput', NumberInput);
|
|
110
|
+
defineMessages('Pagination', Pagination);
|
|
111
|
+
defineMessages('PasswordInput', PasswordInput);
|
|
112
|
+
defineMessages('Popconfirm', Popconfirm);
|
|
113
|
+
defineMessages('PricingCard', PricingCard);
|
|
114
|
+
defineMessages('RamadanTracker', RamadanTracker);
|
|
115
|
+
defineMessages('RangeCalendar', RangeCalendar);
|
|
116
|
+
defineMessages('RangeSlider', RangeSlider);
|
|
117
|
+
defineMessages('Rating', Rating);
|
|
118
|
+
defineMessages('RichEditor', RichEditor);
|
|
119
|
+
defineMessages('Screensaver', Screensaver);
|
|
120
|
+
defineMessages('SearchInput', SearchInput);
|
|
121
|
+
defineMessages('SideNav', SideNav);
|
|
122
|
+
defineMessages('Snackbar', Snackbar);
|
|
123
|
+
defineMessages('Sortable', Sortable);
|
|
124
|
+
defineMessages('Spinner', Spinner);
|
|
125
|
+
defineMessages('StatusPage', StatusPage);
|
|
126
|
+
defineMessages('StepDialog', StepDialog);
|
|
127
|
+
defineMessages('StepForm', StepForm);
|
|
128
|
+
defineMessages('TabTiles', TabTiles);
|
|
129
|
+
defineMessages('Tag', Tag);
|
|
130
|
+
defineMessages('TopNav', TopNav);
|
|
131
|
+
defineMessages('Tour', Tour);
|
|
132
|
+
defineMessages('TourCard', TourCard);
|
|
133
|
+
defineMessages('TourPopover', TourPopover);
|
|
134
|
+
defineMessages('TreeSelect', TreeSelect);
|
|
135
|
+
defineMessages('Validation', Validation);
|
package/src/i18n/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// Built-in component strings. One file per component in ./components/<Name>.js with all locales:
|
|
2
|
-
// export default { en: { copy: 'Copy' } } (the open source package ships
|
|
3
|
-
// that calls defineMessages(component, {
|
|
2
|
+
// export default { en: { copy: 'Copy' } } (the open source package ships en, ar, ru; the other 13 languages come from the Pro language pack
|
|
3
|
+
// that calls defineMessages(component, { uz: {...} }) or from the app via setUiMessages). A locale without strings falls back to English.
|
|
4
4
|
// The kit has its own translator: it never depends on the host app's i18n library. Sync it with yours:
|
|
5
5
|
// watch(() => i18n.locale.value, l => setUiLocale(l)) // vue-i18n
|
|
6
6
|
// setUiMessages('ru', { CopyButton: { copy: 'Скопировать' } }) // override single strings from the app
|
|
7
|
-
export const LOCALES = ['en', '
|
|
8
|
-
|
|
7
|
+
export const LOCALES = ['en', 'ar', 'ru', 'uz', 'tg', 'tr', 'fr', 'fa', 'hi', 'ur', 'bn', 'id', 'kk', 'ky', 'ms', 'ha'];
|
|
8
|
+
/** Languages whose strings ship in the free package. The rest come from the Pro language pack. */
|
|
9
|
+
export const FREE_LOCALES = ['en', 'ar', 'ru'];
|
|
10
|
+
export const RTL_LOCALES = ['ar', 'fa', 'ur'];
|
|
9
11
|
|
|
10
12
|
const registry = {};
|
|
11
13
|
const overrides = {};
|
|
@@ -16,7 +18,7 @@ let version = 0;
|
|
|
16
18
|
const norm = l => { const k = String(l || 'en').toLowerCase().split(/[-_]/)[0]; return LOCALES.includes(k) ? k : 'en'; };
|
|
17
19
|
const bump = () => { version++; subs.forEach(f => f(locale)); };
|
|
18
20
|
|
|
19
|
-
/** Register strings of a component. Calling it again for the same component MERGES locales:
|
|
21
|
+
/** Register strings of a component. Calling it again for the same component MERGES locales: a language pack can add locales on top of the built-in ones. */
|
|
20
22
|
export function defineMessages(component, messages) {
|
|
21
23
|
const cur = registry[component] || (registry[component] = {});
|
|
22
24
|
for (const [l, msgs] of Object.entries(messages)) cur[l] = { ...(cur[l] || {}), ...msgs };
|
|
@@ -45,4 +47,4 @@ export function t(component, key, params) {
|
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
/** Locale-aware helper for numbers and dates in components (uses the browser/Node Intl). */
|
|
48
|
-
export const intlLocale = () => ({ en: 'en-US', uz: 'uz-UZ',
|
|
50
|
+
export const intlLocale = () => ({ en: 'en-US', ar: 'ar', ru: 'ru-RU', uz: 'uz-UZ', tg: 'tg-TJ', tr: 'tr-TR', fr: 'fr-FR', fa: 'fa-IR', hi: 'hi-IN', ur: 'ur-PK', bn: 'bn-BD', id: 'id-ID', kk: 'kk-KZ', ky: 'ky-KG', ms: 'ms-MY', ha: 'ha-NG' })[locale];
|
package/src/meta/domain.js
CHANGED
|
@@ -198,6 +198,26 @@ export default {
|
|
|
198
198
|
},
|
|
199
199
|
events: { decline: 'Decline button clicked.', answer: 'Answer button clicked.' },
|
|
200
200
|
},
|
|
201
|
+
AuthShowcase: {
|
|
202
|
+
description: 'Sign-in layout with a media panel: dark photo card with floating avatars, light gradient card with a social-proof pill, or a tinted panel with a glass caption. The default slot is the form.',
|
|
203
|
+
props: {
|
|
204
|
+
variant: { type: "'photo' | 'light' | 'tint'", values: ['photo', 'light', 'tint'], default: 'photo', description: "'photo': one framed card, media on the left. 'light': gradient form card, proof pill below, glass caption on the media. 'tint': like light, with a coloured panel, a heading on the media and cyan accent." },
|
|
205
|
+
title: { type: 'string', required: true, description: 'Form heading.' },
|
|
206
|
+
subtitle: { type: 'string', description: 'Text under the heading.' },
|
|
207
|
+
logo: { type: 'VNode', description: 'Logo node above the heading.' },
|
|
208
|
+
footer: { type: 'VNode', description: 'Content under the fields, for example "No account? Sign up".' },
|
|
209
|
+
image: { type: 'string', description: 'URL of the media image. Without it the panel shows an accent gradient.' },
|
|
210
|
+
headline: { type: 'string', description: 'Large text on the media panel (photo and tint).' },
|
|
211
|
+
caption: { type: 'string', description: 'Small text on the media panel (photo) or inside the glass bar (light, tint).' },
|
|
212
|
+
quote: { type: 'string', description: 'Line at the bottom of the media panel; photo only.' },
|
|
213
|
+
chips: { type: 'string[]', description: 'Pill labels inside the glass bar; light and tint.' },
|
|
214
|
+
people: { type: '{ name: string; src?: string }[]', description: 'Avatars: floating on the photo, stacked in the proof pill.' },
|
|
215
|
+
proof: { type: 'string', description: 'Social-proof title, e.g. "Join 20k+ users"; light and tint. Shows the pill under the form.' },
|
|
216
|
+
proofHint: { type: 'string', description: 'Second line of the proof pill.' },
|
|
217
|
+
},
|
|
218
|
+
slots: { default: 'Form fields and buttons. React passes them as children.' },
|
|
219
|
+
notes: ['logo, footer, image, people are props in both Vue and React. The media panel is hidden below the form on narrow screens (stacks under it).'],
|
|
220
|
+
},
|
|
201
221
|
AuthSplit: {
|
|
202
222
|
description: 'Two-column sign-in layout with a brand panel on the left and the form on the right.',
|
|
203
223
|
props: {
|
package/src/meta/groups.js
CHANGED
|
@@ -9,7 +9,7 @@ export const GROUPS = [
|
|
|
9
9
|
{ id: 'overlay', title: 'Overlay', blurb: 'Dialogs, sheets and popovers.', names: ['Modal', 'Drawer', 'ConfirmDialog', 'Popconfirm', 'StepDialog', 'FullscreenDialog', 'BottomSheet', 'Actionsheet', 'Popover', 'HoverCard', 'Tooltip', 'Dropdown', 'Menu', 'ContextMenu', 'CommandBar', 'CommandPalette', 'ImageViewer', 'Tour', 'TourPopover', 'Screensaver'] },
|
|
10
10
|
{ id: 'navigation', title: 'Navigation', blurb: 'Menus, tabs and paging.', names: ['TopNav', 'SideNav', 'SubNav', 'Tabs', 'PillTabs', 'Breadcrumbs', 'Pagination', 'Accordion'] },
|
|
11
11
|
{ id: 'media', title: 'Media and icons', blurb: 'Avatars, images, maps and icons.', names: ['Avatar', 'Icon', 'LazyImage', 'Gallery', 'Carousel', 'Map', 'ProfileHeader', 'ChatAi'] },
|
|
12
|
-
{ id: 'domain', title: 'Domain', blurb: 'Umrah, Hajj, hotel and CRM blocks.', names: ['HotelCard', 'TourCard', 'PrayerTimes', 'RamadanTracker', 'BookingCard', 'GuestCard', 'RoomGrid', 'RoomCalendar', 'LeadCard', 'DealCard', 'PipelineBoard', 'ContactPanel', 'KanbanColumn', 'KanbanCard', 'CallRow', 'CallCard', 'IncomingCall', 'AuthSplit'] },
|
|
12
|
+
{ id: 'domain', title: 'Domain', blurb: 'Umrah, Hajj, hotel and CRM blocks.', names: ['HotelCard', 'TourCard', 'PrayerTimes', 'RamadanTracker', 'BookingCard', 'GuestCard', 'RoomGrid', 'RoomCalendar', 'LeadCard', 'DealCard', 'PipelineBoard', 'ContactPanel', 'KanbanColumn', 'KanbanCard', 'CallRow', 'CallCard', 'IncomingCall', 'AuthSplit', 'AuthShowcase'] },
|
|
13
13
|
{ id: 'pages', title: 'Page templates', blurb: 'Ready layouts with named slots.', names: ['PageDashboard', 'PagePatterns', 'PageCrm', 'PageBookings', 'PageCatalog', 'PageDetail', 'PageSettings', 'PageUserList', 'PageProfile', 'PageForm', 'PageOrder', 'PageAccount', 'PagePricing', 'PageFaq', 'PageAuth', 'PageStatus'] },
|
|
14
14
|
];
|
|
15
15
|
|
package/src/meta/pages.js
CHANGED
|
@@ -194,7 +194,15 @@ export default {
|
|
|
194
194
|
PageAuth: {
|
|
195
195
|
description: 'Sign-in page template without the app shell, as a centered card or a split layout.',
|
|
196
196
|
props: {
|
|
197
|
-
layout: { forwarded: true, type: "'card' | 'split'", values: ['card', 'split'], default: 'card', description: "'split' uses AuthSplit with a side panel
|
|
197
|
+
layout: { forwarded: true, type: "'card' | 'split' | 'photo' | 'light' | 'tint'", values: ['card', 'split', 'photo', 'light', 'tint'], default: 'card', description: "'split' uses AuthSplit with a side panel. 'photo', 'light' and 'tint' use AuthShowcase with a media panel. Anything else renders a centered AuthLayout card over the background." },
|
|
198
|
+
image: { forwarded: true, type: 'string', description: 'Media image URL; photo, light and tint layouts.' },
|
|
199
|
+
headline: { forwarded: true, type: 'string', description: 'Large text on the media panel; photo and tint.' },
|
|
200
|
+
caption: { forwarded: true, type: 'string', description: 'Small text on the media panel or glass bar.' },
|
|
201
|
+
quote: { forwarded: true, type: 'string', description: 'Bottom line of the media panel; photo only.' },
|
|
202
|
+
chips: { forwarded: true, type: 'string[]', description: 'Pill labels in the glass bar; light and tint.' },
|
|
203
|
+
people: { forwarded: true, type: '{ name: string; src?: string }[]', description: 'Avatars on the media panel or in the proof pill.' },
|
|
204
|
+
proof: { forwarded: true, type: 'string', description: 'Social-proof title under the form; light and tint.' },
|
|
205
|
+
proofHint: { forwarded: true, type: 'string', description: 'Second line of the proof pill.' },
|
|
198
206
|
title: { forwarded: true, type: 'string', description: 'Form heading.' },
|
|
199
207
|
subtitle: { forwarded: true, type: 'string', description: 'Text under the heading.' },
|
|
200
208
|
},
|
package/src/meta/templates.json
CHANGED
|
@@ -2030,7 +2030,7 @@
|
|
|
2030
2030
|
"route": "auth",
|
|
2031
2031
|
"label": "Authentication (6)",
|
|
2032
2032
|
"icon": "lock-keyhole",
|
|
2033
|
-
"desc": "
|
|
2033
|
+
"desc": "Seven sign-in screens in five layouts: centered card, split with a side panel, and three with a media panel (photo, light, tint).",
|
|
2034
2034
|
"component": "PageAuth",
|
|
2035
2035
|
"tpl": "TplAuth",
|
|
2036
2036
|
"shell": false,
|
package/src/react/index.js
CHANGED
|
@@ -171,6 +171,7 @@ export const UiSnackbar = C.Snackbar;
|
|
|
171
171
|
export const UiTourPopover = C.TourPopover;
|
|
172
172
|
export const UiProfileHeader = C.ProfileHeader;
|
|
173
173
|
export const UiAuthSplit = C.AuthSplit;
|
|
174
|
+
export const UiAuthShowcase = C.AuthShowcase;
|
|
174
175
|
export const UiStatusPage = C.StatusPage;
|
|
175
176
|
export const UiValidatedField = C.ValidatedField;
|
|
176
177
|
export const UiFooter = C.Footer;
|
|
@@ -45,3 +45,44 @@
|
|
|
45
45
|
/* CommandPalette active row, dialog focus */
|
|
46
46
|
.zg-menu__i.is-active,.zg-menu__i[aria-selected="true"]{background:var(--zg-s2)}
|
|
47
47
|
.zg-modal:focus,.zg-sheet:focus,.zg-fsd:focus,.zg-saver:focus{outline:0}
|
|
48
|
+
/* AuthShowcase: photo (dark framed card), light (gradient card + proof pill + glass caption), tint (coloured panel, pill fields) */
|
|
49
|
+
.zg-ash{min-height:100%;padding:clamp(12px,3vw,40px);display:grid;place-items:center;--ash-r:28px;--ash-acc:var(--zg-brand)}
|
|
50
|
+
.zg-ash--tint{--ash-acc:oklch(.7 .13 215)}
|
|
51
|
+
.zg-ash__title{margin:0;font:300 clamp(28px,3.4vw,40px)/1.1 var(--zg-font);letter-spacing:-.03em}
|
|
52
|
+
.zg-ash__sub{margin:10px 0 0;color:var(--zg-text-2);line-height:1.55}
|
|
53
|
+
.zg-ash__head{display:flex;flex-direction:column;gap:6px}
|
|
54
|
+
.zg-ash__fields{display:flex;flex-direction:column;gap:14px;margin-top:22px}
|
|
55
|
+
.zg-ash__foot{margin-top:18px;color:var(--zg-text-2);font-size:14px;text-align:center}
|
|
56
|
+
.zg-ash__form{width:100%;max-width:400px;margin-inline:auto}
|
|
57
|
+
.zg-ash__media{position:relative;overflow:hidden;background:linear-gradient(150deg,color-mix(in oklch,var(--ash-acc) 55%,var(--zg-s2)),color-mix(in oklch,var(--ash-acc) 15%,var(--zg-s1)));background-size:cover;background-position:center}
|
|
58
|
+
.zg-ash--photo .zg-ash__frame{width:100%;max-width:1160px;display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);border-radius:var(--ash-r);overflow:hidden;background:var(--zg-s1);box-shadow:var(--zg-rim),var(--zg-shadow-1);min-height:560px}
|
|
59
|
+
.zg-ash--photo .zg-ash__media::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,color-mix(in oklch,var(--zg-bg) 15%,transparent),var(--zg-s1) 100%),linear-gradient(0deg,color-mix(in oklch,var(--zg-bg) 70%,transparent),transparent 55%)}
|
|
60
|
+
.zg-ash__copy{position:relative;z-index:1;padding:clamp(24px,5vw,64px);padding-top:clamp(60px,12vw,150px);max-width:480px}
|
|
61
|
+
.zg-ash__copy h2{margin:0 0 14px;font:500 clamp(30px,4vw,46px)/1.08 var(--zg-font);letter-spacing:-.03em}
|
|
62
|
+
.zg-ash__copy p{margin:0;color:var(--zg-text-2);font-size:18px;line-height:1.5}
|
|
63
|
+
.zg-ash__float{position:absolute;z-index:1;border-radius:50%;box-shadow:0 0 28px color-mix(in oklch,var(--zg-brand) 55%,transparent)}
|
|
64
|
+
.zg-ash__float--a{inset-inline-start:7%;top:60%}.zg-ash__float--b{inset-inline-start:52%;top:50%}.zg-ash__float--c{inset-inline-start:36%;top:76%}
|
|
65
|
+
@media(prefers-reduced-motion:no-preference){.zg-ash__float{animation:zg-ash-bob 6s ease-in-out infinite alternate}.zg-ash__float--b{animation-delay:-2s}.zg-ash__float--c{animation-delay:-4s}}
|
|
66
|
+
@keyframes zg-ash-bob{to{transform:translateY(-10px)}}
|
|
67
|
+
.zg-ash__quote{position:absolute;z-index:1;inset-inline-start:clamp(24px,5vw,64px);bottom:28px;color:var(--zg-text-1)}
|
|
68
|
+
.zg-ash--photo .zg-ash__side{display:grid;place-items:center;padding:clamp(24px,5vw,56px)}
|
|
69
|
+
.zg-ash__grid{width:100%;max-width:1180px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px}
|
|
70
|
+
.zg-ash__col{display:flex;flex-direction:column;gap:16px;min-width:0}
|
|
71
|
+
.zg-ash__card{flex:1;display:grid;align-content:center;padding:clamp(24px,4vw,48px);border-radius:var(--ash-r);background:linear-gradient(165deg,var(--zg-s1) 40%,color-mix(in oklch,var(--ash-acc) 26%,var(--zg-s1)));box-shadow:var(--zg-rim)}
|
|
72
|
+
.zg-ash--light .zg-ash__head,.zg-ash--tint .zg-ash__head{align-items:center;text-align:center}
|
|
73
|
+
.zg-ash--tint .zg-ash__card{background:var(--zg-s1)}
|
|
74
|
+
.zg-ash--tint .zg-ash__title{font-weight:400}
|
|
75
|
+
.zg-ash__proof{display:flex;align-items:center;gap:14px;padding:14px 18px;border-radius:var(--ash-r);background:var(--zg-s1);box-shadow:var(--zg-rim)}
|
|
76
|
+
.zg-ash__stack{display:inline-flex}.zg-ash__stack .zg-avatar{margin-inline-end:-10px;box-shadow:0 0 0 2px var(--zg-s1)}
|
|
77
|
+
.zg-ash__proofT{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;margin-inline-start:10px}.zg-ash__proofT span{color:var(--zg-text-3);font-size:13px}
|
|
78
|
+
.zg-ash--light .zg-ash__grid>.zg-ash__media,.zg-ash--tint .zg-ash__grid>.zg-ash__media{border-radius:var(--ash-r);min-height:520px;display:flex;flex-direction:column;justify-content:flex-end;box-shadow:var(--zg-rim)}
|
|
79
|
+
.zg-ash__mh{position:absolute;inset-inline:0;top:0;margin:0;padding:clamp(20px,3vw,36px);font:400 clamp(24px,2.8vw,34px)/1.2 var(--zg-font);color:#fff;text-shadow:0 1px 16px rgb(0 0 0/.25)}
|
|
80
|
+
.zg-ash__glass{position:relative;margin:12px;padding:18px;border-radius:calc(var(--ash-r) - 8px);display:flex;flex-direction:column;gap:12px;background:color-mix(in oklch,var(--zg-bg) 38%,transparent);backdrop-filter:blur(22px) saturate(1.4);-webkit-backdrop-filter:blur(22px) saturate(1.4);box-shadow:var(--zg-rim);color:var(--zg-text-1)}
|
|
81
|
+
.zg-ash__glass p{margin:0;color:var(--zg-text-2)}
|
|
82
|
+
.zg-ash__chips{display:flex;gap:10px;flex-wrap:wrap}
|
|
83
|
+
.zg-ash__chip{flex:1;text-align:center;padding:14px 18px;border-radius:999px;box-shadow:inset 0 0 0 1px color-mix(in oklch,var(--zg-text-1) 40%,transparent)}
|
|
84
|
+
@media(max-width:860px){.zg-ash--photo .zg-ash__frame,.zg-ash__grid{grid-template-columns:1fr}.zg-ash--photo .zg-ash__media{min-height:300px}.zg-ash__grid>.zg-ash__media{min-height:320px!important;order:2}}
|
|
85
|
+
/* default media art when no image is given */
|
|
86
|
+
.zg-ash__media::after{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(circle at 78% 24%,color-mix(in oklch,#fff 55%,transparent) 0,transparent 30%),radial-gradient(circle at 18% 78%,color-mix(in oklch,var(--ash-acc) 70%,transparent) 0,transparent 38%),conic-gradient(from 210deg at 62% 48%,transparent 0 .08turn,color-mix(in oklch,#fff 22%,transparent) .1turn .18turn,transparent .2turn 1turn)}
|
|
87
|
+
.zg-ash__media[style*="url("]::after{display:none}
|
|
88
|
+
.zg-ash--light .zg-ash__media{--ash-acc:oklch(.72 .08 80)}
|
package/src/vue/index.js
CHANGED
|
@@ -29,7 +29,7 @@ const wrap = (name, def) => defineComponent({
|
|
|
29
29
|
});
|
|
30
30
|
for (const [name, def] of Object.entries(components)) C[name] = wrap(name, def);
|
|
31
31
|
|
|
32
|
-
export const { Button: UiButton, IconButton: UiIconButton, Badge: UiBadge, Avatar: UiAvatar, Switch: UiSwitch, Checkbox: UiCheckbox, SegmentedControl: UiSegmentedControl, Tabs: UiTabs, FilterChips: UiFilterChips, TextField: UiTextField, Select: UiSelect, CodeInput: UiCodeInput, Stepper: UiStepper, Card: UiCard, Modal: UiModal, Drawer: UiDrawer, Toast: UiToast, Breadcrumbs: UiBreadcrumbs, Pagination: UiPagination, Progress: UiProgress, Ring: UiRing, KpiTile: UiKpiTile, DataTable: UiDataTable, KanbanColumn: UiKanbanColumn, KanbanCard: UiKanbanCard, Timeline: UiTimeline, TopNav: UiTopNav, SideNav: UiSideNav, AppShell: UiAppShell, PageHeader: UiPageHeader, AuthLayout: UiAuthLayout, LeadCard: UiLeadCard, HotelCard: UiHotelCard, TourCard: UiTourCard, PrayerTimes: UiPrayerTimes, RamadanTracker: UiRamadanTracker, CallRow: UiCallRow, Alert: UiAlert, Banner: UiBanner, Accordion: UiAccordion, Skeleton: UiSkeleton, Spinner: UiSpinner, Divider: UiDivider, EmptyState: UiEmptyState, ErrorPage: UiErrorPage, DataState: UiDataState, LoadingOverlay: UiLoadingOverlay, ConfirmDialog: UiConfirmDialog, Popconfirm: UiPopconfirm, Carousel: UiCarousel, Gallery: UiGallery, Code: UiCode, PricingCard: UiPricingCard, IntegrationCard: UiIntegrationCard, IncomingCall: UiIncomingCall, CallCard: UiCallCard, Dropdown: UiDropdown, Menu: UiMenu, Tooltip: UiTooltip, HoverCard: UiHoverCard, Popover: UiPopover, CopyButton: UiCopyButton, CommandBar: UiCommandBar, CommandPalette: UiCommandPalette, NotificationBell: UiNotificationBell, ToggleGroup: UiToggleGroup, Fab: UiFab, Textarea: UiTextarea, NumberInput: UiNumberInput, PasswordInput: UiPasswordInput, SearchInput: UiSearchInput, RadioGroup: UiRadioGroup, Slider: UiSlider, Rating: UiRating, ChipInput: UiChipInput, InlineEdit: UiInlineEdit, ColorPicker: UiColorPicker, FileUpload: UiFileUpload, Combobox: UiCombobox, MultiSelect: UiMultiSelect, GroupedSelect: UiGroupedSelect, PhoneInput: UiPhoneInput, Calendar: UiCalendar, DatePicker: UiDatePicker, TimePicker: UiTimePicker, FormField: UiFormField, LoginForm: UiLoginForm, StepForm: UiStepForm, Tag: UiTag, Kbd: UiKbd, StatsCard: UiStatsCard, KpiInline: UiKpiInline, MiniChart: UiMiniChart, Descriptions: UiDescriptions, LazyImage: UiLazyImage, SystemStatus: UiSystemStatus, TreeView: UiTreeView, CalendarView: UiCalendarView, SubNav: UiSubNav, ActionRail: UiActionRail, SplitLayout: UiSplitLayout, SettingsSection: UiSettingsSection, ScrollArea: UiScrollArea, DealCard: UiDealCard, PipelineBoard: UiPipelineBoard, ContactPanel: UiContactPanel, SalesFunnel: UiSalesFunnel, BookingCard: UiBookingCard, GuestCard: UiGuestCard, RoomGrid: UiRoomGrid, RoomCalendar: UiRoomCalendar, OccupancyChart: UiOccupancyChart, Chip: UiChip, IconTile: UiIconTile, StatusIcon: UiStatusIcon, UserCell: UiUserCell, StatRow: UiStatRow, CountryRow: UiCountryRow, StatLine: UiStatLine, StatStrip: UiStatStrip, VersusBar: UiVersusBar, SegBar: UiSegBar, HeroBanner: UiHeroBanner, TabTiles: UiTabTiles, PillTabs: UiPillTabs, PillSelect: UiPillSelect, ChartCard: UiChartCard, ActionCard: UiActionCard, Snackbar: UiSnackbar, TourPopover: UiTourPopover, ProfileHeader: UiProfileHeader, AuthSplit: UiAuthSplit, StatusPage: UiStatusPage, ValidatedField: UiValidatedField, Footer: UiFooter, DataGroup: UiDataGroup, OptionCard: UiOptionCard, OptionCards: UiOptionCards, RichEditor: UiRichEditor, RangeSlider: UiRangeSlider, RangeCalendar: UiRangeCalendar, StepDialog: UiStepDialog, FullscreenDialog: UiFullscreenDialog, PageDashboard: UiPageDashboard, PagePatterns: UiPagePatterns, PageCrm: UiPageCrm, PageBookings: UiPageBookings, PageCatalog: UiPageCatalog, PageDetail: UiPageDetail, PageSettings: UiPageSettings, PageUserList: UiPageUserList, PageProfile: UiPageProfile, PageForm: UiPageForm, PageOrder: UiPageOrder, PageAccount: UiPageAccount, PagePricing: UiPagePricing, PageFaq: UiPageFaq, PageAuth: UiPageAuth, PageStatus: UiPageStatus, TreeSelect: UiTreeSelect, ContextMenu: UiContextMenu, Sortable: UiSortable, Map: UiMap, ImageUpload: UiImageUpload, Screensaver: UiScreensaver, Tour: UiTour, Heading: UiHeading, Text: UiText, Box: UiBox, Center: UiCenter, HStack: UiHStack, VStack: UiVStack, Grid: UiGrid, Link: UiLink, Pressable: UiPressable, Icon: UiIcon, Portal: UiPortal, LiquidGlass: UiLiquidGlass, BottomSheet: UiBottomSheet, Actionsheet: UiActionsheet, ImageViewer: UiImageViewer, ChatAi: UiChatAi } = C;
|
|
32
|
+
export const { Button: UiButton, IconButton: UiIconButton, Badge: UiBadge, Avatar: UiAvatar, Switch: UiSwitch, Checkbox: UiCheckbox, SegmentedControl: UiSegmentedControl, Tabs: UiTabs, FilterChips: UiFilterChips, TextField: UiTextField, Select: UiSelect, CodeInput: UiCodeInput, Stepper: UiStepper, Card: UiCard, Modal: UiModal, Drawer: UiDrawer, Toast: UiToast, Breadcrumbs: UiBreadcrumbs, Pagination: UiPagination, Progress: UiProgress, Ring: UiRing, KpiTile: UiKpiTile, DataTable: UiDataTable, KanbanColumn: UiKanbanColumn, KanbanCard: UiKanbanCard, Timeline: UiTimeline, TopNav: UiTopNav, SideNav: UiSideNav, AppShell: UiAppShell, PageHeader: UiPageHeader, AuthLayout: UiAuthLayout, LeadCard: UiLeadCard, HotelCard: UiHotelCard, TourCard: UiTourCard, PrayerTimes: UiPrayerTimes, RamadanTracker: UiRamadanTracker, CallRow: UiCallRow, Alert: UiAlert, Banner: UiBanner, Accordion: UiAccordion, Skeleton: UiSkeleton, Spinner: UiSpinner, Divider: UiDivider, EmptyState: UiEmptyState, ErrorPage: UiErrorPage, DataState: UiDataState, LoadingOverlay: UiLoadingOverlay, ConfirmDialog: UiConfirmDialog, Popconfirm: UiPopconfirm, Carousel: UiCarousel, Gallery: UiGallery, Code: UiCode, PricingCard: UiPricingCard, IntegrationCard: UiIntegrationCard, IncomingCall: UiIncomingCall, CallCard: UiCallCard, Dropdown: UiDropdown, Menu: UiMenu, Tooltip: UiTooltip, HoverCard: UiHoverCard, Popover: UiPopover, CopyButton: UiCopyButton, CommandBar: UiCommandBar, CommandPalette: UiCommandPalette, NotificationBell: UiNotificationBell, ToggleGroup: UiToggleGroup, Fab: UiFab, Textarea: UiTextarea, NumberInput: UiNumberInput, PasswordInput: UiPasswordInput, SearchInput: UiSearchInput, RadioGroup: UiRadioGroup, Slider: UiSlider, Rating: UiRating, ChipInput: UiChipInput, InlineEdit: UiInlineEdit, ColorPicker: UiColorPicker, FileUpload: UiFileUpload, Combobox: UiCombobox, MultiSelect: UiMultiSelect, GroupedSelect: UiGroupedSelect, PhoneInput: UiPhoneInput, Calendar: UiCalendar, DatePicker: UiDatePicker, TimePicker: UiTimePicker, FormField: UiFormField, LoginForm: UiLoginForm, StepForm: UiStepForm, Tag: UiTag, Kbd: UiKbd, StatsCard: UiStatsCard, KpiInline: UiKpiInline, MiniChart: UiMiniChart, Descriptions: UiDescriptions, LazyImage: UiLazyImage, SystemStatus: UiSystemStatus, TreeView: UiTreeView, CalendarView: UiCalendarView, SubNav: UiSubNav, ActionRail: UiActionRail, SplitLayout: UiSplitLayout, SettingsSection: UiSettingsSection, ScrollArea: UiScrollArea, DealCard: UiDealCard, PipelineBoard: UiPipelineBoard, ContactPanel: UiContactPanel, SalesFunnel: UiSalesFunnel, BookingCard: UiBookingCard, GuestCard: UiGuestCard, RoomGrid: UiRoomGrid, RoomCalendar: UiRoomCalendar, OccupancyChart: UiOccupancyChart, Chip: UiChip, IconTile: UiIconTile, StatusIcon: UiStatusIcon, UserCell: UiUserCell, StatRow: UiStatRow, CountryRow: UiCountryRow, StatLine: UiStatLine, StatStrip: UiStatStrip, VersusBar: UiVersusBar, SegBar: UiSegBar, HeroBanner: UiHeroBanner, TabTiles: UiTabTiles, PillTabs: UiPillTabs, PillSelect: UiPillSelect, ChartCard: UiChartCard, ActionCard: UiActionCard, Snackbar: UiSnackbar, TourPopover: UiTourPopover, ProfileHeader: UiProfileHeader, AuthSplit: UiAuthSplit, AuthShowcase: UiAuthShowcase, StatusPage: UiStatusPage, ValidatedField: UiValidatedField, Footer: UiFooter, DataGroup: UiDataGroup, OptionCard: UiOptionCard, OptionCards: UiOptionCards, RichEditor: UiRichEditor, RangeSlider: UiRangeSlider, RangeCalendar: UiRangeCalendar, StepDialog: UiStepDialog, FullscreenDialog: UiFullscreenDialog, PageDashboard: UiPageDashboard, PagePatterns: UiPagePatterns, PageCrm: UiPageCrm, PageBookings: UiPageBookings, PageCatalog: UiPageCatalog, PageDetail: UiPageDetail, PageSettings: UiPageSettings, PageUserList: UiPageUserList, PageProfile: UiPageProfile, PageForm: UiPageForm, PageOrder: UiPageOrder, PageAccount: UiPageAccount, PagePricing: UiPagePricing, PageFaq: UiPageFaq, PageAuth: UiPageAuth, PageStatus: UiPageStatus, TreeSelect: UiTreeSelect, ContextMenu: UiContextMenu, Sortable: UiSortable, Map: UiMap, ImageUpload: UiImageUpload, Screensaver: UiScreensaver, Tour: UiTour, Heading: UiHeading, Text: UiText, Box: UiBox, Center: UiCenter, HStack: UiHStack, VStack: UiVStack, Grid: UiGrid, Link: UiLink, Pressable: UiPressable, Icon: UiIcon, Portal: UiPortal, LiquidGlass: UiLiquidGlass, BottomSheet: UiBottomSheet, Actionsheet: UiActionsheet, ImageViewer: UiImageViewer, ChatAi: UiChatAi } = C;
|
|
33
33
|
export const install = app => { for (const [n, c] of Object.entries(C)) app.component('Ui' + n, c); };
|
|
34
34
|
export { fmt, setIconBase, rules } from '../core/index.js';
|
|
35
35
|
export { useUiTheme } from '../theme.js';
|
package/types/i18n.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export type UiLocale = 'en' | '
|
|
1
|
+
export type UiLocale = 'en' | 'ar' | 'ru' | 'uz' | 'tg' | 'tr' | 'fr' | 'fa' | 'hi' | 'ur' | 'bn' | 'id' | 'kk' | 'ky' | 'ms' | 'ha';
|
|
2
2
|
export const LOCALES: readonly UiLocale[];
|
|
3
|
+
/** en, ar, ru: included in the free package. */
|
|
4
|
+
export const FREE_LOCALES: readonly UiLocale[];
|
|
3
5
|
export const RTL_LOCALES: readonly UiLocale[];
|
|
4
6
|
/** Switch the language of the built-in component strings. Components re-render by themselves. */
|
|
5
7
|
export function setUiLocale(locale: UiLocale | string): void;
|
|
@@ -8,5 +10,5 @@ export function isRtlLocale(locale?: string): boolean;
|
|
|
8
10
|
/** Override single strings from the app: setUiMessages('ru', { Pagination: { prev: 'Назад' } }). Pass null to clear a locale. */
|
|
9
11
|
export function setUiMessages(locale: UiLocale | string, messages: Record<string, Record<string, string>> | null): void;
|
|
10
12
|
export function t(component: string, key: string, params?: Record<string, string | number>): string;
|
|
11
|
-
export function defineMessages(component: string, messages: Record<UiLocale, Record<string, string
|
|
13
|
+
export function defineMessages(component: string, messages: Partial<Record<UiLocale, Record<string, string>>>): void;
|
|
12
14
|
export function subscribeUiLocale(fn: (locale: UiLocale) => void): () => void;
|
package/types/react.d.ts
CHANGED
|
@@ -236,6 +236,44 @@ export interface UiAuthLayoutProps {
|
|
|
236
236
|
}
|
|
237
237
|
export const UiAuthLayout: ComponentType<UiAuthLayoutProps>;
|
|
238
238
|
|
|
239
|
+
/**
|
|
240
|
+
* Sign-in layout with a media panel: dark photo card with floating avatars, light gradient card with a social-proof pill, or a tinted panel with a glass caption. The default slot is the form.
|
|
241
|
+
* Note: logo, footer, image, people are props in both Vue and React. The media panel is hidden below the form on narrow screens (stacks under it).
|
|
242
|
+
*/
|
|
243
|
+
export interface UiAuthShowcaseProps {
|
|
244
|
+
/**
|
|
245
|
+
* 'photo': one framed card, media on the left. 'light': gradient form card, proof pill below, glass caption on the media. 'tint': like light, with a coloured panel, a heading on the media and cyan accent.
|
|
246
|
+
* @default 'photo'
|
|
247
|
+
*/
|
|
248
|
+
variant?: 'photo' | 'light' | 'tint';
|
|
249
|
+
/** Form heading. */
|
|
250
|
+
title: string;
|
|
251
|
+
/** Text under the heading. */
|
|
252
|
+
subtitle?: string;
|
|
253
|
+
/** Logo node above the heading. */
|
|
254
|
+
logo?: ReactNode;
|
|
255
|
+
/** Content under the fields, for example "No account? Sign up". */
|
|
256
|
+
footer?: ReactNode;
|
|
257
|
+
/** URL of the media image. Without it the panel shows an accent gradient. */
|
|
258
|
+
image?: string;
|
|
259
|
+
/** Large text on the media panel (photo and tint). */
|
|
260
|
+
headline?: string;
|
|
261
|
+
/** Small text on the media panel (photo) or inside the glass bar (light, tint). */
|
|
262
|
+
caption?: string;
|
|
263
|
+
/** Line at the bottom of the media panel; photo only. */
|
|
264
|
+
quote?: string;
|
|
265
|
+
/** Pill labels inside the glass bar; light and tint. */
|
|
266
|
+
chips?: string[];
|
|
267
|
+
/** Avatars: floating on the photo, stacked in the proof pill. */
|
|
268
|
+
people?: { name: string; src?: string }[];
|
|
269
|
+
/** Social-proof title, e.g. "Join 20k+ users"; light and tint. Shows the pill under the form. */
|
|
270
|
+
proof?: string;
|
|
271
|
+
/** Second line of the proof pill. */
|
|
272
|
+
proofHint?: string;
|
|
273
|
+
children?: ReactNode;
|
|
274
|
+
}
|
|
275
|
+
export const UiAuthShowcase: ComponentType<UiAuthShowcaseProps>;
|
|
276
|
+
|
|
239
277
|
/**
|
|
240
278
|
* Two-column sign-in layout with a brand panel on the left and the form on the right.
|
|
241
279
|
* Note: logo and aside are props in both Vue and React (pass a VNode / element).
|
|
@@ -3058,11 +3096,51 @@ export const UiPageAccount: ComponentType<UiPageAccountProps>;
|
|
|
3058
3096
|
*/
|
|
3059
3097
|
export interface UiPageAuthProps {
|
|
3060
3098
|
/**
|
|
3061
|
-
* 'split' uses AuthSplit with a side panel
|
|
3099
|
+
* 'split' uses AuthSplit with a side panel. 'photo', 'light' and 'tint' use AuthShowcase with a media panel. Anything else renders a centered AuthLayout card over the background.
|
|
3062
3100
|
* @default 'card'
|
|
3063
3101
|
* @remarks Forwarded to the inner element.
|
|
3064
3102
|
*/
|
|
3065
|
-
layout?: 'card' | 'split';
|
|
3103
|
+
layout?: 'card' | 'split' | 'photo' | 'light' | 'tint';
|
|
3104
|
+
/**
|
|
3105
|
+
* Media image URL; photo, light and tint layouts.
|
|
3106
|
+
* @remarks Forwarded to the inner element.
|
|
3107
|
+
*/
|
|
3108
|
+
image?: string;
|
|
3109
|
+
/**
|
|
3110
|
+
* Large text on the media panel; photo and tint.
|
|
3111
|
+
* @remarks Forwarded to the inner element.
|
|
3112
|
+
*/
|
|
3113
|
+
headline?: string;
|
|
3114
|
+
/**
|
|
3115
|
+
* Small text on the media panel or glass bar.
|
|
3116
|
+
* @remarks Forwarded to the inner element.
|
|
3117
|
+
*/
|
|
3118
|
+
caption?: string;
|
|
3119
|
+
/**
|
|
3120
|
+
* Bottom line of the media panel; photo only.
|
|
3121
|
+
* @remarks Forwarded to the inner element.
|
|
3122
|
+
*/
|
|
3123
|
+
quote?: string;
|
|
3124
|
+
/**
|
|
3125
|
+
* Pill labels in the glass bar; light and tint.
|
|
3126
|
+
* @remarks Forwarded to the inner element.
|
|
3127
|
+
*/
|
|
3128
|
+
chips?: string[];
|
|
3129
|
+
/**
|
|
3130
|
+
* Avatars on the media panel or in the proof pill.
|
|
3131
|
+
* @remarks Forwarded to the inner element.
|
|
3132
|
+
*/
|
|
3133
|
+
people?: { name: string; src?: string }[];
|
|
3134
|
+
/**
|
|
3135
|
+
* Social-proof title under the form; light and tint.
|
|
3136
|
+
* @remarks Forwarded to the inner element.
|
|
3137
|
+
*/
|
|
3138
|
+
proof?: string;
|
|
3139
|
+
/**
|
|
3140
|
+
* Second line of the proof pill.
|
|
3141
|
+
* @remarks Forwarded to the inner element.
|
|
3142
|
+
*/
|
|
3143
|
+
proofHint?: string;
|
|
3066
3144
|
/**
|
|
3067
3145
|
* Form heading.
|
|
3068
3146
|
* @remarks Forwarded to the inner element.
|
package/types/vue-global.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ declare module 'vue' {
|
|
|
13
13
|
UiAlert: typeof Ui.UiAlert;
|
|
14
14
|
UiAppShell: typeof Ui.UiAppShell;
|
|
15
15
|
UiAuthLayout: typeof Ui.UiAuthLayout;
|
|
16
|
+
UiAuthShowcase: typeof Ui.UiAuthShowcase;
|
|
16
17
|
UiAuthSplit: typeof Ui.UiAuthSplit;
|
|
17
18
|
UiAvatar: typeof Ui.UiAvatar;
|
|
18
19
|
UiBadge: typeof Ui.UiBadge;
|
package/types/vue.d.ts
CHANGED
|
@@ -244,6 +244,47 @@ export interface UiAuthLayoutSlots {
|
|
|
244
244
|
}
|
|
245
245
|
export const UiAuthLayout: UiVueComponent<UiAuthLayoutProps, UiAuthLayoutSlots>;
|
|
246
246
|
|
|
247
|
+
/**
|
|
248
|
+
* Sign-in layout with a media panel: dark photo card with floating avatars, light gradient card with a social-proof pill, or a tinted panel with a glass caption. The default slot is the form.
|
|
249
|
+
* Note: logo, footer, image, people are props in both Vue and React. The media panel is hidden below the form on narrow screens (stacks under it).
|
|
250
|
+
*/
|
|
251
|
+
export interface UiAuthShowcaseProps {
|
|
252
|
+
/**
|
|
253
|
+
* 'photo': one framed card, media on the left. 'light': gradient form card, proof pill below, glass caption on the media. 'tint': like light, with a coloured panel, a heading on the media and cyan accent.
|
|
254
|
+
* @default 'photo'
|
|
255
|
+
*/
|
|
256
|
+
variant?: 'photo' | 'light' | 'tint';
|
|
257
|
+
/** Form heading. */
|
|
258
|
+
title: string;
|
|
259
|
+
/** Text under the heading. */
|
|
260
|
+
subtitle?: string;
|
|
261
|
+
/** Logo node above the heading. */
|
|
262
|
+
logo?: VNode;
|
|
263
|
+
/** Content under the fields, for example "No account? Sign up". */
|
|
264
|
+
footer?: VNode;
|
|
265
|
+
/** URL of the media image. Without it the panel shows an accent gradient. */
|
|
266
|
+
image?: string;
|
|
267
|
+
/** Large text on the media panel (photo and tint). */
|
|
268
|
+
headline?: string;
|
|
269
|
+
/** Small text on the media panel (photo) or inside the glass bar (light, tint). */
|
|
270
|
+
caption?: string;
|
|
271
|
+
/** Line at the bottom of the media panel; photo only. */
|
|
272
|
+
quote?: string;
|
|
273
|
+
/** Pill labels inside the glass bar; light and tint. */
|
|
274
|
+
chips?: string[];
|
|
275
|
+
/** Avatars: floating on the photo, stacked in the proof pill. */
|
|
276
|
+
people?: { name: string; src?: string }[];
|
|
277
|
+
/** Social-proof title, e.g. "Join 20k+ users"; light and tint. Shows the pill under the form. */
|
|
278
|
+
proof?: string;
|
|
279
|
+
/** Second line of the proof pill. */
|
|
280
|
+
proofHint?: string;
|
|
281
|
+
}
|
|
282
|
+
export interface UiAuthShowcaseSlots {
|
|
283
|
+
/** Form fields and buttons. React passes them as children. */
|
|
284
|
+
default?: () => any;
|
|
285
|
+
}
|
|
286
|
+
export const UiAuthShowcase: UiVueComponent<UiAuthShowcaseProps, UiAuthShowcaseSlots>;
|
|
287
|
+
|
|
247
288
|
/**
|
|
248
289
|
* Two-column sign-in layout with a brand panel on the left and the form on the right.
|
|
249
290
|
* Note: logo and aside are props in both Vue and React (pass a VNode / element).
|
|
@@ -3164,11 +3205,51 @@ export const UiPageAccount: UiVueComponent<UiPageAccountProps, UiPageAccountSlot
|
|
|
3164
3205
|
*/
|
|
3165
3206
|
export interface UiPageAuthProps {
|
|
3166
3207
|
/**
|
|
3167
|
-
* 'split' uses AuthSplit with a side panel
|
|
3208
|
+
* 'split' uses AuthSplit with a side panel. 'photo', 'light' and 'tint' use AuthShowcase with a media panel. Anything else renders a centered AuthLayout card over the background.
|
|
3168
3209
|
* @default 'card'
|
|
3169
3210
|
* @remarks Forwarded to the inner element.
|
|
3170
3211
|
*/
|
|
3171
|
-
layout?: 'card' | 'split';
|
|
3212
|
+
layout?: 'card' | 'split' | 'photo' | 'light' | 'tint';
|
|
3213
|
+
/**
|
|
3214
|
+
* Media image URL; photo, light and tint layouts.
|
|
3215
|
+
* @remarks Forwarded to the inner element.
|
|
3216
|
+
*/
|
|
3217
|
+
image?: string;
|
|
3218
|
+
/**
|
|
3219
|
+
* Large text on the media panel; photo and tint.
|
|
3220
|
+
* @remarks Forwarded to the inner element.
|
|
3221
|
+
*/
|
|
3222
|
+
headline?: string;
|
|
3223
|
+
/**
|
|
3224
|
+
* Small text on the media panel or glass bar.
|
|
3225
|
+
* @remarks Forwarded to the inner element.
|
|
3226
|
+
*/
|
|
3227
|
+
caption?: string;
|
|
3228
|
+
/**
|
|
3229
|
+
* Bottom line of the media panel; photo only.
|
|
3230
|
+
* @remarks Forwarded to the inner element.
|
|
3231
|
+
*/
|
|
3232
|
+
quote?: string;
|
|
3233
|
+
/**
|
|
3234
|
+
* Pill labels in the glass bar; light and tint.
|
|
3235
|
+
* @remarks Forwarded to the inner element.
|
|
3236
|
+
*/
|
|
3237
|
+
chips?: string[];
|
|
3238
|
+
/**
|
|
3239
|
+
* Avatars on the media panel or in the proof pill.
|
|
3240
|
+
* @remarks Forwarded to the inner element.
|
|
3241
|
+
*/
|
|
3242
|
+
people?: { name: string; src?: string }[];
|
|
3243
|
+
/**
|
|
3244
|
+
* Social-proof title under the form; light and tint.
|
|
3245
|
+
* @remarks Forwarded to the inner element.
|
|
3246
|
+
*/
|
|
3247
|
+
proof?: string;
|
|
3248
|
+
/**
|
|
3249
|
+
* Second line of the proof pill.
|
|
3250
|
+
* @remarks Forwarded to the inner element.
|
|
3251
|
+
*/
|
|
3252
|
+
proofHint?: string;
|
|
3172
3253
|
/**
|
|
3173
3254
|
* Form heading.
|
|
3174
3255
|
* @remarks Forwarded to the inner element.
|