Add asChild demo

pull/6011/head
Cagatay Civici 2024-07-02 12:18:05 +03:00
parent 6e68d15595
commit f85d3a5c1c
4 changed files with 102 additions and 41 deletions

View File

@ -0,0 +1,71 @@
<template>
<DocSectionText v-bind="$attrs">
<p>Headless mode is enabled by adding the <i>asChild</i> property and defining your own UI element with the available bindings.</p>
</DocSectionText>
<div class="card flex justify-center">
<Button v-slot="slotProps" asChild>
<button
v-bind="slotProps.a11yAttrs"
class="rounded-lg bg-gradient-to-br from-primary-400 to-primary-700 active:from-primary-700 active:to-primary-900 text-white border-none px-6 py-3 font-bold hover:ring-2 cursor-pointer ring-offset-2 ring-offset-surface-0 dark:ring-offset-surface-900 ring-primary transition-all"
>
SIGN UP
</button>
</Button>
</div>
<DocSectionCode :code="code" />
</template>
<script>
export default {
data() {
return {
code: {
basic: `
<Button v-slot="slotProps" asChild>
<button
v-bind="slotProps.a11yAttrs"
class="rounded-lg bg-gradient-to-br from-primary-400 to-primary-700 active:from-primary-700 active:to-primary-900 text-white border-none px-6 py-3 font-bold hover:ring-2 cursor-pointer ring-offset-2 ring-offset-surface-0 dark:ring-offset-surface-900 ring-primary transition-all"
>
SIGN UP
</button>
</Button>
`,
options: `
<template>
<div class="card flex justify-center">
<Button v-slot="slotProps" asChild>
<button
v-bind="slotProps.a11yAttrs"
class="rounded-lg bg-gradient-to-br from-primary-400 to-primary-700 active:from-primary-700 active:to-primary-900 text-white border-none px-6 py-3 font-bold hover:ring-2 cursor-pointer ring-offset-2 ring-offset-surface-0 dark:ring-offset-surface-900 ring-primary transition-all"
>
SIGN UP
</button>
</Button>
</div>
</template>
<script>
<\/script>
`,
composition: `
<template>
<div class="card flex justify-center">
<Button v-slot="slotProps" asChild>
<button
v-bind="slotProps.a11yAttrs"
class="rounded-lg bg-gradient-to-br from-primary-400 to-primary-700 active:from-primary-700 active:to-primary-900 text-white border-none px-6 py-3 font-bold hover:ring-2 cursor-pointer ring-offset-2 ring-offset-surface-0 dark:ring-offset-surface-900 ring-primary transition-all"
>
SIGN UP
</button>
</Button>
</div>
</template>
<script setup>
<\/script>
`
}
};
}
};
</script>

View File

@ -2,15 +2,15 @@
<DocSectionText v-bind="$attrs"> <DocSectionText v-bind="$attrs">
<p>Icon of a button is specified with <i>icon</i> property and position is configured using <i>iconPos</i> attribute.</p> <p>Icon of a button is specified with <i>icon</i> property and position is configured using <i>iconPos</i> attribute.</p>
</DocSectionText> </DocSectionText>
<div class="card flex items-center gap-4 justify-center"> <div class="card flex flex-col items-center gap-4">
<div class="flex flex-wrap gap-4 justify-center"> <div class="flex flex-wrap gap-4 justify-center">
<Button icon="pi pi-home" aria-label="Save" /> <Button icon="pi pi-home" aria-label="Save" />
<Button label="Profile" icon="pi pi-user" /> <Button label="Profile" icon="pi pi-user" />
<Button label="Save" icon="pi pi-check" iconPos="right" /> <Button label="Save" icon="pi pi-check" iconPos="right" />
</div> </div>
<div class="flex flex-wrap gap-4 justify-center"> <div class="flex flex-wrap gap-4 justify-center">
<Button label="Search" icon="pi pi-search" iconPos="top" text /> <Button label="Search" icon="pi pi-search" iconPos="top" />
<Button label="Update" icon="pi pi-refresh" iconPos="bottom" text /> <Button label="Update" icon="pi pi-refresh" iconPos="bottom" />
</div> </div>
</div> </div>
<DocSectionCode :code="code" /> <DocSectionCode :code="code" />
@ -25,20 +25,20 @@ export default {
<Button icon="pi pi-home" aria-label="Save" /> <Button icon="pi pi-home" aria-label="Save" />
<Button label="Profile" icon="pi pi-user" /> <Button label="Profile" icon="pi pi-user" />
<Button label="Save" icon="pi pi-check" iconPos="right" /> <Button label="Save" icon="pi pi-check" iconPos="right" />
<Button label="Search" icon="pi pi-search" iconPos="top" text /> <Button label="Search" icon="pi pi-search" iconPos="top" />
<Button label="Update" icon="pi pi-refresh" iconPos="bottom" text /> <Button label="Update" icon="pi pi-refresh" iconPos="bottom" />
`, `,
options: ` options: `
<template> <template>
<div class="card flex items-center gap-4 justify-center"> <div class="card flex flex-col items-center gap-4">
<div class="flex flex-wrap gap-4 justify-center"> <div class="flex flex-wrap gap-4 justify-center">
<Button icon="pi pi-home" aria-label="Save" /> <Button icon="pi pi-home" aria-label="Save" />
<Button label="Profile" icon="pi pi-user" /> <Button label="Profile" icon="pi pi-user" />
<Button label="Save" icon="pi pi-check" iconPos="right" /> <Button label="Save" icon="pi pi-check" iconPos="right" />
</div> </div>
<div class="flex flex-wrap gap-4 justify-center"> <div class="flex flex-wrap gap-4 justify-center">
<Button label="Search" icon="pi pi-search" iconPos="top" text /> <Button label="Search" icon="pi pi-search" iconPos="top" />
<Button label="Update" icon="pi pi-refresh" iconPos="bottom" text /> <Button label="Update" icon="pi pi-refresh" iconPos="bottom" />
</div> </div>
</div> </div>
</template> </template>
@ -48,15 +48,15 @@ export default {
`, `,
composition: ` composition: `
<template> <template>
<div class="card flex items-center gap-4 justify-center"> <div class="card flex flex-col items-center gap-4">
<div class="flex flex-wrap gap-4 justify-center"> <div class="flex flex-wrap gap-4 justify-center">
<Button icon="pi pi-home" aria-label="Save" /> <Button icon="pi pi-home" aria-label="Save" />
<Button label="Profile" icon="pi pi-user" /> <Button label="Profile" icon="pi pi-user" />
<Button label="Save" icon="pi pi-check" iconPos="right" /> <Button label="Save" icon="pi pi-check" iconPos="right" />
</div> </div>
<div class="flex flex-wrap gap-4 justify-center"> <div class="flex flex-wrap gap-4 justify-center">
<Button label="Search" icon="pi pi-search" iconPos="top" text /> <Button label="Search" icon="pi pi-search" iconPos="top" />
<Button label="Update" icon="pi pi-refresh" iconPos="bottom" text /> <Button label="Update" icon="pi pi-refresh" iconPos="bottom" />
</div> </div>
</div> </div>
</template> </template>

View File

@ -1,15 +1,11 @@
<template> <template>
<DocSectionText v-bind="$attrs"> <DocSectionText v-bind="$attrs">
<p>A button can be displayed as a link element when the <i>link</i> property is present. If you need to use buttons for navigation, wrap the button inside a component like <i>NuxtLink</i> or <i>router-link</i> depending on your router.</p> <p>The button element can be displayed as a link element visually when the <i>link</i> property is present. If you need to use buttons for actual navigations, use the <i>as</i> property to customize the rendered element.</p>
</DocSectionText> </DocSectionText>
<div class="card flex justify-center gap-4"> <div class="card flex justify-center gap-4">
<Button label="Link" link /> <Button label="Link" link />
<NuxtLink to="https://vuejs.org/" target="_blank" rel="noopener" tabindex="-1"> <Button as="a" label="External" href="https://vuejs.org/" target="_blank" rel="noopener" />
<Button label="External" /> <Button as="router-link" label="Router" to="/" />
</NuxtLink>
<router-link to="/" target="_blank" rel="noopener" tabindex="-1">
<Button label="Router" />
</router-link>
</div> </div>
<DocSectionCode :code="code" /> <DocSectionCode :code="code" />
</template> </template>
@ -21,23 +17,15 @@ export default {
code: { code: {
basic: ` basic: `
<Button label="Link" link /> <Button label="Link" link />
<NuxtLink to="https://vuejs.org/" target="_blank" rel="noopener"> <Button as="a" label="External" href="https://vuejs.org/" target="_blank" rel="noopener" />
<Button label="External" /> <Button as="router-link" label="Router" to="/" />
</NuxtLink>
<router-link to="/" target="_blank" rel="noopener">
<Button label="Router" />
</router-link>
`, `,
options: ` options: `
<template> <template>
<div class="card flex justify-center gap-4"> <div class="card flex justify-center gap-4">
<Button label="Link" link /> <Button label="Link" link />
<NuxtLink to="https://vuejs.org/" target="_blank" rel="noopener"> <Button as="a" label="External" href="https://vuejs.org/" target="_blank" rel="noopener" />
<Button label="External" /> <Button as="router-link" label="Router" to="/" />
</NuxtLink>
<router-link to="/" target="_blank" rel="noopener">
<Button label="Router" />
</router-link>
</div> </div>
</template> </template>
@ -48,12 +36,8 @@ export default {
<template> <template>
<div class="card flex justify-center gap-4"> <div class="card flex justify-center gap-4">
<Button label="Link" link /> <Button label="Link" link />
<NuxtLink to="https://vuejs.org/" target="_blank" rel="noopener"> <Button as="a" label="External" href="https://vuejs.org/" target="_blank" rel="noopener" />
<Button label="External" /> <Button as="router-link" label="Router" to="/" />
</NuxtLink>
<router-link to="/" target="_blank" rel="noopener">
<Button label="Router" />
</router-link>
</div> </div>
</template> </template>

View File

@ -16,6 +16,7 @@ import BadgeDoc from '@/doc/button/BadgeDoc.vue';
import BasicDoc from '@/doc/button/BasicDoc.vue'; import BasicDoc from '@/doc/button/BasicDoc.vue';
import ButtonGroupDoc from '@/doc/button/ButtonGroupDoc.vue'; import ButtonGroupDoc from '@/doc/button/ButtonGroupDoc.vue';
import DisabledDoc from '@/doc/button/DisabledDoc.vue'; import DisabledDoc from '@/doc/button/DisabledDoc.vue';
import HeadlessDoc from '@/doc/button/HeadlessDoc.vue';
import IconOnlyDoc from '@/doc/button/IconOnlyDoc.vue'; import IconOnlyDoc from '@/doc/button/IconOnlyDoc.vue';
import IconsDoc from '@/doc/button/IconsDoc.vue'; import IconsDoc from '@/doc/button/IconsDoc.vue';
import ImportDoc from '@/doc/button/ImportDoc.vue'; import ImportDoc from '@/doc/button/ImportDoc.vue';
@ -46,11 +47,6 @@ export default {
label: 'Basic', label: 'Basic',
component: BasicDoc component: BasicDoc
}, },
{
id: 'link',
label: 'Link',
component: LinkDoc
},
{ {
id: 'icons', id: 'icons',
label: 'Icons', label: 'Icons',
@ -61,6 +57,11 @@ export default {
label: 'Loading', label: 'Loading',
component: LoadingDoc component: LoadingDoc
}, },
{
id: 'link',
label: 'Link',
component: LinkDoc
},
{ {
id: 'severity', id: 'severity',
label: 'Severity', label: 'Severity',
@ -121,6 +122,11 @@ export default {
label: 'Template', label: 'Template',
component: TemplateDoc component: TemplateDoc
}, },
{
id: 'headless',
label: 'Headless',
component: HeadlessDoc
},
{ {
id: 'accessibility', id: 'accessibility',
label: 'Accessibility', label: 'Accessibility',