@maz-ui/mcp 5.0.0-beta.3 → 5.0.0-beta.31
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/README.md +1 -1
- package/dist/mcp.d.mts +22 -9
- package/dist/mcp.d.ts +22 -9
- package/dist/mcp.mjs +160 -83
- package/docs/generated-docs/maz-avatar.doc.md +30 -30
- package/docs/generated-docs/maz-btn.doc.md +3 -2
- package/docs/generated-docs/maz-checkbox.doc.md +16 -17
- package/docs/generated-docs/maz-circular-progress-bar.doc.md +1 -1
- package/docs/generated-docs/maz-code-highlight.doc.md +11 -0
- package/docs/generated-docs/maz-container.doc.md +1 -0
- package/docs/generated-docs/maz-date-picker.doc.md +41 -41
- package/docs/generated-docs/maz-drawer.doc.md +7 -8
- package/docs/generated-docs/maz-dropdown.doc.md +3 -0
- package/docs/generated-docs/maz-expand-animation.doc.md +4 -4
- package/docs/generated-docs/maz-fullscreen-loader.doc.md +5 -5
- package/docs/generated-docs/maz-gallery.doc.md +15 -15
- package/docs/generated-docs/maz-input-code.doc.md +16 -16
- package/docs/generated-docs/maz-input-phone-number.doc.md +42 -38
- package/docs/generated-docs/maz-input-price.doc.md +14 -14
- package/docs/generated-docs/maz-input-tags.doc.md +16 -16
- package/docs/generated-docs/maz-input.doc.md +33 -33
- package/docs/generated-docs/maz-lazy-img.doc.md +14 -14
- package/docs/generated-docs/maz-loading-bar.doc.md +4 -4
- package/docs/generated-docs/maz-markdown-editor.doc.md +65 -0
- package/docs/generated-docs/maz-popover.doc.md +1 -1
- package/docs/generated-docs/maz-pull-to-refresh.doc.md +10 -10
- package/docs/generated-docs/maz-radio-buttons.doc.md +17 -17
- package/docs/generated-docs/maz-radio.doc.md +16 -16
- package/docs/generated-docs/maz-reading-progress-bar.doc.md +4 -4
- package/docs/generated-docs/maz-sidebar-content.doc.md +5 -0
- package/docs/generated-docs/maz-sidebar-footer.doc.md +5 -0
- package/docs/generated-docs/maz-sidebar-group.doc.md +11 -0
- package/docs/generated-docs/maz-sidebar-header.doc.md +5 -0
- package/docs/generated-docs/maz-sidebar-menu-button.doc.md +27 -0
- package/docs/generated-docs/maz-sidebar-menu-item.doc.md +5 -0
- package/docs/generated-docs/maz-sidebar-menu-sub.doc.md +16 -0
- package/docs/generated-docs/maz-sidebar-menu.doc.md +5 -0
- package/docs/generated-docs/maz-sidebar-separator.doc.md +0 -0
- package/docs/generated-docs/maz-sidebar-trigger.doc.md +5 -0
- package/docs/generated-docs/maz-sidebar.doc.md +36 -0
- package/docs/generated-docs/maz-slider.doc.md +1 -1
- package/docs/generated-docs/maz-spinner.doc.md +4 -4
- package/docs/generated-docs/maz-switch.doc.md +14 -14
- package/docs/generated-docs/maz-table.doc.md +5 -5
- package/docs/generated-docs/maz-textarea.doc.md +25 -24
- package/docs/generated-docs/maz-ticker.doc.md +1 -1
- package/docs/generated-docs/maz-timeline.doc.md +4 -4
- package/docs/generated-docs/maz-window-mockup.doc.md +23 -0
- package/docs/src/blog/v4.md +1 -1
- package/docs/src/blog/v5.md +5 -7
- package/docs/src/components/maz-avatar.md +29 -0
- package/docs/src/components/maz-btn.md +1 -1
- package/docs/src/components/maz-code-highlight.md +233 -0
- package/docs/src/components/maz-container.md +2 -2
- package/docs/src/components/maz-date-picker.md +1 -1
- package/docs/src/components/maz-dialog.md +46 -0
- package/docs/src/components/maz-dropdown.md +32 -16
- package/docs/src/components/maz-icon.md +2 -2
- package/docs/src/components/maz-input-phone-number.md +106 -103
- package/docs/src/components/maz-markdown-editor.md +369 -0
- package/docs/src/components/maz-sidebar.md +719 -0
- package/docs/src/components/maz-textarea.md +27 -1
- package/docs/src/components/maz-timeline.md +60 -0
- package/docs/src/components/maz-window-mockup.md +249 -0
- package/docs/src/composables/use-form-validator.md +50 -11
- package/docs/src/directives/click-outside.md +8 -15
- package/docs/src/directives/fullscreen-img.md +1 -1
- package/docs/src/directives/lazy-img.md +5 -5
- package/docs/src/directives/tooltip.md +24 -1
- package/docs/src/directives/zoom-img.md +1 -1
- package/docs/src/ecosystem/eslint-config.md +95 -1
- package/docs/src/{guide/icons.md → ecosystem/icons/index.md} +1 -1
- package/docs/src/ecosystem/node/exec-promise.md +87 -0
- package/docs/src/ecosystem/node/index.md +53 -0
- package/docs/src/ecosystem/node/logger.md +146 -0
- package/docs/src/ecosystem/node/print-banner.md +93 -0
- package/docs/src/{guide → ecosystem}/nuxt.md +81 -47
- package/docs/src/{guide → ecosystem}/themes.md +153 -72
- package/docs/src/{guide → ecosystem}/translations.md +1 -1
- package/docs/src/ecosystem/utils/camel-case.md +31 -0
- package/docs/src/{helpers → ecosystem/utils}/capitalize.md +2 -3
- package/docs/src/ecosystem/utils/check-availability.md +79 -0
- package/docs/src/ecosystem/utils/cookie.md +80 -0
- package/docs/src/{helpers → ecosystem/utils}/currency.md +2 -2
- package/docs/src/{helpers → ecosystem/utils}/date.md +2 -2
- package/docs/src/ecosystem/utils/debounce-callback.md +38 -0
- package/docs/src/ecosystem/utils/debounce-id.md +69 -0
- package/docs/src/ecosystem/utils/debounce.md +65 -0
- package/docs/src/ecosystem/utils/fetch-locale-ip.md +33 -0
- package/docs/src/ecosystem/utils/format-json.md +33 -0
- package/docs/src/ecosystem/utils/format-phone-number.md +37 -0
- package/docs/src/ecosystem/utils/get-browser-locale.md +29 -0
- package/docs/src/ecosystem/utils/get-error-message.md +39 -0
- package/docs/src/ecosystem/utils/idle-timeout.md +90 -0
- package/docs/src/ecosystem/utils/index.md +60 -0
- package/docs/src/ecosystem/utils/is-client.md +32 -0
- package/docs/src/ecosystem/utils/is-equal.md +38 -0
- package/docs/src/ecosystem/utils/is-server.md +31 -0
- package/docs/src/ecosystem/utils/is-standalone-mode.md +43 -0
- package/docs/src/ecosystem/utils/kebab-case.md +36 -0
- package/docs/src/ecosystem/utils/normalize-string.md +77 -0
- package/docs/src/{helpers → ecosystem/utils}/number.md +2 -2
- package/docs/src/ecosystem/utils/pascal-case.md +35 -0
- package/docs/src/ecosystem/utils/script-loader.md +77 -0
- package/docs/src/ecosystem/utils/sleep.md +59 -0
- package/docs/src/ecosystem/utils/snake-case.md +36 -0
- package/docs/src/ecosystem/utils/swipe-handler.md +91 -0
- package/docs/src/ecosystem/utils/textarea-autogrow.md +41 -0
- package/docs/src/ecosystem/utils/throttle-id.md +48 -0
- package/docs/src/ecosystem/utils/throttle.md +57 -0
- package/docs/src/ecosystem/utils/truthy-filter.md +31 -0
- package/docs/src/ecosystem/utils/types/deep-key-of.md +48 -0
- package/docs/src/ecosystem/utils/types/deep-partial.md +42 -0
- package/docs/src/ecosystem/utils/types/deep-required.md +39 -0
- package/docs/src/ecosystem/utils/types/flatten-object-keys.md +44 -0
- package/docs/src/ecosystem/utils/types/generic-instance-type.md +42 -0
- package/docs/src/ecosystem/utils/types/infer-maybe-ref.md +35 -0
- package/docs/src/ecosystem/utils/upper-first.md +32 -0
- package/docs/src/ecosystem/utils/user-visibility.md +69 -0
- package/docs/src/guide/getting-started.md +15 -13
- package/docs/src/guide/global-defaults.md +101 -0
- package/docs/src/guide/maz-ui-provider.md +6 -3
- package/docs/src/guide/migration-v4.md +13 -9
- package/docs/src/guide/migration-v5.md +112 -13
- package/docs/src/guide/resolvers.md +7 -7
- package/docs/src/guide/tailwind.md +4 -0
- package/docs/src/guide/vue.md +4 -4
- package/docs/src/index.md +12 -12
- package/docs/src/plugins/aos.md +1 -1
- package/docs/src/plugins/wait.md +1 -1
- package/package.json +8 -7
- package/docs/src/helpers/camel-case.md +0 -14
- package/docs/src/helpers/check-availability.md +0 -14
- package/docs/src/helpers/debounce-callback.md +0 -14
- package/docs/src/helpers/debounce-id.md +0 -14
- package/docs/src/helpers/debounce.md +0 -14
- package/docs/src/helpers/is-client.md +0 -14
- package/docs/src/helpers/is-equal.md +0 -14
- package/docs/src/helpers/is-standalone-mode.md +0 -14
- package/docs/src/helpers/kebab-case.md +0 -14
- package/docs/src/helpers/normalize-string.md +0 -14
- package/docs/src/helpers/pascal-case.md +0 -14
- package/docs/src/helpers/script-loader.md +0 -14
- package/docs/src/helpers/sleep.md +0 -14
- package/docs/src/helpers/snake-case.md +0 -14
- package/docs/src/helpers/throttle-id.md +0 -14
- package/docs/src/helpers/throttle.md +0 -14
- /package/docs/src/{guide → ecosystem/icons}/icon-set.md +0 -0
- /package/docs/src/{guide → ecosystem}/mcp.md +0 -0
- /package/docs/src/{helpers → ecosystem/utils}/country-code-to-unicode-flag.md +0 -0
- /package/docs/src/{helpers → ecosystem/utils}/get-country-flag-url.md +0 -0
|
@@ -68,6 +68,32 @@ You can use the `top-label` attribute to display a top label above the textarea.
|
|
|
68
68
|
</template>
|
|
69
69
|
</ComponentDemo>
|
|
70
70
|
|
|
71
|
+
## With assistive text
|
|
72
|
+
|
|
73
|
+
You can use the `assistive-text` attribute to display a assistive text below the textarea.
|
|
74
|
+
|
|
75
|
+
<ComponentDemo>
|
|
76
|
+
<MazTextarea
|
|
77
|
+
v-model="value"
|
|
78
|
+
top-label="Your message"
|
|
79
|
+
placeholder="Type your message..."
|
|
80
|
+
assistive-text="This is an assistive text"
|
|
81
|
+
/>
|
|
82
|
+
|
|
83
|
+
<template #code>
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<MazTextarea
|
|
87
|
+
v-model="value"
|
|
88
|
+
top-label="Your message"
|
|
89
|
+
placeholder="Type your message..."
|
|
90
|
+
assistive-text="This is an assistive text"
|
|
91
|
+
/>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
</template>
|
|
95
|
+
</ComponentDemo>
|
|
96
|
+
|
|
71
97
|
## With label and append slots
|
|
72
98
|
|
|
73
99
|
You can use the `label` and `append` slots to customize the label and the append element.
|
|
@@ -84,7 +110,7 @@ You can use the `label` and `append` slots to customize the label and the append
|
|
|
84
110
|
</span>
|
|
85
111
|
</template>
|
|
86
112
|
<template #append>
|
|
87
|
-
<MazBtn icon="paper-airplane" size="sm" @click="sendMessage" />
|
|
113
|
+
<MazBtn icon="/paper-airplane.svg" size="sm" @click="sendMessage" />
|
|
88
114
|
</template>
|
|
89
115
|
</MazTextarea>
|
|
90
116
|
|
|
@@ -9,6 +9,21 @@ description: MazTimeline is a step/progress timeline component for Vue 3 with su
|
|
|
9
9
|
|
|
10
10
|
<!--@include: ./../../.vitepress/mixins/getting-started.md-->
|
|
11
11
|
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
Control the current step:
|
|
15
|
+
|
|
16
|
+
<MazRadioButtons
|
|
17
|
+
:model-value="currentStep"
|
|
18
|
+
size="sm"
|
|
19
|
+
:options="[
|
|
20
|
+
{ label: 'None', value: -1 },
|
|
21
|
+
...steps.map((step, index) => ({ label: index, value: index })),
|
|
22
|
+
{ label: 'All Completed', value: 99 },
|
|
23
|
+
]"
|
|
24
|
+
@update:model-value="currentStep = $event"
|
|
25
|
+
/>
|
|
26
|
+
|
|
12
27
|
## Basic usage
|
|
13
28
|
|
|
14
29
|
<ComponentDemo>
|
|
@@ -292,6 +307,40 @@ Customize the indicator border radius with the `rounded-size` prop.
|
|
|
292
307
|
</template>
|
|
293
308
|
</ComponentDemo>
|
|
294
309
|
|
|
310
|
+
## Custom Icons
|
|
311
|
+
|
|
312
|
+
<ComponentDemo>
|
|
313
|
+
<MazTimeline :model-value="0" :steps="iconsSteps" direction="horizontal" size="lg" />
|
|
314
|
+
|
|
315
|
+
<template #code>
|
|
316
|
+
|
|
317
|
+
```vue
|
|
318
|
+
<template>
|
|
319
|
+
<MazTimeline
|
|
320
|
+
v-model="currentStep"
|
|
321
|
+
:steps="steps"
|
|
322
|
+
size="lg"
|
|
323
|
+
/>
|
|
324
|
+
</template>
|
|
325
|
+
|
|
326
|
+
<script lang="ts" setup>
|
|
327
|
+
import { MazCommandLine } from '@maz-ui/icons/MazCommandLine'
|
|
328
|
+
import { MazClipboardDocumentList } from '@maz-ui/icons/MazClipboardDocumentList'
|
|
329
|
+
import { MazClipboardDocumentCheck } from '@maz-ui/icons/MazClipboardDocumentCheck'
|
|
330
|
+
import { MazComputerDesktop } from '@maz-ui/icons/MazComputerDesktop'
|
|
331
|
+
|
|
332
|
+
const iconsSteps = [
|
|
333
|
+
{ title: 'PO', subtitle: 'Writing PRD', icon: MazClipboardDocumentList },
|
|
334
|
+
{ title: 'Dev', subtitle: 'Building Code', icon: MazCommandLine },
|
|
335
|
+
{ title: 'Tech Lead', subtitle: 'Review Code', icon: MazComputerDesktop },
|
|
336
|
+
{ title: 'QA', subtitle: 'Testing', icon: MazClipboardDocumentCheck },
|
|
337
|
+
]
|
|
338
|
+
</script>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
</template>
|
|
342
|
+
</ComponentDemo>
|
|
343
|
+
|
|
295
344
|
## Custom slots
|
|
296
345
|
|
|
297
346
|
MazTimeline provides scoped slots for full customization.
|
|
@@ -378,6 +427,10 @@ MazTimeline provides scoped slots for full customization.
|
|
|
378
427
|
|
|
379
428
|
<script lang="ts" setup>
|
|
380
429
|
import { ref } from 'vue'
|
|
430
|
+
import { MazComputerDesktop } from '@maz-ui/icons/MazComputerDesktop'
|
|
431
|
+
import { MazCommandLine } from '@maz-ui/icons/MazCommandLine'
|
|
432
|
+
import { MazClipboardDocumentList } from '@maz-ui/icons/MazClipboardDocumentList'
|
|
433
|
+
import { MazClipboardDocumentCheck } from '@maz-ui/icons/MazClipboardDocumentCheck'
|
|
381
434
|
|
|
382
435
|
const currentStep = ref(1)
|
|
383
436
|
const clickableStep = ref(0)
|
|
@@ -410,6 +463,13 @@ MazTimeline provides scoped slots for full customization.
|
|
|
410
463
|
{ title: 'Complete', subtitle: 'All done!' },
|
|
411
464
|
]
|
|
412
465
|
|
|
466
|
+
const iconsSteps = [
|
|
467
|
+
{ title: 'PO', subtitle: 'Writing PRD', icon: MazClipboardDocumentList },
|
|
468
|
+
{ title: 'Dev', subtitle: 'Building Code', icon: MazCommandLine },
|
|
469
|
+
{ title: 'Tech Lead', subtitle: 'Review Code', icon: MazComputerDesktop },
|
|
470
|
+
{ title: 'QA', subtitle: 'Testing', icon: MazClipboardDocumentCheck },
|
|
471
|
+
]
|
|
472
|
+
|
|
413
473
|
const colors = ['primary', 'secondary', 'info', 'success', 'warning', 'destructive']
|
|
414
474
|
const sizes = ['mini', 'xs', 'sm', 'md', 'lg', 'xl']
|
|
415
475
|
const roundedSizes = ['full', 'lg', 'md', 'sm', 'none']
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: MazWindowMockup
|
|
3
|
+
description: MazWindowMockup renders a macOS-style window frame in three variants — browser, terminal, and editor — to showcase content, demos, or code examples in your documentation or UI.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# {{ $frontmatter.title }}
|
|
7
|
+
|
|
8
|
+
{{ $frontmatter.description }}
|
|
9
|
+
|
|
10
|
+
<!--@include: ./../../.vitepress/mixins/getting-started.md-->
|
|
11
|
+
|
|
12
|
+
::: info Optional: shiki for code variants
|
|
13
|
+
When you pass the `code` prop, `MazWindowMockup` mounts `MazCodeHighlight` internally for syntax highlighting. This requires the [`shiki`](https://shiki.style) optional peer dependency to be installed. See the [MazCodeHighlight installation note](/components/maz-code-highlight#installation-requirement).
|
|
14
|
+
:::
|
|
15
|
+
|
|
16
|
+
## Browser variant
|
|
17
|
+
|
|
18
|
+
The default variant. Displays an address bar with the `url` prop and a copy-URL button on the right side of the bar.
|
|
19
|
+
|
|
20
|
+
<ComponentDemo>
|
|
21
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="100px">
|
|
22
|
+
<div style="padding: 1rem; text-align: center;">Browser content goes here</div>
|
|
23
|
+
</MazWindowMockup>
|
|
24
|
+
|
|
25
|
+
<template #code>
|
|
26
|
+
|
|
27
|
+
```vue
|
|
28
|
+
<template>
|
|
29
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="100px">
|
|
30
|
+
<div>Browser content goes here</div>
|
|
31
|
+
</MazWindowMockup>
|
|
32
|
+
</template>
|
|
33
|
+
|
|
34
|
+
<script lang="ts" setup>
|
|
35
|
+
import MazWindowMockup from 'maz-ui/components/MazWindowMockup'
|
|
36
|
+
</script>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
</template>
|
|
40
|
+
</ComponentDemo>
|
|
41
|
+
|
|
42
|
+
### Hide the URL copy button
|
|
43
|
+
|
|
44
|
+
Set `:hide-url-copy="true"` to remove the copy-URL button from the title bar.
|
|
45
|
+
|
|
46
|
+
<ComponentDemo>
|
|
47
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="80px" :hide-url-copy="true" />
|
|
48
|
+
|
|
49
|
+
<template #code>
|
|
50
|
+
|
|
51
|
+
```vue
|
|
52
|
+
<template>
|
|
53
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="80px" :hide-url-copy="true" />
|
|
54
|
+
</template>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
</template>
|
|
58
|
+
</ComponentDemo>
|
|
59
|
+
|
|
60
|
+
### With screenshot
|
|
61
|
+
|
|
62
|
+
Use this variant to display a screenshot of a website.
|
|
63
|
+
|
|
64
|
+
<ComponentDemo>
|
|
65
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="100px">
|
|
66
|
+
<img :src="screenshot" alt="Maz UI Demo Dashboard" width="100%">
|
|
67
|
+
</MazWindowMockup>
|
|
68
|
+
|
|
69
|
+
<template #code>
|
|
70
|
+
|
|
71
|
+
```vue
|
|
72
|
+
<template>
|
|
73
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="100px">
|
|
74
|
+
<img src="/img/screenshots/maz-ui-home-desktop.webp" alt="Maz UI Demo Dashboard" width="100%">
|
|
75
|
+
</MazWindowMockup>
|
|
76
|
+
</template>
|
|
77
|
+
|
|
78
|
+
<script lang="ts" setup>
|
|
79
|
+
import MazWindowMockup from 'maz-ui/components/MazWindowMockup'
|
|
80
|
+
</script>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
</template>
|
|
84
|
+
</ComponentDemo>
|
|
85
|
+
|
|
86
|
+
## Terminal variant
|
|
87
|
+
|
|
88
|
+
Displays a centered title and a `$` prompt prefix in front of the code (when `code` is provided). The prompt prefix is **not** copied to the clipboard — the copy button only writes the raw `code` value.
|
|
89
|
+
|
|
90
|
+
<ComponentDemo>
|
|
91
|
+
<MazWindowMockup variant="terminal" title="zsh" code="pnpm add maz-ui" language="bash" />
|
|
92
|
+
|
|
93
|
+
<template #code>
|
|
94
|
+
|
|
95
|
+
```vue
|
|
96
|
+
<template>
|
|
97
|
+
<MazWindowMockup variant="terminal" title="zsh" code="pnpm add maz-ui" language="bash" />
|
|
98
|
+
</template>
|
|
99
|
+
|
|
100
|
+
<script lang="ts" setup>
|
|
101
|
+
import MazWindowMockup from 'maz-ui/components/MazWindowMockup'
|
|
102
|
+
</script>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
</template>
|
|
106
|
+
</ComponentDemo>
|
|
107
|
+
|
|
108
|
+
### Custom prompt
|
|
109
|
+
|
|
110
|
+
Replace the default `$` with any character via the `prompt` prop.
|
|
111
|
+
|
|
112
|
+
<ComponentDemo>
|
|
113
|
+
<MazWindowMockup variant="terminal" code="git status" language="bash" prompt="❯" />
|
|
114
|
+
|
|
115
|
+
<template #code>
|
|
116
|
+
|
|
117
|
+
```vue
|
|
118
|
+
<template>
|
|
119
|
+
<MazWindowMockup variant="terminal" code="git status" language="bash" prompt="❯" />
|
|
120
|
+
</template>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
</template>
|
|
124
|
+
</ComponentDemo>
|
|
125
|
+
|
|
126
|
+
### Without prompt
|
|
127
|
+
|
|
128
|
+
Hide the default prompt by setting `hide-prompt` to `true`.
|
|
129
|
+
|
|
130
|
+
<ComponentDemo>
|
|
131
|
+
<MazWindowMockup variant="terminal" code="git status" language="bash" :hide-prompt="true" />
|
|
132
|
+
|
|
133
|
+
<template #code>
|
|
134
|
+
|
|
135
|
+
```vue
|
|
136
|
+
<template>
|
|
137
|
+
<MazWindowMockup variant="terminal" code="git status" language="bash" :hide-prompt="true" />
|
|
138
|
+
</template>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
</template>
|
|
142
|
+
</ComponentDemo>
|
|
143
|
+
|
|
144
|
+
## Editor variant
|
|
145
|
+
|
|
146
|
+
Shows a filename tab anchored to the bottom of the title bar — matching the look of real editors like VSCode.
|
|
147
|
+
|
|
148
|
+
<ComponentDemo>
|
|
149
|
+
<MazWindowMockup variant="editor" filename="App.vue" :code="vueCode" language="vue" />
|
|
150
|
+
|
|
151
|
+
<template #code>
|
|
152
|
+
|
|
153
|
+
```vue
|
|
154
|
+
<template>
|
|
155
|
+
<MazWindowMockup variant="editor" filename="App.vue" :code="vueCode" language="vue" />
|
|
156
|
+
</template>
|
|
157
|
+
|
|
158
|
+
<script lang="ts" setup>
|
|
159
|
+
import MazWindowMockup from 'maz-ui/components/MazWindowMockup'
|
|
160
|
+
|
|
161
|
+
const vueCode = `<template>
|
|
162
|
+
<MazBtn>Click me</MazBtn>
|
|
163
|
+
</template>`
|
|
164
|
+
</script>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
</template>
|
|
168
|
+
</ComponentDemo>
|
|
169
|
+
|
|
170
|
+
## With code and language props
|
|
171
|
+
|
|
172
|
+
Pass `code` and `language` to display highlighted source code via `MazCodeHighlight`. The inner highlighter automatically renders with squared corners so it sits flush against the window's border.
|
|
173
|
+
|
|
174
|
+
<ComponentDemo>
|
|
175
|
+
<MazWindowMockup code="import MazBtn from 'maz-ui/components/MazBtn'" language="ts" />
|
|
176
|
+
|
|
177
|
+
<template #code>
|
|
178
|
+
|
|
179
|
+
```vue
|
|
180
|
+
<template>
|
|
181
|
+
<MazWindowMockup code="import MazBtn from 'maz-ui/components/MazBtn'" language="ts" />
|
|
182
|
+
</template>
|
|
183
|
+
|
|
184
|
+
<script lang="ts" setup>
|
|
185
|
+
import MazWindowMockup from 'maz-ui/components/MazWindowMockup'
|
|
186
|
+
</script>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
</template>
|
|
190
|
+
</ComponentDemo>
|
|
191
|
+
|
|
192
|
+
## Empty-state placeholder
|
|
193
|
+
|
|
194
|
+
When neither `code` nor a slot content is provided, the content area renders an empty placeholder. Pass the optional `label` prop to display a centered text inside it.
|
|
195
|
+
|
|
196
|
+
<ComponentDemo>
|
|
197
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="160px" label="Preview" />
|
|
198
|
+
|
|
199
|
+
<template #code>
|
|
200
|
+
|
|
201
|
+
```vue
|
|
202
|
+
<template>
|
|
203
|
+
<MazWindowMockup url="https://maz-ui.com" min-height="160px" label="Preview" />
|
|
204
|
+
</template>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
</template>
|
|
208
|
+
</ComponentDemo>
|
|
209
|
+
|
|
210
|
+
## Custom translations
|
|
211
|
+
|
|
212
|
+
The URL copy button's aria-label and tooltip come from the `@maz-ui/translations` package (`windowMockup.copyUrlToClipboard` / `windowMockup.urlCopiedToClipboard`). Override per-instance with the `translations` prop:
|
|
213
|
+
|
|
214
|
+
<ComponentDemo>
|
|
215
|
+
<MazWindowMockup
|
|
216
|
+
url="https://maz-ui.com"
|
|
217
|
+
min-height="80px"
|
|
218
|
+
:translations="{ copyUrlToClipboard: 'Copier l\'URL', urlCopiedToClipboard: 'URL copiée !' }"
|
|
219
|
+
/>
|
|
220
|
+
|
|
221
|
+
<template #code>
|
|
222
|
+
|
|
223
|
+
```vue
|
|
224
|
+
<template>
|
|
225
|
+
<MazWindowMockup
|
|
226
|
+
url="https://maz-ui.com"
|
|
227
|
+
min-height="80px"
|
|
228
|
+
:translations="{
|
|
229
|
+
copyUrlToClipboard: 'Copier l\'URL',
|
|
230
|
+
urlCopiedToClipboard: 'URL copiée !',
|
|
231
|
+
}"
|
|
232
|
+
/>
|
|
233
|
+
</template>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
</template>
|
|
237
|
+
</ComponentDemo>
|
|
238
|
+
|
|
239
|
+
For app-wide translations, set up the [maz-ui translations plugin](/translations) and the component will pick up your locale automatically.
|
|
240
|
+
|
|
241
|
+
<script lang="ts" setup>
|
|
242
|
+
import screenshot from './../assets/interface-screenshot.png'
|
|
243
|
+
|
|
244
|
+
const vueCode = `<template>
|
|
245
|
+
<MazBtn>Click me</MazBtn>
|
|
246
|
+
</template>`
|
|
247
|
+
</script>
|
|
248
|
+
|
|
249
|
+
<!--@include: ./../../.vitepress/generated-docs/maz-window-mockup.doc.md-->
|
|
@@ -151,7 +151,7 @@ Each field in `fieldsStates` contains:
|
|
|
151
151
|
v-model="stateModel.age"
|
|
152
152
|
label="Age (18-100)"
|
|
153
153
|
type="number"
|
|
154
|
-
:hint="stateErrors.age"
|
|
154
|
+
:hint="stateErrors.age"
|
|
155
155
|
:error="!!stateErrors.age"
|
|
156
156
|
:success="stateFields.age.valid"
|
|
157
157
|
/>
|
|
@@ -365,7 +365,7 @@ Requires `useFormField` with `ref` option or `validationEvents`.
|
|
|
365
365
|
:success="eagerEmailValid"
|
|
366
366
|
:class="{ 'has-error-eager': eagerEmailHasError }"
|
|
367
367
|
/>
|
|
368
|
-
<MazBtn type="submit" :loading="eagerSubmitting">Submit</MazBtn>
|
|
368
|
+
<MazBtn type="submit" :loading="eagerSubmitting" :disabled="!eagerIsValid">Submit</MazBtn>
|
|
369
369
|
</form>
|
|
370
370
|
|
|
371
371
|
<template #code>
|
|
@@ -381,7 +381,7 @@ const schema = {
|
|
|
381
381
|
email: pipe(string(), nonEmpty('Required'), email('Invalid email')),
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
const { isSubmitting, handleSubmit } = useFormValidator({
|
|
384
|
+
const { isSubmitting, handleSubmit, isValid } = useFormValidator({
|
|
385
385
|
schema,
|
|
386
386
|
options: {
|
|
387
387
|
mode: 'eager',
|
|
@@ -430,6 +430,8 @@ const {
|
|
|
430
430
|
:error="emailHasError"
|
|
431
431
|
:success="emailValid"
|
|
432
432
|
/>
|
|
433
|
+
|
|
434
|
+
<MazBtn type="submit" :loading="isSubmitting" :disabled="!isValid">Submit</MazBtn>
|
|
433
435
|
</form>
|
|
434
436
|
</template>
|
|
435
437
|
```
|
|
@@ -614,6 +616,8 @@ const { value: name, hasError, errorMessage, isValid } = useFormField<string>('n
|
|
|
614
616
|
|
|
615
617
|
Pass a template ref to `useFormField`. It will automatically detect interactive elements and attach blur listeners.
|
|
616
618
|
|
|
619
|
+
The `ref` option is **reactive**: if the field is rendered conditionally (e.g. with `v-if`), the blur listeners are attached automatically as soon as the element appears in the DOM, and removed when it is unmounted. You don't need to handle anything special.
|
|
620
|
+
|
|
617
621
|
```vue
|
|
618
622
|
<script setup>
|
|
619
623
|
import { useFormField } from 'maz-ui/composables'
|
|
@@ -635,6 +639,41 @@ const { value, errorMessage, hasError } = useFormField<string>('email', {
|
|
|
635
639
|
</template>
|
|
636
640
|
```
|
|
637
641
|
|
|
642
|
+
Because it is reactive, the same code works even when the input is wrapped in a `v-if`:
|
|
643
|
+
|
|
644
|
+
```vue
|
|
645
|
+
<script setup>
|
|
646
|
+
import { useFormField } from 'maz-ui/composables'
|
|
647
|
+
import { useTemplateRef, ref } from 'vue'
|
|
648
|
+
|
|
649
|
+
const isVisible = ref(false)
|
|
650
|
+
|
|
651
|
+
const { value, errorMessage, hasError } = useFormField<string>('email', {
|
|
652
|
+
ref: useTemplateRef('emailRef'),
|
|
653
|
+
formIdentifier: 'my-form',
|
|
654
|
+
})
|
|
655
|
+
</script>
|
|
656
|
+
|
|
657
|
+
<template>
|
|
658
|
+
<MazInput
|
|
659
|
+
v-if="isVisible"
|
|
660
|
+
ref="emailRef"
|
|
661
|
+
v-model="value"
|
|
662
|
+
:hint="errorMessage"
|
|
663
|
+
:error="hasError"
|
|
664
|
+
/>
|
|
665
|
+
</template>
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
You can also pass a raw `HTMLElement` directly. In that case it won't be reactive, so the element must already exist in the DOM:
|
|
669
|
+
|
|
670
|
+
```ts
|
|
671
|
+
const { value } = useFormField<string>('email', {
|
|
672
|
+
ref: document.querySelector('input'),
|
|
673
|
+
formIdentifier: 'my-form',
|
|
674
|
+
})
|
|
675
|
+
```
|
|
676
|
+
|
|
638
677
|
#### Option 2: Using `validationEvents`
|
|
639
678
|
|
|
640
679
|
If your component emits a `blur` event, you can use `v-bind` with `validationEvents`.
|
|
@@ -1074,7 +1113,7 @@ useFormField<FieldType>(
|
|
|
1074
1113
|
options?: {
|
|
1075
1114
|
defaultValue?: FieldType, // Default value for this field
|
|
1076
1115
|
mode?: 'lazy' | 'aggressive' | 'eager' | 'blur' | 'progressive', // Override form mode
|
|
1077
|
-
ref?: Ref<HTMLElement | ComponentInstance
|
|
1116
|
+
ref?: Ref<HTMLElement | ComponentInstance> | HTMLElement, // Reactive template ref (v-if friendly) or raw element
|
|
1078
1117
|
formIdentifier?: string | symbol, // Must match useFormValidator's identifier
|
|
1079
1118
|
}
|
|
1080
1119
|
)
|
|
@@ -1113,7 +1152,7 @@ interface FormValidatorOptions<Model> {
|
|
|
1113
1152
|
interface FormFieldOptions<FieldType> {
|
|
1114
1153
|
defaultValue?: FieldType
|
|
1115
1154
|
mode?: 'eager' | 'lazy' | 'aggressive' | 'blur' | 'progressive'
|
|
1116
|
-
ref?: Ref<HTMLElement | ComponentInstance>
|
|
1155
|
+
ref?: Ref<HTMLElement | ComponentInstance> | HTMLElement
|
|
1117
1156
|
formIdentifier?: string | symbol
|
|
1118
1157
|
}
|
|
1119
1158
|
|
|
@@ -1166,14 +1205,13 @@ const { value, validationEvents } = useFormField<string>('name')
|
|
|
1166
1205
|
// Then: v-bind="validationEvents" on your input
|
|
1167
1206
|
```
|
|
1168
1207
|
|
|
1169
|
-
###
|
|
1208
|
+
### Conditionally Rendered Fields (`v-if`)
|
|
1170
1209
|
|
|
1171
|
-
|
|
1210
|
+
The `ref` option is reactive, so a field wrapped in `v-if` works out of the box: blur listeners are attached as soon as the element is rendered and removed when it is unmounted.
|
|
1172
1211
|
|
|
1173
|
-
|
|
1174
|
-
1. Ensure the ref is bound to an HTML element or Vue component
|
|
1175
|
-
2.
|
|
1176
|
-
3. For custom components, add `data-interactive` attribute
|
|
1212
|
+
If blur validation still doesn't trigger:
|
|
1213
|
+
1. Ensure the `ref` is bound to an HTML element or a Vue component exposing `$el`
|
|
1214
|
+
2. For custom components, add the `data-interactive` attribute
|
|
1177
1215
|
|
|
1178
1216
|
### Mismatched Form Identifiers
|
|
1179
1217
|
|
|
@@ -1310,6 +1348,7 @@ const eagerSchema = {
|
|
|
1310
1348
|
const {
|
|
1311
1349
|
isSubmitting: eagerSubmitting,
|
|
1312
1350
|
handleSubmit: handleEager,
|
|
1351
|
+
isValid: eagerIsValid,
|
|
1313
1352
|
} = useFormValidator({
|
|
1314
1353
|
schema: eagerSchema,
|
|
1315
1354
|
options: { mode: 'eager', scrollToError: '.has-error-eager', identifier: 'form-eager' },
|
|
@@ -11,8 +11,7 @@ description: vClickOutside is a Vue directive to trigger a function when the use
|
|
|
11
11
|
|
|
12
12
|
<ComponentDemo>
|
|
13
13
|
<div
|
|
14
|
-
|
|
15
|
-
class="maz:flex maz:flex-center maz:rounded-md"
|
|
14
|
+
class="maz:flex maz:flex-center maz:rounded-md maz:p-12 maz:bg-surface-300"
|
|
16
15
|
>
|
|
17
16
|
<MazCard v-click-outside="clikedOutside">
|
|
18
17
|
Click outside me
|
|
@@ -21,8 +20,7 @@ description: vClickOutside is a Vue directive to trigger a function when the use
|
|
|
21
20
|
|
|
22
21
|
<div
|
|
23
22
|
v-if="hasClikedOutside"
|
|
24
|
-
|
|
25
|
-
class="maz:flex maz:flex-center maz:rounded-md"
|
|
23
|
+
class="maz:flex maz:flex-center maz:rounded-md maz:bg-sucess maz:text-success-foreground maz:p-4 maz:mt-4"
|
|
26
24
|
>
|
|
27
25
|
You clicked outside
|
|
28
26
|
</div>
|
|
@@ -44,8 +42,7 @@ function clikedOutside() {
|
|
|
44
42
|
|
|
45
43
|
<template>
|
|
46
44
|
<div
|
|
47
|
-
|
|
48
|
-
class="flex flex-center rounded"
|
|
45
|
+
class="maz:flex maz:flex-center maz:rounded-md maz:p-12 maz:bg-surface-300"
|
|
49
46
|
>
|
|
50
47
|
<MazCard v-click-outside="clikedOutside">
|
|
51
48
|
Click outside me
|
|
@@ -54,8 +51,7 @@ function clikedOutside() {
|
|
|
54
51
|
|
|
55
52
|
<div
|
|
56
53
|
v-if="hasClikedOutside"
|
|
57
|
-
|
|
58
|
-
class="flex flex-center rounded"
|
|
54
|
+
class="maz:flex maz:flex-center maz:rounded-md maz:bg-sucess maz:text-success-foreground maz:p-4 maz:mt-4"
|
|
59
55
|
>
|
|
60
56
|
You clicked outside
|
|
61
57
|
</div>
|
|
@@ -71,8 +67,7 @@ The directive can accept an options object to customize its behavior:
|
|
|
71
67
|
|
|
72
68
|
<ComponentDemo>
|
|
73
69
|
<div
|
|
74
|
-
|
|
75
|
-
class="maz:flex maz:flex-center maz:rounded-md"
|
|
70
|
+
class="maz:flex maz:flex-center maz:rounded-md maz:p-12 maz:bg-surface-300"
|
|
76
71
|
>
|
|
77
72
|
<MazCard v-click-outside="{ callback: clickedOutsideWithIgnore, ignore: ['.ignore-me'] }">
|
|
78
73
|
<div class="maz:p-4">
|
|
@@ -86,8 +81,7 @@ The directive can accept an options object to customize its behavior:
|
|
|
86
81
|
|
|
87
82
|
<div
|
|
88
83
|
v-if="hasClickedOutsideWithIgnore"
|
|
89
|
-
|
|
90
|
-
class="maz:flex maz:flex-center maz:rounded-md"
|
|
84
|
+
class="maz:flex maz:flex-center maz:rounded-md maz:bg-sucess maz:text-success-foreground maz:p-4 maz:mt-4"
|
|
91
85
|
>
|
|
92
86
|
You clicked outside (button clicks are ignored)
|
|
93
87
|
</div>
|
|
@@ -128,8 +122,7 @@ The directive can be configured to trigger only once:
|
|
|
128
122
|
|
|
129
123
|
<ComponentDemo>
|
|
130
124
|
<div
|
|
131
|
-
|
|
132
|
-
class="maz:flex maz:flex-center maz:rounded-md"
|
|
125
|
+
class="maz:flex maz:flex-center maz:rounded-md maz:p-12 maz:bg-surface-300"
|
|
133
126
|
>
|
|
134
127
|
<MazCard v-click-outside="{ callback: clickedOnce, once: true }">
|
|
135
128
|
Click outside me (works only once)
|
|
@@ -249,7 +242,7 @@ app.mount('#app')
|
|
|
249
242
|
|
|
250
243
|
### Nuxt
|
|
251
244
|
|
|
252
|
-
Please refer to the [Nuxt module documentation](./../
|
|
245
|
+
Please refer to the [Nuxt module documentation](./../ecosystem/nuxt.md) for more information.
|
|
253
246
|
|
|
254
247
|
<script lang="ts" setup>
|
|
255
248
|
import { ref } from 'vue'
|
|
@@ -10,7 +10,7 @@ description: vLazyImg is a Vue directive to lazy load images with many options.
|
|
|
10
10
|
## Basic usage
|
|
11
11
|
|
|
12
12
|
<img
|
|
13
|
-
style="background-color: var(--maz-surface-300); width: 80%;"
|
|
13
|
+
style="background-color: var(--maz-color-surface-300); width: 80%;"
|
|
14
14
|
class="flex flex-center rounded"
|
|
15
15
|
v-lazy-img="'https://placedog.net/1500/1000'"
|
|
16
16
|
/>
|
|
@@ -23,7 +23,7 @@ import { vLazyImg } from 'maz-ui/directives'
|
|
|
23
23
|
<template>
|
|
24
24
|
<img
|
|
25
25
|
v-lazy-img="'https://placedog.net/1500/1000'"
|
|
26
|
-
style="background-color: var(--maz-surface-300); width: 80%;"
|
|
26
|
+
style="background-color: var(--maz-color-surface-300); width: 80%;"
|
|
27
27
|
class="flex flex-center rounded"
|
|
28
28
|
>
|
|
29
29
|
</template>
|
|
@@ -54,7 +54,7 @@ import { vLazyImg } from 'maz-ui/directives'
|
|
|
54
54
|
> Open the developer console to show logs
|
|
55
55
|
|
|
56
56
|
<img
|
|
57
|
-
style="background-color: var(--maz-surface-300); width: 80%;"
|
|
57
|
+
style="background-color: var(--maz-color-surface-300); width: 80%;"
|
|
58
58
|
class="flex flex-center rounded"
|
|
59
59
|
v-lazy-img="lazyBinding"
|
|
60
60
|
/>
|
|
@@ -83,7 +83,7 @@ const lazyBinding: vLazyImgBindingValue = {
|
|
|
83
83
|
<template>
|
|
84
84
|
<img
|
|
85
85
|
v-lazy-img="lazyBinding"
|
|
86
|
-
style="background-color: var(--maz-surface-300); width: 80%;"
|
|
86
|
+
style="background-color: var(--maz-color-surface-300); width: 80%;"
|
|
87
87
|
class="flex flex-center rounded"
|
|
88
88
|
>
|
|
89
89
|
</template>
|
|
@@ -129,7 +129,7 @@ app.mount('#app')
|
|
|
129
129
|
|
|
130
130
|
### Nuxt
|
|
131
131
|
|
|
132
|
-
Please refer to the [Nuxt module documentation](./../
|
|
132
|
+
Please refer to the [Nuxt module documentation](./../ecosystem/nuxt.md) for more information.
|
|
133
133
|
|
|
134
134
|
## Types
|
|
135
135
|
|
|
@@ -400,6 +400,29 @@ The `offset` (in px) option allows you to adjust the position of the tooltip rel
|
|
|
400
400
|
</template>
|
|
401
401
|
</ComponentDemo>
|
|
402
402
|
|
|
403
|
+
## Conditionally disable
|
|
404
|
+
|
|
405
|
+
Pass `false`, `null` or `undefined` as the binding value to silently disable the tooltip — no popover instance is created, no listeners are attached, and no warning is logged. This is the recommended way to skip the tooltip on the fly without conditionally rendering two different elements:
|
|
406
|
+
|
|
407
|
+
```vue
|
|
408
|
+
<script lang="ts" setup>
|
|
409
|
+
import { vTooltip } from 'maz-ui/directives'
|
|
410
|
+
import { computed, ref } from 'vue'
|
|
411
|
+
|
|
412
|
+
const label = ref<string>('')
|
|
413
|
+
const tooltipBinding = computed(() => label.value ? { text: label.value } : false)
|
|
414
|
+
</script>
|
|
415
|
+
|
|
416
|
+
<template>
|
|
417
|
+
<!-- When label is empty the directive becomes a no-op -->
|
|
418
|
+
<MazBtn v-tooltip="tooltipBinding">
|
|
419
|
+
Hover me
|
|
420
|
+
</MazBtn>
|
|
421
|
+
</template>
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
If the binding switches back to a valid value later, the tooltip mounts as expected. Toggling the value off again destroys the existing popover instance.
|
|
425
|
+
|
|
403
426
|
## Global install
|
|
404
427
|
|
|
405
428
|
### Vue
|
|
@@ -421,7 +444,7 @@ app.mount('#app')
|
|
|
421
444
|
|
|
422
445
|
### Nuxt
|
|
423
446
|
|
|
424
|
-
Please refer to the [Nuxt module documentation](./../
|
|
447
|
+
Please refer to the [Nuxt module documentation](./../ecosystem/nuxt.md) for more information.
|
|
425
448
|
|
|
426
449
|
## Types
|
|
427
450
|
|