1
0
Fork 0
forked from ofs/fensir

feat: layouting form and linting elements

This commit is contained in:
Konrad Geletey 2024-12-21 21:51:54 +03:00
parent ab17a1c40a
commit 80361ac31f
Signed by: kglt
GPG key ID: 386DEE24B60BD996
14 changed files with 109 additions and 35 deletions

View file

@ -2,9 +2,9 @@
</script> </script>
<template> <template>
<button class="primary"> <button class="primary">
Sign in <slot />
</button> </button>
</template> </template>
<style scoped> <style scoped>

View file

@ -1,7 +1,7 @@
<template> <template>
<div class="card"> <div class="card">
<slot /> <slot />
</div> </div>
</template> </template>
<style> <style>

View file

@ -29,6 +29,11 @@ const formSchema = [{
label: "Server address", label: "Server address",
name: "server-address", name: "server-address",
as: "input", as: "input",
}, {
label: "Choose a zod schema for data",
name: "types",
as: "input",
asType: "file",
}, { }, {
label: "Price (per request)", label: "Price (per request)",
name: "price", name: "price",
@ -61,5 +66,32 @@ const formSchema = [{
form { form {
display: grid; display: grid;
color: var(--primary); color: var(--primary);
background: var(--darken);
width: 30vw;
gap: 20px;
padding: 20px 40px;
}
form > h3 {
font-size: 24px;
justify-self: center;
}
div.form-field {
font-size: 16px;
display: inline-grid;
gap: 5px;
}
div.form-field:has(input[type='radio']) {
justify-content: start;
grid-template-areas: "b a";
gap: 10px;
& :deep(input) {
grid-area: b;
}
& :deep(label) {
grid-area: a;
}
} }
</style> </style>

View file

@ -1,6 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive } from "vue" import { reactive } from "vue"
import Input from "@/components/Input.vue" import Input from "@/components/Input.vue"
import Textarea from "@/components/Textarea.vue"
const props = defineProps<{ const props = defineProps<{
schema: object schema: object
@ -10,16 +11,19 @@ const field = reactive(props.schema)
</script> </script>
<template> <template>
<label v-if="field.label" :for="field.name">{{ field.label }}</label> <div class="form-field">
<Input <label v-if="field.label" :for="field.name">{{ field.label }}</label>
v-if="field.as === 'input'" :id="field.name" <Input
:name="field.name" :type="field.asType || 'text'" v-if="field.as === 'input'" :id="field.name"
:value="field.defaultValue" :name="field.name" :type="field.asType || 'text'"
/> :value="field.defaultValue"
<textarea />
v-if="field.as === 'textarea'" <Textarea
:name="field.name" v-if="field.as === 'textarea'"
/> maxlength="250"
:name="field.name"
/>
</div>
</template> </template>
<style scoped> <style scoped>

View file

@ -1,3 +1,11 @@
<script setup lang="ts">
const inputModel = defineModel()
</script>
<template> <template>
<input class="test" /> <input v-model="inputModel">
</template> </template>
<style scoped>
@import url("@/styles/components/inputs.css")
</style>

View file

@ -1,20 +1,20 @@
<script setup lang="ts"> <script setup lang="ts">
import CarbonArrowRight from '@/icons/CarbonArrowRight.vue' import CarbonArrowRight from "@/icons/CarbonArrowRight.vue"
import CarbonRecentlyView from '@/icons/CarbonRecentlyViewed.vue' import CarbonRecentlyView from "@/icons/CarbonRecentlyViewed.vue"
</script> </script>
<template> <template>
<fieldset class="search"> <fieldset class="search">
<div class="search__context"> <div class="search__context">
<span class="search__context-title"> context: </span> <span class="search__context-title"> context: </span>
<span class="search__context-item"> global </span> <span class="search__context-item"> global </span>
</div> </div>
<input type="search" /> <input type="search">
<div class="search__buttons"> <div class="search__buttons">
<CarbonRecentlyView class="icon" /> <CarbonRecentlyView class="icon" />
<CarbonArrowRight class="icon" /> <CarbonArrowRight class="icon" />
</div> </div>
</fieldset> </fieldset>
</template> </template>
<style scoped> <style scoped>

View file

@ -0,0 +1,15 @@
<script setup lang="ts">
const inputModel = defineModel()
</script>
<template>
<textarea v-model="inputModel" />
</template>
<style scoped>
@import url("@/styles/components/inputs.css");
textarea {
resize: none;
}
</style>

View file

@ -1,3 +1,3 @@
<template> <template>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="M17 15V5h-2v10H5v2h10v10h2V17h10v-2z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="M17 15V5h-2v10H5v2h10v10h2V17h10v-2z" /></svg>
</template> </template>

View file

@ -1,3 +1,3 @@
<template> <template>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="m18 6l-1.43 1.393L24.15 15H4v2h20.15l-7.58 7.573L18 26l10-10z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="m18 6l-1.43 1.393L24.15 15H4v2h20.15l-7.58 7.573L18 26l10-10z" /></svg>
</template> </template>

View file

@ -1,3 +1,3 @@
<template> <template>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="M10 6v2h12.59L6 24.59L7.41 26L24 9.41V22h2V6z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="M10 6v2h12.59L6 24.59L7.41 26L24 9.41V22h2V6z" /></svg>
</template> </template>

View file

@ -1,3 +1,3 @@
<template> <template>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="M20.59 22L15 16.41V7h2v8.58l5 5.01z"/><path fill="currentColor" d="M16 2A13.94 13.94 0 0 0 6 6.23V2H4v8h8V8H7.08A12 12 0 1 1 4 16H2A14 14 0 1 0 16 2"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="M20.59 22L15 16.41V7h2v8.58l5 5.01z" /><path fill="currentColor" d="M16 2A13.94 13.94 0 0 0 6 6.23V2H4v8h8V8H7.08A12 12 0 1 1 4 16H2A14 14 0 1 0 16 2" /></svg>
</template> </template>

View file

@ -1,3 +1,3 @@
<template> <template>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="m29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29ZM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="currentColor" d="m29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29ZM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9" /></svg>
</template> </template>

View file

@ -7,3 +7,9 @@ import ContextCreate from "@/components/ContextCreate.vue"
<ContextCreate /> <ContextCreate />
</Default> </Default>
<style>
:global(main) {
align-items: center;
justify-content: center;
}
</style>

View file

@ -0,0 +1,9 @@
input, textarea {
background: var(--black);
outline: 0;
border: 1px solid var(--shadow);
padding: 0.5rem 0.75rem;
&:hover {
border: 1px solid var(--accent);
}
}