From ea957f4f010936dcc462a30f3509b5b1fb523ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9A=B0=EC=88=98=EC=97=B0?= Date: Thu, 28 Dec 2023 00:48:24 +0900 Subject: [PATCH] feat(VsChip): add vs-chip component --- .../vlossom/.storybook/examples/style-set.ts | 11 + packages/vlossom/src/assets/icons/check.ts | 6 + packages/vlossom/src/assets/icons/close.ts | 4 +- packages/vlossom/src/assets/icons/person.ts | 6 + packages/vlossom/src/components/types.ts | 1 + .../src/components/vs-chip/VsChip.scss | 92 +++++++++ .../vlossom/src/components/vs-chip/VsChip.vue | 81 ++++++++ .../vs-chip/__tests__/vs-chip.test.ts | 73 +++++++ .../vlossom/src/components/vs-chip/index.ts | 12 ++ .../vs-chip/stories/VsChip.stories.ts | 190 ++++++++++++++++++ packages/vlossom/src/declaration/types.ts | 3 + 11 files changed, 477 insertions(+), 2 deletions(-) create mode 100644 packages/vlossom/src/assets/icons/check.ts create mode 100644 packages/vlossom/src/assets/icons/person.ts create mode 100644 packages/vlossom/src/components/vs-chip/VsChip.scss create mode 100644 packages/vlossom/src/components/vs-chip/VsChip.vue create mode 100644 packages/vlossom/src/components/vs-chip/__tests__/vs-chip.test.ts create mode 100644 packages/vlossom/src/components/vs-chip/index.ts create mode 100644 packages/vlossom/src/components/vs-chip/stories/VsChip.stories.ts diff --git a/packages/vlossom/.storybook/examples/style-set.ts b/packages/vlossom/.storybook/examples/style-set.ts index c54475908..1208974ae 100644 --- a/packages/vlossom/.storybook/examples/style-set.ts +++ b/packages/vlossom/.storybook/examples/style-set.ts @@ -8,6 +8,7 @@ import type { VsValueTagStyleSet, VsNoticeStyleSet, VsProgressStyleSet, + VsChipStyleSet, } from '@/components/types'; const vsButton: VsButtonStyleSet = { @@ -15,6 +16,15 @@ const vsButton: VsButtonStyleSet = { color: 'white', }; +const vsChip: VsChipStyleSet = { + backgroundColor: '#a5d6ad', + borderRadius: '1.2rem', + color: '#304d30', + height: '3rem', + minHeight: '2rem', + padding: '0.8rem 1.5rem', +}; + const vsDivider: VsDividerStyleSet = { lineColor: '#7071e8', lineStyle: 'double', @@ -61,6 +71,7 @@ const vsProgress: VsProgressStyleSet = { export const styleSet: StyleSet = { VsButton: { myStyleSet: vsButton }, + VsChip: { myStyleSet: vsChip }, VsDivider: { myStyleSet: vsDivider }, VsInput: { myStyleSet: vsInput }, VsNotice: { myStyleSet: vsNotice }, diff --git a/packages/vlossom/src/assets/icons/check.ts b/packages/vlossom/src/assets/icons/check.ts new file mode 100644 index 000000000..6437a15f8 --- /dev/null +++ b/packages/vlossom/src/assets/icons/check.ts @@ -0,0 +1,6 @@ +export default { + template: ` + + + `, +}; diff --git a/packages/vlossom/src/assets/icons/close.ts b/packages/vlossom/src/assets/icons/close.ts index 03502d441..234106715 100644 --- a/packages/vlossom/src/assets/icons/close.ts +++ b/packages/vlossom/src/assets/icons/close.ts @@ -1,6 +1,6 @@ export default { template: ` - - + + `, }; diff --git a/packages/vlossom/src/assets/icons/person.ts b/packages/vlossom/src/assets/icons/person.ts new file mode 100644 index 000000000..72a15c26f --- /dev/null +++ b/packages/vlossom/src/assets/icons/person.ts @@ -0,0 +1,6 @@ +export default { + template: ` + + + `, +}; diff --git a/packages/vlossom/src/components/types.ts b/packages/vlossom/src/components/types.ts index f10756d95..fe497e115 100644 --- a/packages/vlossom/src/components/types.ts +++ b/packages/vlossom/src/components/types.ts @@ -1,4 +1,5 @@ export type * from './vs-button'; +export type * from './vs-chip'; export type * from './vs-container'; export type * from './vs-divider'; export type * from './vs-form'; diff --git a/packages/vlossom/src/components/vs-chip/VsChip.scss b/packages/vlossom/src/components/vs-chip/VsChip.scss new file mode 100644 index 000000000..335b2b331 --- /dev/null +++ b/packages/vlossom/src/components/vs-chip/VsChip.scss @@ -0,0 +1,92 @@ +.pointer { + // TODO: reset.scss에 추가 + cursor: pointer; +} + +.vs-chip { + box-sizing: border-box; // TODO: reset.scss에 추가 + + button { + all: unset; + } + + align-items: center; + background-color: var(--vs-chip-backgroundColor, var(--vs-comp-backgroundColor)); + border: var(--vs-chip-outlineBorder, 1px solid var(--vs-comp-color), 0); + border-radius: var(--vs-chip-borderRadius, 1.3rem); + color: var(--vs-chip-color, var(--vs-comp-color)); + display: inline-flex; + font-size: var(--vs-chip-fontSize, 0.82rem); + font-weight: var(--vs-button-fontWeight, 400); + height: var(--vs-chip-height, 1.5rem); + justify-content: center; + min-height: var(--vs-chip-minHeight, 1.2rem); + padding: 0 0.4rem; + position: relative; + + &:after { + background: #ffffff; + content: ''; + display: block; + height: 100%; + left: 0; + opacity: 0; + pointer-events: none; + position: absolute; + top: 0; + transition: all 0.4s ease-out; + width: 120%; + } + + .vs-chip-icon { + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + } + + .vs-chip-leading-icon { + overflow: hidden; + } + + .vs-chip-close { + cursor: pointer; + background-color: rgba(255, 255, 255, 0.7); + height: calc(var(--vs-chip-height, 1.2rem) * 0.8); + width: calc(var(--vs-chip-height, 1.2rem) * 0.8); + } + + .vs-chip-content { + padding: var(--vs-chip-padding, 0 0.2rem); + } + + .vs-chip-icon + .vs-chip-content { + margin-left: 0.05rem; + } + + &.noRound { + border-radius: 0.25rem; + .chip-icon { + border-radius: 0.25rem; + } + } + + &.clickable { + cursor: pointer; + + &:active:after { + opacity: 0.6; + transition: 0s; + width: 0%; + } + } + + &.primary { + background-color: var(--vs-chip-backgroundColor, var(--vs-comp-backgroundColor-primary)); + color: var(--vs-chip-color, var(--vs-comp-color-primary)); + } +} + +.vs-chip + .vs-chip { + margin-left: 0.2rem; +} diff --git a/packages/vlossom/src/components/vs-chip/VsChip.vue b/packages/vlossom/src/components/vs-chip/VsChip.vue new file mode 100644 index 000000000..7132555c2 --- /dev/null +++ b/packages/vlossom/src/components/vs-chip/VsChip.vue @@ -0,0 +1,81 @@ +
+ + + + + + + + + +
+ + + + +