create Button components

This commit is contained in:
kur0nek-o 2023-10-24 13:56:04 +07:00
parent 844995fc64
commit 43b8bd5bb1
7 changed files with 248 additions and 122 deletions

30
package-lock.json generated
View File

@ -12,6 +12,7 @@
"@headlessui/vue": "^1.7.16",
"@heroicons/vue": "^2.0.18",
"@lottiefiles/lottie-player": "^2.0.2",
"@phosphor-icons/vue": "^2.1.6",
"@types/uuid": "^9.0.2",
"devextreme": "23.1.5",
"devextreme-vue": "23.1.5",
@ -494,9 +495,9 @@
}
},
"node_modules/@babel/traverse": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz",
"integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==",
"version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
"integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.22.13",
@ -1148,6 +1149,17 @@
"integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
"dev": true
},
"node_modules/@phosphor-icons/vue": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/@phosphor-icons/vue/-/vue-2.1.6.tgz",
"integrity": "sha512-j4iVvNT4JbDR2udIVfakKZHd14i3jCvO4b24OC0W/1rasftU8qVg1Tnb3QDwAT0teNU+UxvaM+kCWxfGHC2dUg==",
"engines": {
"node": ">=14"
},
"peerDependencies": {
"vue": ">=3.2.39"
}
},
"node_modules/@pkgr/utils": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",
@ -8614,9 +8626,9 @@
}
},
"@babel/traverse": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz",
"integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==",
"version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
"integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.22.13",
@ -8998,6 +9010,12 @@
"integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
"dev": true
},
"@phosphor-icons/vue": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/@phosphor-icons/vue/-/vue-2.1.6.tgz",
"integrity": "sha512-j4iVvNT4JbDR2udIVfakKZHd14i3jCvO4b24OC0W/1rasftU8qVg1Tnb3QDwAT0teNU+UxvaM+kCWxfGHC2dUg==",
"requires": {}
},
"@pkgr/utils": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",

View File

@ -18,16 +18,17 @@
"@headlessui/vue": "^1.7.16",
"@heroicons/vue": "^2.0.18",
"@lottiefiles/lottie-player": "^2.0.2",
"@phosphor-icons/vue": "^2.1.6",
"@types/uuid": "^9.0.2",
"devextreme": "23.1.5",
"devextreme-vue": "23.1.5",
"dotenv": "^16.3.1",
"encrypt-storage": "^2.12.16",
"pinia": "^2.1.3",
"uuid": "^9.0.0",
"vue": "^3.3.4",
"vue-router": "^4.2.2",
"vue-tailwind-datepicker": "^1.4.5",
"encrypt-storage": "^2.12.16",
"dotenv": "^16.3.1"
"vue-tailwind-datepicker": "^1.4.5"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.5.1",
@ -57,4 +58,4 @@
"vitest": "^0.34.6",
"vue-tsc": "^1.6.5"
}
}
}

View File

@ -705,6 +705,40 @@ select {
--tw-backdrop-sepia: ;
}
.container {
width: 100%;
}
@media (min-width: 640px) {
.container {
max-width: 640px;
}
}
@media (min-width: 768px) {
.container {
max-width: 768px;
}
}
@media (min-width: 1024px) {
.container {
max-width: 1024px;
}
}
@media (min-width: 1280px) {
.container {
max-width: 1280px;
}
}
@media (min-width: 1536px) {
.container {
max-width: 1536px;
}
}
.sr-only {
position: absolute;
width: 1px;
@ -900,6 +934,10 @@ select {
margin-bottom: 2rem;
}
.me-1 {
margin-inline-end: 0.25rem;
}
.ml-1 {
margin-left: 0.25rem;
}
@ -1281,11 +1319,6 @@ select {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-y-12 {
--tw-translate-y: -3rem;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-y-2\/4 {
--tw-translate-y: -50%;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@ -1342,6 +1375,16 @@ select {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.animate-spin {
animation: spin 1s linear infinite;
}
.cursor-default {
cursor: default;
}
@ -1454,12 +1497,6 @@ select {
margin-bottom: calc(1rem * var(--tw-space-y-reverse));
}
.space-x-0 > :not([hidden]) ~ :not([hidden]) {
--tw-space-x-reverse: 0;
margin-right: calc(0px * var(--tw-space-x-reverse));
margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse)));
}
.divide-y > :not([hidden]) ~ :not([hidden]) {
--tw-divide-y-reverse: 0;
border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
@ -1522,10 +1559,6 @@ select {
border-radius: 0.75rem;
}
.rounded-2xl {
border-radius: 1rem;
}
.rounded-l-full {
border-top-left-radius: 9999px;
border-bottom-left-radius: 9999px;
@ -1615,6 +1648,11 @@ select {
border-color: rgb(249 250 251 / var(--tw-border-opacity));
}
.border-primary-500 {
--tw-border-opacity: 1;
border-color: rgb(3 91 113 / var(--tw-border-opacity));
}
.border-transparent {
border-color: transparent;
}
@ -1624,16 +1662,6 @@ select {
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
}
.bg-blue-100 {
--tw-bg-opacity: 1;
background-color: rgb(219 234 254 / var(--tw-bg-opacity));
}
.bg-blue-600 {
--tw-bg-opacity: 1;
background-color: rgb(37 99 235 / var(--tw-bg-opacity));
}
.bg-gray-100 {
--tw-bg-opacity: 1;
background-color: rgb(243 244 246 / var(--tw-bg-opacity));
@ -1664,11 +1692,6 @@ select {
background-color: rgb(17 24 39 / var(--tw-bg-opacity));
}
.bg-green-100 {
--tw-bg-opacity: 1;
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
}
.bg-green-400 {
--tw-bg-opacity: 1;
background-color: rgb(74 222 128 / var(--tw-bg-opacity));
@ -1684,16 +1707,6 @@ select {
background-color: rgb(243 247 249 / var(--tw-bg-opacity));
}
.bg-orange-100 {
--tw-bg-opacity: 1;
background-color: rgb(255 237 213 / var(--tw-bg-opacity));
}
.bg-orange-600 {
--tw-bg-opacity: 1;
background-color: rgb(234 88 12 / var(--tw-bg-opacity));
}
.bg-primary-100 {
--tw-bg-opacity: 1;
background-color: rgb(205 222 227 / var(--tw-bg-opacity));
@ -1753,16 +1766,6 @@ select {
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.bg-red-50 {
--tw-bg-opacity: 1;
background-color: rgb(255 229 229 / var(--tw-bg-opacity));
}
.bg-yellow-50 {
--tw-bg-opacity: 1;
background-color: rgb(255 255 229 / var(--tw-bg-opacity));
}
.bg-yellow-100 {
--tw-bg-opacity: 1;
background-color: rgb(255 255 204 / var(--tw-bg-opacity));
@ -1793,6 +1796,14 @@ select {
--tw-bg-opacity: 0.8;
}
.bg-none {
background-image: none;
}
.fill-gray-400 {
fill: #9ca3af;
}
.fill-gray-500 {
fill: #6b7280;
}
@ -1809,10 +1820,6 @@ select {
fill: #007b8d;
}
.fill-gray-400 {
fill: #9ca3af;
}
.p-1 {
padding: 0.25rem;
}
@ -1939,6 +1946,11 @@ select {
padding-bottom: 1rem;
}
.py-5 {
padding-top: 1.25rem;
padding-bottom: 1.25rem;
}
.py-6 {
padding-top: 1.5rem;
padding-bottom: 1.5rem;
@ -2136,11 +2148,6 @@ select {
color: rgb(96 165 250 / var(--tw-text-opacity));
}
.text-blue-600 {
--tw-text-opacity: 1;
color: rgb(37 99 235 / var(--tw-text-opacity));
}
.text-dark {
--tw-text-opacity: 1;
color: rgb(21 22 23 / var(--tw-text-opacity));
@ -2226,6 +2233,11 @@ select {
color: rgb(204 0 0 / var(--tw-text-opacity));
}
.text-secondary-600 {
--tw-text-opacity: 1;
color: rgb(0 123 141 / var(--tw-text-opacity));
}
.text-slate-600 {
--tw-text-opacity: 1;
color: rgb(71 85 105 / var(--tw-text-opacity));
@ -2256,11 +2268,6 @@ select {
color: rgb(153 153 0 / var(--tw-text-opacity));
}
.text-secondary-600 {
--tw-text-opacity: 1;
color: rgb(0 123 141 / var(--tw-text-opacity));
}
.text-opacity-100 {
--tw-text-opacity: 1;
}
@ -2287,6 +2294,10 @@ select {
opacity: 1;
}
.opacity-25 {
opacity: 0.25;
}
.opacity-30 {
opacity: 0.3;
}
@ -2295,6 +2306,10 @@ select {
opacity: 0.5;
}
.opacity-75 {
opacity: 0.75;
}
.shadow {
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
@ -2513,9 +2528,9 @@ select {
overflow-y: auto;
}
.hover\:bg-blue-700:hover {
--tw-bg-opacity: 1;
background-color: rgb(29 78 216 / var(--tw-bg-opacity));
.hover\:border-primary-500:hover {
--tw-border-opacity: 1;
border-color: rgb(3 91 113 / var(--tw-border-opacity));
}
.hover\:bg-gray-200:hover {
@ -2538,16 +2553,21 @@ select {
background-color: rgb(67 56 202 / var(--tw-bg-opacity));
}
.hover\:bg-orange-500:hover {
--tw-bg-opacity: 1;
background-color: rgb(249 115 22 / var(--tw-bg-opacity));
}
.hover\:bg-primary-100:hover {
--tw-bg-opacity: 1;
background-color: rgb(205 222 227 / var(--tw-bg-opacity));
}
.hover\:bg-primary-200:hover {
--tw-bg-opacity: 1;
background-color: rgb(154 189 198 / var(--tw-bg-opacity));
}
.hover\:bg-primary-600:hover {
--tw-bg-opacity: 1;
background-color: rgb(2 73 90 / var(--tw-bg-opacity));
}
.hover\:bg-red-500:hover {
--tw-bg-opacity: 1;
background-color: rgb(255 0 0 / var(--tw-bg-opacity));
@ -2558,21 +2578,11 @@ select {
background-color: rgb(2 73 90 / var(--tw-bg-opacity));
}
.hover\:bg-red-700:hover {
--tw-bg-opacity: 1;
background-color: rgb(153 0 0 / var(--tw-bg-opacity));
}
.hover\:bg-yellow-500:hover {
--tw-bg-opacity: 1;
background-color: rgb(255 255 0 / var(--tw-bg-opacity));
}
.hover\:bg-primary-500:hover {
--tw-bg-opacity: 1;
background-color: rgb(3 91 113 / var(--tw-bg-opacity));
}
.hover\:text-gray-500:hover {
--tw-text-opacity: 1;
color: rgb(107 114 128 / var(--tw-text-opacity));
@ -2662,16 +2672,16 @@ select {
--tw-ring-inset: inset;
}
.focus\:ring-blue-500:focus {
--tw-ring-opacity: 1;
--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
}
.focus\:ring-indigo-500:focus {
--tw-ring-opacity: 1;
--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));
}
.focus\:ring-primary-500:focus {
--tw-ring-opacity: 1;
--tw-ring-color: rgb(3 91 113 / var(--tw-ring-opacity));
}
.focus\:ring-vtd-primary-500:focus {
--tw-ring-opacity: 1;
--tw-ring-color: rgb(3 91 113 / var(--tw-ring-opacity));
@ -2682,11 +2692,6 @@ select {
--tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity));
}
.focus\:ring-primary-500:focus {
--tw-ring-opacity: 1;
--tw-ring-color: rgb(3 91 113 / var(--tw-ring-opacity));
}
.focus\:ring-opacity-10:focus {
--tw-ring-opacity: 0.1;
}
@ -2715,20 +2720,41 @@ select {
cursor: not-allowed;
}
.disabled\:border-primary-300:disabled {
--tw-border-opacity: 1;
border-color: rgb(104 157 170 / var(--tw-border-opacity));
}
.disabled\:bg-primary-200:disabled {
--tw-bg-opacity: 1;
background-color: rgb(154 189 198 / var(--tw-bg-opacity));
}
.disabled\:bg-primary-300:disabled {
--tw-bg-opacity: 1;
background-color: rgb(104 157 170 / var(--tw-bg-opacity));
}
.disabled\:bg-primary-400:disabled {
--tw-bg-opacity: 1;
background-color: rgb(53 124 141 / var(--tw-bg-opacity));
}
.disabled\:text-primary-300:disabled {
--tw-text-opacity: 1;
color: rgb(104 157 170 / var(--tw-text-opacity));
}
.disabled\:text-primary-400:disabled {
--tw-text-opacity: 1;
color: rgb(53 124 141 / var(--tw-text-opacity));
}
.group:hover .group-hover\:bg-primary-100 {
--tw-bg-opacity: 1;
background-color: rgb(205 222 227 / var(--tw-bg-opacity));
}
.group:hover .group-hover\:fill-gray-600 {
fill: #4b5563;
}
.group:hover .group-hover\:fill-gray-500 {
fill: #6b7280;
}
@ -3064,10 +3090,6 @@ select {
padding-right: 1.5rem;
}
.sm\:pb-6 {
padding-bottom: 1.5rem;
}
.sm\:text-left {
text-align: left;
}

View File

@ -33,22 +33,38 @@ const props = defineProps({
});
const buttonStyle = computed(() => {
if (props.styleType == 'filled') {
return 'hello'
switch (props.styleType) {
case 'filled':
return 'text-white border-transparent rounded-lg bg-primary-500 hover:bg-primary-600 focus:outline-0 disabled:bg-primary-200 disabled:text-primary-400'
case 'secondary':
return 'text-primary-500 bg-primary-50 border-transparent rounded-lg hover:bg-primary-200 focus:outline-0 disabled:bg-primary-300'
case 'outline':
return 'bg-none text-primary-500 border border-primary-500 rounded-lg disabled:border-primary-300 disabled:text-primary-300'
case 'text':
return 'bg-none text-primary-500 border border-transparent hover:border-primary-500 rounded-lg disabled:border-primary-300 disabled:text-primary-300'
}
})
</script>
<template>
<button :type="type" @click="onClick" :disabled="disabled"
:class="['px-4 py-2 mt-2 text-sm font-bold text-white border-transparent rounded-lg bg-primary-500 focus:outline-0 disabled:bg-primary-400', className]">
<slot></slot>
<span v-if="!isLoading">{{ label }}</span>
<button :type="type" @click="onClick" :disabled="isLoading ? true : disabled"
:class="['px-3 py-2 mt-2 text-sm font-semibold w-full', buttonStyle, className]">
<div class="flex items-center" v-if="!isLoading">
<span class="me-1">{{ label }}</span>
<slot></slot>
</div>
<span v-else>
<center>
<lottie-player autoplay loop mode="normal" src="https://assets2.lottiefiles.com/packages/lf20_lNbR6W7kY6.json"
style="height:1.2rem"></lottie-player>
<svg class="animate-spin h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none"
viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">
</path>
</svg>
</center>
</span>
</button>
</template>
</button></template>

View File

@ -69,7 +69,6 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { MagnifyingGlassIcon } from '@heroicons/vue/20/solid'
import { FolderIcon } from '@heroicons/vue/24/outline'
import {
Combobox,
ComboboxInput,

58
src/components/Input.vue Normal file
View File

@ -0,0 +1,58 @@
<script setup lang="ts">
import { ref } from 'vue'
const props = defineProps({
type: {
type: String as () => "text" | "password" | "select" | "textarea",
default: "text",
},
placeholder: {
type: String,
default: "",
},
value: {
type: String,
default: "",
},
disabled: {
type: Boolean,
default: false,
},
readonly: {
type: Boolean,
default: false,
},
className: {
type: String,
default: "",
}
})
const emit = defineEmits(['update:value'])
const updateValue = (event: Event) => {
const value = (event.target as HTMLInputElement).value;
emit('update:value', value)
}
const inputType = ref(props.type)
const switchInputType = () => {
inputType.value = inputType.value == 'password' ? 'text' : 'password'
}
</script>
<template>
<div :class="['relative w-full overflow-hidden rounded-lg bg-gray-50 ', className]">
<input autocomplete="off" :type="inputType" :placeholder="placeholder" :value="value"
:disabled="disabled" :readonly="readonly"
:class="['w-full px-4 py-2 text-sm leading-6 placeholder:text-gray-400 text-gray-900 border-0 border-transparent rounded-lg outline-0 bg-gray-50 focus:outline-0 focus:border-0 focus:ring-0']" />
<span @click="switchInputType" v-if="type == 'password'"
class="absolute top-0 bottom-0 right-0 mx-3 my-auto cursor-pointer h-fit">
<svg width="20" height="20" viewBox="0 0 20 20"
:class="[inputType == 'password' ? 'fill-gray-500' : 'fill-primary-500']">
<path
d="M19.3211 9.74688C19.2937 9.68516 18.632 8.21719 17.1609 6.74609C15.2008 4.78594 12.725 3.75 9.99999 3.75C7.27499 3.75 4.79921 4.78594 2.83905 6.74609C1.36796 8.21719 0.703118 9.6875 0.678899 9.74688C0.643362 9.82681 0.625 9.91331 0.625 10.0008C0.625 10.0883 0.643362 10.1748 0.678899 10.2547C0.706243 10.3164 1.36796 11.7836 2.83905 13.2547C4.79921 15.2141 7.27499 16.25 9.99999 16.25C12.725 16.25 15.2008 15.2141 17.1609 13.2547C18.632 11.7836 19.2937 10.3164 19.3211 10.2547C19.3566 10.1748 19.375 10.0883 19.375 10.0008C19.375 9.91331 19.3566 9.82681 19.3211 9.74688ZM9.99999 15C7.5953 15 5.49452 14.1258 3.75546 12.4023C3.0419 11.6927 2.43483 10.8836 1.95312 10C2.4347 9.11636 3.04179 8.30717 3.75546 7.59766C5.49452 5.87422 7.5953 5 9.99999 5C12.4047 5 14.5055 5.87422 16.2445 7.59766C16.9595 8.307 17.5679 9.11619 18.0508 10C17.4875 11.0516 15.0336 15 9.99999 15ZM9.99999 6.25C9.25831 6.25 8.53329 6.46993 7.9166 6.88199C7.29992 7.29404 6.81927 7.87971 6.53544 8.56494C6.25162 9.25016 6.17735 10.0042 6.32205 10.7316C6.46674 11.459 6.82389 12.1272 7.34834 12.6517C7.87279 13.1761 8.54097 13.5333 9.2684 13.6779C9.99583 13.8226 10.7498 13.7484 11.4351 13.4645C12.1203 13.1807 12.7059 12.7001 13.118 12.0834C13.5301 11.4667 13.75 10.7417 13.75 10C13.749 9.00576 13.3535 8.05253 12.6505 7.34949C11.9475 6.64645 10.9942 6.25103 9.99999 6.25ZM9.99999 12.5C9.50554 12.5 9.02219 12.3534 8.61107 12.0787C8.19994 11.804 7.87951 11.4135 7.69029 10.9567C7.50107 10.4999 7.45157 9.99723 7.54803 9.51227C7.64449 9.02732 7.88259 8.58186 8.23222 8.23223C8.58186 7.8826 9.02731 7.6445 9.51227 7.54804C9.99722 7.45157 10.4999 7.50108 10.9567 7.6903C11.4135 7.87952 11.804 8.19995 12.0787 8.61107C12.3534 9.0222 12.5 9.50555 12.5 10C12.5 10.663 12.2366 11.2989 11.7678 11.7678C11.2989 12.2366 10.663 12.5 9.99999 12.5Z" />
</svg>
</span>
</div>
</template>

View File

@ -3,5 +3,17 @@
</script>
<template>
<Button />
<div class="container mx-auto py-5">
<p>Default / filled</p>
<Button label="Button" className="mb-3 flex-1" />
<p>secondary</p>
<Button label="Button" styleType="secondary" className="mb-3" />
<p>outline</p>
<Button label="Button" styleType="outline" className="mb-3"/>
<p>text</p>
<Button label="Button" styleType="text" />
</div>
</template>