From 3c52f34213ff75c5408bba20a38f65a4e07e2cb0 Mon Sep 17 00:00:00 2001 From: Woolim Park Date: Tue, 21 Nov 2023 11:44:47 +0100 Subject: [PATCH] WSelect --- components/WInput/WInput.story.vue | 47 +++++---- components/WInput/WInput.vue | 58 +++++++---- components/WSelect/WSelect.story.vue | 38 ++++++++ components/WSelect/WSelect.vue | 106 +++++++++++++++++++++ components/WSelect/index.ts | 1 + components/WTextField/WTextField.story.vue | 36 +++++++ components/WTextField/WTextField.vue | 41 ++++++++ components/WTextField/index.ts | 1 + components/index.ts | 1 + composables/useDropdown.ts | 36 +++++++ package.json | 4 + styles/tailwind.css | 1 + tsconfig.json | 3 +- tsconfig.node.json | 10 -- types/index.ts | 6 +- yarn.lock | 55 ++++++++++- 16 files changed, 392 insertions(+), 52 deletions(-) create mode 100644 components/WSelect/WSelect.story.vue create mode 100644 components/WSelect/WSelect.vue create mode 100644 components/WSelect/index.ts create mode 100644 components/WTextField/WTextField.story.vue create mode 100644 components/WTextField/WTextField.vue create mode 100644 components/WTextField/index.ts create mode 100644 composables/useDropdown.ts delete mode 100644 tsconfig.node.json diff --git a/components/WInput/WInput.story.vue b/components/WInput/WInput.story.vue index aacc19b..837d5b1 100644 --- a/components/WInput/WInput.story.vue +++ b/components/WInput/WInput.story.vue @@ -1,38 +1,49 @@ - diff --git a/components/WInput/WInput.vue b/components/WInput/WInput.vue index ec33060..8c5a3c3 100644 --- a/components/WInput/WInput.vue +++ b/components/WInput/WInput.vue @@ -2,51 +2,69 @@ import WSheep from "@/components/WSheep"; import { InputType } from "@/types"; import { useMeh } from "@/composables/useMeh"; -import { toRef, PropType, onUnmounted } from "vue"; +import { ref, toRef, PropType, onUnmounted } from "vue"; import { useIds } from "@/composables/useIds"; -import WLabel from "@/components/WLabel"; -import WError from "@/components/WError"; const props = defineProps({ label: { type: String, default: "" }, - modelValue: { type: String, default: "" }, + value: { type: [String, Number], default: "" }, type: { type: String as PropType, default: InputType.TEXT }, disabled: { type: Boolean, default: false }, placeholder: { type: String, default: undefined }, error: { type: Boolean, default: false }, errorMessage: { type: String, default: "" }, }); -const emit = defineEmits(["update:modelValue"]); const id = useIds().get(); const { isPlaying, playMeh, deletePlaying } = useMeh({ disabled: toRef(props, "disabled"), id }); -const onInput = (e: Event) => { - const { target } = e; - if (target) { - emit("update:modelValue", (target as HTMLInputElement).value); - } +const emit = defineEmits(["click", "click:prepend"]); +const onClick = (e: Event) => { + if (props.disabled) return; + emit("click", e); + playMeh(); +}; +const onPrependClick = (e: Event) => { + if (props.disabled) return; + emit("click", e); + emit("click:prepend", e); + playMeh(); }; onUnmounted(() => { deletePlaying(); }); +defineOptions({ + inheritAttrs: false, +}); diff --git a/components/WSelect/WSelect.story.vue b/components/WSelect/WSelect.story.vue new file mode 100644 index 0000000..40e5074 --- /dev/null +++ b/components/WSelect/WSelect.story.vue @@ -0,0 +1,38 @@ + + + diff --git a/components/WSelect/WSelect.vue b/components/WSelect/WSelect.vue new file mode 100644 index 0000000..37458ec --- /dev/null +++ b/components/WSelect/WSelect.vue @@ -0,0 +1,106 @@ + + + diff --git a/components/WSelect/index.ts b/components/WSelect/index.ts new file mode 100644 index 0000000..6b6ac38 --- /dev/null +++ b/components/WSelect/index.ts @@ -0,0 +1 @@ +export { default } from "./WSelect.vue"; diff --git a/components/WTextField/WTextField.story.vue b/components/WTextField/WTextField.story.vue new file mode 100644 index 0000000..cd3d78d --- /dev/null +++ b/components/WTextField/WTextField.story.vue @@ -0,0 +1,36 @@ + + + diff --git a/components/WTextField/WTextField.vue b/components/WTextField/WTextField.vue new file mode 100644 index 0000000..d75c26e --- /dev/null +++ b/components/WTextField/WTextField.vue @@ -0,0 +1,41 @@ + + + diff --git a/components/WTextField/index.ts b/components/WTextField/index.ts new file mode 100644 index 0000000..0e410c4 --- /dev/null +++ b/components/WTextField/index.ts @@ -0,0 +1 @@ +export { default } from "./WTextField.vue"; diff --git a/components/index.ts b/components/index.ts index 9ed86d2..33baff5 100644 --- a/components/index.ts +++ b/components/index.ts @@ -9,3 +9,4 @@ export { default as WRadioGroup } from "./WRadioGroup"; export { default as WLabel } from "./WLabel"; export { default as WError } from "./WError"; export { default as WNavbar } from "./WNavbar"; +export { default as WTextField } from "./WTextField"; diff --git a/composables/useDropdown.ts b/composables/useDropdown.ts new file mode 100644 index 0000000..2e1fd33 --- /dev/null +++ b/composables/useDropdown.ts @@ -0,0 +1,36 @@ +import { useElementBounding } from "@vueuse/core"; +import { Ref, computed } from "vue"; + +export const useDropdown = ({ + rootEl, + dropdownEl, + show, +}: { + rootEl: Ref; + dropdownEl: Ref; + show: Ref; +}) => { + const r = useElementBounding(rootEl); + const d = useElementBounding(dropdownEl); + const isDirectionUpwards = computed(() => { + if (!show.value) return false; + const distanceFromBottom = window.innerHeight - r.bottom.value; + const distanceFromTop = r.top.value; + const dropdownHeight = d.height.value; + return distanceFromBottom < dropdownHeight + 8 && distanceFromTop > dropdownHeight + 8; + }); + const dropdownBottom = computed(() => (show.value ? `${window.innerHeight - r.top.value + 8}px` : "")); + const dropdownLeft = computed(() => (show.value ? `${r.left.value}px` : "")); + const dropdownWidth = computed(() => (show.value ? `${r.width.value - 4}px` : "")); + const dropdownTop = computed(() => + show.value ? `${window.innerHeight - r.bottom.value - d.height.value - 8}px` : "", + ); + + return { + isDirectionUpwards, + dropdownBottom, + dropdownLeft, + dropdownTop, + dropdownWidth, + }; +}; diff --git a/package.json b/package.json index c1b735c..865ae13 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,14 @@ "preview": "histoire preview" }, "dependencies": { + "@formatjs/intl-displaynames": "^6.6.4", + "@formatjs/intl-getcanonicallocales": "^2.3.0", + "@formatjs/intl-locale": "^3.4.3", "@heroicons/vue": "^2.0.18", "@vueuse/components": "^10.6.1", "@vueuse/core": "^10.6.1", "color": "^4.2.3", + "libphonenumber-js": "^1.10.49", "lodash-es": "^4.17.21", "vue": "^3.3.4" }, diff --git a/styles/tailwind.css b/styles/tailwind.css index 1b8e629..3295d80 100644 --- a/styles/tailwind.css +++ b/styles/tailwind.css @@ -3,4 +3,5 @@ @tailwind utilities; * { -webkit-appearance: none; + font-size: 16px; } diff --git a/tsconfig.json b/tsconfig.json index 31c5636..ce22f54 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -27,6 +27,5 @@ "@/*": ["./*"] } }, - "include": ["env.d.ts", "**/*.js", "**/*.ts", "**/*.vue", "**/*.d.ts", "**/*.tsx"], - "references": [{ "path": "./tsconfig.node.json" }] + "include": ["env.d.ts", "**/*.js", "**/*.ts", "**/*.vue", "**/*.d.ts", "**/*.tsx"] } diff --git a/tsconfig.node.json b/tsconfig.node.json deleted file mode 100644 index 42872c5..0000000 --- a/tsconfig.node.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/types/index.ts b/types/index.ts index 7fcc829..3faca77 100644 --- a/types/index.ts +++ b/types/index.ts @@ -3,7 +3,6 @@ export enum InputType { CHECKBOX = "checkbox", COLOR = "color", DATE = "date", - DATETIME_LOCAL = "datetime-local", EMAIL = "email", FILE = "file", HIDDEN = "hidden", @@ -22,3 +21,8 @@ export enum InputType { URL = "url", WEEK = "week", } + +export interface IOption { + text: string; + value: string | number; +} diff --git a/yarn.lock b/yarn.lock index a4f9b60..02e78ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,6 +190,54 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@formatjs/ecma402-abstract@1.18.0": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.0.tgz#e2120e7101020140661b58430a7ff4262705a2f2" + integrity sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA== + dependencies: + "@formatjs/intl-localematcher" "0.5.2" + tslib "^2.4.0" + +"@formatjs/intl-displaynames@^6.6.4": + version "6.6.4" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.6.4.tgz#dd9ca9bb2d1f4b140cc8814667bc830802621674" + integrity sha512-ET8KQ+L9Q0K8x1SnJQa4DNssUcbATlMopWqYvGGR8yAvw5qwAQc1fv+DshCoZNIE9pbcue0IGC4kWNAkWqlFag== + dependencies: + "@formatjs/ecma402-abstract" "1.18.0" + "@formatjs/intl-localematcher" "0.5.2" + tslib "^2.4.0" + +"@formatjs/intl-enumerator@1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@formatjs/intl-enumerator/-/intl-enumerator-1.4.3.tgz#8d278c273485d7c6219916509fbd51ce3142064d" + integrity sha512-0NpTmAQnDokPoB5aVtXvOdtrUq/uEuPPhBUAr57TYYDjI5MwfFXt8F6JCm6s6CPI0inL8+nxPLjjqH0qyNnP4Q== + dependencies: + tslib "^2.4.0" + +"@formatjs/intl-getcanonicallocales@2.3.0", "@formatjs/intl-getcanonicallocales@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-2.3.0.tgz#b6c6fa1c664e30a61f27fa6399a76159d82a5842" + integrity sha512-BOXbLwqQ7nKua/l7tKqDLRN84WupDXFDhGJQMFvsMVA2dKuOdRaWTxWpL3cJ7qPkoNw11Jf+Xpj4OSPBBvW0eQ== + dependencies: + tslib "^2.4.0" + +"@formatjs/intl-locale@^3.4.3": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@formatjs/intl-locale/-/intl-locale-3.4.3.tgz#fdd2a3978b03aa76965abbca86526bb1d02973b6" + integrity sha512-g/35yMikkkRmLYmqE4W74gvZyKa768oC9OmUFzfLmH3CVYF3v2kvAZI0WsxWLbxYj8TT7wBDeLIL3aIlRw4Osw== + dependencies: + "@formatjs/ecma402-abstract" "1.18.0" + "@formatjs/intl-enumerator" "1.4.3" + "@formatjs/intl-getcanonicallocales" "2.3.0" + tslib "^2.4.0" + +"@formatjs/intl-localematcher@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.2.tgz#5fcf029fd218905575e5080fa33facdcb623d532" + integrity sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw== + dependencies: + tslib "^2.4.0" + "@heroicons/vue@^2.0.18": version "2.0.18" resolved "https://registry.yarnpkg.com/@heroicons/vue/-/vue-2.0.18.tgz#cd55074dfb1915870b680e2757ca4dad6ab3326a" @@ -1514,6 +1562,11 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.8.1" +libphonenumber-js@^1.10.49: + version "1.10.49" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.49.tgz#c871661c62452348d228c96425f75ddf7e10f05a" + integrity sha512-gvLtyC3tIuqfPzjvYLH9BmVdqzGDiSi4VjtWe2fAgSdBf0yt8yPmbNnRIHNbR5IdtVkm0ayGuzwQKTWmU0hdjQ== + lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -2239,7 +2292,7 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tslib@^2.0.3: +tslib@^2.0.3, tslib@^2.4.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==