@ziyarago/ui 0.4.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 +6 -0
- package/README.md +3 -3
- 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/components3.js +21 -0
- package/src/core/pages.js +1 -0
- 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/react.d.ts +80 -2
- package/types/vue-global.d.ts +1 -0
- package/types/vue.d.ts +83 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [0.5.0](https://github.com/ziyarago/ui/compare/v0.4.0...v0.5.0) (2026-10-21)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* AuthShowcase login layouts (photo, light, tint) and PageAuth variants ([4ea5503](https://github.com/ziyarago/ui/commit/4ea5503e223f2c651292372be91987538f0517c8))
|
|
6
|
+
|
|
1
7
|
## [0.4.0](https://github.com/ziyarago/ui/compare/v0.3.0...v0.4.0) (2026-10-21)
|
|
2
8
|
|
|
3
9
|
### Features
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
<p align="center"><a href="https://ziyara.vip"><img src="https://raw.githubusercontent.com/ziyarago/ui/main/docs/images/hero-dark.png" alt="ziyarago/ui: glass design system for Vue, Nuxt and React" width="100%"></a></p>
|
|
6
6
|
|
|
7
|
-
Glass design system for Vue 3, Nuxt and React:
|
|
7
|
+
Glass design system for Vue 3, Nuxt and React: 183 components, 17 page templates, OKLCH tokens, dark and light, RTL and Arabic, 16 interface languages. One framework-neutral core with thin adapters. Built for Umrah and Hajj products, usable anywhere.
|
|
8
8
|
|
|
9
9
|
<table>
|
|
10
10
|
<tr>
|
|
@@ -12,7 +12,7 @@ Glass design system for Vue 3, Nuxt and React: 182 components, 17 page templates
|
|
|
12
12
|
<td width="50%"><img src="https://raw.githubusercontent.com/ziyarago/ui/main/docs/images/hero-rtl.png" alt="Arabic RTL"><br><sub>Arabic, RTL mirrored</sub></td>
|
|
13
13
|
</tr>
|
|
14
14
|
<tr>
|
|
15
|
-
<td><img src="https://raw.githubusercontent.com/ziyarago/ui/main/docs/images/components.png" alt="Component catalog"><br><sub>
|
|
15
|
+
<td><img src="https://raw.githubusercontent.com/ziyarago/ui/main/docs/images/components.png" alt="Component catalog"><br><sub>183 components with props and live examples</sub></td>
|
|
16
16
|
<td><img src="https://raw.githubusercontent.com/ziyarago/ui/main/docs/images/templates.png" alt="Page templates"><br><sub>17 page templates</sub></td>
|
|
17
17
|
</tr>
|
|
18
18
|
<tr>
|
|
@@ -24,7 +24,7 @@ Glass design system for Vue 3, Nuxt and React: 182 components, 17 page templates
|
|
|
24
24
|
Files:
|
|
25
25
|
|
|
26
26
|
```
|
|
27
|
-
src/core/ components*.js, pages.js:
|
|
27
|
+
src/core/ components*.js, pages.js: 183 components and 17 page templates as { state, slots, render(ctx) }; no framework imports
|
|
28
28
|
src/vue/ Vue 3 adapter (UiButton, UiAppShell … + install(app))
|
|
29
29
|
src/react/ React adapter (same names)
|
|
30
30
|
src/theme.js useUiTheme(): theme · palette · dir → <html> attributes, persisted
|
package/dist/llms-full.txt
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @ziyarago/ui
|
|
2
2
|
|
|
3
|
-
> ZiyaraGo UI — glass design system for Umrah and Hajj products. OKLCH tokens, two palettes, dark and light, RTL, Thmanyah. One framework-neutral core with Vue 3, Nuxt and React adapters,
|
|
3
|
+
> ZiyaraGo UI — glass design system for Umrah and Hajj products. OKLCH tokens, two palettes, dark and light, RTL, Thmanyah. One framework-neutral core with Vue 3, Nuxt and React adapters, 183 components and 17 page templates.
|
|
4
4
|
|
|
5
|
-
Version 0.
|
|
5
|
+
Version 0.5.0. Docs: https://ziyara.vip . Manifest (machine readable): https://ziyara.vip/manifest.json
|
|
6
6
|
|
|
7
7
|
## Setup
|
|
8
8
|
- import { UiButton } from '@ziyarago/ui/vue'
|
|
@@ -2110,6 +2110,27 @@ Slots:
|
|
|
2110
2110
|
Notes:
|
|
2111
2111
|
- logo and aside are props in both Vue and React (pass a VNode / element).
|
|
2112
2112
|
|
|
2113
|
+
## UiAuthShowcase (domain)
|
|
2114
|
+
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.
|
|
2115
|
+
Props:
|
|
2116
|
+
- `variant`: 'photo' | 'light' | 'tint' = "photo". '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.
|
|
2117
|
+
- `title` (required): string. Form heading.
|
|
2118
|
+
- `subtitle`: string. Text under the heading.
|
|
2119
|
+
- `logo`: VNode. Logo node above the heading.
|
|
2120
|
+
- `footer`: VNode. Content under the fields, for example "No account? Sign up".
|
|
2121
|
+
- `image`: string. URL of the media image. Without it the panel shows an accent gradient.
|
|
2122
|
+
- `headline`: string. Large text on the media panel (photo and tint).
|
|
2123
|
+
- `caption`: string. Small text on the media panel (photo) or inside the glass bar (light, tint).
|
|
2124
|
+
- `quote`: string. Line at the bottom of the media panel; photo only.
|
|
2125
|
+
- `chips`: string[]. Pill labels inside the glass bar; light and tint.
|
|
2126
|
+
- `people`: { name: string; src?: string }[]. Avatars: floating on the photo, stacked in the proof pill.
|
|
2127
|
+
- `proof`: string. Social-proof title, e.g. "Join 20k+ users"; light and tint. Shows the pill under the form.
|
|
2128
|
+
- `proofHint`: string. Second line of the proof pill.
|
|
2129
|
+
Slots:
|
|
2130
|
+
- default: Form fields and buttons. React passes them as children.
|
|
2131
|
+
Notes:
|
|
2132
|
+
- 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).
|
|
2133
|
+
|
|
2113
2134
|
## UiPageDashboard (pages)
|
|
2114
2135
|
Dashboard template: greeting hero, KPI tiles, occupancy chart, sales funnel, top list and activity feed.
|
|
2115
2136
|
Props:
|
|
@@ -2351,7 +2372,15 @@ Notes:
|
|
|
2351
2372
|
## UiPageAuth (pages)
|
|
2352
2373
|
Sign-in page template without the app shell, as a centered card or a split layout.
|
|
2353
2374
|
Props:
|
|
2354
|
-
- `layout`: 'card' | 'split' = "card". 'split' uses AuthSplit with a side panel
|
|
2375
|
+
- `layout`: 'card' | 'split' | 'photo' | 'light' | 'tint' = "card". '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.
|
|
2376
|
+
- `image`: string. Media image URL; photo, light and tint layouts.
|
|
2377
|
+
- `headline`: string. Large text on the media panel; photo and tint.
|
|
2378
|
+
- `caption`: string. Small text on the media panel or glass bar.
|
|
2379
|
+
- `quote`: string. Bottom line of the media panel; photo only.
|
|
2380
|
+
- `chips`: string[]. Pill labels in the glass bar; light and tint.
|
|
2381
|
+
- `people`: { name: string; src?: string }[]. Avatars on the media panel or in the proof pill.
|
|
2382
|
+
- `proof`: string. Social-proof title under the form; light and tint.
|
|
2383
|
+
- `proofHint`: string. Second line of the proof pill.
|
|
2355
2384
|
- `title`: string. Form heading.
|
|
2356
2385
|
- `subtitle`: string. Text under the heading.
|
|
2357
2386
|
Slots:
|
package/dist/llms.txt
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @ziyarago/ui
|
|
2
2
|
|
|
3
|
-
> ZiyaraGo UI — glass design system for Umrah and Hajj products. OKLCH tokens, two palettes, dark and light, RTL, Thmanyah. One framework-neutral core with Vue 3, Nuxt and React adapters,
|
|
3
|
+
> ZiyaraGo UI — glass design system for Umrah and Hajj products. OKLCH tokens, two palettes, dark and light, RTL, Thmanyah. One framework-neutral core with Vue 3, Nuxt and React adapters, 183 components and 17 page templates.
|
|
4
4
|
|
|
5
|
-
Version 0.
|
|
5
|
+
Version 0.5.0. Docs: https://ziyara.vip . Manifest (machine readable): https://ziyara.vip/manifest.json
|
|
6
6
|
|
|
7
7
|
## Setup
|
|
8
8
|
- import { UiButton } from '@ziyarago/ui/vue'
|
|
@@ -214,6 +214,7 @@ Umrah, Hajj, hotel and CRM blocks.
|
|
|
214
214
|
- UiCallCard: Call recording card with status badge, a playback progress bar and duration.
|
|
215
215
|
- UiIncomingCall: Glass banner for an incoming call with Decline and Answer buttons.
|
|
216
216
|
- UiAuthSplit: Two-column sign-in layout with a brand panel on the left and the form on the right.
|
|
217
|
+
- UiAuthShowcase: 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.
|
|
217
218
|
|
|
218
219
|
## Page templates
|
|
219
220
|
Ready layouts with named slots.
|
package/dist/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ziyarago/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"homepage": "https://ziyara.vip",
|
|
5
5
|
"imports": {
|
|
6
6
|
"vue": "import { UiButton } from '@ziyarago/ui/vue'",
|
|
@@ -251,7 +251,8 @@
|
|
|
251
251
|
"CallRow",
|
|
252
252
|
"CallCard",
|
|
253
253
|
"IncomingCall",
|
|
254
|
-
"AuthSplit"
|
|
254
|
+
"AuthSplit",
|
|
255
|
+
"AuthShowcase"
|
|
255
256
|
]
|
|
256
257
|
},
|
|
257
258
|
{
|
|
@@ -2273,7 +2274,7 @@
|
|
|
2273
2274
|
"id": "auth",
|
|
2274
2275
|
"label": "Authentication (6)",
|
|
2275
2276
|
"component": "UiPageAuth",
|
|
2276
|
-
"description": "
|
|
2277
|
+
"description": "Seven sign-in screens in five layouts: centered card, split with a side panel, and three with a media panel (photo, light, tint).",
|
|
2277
2278
|
"shell": false,
|
|
2278
2279
|
"slots": [
|
|
2279
2280
|
{
|
|
@@ -10050,6 +10051,79 @@
|
|
|
10050
10051
|
"logo and aside are props in both Vue and React (pass a VNode / element)."
|
|
10051
10052
|
]
|
|
10052
10053
|
},
|
|
10054
|
+
{
|
|
10055
|
+
"name": "AuthShowcase",
|
|
10056
|
+
"tag": "UiAuthShowcase",
|
|
10057
|
+
"group": "domain",
|
|
10058
|
+
"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.",
|
|
10059
|
+
"props": {
|
|
10060
|
+
"variant": {
|
|
10061
|
+
"type": "'photo' | 'light' | 'tint'",
|
|
10062
|
+
"values": [
|
|
10063
|
+
"photo",
|
|
10064
|
+
"light",
|
|
10065
|
+
"tint"
|
|
10066
|
+
],
|
|
10067
|
+
"default": "photo",
|
|
10068
|
+
"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."
|
|
10069
|
+
},
|
|
10070
|
+
"title": {
|
|
10071
|
+
"type": "string",
|
|
10072
|
+
"required": true,
|
|
10073
|
+
"description": "Form heading."
|
|
10074
|
+
},
|
|
10075
|
+
"subtitle": {
|
|
10076
|
+
"type": "string",
|
|
10077
|
+
"description": "Text under the heading."
|
|
10078
|
+
},
|
|
10079
|
+
"logo": {
|
|
10080
|
+
"type": "VNode",
|
|
10081
|
+
"description": "Logo node above the heading."
|
|
10082
|
+
},
|
|
10083
|
+
"footer": {
|
|
10084
|
+
"type": "VNode",
|
|
10085
|
+
"description": "Content under the fields, for example \"No account? Sign up\"."
|
|
10086
|
+
},
|
|
10087
|
+
"image": {
|
|
10088
|
+
"type": "string",
|
|
10089
|
+
"description": "URL of the media image. Without it the panel shows an accent gradient."
|
|
10090
|
+
},
|
|
10091
|
+
"headline": {
|
|
10092
|
+
"type": "string",
|
|
10093
|
+
"description": "Large text on the media panel (photo and tint)."
|
|
10094
|
+
},
|
|
10095
|
+
"caption": {
|
|
10096
|
+
"type": "string",
|
|
10097
|
+
"description": "Small text on the media panel (photo) or inside the glass bar (light, tint)."
|
|
10098
|
+
},
|
|
10099
|
+
"quote": {
|
|
10100
|
+
"type": "string",
|
|
10101
|
+
"description": "Line at the bottom of the media panel; photo only."
|
|
10102
|
+
},
|
|
10103
|
+
"chips": {
|
|
10104
|
+
"type": "string[]",
|
|
10105
|
+
"description": "Pill labels inside the glass bar; light and tint."
|
|
10106
|
+
},
|
|
10107
|
+
"people": {
|
|
10108
|
+
"type": "{ name: string; src?: string }[]",
|
|
10109
|
+
"description": "Avatars: floating on the photo, stacked in the proof pill."
|
|
10110
|
+
},
|
|
10111
|
+
"proof": {
|
|
10112
|
+
"type": "string",
|
|
10113
|
+
"description": "Social-proof title, e.g. \"Join 20k+ users\"; light and tint. Shows the pill under the form."
|
|
10114
|
+
},
|
|
10115
|
+
"proofHint": {
|
|
10116
|
+
"type": "string",
|
|
10117
|
+
"description": "Second line of the proof pill."
|
|
10118
|
+
}
|
|
10119
|
+
},
|
|
10120
|
+
"slots": {
|
|
10121
|
+
"default": "Form fields and buttons. React passes them as children."
|
|
10122
|
+
},
|
|
10123
|
+
"notes": [
|
|
10124
|
+
"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)."
|
|
10125
|
+
]
|
|
10126
|
+
},
|
|
10053
10127
|
{
|
|
10054
10128
|
"name": "PageDashboard",
|
|
10055
10129
|
"tag": "UiPageDashboard",
|
|
@@ -10548,13 +10622,56 @@
|
|
|
10548
10622
|
"props": {
|
|
10549
10623
|
"layout": {
|
|
10550
10624
|
"forwarded": true,
|
|
10551
|
-
"type": "'card' | 'split'",
|
|
10625
|
+
"type": "'card' | 'split' | 'photo' | 'light' | 'tint'",
|
|
10552
10626
|
"values": [
|
|
10553
10627
|
"card",
|
|
10554
|
-
"split"
|
|
10628
|
+
"split",
|
|
10629
|
+
"photo",
|
|
10630
|
+
"light",
|
|
10631
|
+
"tint"
|
|
10555
10632
|
],
|
|
10556
10633
|
"default": "card",
|
|
10557
|
-
"description": "'split' uses AuthSplit with a side panel
|
|
10634
|
+
"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."
|
|
10635
|
+
},
|
|
10636
|
+
"image": {
|
|
10637
|
+
"forwarded": true,
|
|
10638
|
+
"type": "string",
|
|
10639
|
+
"description": "Media image URL; photo, light and tint layouts."
|
|
10640
|
+
},
|
|
10641
|
+
"headline": {
|
|
10642
|
+
"forwarded": true,
|
|
10643
|
+
"type": "string",
|
|
10644
|
+
"description": "Large text on the media panel; photo and tint."
|
|
10645
|
+
},
|
|
10646
|
+
"caption": {
|
|
10647
|
+
"forwarded": true,
|
|
10648
|
+
"type": "string",
|
|
10649
|
+
"description": "Small text on the media panel or glass bar."
|
|
10650
|
+
},
|
|
10651
|
+
"quote": {
|
|
10652
|
+
"forwarded": true,
|
|
10653
|
+
"type": "string",
|
|
10654
|
+
"description": "Bottom line of the media panel; photo only."
|
|
10655
|
+
},
|
|
10656
|
+
"chips": {
|
|
10657
|
+
"forwarded": true,
|
|
10658
|
+
"type": "string[]",
|
|
10659
|
+
"description": "Pill labels in the glass bar; light and tint."
|
|
10660
|
+
},
|
|
10661
|
+
"people": {
|
|
10662
|
+
"forwarded": true,
|
|
10663
|
+
"type": "{ name: string; src?: string }[]",
|
|
10664
|
+
"description": "Avatars on the media panel or in the proof pill."
|
|
10665
|
+
},
|
|
10666
|
+
"proof": {
|
|
10667
|
+
"forwarded": true,
|
|
10668
|
+
"type": "string",
|
|
10669
|
+
"description": "Social-proof title under the form; light and tint."
|
|
10670
|
+
},
|
|
10671
|
+
"proofHint": {
|
|
10672
|
+
"forwarded": true,
|
|
10673
|
+
"type": "string",
|
|
10674
|
+
"description": "Second line of the proof pill."
|
|
10558
10675
|
},
|
|
10559
10676
|
"title": {
|
|
10560
10677
|
"forwarded": true,
|
package/dist/style.css
CHANGED
|
@@ -494,6 +494,47 @@
|
|
|
494
494
|
/* CommandPalette active row, dialog focus */
|
|
495
495
|
.zg-menu__i.is-active,.zg-menu__i[aria-selected="true"]{background:var(--zg-s2)}
|
|
496
496
|
.zg-modal:focus,.zg-sheet:focus,.zg-fsd:focus,.zg-saver:focus{outline:0}
|
|
497
|
+
/* AuthShowcase: photo (dark framed card), light (gradient card + proof pill + glass caption), tint (coloured panel, pill fields) */
|
|
498
|
+
.zg-ash{min-height:100%;padding:clamp(12px,3vw,40px);display:grid;place-items:center;--ash-r:28px;--ash-acc:var(--zg-brand)}
|
|
499
|
+
.zg-ash--tint{--ash-acc:oklch(.7 .13 215)}
|
|
500
|
+
.zg-ash__title{margin:0;font:300 clamp(28px,3.4vw,40px)/1.1 var(--zg-font);letter-spacing:-.03em}
|
|
501
|
+
.zg-ash__sub{margin:10px 0 0;color:var(--zg-text-2);line-height:1.55}
|
|
502
|
+
.zg-ash__head{display:flex;flex-direction:column;gap:6px}
|
|
503
|
+
.zg-ash__fields{display:flex;flex-direction:column;gap:14px;margin-top:22px}
|
|
504
|
+
.zg-ash__foot{margin-top:18px;color:var(--zg-text-2);font-size:14px;text-align:center}
|
|
505
|
+
.zg-ash__form{width:100%;max-width:400px;margin-inline:auto}
|
|
506
|
+
.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}
|
|
507
|
+
.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}
|
|
508
|
+
.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%)}
|
|
509
|
+
.zg-ash__copy{position:relative;z-index:1;padding:clamp(24px,5vw,64px);padding-top:clamp(60px,12vw,150px);max-width:480px}
|
|
510
|
+
.zg-ash__copy h2{margin:0 0 14px;font:500 clamp(30px,4vw,46px)/1.08 var(--zg-font);letter-spacing:-.03em}
|
|
511
|
+
.zg-ash__copy p{margin:0;color:var(--zg-text-2);font-size:18px;line-height:1.5}
|
|
512
|
+
.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)}
|
|
513
|
+
.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%}
|
|
514
|
+
@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}}
|
|
515
|
+
@keyframes zg-ash-bob{to{transform:translateY(-10px)}}
|
|
516
|
+
.zg-ash__quote{position:absolute;z-index:1;inset-inline-start:clamp(24px,5vw,64px);bottom:28px;color:var(--zg-text-1)}
|
|
517
|
+
.zg-ash--photo .zg-ash__side{display:grid;place-items:center;padding:clamp(24px,5vw,56px)}
|
|
518
|
+
.zg-ash__grid{width:100%;max-width:1180px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px}
|
|
519
|
+
.zg-ash__col{display:flex;flex-direction:column;gap:16px;min-width:0}
|
|
520
|
+
.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)}
|
|
521
|
+
.zg-ash--light .zg-ash__head,.zg-ash--tint .zg-ash__head{align-items:center;text-align:center}
|
|
522
|
+
.zg-ash--tint .zg-ash__card{background:var(--zg-s1)}
|
|
523
|
+
.zg-ash--tint .zg-ash__title{font-weight:400}
|
|
524
|
+
.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)}
|
|
525
|
+
.zg-ash__stack{display:inline-flex}.zg-ash__stack .zg-avatar{margin-inline-end:-10px;box-shadow:0 0 0 2px var(--zg-s1)}
|
|
526
|
+
.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}
|
|
527
|
+
.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)}
|
|
528
|
+
.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)}
|
|
529
|
+
.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)}
|
|
530
|
+
.zg-ash__glass p{margin:0;color:var(--zg-text-2)}
|
|
531
|
+
.zg-ash__chips{display:flex;gap:10px;flex-wrap:wrap}
|
|
532
|
+
.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)}
|
|
533
|
+
@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}}
|
|
534
|
+
/* default media art when no image is given */
|
|
535
|
+
.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)}
|
|
536
|
+
.zg-ash__media[style*="url("]::after{display:none}
|
|
537
|
+
.zg-ash--light .zg-ash__media{--ash-acc:oklch(.72 .08 80)}
|
|
497
538
|
|
|
498
539
|
|
|
499
540
|
/* ./sizes/typography.css */
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ziyarago/ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "ZiyaraGo UI — glass design system for Umrah and Hajj products. OKLCH tokens, two palettes, dark and light, RTL, Thmanyah. One framework-neutral core with Vue 3, Nuxt and React adapters,
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "ZiyaraGo UI — glass design system for Umrah and Hajj products. OKLCH tokens, two palettes, dark and light, RTL, Thmanyah. One framework-neutral core with Vue 3, Nuxt and React adapters, 183 components and 17 page templates.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ui",
|
|
7
7
|
"design-system",
|
package/src/core/components3.js
CHANGED
|
@@ -30,6 +30,27 @@ export const more3 = {
|
|
|
30
30
|
Snackbar: { render: ({ h, props: p, children }) => h('div', { class: cx('zg-snack', p.variant === 'tonal' && 'zg-snack--tonal', tc(p.tone)), role: 'status' }, h('span', { style: { flex: 1 } }, ...children), p.action ? h('button', { type: 'button', onClick: p.onAction, style: { color: p.tone === 'success' ? 'var(--zg-green)' : 'var(--zg-red)' } }, p.action) : null, p.onClose ? h('button', { type: 'button', onClick: p.onClose, 'aria-label': t('Snackbar', 'close') }, icon(h, 'x', 14)) : null) },
|
|
31
31
|
TourPopover: { render: ({ C, h, props: p }) => h('div', { class: 'zg-tour' }, h('div', { style: { display: 'flex', alignItems: 'center', gap: '8px' } }, h('b', { style: { flex: 1, fontSize: '16px' } }, p.title), h('button', { type: 'button', 'aria-label': t('TourPopover', 'close'), class: 'zg-ibtn zg-ibtn--sm zg-ibtn--ghost', onClick: p.onClose }, icon(h, 'x', 14))), h('span', { style: { fontSize: '14px', lineHeight: 1.5 } }, p.text), h('div', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' } }, h('span', { class: 'zg-hint zg-mono' }, p.step || ''), h('div', { style: { display: 'flex', gap: '8px' } }, p.onBack ? h(C.Button, { size: 'sm', onClick: p.onBack }, t('TourPopover', 'back')) : null, h(C.Button, { size: 'sm', variant: 'primary', onClick: p.onNext }, p.last ? t('TourPopover', 'finish') : t('TourPopover', 'next'))))) },
|
|
32
32
|
ProfileHeader: { render: ({ C, h, props: p, children }) => h('section', { class: 'zg-card zg-glass zg-prof' }, h('div', { class: 'zg-prof__cover', style: { backgroundImage: p.cover ? `url(${p.cover})` : undefined } }), h('div', { class: 'zg-prof__row' }, h('span', { class: 'zg-prof__av' }, h(C.Avatar, { name: p.name, src: p.src, size: 104 })), h('div', { style: { flex: 1, minWidth: '200px', display: 'flex', flexDirection: 'column', gap: '8px' } }, h('b', { style: { fontSize: '22px', fontWeight: 500 } }, p.name), h('div', { class: 'zg-chips', style: { color: 'var(--zg-text-3)', fontSize: '13px' } }, ...(p.meta || []).map(m => h('span', { key: m.label, style: { display: 'inline-flex', gap: '6px', alignItems: 'center' } }, icon(h, m.icon, 14), m.label)))), ...children)) },
|
|
33
|
+
AuthShowcase: { render: ({ C, h, props: p, children }) => {
|
|
34
|
+
const v = p.variant === 'light' || p.variant === 'tint' ? p.variant : 'photo';
|
|
35
|
+
const people = p.people || [];
|
|
36
|
+
const stack = size => h('span', { class: 'zg-ash__stack' }, ...people.slice(0, 4).map((u, i) => h(C.Avatar, { key: i, name: u.name, src: u.src, size })));
|
|
37
|
+
const head = h('div', { class: 'zg-ash__head' }, p.logo || null, h('h1', { class: 'zg-ash__title' }, p.title), p.subtitle ? h('p', { class: 'zg-ash__sub' }, p.subtitle) : null);
|
|
38
|
+
const form = h('div', { class: 'zg-ash__form' }, head, h('div', { class: 'zg-ash__fields' }, ...children), p.footer ? h('div', { class: 'zg-ash__foot' }, p.footer) : null);
|
|
39
|
+
const art = { backgroundImage: p.image ? 'url(' + p.image + ')' : undefined };
|
|
40
|
+
if (v === 'photo') {
|
|
41
|
+
const spots = ['a', 'b', 'c'];
|
|
42
|
+
return h('div', { class: 'zg-root zg-ash zg-ash--photo' }, h('div', { class: 'zg-ash__frame' },
|
|
43
|
+
h('section', { class: 'zg-ash__media', style: art }, h('div', { class: 'zg-ash__copy' }, p.headline ? h('h2', null, p.headline) : null, p.caption ? h('p', null, p.caption) : null),
|
|
44
|
+
...people.slice(0, 3).map((u, i) => h('span', { key: i, class: 'zg-ash__float zg-ash__float--' + spots[i] }, h(C.Avatar, { name: u.name, src: u.src, size: i === 1 ? 'lg' : 'md' }))),
|
|
45
|
+
p.quote ? h('small', { class: 'zg-ash__quote' }, p.quote) : null),
|
|
46
|
+
h('main', { class: 'zg-ash__side' }, form)));
|
|
47
|
+
}
|
|
48
|
+
return h('div', { class: 'zg-root zg-ash zg-ash--' + v }, h('div', { class: 'zg-ash__grid' },
|
|
49
|
+
h('div', { class: 'zg-ash__col' }, h('main', { class: 'zg-ash__card' }, form),
|
|
50
|
+
p.proof ? h('div', { class: 'zg-ash__proof' }, stack('sm'), h('div', { class: 'zg-ash__proofT' }, h('b', null, p.proof), p.proofHint ? h('span', null, p.proofHint) : null), h(C.IconButton, { icon: 'arrow-up-right', label: p.proof, ghost: true })) : null),
|
|
51
|
+
h('section', { class: 'zg-ash__media', style: art }, v === 'tint' && p.headline ? h('h2', { class: 'zg-ash__mh' }, p.headline) : null,
|
|
52
|
+
h('div', { class: 'zg-ash__glass' }, (p.chips || []).length ? h('div', { class: 'zg-ash__chips' }, ...p.chips.map((c, i) => h('span', { key: i, class: 'zg-ash__chip' }, c))) : null, p.caption ? h('p', null, p.caption) : null))));
|
|
53
|
+
} },
|
|
33
54
|
AuthSplit: { render: ({ h, props: p, children }) => h('div', { class: 'zg-root zg-split2' }, h('aside', { class: 'zg-split2__a' }, p.aside), h('main', { class: 'zg-split2__m' }, h('div', { style: { width: '100%', maxWidth: '420px', display: 'flex', flexDirection: 'column', gap: '20px' } }, p.logo || null, h('div', null, h('h1', { style: { margin: 0, font: '300 28px var(--zg-font)', letterSpacing: '-.03em' } }, p.title), p.subtitle ? h('p', { style: { margin: '6px 0 0', color: 'var(--zg-text-2)', lineHeight: 1.5 } }, p.subtitle) : null), ...children))) },
|
|
34
55
|
StatusPage: { state: { email: '' }, render: ({ C, h, props: p, children, state, set }) => { const K = { 404: ['404', t('StatusPage', 'nfTitle'), t('StatusPage', 'nfDesc'), t('StatusPage', 'home')], 401: ['401', t('StatusPage', 'authTitle'), t('StatusPage', 'authDesc'), t('StatusPage', 'home')], maintenance: ['', t('StatusPage', 'mtTitle'), t('StatusPage', 'mtDesc'), t('StatusPage', 'home')], soon: ['', t('StatusPage', 'soonTitle'), t('StatusPage', 'soonDesc'), t('StatusPage', 'notify')] }[p.kind || '404'];
|
|
35
56
|
return h('div', { class: 'zg-es zg-es--page' }, p.codeNode || (K[0] ? h('span', { class: 'zg-num', style: { fontSize: 'clamp(80px,14vw,150px)', lineHeight: 1, color: 'var(--zg-brand-text)' } }, K[0]) : h('span', { class: 'zg-es__ico' }, icon(h, p.kind === 'soon' ? 'rocket' : 'wrench', 28))), p.messageNode || [h('b', { key: 't', style: { fontSize: '24px' } }, p.title || K[1]), h('span', { key: 'd' }, p.description || K[2])], p.actionNode || (p.kind === 'soon' ? h('div', { style: { display: 'flex', gap: '8px', flexWrap: 'wrap', justifyContent: 'center', width: '100%', maxWidth: '420px' } }, h('div', { style: { flex: '1 1 200px' } }, h(C.TextField, { placeholder: p.emailLabel || 'name@email.com', icon: 'mail', modelValue: state.email, onChange: v => set({ email: v }) })), h(C.Button, { variant: 'primary', onClick: () => p.onNotify && p.onNotify(state.email) }, p.notifyLabel || K[3])) : h(C.Button, { variant: 'primary', onClick: p.onAction }, p.actionLabel || K[3])), ...children); } }
|
package/src/core/pages.js
CHANGED
|
@@ -42,6 +42,7 @@ const T = Object.fromEntries([
|
|
|
42
42
|
|
|
43
43
|
T.PageAuth = { slots: ['background', 'logo', 'aside', 'form', 'footer'], render: ({ C, h, props: p, slots: s }) => {
|
|
44
44
|
const body = [s.form || null, s.footer ? h('div', { class: 'zg-pg__r', 'data-slot': 'footer' }, s.footer) : null];
|
|
45
|
+
if (['photo', 'light', 'tint'].includes(p.layout)) return h(C.AuthShowcase, { variant: p.layout, title: p.title, subtitle: p.subtitle, logo: s.logo, footer: s.footer, image: p.image, headline: p.headline, caption: p.caption, quote: p.quote, chips: p.chips, people: p.people, proof: p.proof, proofHint: p.proofHint }, s.form || null);
|
|
45
46
|
return p.layout === 'split'
|
|
46
47
|
? h(C.AuthSplit, { title: p.title, subtitle: p.subtitle, logo: s.logo, aside: s.aside }, ...body)
|
|
47
48
|
: h('div', { class: 'zg-pgauth' }, s.background ? h('div', { class: 'zg-pg__r zg-pgauth__bg', 'data-slot': 'background' }, s.background) : null, h('div', { class: 'zg-pgauth__c' }, h(C.AuthLayout, { title: p.title, subtitle: p.subtitle, logo: s.logo }, ...body)));
|
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/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.
|