diff --git a/components/time-picker/index.en-US.md b/components/time-picker/index.en-US.md
new file mode 100644
index 000000000..702decc2e
--- /dev/null
+++ b/components/time-picker/index.en-US.md
@@ -0,0 +1,58 @@
+---
+category: Components
+type: Data Entry
+title: TimePicker
+---
+
+To select/input a time.
+
+## When To Use
+
+* * *
+
+By clicking the input box, you can select a time from a popup panel.
+
+## API
+
+* * *
+
+```jsx
+import moment from 'moment';
+
+```
+
+| Property | Description | Type | Default |
+| -------- | ----------- | ---- | ------- |
+| addon | called from timepicker panel to render some addon to its bottom | function | - |
+| allowEmpty | allow clearing text | boolean | true |
+| autoFocus | get focus when component mounted | boolean | false |
+| className | className of picker | string | '' |
+| clearText | clear tooltip of icon | string | clear |
+| defaultOpenValue | default open panel value, used to set utcOffset,locale if value/defaultValue absent | [moment](http://momentjs.com/) | moment() |
+| defaultValue | to set default time | [moment](http://momentjs.com/) | - |
+| disabled | determine whether the TimePicker is disabled | boolean | false |
+| disabledHours | to specify the hours that cannot be selected | function() | - |
+| disabledMinutes | to specify the minutes that cannot be selected | function(selectedHour) | - |
+| disabledSeconds | to specify the seconds that cannot be selected | function(selectedHour, selectedMinute) | - |
+| format | to set the time format | string | "HH:mm:ss" |
+| getPopupContainer | to set the container of the floating layer, while the default is to create a div element in body | function(trigger) | - |
+| hideDisabledOptions | hide the options that can not be selected | boolean | false |
+| hourStep | interval between hours in picker | number | 1 |
+| minuteStep | interval between minutes in picker | number | 1 |
+| open | whether to popup panel | boolean | false |
+| placeholder | display when there's no value | string | "Select a time" |
+| popupClassName | className of panel | string | '' |
+| secondStep | interval between seconds in picker | number | 1 |
+| use12Hours | display as 12 hours format, with default format `h:mm:ss a` | boolean | false |
+| value | to set time | [moment](http://momentjs.com/) | - |
+| onChange | a callback function, can be executed when the selected time is changing | function(time: moment, timeString: string): void | - |
+| onOpenChange | a callback function which will be called while panel opening/closing | (open: boolean): void | - |
+
+## Methods
+
+| Name | Description |
+| ---- | ----------- |
+| blur() | remove focus |
+| focus() | get focus |
+
+
diff --git a/components/time-picker/index.vue b/components/time-picker/index.vue
new file mode 100644
index 000000000..18bb909de
--- /dev/null
+++ b/components/time-picker/index.vue
@@ -0,0 +1,179 @@
+
\ No newline at end of file
diff --git a/components/time-picker/index.zh-CN.md b/components/time-picker/index.zh-CN.md
new file mode 100644
index 000000000..37a3877e3
--- /dev/null
+++ b/components/time-picker/index.zh-CN.md
@@ -0,0 +1,59 @@
+---
+category: Components
+subtitle: 时间选择框
+type: Data Entry
+title: TimePicker
+---
+
+输入或选择时间的控件。
+
+## 何时使用
+
+* * *
+
+当用户需要输入一个时间,可以点击标准输入框,弹出时间面板进行选择。
+
+## API
+
+* * *
+
+```jsx
+import moment from 'moment';
+
+```
+
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
+| addon | 选择框底部显示自定义的内容 | function | 无 |
+| allowEmpty | 是否展示清除按钮 | boolean | true |
+| autoFocus | 自动获取焦点 | boolean | false |
+| className | 选择器类名 | string | '' |
+| clearText | 清除按钮的提示文案 | string | clear |
+| defaultOpenValue | 当 defaultValue/value 不存在时,可以设置面板打开时默认选中的值 | [moment](http://momentjs.com/) | moment() |
+| defaultValue | 默认时间 | [moment](http://momentjs.com/) | 无 |
+| disabled | 禁用全部操作 | boolean | false |
+| disabledHours | 禁止选择部分小时选项 | function() | 无 |
+| disabledMinutes | 禁止选择部分分钟选项 | function(selectedHour) | 无 |
+| disabledSeconds | 禁止选择部分秒选项 | function(selectedHour, selectedMinute) | 无 |
+| format | 展示的时间格式 | string | "HH:mm:ss" |
+| getPopupContainer | 定义浮层的容器,默认为 body 上新建 div | function(trigger) | 无 |
+| hideDisabledOptions | 隐藏禁止选择的选项 | boolean | false |
+| hourStep | 小时选项间隔 | number | 1 |
+| minuteStep | 分钟选项间隔 | number | 1 |
+| open | 面板是否打开 | boolean | false |
+| placeholder | 没有值的时候显示的内容 | string | "请选择时间" |
+| popupClassName | 弹出层类名 | string | '' |
+| secondStep | 秒选项间隔 | number | 1 |
+| use12Hours | 使用 12 小时制,为 true 时 `format` 默认为 `h:mm:ss a` | boolean | false |
+| value | 当前时间 | [moment](http://momentjs.com/) | 无 |
+| onChange | 时间发生变化的回调 | function(time: moment, timeString: string): void | 无 |
+| onOpenChange | 面板打开/关闭时的回调 | (open: boolean): void | 无 |
+
+## 方法
+
+| 名称 | 描述 |
+| --- | --- |
+| blur() | 移除焦点 |
+| focus() | 获取焦点 |
+
+
diff --git a/components/time-picker/locale/ar_EG.tsx.js b/components/time-picker/locale/ar_EG.tsx.js
new file mode 100644
index 000000000..cf6d7575b
--- /dev/null
+++ b/components/time-picker/locale/ar_EG.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'اختيار الوقت',
+}
+
+export default locale
diff --git a/components/time-picker/locale/bg_BG.tsx.js b/components/time-picker/locale/bg_BG.tsx.js
new file mode 100644
index 000000000..e6896fe4a
--- /dev/null
+++ b/components/time-picker/locale/bg_BG.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Избор на час',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/ca_ES.tsx.js b/components/time-picker/locale/ca_ES.tsx.js
new file mode 100644
index 000000000..cfd60a8b9
--- /dev/null
+++ b/components/time-picker/locale/ca_ES.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Seleccionar hora',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/cs_CZ.tsx.js b/components/time-picker/locale/cs_CZ.tsx.js
new file mode 100644
index 000000000..5c89f7aff
--- /dev/null
+++ b/components/time-picker/locale/cs_CZ.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Vybrat čas',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/de_DE.tsx.js b/components/time-picker/locale/de_DE.tsx.js
new file mode 100644
index 000000000..c912e9e8f
--- /dev/null
+++ b/components/time-picker/locale/de_DE.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Zeit auswählen',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/el_GR.tsx.js b/components/time-picker/locale/el_GR.tsx.js
new file mode 100644
index 000000000..2c0dea51f
--- /dev/null
+++ b/components/time-picker/locale/el_GR.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Επιλέξτε ώρα',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/en_GB.tsx.js b/components/time-picker/locale/en_GB.tsx.js
new file mode 100644
index 000000000..b95b5a362
--- /dev/null
+++ b/components/time-picker/locale/en_GB.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Select time',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/en_US.tsx.js b/components/time-picker/locale/en_US.tsx.js
new file mode 100644
index 000000000..b95b5a362
--- /dev/null
+++ b/components/time-picker/locale/en_US.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Select time',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/es_ES.tsx.js b/components/time-picker/locale/es_ES.tsx.js
new file mode 100644
index 000000000..cfd60a8b9
--- /dev/null
+++ b/components/time-picker/locale/es_ES.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Seleccionar hora',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/et_EE.tsx.js b/components/time-picker/locale/et_EE.tsx.js
new file mode 100644
index 000000000..7ebc008d0
--- /dev/null
+++ b/components/time-picker/locale/et_EE.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Vali aeg',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/fa_IR.tsx.js b/components/time-picker/locale/fa_IR.tsx.js
new file mode 100644
index 000000000..0dcc5d924
--- /dev/null
+++ b/components/time-picker/locale/fa_IR.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'انتخاب زمان',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/fi_FI.tsx.js b/components/time-picker/locale/fi_FI.tsx.js
new file mode 100644
index 000000000..6c4d9a122
--- /dev/null
+++ b/components/time-picker/locale/fi_FI.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Valitse aika',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/fr_BE.tsx.js b/components/time-picker/locale/fr_BE.tsx.js
new file mode 100644
index 000000000..e6fca5d4e
--- /dev/null
+++ b/components/time-picker/locale/fr_BE.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Sélectionner l\'heure',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/fr_FR.tsx.js b/components/time-picker/locale/fr_FR.tsx.js
new file mode 100644
index 000000000..e6fca5d4e
--- /dev/null
+++ b/components/time-picker/locale/fr_FR.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Sélectionner l\'heure',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/is_IS.tsx.js b/components/time-picker/locale/is_IS.tsx.js
new file mode 100644
index 000000000..6a5994a28
--- /dev/null
+++ b/components/time-picker/locale/is_IS.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Velja tíma',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/it_IT.tsx.js b/components/time-picker/locale/it_IT.tsx.js
new file mode 100644
index 000000000..16dd65d4e
--- /dev/null
+++ b/components/time-picker/locale/it_IT.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Selezionare il tempo',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/ja_JP.tsx.js b/components/time-picker/locale/ja_JP.tsx.js
new file mode 100644
index 000000000..366344d41
--- /dev/null
+++ b/components/time-picker/locale/ja_JP.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: '時刻を選択',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/ko_KR.tsx.js b/components/time-picker/locale/ko_KR.tsx.js
new file mode 100644
index 000000000..fad0ffd8c
--- /dev/null
+++ b/components/time-picker/locale/ko_KR.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: '날짜 선택',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/ku_IQ.tsx.js b/components/time-picker/locale/ku_IQ.tsx.js
new file mode 100755
index 000000000..838b1958d
--- /dev/null
+++ b/components/time-picker/locale/ku_IQ.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Demê hilbijêre',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/nb_NO.tsx.js b/components/time-picker/locale/nb_NO.tsx.js
new file mode 100644
index 000000000..dfc0d96e9
--- /dev/null
+++ b/components/time-picker/locale/nb_NO.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Velg tid',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/nl_BE.tsx.js b/components/time-picker/locale/nl_BE.tsx.js
new file mode 100644
index 000000000..7318ca9f6
--- /dev/null
+++ b/components/time-picker/locale/nl_BE.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Selecteer tijd',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/nl_NL.tsx.js b/components/time-picker/locale/nl_NL.tsx.js
new file mode 100644
index 000000000..7318ca9f6
--- /dev/null
+++ b/components/time-picker/locale/nl_NL.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Selecteer tijd',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/pl_PL.tsx.js b/components/time-picker/locale/pl_PL.tsx.js
new file mode 100644
index 000000000..bd48f4f68
--- /dev/null
+++ b/components/time-picker/locale/pl_PL.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Wybierz godzinę',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/pt_BR.tsx.js b/components/time-picker/locale/pt_BR.tsx.js
new file mode 100644
index 000000000..ed0247e10
--- /dev/null
+++ b/components/time-picker/locale/pt_BR.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Hora',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/pt_PT.tsx.js b/components/time-picker/locale/pt_PT.tsx.js
new file mode 100644
index 000000000..ed0247e10
--- /dev/null
+++ b/components/time-picker/locale/pt_PT.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Hora',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/ru_RU.tsx.js b/components/time-picker/locale/ru_RU.tsx.js
new file mode 100644
index 000000000..0490573e7
--- /dev/null
+++ b/components/time-picker/locale/ru_RU.tsx.js
@@ -0,0 +1,8 @@
+/**
+ * Created by Andrey Gayvoronsky on 13/04/16.
+ */
+const locale = {
+ placeholder: 'Выберите время',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/sk_SK.tsx.js b/components/time-picker/locale/sk_SK.tsx.js
new file mode 100644
index 000000000..4c62d104b
--- /dev/null
+++ b/components/time-picker/locale/sk_SK.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Vybrať čas',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/sr_RS.tsx.js b/components/time-picker/locale/sr_RS.tsx.js
new file mode 100644
index 000000000..ef621a0d7
--- /dev/null
+++ b/components/time-picker/locale/sr_RS.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Izaberite vreme',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/sv_SE.tsx.js b/components/time-picker/locale/sv_SE.tsx.js
new file mode 100644
index 000000000..063c46b78
--- /dev/null
+++ b/components/time-picker/locale/sv_SE.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Välj tid',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/th_TH.tsx.js b/components/time-picker/locale/th_TH.tsx.js
new file mode 100644
index 000000000..335e55e01
--- /dev/null
+++ b/components/time-picker/locale/th_TH.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'เลือกเวลา',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/tr_TR.tsx.js b/components/time-picker/locale/tr_TR.tsx.js
new file mode 100644
index 000000000..66f860dca
--- /dev/null
+++ b/components/time-picker/locale/tr_TR.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Zaman Seç',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/uk_UA.tsx.js b/components/time-picker/locale/uk_UA.tsx.js
new file mode 100644
index 000000000..20a81cc53
--- /dev/null
+++ b/components/time-picker/locale/uk_UA.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Оберіть час',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/vi_VN.tsx.js b/components/time-picker/locale/vi_VN.tsx.js
new file mode 100644
index 000000000..05dff1df5
--- /dev/null
+++ b/components/time-picker/locale/vi_VN.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: 'Chọn thời gian',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/zh_CN.tsx.js b/components/time-picker/locale/zh_CN.tsx.js
new file mode 100644
index 000000000..6898e575d
--- /dev/null
+++ b/components/time-picker/locale/zh_CN.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: '请选择时间',
+};
+
+export default locale;
diff --git a/components/time-picker/locale/zh_TW.tsx.js b/components/time-picker/locale/zh_TW.tsx.js
new file mode 100644
index 000000000..cde48a919
--- /dev/null
+++ b/components/time-picker/locale/zh_TW.tsx.js
@@ -0,0 +1,5 @@
+const locale = {
+ placeholder: '請選擇時間',
+};
+
+export default locale;
diff --git a/components/time-picker/style/index.less b/components/time-picker/style/index.less
new file mode 100644
index 000000000..0d7f8c591
--- /dev/null
+++ b/components/time-picker/style/index.less
@@ -0,0 +1,234 @@
+@import "../../style/themes/default";
+@import "../../style/mixins/index";
+@import "../../input/style/mixin";
+
+@timepicker-prefix-cls: ~"@{ant-prefix}-time-picker";
+@timepicker-item-height: 32px;
+
+.@{timepicker-prefix-cls}-panel {
+ .reset-component;
+ z-index: @zindex-picker;
+ position: absolute;
+
+ &-inner {
+ position: relative;
+ outline: none;
+ list-style: none;
+ font-size: @font-size-base;
+ text-align: left;
+ background-color: @component-background;
+ border-radius: @border-radius-base;
+ box-shadow: @box-shadow-base;
+ background-clip: padding-box;
+ overflow: hidden;
+ left: -2px;
+ }
+
+ &-input {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ width: 100%;
+ cursor: auto;
+ outline: 0;
+
+ .placeholder;
+
+ &-wrap {
+ box-sizing: border-box;
+ position: relative;
+ padding: 7px 2px 7px @control-padding-horizontal;
+ border-bottom: @border-width-base @border-style-base @border-color-split;
+ }
+
+ &-invalid {
+ border-color: red;
+ }
+ }
+
+ &-clear-btn {
+ position: absolute;
+ right: 8px;
+ cursor: pointer;
+ overflow: hidden;
+ width: 20px;
+ height: 20px;
+ text-align: center;
+ line-height: 20px;
+ top: 7px;
+ margin: 0;
+ }
+
+ &-clear-btn:after {
+ font-size: @font-size-base - 2px;
+ color: @disabled-color;
+ display: inline-block;
+ line-height: 1;
+ width: 20px;
+ transition: color 0.3s ease;
+ .iconfont-font("\e62e");
+ }
+
+ &-clear-btn:hover:after {
+ color: @text-color-secondary;
+ }
+
+ &-narrow &-input-wrap {
+ max-width: @time-picker-panel-column-width * 2;
+ }
+
+ &-select {
+ float: left;
+ font-size: @font-size-base;
+ border-left: @border-width-base @border-style-base @border-color-split;
+ box-sizing: border-box;
+ width: @time-picker-panel-column-width;
+ overflow: hidden;
+ position: relative; // Fix chrome weird render bug
+ max-height: @timepicker-item-height * 6;
+
+ &:hover {
+ overflow-y: auto;
+ }
+
+ &:first-child {
+ border-left: 0;
+ margin-left: 0;
+ }
+
+ &:last-child {
+ border-right: 0;
+ }
+
+ &:only-child {
+ width: 100%;
+ }
+
+ ul {
+ list-style: none;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0 0 @timepicker-item-height * 5;
+ width: 100%;
+ }
+
+ li {
+ list-style: none;
+ box-sizing: content-box;
+ margin: 0;
+ padding: 0 0 0 @control-padding-horizontal;
+ width: 100%;
+ height: @timepicker-item-height;
+ line-height: @timepicker-item-height;
+ text-align: left;
+ cursor: pointer;
+ user-select: none;
+ transition: background 0.3s;
+ }
+
+ li:hover {
+ background: @item-hover-bg;
+ }
+
+ li&-option-selected {
+ background: @time-picker-selected-bg;
+ font-weight: bold;
+ &:hover {
+ background: @time-picker-selected-bg;
+ }
+ }
+
+ li&-option-disabled {
+ color: @btn-disable-color;
+ &:hover {
+ background: transparent;
+ cursor: not-allowed;
+ }
+ }
+ }
+
+ &-combobox {
+ .clearfix;
+ }
+
+ &-addon {
+ padding: 8px;
+ border-top: @border-width-base @border-style-base @border-color-split;
+ }
+
+ &.slide-up-enter.slide-up-enter-active&-placement-topLeft,
+ &.slide-up-enter.slide-up-enter-active&-placement-topRight,
+ &.slide-up-appear.slide-up-appear-active&-placement-topLeft,
+ &.slide-up-appear.slide-up-appear-active&-placement-topRight {
+ animation-name: antSlideDownIn;
+ }
+
+ &.slide-up-enter.slide-up-enter-active&-placement-bottomLeft,
+ &.slide-up-enter.slide-up-enter-active&-placement-bottomRight,
+ &.slide-up-appear.slide-up-appear-active&-placement-bottomLeft,
+ &.slide-up-appear.slide-up-appear-active&-placement-bottomRight {
+ animation-name: antSlideUpIn;
+ }
+
+ &.slide-up-leave.slide-up-leave-active&-placement-topLeft,
+ &.slide-up-leave.slide-up-leave-active&-placement-topRight {
+ animation-name: antSlideDownOut;
+ }
+
+ &.slide-up-leave.slide-up-leave-active&-placement-bottomLeft,
+ &.slide-up-leave.slide-up-leave-active&-placement-bottomRight {
+ animation-name: antSlideUpOut;
+ }
+}
+
+.@{timepicker-prefix-cls} {
+ .reset-component;
+ position: relative;
+ display: inline-block;
+ outline: none;
+ transition: opacity .3s;
+ width: 128px;
+
+ &-input {
+ .input;
+ &[disabled] {
+ .disabled;
+ }
+ }
+
+ &-open {
+ opacity: 0;
+ }
+
+ &-icon {
+ position: absolute;
+ user-select: none;
+ transition: all .3s @ease-in-out;
+ width: 14px;
+ height: 14px;
+ line-height: 14px;
+ right: @control-padding-horizontal - 1px;
+ color: @disabled-color;
+ top: 50%;
+ margin-top: -7px;
+ &:after {
+ content: "\e641";
+ font-family: "anticon";
+ color: @disabled-color;
+ display: block;
+ line-height: 1;
+ }
+ }
+
+ &-large &-input {
+ .input-lg;
+ }
+
+ &-small &-input {
+ .input-sm;
+ }
+
+ &-small &-icon {
+ right: @control-padding-horizontal-sm - 1px;
+ }
+}
diff --git a/components/time-picker/style/index.tsx b/components/time-picker/style/index.tsx
new file mode 100644
index 000000000..0e54062b3
--- /dev/null
+++ b/components/time-picker/style/index.tsx
@@ -0,0 +1,5 @@
+import '../../style/index.less';
+import './index.less';
+
+// style dependencies
+import '../../input/style';
diff --git a/components/vc-time-picker/Combobox.vue b/components/vc-time-picker/Combobox.vue
new file mode 100644
index 000000000..9fade4812
--- /dev/null
+++ b/components/vc-time-picker/Combobox.vue
@@ -0,0 +1,190 @@
+
\ No newline at end of file
diff --git a/components/vc-time-picker/Header.vue b/components/vc-time-picker/Header.vue
new file mode 100644
index 000000000..30c31c069
--- /dev/null
+++ b/components/vc-time-picker/Header.vue
@@ -0,0 +1,202 @@
+
\ No newline at end of file
diff --git a/components/vc-time-picker/Panel.vue b/components/vc-time-picker/Panel.vue
new file mode 100644
index 000000000..2981bdd06
--- /dev/null
+++ b/components/vc-time-picker/Panel.vue
@@ -0,0 +1,188 @@
+
diff --git a/components/vc-time-picker/Select.vue b/components/vc-time-picker/Select.vue
new file mode 100644
index 000000000..c5d34474e
--- /dev/null
+++ b/components/vc-time-picker/Select.vue
@@ -0,0 +1,131 @@
+
diff --git a/components/vc-time-picker/TimePicker.vue b/components/vc-time-picker/TimePicker.vue
new file mode 100644
index 000000000..4cfb6f5e9
--- /dev/null
+++ b/components/vc-time-picker/TimePicker.vue
@@ -0,0 +1,300 @@
+
\ No newline at end of file
diff --git a/components/vc-time-picker/assets/index.less b/components/vc-time-picker/assets/index.less
new file mode 100644
index 000000000..f4caf0010
--- /dev/null
+++ b/components/vc-time-picker/assets/index.less
@@ -0,0 +1,14 @@
+@prefixClass: rc-time-picker;
+
+.@{prefixClass} {
+ display: inline-block;
+ box-sizing: border-box;
+ * {
+ box-sizing: border-box;
+ }
+}
+
+@import "./index/Picker";
+@import "./index/Panel";
+@import "./index/Header";
+@import "./index/Select";
diff --git a/components/vc-time-picker/assets/index/Header.less b/components/vc-time-picker/assets/index/Header.less
new file mode 100644
index 000000000..7ad3d9fd6
--- /dev/null
+++ b/components/vc-time-picker/assets/index/Header.less
@@ -0,0 +1,49 @@
+.@{prefixClass}-panel {
+ &-input {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ cursor: auto;
+ line-height: 1.5;
+ outline: 0;
+ border: 1px solid transparent;
+
+ &-wrap {
+ box-sizing: border-box;
+ position: relative;
+ padding: 6px;
+ border-bottom: 1px solid #e9e9e9;
+ }
+
+ &-invalid {
+ border-color: red;
+ }
+ }
+
+ &-clear-btn {
+ position: absolute;
+ right: 6px;
+ cursor: pointer;
+ overflow: hidden;
+ width: 20px;
+ height: 20px;
+ text-align: center;
+ line-height: 20px;
+ top: 6px;
+ margin: 0;
+ }
+
+ &-clear-btn:after {
+ content: "x";
+ font-size: 12px;
+ color: #aaa;
+ display: inline-block;
+ line-height: 1;
+ width: 20px;
+ transition: color 0.3s ease;
+ }
+
+ &-clear-btn:hover:after {
+ color: #666;
+ }
+}
diff --git a/components/vc-time-picker/assets/index/Panel.less b/components/vc-time-picker/assets/index/Panel.less
new file mode 100644
index 000000000..68e6c8e79
--- /dev/null
+++ b/components/vc-time-picker/assets/index/Panel.less
@@ -0,0 +1,29 @@
+.@{prefixClass}-panel {
+ z-index: 1070;
+ width: 170px;
+ position: absolute;
+ box-sizing: border-box;
+
+ * {
+ box-sizing: border-box;
+ }
+
+ &-inner {
+ display: inline-block;
+ position: relative;
+ outline: none;
+ list-style: none;
+ font-size: 12px;
+ text-align: left;
+ background-color: #fff;
+ border-radius: 4px;
+ box-shadow: 0 1px 5px #ccc;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ line-height: 1.5;
+ }
+
+ &-narrow {
+ max-width: 113px;
+ }
+}
diff --git a/components/vc-time-picker/assets/index/Picker.less b/components/vc-time-picker/assets/index/Picker.less
new file mode 100644
index 000000000..610c2b0a4
--- /dev/null
+++ b/components/vc-time-picker/assets/index/Picker.less
@@ -0,0 +1,23 @@
+.@{prefixClass} {
+ &-input {
+ width: 100%;
+ position: relative;
+ display: inline-block;
+ padding: 4px 7px;
+ height: 28px;
+ cursor: text;
+ font-size: 12px;
+ line-height: 1.5;
+ color: #666;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ transition: border .2s cubic-bezier(0.645, 0.045, 0.355, 1), background .2s cubic-bezier(0.645, 0.045, 0.355, 1), box-shadow .2s cubic-bezier(0.645, 0.045, 0.355, 1);
+ &[disabled] {
+ color: #ccc;
+ background: #f7f7f7;
+ cursor: not-allowed;
+ }
+ }
+}
diff --git a/components/vc-time-picker/assets/index/Select.less b/components/vc-time-picker/assets/index/Select.less
new file mode 100644
index 000000000..86c73c109
--- /dev/null
+++ b/components/vc-time-picker/assets/index/Select.less
@@ -0,0 +1,63 @@
+.@{prefixClass}-panel-select {
+ float: left;
+ font-size: 12px;
+ border: 1px solid #e9e9e9;
+ border-width: 0 1px;
+ margin-left: -1px;
+ box-sizing: border-box;
+ width: 56px;
+ max-height: 144px;
+ overflow-y: auto;
+ position: relative; // Fix chrome weird render bug
+
+ &-active {
+ overflow-y: auto;
+ }
+
+ &:first-child {
+ border-left: 0;
+ margin-left: 0;
+ }
+
+ &:last-child {
+ border-right: 0;
+ }
+
+ ul {
+ list-style: none;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ }
+
+ li {
+ list-style: none;
+ box-sizing: content-box;
+ margin: 0;
+ padding: 0 0 0 16px;
+ width: 100%;
+ height: 24px;
+ line-height: 24px;
+ text-align: left;
+ cursor: pointer;
+ user-select: none;
+
+ &:hover {
+ background: #edfaff;
+ }
+ }
+
+ li&-option-selected {
+ background: #f7f7f7;
+ font-weight: bold;
+ }
+
+ li&-option-disabled {
+ color: #ccc;
+ &:hover {
+ background: transparent;
+ cursor: not-allowed;
+ }
+ }
+}
diff --git a/components/vc-time-picker/index.js b/components/vc-time-picker/index.js
new file mode 100644
index 000000000..d9cf5f8c0
--- /dev/null
+++ b/components/vc-time-picker/index.js
@@ -0,0 +1 @@
+export { default } from './TimePicker'
diff --git a/components/vc-time-picker/placements.js b/components/vc-time-picker/placements.js
new file mode 100644
index 000000000..e4bacb622
--- /dev/null
+++ b/components/vc-time-picker/placements.js
@@ -0,0 +1,35 @@
+const autoAdjustOverflow = {
+ adjustX: 1,
+ adjustY: 1,
+}
+
+const targetOffset = [0, 0]
+
+const placements = {
+ bottomLeft: {
+ points: ['tl', 'tl'],
+ overflow: autoAdjustOverflow,
+ offset: [0, -3],
+ targetOffset,
+ },
+ bottomRight: {
+ points: ['tr', 'tr'],
+ overflow: autoAdjustOverflow,
+ offset: [0, -3],
+ targetOffset,
+ },
+ topRight: {
+ points: ['br', 'br'],
+ overflow: autoAdjustOverflow,
+ offset: [0, 3],
+ targetOffset,
+ },
+ topLeft: {
+ points: ['bl', 'bl'],
+ overflow: autoAdjustOverflow,
+ offset: [0, 3],
+ targetOffset,
+ },
+}
+
+export default placements
diff --git a/contributors.md b/contributors.md
index cead70e6b..65517f923 100644
--- a/contributors.md
+++ b/contributors.md
@@ -23,7 +23,7 @@ Affix | done
Cascader | done
BackTop | done
Modal | done
-Alert
+Alert | done
Calendar
DatePicker
TimePicker
diff --git a/package-lock.json b/package-lock.json
index ffc3db6a2..27fa07fb8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8032,9 +8032,9 @@
}
},
"moment": {
- "version": "2.20.1",
- "resolved": "http://registry.npm.taobao.org/moment/download/moment-2.20.1.tgz",
- "integrity": "sha1-1usaRsvMFKKy+UNBEsH/iQfzE/0="
+ "version": "2.21.0",
+ "resolved": "http://registry.npm.taobao.org/moment/download/moment-2.21.0.tgz",
+ "integrity": "sha1-KhFLUdKm7J5tg8+AP4OKh42KAjo="
},
"ms": {
"version": "2.0.0",
diff --git a/package.json b/package.json
index 979d69bd8..965b0f87a 100644
--- a/package.json
+++ b/package.json
@@ -99,7 +99,7 @@
"lodash.debounce": "^4.0.8",
"lodash.isequal": "^4.5.0",
"lodash.isplainobject": "^4.0.6",
- "moment": "^2.20.1",
+ "moment": "^2.21.0",
"omit.js": "^1.0.0",
"shallow-equal": "^1.0.0",
"shallowequal": "^1.0.2",