From f0fcf2a639f7cc6aa6bb9aa412710aab834b226b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9C=D0=B0?=
 =?UTF-8?q?=D0=BB=D1=8E=D0=B3=D0=B8=D0=BD?= <d.malygin@iqdev.digital>
Date: Thu, 13 Feb 2025 20:39:34 +0500
Subject: [PATCH] feat: init 'InputDiv'

---
 src/common/interfaces/componentsProp.ts     | 11 ++++
 src/common/interfaces/componentsProps.ts    | 14 +++++
 src/components/InputDiv/InputDiv.stories.ts | 55 ++++++++++++++++++++
 src/components/InputDiv/InputDiv.vue        | 57 +++++++++++++++++++++
 src/components/Toast/Toast.stories.ts       |  2 +-
 5 files changed, 138 insertions(+), 1 deletion(-)
 create mode 100644 src/components/InputDiv/InputDiv.stories.ts
 create mode 100644 src/components/InputDiv/InputDiv.vue

diff --git a/src/common/interfaces/componentsProp.ts b/src/common/interfaces/componentsProp.ts
index 7f1a31c..1f7dcb8 100644
--- a/src/common/interfaces/componentsProp.ts
+++ b/src/common/interfaces/componentsProp.ts
@@ -98,6 +98,17 @@ export interface ISelectGroup {
   iconRightColor?: TThemeColor;
 }
 
+export type TInputDivScheme =
+  | `${number}by${number}`
+  | `${number}-${number}`
+  | `${number}-${number}-${number}-${number}`
+  | `${number}-${number}-${number}-${number}-${number}`
+  | `${number}-${number}-${number}-${number}-${number}-${number}`
+  | `${number}-${number}-${number}-${number}-${number}-${number}-${number}`
+  | `${number}-${number}-${number}-${number}-${number}-${number}-${number}-${number}`
+  | `${number}-${number}-${number}-${number}-${number}-${number}-${number}-${number}-${number}`
+  | `${number}-${number}-${number}-${number}-${number}-${number}-${number}-${number}-${number}-${number}`;
+
 export interface ISBOption {
   label: string;
   value?: never;
diff --git a/src/common/interfaces/componentsProps.ts b/src/common/interfaces/componentsProps.ts
index cc0686a..f6b1b0d 100644
--- a/src/common/interfaces/componentsProps.ts
+++ b/src/common/interfaces/componentsProps.ts
@@ -19,6 +19,7 @@ import type {
   ISliderOptions,
   ITableColumn,
   ITreeItem,
+  TInputDivScheme,
   TToastType,
 } from '@interfaces/componentsProp';
 
@@ -223,6 +224,19 @@ export interface ISelectProps {
   noBackground?: boolean;
 }
 
+export interface IInputDivProps {
+  scheme?: TInputDivScheme;
+  size?: TSize;
+  secret?: boolean;
+  dashed?: boolean;
+  numbersOnly?: boolean;
+  bottomOnly?: boolean;
+  theme?: TThemeColor;
+  darknessTheme?: TDarkness;
+  textColor?: TThemeColor;
+  darknessTextColor?: TDarkness;
+}
+
 export interface ISBProps {
   options: ISBOption[];
   size?: TSize;
diff --git a/src/components/InputDiv/InputDiv.stories.ts b/src/components/InputDiv/InputDiv.stories.ts
new file mode 100644
index 0000000..c47fdc9
--- /dev/null
+++ b/src/components/InputDiv/InputDiv.stories.ts
@@ -0,0 +1,55 @@
+import type { Meta, StoryObj } from '@storybook/vue3';
+
+import InputDiv from './InputDiv.vue';
+
+const meta: Meta = {
+  title: 'Components/InputDiv',
+  component: InputDiv,
+  tags: ['pick'],
+  parameters: {
+    docs: {
+      description: {
+        component: 'One of the options for implementing input.',
+      },
+    },
+  },
+  argTypes: {
+    size: { control: 'select', options: ['small', 'normal', 'large', 'huge'] },
+    secret: { control: 'boolean' },
+    dashed: { control: 'boolean' },
+    numbersOnly: { control: 'boolean' },
+    bottomOnly: { control: 'boolean' },
+    scheme: { control: 'text' },
+    theme: {
+      control: 'select',
+      options: [
+        'white',
+        'blue',
+        'sky',
+        'cyan',
+        'teal',
+        'green',
+        'yellow',
+        'orange',
+        'pink',
+        'fuchsia',
+        'purple',
+        'indigo',
+        'rose',
+        'red',
+        'black',
+      ],
+    },
+  },
+  args: {},
+} satisfies Meta<typeof InputDiv>;
+
+export default meta;
+
+type Story = StoryObj<typeof meta>;
+
+export const Simple: Story = {
+  args: {
+    active: true,
+  },
+};
diff --git a/src/components/InputDiv/InputDiv.vue b/src/components/InputDiv/InputDiv.vue
new file mode 100644
index 0000000..0a62abd
--- /dev/null
+++ b/src/components/InputDiv/InputDiv.vue
@@ -0,0 +1,57 @@
+<script setup lang="ts">
+import type { IInputDivProps } from '@interfaces/componentsProps';
+import { computed } from 'vue';
+import { convertThemeToColor, convertThemeToTextColor, getValueFromSize } from '@helpers/common';
+
+const props = withDefaults(defineProps<IInputDivProps>(), {
+  scheme: '4by1',
+  size: 'normal',
+  theme: 'white',
+});
+
+const inputPartsBy = computed(() => {
+  if (!props.scheme.includes('by')) return null;
+  const splat = props.scheme.split('by');
+  const by = splat[1];
+  const result = [];
+  for (let i = 0; i < +splat[0]; i++) {
+    result.push(Array(by).keys());
+  }
+  return result;
+});
+const inputPartsDash = computed(() => {
+  if (!props.scheme.includes('-')) return null;
+  return props.scheme.split('-').map((item) => Array(item).keys());
+});
+
+const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme));
+const color = computed(() =>
+  props.textColor
+    ? convertThemeToColor(props.textColor, props.darknessTextColor)
+    : convertThemeToTextColor(props.theme, props.darknessTheme),
+);
+const sizeCoefficient = computed(() => getValueFromSize(props.size, [0.75, 1, 2, 3]));
+</script>
+
+<template>
+  <section class="inputDiv-container">
+    {{ inputPartsBy }}
+    {{ inputPartsDash }}
+    <div v-show="inputPartsBy" class="list">
+      <div v-for="item of inputPartsBy" :key="item" class="item"><input type="text" class="input" /></div>
+    </div>
+    <div v-show="inputPartsDash" class="list">
+      <div v-for="item of inputPartsDash" :key="item" class="item"><input type="text" class="input" /></div>
+    </div>
+  </section>
+</template>
+
+<style scoped>
+.list {
+  display: flex;
+  gap: 20px;
+}
+.input {
+  border: 1px solid black;
+}
+</style>
diff --git a/src/components/Toast/Toast.stories.ts b/src/components/Toast/Toast.stories.ts
index 7b36869..b4c0c5c 100644
--- a/src/components/Toast/Toast.stories.ts
+++ b/src/components/Toast/Toast.stories.ts
@@ -11,7 +11,7 @@ const meta: Meta = {
   parameters: {
     docs: {
       description: {
-        component: 'A component is used to categorize content. Can be used with icons.',
+        component: 'A component to display messages in an overlay',
       },
     },
   },
-- 
GitLab