Jihan Kim 2013-05-03
HIVE UI CSS (HIVE-188)
@2e96636e8ddfd72f9f9f758aec90002ba79d1c8c
app/assets/stylesheets/less/_buttons.less
--- app/assets/stylesheets/less/_buttons.less
+++ app/assets/stylesheets/less/_buttons.less
@@ -56,7 +56,6 @@
            background-color : #000; /*666;*/
         }
     }   
-    
 
     &.med {
         font-size: 11px;
@@ -68,10 +67,16 @@
         }
         .border-radius(2px); /*5px*/
     }
+    
     &.small {
-        font-size: 11px;
+        font-size: 10px;
         padding: 3px 10px;
         .border-radius(2px);
+        
+        &.btn-transparent {
+            height:24px;
+            padding:1px 10px;
+        }
     }
 }
 
app/assets/stylesheets/less/_common.less
--- app/assets/stylesheets/less/_common.less
+++ app/assets/stylesheets/less/_common.less
@@ -31,12 +31,6 @@
 }
 
 
-/** override bootstrap **/
-.dropdown-toggle.d-label {
-    .border-radius(4px 0 0 4px) !important;
-    min-width: 100px;
-    text-align: left;
-}
 /*
 .btn {
     margin-right:5px;
@@ -134,7 +128,11 @@
     margin-right:5px; -webkit-transition-duration:0.25s;
     &:last-of-type { margin:0; }
     
-    .del-link { margin-left:8px; padding:8px 4px; }
+    .del-link { 
+        margin-left:8px; padding:8px 4px;
+        -webkit-transition-duration:inherit;
+        &:hover { background:rgba(0,0,0,.2); } 
+    }
     
     &.active {
         .border-radius(2px);
 
app/assets/stylesheets/less/_hiveUI.less (added)
+++ app/assets/stylesheets/less/_hiveUI.less
@@ -0,0 +1,255 @@
+form { margin:0 0 2px; }
+textarea, input[type="text"], input[type="password"], input[type="datetime"], 
+input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], 
+input[type="week"], input[type="number"], input[type="email"], input[type="url"], 
+input[type="search"], input[type="tel"], input[type="color"], .uneditable-input {
+    .box-shadow(none);
+    .border-radius(2px);
+}
+
+/** ui.Dropdown **/
+.dropdown-toggle {
+    background:@white; text-align:left;
+    padding:0; padding-left:12px;
+    .border-radius(2px);
+    
+    .d-label {
+        float:left; margin:0;
+        padding:4px 0; padding-right:9px;
+        width:116px; overflow:hidden; 
+        .inline-block;        
+    }
+    &.small  .d-label { width: 29px;  }
+    &.medium .d-label { width: 58px;  }
+    &.large  .d-label { width: 116px; }
+    &.auto   .d-label { width: inherit; } 
+
+    .d-caret {
+        float:right; margin:0; 
+        padding:4px 9px;
+        border-left:1px solid #d9d9d9;
+    }    
+}
+.btn-group.open .btn.dropdown-toggle {
+    background:darken(@white, 10%);
+}
+.btn .caret {
+    border-top-color:@blue;
+}
+.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a {
+    background-color:@darkgray !important;
+    .linear-gradient(@darkgray, darken(@darkgray, 10%));
+}
+.dropdown-menu .active > a, .dropdown-menu .active > a:hover {
+    color:#fff;
+    background-color:@darkgray !important;
+    .linear-gradient(@darkgray, darken(@darkgray, 10%));    
+}
+
+/** buttons **/
+.nbtn {
+    text-align :center;
+    font-weight:bold;
+    font-size: 11px;
+    line-height: 18px;
+    height: 18px;
+    border:0; padding:0; 
+
+    .border-radius(2px);
+    .box-shadow(0 1px 2px rgba(0, 0, 0, .25));
+    .inline-block;
+    > i.ico { margin-right: 5px; }
+
+    color: @white;
+    background-color: #707070;
+    &:hover { 
+        background-color: darken(#707070, 10%);
+        text-decoration: none;
+    }
+
+    &.blue {
+        background-color: @blue; /*#56B5D9*/
+        &:hover { background-color: darken(@blue, 10%); }
+    }
+
+    &.orange {
+        background-color: @orange;
+        &:hover { background-color: darken(@orange, 10%); }
+    }
+    
+    &.black {
+        background-color: #222;
+        &:hover { background-color : #000;  }
+    }
+    
+    &.white {
+        color: #222;
+        background-color: @white;
+        &:hover { background-color: darken(@white, 10%); }
+    }
+}
+a.nbtn, div.nbtn, span.nbtn, p.nbtn {
+    &.small  { padding: 3px 10px; }
+    &.medium { padding: 6px 20px; }
+    &.large  { padding: 9px 30px; font-size:15px; }
+}
+button.nbtn {
+    &.small  { padding:1px 10px; height:24px; line-height:1; }
+    &.medium { padding:4px 20px; height:30px; line-height:1; }
+    &.large  { padding:8px 30px; height:36px; line-height:1; font-size:15px; }
+}
+
+/* fileUpload button **/
+.fake-file-wrap {
+    position: relative; display:block; clear:both; 
+    overflow: hidden; cursor:pointer; 
+    width:70px; margin-top:10px; 
+    &:hover {
+        background:darken(@white, 10%);
+    }
+    
+    .file {
+        position: absolute; z-index:2; cursor:pointer; 
+        top:0; left: -15px; width:100px;
+        .opacity(0);
+    }    
+}
+
+/** issue label **/
+.issue-label {
+    border:none; padding:2px 4px; margin-right:5px; 
+    font-size:11px; font-weight:bold;
+    box-shadow: inset 0px -1px 1px rgba(0,0,0,0.3);
+    -webkit-transition-duration:0.25s;
+    &:last-of-type { margin:0; }
+    
+    .delete { 
+        margin-left:8px; padding:8px 4px;
+        -webkit-transition-duration:inherit;
+        &:hover { background:rgba(0,0,0,.2); } 
+    }
+    
+    &.active {
+        .border-radius(2px);
+        &.active-white   { color:#fff; }
+        &.active-dimgray { color:#696969; }
+    }
+}
+
+/** input **/
+/** 화면 중앙의 프로젝트 내 검색 폼 **/
+.form-search {
+    .text {
+        width: 360px;
+        margin: 5px 0 0;
+        background-color: #fff;
+        border: 1px solid #ccc;
+        border-right: 0 none;
+        .box-shadow(none);
+        .border-radius(2px 0 0 2px);
+        &:focus { .box-shadow(none); }
+    }
+
+    .btn {
+        width  : 88px;
+        margin : 5px 0 0;
+        padding: 4px 0;
+        border : 1px solid #a9a9a9;
+        color  : @black;
+        text-align : center;
+        font-weight: bold;
+        font-size  : 11px;
+        .border-radius(0 2px 2px 0);
+
+        &:hover { color:@link-hover-color; }
+    }
+}
+
+/** 화면 상단의 전체 검색 폼 **/
+.form-searchbar {
+    width: 146px; height: 19px;
+    margin: 0; padding: 0 6px;
+    background-color: @search-bar-bg-color;
+    border:1px solid @search-bar-border-color;
+    
+    .border-radius(2px);
+    .box-shadow(inset 0px 2px 3px rgba(0,0,0,0.12));
+    
+    .text {
+        width: 128px; height: 13px;
+        margin: 0; margin-right:3px;
+        padding:4px 0px; 
+        border: 0 none;
+        
+        font-size: 11px;
+        color: @search-input-color;
+        background-color: transparent;
+       
+       .box-shadow(none);
+       &:focus { .box-shadow(none); }
+    }
+    
+    .ico-search {
+        border:0; padding:0;
+        background-color:transparent;
+        margin-bottom:2px;
+    }
+}
+
+/** Avatar Wraps **/
+.avatar-wrap {
+    width:32px; height:32px; /* default size: medium */
+    display:inline-block;
+    vertical-align:middle;
+    overflow:hidden; 
+    border: 1px solid #ccc;
+    .border-radius(3px) !important;
+    
+    &.small   { width:24px; height:24px;   }
+    &.medium  { width:32px; height:32px;   }
+    &.large   { width:64px; height:64px;   }
+    &.xlarge  { width:128px; height:128px; }
+}
+    
+/** tab UI **/
+.nav-tabs {
+    li {
+        a { 
+            padding-left:30px; padding-right:30px;
+            background:#ececec;
+            border:1px solid #d3d3d3;
+            .box-shadow(inset 0px 1px 1px #fff);
+        }
+        &.active a {
+            font-weight:bold;
+            letter-spacing:-1pt;
+        }
+    }
+}
+
+/** alert **/
+.hiveDialog {
+    .border-radius(none);
+    border:10px solid #bebebe;
+    padding:16px 20px; width:500px;
+    
+    .btn-dismiss {
+        padding:0; margin:0; width:100%; text-align: right;
+        display:block; clear:both;
+        
+        button {
+            font-size:24px; font-weight:bold; color:#898989;
+            border:none; background:transparent;
+        }
+    }
+    
+    .message {
+        .msg {
+            text-align:center;
+            font-weight:bold; font-size:18px; 
+            margin-bottom:20px; line-height:1.5em;
+        }
+    }
+}
+.alert { display:none; } /** use .hiveDialog **/
+
app/assets/stylesheets/less/_page.less
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
@@ -1,4 +1,16 @@
 //--- common
+.gnb-logo {
+    display: block;
+    width: 123px; height: 55px;
+    text-indent: -250px; overflow:hidden;
+    background-size:123px 55px;
+    background-image: url("@{base-image-path}/logo-white.png");
+    
+    &.orange {
+        background-image: url("@{base-image-path}/logo-orange.png");
+    }
+}
+
 .gnb-outer {
     width: 100%;
     border-bottom:@gnb-border-bottom;
@@ -15,19 +27,12 @@
             
             .logo {
                 float: left;
-                width: 123px;
-                height: 55px;
-                line-height:55px;
+                width: 123px; height: 55px; line-height:55px;
                 text-align:center; font-size:2em; overflow:hidden;
                 color:#fff; background-color: @gnb-logo-bg-color;
                
                 span {
-                    width: 123px;
-                    height: 55px;
-                    display: block;
-                    text-indent: -250px;
-                    background-size:123px 55px;
-                    background-image: url("@{base-image-path}/logo-white.png");
+                    .gnb-logo;
                 }
             }
             
@@ -89,38 +94,7 @@
                     }
                     
                     .search-bar {
-                        margin: 3px 0 0 5px;
-                        padding: 0 6px;
-                        width: 146px;
-                        height: 19px;
-                        background-color: @search-bar-bg-color;
-                        border:1px solid @search-bar-border-color;
-                        .border-radius(2px);
-                        .box-shadow(inset 0px 2px 3px rgba(0,0,0,0.12));
-                        
-                        form {
-                            margin: 0;
-                            line-height: 0;
-                        }
-                        .query {
-                            border: 0 none;
-                            margin: 0; margin-right:3px;
-                            padding:4px 0px; 
-                            width: 128px; height: 13px;
-                            
-                            font-size: 11px;
-                            color: @search-input-color;
-                            background-color: transparent;
-                           
-                           .box-shadow(none);
-                        }
-                        .ico-search {
-                            margin-bottom:2px;
-                        }
-                        .ico-search-14 {
-                            margin-top: -1px;
-                            margin-right: 10px;
-                        }
+                        padding:3px 0 0 5px;
                     } /*.search-bar */
                 } // .right
             }// gnb-menu
@@ -225,6 +199,8 @@
             .page-title { 
                 float:left; overflow:hidden; margin:0;
                 line-height:56px; color:#fff; font-weight:normal;
+                
+                a { vertical-align:top; }
             }
 
             .gnb-menus {
@@ -233,9 +209,6 @@
                     .sp-line { 
                         color:#626262 !important; 
                         opacity:1 !important; 
-                    }
-                    .search-bar {
-                        border:1px solid #2e2e2e;
                     }
                 }
             }
@@ -1207,12 +1180,12 @@
                     background: #F6F6F6;
                     /*box-shadow: inset 0px 1px #fff;*/
                    
-                   .issue-label {
+                   /*.issue-label {
                        border:none;
                        &.active {
                             box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.25);   
                        }
-                   }
+                   }*/
                    
                    /*.labels { background:#D7D7D7; }*/
                    
@@ -1488,7 +1461,7 @@
         }
     }
 }
-
+/*
 .fake-file-wrap {
     margin-top: 10px;
     position: relative;
@@ -1508,7 +1481,7 @@
         display:block !important;
     }
 }
-
+*/
 .cu-label {
     width: 80px;
     padding-right: 45px;
@@ -2294,7 +2267,7 @@
         }
     }
     .btn-wrap {
-        width: 138px; /*80px*/
+        width: 118px; /*138px; /*80px*/
         text-align: right;
     }
 }
@@ -3226,7 +3199,7 @@
         color:#898989; margin-top:18px;
     }
 }
-
+/*
 .hive-tabs {
     li {
         a { 
@@ -3241,6 +3214,7 @@
         }
     }
 }
+*/
 .code-tab, .plugin-tab {
     margin: 15px 0 20px;
 }
@@ -3256,6 +3230,7 @@
 }
 
 /** alertUI.scala.html **/
+/*
 .hiveDialog {
     .border-radius(none);
     border:10px solid #bebebe;
@@ -3279,8 +3254,9 @@
         }
     }
 }
-
+*/
 /** Bootstrap **/
+    /*
 .dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a {
     background-color:#878787 !important;
     .linear-gradient(#878787, darken(#878787, 10%));
@@ -3294,8 +3270,11 @@
     .box-shadow(none);
     .border-radius(2px);
 }
+*/
 /*
 hr.dark-gray { border-top:1px solid #d4d4d4; }
 */
-.alert { position:absolute; width:830px; top:0px; /*top:76px;*/ margin-left:auto; z-index:999; display:none; }
-form { margin:0 0 2px; }
(No newline at end of file)
+/*
+.alert { position:absolute; width:830px; top:0px; margin-left:auto; z-index:999; display:none; }
+form { margin:0 0 2px; }
+*/
(No newline at end of file)
app/assets/stylesheets/less/_variables.less
--- app/assets/stylesheets/less/_variables.less
+++ app/assets/stylesheets/less/_variables.less
@@ -33,6 +33,8 @@
 @orange : #F36C22;
 @blue   : #5DBBE0;
 @blue2  : #51AACC;
+@darkgray: #878787;
+
 @gray-d4: #D4D4D4;
 @gray-ec: #ECECEC;
 @gray-f7: #F7F7F7;
app/assets/stylesheets/nforge.less
--- app/assets/stylesheets/nforge.less
+++ app/assets/stylesheets/nforge.less
@@ -4,3 +4,4 @@
 @import "less/_sprites.less";
 @import "less/_page.less";
 @import "less/_buttons.less";
+@import "less/_hiveUI.less";
app/controllers/Application.java
--- app/controllers/Application.java
+++ app/controllers/Application.java
@@ -8,6 +8,7 @@
 import playRepository.RepositoryService;
 //import views.html.code.codeNavi;
 import views.html.index;
+import views.html.hiveUI;
 
 import java.io.File;
 import java.util.List;
@@ -60,4 +61,7 @@
     	return ok(index.render(null, null));
     }
 
+    public static Result hiveUI(){
+    	return ok(views.html.hiveUI.render());
+    }
 }
(No newline at end of file)
 
app/views/hiveUI.scala.html (added)
+++ app/views/hiveUI.scala.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html>
+<html lang="ko">
+<head>
+	<meta charset="utf-8">
+	<title>HIVE UI</title>
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<link rel="shortcut icon" type="image/png" href="/assets/images/favicon.ico">
+	<link rel="stylesheet" type="text/css" media="screen" href="/assets/stylesheets/bootstrap.min.css">
+	<link rel="stylesheet" type="text/css" media="screen" href="/assets/stylesheets/nforge.css">
+	<script type="text/javascript" src="/assets/javascripts/lib/jquery/jquery-1.9.0.js"></script>
+	<script type="text/javascript" src="/assets/javascripts/common/hive.Common.js"></script>
+	<script type="text/javascript" src="/assets/javascripts/lib/bootstrap.js"></script>
+	<style type="text/css">
+		body { color:#ccc; }
+		dl { display:inline-block; margin:18px; }
+		dd { margin-left:0; }
+		.gnb-logo { display:inline-block !important; }
+		.gnb-outer { text-align:center; }
+		.subtitle { font-size:24px; font-weight:bold; height:55px; line-height:55px; vertical-align:bottom; }
+		.css { display:none;font-family: Consolas; color: #222; background: #C9EBB5; padding: 3px; border-radius: 3px; border: 1px solid #4CB848; }
+	</style>
+</head>
+<body>
+
+<header class="gnb-outer">
+	<span class="gnb-logo orange">HIVE</span>
+	<span class="subtitle">User Interface Kit</span>
+</header>
+
+<div class="container page-wrap">
+	<div class="page">
+	
+		<h3>Buttons</h5>
+		<div>
+			<p class="css">.nbtn</p>
+			<p>
+				<a href="#" class="nbtn medium">Default Button</a><!-- 
+			 --><button type="button" class="nbtn medium orange">Primary Button</button><!-- 
+			 --><a href="#" class="nbtn medium black">Cancel Button</a><!-- 
+			 --><a href="#" class="nbtn medium white">Action Button</a>
+			</p>
+			<p>
+				<button type="button" class="nbtn medium">Default Button</button><!-- 
+			 --><a href="#" class="nbtn medium orange">Primary Button</a><!-- 
+			 --><button type="button" class="nbtn medium black">Cancel Button</button><!-- 
+			 --><button type="button" class="nbtn medium white">Action Button</button>
+			</p>
+			
+			<p class="css">.btn-wrap > .fake-file-wrap</p>
+			<div class="btn-wrap">
+				<div class="nbtn medium white fake-file-wrap">
+					<i class="ico ico-plus-blue"></i>Upload<!-- 
+				--> <input type="file" class="file" name="filePath" accept="image/*">
+				</div>
+			</div>
+
+			<p class="css">.btn-wrap > .fake-file-wrap</p>
+			<div class="btn-wrap">
+				<div class="nbtn medium white fake-file-wrap">
+					<i class="ico ico-plus-blue"></i>파일 올리기<!-- 
+				--> <input type="file" class="file" name="filePath" accept="image/*">
+				</div>
+			</div>
+
+			<p>&nbsp;</p>
+			<p>
+				<a href="#" class="nbtn large orange">Create your project</a>
+			</p>
+			
+			<p>
+				<a href="#" class="nbtn small">Small button</a>
+				<button type="button" class="nbtn medium">Medium button</button>
+				<a href="#" class="nbtn large">Large button</a>
+			</p>
+		</div>
+		<!-- // buttons -->
+		<hr/>
+		
+		<h3>Select</h5>
+		<div>
+			<p class="css">.dropdown-toggle</p>
+			
+			<!-- ui.dropdown -->
+			<div class="btn-group" data-name="assigneeId">
+				<button class="btn dropdown-toggle small" data-toggle="dropdown">
+					<span class="d-label">전체</span>
+					<span class="d-caret"><span class="caret"></span></span>
+				</button>
+				<ul class="dropdown-menu">
+					<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">전체</a></li>
+					<li data-value="0"><a href="javascript:void(0)">담당자 없음</a></li>
+				</ul>
+			</div>
+			<!-- // ui.dropdown -->
+
+			<!-- ui.dropdown -->
+			<div class="btn-group" data-name="assigneeId">
+				<button class="btn dropdown-toggle medium" data-toggle="dropdown">
+					<span class="d-label">전체</span>
+					<span class="d-caret"><span class="caret"></span></span>
+				</button>
+				<ul class="dropdown-menu">
+					<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">전체</a></li>
+					<li data-value="0"><a href="javascript:void(0)">담당자 없음</a></li>
+				</ul>
+			</div>
+			<!-- // ui.dropdown -->
+
+			<!-- ui.dropdown -->
+			<div class="btn-group" data-name="assigneeId">
+				<button class="btn dropdown-toggle large" data-toggle="dropdown">
+					<span class="d-label">전체</span>
+					<span class="d-caret"><span class="caret"></span></span>
+				</button>
+				<ul class="dropdown-menu">
+					<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">전체</a></li>
+					<li data-value="0"><a href="javascript:void(0)">담당자 없음</a></li>
+				</ul>
+			</div>
+			<!-- // ui.dropdown -->
+
+		</div>
+		<!-- // select -->
+		<hr/>
+		
+		<h3>Form</h3>
+		<div>
+			<p class="css">.form-search</p>
+			<form class="form-search">
+				<input type="text" class="text" name="filter" placeholder="현재 프로젝트에서 검색"><!--
+		 	 --><button type="button" class="btn">검색</button>
+			</form>
+			
+			<p class="css">.form-searchbar</p>
+			<form class="form-searchbar">
+				<input type="text" class="text" name="filter"><!-- 
+			 --><button type="button" class="ico ico-search"></button>
+			</form>
+		</div>
+		<hr/>
+		<!-- // input -->
+		
+		<h3>Labels</h3>
+		<div>
+			<p class="css">.issue-label</p>
+			<p>
+				<button class="issue-label">Clean</button>
+				<button class="issue-label">Fresh</button>
+				<button class="issue-label">Modern</button>
+				<button class="issue-label">Unique</button>
+			</p>
+			<p class="css">.issue-label .active</p>
+			<p>
+				<button class="issue-label active" style="background-color:#da5454; color:#fff;">Clean<span class="delete">&times;</span></button>
+				<button class="issue-label active" style="background-color:#ff9933; color:#fff;">Fresh<span class="delete">&times;</span></button>
+				<button class="issue-label active" style="background-color:#ffcc33; color:#fff;">Modern<span class="delete">&times;</span></button>
+				<button class="issue-label active" style="background-color:#22b4b9; color:#fff;">Unique<span class="delete">&times;</span></button>
+			</p>
+			<p class="css">.issue-label .active .editable</p>
+			<p>
+				<button class="issue-label active editable" style="background-color:#da5454; color:#fff;">Clean<span class="delete">&times;</span></button>
+				<button class="issue-label active editable" style="background-color:#ff9933; color:#fff;">Fresh<span class="delete">&times;</span></button>
+				<button class="issue-label active editable" style="background-color:#ffcc33; color:#fff;">Modern<span class="delete">&times;</span></button>
+				<button class="issue-label active editable" style="background-color:#22b4b9; color:#fff;">Unique<span class="delete">&times;</span></button>
+			</p>
+		</div>
+		<!-- // labels -->
+		<hr/>
+		
+		<h3>Avatar</h3>
+		<div>
+			<p class="css">.avatar-wrap</p>
+			<dl>
+				<dt>
+					<span class="css">.small</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap small">
+						<img src="/assets/images/default-avatar-128.png" width="24" height="24">
+					</a>
+				</dd>
+			</dl>
+			<dl>
+				<dt>
+					<span class="css">.medium</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap medium">
+						<img src="/assets/images/default-avatar-128.png" width="32" height="32">
+					</a>
+				</dd>
+			</dl>
+			<dl>
+				<dt>
+					<span class="css">.large</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap large">
+						<img src="/assets/images/default-avatar-128.png" width="64" height="64">
+					</a>
+				</dd>
+			</dl>
+			<dl>
+				<dt>
+					<span class="css">.xlarge</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap xlarge">
+						<img src="/assets/images/default-avatar-128.png" width="128" height="128">
+					</a>
+				</dd>
+			</dl>
+		</div>
+		<!-- //avatar -->
+		<hr/>
+		
+		<h3>Tabs</h3>
+		<div>
+			<ul class="nav nav-tabs hive-tabs">
+				<li class="active">
+					<a href="#">파일</a>
+				</li>
+				<li>
+					<a href="#">커밋</a>
+				</li>
+			</ul>
+		</div>
+	</div>
+</div>
+
+<footer class="page-footer-outer">
+	<div class="page-footer">
+		<span class="provider">&copy; <strong>NHN Corp.</strong></span>
+	</div>
+</footer>
+
+</body>
+</html>(No newline at end of file)
app/views/issue/issueList.scala.html
--- app/views/issue/issueList.scala.html
+++ app/views/issue/issueList.scala.html
@@ -70,12 +70,15 @@
 									<input type="text" name="authorLoginId" class="input-medium">
 								</div>
 							</div>
+							
 							<div class="control-group">
 								<label class="control-label">@Messages("assignee")</label>
 								<div class="controls">
 									<div class="btn-group" data-name="assigneeId">
-										<button data-toggle="dropdown" class="btn dropdown-toggle bgwhite d-label input-medium">@Messages("order.all")</button>
-										<button data-toggle="dropdown" class="btn dropdown-toggle bgwhite"><span class="caret"></span></button>
+										<button class="btn dropdown-toggle" data-toggle="dropdown">
+											<span class="d-label">@Messages("order.all")</span>
+											<span class="d-caret"><span class="caret"></span></span>
+										</button>
 										<ul class="dropdown-menu">
 											<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">@Messages("order.all")</a></li>
 											<li data-value="0"><a href="javascript:void(0)">@Messages("noAssignee")</a></li>
@@ -86,12 +89,15 @@
 									</div>
 								</div>
 							</div>
+							
 							<div class="control-group">
 								<label class="control-label">@Messages("milestone")</label>
 								<div class="controls">
 									<div class="btn-group" data-name="milestoneId">
-										<button data-toggle="dropdown" class="btn dropdown-toggle bgwhite d-label input-medium">@Messages("milestone.state.all")</button>
-										<button data-toggle="dropdown" class="btn dropdown-toggle bgwhite"><span class="caret"></span></button>
+										<button class="btn dropdown-toggle" data-toggle="dropdown">
+											<span class="d-label">@Messages("milestone.state.all")</span>
+											<span class="d-caret"><span class="caret"></span></span>
+										</button>
 										<ul class="dropdown-menu">
 											<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">@Messages("milestone.state.all")</a></li>
 											<li data-value="0"><a href="javascript:void(0)">@Messages("noMilestone")</a></li>
app/views/navbar.scala.html
--- app/views/navbar.scala.html
+++ app/views/navbar.scala.html
@@ -45,10 +45,11 @@
                 	<a href="@routes.UserApp.signupForm()" class="d-link signup">@Messages("title.signup")</a>
                 </li>
             	}
-                <li class="search-bar">
-                    <form action="@routes.ProjectApp.projects()">
-                        <input type="text" autocomplete="off" class="query" name="filter" accesskey="S" /><button type="submit" class="ico ico-search btn-transparent"></button>
-                    </form>
+            	<li class="search-bar">
+                	<form action="@routes.ProjectApp.projects()" class="form-searchbar">
+						<input type="text" class="text" name="filter" autocomplete="off" accesskey="S"><!-- 
+			 		 --><button type="submit" class="ico ico-search"></button>
+					</form>
                 </li>
             </ul>
         </div>
app/views/topmenu.scala.html
--- app/views/topmenu.scala.html
+++ app/views/topmenu.scala.html
@@ -39,9 +39,10 @@
                 </li>
             	}
                 <li class="search-bar">
-                    <form action="@routes.ProjectApp.projects()">
-                        <input type="text" autocomplete="off" class="query" name="filter" /><button type="submit" class="ico ico-search btn-transparent"></button>
-                    </form>
+                	<form action="@routes.ProjectApp.projects()" class="form-searchbar">
+						<input type="text" class="text" name="filter" autocomplete="off" accesskey="S"><!-- 
+			 		 --><button type="submit" class="ico ico-search"></button>
+					</form>
                 </li>
             </ul>
         </div>
conf/routes
--- conf/routes
+++ conf/routes
@@ -2,7 +2,7 @@
 # This file defines all application routes (Higher priority routes first)
 # ~~~~
 
-GET     /navitest                                      controllers.Application.navi()
+GET     /navitest                                       controllers.Application.navi()
 
 # Home page
 GET     /                                               controllers.Application.index()
@@ -13,6 +13,7 @@
 
 # Bootstrapping for test
 GET     /init                                           controllers.Application.init()
+GET		/hiveUI											controllers.Application.hiveUI()
 
 # User
 GET     /users                                          controllers.UserApp.users(query: String ?= "")
 
docs/technical/hive-ui.html (added)
+++ docs/technical/hive-ui.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html>
+<html lang="ko">
+<head>
+	<meta charset="utf-8">
+	<title>HIVE UI</title>
+	<base href="http://localhost:9000">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<link rel="shortcut icon" type="image/png" href="/assets/images/favicon.ico">
+	<link rel="stylesheet" type="text/css" media="screen" href="/assets/stylesheets/bootstrap.min.css">
+	<link rel="stylesheet" type="text/css" media="screen" href="/assets/stylesheets/nforge.css">
+	<script type="text/javascript" src="/assets/javascripts/lib/jquery/jquery-1.9.0.js"></script>
+	<script type="text/javascript" src="/assets/javascripts/common/hive.Common.js"></script>
+	<script type="text/javascript" src="/assets/javascripts/lib/bootstrap.js"></script>
+	<style type="text/css">
+		body { color:#ccc; }
+		dl { display:inline-block; margin:18px; }
+		dd { margin-left:0; }
+		.gnb-logo { display:inline-block !important; }
+		.gnb-outer { text-align:center; }
+		.subtitle { font-size:24px; font-weight:bold; height:55px; line-height:55px; vertical-align:bottom; }
+		.css { display:none;font-family: Consolas; color: #222; background: #C9EBB5; padding: 3px; border-radius: 3px; border: 1px solid #4CB848; }
+	</style>
+</head>
+<body>
+
+<header class="gnb-outer">
+	<span class="gnb-logo orange">HIVE</span>
+	<span class="subtitle">User Interface Kit</span>
+</header>
+
+<div class="container page-wrap">
+	<div class="page">
+	
+		<h3>Buttons</h5>
+		<div>
+			<p class="css">.nbtn</p>
+			<p>
+				<a href="#" class="nbtn medium">Default Button</a><!-- 
+			 --><button type="button" class="nbtn medium orange">Primary Button</button><!-- 
+			 --><a href="#" class="nbtn medium black">Cancel Button</a><!-- 
+			 --><a href="#" class="nbtn medium white">Action Button</a>
+			</p>
+			<p>
+				<button type="button" class="nbtn medium">Default Button</button><!-- 
+			 --><a href="#" class="nbtn medium orange">Primary Button</a><!-- 
+			 --><button type="button" class="nbtn medium black">Cancel Button</button><!-- 
+			 --><button type="button" class="nbtn medium white">Action Button</button>
+			</p>
+			
+			<p class="css">.btn-wrap > .fake-file-wrap</p>
+			<div class="btn-wrap">
+				<div class="nbtn medium white fake-file-wrap">
+					<i class="ico ico-plus-blue"></i>Upload<!-- 
+				--> <input type="file" class="file" name="filePath" accept="image/*">
+				</div>
+			</div>
+
+			<p class="css">.btn-wrap > .fake-file-wrap</p>
+			<div class="btn-wrap">
+				<div class="nbtn medium white fake-file-wrap">
+					<i class="ico ico-plus-blue"></i>파일 올리기<!-- 
+				--> <input type="file" class="file" name="filePath" accept="image/*">
+				</div>
+			</div>
+
+			<p>&nbsp;</p>
+			<p>
+				<a href="#" class="nbtn large orange">Create your project</a>
+			</p>
+			
+			<p>
+				<a href="#" class="nbtn small">Small button</a>
+				<button type="button" class="nbtn medium">Medium button</button>
+				<a href="#" class="nbtn large">Large button</a>
+			</p>
+		</div>
+		<!-- // buttons -->
+		<hr/>
+		
+		<h3>Select</h5>
+		<div>
+			<p class="css">.dropdown-toggle</p>
+			
+			<!-- ui.dropdown -->
+			<div class="btn-group" data-name="assigneeId">
+				<button class="btn dropdown-toggle small" data-toggle="dropdown">
+					<span class="d-label">전체</span>
+					<span class="d-caret"><span class="caret"></span></span>
+				</button>
+				<ul class="dropdown-menu">
+					<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">전체</a></li>
+					<li data-value="0"><a href="javascript:void(0)">담당자 없음</a></li>
+				</ul>
+			</div>
+			<!-- // ui.dropdown -->
+
+			<!-- ui.dropdown -->
+			<div class="btn-group" data-name="assigneeId">
+				<button class="btn dropdown-toggle medium" data-toggle="dropdown">
+					<span class="d-label">전체</span>
+					<span class="d-caret"><span class="caret"></span></span>
+				</button>
+				<ul class="dropdown-menu">
+					<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">전체</a></li>
+					<li data-value="0"><a href="javascript:void(0)">담당자 없음</a></li>
+				</ul>
+			</div>
+			<!-- // ui.dropdown -->
+
+			<!-- ui.dropdown -->
+			<div class="btn-group" data-name="assigneeId">
+				<button class="btn dropdown-toggle large" data-toggle="dropdown">
+					<span class="d-label">전체</span>
+					<span class="d-caret"><span class="caret"></span></span>
+				</button>
+				<ul class="dropdown-menu">
+					<li data-value="" data-selected="true" class="active"><a href="javascript:void(0)">전체</a></li>
+					<li data-value="0"><a href="javascript:void(0)">담당자 없음</a></li>
+				</ul>
+			</div>
+			<!-- // ui.dropdown -->
+
+		</div>
+		<!-- // select -->
+		<hr/>
+		
+		<h3>Form</h3>
+		<div>
+			<p class="css">.form-search</p>
+			<form class="form-search">
+				<input type="text" class="text" name="filter" placeholder="현재 프로젝트에서 검색"><!--
+		 	 --><button type="button" class="btn">검색</button>
+			</form>
+			
+			<p class="css">.form-searchbar</p>
+			<form class="form-searchbar">
+				<input type="text" class="text" name="filter"><!-- 
+			 --><button type="button" class="ico ico-search"></button>
+			</form>
+		</div>
+		<hr/>
+		<!-- // input -->
+		
+		<h3>Labels</h3>
+		<div>
+			<p class="css">.issue-label</p>
+			<p>
+				<button class="issue-label">Clean</button>
+				<button class="issue-label">Fresh</button>
+				<button class="issue-label">Modern</button>
+				<button class="issue-label">Unique</button>
+			</p>
+			<p class="css">.issue-label .active</p>
+			<p>
+				<button class="issue-label active" style="background-color:#da5454; color:#fff;">Clean<span class="delete">&times;</span></button>
+				<button class="issue-label active" style="background-color:#ff9933; color:#fff;">Fresh<span class="delete">&times;</span></button>
+				<button class="issue-label active" style="background-color:#ffcc33; color:#fff;">Modern<span class="delete">&times;</span></button>
+				<button class="issue-label active" style="background-color:#22b4b9; color:#fff;">Unique<span class="delete">&times;</span></button>
+			</p>
+			<p class="css">.issue-label .active .editable</p>
+			<p>
+				<button class="issue-label active editable" style="background-color:#da5454; color:#fff;">Clean<span class="delete">&times;</span></button>
+				<button class="issue-label active editable" style="background-color:#ff9933; color:#fff;">Fresh<span class="delete">&times;</span></button>
+				<button class="issue-label active editable" style="background-color:#ffcc33; color:#fff;">Modern<span class="delete">&times;</span></button>
+				<button class="issue-label active editable" style="background-color:#22b4b9; color:#fff;">Unique<span class="delete">&times;</span></button>
+			</p>
+		</div>
+		<!-- // labels -->
+		<hr/>
+		
+		<h3>Avatar</h3>
+		<div>
+			<p class="css">.avatar-wrap</p>
+			<dl>
+				<dt>
+					<span class="css">.small</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap small">
+						<img src="/assets/images/default-avatar-128.png" width="24" height="24">
+					</a>
+				</dd>
+			</dl>
+			<dl>
+				<dt>
+					<span class="css">.medium</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap medium">
+						<img src="/assets/images/default-avatar-128.png" width="32" height="32">
+					</a>
+				</dd>
+			</dl>
+			<dl>
+				<dt>
+					<span class="css">.large</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap large">
+						<img src="/assets/images/default-avatar-128.png" width="64" height="64">
+					</a>
+				</dd>
+			</dl>
+			<dl>
+				<dt>
+					<span class="css">.xlarge</span>
+				</dt>
+				<dd>
+					<a href="#" class="avatar-wrap xlarge">
+						<img src="/assets/images/default-avatar-128.png" width="128" height="128">
+					</a>
+				</dd>
+			</dl>
+		</div>
+		<!-- //avatar -->
+		<hr/>
+		
+		<h3>Tabs</h3>
+		<div>
+			<ul class="nav nav-tabs hive-tabs">
+				<li class="active">
+					<a href="#">파일</a>
+				</li>
+				<li>
+					<a href="#">커밋</a>
+				</li>
+			</ul>
+		</div>
+	</div>
+</div>
+
+<footer class="page-footer-outer">
+	<div class="page-footer">
+		<span class="provider">&copy; <strong>NHN Corp.</strong></span>
+	</div>
+</footer>
+
+</body>
+</html>(No newline at end of file)
docs/technical/javascript-module-guide.md (Renamed from public/javascripts/template/ModuleGuide.md)
--- public/javascripts/template/ModuleGuide.md
+++ docs/technical/javascript-module-guide.md
No changes
public/javascripts/common/hive.Pagination.js
--- public/javascripts/common/hive.Pagination.js
+++ public/javascripts/common/hive.Pagination.js
@@ -14,7 +14,7 @@
  * 굳이 페이징 링크를 굳이 동적으로 만들어야 할까? 개선 검토 필요
  */
 hive.Pagination = (function(window, document) {
-	
+
 	var htRegEx = {};
 	
 	/**
@@ -82,7 +82,7 @@
 	 * validateOptions
 	 */
 	function validateOptions(options) {
-		if (!Number.isFinite(options.current)) {
+		if (!$.isNumeric(options.current)) {
 			throw new Error("options.current is not valid: " + options.current);
 		}
 	}
@@ -105,7 +105,7 @@
 		var pageNumFromUrl;
 		var paramNameForPage = options.paramNameForPage || 'pageNum';
 
-		if (!Number.isFinite(options.current)) {
+		if (!$.isNumeric(options.current)) {
 			query = getQuery(options.url);
 			pageNumFromUrl  = parseInt(valueFromQuery(paramNameForPage, query));
 			options.current = pageNumFromUrl || options.firstPage;
public/javascripts/common/hive.ui.Dropdown.js
--- public/javascripts/common/hive.ui.Dropdown.js
+++ public/javascripts/common/hive.ui.Dropdown.js
@@ -42,7 +42,7 @@
 		 */
 		function _initElement(htOptions){
 			htElement.welContainer = $(htOptions.elContainer);
-			htElement.welSelectedLabel = htElement.welContainer.find("button.d-label");
+			htElement.welSelectedLabel = htElement.welContainer.find(".d-label");
 			htElement.waItems = htElement.welContainer.find(".dropdown-menu li");
 		}
 		
Add a comment
List