diff --git a/app/Member/MemberController.php b/app/Member/MemberController.php
index 3077cacf..624d31ec 100644
--- a/app/Member/MemberController.php
+++ b/app/Member/MemberController.php
@@ -22,7 +22,7 @@ class MemberController extends Controller
public $filter = [
'ausstand' => false,
- 'bill_kind' => false,
+ 'bill_kind' => null,
];
public function index(Request $request): Response {
diff --git a/resources/css/app.css b/resources/css/app.css
index b549e5dd..5dbd4f57 100644
--- a/resources/css/app.css
+++ b/resources/css/app.css
@@ -8,3 +8,4 @@
@import "table";
@import "sidebar";
@import "bool";
+@import "form";
diff --git a/resources/css/form.css b/resources/css/form.css
new file mode 100644
index 00000000..27edf281
--- /dev/null
+++ b/resources/css/form.css
@@ -0,0 +1,310 @@
+:root {
+ --h-field-sm: 23px;
+ --h-field-base: 35px;
+ --h-field-lg: 42px;
+ --m-field-sm: 0.2rem;
+ --m-field-base: 0.3rem;
+ --m-field-lg: 0.4rem;
+}
+.size-sm {
+ height: var(--h-field-sm);
+}
+.size-base {
+ height: var(--h-field-base);
+}
+.size-lg {
+ height: var(--h-field-lg);
+}
+
+.checkbox {
+ @apply flex flex-col relative cursor-pointer;
+ input[type="checkbox"] {
+ @apply invisible absolute;
+ & + span {
+ @apply transition-colors duration-300 flex items-center;
+ span {
+ @apply border-2 border-gray-800 relative rounded cursor-pointer flex flex-none justify-center items-center;
+ }
+ svg {
+ @apply text-white transition-opacity duration-300;
+ opacity: 0;
+ }
+ & + span {
+ a {
+ @apply text-primary-300;
+ }
+ }
+ }
+ &:checked + span svg {
+ opacity: 1;
+ }
+ }
+ &.size-sm {
+ height: auto;
+ input[type="checkbox"] {
+ & + span {
+ min-height: var(--h-field-sm);
+ span {
+ width: var(--h-field-sm);
+ height: var(--h-field-sm);
+ }
+ svg {
+ width: calc(var(--h-field-sm) - var(--m-field-sm) * 2);
+ height: calc(var(--h-field-sm) - var(--m-field-sm) * 2);
+ }
+ }
+ & + span + span {
+ min-height: var(--h-field-sm);
+ }
+ }
+ }
+ &.size-base {
+ height: auto;
+ input[type="checkbox"] {
+ & + span {
+ min-height: var(--h-field-base);
+ span {
+ width: var(--h-field-base);
+ height: var(--h-field-base);
+ }
+ svg {
+ width: calc(var(--h-field-base) - var(--m-field-base) * 2);
+ height: calc(var(--h-field-base) - var(--m-field-base) * 2);
+ }
+ }
+ & + span + span {
+ min-height: var(--h-field-base);
+ }
+ }
+ }
+ &.size-lg {
+ height: auto;
+ input[type="checkbox"] {
+ & + span {
+ min-height: var(--h-field-lg);
+ span {
+ width: var(--h-field-lg);
+ height: var(--h-field-lg);
+ }
+ svg {
+ width: calc(var(--h-field-lg) - var(--m-field-lg) * 2);
+ height: calc(var(--h-field-lg) - var(--m-field-lg) * 2);
+ }
+ }
+ & + span + span {
+ min-height: var(--h-field-lg);
+ }
+ }
+ }
+}
+
+.field-wrap {
+ @apply flex flex-col;
+
+ .field-label {
+ @apply font-semibold leading-none text-gray-400;
+ }
+
+ .real-field-wrap {
+ @apply relative flex-none flex;
+ }
+
+ .info-wrap {
+ @apply h-full items-center flex;
+ &:not(.info-wrap-inline) {
+ @apply absolute top-0 right-0;
+ }
+ &.info-wrap-inline {
+ @apply ml-2;
+ }
+ .info-button {
+ @apply text-primary-200;
+ }
+ svg.chevron {
+ @apply text-gray-400;
+ }
+ }
+
+ input:not([type="checkbox"]):not([type="color"]), select {
+ @apply border-gray-600 text-gray-300 leading-none border-solid bg-gray-700 w-full appearance-none outline-none rounded-lg;
+ &:disabled {
+ @apply bg-gray-400;
+ }
+ }
+ .switch {
+ input[type="checkbox"] {
+ @apply invisible absolute;
+ & + span {
+ @apply rounded transition-colors duration-300 relative cursor-pointer flex flex-grow h-full;
+ span {
+ @apply absolute flex items-center justify-center;
+ }
+ var {
+ @apply duration-300;
+ transition-property: left;
+ }
+ }
+ }
+ }
+
+ &.field-wrap-sm {
+ .field-label {
+ @apply text-xs;
+ }
+ input:not([type="checkbox"]), select, input:not([type="color"]) {
+ @apply size-sm text-xs px-1 border;
+ }
+ input[type="color"] {
+ @apply size-sm px-0;
+ }
+ .switch {
+ width: calc(var(--h-field-sm) * 2);
+ input[type="checkbox"] {
+ & + span {
+ span:nth-of-type(1) {
+ width: calc(var(--h-field-sm) - var(--m-field-sm));
+ height: calc(var(--h-field-sm) - var(--m-field-sm) * 2);
+ top: var(--m-field-sm);
+ left: var(--m-field-sm);
+ }
+ span:nth-of-type(2) {
+ width: calc(var(--h-field-sm) - var(--m-field-sm));
+ height: calc(var(--h-field-sm) - var(--m-field-sm) * 2);
+ top: var(--m-field-sm);
+ left: calc(100% - var(--h-field-sm));
+ }
+ var {
+ width: calc(var(--h-field-sm) - var(--m-field-sm) * 2);
+ height: calc(var(--h-field-sm) - var(--m-field-sm) * 2);
+ top: var(--m-field-sm);
+ left: var(--m-field-sm);
+ }
+ svg {
+ @apply w-2 h-2;
+ }
+ }
+ &:checked + span var {
+ left: calc(var(--h-field-sm) + var(--m-field-sm));
+ }
+ }
+ }
+ .info-wrap {
+ @apply mr-1;
+ .info-button {
+ @apply w-4 h-4;
+ }
+ }
+ }
+
+ &.field-wrap-base {
+ .field-label {
+ @apply text-sm;
+ }
+ input:not([type="checkbox"]):not([type="color"]), select {
+ @apply size-base text-sm px-2 border-2;
+ }
+ input[type="color"] {
+ @apply size-base px-0;
+ }
+ .switch {
+ width: calc(var(--h-field-base) * 2);
+ input[type="checkbox"] {
+ & + span {
+ span:nth-of-type(1) {
+ width: calc(var(--h-field-base) - var(--m-field-base));
+ height: calc(var(--h-field-base) - var(--m-field-base) * 2);
+ top: var(--m-field-base);
+ left: var(--m-field-base);
+ }
+ span:nth-of-type(2) {
+ width: calc(var(--h-field-base) - var(--m-field-base));
+ height: calc(var(--h-field-base) - var(--m-field-base) * 2);
+ top: var(--m-field-base);
+ left: calc(100% - var(--h-field-base));
+ }
+ var {
+ width: calc(var(--h-field-base) - var(--m-field-base) * 2);
+ height: calc(var(--h-field-base) - var(--m-field-base) * 2);
+ top: var(--m-field-base);
+ left: var(--m-field-base);
+ }
+ svg {
+ @apply w-3 h-3;
+ }
+ }
+ &:checked + span var {
+ left: calc(var(--h-field-base) + var(--m-field-base));
+ }
+ }
+ }
+ .info-wrap {
+ @apply mr-2;
+ .info-button {
+ @apply w-5 h-5;
+ }
+ }
+ }
+
+ &.field-wrap-lg {
+ .field-label {
+ @apply text-sm;
+ }
+ input:not([type="checkbox"]):not([type="color"]), select {
+ @apply size-lg px-3 border-2;
+ }
+ input[type="color"] {
+ @apply size-lg px-0;
+ }
+ .switch {
+ width: calc(var(--h-field-lg) * 2);
+ input[type="checkbox"] {
+ & + span {
+ span:nth-of-type(1) {
+ width: calc(var(--h-field-lg) - var(--m-field-lg));
+ height: calc(var(--h-field-lg) - var(--m-field-lg) * 2);
+ top: var(--m-field-lg);
+ left: var(--m-field-lg);
+ }
+ span:nth-of-type(2) {
+ width: calc(var(--h-field-lg) - var(--m-field-lg));
+ height: calc(var(--h-field-lg) - var(--m-field-lg) * 2);
+ top: var(--m-field-lg);
+ left: calc(100% - var(--h-field-lg));
+ }
+ var {
+ width: calc(var(--h-field-lg) - var(--m-field-lg) * 2);
+ height: calc(var(--h-field-lg) - var(--m-field-lg) * 2);
+ top: var(--m-field-lg);
+ left: var(--m-field-lg);
+ }
+ svg {
+ @apply w-5 h-5;
+ }
+ }
+ &:checked + span var {
+ left: calc(var(--h-field-lg) + var(--m-field-lg));
+ }
+ }
+ }
+ .info-wrap {
+ @apply mr-3;
+ .info-button {
+ @apply w-6 h-6;
+ }
+ }
+ }
+
+}
+
+.pointer-events-none {
+ pointer-events: none;
+}
+
+input:disabled, selct:disabled {
+ @apply bg-gray-400;
+}
+
+.justify-self-end {
+ justify-self: end;
+}
+
diff --git a/resources/img/sprite.svg b/resources/img/sprite.svg
index 0c4f5d22..79ca3b63 100644
--- a/resources/img/sprite.svg
+++ b/resources/img/sprite.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/resources/img/svg/chevron-down.svg b/resources/img/svg/chevron-down.svg
new file mode 100644
index 00000000..60dc1ad1
--- /dev/null
+++ b/resources/img/svg/chevron-down.svg
@@ -0,0 +1,36 @@
+
+
+
diff --git a/resources/js/components/FSelect.vue b/resources/js/components/FSelect.vue
index e773cf21..b313692c 100644
--- a/resources/js/components/FSelect.vue
+++ b/resources/js/components/FSelect.vue
@@ -1,36 +1,26 @@
-