├── .gitignore ├── .gitmodules ├── readme.md ├── bake.js ├── source └── theme.less └── demo └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | build/*.less 2 | source/*.css 3 | source/vendor/*.css 4 | 5 | .DS_Store -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "source/vendor/base"] 2 | path = source/vendor/base 3 | url = git://github.com/ericmuyser/jquery-ui-less-theme.git 4 | [submodule "source/vendor/moar"] 5 | path = source/vendor/moar 6 | url = git://github.com/ericmuyser/moar.git 7 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # jQuery UI theme: "Cocoa" 2 | 3 | Cocoa-style theme for jQuery UI. A picture is worth a thousand words ([and so is the demo](http://ericmuyser.github.com/jquery-ui-theme-cocoa/demo)): 4 | 5 |  6 | 7 | ## Links 8 | 9 | * [Demo](http://ericmuyser.github.com/jquery-ui-theme-cocoa/demo) 10 | 11 | ## Getting started 12 | 13 | * Clone the repo: `git clone git@github.com:ericmuyser/jquery-ui-theme-cocoa.git` 14 | * Include the files from `build` in a theme directory as you normally would, and use `theme.css` on your page. 15 | 16 | ## Contribute 17 | 18 | * Fork and clone your repository. 19 | * Run: `git submodule update`. 20 | * Update `source/theme.less`. 21 | * ??? 22 | * Push! 23 | 24 | ## TODO 25 | 26 | * Add more styles. 27 | * Add styles for common (non-official) plugins. 28 | 29 | # Credit 30 | 31 | Thanks to Tait Brown for the [Aristo theme](https://github.com/taitems/Aristo-jQuery-UI-Theme), used as a basis. -------------------------------------------------------------------------------- /bake.js: -------------------------------------------------------------------------------- 1 | var stalker = require('stalker'); 2 | var spawn = require('child_process').spawn; 3 | var sys = require('sys'); 4 | var fs = require('fs'); 5 | 6 | var exec = function(command, params) { 7 | var subprocess = spawn(command, params); 8 | 9 | subprocess.stdout.on('data', function(data) { 10 | sys.print(data.asciiSlice(0, data.length)); 11 | }); 12 | 13 | subprocess.stderr.on('data', function(data) { 14 | sys.print(data.asciiSlice(0, data.length)); 15 | }); 16 | }; 17 | 18 | 19 | var baker = function(input_path, output_path) { 20 | stalker.watch(input_path, function(err, file_path) { 21 | if(err) { 22 | console.log('Error: ' + err); 23 | 24 | return; 25 | } 26 | 27 | var extension = file_path.split('.').pop(); 28 | 29 | if(extension !== 'less') 30 | return; 31 | 32 | var compile = function() { 33 | var new_file_path = file_path.replace(input_path, output_path).replace(/^.*\\/, '').replace(/\.[^\.]*$/, '.css'); 34 | console.log('less - compiled ' + new_file_path); 35 | exec('lessc', [file_path, new_file_path]); 36 | }; 37 | 38 | compile(); 39 | 40 | fs.watchFile(file_path, function(curr, prev) { 41 | if(curr.mtime > prev.mtime) 42 | compile(); 43 | }); 44 | }); 45 | }; 46 | 47 | baker(__dirname + '/source/theme.less', __dirname + '/build/theme.css'); -------------------------------------------------------------------------------- /source/theme.less: -------------------------------------------------------------------------------- 1 | @import "vendor/moar/source/helper"; 2 | @import "vendor/base/source/jquery.ui.all"; 3 | 4 | @font-1: Verdana, Arial, sans-serif; 5 | 6 | .ui-widget { 7 | font-family: @font-1; 8 | 9 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { 10 | font-family: @font-1; 11 | } 12 | } 13 | 14 | .ui-widget-content { 15 | border: 1px solid #4A4A4A; 16 | background: #fff; 17 | color: #4f4f4f; 18 | 19 | a { 20 | color: #4f4f4f; 21 | } 22 | } 23 | 24 | .ui-widget-header { 25 | border: 1px solid #4A4A4A; 26 | color: #4f4f4f; 27 | .vertical-gradient(#ededed, #c4c4c4); 28 | 29 | a { 30 | color: #4f4f4f; 31 | } 32 | } 33 | 34 | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { 35 | border: 1px solid #4a4a4a; 36 | color: #373737; 37 | .vertical-gradient(#ededed, #c4c4c4); 38 | .inner-shadow(rgba(255, 255, 255, 0.6), 0px, 1px, 0px); 39 | } 40 | 41 | .ui-state-default { 42 | a, a:link, a:visited { 43 | color: #4f4f4f; 44 | } 45 | 46 | .ui-icon { 47 | background-image: url(images/ui-icons_454545_256x240.png); 48 | } 49 | } 50 | 51 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { 52 | border: 1px solid #070707; 53 | color: #070707; 54 | } 55 | 56 | .ui-state-hover { 57 | a, a:hover { 58 | color: #313131; 59 | } 60 | } 61 | 62 | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { 63 | .hide-outline; 64 | color: #1c4257; 65 | border: 1px solid #7096ab; 66 | .vertical-gradient(#b9e0f5, #92bdd6); 67 | .hide-shadow; 68 | } 69 | 70 | .ui-state-active { 71 | a, a:link, a:visited { 72 | color: #313131; 73 | } 74 | } 75 | 76 | .ui-state-success, .ui-widget-content .ui-state-success, .ui-widget-header .ui-state-success { 77 | border: 2px solid #7ADD83; 78 | background: #C2F4D6; 79 | color: #1D1F21; 80 | .outer-shadow(#D6DBDD, 0, 1px, 5px); 81 | 82 | .ui-icon { 83 | background-image: url(images/ui-icons_454545_256x240.png); 84 | margin-top: -1px; 85 | } 86 | } 87 | 88 | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { 89 | border: 1px solid #d2dbf4; 90 | background: #f4f8fd; 91 | color: #0d2054; 92 | 93 | .ui-icon { 94 | background-image: url(images/ui-icons_454545_256x240.png); 95 | margin-top: -1px; 96 | } 97 | } 98 | 99 | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { 100 | border: 1px solid #e2d0d0; 101 | background: #fcf0f0; 102 | color: #280b0b; 103 | 104 | .ui-icon { 105 | background: url(images/icon_sprite.png) -16px 0 no-repeat !important; 106 | margin-top: -1px; 107 | } 108 | } 109 | 110 | .ui-state-error-text { 111 | .ui-icon { 112 | background: url(images/icon_sprite.png) -16px 0 no-repeat !important; 113 | } 114 | } 115 | 116 | .ui-icon-info { 117 | background: url(images/icon_sprite.png) 0 0 no-repeat !important; 118 | } 119 | 120 | .ui-corner-tl { 121 | .border-radius(0px, 0px, 0px, 4px); 122 | } 123 | 124 | .ui-corner-tr { 125 | .border-radius(4px, 0px, 0px, 0px); 126 | } 127 | 128 | .ui-corner-bl { 129 | .border-radius(0px, 0px, 4px, 0px); 130 | } 131 | 132 | .ui-corner-br { 133 | .border-radius(0px, 4px, 0px, 0px); 134 | } 135 | 136 | .ui-corner-top { 137 | .border-radius(4px, 0px, 0px, 4px); 138 | } 139 | 140 | .ui-corner-bottom { 141 | .border-radius(0px, 4px, 4px, 0px); 142 | } 143 | 144 | .ui-corner-right { 145 | .border-radius(4px, 4px, 0px, 0px); 146 | } 147 | 148 | .ui-corner-left { 149 | .border-radius(0px, 0px, 4px, 4px); 150 | } 151 | 152 | .ui-corner-all { 153 | .border-radius(4px, 4px, 4px, 4px); 154 | } 155 | 156 | .ui-widget-overlay { 157 | background: #262b33; 158 | opacity: .70; 159 | } 160 | 161 | .ui-widget-shadow { 162 | background: #000; 163 | } 164 | 165 | .ui-accordion { 166 | .ui-accordion-header, .ui-accordion-content { 167 | .border-radius(0px); 168 | } 169 | 170 | .ui-accordion-header { 171 | .ui-icon { 172 | left: 5px; 173 | margin-top: -8px; 174 | position: absolute; 175 | top: 50%; 176 | } 177 | 178 | a { 179 | padding: 5px 5px 5px 23px; 180 | font-size: 12px; 181 | .bold; 182 | .block; 183 | } 184 | } 185 | } 186 | 187 | .ui-autocomplete { 188 | z-index: 3 !important; 189 | .border-radius(0px); 190 | .outer-shadow(rgba(0, 0, 0, 0.3), 0px, 1px, 5px); 191 | } 192 | 193 | .ui-menu .ui-menu-item { 194 | a.ui-state-hover, a.ui-state-active { 195 | background: #5f83b9; 196 | color: #fff; 197 | text-shadow: 0px 1px 1px #234386; 198 | border-color: #466086; 199 | .border-radius(0px); 200 | } 201 | } 202 | 203 | .ui-button { 204 | .transition(0.2s, ease-in-out); 205 | .disable-selection; 206 | 207 | .ui-button-text { 208 | line-height: 1.3; 209 | font-size: 12px; 210 | .bold; 211 | text-shadow: 0 1px 0 rgba(255,255,255,0.6); 212 | } 213 | } 214 | 215 | .ui-button.ui-state-hover { 216 | .vertical-gradient(#606060, #747474); 217 | .inner-shadow(#242424, 1px, 3px, 4px); 218 | color: #fefefe; 219 | 220 | .ui-button-text { 221 | text-shadow: 1px 1px 0 #464646; 222 | } 223 | } 224 | 225 | .ui-button.ui-state-focus { 226 | color: #1c4257; 227 | border-color: #7096ab; 228 | .vertical-gradient(#92bdd6, #b9e0f5); 229 | .hide-shadow; 230 | .hide-outline; 231 | } 232 | 233 | .ui-button-text-only { 234 | .ui-button-text { 235 | padding: 2px 7px; 236 | } 237 | } 238 | 239 | .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { 240 | padding: 2px; 241 | } 242 | 243 | .ui-button-text-icon-primary { 244 | .ui-button-text { 245 | padding: 2px 10px 2px 25px; 246 | } 247 | } 248 | 249 | .ui-button-text-icons { 250 | .ui-button-text { 251 | padding: 2px 25px 2px 25px; 252 | } 253 | } 254 | 255 | .ui-button-text-icon-secondary { 256 | .ui-button-text { 257 | padding: 2px 7px 2px 12px; 258 | } 259 | } 260 | 261 | .ui-buttonset { 262 | .ui-button { 263 | margin-right: -3px; 264 | 265 | &.ui-state-active { 266 | border-color: #111929; 267 | .vertical-gradient(#606060, #747474); 268 | .inner-shadow(#242424, 1px, 3px, 4px); 269 | color: #fefefe; 270 | 271 | .ui-button-text { 272 | text-shadow: 1px 1px 0 #464646; 273 | } 274 | } 275 | } 276 | } 277 | 278 | .ui-dialog { 279 | padding: 0; 280 | 281 | .ui-dialog-titlebar-close:hover, .ui-dialog-titlebar-close:focus { 282 | border: 0; 283 | } 284 | 285 | .ui-dialog-titlebar { 286 | padding: 7px 10px 6px 10px; 287 | border: none; 288 | border-bottom: 1px solid #979797; 289 | .border-radius(0px); 290 | } 291 | 292 | .ui-dialog-title { 293 | margin: 1px 16px 20px 0; 294 | font-size: 14px; 295 | text-shadow: 0 1px 0 rgba(255,255,255,0.5); 296 | } 297 | 298 | .ui-dialog-titlebar-close { 299 | right: 8px; 300 | top: 55%; 301 | width: 16px; 302 | padding: 0; 303 | height: 16px; 304 | 305 | span { 306 | background: url(images/icon_sprite.png) 0 -16px no-repeat; 307 | } 308 | 309 | &:hover span { 310 | background-position: -16px -16px; 311 | } 312 | } 313 | } 314 | 315 | .ui-slider { 316 | background: #d7d7d7; 317 | .inner-shadow(rgba(0, 0, 0, 0.5), 0px, 1px, 2px); 318 | 319 | .ui-state-hover, .ui-state-active { 320 | background-position: 0 0; 321 | } 322 | 323 | .ui-slider-handle { 324 | background: url(images/slider_handles.png) 0px -23px no-repeat; 325 | width: 23px; 326 | height: 23px; 327 | border: none; 328 | .hide-outline; 329 | .hide-shadow; 330 | } 331 | 332 | .ui-slider-range { 333 | background: #a3cae0; 334 | .inner-shadow(rgba(17, 35, 45, 0.6), 0px, 1px, 2px); 335 | } 336 | } 337 | 338 | .ui-slider-horizontal { 339 | height: 5px; 340 | 341 | .ui-slider-handle { 342 | top: -8px; 343 | margin-left: -13px; 344 | } 345 | } 346 | 347 | .ui-slider-vertical { 348 | width: 5px; 349 | 350 | .ui-slider-handle { 351 | left: -8px; 352 | margin-bottom: -13px; 353 | } 354 | } 355 | 356 | .ui-tabs { 357 | border: 0; 358 | 359 | .ui-tabs-hide { 360 | display: none !important; 361 | } 362 | 363 | .ui-tabs-nav { 364 | padding: 0; 365 | background: transparent; 366 | border-width: 0 0 1px 0; 367 | .border-radius(0px); 368 | 369 | li { 370 | a { 371 | font-size: 12px; 372 | .bold; 373 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 374 | } 375 | 376 | &.ui-tabs-selected { 377 | background: #fff; 378 | border-color: #4A4A4A; 379 | padding-bottom: 1px; 380 | } 381 | 382 | &.ui-tabs-selected a, &.ui-state-disabled a, &.ui-state-processing a { 383 | .hide-outline; 384 | } 385 | } 386 | } 387 | 388 | .ui-tabs-panel { 389 | border-width: 0 1px 1px 1px; 390 | .border-radius(0px); 391 | } 392 | } 393 | 394 | .ui-datepicker { 395 | padding: 0; 396 | border: 0 none; 397 | .outer-shadow(rgba(0, 0, 0, 0.8), 0px, 1px, 3px); 398 | 399 | .ui-datepicker-prev, .ui-datepicker-next { 400 | top: 6px; 401 | } 402 | 403 | .ui-datepicker-prev-hover, .ui-datepicker-next-hover { 404 | border: 1px none; 405 | background-color: transparent; 406 | } 407 | 408 | .ui-datepicker-header { 409 | padding: 3.5px 0; 410 | border: none; 411 | border-bottom: 1px solid #b6b6b6; 412 | .border-radius(0px); 413 | } 414 | 415 | .ui-datepicker-prev span { 416 | background-position: 0px -32px !important; 417 | background: url(images/icon_sprite.png) no-repeat; 418 | } 419 | 420 | .ui-datepicker-next span { 421 | background-position: -16px -32px !important; 422 | background: url(images/icon_sprite.png) no-repeat; 423 | } 424 | 425 | .ui-datepicker-prev-hover span { 426 | background-position: 0px -48px !important; 427 | } 428 | 429 | .ui-datepicker-next-hover span { 430 | background-position: -16px -48px !important; 431 | } 432 | 433 | .ui-datepicker-title { 434 | font-size: 12px; 435 | text-shadow: 0 1px 0 rgba(255,255,255,0.6); 436 | } 437 | 438 | .ui-state-default { 439 | .hide-background; 440 | border-color: #fff; 441 | } 442 | 443 | .ui-state-active { 444 | background: #5f83b9; 445 | border-color: #5f83b9; 446 | color: #fff; 447 | .bold; 448 | text-shadow: 0 1px 1px #234386; 449 | } 450 | } 451 | 452 | .ui-datepicker-cover { 453 | position: absolute; 454 | } 455 | 456 | .ui-progressbar { 457 | height: 12px; 458 | background: #fff url(images/progress_bar.gif) 0 -14px repeat-x; 459 | 460 | .ui-progressbar-value { 461 | background: url(images/progress_bar.gif) 0 0 repeat-x; 462 | } 463 | } 464 | 465 | textarea, input:not([type="checkbox"]):not([type="radio"]):not([type="file"]) { 466 | 467 | } 468 | 469 | textarea, input { 470 | .round(10px); 471 | background: #fff; 472 | border: 1px solid #8c8c8c; 473 | border-top: 1px solid #626262; 474 | padding: 2px 5px 3px 10px; 475 | .inner-outer-shadow(rgba(0, 0, 0, 0.2), 0px, 1px, 0px, rgba(255, 255, 255, 0.2), 0px, 1px, 0px); 476 | } 477 | 478 | textarea { 479 | padding: 5px 5px 5px 10px; 480 | } 481 | 482 | input[type="submit"], input[type="button"] { 483 | .hand; 484 | .hide-outline; 485 | .transition(0.25s, ease-in-out); 486 | padding: 3px 5px; 487 | .bold; 488 | border: 1px solid #4a4a4a; 489 | color: #373737; 490 | .vertical-gradient(#ededed, #c4c4c4); 491 | .inner-shadow(rgba(255, 255, 255, 0.6), 0px, 1px, 0px); 492 | .transition(0.2s, ease-in-out); 493 | .disable-selection; 494 | line-height: 12px; 495 | font-size: 12px; 496 | .bold; 497 | text-shadow: 0 1px 0 rgba(255,255,255,0.6); 498 | 499 | &:hover, &:focus { 500 | .vertical-gradient(#606060, #747474); 501 | .inner-shadow(#242424, 1px, 3px, 4px); 502 | color: #fefefe; 503 | text-shadow: 1px 1px 0 #464646; 504 | } 505 | } 506 | 507 | select { 508 | 509 | } -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |136 | This page demonstrates all available components of the "Cocoa" theme for jQuery UI. jQuery and jQuery UI are pulled from the Google CDN. 137 |
138 | 139 | 140 |223 | Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer 224 | ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit 225 | amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut 226 | odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. 227 |
228 |232 | Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet 233 | purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor 234 | velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In 235 | suscipit faucibus urna. 236 |
237 |241 | Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. 242 | Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero 243 | ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis 244 | lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. 245 |
246 |255 | Cras dictum. Pellentesque habitant morbi tristique senectus et netus 256 | et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in 257 | faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia 258 | mauris vel est. 259 |
260 |261 | Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. 262 | Class aptent taciti sociosqu ad litora torquent per conubia nostra, per 263 | inceptos himenaeos. 264 |
265 |Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
290 | Change 291 |Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse eget diam nec urna hendrerit tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum aliquam ligula non nulla cursus volutpat. Aliquam malesuada felis nec turpis auctor interdum. Cras et lobortis dolor. Nam sodales, dolor eu cursus faucibus, justo leo vestibulum turpis, id malesuada erat ipsum et leo. Integer id aliquam augue. Proin quis risus magna.
545 | Change 546 |Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
560 | Change 561 |
578 | Input (type: 'text')
579 |
580 |
582 | Input (type: 'email' and 'password')
583 |
584 |
586 | Text Area
587 |
588 |
590 | Other Inputs Remain Fine
591 |
592 |
593 |
594 |
595 |
596 |