{{ variant }}
-{{ variant }}
+Model Value: {{ value }}- `, -}); - -export const Default = Template.bind({}); -Default.args = {}; - -export const Multiple = Template.bind({}); -Multiple.args = { - multiple: true, -}; - -export const Label = Template.bind({}); -Label.args = { - label: 'Label', -}; - -export const EmptyText = Template.bind({}); -EmptyText.args = { - emptyText: 'No results found.', -}; - -export const Hint = Template.bind({}); -Hint.args = { - hint: 'This is a hint', -}; - -export const Error = Template.bind({}); -Error.args = { - error: true, - errorMessage: 'This is an error message.', -}; - -export const Disabled = Template.bind({}); -Disabled.args = { - disabled: true, -}; - -export const Shadow = Template.bind({}); -Shadow.args = { - shadow: true, -}; - -export const Clearable = Template.bind({}); -Clearable.args = { - clearable: true, -}; - -export const SelectionItemProps = Template.bind({}); -SelectionItemProps.args = { - selectionItemProps: { - outlined: true, - }, - multiple: true, -}; - -export const Slots: Story
Model Value: {{ value }}+ `, +}); + +export const Default = Template.bind({}); +Default.args = {}; + +export const Multiple = Template.bind({}); +Multiple.args = { + multiple: true, +}; + +export const Label = Template.bind({}); +Label.args = { + label: 'Label', +}; + +export const EmptyText = Template.bind({}); +EmptyText.args = { + emptyText: 'No results found.', +}; + +export const Hint = Template.bind({}); +Hint.args = { + hint: 'This is a hint', +}; + +export const Error = Template.bind({}); +Error.args = { + error: true, + errorMessage: 'This is an error message.', +}; + +export const Disabled = Template.bind({}); +Disabled.args = { + disabled: true, +}; + +export const Shadow = Template.bind({}); +Shadow.args = { + shadow: true, +}; + +export const Clearable = Template.bind({}); +Clearable.args = { + clearable: true, +}; + +export const SelectionItemProps = Template.bind({}); +SelectionItemProps.args = { + selectionItemProps: { + outlined: true, + }, + multiple: true, +}; + +export const Slots: Story
-
+
Default
diff --git a/packages/badge/src/VBadge.vue b/packages/ui/src/badge/src/VBadge.vue similarity index 98% rename from packages/badge/src/VBadge.vue rename to packages/ui/src/badge/src/VBadge.vue index b2dd11cf4..9c285cc17 100644 --- a/packages/badge/src/VBadge.vue +++ b/packages/ui/src/badge/src/VBadge.vue @@ -1,6 +1,6 @@ - - -{{ variant }}
-{{ variant }}
+lorem ipsum body
-lorem ipsum body
-With to
props
With to
props. As NuxtLink
.
As anchor with target="_blank"
As anchor with target="_blank"
and rel
As DummyLink
VCardBody
- Bodyless with VCardHeader
VCardBody
- Bodyless with VCardFooter
lorem ipsum body
+lorem ipsum body
+With to
props
With to
props. As NuxtLink
.
As anchor with target="_blank"
As anchor with target="_blank"
and rel
As DummyLink
VCardBody
+ Bodyless with VCardHeader
VCardBody
+ Bodyless with VCardFooter
Selected: {{selected}}- `, -}); - -export const WithButtonTrigger: StoryFn = (args) => ({ - setup() { - const isOpen = ref(false) - const selected = ref() - return {args, selected, isOpen}; - }, - components: { - VCommand, - VBtn - }, - template: ` -
Selected: {{selected}}- `, -}); - -export const ListProps: StoryFn = (args) => ({ - setup() { - return {args}; - }, - components: { - VCommand, - VBtn - }, - template: ` -
Selected: {{selected}}+ `, +}); + +export const WithButtonTrigger: StoryFn = (args) => ({ + setup() { + const isOpen = ref(false) + const selected = ref() + return { args, selected, isOpen }; + }, + components: { + VCommand, + VBtn + }, + template: ` +
Selected: {{selected}}+ `, +}); + +export const ListProps: StoryFn = (args) => ({ + setup() { + return { args }; + }, + components: { + VCommand, + VBtn + }, + template: ` +
prepend
slotappend
slotVDropdownButton
- DropdownButton
as VBtn
- VDropdownBtn
- DropdownButton
as VBtn
- DropdownButton
as VDropdownItem
- DropdownButton
as VDropdownHeader
- DropdownButton
as btn
- DropdownButton
as item
- DropdownButton
as header
- prepend
slotappend
slotVDropdownButton
+ DropdownButton
as VBtn
+ VDropdownBtn
+ DropdownButton
as VBtn
+ DropdownButton
as VDropdownItem
+ DropdownButton
as VDropdownHeader
+ DropdownButton
as btn
+ DropdownButton
as item
+ DropdownButton
as header
+
-
+
Value: {{ value }}- `, -}); - -export const Variants: StoryFn = (args) => ({ - components: {VCheckbox}, - setup() { - const value = ref(false); - return {args, value}; - }, - template: ` -
Model value: {{ single }}- -
Multiple
-Model value: {{ multiple }}- `, -}); - -export const Checkbox = Template.bind({}); -Checkbox.args = {}; -Checkbox.parameters = { - docs: { - source: { - code: `
Value: {{ value }}+ `, +}); + +export const Variants: StoryFn = (args) => ({ + components: { VCheckbox }, + setup() { + const value = ref(false); + return { args, value }; + }, + template: ` +
Model value: {{ single }}+ +
Multiple
+Model value: {{ multiple }}+ `, +}); + +export const Checkbox = Template.bind({}); +Checkbox.args = {}; +Checkbox.parameters = { + docs: { + source: { + code: `
-
+
Value: {{ value }}- `, -}); - -export const Variants: StoryFn = (args) => ({ - components: {VCheckbox}, - setup() { - const value = ref(false); - return {args, value}; - }, - template: ` -
Value: {{ value }}+ `, +}); + +export const Variants: StoryFn = (args) => ({ + components: { VCheckbox }, + setup() { + const value = ref(false); + return { args, value }; + }, + template: ` +
-
+
Model Value: {{ value }}- `, -}); - -export const Multiple = Default.bind({}); -Multiple.args = { - multiple: true, -}; - -export const Accept = Default.bind({}); -Accept.args = { - accept: 'image/*' -}; - -export const Error = Default.bind({}); -Error.args = { - error: true, - errorMessage: 'This field is required' -}; - -export const LabelAndHint = Default.bind({}); -LabelAndHint.args = { - label: 'File', - hint: 'Max 1MB. Only images are allowed.' -}; - -export const ButtonVariant = Default.bind({}); -ButtonVariant.args = { - variant: 'button', -}; - -export const VariantProps = Default.bind({}); -VariantProps.args = { - label: 'File', - variantProps: { - hint: 'Max 1MB. Only images are allowed.' - } -}; - -export const CustomSlot: Story<{}> = (args) => ({ - components: { - FileInput, - VBtn - }, - setup() { - const value = ref() - return {args, value}; - }, - template: ` -
Model Value: {{ value }}- `, -}); - -export const FormValidation: Story<{}> = (args) => ({ - components: { - FileInput, - VBtn, - Field, - FileInputField - }, - setup() { - const {handleSubmit, values, errors, resetForm} = useForm({ - validationSchema: object({ - files: array() - .required() - .test('fileSize', 'File too large. Max 1MB.', (value) => { - if (!value?.[0]) return true; - - return value?.[0]?.size < 1000000; - }) - .label('File'), - avatar: array() - .required() - .test('fileSize', 'File too large. Max 1MB.', (value) => { - if (!value?.[0]) return true; - - return value?.[0]?.size < 1000000; - }) - .test('fileType', 'Unsupported Format', (value) => { - if (!value?.[0]) return true; - return value?.[0]?.type?.startsWith('image'); - }) - .label('Avatar') - }) - }); - const onSubmit = handleSubmit((values) => { - console.log(values) - }) - return {args, onSubmit, values, errors, resetForm}; - }, - template: ` - - `, -}); - -export const DefaultActivator: Story<{}> = (args) => ({ - components: { - FileInput, - VBtn, - FileInputDefaultActivator, - FileInputItem - }, - setup() { - const value = ref() - const disabled = ref(false) - return {args, value, disabled}; - }, - template: ` -
Model Value: {{ value }}- `, -}); - -export const ButtonActivator: Story<{}> = (args) => ({ - components: { - FileInput, - VBtn, - FileInputButtonActivator, - FileInputItems - }, - setup() { - const value = ref() - return {args, value}; - }, - template: ` -
- Max 1MB. Only images are allowed. -
- -Model Value: {{ value }}- `, +import type { Story, Meta } from '@storybook/vue3'; +import VBtn from '../../../button/src' +import { Field, useForm } from 'vee-validate'; +import { ref } from 'vue'; +import { array, object } from 'yup'; +import FileInput from './FileInput.vue'; +import FileInputField from './FileInputField.vue'; +import FileInputDefaultActivator from './FileInputDefaultActivator.vue'; +import FileInputButtonActivator from './FileInputButtonActivator.vue'; +import FileInputItem from './FileInputItem.vue'; +import FileInputItems from './FileInputItems.vue'; + +export default { + title: 'Experimental/Forms/FileInput', + component: FileInput, + subcomponents: { FileInputField, FileInputDefaultActivator }, +} as Meta; + +export const Default: Story<{}> = (args) => ({ + components: { + FileInput, + VBtn + }, + setup() { + const value = ref() + return { args, value }; + }, + template: ` +
Model Value: {{ value }}+ `, +}); + +export const Multiple = Default.bind({}); +Multiple.args = { + multiple: true, +}; + +export const Accept = Default.bind({}); +Accept.args = { + accept: 'image/*' +}; + +export const Error = Default.bind({}); +Error.args = { + error: true, + errorMessage: 'This field is required' +}; + +export const LabelAndHint = Default.bind({}); +LabelAndHint.args = { + label: 'File', + hint: 'Max 1MB. Only images are allowed.' +}; + +export const ButtonVariant = Default.bind({}); +ButtonVariant.args = { + variant: 'button', +}; + +export const VariantProps = Default.bind({}); +VariantProps.args = { + label: 'File', + variantProps: { + hint: 'Max 1MB. Only images are allowed.' + } +}; + +export const CustomSlot: Story<{}> = (args) => ({ + components: { + FileInput, + VBtn + }, + setup() { + const value = ref() + return { args, value }; + }, + template: ` +
Model Value: {{ value }}+ `, +}); + +export const FormValidation: Story<{}> = (args) => ({ + components: { + FileInput, + VBtn, + Field, + FileInputField + }, + setup() { + const { handleSubmit, values, errors, resetForm } = useForm({ + validationSchema: object({ + files: array() + .required() + .test('fileSize', 'File too large. Max 1MB.', (value) => { + if (!value?.[0]) return true; + + return value?.[0]?.size < 1000000; + }) + .label('File'), + avatar: array() + .required() + .test('fileSize', 'File too large. Max 1MB.', (value) => { + if (!value?.[0]) return true; + + return value?.[0]?.size < 1000000; + }) + .test('fileType', 'Unsupported Format', (value) => { + if (!value?.[0]) return true; + return value?.[0]?.type?.startsWith('image'); + }) + .label('Avatar') + }) + }); + const onSubmit = handleSubmit((values) => { + console.log(values) + }) + return { args, onSubmit, values, errors, resetForm }; + }, + template: ` + + `, +}); + +export const DefaultActivator: Story<{}> = (args) => ({ + components: { + FileInput, + VBtn, + FileInputDefaultActivator, + FileInputItem + }, + setup() { + const value = ref() + const disabled = ref(false) + return { args, value, disabled }; + }, + template: ` +
Model Value: {{ value }}+ `, +}); + +export const ButtonActivator: Story<{}> = (args) => ({ + components: { + FileInput, + VBtn, + FileInputButtonActivator, + FileInputItems + }, + setup() { + const value = ref() + return { args, value }; + }, + template: ` +
+ Max 1MB. Only images are allowed. +
+ +Model Value: {{ value }}+ `, }); \ No newline at end of file diff --git a/packages/forms/src/file-input/FileInput.vue b/packages/ui/src/forms/src/file-input/FileInput.vue similarity index 100% rename from packages/forms/src/file-input/FileInput.vue rename to packages/ui/src/forms/src/file-input/FileInput.vue diff --git a/packages/forms/src/file-input/FileInputButtonActivator.vue b/packages/ui/src/forms/src/file-input/FileInputButtonActivator.vue similarity index 89% rename from packages/forms/src/file-input/FileInputButtonActivator.vue rename to packages/ui/src/forms/src/file-input/FileInputButtonActivator.vue index 3e3323670..624c46f3a 100644 --- a/packages/forms/src/file-input/FileInputButtonActivator.vue +++ b/packages/ui/src/forms/src/file-input/FileInputButtonActivator.vue @@ -1,5 +1,5 @@ - - - - -
{{ dragText }}
-{{ hint }}
-{{ dragText }}
+{{ hint }}
+Model Value: {{ value }}- `, -}); - -export const Shadow = Template.bind({}); -Shadow.args = { - shadow: true, -}; -Shadow.parameters = { - docs: { - source: { - code: '', - }, - }, -}; - -export const Disabled = Template.bind({}); -Disabled.args = { - disabled: true, -}; -Disabled.parameters = { - docs: { - source: { - code: '', - }, - }, -}; - -export const Error = Template.bind({}); -Error.args = { - error: true, - errorMessage: 'Field is required', -}; - -export const Label = Template.bind({}); -Label.args = { - label: 'My Label', -}; -Label.parameters = { - docs: { - source: { - code: ``, - }, - }, -}; - -export const Hint = Template.bind({}); -Hint.args = { - label: 'Label', - hint: 'This is a hint', -}; -Hint.parameters = { - docs: { - source: { - code: ``, - }, - }, -}; - -export const Validation: StoryFn<{}> = (args) => ({ - components: {VBtn, SelectField}, - setup() { - const schema = object({ - genre: string().required().label('Genre'), - gender: string().required().label('Gender'), - }); - - const {handleSubmit, resetForm, values} = useForm({ - validationSchema: schema, - }); - - const onSubmit = handleSubmit((values) => { - alert(JSON.stringify(values)); - }); - - const genders = ref([ - { - text: 'Select Gender', - value: '', - disabled: true, - }, - { - text: 'Male', - value: 'male', - }, - { - text: 'Female', - value: 'female', - }, - ]); - - const genres = ref([ - { - text: 'Select Genre', - value: '', - disabled: true, - }, - { - text: 'Pop', - value: 'pop', - }, - { - text: 'Rock', - value: 'rock', - }, - ]); - - return {onSubmit, resetForm, values, genders, genres}; - }, - template: ` - -`, -}); - -export const DarkMode: StoryFn = (args) => ({ - components: {Select}, - setup() { - return {args}; - }, - template: ` -
Model Value: {{ value }}+ `, +}); + +export const Shadow = Template.bind({}); +Shadow.args = { + shadow: true, +}; +Shadow.parameters = { + docs: { + source: { + code: '', + }, + }, +}; + +export const Disabled = Template.bind({}); +Disabled.args = { + disabled: true, +}; +Disabled.parameters = { + docs: { + source: { + code: '', + }, + }, +}; + +export const Error = Template.bind({}); +Error.args = { + error: true, + errorMessage: 'Field is required', +}; + +export const Label = Template.bind({}); +Label.args = { + label: 'My Label', +}; +Label.parameters = { + docs: { + source: { + code: ``, + }, + }, +}; + +export const Hint = Template.bind({}); +Hint.args = { + label: 'Label', + hint: 'This is a hint', +}; +Hint.parameters = { + docs: { + source: { + code: ``, + }, + }, +}; + +export const Validation: StoryFn<{}> = (args) => ({ + components: { VBtn, SelectField }, + setup() { + const schema = object({ + genre: string().required().label('Genre'), + gender: string().required().label('Gender'), + }); + + const { handleSubmit, resetForm, values } = useForm({ + validationSchema: schema, + }); + + const onSubmit = handleSubmit((values) => { + alert(JSON.stringify(values)); + }); + + const genders = ref([ + { + text: 'Select Gender', + value: '', + disabled: true, + }, + { + text: 'Male', + value: 'male', + }, + { + text: 'Female', + value: 'female', + }, + ]); + + const genres = ref([ + { + text: 'Select Genre', + value: '', + disabled: true, + }, + { + text: 'Pop', + value: 'pop', + }, + { + text: 'Rock', + value: 'rock', + }, + ]); + + return { onSubmit, resetForm, values, genders, genres }; + }, + template: ` + +`, +}); + +export const DarkMode: StoryFn = (args) => ({ + components: { Select }, + setup() { + return { args }; + }, + template: ` +
-
+
Model Value: {{ value }}-`, -}); - -export const Colors: Story
Custom Classes:
-Rounded
-Custom Classes:
-Model Value: {{ value }}+`, +}); + +export const Colors: Story
Custom Classes:
+Rounded
+Custom Classes:
+Custom Classes:
-Rounded
-Custom Classes:
-Custom Classes:
+Rounded
+Custom Classes:
+
-
+
-
+
Model value: {{ value }}- `, -}); - -export const Hint: StoryFn = (args) => ({ - components: {VRadio}, - setup() { - const value = ref('1'); - return {args, value}; - }, - template: ` -
Model value: {{ value }}+ `, +}); + +export const Hint: StoryFn = (args) => ({ + components: { VRadio }, + setup() { + const value = ref('1'); + return { args, value }; + }, + template: ` +
-
+
-
+
-
+
Value: {{ value }}- `, -}); - -export const Label = Template.bind({}); -Label.args = {label: 'My Label'}; -Label.parameters = { - docs: { - source: { - code: '
{{ {values, errors} }}-`, -}); - -export const DarkMode: StoryFn = (args) => ({ - components: {VTextarea}, - setup() { - return {args}; - }, - template: ` -
Value: {{ value }}+ `, +}); + +export const Label = Template.bind({}); +Label.args = { label: 'My Label' }; +Label.parameters = { + docs: { + source: { + code: '
{{ {values, errors} }}+`, +}); + +export const DarkMode: StoryFn = (args) => ({ + components: { VTextarea }, + setup() { + return { args }; + }, + template: ` +
- {{ color.replace('bg-', '').replace('-500', '') }} - - {{ colors[color.replace('bg-', '').replace('-500', '')][500] }} - -
-+ {{ color.replace('bg-', '').replace('-500', '') }} + + {{ colors[color.replace('bg-', '').replace('-500', '')][500] }} + +
+{{ shadow }}
- {{ shadow }}
+
- {{ font }}
-
- Lorem ipsum dolor sit amet consectetur, adipisicing elit -
-
+ {{ font }}
+
+ Lorem ipsum dolor sit amet consectetur, adipisicing elit +
+{{ rounded }} ({{ remToPx(rounded) }})
- {{ rounded }} ({{ remToPx(rounded) }})
+ - Lorem ipsum dolor sit amet consectetur, adipisicing elit -
-- Lorem ipsum dolor sit amet consectetur, adipisicing elit -
-+ Lorem ipsum dolor sit amet consectetur, adipisicing elit +
++ Lorem ipsum dolor sit amet consectetur, adipisicing elit +
+Default Collection
-Morpheme Icons
-Non exist
-
- By default morpheme icons are cached and stored in local storage, but you can disable it by setting via no-cache
prop.
-
Default Collection
+Morpheme Icons
+Non exist
+
+ By default morpheme icons are cached and stored in local storage, but you can disable it by setting via no-cache
prop.
+
Default
-Small
-Dense
-Large
-Default
-With Context API
-- {{ user.email }} -
-- Apple ID, iCloud+, Media & Purchases -
-- Apple ID, iCloud+, Media & Purchases -
-Default
+Small
+Dense
+Large
+Default
+With Context API
++ {{ user.email }} +
++ Apple ID, iCloud+, Media & Purchases +
++ Apple ID, iCloud+, Media & Purchases +
+Are you sure want to delete this item?
-- Lorem ipsum dolor sit amet, consectetur adipiscing elit, - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi - ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit - in voluptate velit esse cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, - sunt in culpa qui officia deserunt mollit anim id est laborum. -
- -Lorem ipsum dolor sit amet, consectetur adipiscing elit
-Are you sure want to delete this item?
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi + ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit + in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + Excepteur sint occaecat cupidatat non proident, + sunt in culpa qui officia deserunt mollit anim id est laborum. +
+ +Lorem ipsum dolor sit amet, consectetur adipiscing elit
+
-
+
Hello World
-- Fixed NavDrawer -
-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Curabitur consequat facilisis purus ac consectetur. - Cras interdum nisi vitae metus pharetra dignissim. - Curabitur pulvinar ex purus, id ultrices ligula dictum at. - Integer ac libero dui. Vivamus posuere molestie enim in tempus. - Sed neque arcu, pharetra non laoreet a, efficitur id leo. - Nullam facilisis massa velit, ut sollicitudin magna elementum quis. - Donec pharetra efficitur turpis, nec ultrices leo. - Quisque placerat, dolor sit amet eleifend cursus, libero nisi - feugiat urna, a sodales quam eros id massa. - Nulla tristique neque quis turpis luctus tincidunt. - Vestibulum bibendum lobortis orci, eget semper diam ultricies a. - Nunc in nunc lacus. -
-- Sticky NavDrawer -
-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Curabitur consequat facilisis purus ac consectetur. - Cras interdum nisi vitae metus pharetra dignissim. - Curabitur pulvinar ex purus, id ultrices ligula dictum at. - Integer ac libero dui. Vivamus posuere molestie enim in tempus. - Sed neque arcu, pharetra non laoreet a, efficitur id leo. - Nullam facilisis massa velit, ut sollicitudin magna elementum quis. - Donec pharetra efficitur turpis, nec ultrices leo. - Quisque placerat, dolor sit amet eleifend cursus, libero nisi - feugiat urna, a sodales quam eros id massa. - Nulla tristique neque quis turpis luctus tincidunt. - Vestibulum bibendum lobortis orci, eget semper diam ultricies a. - Nunc in nunc lacus. -
-- Toggle (v-model) -
-- Mini -
-- Expand on Hover -
-- Right NavDrawer + Transition -
- -- NavDrawer + Transition -
-{{ color }}
-Bordered
-- {{ height }} -
-- Custom Prop: 200px -
-- With custom class: h-[200px] -
-- Custom Class: h-[calc(100vh-100px)] -
-- Bottom Drawer -
-- Top Drawer -
-- Hover on the edge to resize -
-Hello World
++ Fixed NavDrawer +
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Curabitur consequat facilisis purus ac consectetur. + Cras interdum nisi vitae metus pharetra dignissim. + Curabitur pulvinar ex purus, id ultrices ligula dictum at. + Integer ac libero dui. Vivamus posuere molestie enim in tempus. + Sed neque arcu, pharetra non laoreet a, efficitur id leo. + Nullam facilisis massa velit, ut sollicitudin magna elementum quis. + Donec pharetra efficitur turpis, nec ultrices leo. + Quisque placerat, dolor sit amet eleifend cursus, libero nisi + feugiat urna, a sodales quam eros id massa. + Nulla tristique neque quis turpis luctus tincidunt. + Vestibulum bibendum lobortis orci, eget semper diam ultricies a. + Nunc in nunc lacus. +
++ Sticky NavDrawer +
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Curabitur consequat facilisis purus ac consectetur. + Cras interdum nisi vitae metus pharetra dignissim. + Curabitur pulvinar ex purus, id ultrices ligula dictum at. + Integer ac libero dui. Vivamus posuere molestie enim in tempus. + Sed neque arcu, pharetra non laoreet a, efficitur id leo. + Nullam facilisis massa velit, ut sollicitudin magna elementum quis. + Donec pharetra efficitur turpis, nec ultrices leo. + Quisque placerat, dolor sit amet eleifend cursus, libero nisi + feugiat urna, a sodales quam eros id massa. + Nulla tristique neque quis turpis luctus tincidunt. + Vestibulum bibendum lobortis orci, eget semper diam ultricies a. + Nunc in nunc lacus. +
++ Toggle (v-model) +
++ Mini +
++ Expand on Hover +
++ Right NavDrawer + Transition +
+ ++ NavDrawer + Transition +
+{{ color }}
+Bordered
++ {{ height }} +
++ Custom Prop: 200px +
++ With custom class: h-[200px] +
++ Custom Class: h-[calc(100vh-100px)] +
++ Bottom Drawer +
++ Top Drawer +
++ Hover on the edge to resize +
+Popover content
-Popover content
-Popover content
-Popover content
-Popover content
-- Morpheme UI is a free and open-source Vue UI Library based on Morpheme Design System -
-- Learn more about Morpheme UI -
-- Learn how to install Morpheme UI -
-- Learn more about Morpheme UI typography -
-- Learn more about Morpheme UI -
-- Learn more about Morpheme UI -
-- Learn more about Morpheme UI -
-- Learn more about Morpheme UI -
-- Learn more about Morpheme UI -
-- Learn more about Morpheme UI -
-Popover content
+Popover content
+Popover content
+Popover content
+Popover content
++ Morpheme UI is a free and open-source Vue UI Library based on Morpheme Design System +
++ Learn more about Morpheme UI +
++ Learn how to install Morpheme UI +
++ Learn more about Morpheme UI typography +
++ Learn more about Morpheme UI +
++ Learn more about Morpheme UI +
++ Learn more about Morpheme UI +
++ Learn more about Morpheme UI +
++ Learn more about Morpheme UI +
++ Learn more about Morpheme UI +
+