diff --git a/docs/router/index.js b/docs/router/index.js index e7abb93cd..8460a94e6 100644 --- a/docs/router/index.js +++ b/docs/router/index.js @@ -12,6 +12,7 @@ import sliderProps from 'docs/views/slider/props'; import iconProps from 'docs/views/icon/props'; import datePickerProps from 'docs/views/datePicker/props'; import calendarProps from 'docs/views/calendar/props'; +import messageProps from 'docs/views/message/props'; const routes = [ { @@ -140,6 +141,12 @@ const routes = [ component: PageView, props: iconProps, }, + { + path: '/message', + name: 'Message', + component: PageView, + props: messageProps, + }, { path: '/:catchAll(.*)', name: 'PageNotFound', diff --git a/docs/views/button/example/Default.vue b/docs/views/button/example/Default.vue index 3deba7fa5..fdcf61319 100644 --- a/docs/views/button/example/Default.vue +++ b/docs/views/button/example/Default.vue @@ -297,9 +297,8 @@ import { ref } from 'vue'; export default { setup() { const clickMsg = ref('No event occurred'); - const clickBtn = (e) => { + const clickBtn = () => { clickMsg.value = 'Button was clicked!'; - console.log('[EVUI][Button] Click event', e); }; return { clickMsg, diff --git a/docs/views/message/api/message.md b/docs/views/message/api/message.md new file mode 100644 index 000000000..59c1f10e5 --- /dev/null +++ b/docs/views/message/api/message.md @@ -0,0 +1,51 @@ +### Desc +$message 는 `app.config.globalProperties`에 등록되어 있어, 각 컴포넌트에서 아래처럼 사용 가능 +```vue + + +``` +```js +// 메시지만 입력 시, +ctx.$message('message'); + +// 옵션과 사용 시, +ctx.$message({ + message: 'message', + // options +}); +``` + +### Props + +| 이름 | 디폴트 | 타입 | 설명 | 종류 | +| --- | ---- | ----- | ---- | --- | +| type | 'info' | String | 메시지 스타일 | 'info', 'success', 'warning', 'error' | +| message | '' | String | 메시지 창에 띄울 문구 | | +| duration | 3000 | Number | 메시지 창 유지 시간 | | +| showClose | false | Boolean | 닫기 버튼 노출 여부 | true, false | +| iconClass | '' | String | 메시지 창 좌측에 띄울 EVUI 아이콘 명 | | +| onClose | null | Function | 메시지 창이 닫힌 후 동작 | | +| useHTML | false | Boolean | 메시지 창 문구에 HTML 사용 여부. 사용 시 message 속성에 함께 작성 | | diff --git a/docs/views/message/example/Default.vue b/docs/views/message/example/Default.vue new file mode 100644 index 000000000..fad6f6f27 --- /dev/null +++ b/docs/views/message/example/Default.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/docs/views/message/props.js b/docs/views/message/props.js new file mode 100644 index 000000000..db674855e --- /dev/null +++ b/docs/views/message/props.js @@ -0,0 +1,15 @@ +import { parseComponent } from 'vue-template-compiler'; +import mdText from '!!raw-loader!./api/message.md'; +import Default from './example/Default'; +import DefaultRaw from '!!raw-loader!./example/Default'; + +export default { + mdText, + components: { + Default: { + description: '사용자 동작에 대한 알림을 표시할 수 있습니다. (버튼 클릭 시 메시지 창을 확인할 수 있습니다.)', + component: Default, + parsedData: parseComponent(DefaultRaw), + }, + }, +}; diff --git a/src/components/button/Button.vue b/src/components/button/Button.vue index 33b4b6487..0a2138748 100644 --- a/src/components/button/Button.vue +++ b/src/components/button/Button.vue @@ -66,7 +66,7 @@ export default { padding: 0 $default-padding; line-height: $default-height; font-size: $font-size-medium; - border-radius: $border-radius-button; + border-radius: $default-radius; cursor: pointer; outline: none; color: $color-white; @@ -171,11 +171,11 @@ export default { border-left: 1px solid $color-white !important; &:first-child { - border-radius: $border-radius-button 0 0 $border-radius-button !important; + border-radius: $default-radius 0 0 $default-radius !important; border-left: 1px solid transparent !important; } &:last-child { - border-radius: 0 $border-radius-button $border-radius-button 0 !important; + border-radius: 0 $default-radius $default-radius 0 !important; } } } diff --git a/src/components/checkbox/Checkbox.vue b/src/components/checkbox/Checkbox.vue index 37f8d3956..e1bc9afce 100644 --- a/src/components/checkbox/Checkbox.vue +++ b/src/components/checkbox/Checkbox.vue @@ -167,14 +167,14 @@ export default { border-left: 0; } &:first-child { - border-radius: $border-radius-button 0 0 $border-radius-button; + border-radius: $default-radius 0 0 $default-radius; @include evThemify() { border-left: 1px solid evThemed('border-base'); } } &:last-child { - border-radius: 0 $border-radius-button $border-radius-button 0; + border-radius: 0 $default-radius $default-radius 0; } &.checked { color: $color-white; diff --git a/src/components/message/Message.vue b/src/components/message/Message.vue new file mode 100644 index 000000000..f6c203ea6 --- /dev/null +++ b/src/components/message/Message.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/src/components/message/index.js b/src/components/message/index.js new file mode 100644 index 000000000..dd514d4cc --- /dev/null +++ b/src/components/message/index.js @@ -0,0 +1,20 @@ +import { defineComponent, h, render } from 'vue'; +import Component from './Message.vue'; + +const componentObj = defineComponent(Component); + +const root = document.createElement('div'); +root.classList.add('ev-message-modal'); +document.body.appendChild(root); + +const message = (options = {}) => { + const msgOption = (typeof options === 'string') ? { message: options } : options; + const instance = h( + componentObj, + msgOption, + ); + const container = document.createElement('div'); + render(instance, container); +}; + +export default message; diff --git a/src/components/radio/Radio.vue b/src/components/radio/Radio.vue index 790aa2c59..012b91ab1 100644 --- a/src/components/radio/Radio.vue +++ b/src/components/radio/Radio.vue @@ -126,14 +126,14 @@ export default { border-left: 0; } &:first-child { - border-radius: $border-radius-button 0 0 $border-radius-button; + border-radius: $default-radius 0 0 $default-radius; @include evThemify() { border-left: 1px solid evThemed('border-base'); } } &:last-child { - border-radius: 0 $border-radius-button $border-radius-button 0; + border-radius: 0 $default-radius $default-radius 0; } &.checked { color: $color-white; diff --git a/src/components/slider/Slider.vue b/src/components/slider/Slider.vue index 0f469aa73..74ebbb203 100644 --- a/src/components/slider/Slider.vue +++ b/src/components/slider/Slider.vue @@ -337,7 +337,7 @@ export default { bottom: $handle-height + 10px; padding: 3px 5px; color: $color-white; - border-radius: $border-radius-button; + border-radius: $default-radius; font-size: $font-size-base; opacity: 0; z-index: 850; @@ -442,43 +442,42 @@ export default { @include state('show-mark') { padding-bottom: $handle-height; } -} - -@include state('disabled') { - & { - cursor: not-allowed !important; - } - .ev-slider-thumb { - @include evThemify() { - background-color: evThemed('disabled'); + @include state('disabled') { + &, * { + cursor: not-allowed !important; } - &.left, - &.right { + .ev-slider-thumb { @include evThemify() { - background-color: lighten(evThemed('disabled'), 5%); + background-color: evThemed('disabled'); + } + &.left, + &.right { + @include evThemify() { + background-color: lighten(evThemed('disabled'), 5%); + } } } - } - .ev-slider-handle { - &-btn { - cursor: not-allowed !important; + .ev-slider-handle { + &-btn { + cursor: not-allowed !important; - @include evThemify() { - background-color: evThemed('border-light'); - border-color: evThemed('disabled'); + @include evThemify() { + background-color: evThemed('border-light'); + border-color: evThemed('disabled'); + } } - } - &.on, - &:hover { - .ev-slider-handle-btn { - transform: scale(1); + &.on, + &:hover { + .ev-slider-handle-btn { + transform: scale(1); + } } } - } - .ev-slider-tooltip, - .ev-slider-tooltip:before { - @include evThemify() { - background-color: evThemed('disabled'); + .ev-slider-tooltip, + .ev-slider-tooltip:before { + @include evThemify() { + background-color: evThemed('disabled'); + } } } } diff --git a/src/main.js b/src/main.js index 064d15895..48c1e6a37 100644 --- a/src/main.js +++ b/src/main.js @@ -12,6 +12,7 @@ import EvSlider from '@/components/slider/Slider.vue'; import EvIcon from '@/components/icon/Icon.vue'; import EvCalendar from '@/components/calendar/Calendar.vue'; import EvTimePicker from '@/components/datePicker/DatePicker.vue'; +import EvMessage from '@/components/message/'; import { version } from '../package.json'; const components = [ @@ -38,6 +39,11 @@ const install = (app) => { components.forEach((component) => { app.component(component.name, component); }); + + const global = app.config.globalProperties; + global.$message = EvMessage; + global.$messagebox = () => {}; + global.$notify = () => {}; }; const EVUI = { diff --git a/src/style/components/input.scss b/src/style/components/input.scss index 756babf79..c465344e1 100644 --- a/src/style/components/input.scss +++ b/src/style/components/input.scss @@ -50,8 +50,19 @@ } } @include state('disabled') { - & { - cursor: not-allowed !important; + &.ev-input-number, + &.ev-text-field { + &, * { + cursor: not-allowed !important; + } + &:hover { + .ev-input, + .ev-textarea { + @include evThemify() { + border: 1px solid evThemed('error'); + } + } + } } .ev-input, .ev-textarea { @@ -67,15 +78,6 @@ } } } - &.ev-text-field:hover, - &.ev-input-number:hover { - .ev-input, - .ev-textarea { - @include evThemify() { - border: 1px solid evThemed('error'); - } - } - } } @include state('error') { .ev-input, diff --git a/src/style/variables.scss b/src/style/variables.scss index b351abe25..bf0c09572 100644 --- a/src/style/variables.scss +++ b/src/style/variables.scss @@ -11,12 +11,6 @@ $font-family-base: inherit !default; $color-white: #FFFFFF !default; $color-black: #0D0D0D !default; -// etc -$border-radius-base: 2px; -$border-radius-button: 4px; -$border-solid: 1px solid; -$border-dotted: 1px dotted; - // animate level $animate-base: 0.3s ease-in-out !default;