From 31062a70a9066c319eaf2e46ab30763cf1128f7c Mon Sep 17 00:00:00 2001 From: Vince Date: Wed, 12 Jun 2013 14:53:47 +0200 Subject: [PATCH] proto init implementation + less --- ...ion.css => preview-animation-section.less} | 8 +- css/preview-film-section.css | 103 -------------- css/preview-film-section.less | 126 ++++++++++++++++++ css/{reset.css => reset.less} | 11 +- css/{style.css => style.less} | 88 ++++++------ css/{tools.css => tools.less} | 122 +++++++++-------- img/canvas_background.png | Bin 0 -> 431 bytes img/dragndrop.png | Bin 0 -> 532 bytes img/duplicate.png | Bin 0 -> 634 bytes img/garbage.png | Bin 0 -> 4857 bytes img/tools/.DS_Store | Bin 6148 -> 0 bytes img/tools/circle-dark.png | Bin 0 -> 3356 bytes img/tools/circle.png | Bin 761 -> 3194 bytes img/tools/eyedropper-dark.png | Bin 0 -> 3918 bytes img/tools/eyedropper.png | Bin 0 -> 3918 bytes img/tools/hand-dark.png | Bin 0 -> 1519 bytes img/tools/hand.png | Bin 672 -> 1065 bytes img/tools/magicwand-dark.png | Bin 0 -> 7703 bytes img/tools/magicwand.png | Bin 0 -> 1982 bytes img/tools/paintbucket-dark.png | Bin 0 -> 4104 bytes img/tools/paintbucket.png | Bin 0 -> 1189 bytes img/tools/pen-dark.png | Bin 0 -> 1679 bytes img/tools/pen.png | Bin 450 -> 1679 bytes img/tools/rectangle.png | Bin 660 -> 2628 bytes .../cursors => tools_legacy}/circle.png | Bin img/{tools => tools_legacy}/color-palette.png | Bin img/tools_legacy/cursors/circle.png | Bin 0 -> 761 bytes .../cursors/eraser.png | Bin img/{tools => tools_legacy}/cursors/hand.png | Bin .../cursors/paint-bucket.png | Bin img/{tools => tools_legacy}/cursors/pen.png | Bin .../cursors/rectangle.png | Bin .../cursors/select.png | Bin .../cursors/vertical-mirror-pen.png | Bin img/{tools => tools_legacy}/cursors/wand.png | Bin img/{tools => tools_legacy}/dropper.png | Bin img/{tools => tools_legacy}/eraser.png | Bin img/{tools/icons => tools_legacy}/hand.png | Bin .../icons/color-palette.png | Bin img/{tools => tools_legacy}/icons/eraser.png | Bin img/tools_legacy/icons/hand.png | Bin 0 -> 672 bytes .../icons/mirror-pen.png | Bin .../icons/paint-bucket.png | Bin img/{tools => tools_legacy}/icons/pen.png | Bin .../icons/rectangle.png | Bin img/{tools => tools_legacy}/icons/select.png | Bin img/{tools => tools_legacy}/icons/stroke.png | Bin .../icons/vertical-mirror-pen.png | Bin img/{tools => tools_legacy}/icons/wand.png | Bin img/{tools => tools_legacy}/mirror-pen.png | Bin img/{tools => tools_legacy}/paint-bucket.png | Bin .../stroke.png => tools_legacy/pen.png} | Bin img/tools_legacy/rectangle.png | Bin 0 -> 660 bytes img/{tools => tools_legacy}/select.png | Bin img/tools_legacy/stroke.png | Bin 0 -> 450 bytes .../vertical-mirror-pen.png | Bin img/{tools => tools_legacy}/wand.png | Bin index.html | 120 +++++++++-------- js/controller/AnimatedPreviewController.js | 6 +- js/controller/DrawingController.js | 21 +-- js/controller/PreviewFilmController.js | 43 +++--- js/lib/less-1.3.3-min.js | 9 ++ 62 files changed, 355 insertions(+), 302 deletions(-) rename css/{preview-animation-section.css => preview-animation-section.less} (74%) delete mode 100644 css/preview-film-section.css create mode 100644 css/preview-film-section.less rename css/{reset.css => reset.less} (78%) rename css/{style.css => style.less} (64%) rename css/{tools.css => tools.less} (63%) create mode 100644 img/canvas_background.png create mode 100644 img/dragndrop.png create mode 100755 img/duplicate.png create mode 100644 img/garbage.png delete mode 100644 img/tools/.DS_Store create mode 100644 img/tools/circle-dark.png create mode 100644 img/tools/eyedropper-dark.png create mode 100644 img/tools/eyedropper.png create mode 100644 img/tools/hand-dark.png create mode 100644 img/tools/magicwand-dark.png create mode 100644 img/tools/magicwand.png create mode 100644 img/tools/paintbucket-dark.png create mode 100644 img/tools/paintbucket.png create mode 100644 img/tools/pen-dark.png mode change 100755 => 100644 img/tools/pen.png mode change 100755 => 100644 img/tools/rectangle.png rename img/{tools/cursors => tools_legacy}/circle.png (100%) rename img/{tools => tools_legacy}/color-palette.png (100%) create mode 100644 img/tools_legacy/cursors/circle.png rename img/{tools => tools_legacy}/cursors/eraser.png (100%) rename img/{tools => tools_legacy}/cursors/hand.png (100%) rename img/{tools => tools_legacy}/cursors/paint-bucket.png (100%) rename img/{tools => tools_legacy}/cursors/pen.png (100%) rename img/{tools => tools_legacy}/cursors/rectangle.png (100%) rename img/{tools => tools_legacy}/cursors/select.png (100%) rename img/{tools => tools_legacy}/cursors/vertical-mirror-pen.png (100%) rename img/{tools => tools_legacy}/cursors/wand.png (100%) rename img/{tools => tools_legacy}/dropper.png (100%) rename img/{tools => tools_legacy}/eraser.png (100%) rename img/{tools/icons => tools_legacy}/hand.png (100%) rename img/{tools => tools_legacy}/icons/color-palette.png (100%) rename img/{tools => tools_legacy}/icons/eraser.png (100%) create mode 100644 img/tools_legacy/icons/hand.png rename img/{tools => tools_legacy}/icons/mirror-pen.png (100%) rename img/{tools => tools_legacy}/icons/paint-bucket.png (100%) rename img/{tools => tools_legacy}/icons/pen.png (100%) rename img/{tools => tools_legacy}/icons/rectangle.png (100%) rename img/{tools => tools_legacy}/icons/select.png (100%) rename img/{tools => tools_legacy}/icons/stroke.png (100%) rename img/{tools => tools_legacy}/icons/vertical-mirror-pen.png (100%) rename img/{tools => tools_legacy}/icons/wand.png (100%) rename img/{tools => tools_legacy}/mirror-pen.png (100%) rename img/{tools => tools_legacy}/paint-bucket.png (100%) rename img/{tools/stroke.png => tools_legacy/pen.png} (100%) create mode 100755 img/tools_legacy/rectangle.png rename img/{tools => tools_legacy}/select.png (100%) create mode 100755 img/tools_legacy/stroke.png rename img/{tools => tools_legacy}/vertical-mirror-pen.png (100%) rename img/{tools => tools_legacy}/wand.png (100%) create mode 100644 js/lib/less-1.3.3-min.js diff --git a/css/preview-animation-section.css b/css/preview-animation-section.less similarity index 74% rename from css/preview-animation-section.css rename to css/preview-animation-section.less index 152ce32e..dd3c93fc 100644 --- a/css/preview-animation-section.css +++ b/css/preview-animation-section.less @@ -1,13 +1,11 @@ + .preview-container { - position : absolute; - bottom : 0; right : 0; - height : 282px; - width : 256px; background : white; border : 0px Solid black; border-radius:5px 0px 0px 5px; box-shadow : 0px 0px 2px rgba(0,0,0,0.2); + font-size: 0; } .preview-container canvas { @@ -16,4 +14,4 @@ #preview-fps { width : 200px; -} \ No newline at end of file +} diff --git a/css/preview-film-section.css b/css/preview-film-section.css deleted file mode 100644 index ffef1946..00000000 --- a/css/preview-film-section.css +++ /dev/null @@ -1,103 +0,0 @@ - -.preview-list-wrapper { - overflow-y: scroll; - position: absolute; - top: 30px; - right:0; - bottom: 0; - left: 0; -} - -.preview-list { - list-style-type: none; - padding-left: 7px; - padding-right: 7px; -} - -.preview-tile { - padding : 10px; - overflow: hidden; - background-color: gray; - border-radius: 2px; - - -webkit-box-shadow: 0 0 7px 0 rgba(0, 0, 0, 1); - box-shadow: 0 0 7px 0 rgba(0, 0, 0, 1); -} - -.preview-tile:hover { - -webkit-box-shadow: 0 0 10px 0 rgba(0, 0, 0, 1); - box-shadow: 0 0 10px 0 rgba(0, 0, 0, 1); -} - -.preview-tile .canvas-container { - float: left; -} - -.preview-tile .tile-view { - float: left; - border: #ccc 1px solid; -} - -.preview-tile .tile-action { - display: block; - cursor: pointer; - width: 30px; - height: 30px; - background-color: transparent; - background-repeat: no-repeat; - background-position: 7px 7px; - border: none; -} - -.preview-tile .tile-action-container { - float: right; - visibility : hidden; - overflow: hidden; -} - -.preview-tile:hover .tile-action-container { - visibility : visible; -} - -.preview-tile .tile-action.duplicate-frame-action { - background-image: url(../img/actions/duplicate.png); -} - -.preview-tile .tile-action.delete-frame-action { - background-image: url(../img/actions/delete.png); -} - -.preview-tile:hover { - background-color: lightgray; -} - -.preview-tile.selected { - background-color: lightyellow; -} - -.preview-tile.ui-draggable-dragging { - opacity: 0.3; -} - - -.preview-tile.droppable-active { - background-color: pink; -} - -.interstitial-tile.droppable-hover-active { - background-color: purple; -} - -.preview-tile.droppable-hover-active { - background-color: yellow; -} - -.interstitial-tile { - visibility: hidden; - background-color: blue; - height: 10px; -} - -.show-interstitial-tiles .interstitial-tile { - visibility: visible; -} \ No newline at end of file diff --git a/css/preview-film-section.less b/css/preview-film-section.less new file mode 100644 index 00000000..56a158cb --- /dev/null +++ b/css/preview-film-section.less @@ -0,0 +1,126 @@ + +.preview-list-wrapper { + overflow-y: scroll; + overflow-x: hidden; + height: 100%; +} + +.preview-list { + list-style-type: none; + padding-right: 7px; +} + +.preview-tile { + position: relative; + border: #444 3px solid; + border-radius: 3px; +} + +.preview-tile:hover { + border: #999 3px solid; +} + +.preview-tile .tile-overlay { + z-index: 10; + position: absolute; + background-color: rgba(0, 0, 0, 0.3); + opacity: 0; + height: 30px; + width: 30px; + border: none; +} + +.preview-tile:hover .tile-overlay { + opacity: 1.0; +} + +.tile-overlay.tile-count { + display: block; + opacity: 0.5; + border-bottom-right-radius: 3px; + top: 0; + left: 0; + font-size: 14px; + line-height: 30px; + color: white; + font-weight: bold; + text-align: center; + cursor: default; +} + +.preview-tile .tile-overlay.delete-frame-action { + background-image: url(../img/garbage.png); + background-repeat: no-repeat; + top: 0; + right: 0; + border-bottom-left-radius: 3px; + height: 30px; + width: 30px; + background-position: 5px 5px; + background-size: 20px; + cursor: pointer; +} + +.preview-tile .tile-overlay.duplicate-frame-action { + bottom: 0; + right: 0; + border-bottom-left-radius: 3px; + background-image: url(../img/duplicate.png); + background-repeat: no-repeat; + background-position: 5px 5px; + background-size: 20px; + cursor: pointer; +} + +.preview-tile .tile-overlay.dnd-action { + bottom: 0; + left: 0; + border-top-right-radius: 3px; + background-image: url(../img/dragndrop.png); + background-repeat: no-repeat; + background-position: 5px 5px; + background-size: 20px; + cursor: move; +} + +.preview-tile.selected { + border-color: gold; +} + +.preview-tile.selected:after { + content: " "; + position: absolute; + top: 38px; + right: -15px; + border: transparent 4px solid; + border-left-color: gold; + border-width: 6px; + border-style: solid; +} + +.preview-tile.ui-draggable-dragging { + opacity: 0.3; +} + + +.preview-tile.droppable-active { + background-color: pink; +} + +.interstitial-tile.droppable-hover-active { + background-color: purple; +} + +.preview-tile.droppable-hover-active { + background-color: yellow; +} + +.interstitial-tile { + visibility: hidden; + background-color: blue; + height: 10px; +} + +.show-interstitial-tiles .interstitial-tile { + visibility: visible; +} \ No newline at end of file diff --git a/css/reset.css b/css/reset.less similarity index 78% rename from css/reset.css rename to css/reset.less index 30a499a0..46bc9cd7 100644 --- a/css/reset.css +++ b/css/reset.less @@ -23,11 +23,14 @@ ul, li { /* Force apparition of scrollbars on leopard */ ::-webkit-scrollbar { -webkit-appearance: none; - width: 10px; + width: 6px; } ::-webkit-scrollbar-thumb { - border-radius: 4px; - background-color: rgba(180,180,180,.7); - -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5); + border-radius: 2px; + background-color: #666; +} + +::-webkit-scrollbar-track { + background-color: #444; } \ No newline at end of file diff --git a/css/style.css b/css/style.less similarity index 64% rename from css/style.css rename to css/style.less index 84f908f7..0e82f0c1 100644 --- a/css/style.css +++ b/css/style.less @@ -1,47 +1,53 @@ -/** - * Top menubars - */ -.menubar { - background-color: #fff; - width: 100%; - height: 30px; +body { + background: -webkit-radial-gradient(circle, #000, #373737); } - - /** * Application layout */ -.left-section { +@toolbar-height: 104px; + +.column-wrapper { + text-align: center; + font-size: 0; position: absolute; - top: 0; - bottom: 0; - width: 220px; - background: #666; -} - -.main-panel { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 220px; - background: #ccc; -} - - -/** - * CSS Helpers - */ - -.overlay-total { - position: absolute; - top: 0; - right:0; - bottom: 0; left: 0; + top: @toolbar-height; + right: 0; + bottom: 0; +} + +.left-column { + display: inline-block; + vertical-align: top; + height: 100%; + margin-right: 7px; +} + +.main-column { + display: inline-block; + height: 100%; + position: relative; +} + +.drawing-canvas-container { + font-size: 0; +} + +.top-section { + position: absolute; + bottom: 100%; + min-width: 400px; + margin-bottom: 5px; +} + +.right-column { + display: inline-block; + vertical-align: top; + background: blue; + margin-left: 10px; } @@ -60,7 +66,7 @@ } .canvas-container .canvas-background { - background: url(../img/transparent_background.png) repeat; + background: url(../img/canvas_background.png) repeat; position: absolute; top: 0; right: 0; @@ -75,16 +81,6 @@ z-index: 10; } -.drawing-canvas { - float: left; -} - -.drawing-canvas-container { - float: left; -} - - - /** * User messages */ diff --git a/css/tools.css b/css/tools.less similarity index 63% rename from css/tools.css rename to css/tools.less index 07e9aeb8..956822f0 100644 --- a/css/tools.css +++ b/css/tools.less @@ -1,39 +1,37 @@ -.tools-group { - float: left; - height: 30px; - border-left: 1px solid #ccc; - padding: 0 3px; + +.tools-wrapper, +.options-wrapper, +.palette-wrapper { + float: left; +} + +.tools-wrapper { + width: 70%; } .tool-icon { float: left; cursor : pointer; - width: 30px; - height: 30px; - background-color: transparent; + width: 46px; + height: 46px; + margin: 1px; + background-color: rgba(200,200,200, .1); background-repeat: no-repeat; - background-position: 7px 7px; + background-position: 9px 9px; + background-size: 28px; } -/* - * Framesheet level actions: - */ -.tool-icon.tool-save { - background-image: url(../img/actions/save.png); +.tool-icon.selected { + cursor: default; + background-color: #444; + cursor: normal; + border: 1px gold solid; + margin: 0; } -.tool-icon.tool-export { - background-image: url(../img/actions/image-export.png); -} - -.tool-icon.tool-upload { - background-image: url(../img/actions/image-upload.png); -} - - -.tool-icon.tool-add-frame { - background-image: url(../img/actions/add.png); -} +.tool-icon:hover { + background-color: #444; +} /* * Tool icons: @@ -43,23 +41,23 @@ } .tool-icon.tool-vertical-mirror-pen { - background-image: url(../img/tools/vertical-mirror-pen.png); + background-image: url(../img/tools_legacy/vertical-mirror-pen.png); } .tool-icon.tool-paint-bucket { - background-image: url(../img/tools/paint-bucket.png); + background-image: url(../img/tools/paintbucket.png); } .tool-icon.tool-eraser { - background-image: url(../img/tools/eraser.png); + background-image: url(../img/tools_legacy/eraser.png); } .tool-icon.tool-stroke { - background-image: url(../img/tools/stroke.png); + background-image: url(../img/tools_legacy/stroke.png); } .tool-icon.tool-rectangle { - background-image: url(../img/tools/rectangle.png); + background-image: url(../img/tools_legacy/rectangle.png); } .tool-icon.tool-circle { @@ -71,67 +69,63 @@ } .tool-icon.tool-rectangle-select { - background-image: url(../img/tools/select.png); + background-image: url(../img/tools_legacy/select.png); } .tool-icon.tool-shape-select { - background-image: url(../img/tools/wand.png); + background-image: url(../img/tools/magicwand.png); } .tool-icon.tool-colorpicker { - background-image: url(../img/tools/dropper.png); + background-image: url(../img/tools/eyedropper.png); } -/*.tool-icon.tool-palette { - background-image: url(../img/tools/color-palette.png); -}*/ - /* * Tool cursors: */ .tool-paint-bucket .drawing-canvas-container:hover { - cursor: url(../img/tools/paint-bucket.png) 12 12, pointer; + cursor: url(../img/tools_legacy/paint-bucket.png) 12 12, pointer; } .tool-vertical-mirror-pen .drawing-canvas-container:hover { - cursor: url(../img/tools/vertical-mirror-pen.png) 5 15, pointer; + cursor: url(../img/tools_legacy/vertical-mirror-pen.png) 5 15, pointer; } .tool-pen .drawing-canvas-container:hover { - cursor: url(../img/tools/pen.png) 0 15, pointer; + cursor: url(../img/tools_legacy/pen.png) 0 15, pointer; } .tool-eraser .drawing-canvas-container:hover { - cursor: url(../img/tools/eraser.png) 0 15, pointer; + cursor: url(../img/tools_legacy/eraser.png) 0 15, pointer; } .tool-stroke .drawing-canvas-container:hover { - cursor: url(../img/tools/pen.png) 0 15, pointer; + cursor: url(../img/tools_legacy/pen.png) 0 15, pointer; } .tool-rectangle .drawing-canvas-container:hover { - cursor: url(../img/tools/rectangle.png) 0 15, pointer; + cursor: url(../img/tools_legacy/rectangle.png) 0 15, pointer; } .tool-circle .drawing-canvas-container:hover { - cursor: url(../img/tools/circle.png) 2 15, pointer; + cursor: url(../img/tools_legacy/circle.png) 2 15, pointer; } .tool-move .drawing-canvas-container:hover { - cursor: url(../img/tools/hand.png) 15 15, pointer; + cursor: url(../img/tools_legacy/hand.png) 15 15, pointer; } .tool-rectangle-select .drawing-canvas-container:hover { - cursor: url(../img/tools/select.png) 15 15, pointer; + cursor: url(../img/tools_legacy/select.png) 15 15, pointer; } .tool-shape-select .drawing-canvas-container:hover { - cursor: url(../img/tools/wand.png) 15 15, pointer; + cursor: url(../img/tools_legacy/wand.png) 15 15, pointer; } .tool-colorpicker .drawing-canvas-container:hover { - cursor: url(../img/tools/dropper.png) 0 15, pointer; + cursor: url(../img/tools_legacy/dropper.png) 0 15, pointer; } .tool-grid, @@ -141,15 +135,6 @@ cursor: pointer; } -.tool-icon.selected { - cursor: auto; - background-color: #eee; -} - -.tool-icon:hover { - background-color: #eee; -} - .tool-color-picker { padding: 5px 0 0 5px; height: 25px; @@ -209,3 +194,24 @@ #fff 100% ); } + +/* + * Framesheet level actions: + */ +.tool-icon.tool-save { + background-image: url(../img/actions/save.png); +} + +.tool-icon.tool-export { + background-image: url(../img/actions/image-export.png); +} + +.tool-icon.tool-upload { + background-image: url(../img/actions/image-upload.png); +} + + +.tool-icon.tool-add-frame { + background-image: url(../img/actions/add.png); +} + diff --git a/img/canvas_background.png b/img/canvas_background.png new file mode 100644 index 0000000000000000000000000000000000000000..dc80a413ddc638cffab0be44d9dd7f8eaa2869f7 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^u|S;2!3HF^oLnmkq}Y|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sfT{a#bMw!Krs+EC4YMCJsCC>S|xv6<2KrRD=b5Uwy zNotBhd1gt5g1e`0fI@zrLZX6iV)E1{@zD$nj9i{Bjv*Dd-rhLK$!sX#9H{=}(Y-tM z+IDKPYZMfdrq}+@>Um(y(=3<0_Pa&Gxymm#-|juW{eSI1l!hOPWhAO?>xdciF99C9hebiqiL8{`&H7&g8tk6Tq65DBpeg z>q{MqmXg{k``b&R^+5(WTD|lr-(|OVe(t5U;vk;F+>#~MvGebpH+y-F8^oL7XLV`r zI{)|SvrAsLf_NV4vM>FvFaN&Tch^@Z5O2xkzLMpyFaN%&cDG6q$OBsJz6+}}zOg^I We0gJwNMa}`+&o?VT-G@yGywp7?!83- literal 0 HcmV?d00001 diff --git a/img/dragndrop.png b/img/dragndrop.png new file mode 100644 index 0000000000000000000000000000000000000000..b1657dfb6bc3cf30e5993e9710e88181586476cb GIT binary patch literal 532 zcmV+v0_**WP)O)B`7-NVngUwkF z9B|0iclJrYFflVywgQRU)Afdk#0O{Q1Arrdiiqj}H|;+EaT2GczF2T zOlk$50qnKcdjKDI&u0J^?VE2R`dxhsStj7SN>2gCPhSgVfD8~Cpes@hFWC7o^R6p& z&1A8&RbpKpxMU#--!a)?l@caxvm$^IViaIZn5_&jfG`5sRAmGJJ%|Co3`txr0Wh~I z>PZOz2LM$<8T1ICF0>a&44_vBs>A@Qft>F4)~ChEB#9>{aadtpiVxx-qOa{`p-t3* zO;qAdXdwwTDgal7)!q2SDrS-o~

i6}2F80r;{Xxg8QG%^d9(l%5b>WATOfj*)CX0gN~t#h?*J;LR2>u`Rr>>F WT?4L{X$A3OA>zMQFCW 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 A>i_@% literal 0 HcmV?d00001 diff --git a/img/tools/.DS_Store b/img/tools/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 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 literal 0 HcmV?d00001 diff --git a/img/tools/circle.png b/img/tools/circle.png index a186a26bbe4846ee539d230d7b0e722df019bf0e..5f88d0969b7a8f448584fddf16fdcc8d0ac86e9c 100644 GIT binary patch literal 3194 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 diff --git a/img/tools/eyedropper-dark.png b/img/tools/eyedropper-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccfe8b20e1344d02e75fab7adc40b3ce54ac103 GIT binary patch literal 3918 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 literal 0 HcmV?d00001 diff --git a/img/tools/eyedropper.png b/img/tools/eyedropper.png new file mode 100644 index 0000000000000000000000000000000000000000..84a27d22a24e26bf3af0f122c91d9e1b7c9d982d GIT binary patch literal 3918 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 literal 0 HcmV?d00001 diff --git a/img/tools/hand-dark.png b/img/tools/hand-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6c641998b2448cd20c1ccb781c9129be33d38f89 GIT binary patch literal 1519 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 literal 0 HcmV?d00001 diff --git a/img/tools/magicwand.png b/img/tools/magicwand.png new file mode 100644 index 0000000000000000000000000000000000000000..a7dea84539c5ab70d087faf44072285fe1e202bd GIT binary patch literal 1982 zcmbVNeNYo;8h>_K$O2Uof(AUkgIJW~&XQIa@(EMNvsw?FsGN1uY6HW;Y&` zFZr+x$Q1diR;&zaKWK||Nc6PAaia`~cpwHa2vh?kRAC{>-W%_aYyW7cbMMUV^X%{W zc%R>I-rdcQ+bUb+w9E+r7R79q#sgr;#ej4`X3wFEe?i9Koh>pcvS_iJT4`h)(>Cw= z0Ki#jyD<3ptUCgE=`n9b^9CL4z$3D^KqE%TmKf=VKWFwE20ISzleyY&t2@PUo%jCe zoaC{6C4a5-=K8ksq%4=}NsoM^(boRwt2*--8K=IBmQpl6lUn2iuA?G542(GxP$~f* zO66pQsdE#Ahht#KS+j_Q8yW8-+`SKFl&W@!FpNrrYzp`x8j=KpA_F^qWz=ROD#}nOBW@}e3ss!jkg-5uXsYCm}iwc$pylK}c zo~}OcRpJ#0dj@tj6i-xpi-hof$-OYFu5zxY_I#uDyF65qMZ%rJspac1#>)q1RvQgg z93rC#NF5ol*uM;abn}}TXULF~i;~Ho=NigOOBlN6B zqz>hDN6B{G^HcKY{jFL2apQEkLeCBR8-lqeaeOoZpWf01HIgJVs2NW=_Cs5@*cbB3 z&E7JwfdT)Qy`B;fFgU#d3HFH(?(5q?hV#Pj9Ri3v9t-o~I%@-otAR+mHe92IC z$r;$0EfXpFBMp~g-^LXJ@2Y?-^Vi7{_Anq)T$?K|!4dekz046yzYOh94iq&7hGUe` zezVp4C2%HG`xjj}*E*w_8QFC|f%Nuv|6RQGUM=n|;LUdgIc0Zy)udx)~ zE{2F}L)??8hmVey6-VRDK4-3+Ya0tBVEAB*KwUTx(y;{IV4%cE&(^tTm3cXUuw+wNH;P2EFp1 z_cJ!cpET>Qv@H0ruModS2}!2fv&o(q@|bNpf>N18gBIn7oi>kWm@U1@j+?C&k=&gLzX@LKdi3yOAAM`qoN-ij zgP^Q04p_^%!LMo~U&l)6dqUOJquB0ACGN|8dtgDw?oMshI5OsQdV0(|aqofF*}$%R zvv8CiRV5_Ph`=P%bd0qgkFAhHyN{S|7Uu$@q$y6c4Xr?&SJ2~=T;^ODpDmO(erDS* zj*XPoS!Vg&MdrPin>)7@;$Tu81{ntPe!m&`k;S z*IR6wofNn~|Hrx20h;%hK&i&kT$85_u*vvXuk$#WYLa+Iy&|>Nn_`#TM=JFl8?L$V zy%fkb$<~ZX<-D68WEY&~dKcb`*hoUX|7b4o3(WYCpRa_qN3&{d!z0mZ&1j}FIr>_e zoYAH#3|K!Dme_{MwT1a8?1Q85IbNIVGwHh>E<)$QS+BwA1 z4w0<$)?91Xjn22b2(=C^M+&3=$6$CZvvAm7(v^WY`t3{gYk0YD*s93JQ@J z-^L#Vc(Cdxs4gs5TsNZ>ylhz=g`TVI}y$nrTgkO!1Kn#Vzsz1bb8ndwf7Q9sP>{!dDez;iQX!` IyisxTKQJ{`Hvj+t literal 0 HcmV?d00001 diff --git a/img/tools/paintbucket-dark.png b/img/tools/paintbucket-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bd648bcc9985b0c1996c04d403a075aa8f5c70 GIT binary patch literal 4104 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 DQ}>`* literal 0 HcmV?d00001 diff --git a/img/tools/paintbucket.png b/img/tools/paintbucket.png new file mode 100644 index 0000000000000000000000000000000000000000..092eea7b17b3b26d6f0f1ca0950aa07dcd88db42 GIT binary patch literal 1189 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 HFIx96u@K5o literal 0 HcmV?d00001 diff --git a/img/tools/pen.png b/img/tools/pen.png old mode 100755 new mode 100644 index 0bfecd50ee9f5bc5828f0c0745aa3e0effcbe250..d1e6d3a49e3fe51cbff81ff7bc01446649d52c51 GIT binary patch literal 1679 zcmb7^drVVz6vxl)Efi?VEfbXqqnDwUYz%zN*92P!2sowAkp(xmqRv;Qwhl5BYkNUW zbvRqcHiMPbAyK!8N+iR_SS#u*J|{7P4{XKyiX)Z+j!GXpzpB%J{9`w{_xJmq$M<~B z`6YMLth{Vd#IOhe5as4%&IX`xOF>vDE_1)yy9k%i`5$Cw;);(aoR*3Id zRjpDfuby5qk~2T#5$R{o9@iM2V~u9*+O@udgKZB-fIR0(^?Vkr-?l24G63d`>>WN2 z(vtnPVPRmiV2f5#5zgn5dV#Im3BB;;UWaD@|aLa}VPLfi(^uW}(kKQC9H5YH2 z#AQr&gj0E9y&e6<8UOlM>;jPlZ$Qs4LJ?=sDq5Zc~Jel*LzH zY?yTo;#M^3@`H{AZ(G1<_G0huN=r&`k64@+xq|7MX*{{stzSHxXsyD7f4%o43ASta z7&Spc)Nl7hfnW#e$4X&E|3i1h)HwB_mNP0^Z8f~-Sd>V>j)Z}yMU_JIDwPoD>WMt^ zlF3x@ABWk?a~LaM`kI8@1gWHxl+=^BQ87dVm2g6;kvtG|%-}=h(W)?rD;^sKnAH=uXm$T-%dCh%|%<3%~Gp+>zZfR!UBXqA7b6e5`dR4#NRUE|Eqz z2CeUslo~=EB|?6~64D8uRyXzs+kAF^!75L?jP7S;=T3#n{r9^FvdnWUys)XRX`rmF zMZevXV>bP zgTJT|<0&oK7Cp(vD7dW7I{(pfiMtHqO6ddMq7MJWyWy_ycPgf5XxpL21bE#)(N4Y8 znxF8<*m9ns+V4-(Zp$wT#M%s-G*<+!%-?N>1rxaNN8RR#$G!GBP)KjQ@fa}+{~Drh zZj*9bW387}r@Q)-so$=HcXOJje!>)n^B$xQ`&t+!4c!UAPD!Ko1y1TkP^$;A#KlkA z7pT>Xtjn1&ct9z*T~~Ci^l=f_FHeSA!A%#xeW_2HF1`*q44;;39CxMGhCXwzd>PHA zi-qu@?34n`KQryHF(^Q>=`7~)xn2&8@wO1I_xT^5tkzO3<*5HNW?#%3QgY7C%FEpU Heqs5)Ky}MC literal 450 zcmV;z0X_bSP)Rq1}l<=psl5*5Xz9i;M}s*NP=ugs7Q#8Z;Dyx|}!`#}xw_C3!B-yaPC&0j)XcpuX@rNfq|q}N(wJOjA& z>u+z?dfJEuLePrqzy!)73pvLjxk4d6XNZt?hm_iYES{i}J5y3l?}PPNYDBR7oPc~6 zL^d)Bi4Q2L3pnp!nFxN9c2E+=@XAl&+;2m6a~kZj1r3Mz3C=hmUG<{+vWR@t4q?fJ zhFc(ozZD#Mx`^Q~g1v=K6!QnfuqyD4>U4EjF0eamL}Jx| z%&`kR-H+3GBYr*Qx}frLU4`%n9(`uSomzw)t%%NagXkA*R5Mbv9VLDp1wMo$cOMa~ s3Wm%r7^bwK$2$}-<~D8p`#1iScU4^XCLAA~0ssI207*qoM6N<$g3sK(Qvd(} diff --git a/img/tools/rectangle.png b/img/tools/rectangle.png old mode 100755 new mode 100644 index d28dc6b1a4420e67d2ad201e77fa6ffdff47b0f0..a5a4ffe681b5cba1d3ea05c63bde5268ae05bd51 GIT binary patch literal 2628 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 literal 0 HcmV?d00001 diff --git a/img/tools/cursors/eraser.png b/img/tools_legacy/cursors/eraser.png similarity index 100% rename from img/tools/cursors/eraser.png rename to img/tools_legacy/cursors/eraser.png diff --git a/img/tools/cursors/hand.png b/img/tools_legacy/cursors/hand.png similarity index 100% rename from img/tools/cursors/hand.png rename to img/tools_legacy/cursors/hand.png diff --git a/img/tools/cursors/paint-bucket.png b/img/tools_legacy/cursors/paint-bucket.png similarity index 100% rename from img/tools/cursors/paint-bucket.png rename to img/tools_legacy/cursors/paint-bucket.png diff --git a/img/tools/cursors/pen.png b/img/tools_legacy/cursors/pen.png similarity index 100% rename from img/tools/cursors/pen.png rename to img/tools_legacy/cursors/pen.png diff --git a/img/tools/cursors/rectangle.png b/img/tools_legacy/cursors/rectangle.png similarity index 100% rename from img/tools/cursors/rectangle.png rename to img/tools_legacy/cursors/rectangle.png diff --git a/img/tools/cursors/select.png b/img/tools_legacy/cursors/select.png similarity index 100% rename from img/tools/cursors/select.png rename to img/tools_legacy/cursors/select.png diff --git a/img/tools/cursors/vertical-mirror-pen.png b/img/tools_legacy/cursors/vertical-mirror-pen.png similarity index 100% rename from img/tools/cursors/vertical-mirror-pen.png rename to img/tools_legacy/cursors/vertical-mirror-pen.png diff --git a/img/tools/cursors/wand.png b/img/tools_legacy/cursors/wand.png similarity index 100% rename from img/tools/cursors/wand.png rename to img/tools_legacy/cursors/wand.png diff --git a/img/tools/dropper.png b/img/tools_legacy/dropper.png similarity index 100% rename from img/tools/dropper.png rename to img/tools_legacy/dropper.png diff --git a/img/tools/eraser.png b/img/tools_legacy/eraser.png similarity index 100% rename from img/tools/eraser.png rename to img/tools_legacy/eraser.png diff --git a/img/tools/icons/hand.png b/img/tools_legacy/hand.png similarity index 100% rename from img/tools/icons/hand.png rename to img/tools_legacy/hand.png diff --git a/img/tools/icons/color-palette.png b/img/tools_legacy/icons/color-palette.png similarity index 100% rename from img/tools/icons/color-palette.png rename to img/tools_legacy/icons/color-palette.png diff --git a/img/tools/icons/eraser.png b/img/tools_legacy/icons/eraser.png similarity index 100% rename from img/tools/icons/eraser.png rename to img/tools_legacy/icons/eraser.png diff --git a/img/tools_legacy/icons/hand.png b/img/tools_legacy/icons/hand.png new file mode 100644 index 0000000000000000000000000000000000000000..7b47be2dc925bf48025e302b0070f7020f9fe5b9 GIT binary patch literal 672 zcmV;R0$=@!P)C*PVMkCl5`N9Qfv&d*`0-eD}<~0i_h~T|9uK{Sh1iG{f~V95!&s7MKs|n60}C zkzn&HrC{iR*Lc_X(N1o~Q9{P^)rrCDkFPQFm~b3@LTf9wAr;d5u1t=3K0-=LFt^4d zwDcAs-6P=mfUo{R4@Tk%wS15xkMH2}yZ%^*p!kkKv?qH_1hLBwjSXDRw(e3yW`y{hXv0)gfQS~Uxm{K`_{tBKt0531)Juuzx~o6D;h-HHgciWXH=58>$m+)aUP_=fNurq~c9Jfr+{g4OA6VysNJCVr!>1 zyO(ukr-@eVVQOd_eeEr`d;&*7#Zd36d)>ub=%lXvJGs$=On&Pn97vP9zKEPnrBRKfD#EKdHd|_ZeufOm#a)m@NAF&m3;5bVE$Q(zLZS1JKPk-x02D-XgTe_RX z#5m7GmzbE!!E}bj^$Yyl#_Q*HW-gz-5F#kVUOZxW=<7_hAg}KDjh>#B%CwB&uQ)_iwz;@6pmo1X^%*Tz443SFZSDVxCn0000Rq1}l<=psl5*5Xz9i;M}s*NP=ugs7Q#8Z;Dyx|}!`#}xw_C3!B-yaPC&0j)XcpuX@rNfq|q}N(wJOjA& z>u+z?dfJEuLePrqzy!)73pvLjxk4d6XNZt?hm_iYES{i}J5y3l?}PPNYDBR7oPc~6 zL^d)Bi4Q2L3pnp!nFxN9c2E+=@XAl&+;2m6a~kZj1r3Mz3C=hmUG<{+vWR@t4q?fJ zhFc(ozZD#Mx`^Q~g1v=K6!QnfuqyD4>U4EjF0eamL}Jx| z%&`kR-H+3GBYr*Qx}frLU4`%n9(`uSomzw)t%%NagXkA*R5Mbv9VLDp1wMo$cOMa~ s3Wm%r7^bwK$2$}-<~D8p`#1iScU4^XCLAA~0ssI207*qoM6N<$g3sK(Qvd(} literal 0 HcmV?d00001 diff --git a/img/tools/vertical-mirror-pen.png b/img/tools_legacy/vertical-mirror-pen.png similarity index 100% rename from img/tools/vertical-mirror-pen.png rename to img/tools_legacy/vertical-mirror-pen.png diff --git a/img/tools/wand.png b/img/tools_legacy/wand.png similarity index 100% rename from img/tools/wand.png rename to img/tools_legacy/wand.png diff --git a/index.html b/index.html index c7753760..1b87fccc 100644 --- a/index.html +++ b/index.html @@ -7,71 +7,79 @@ Piskel - - - - - - - - - + + + + + + + + + -
    - - -
    -
      -
      -
      - -
      - - - -
      -
      +
      +
      + + +
      +
        +
        - -
        - - 12 FPS -
        +
        + + + + +
        + +
        + +
        +
        +
        +
        + + 12 FPS + +
        + + +
        diff --git a/js/controller/AnimatedPreviewController.js b/js/controller/AnimatedPreviewController.js index 9d7fe6b2..e7d369c5 100644 --- a/js/controller/AnimatedPreviewController.js +++ b/js/controller/AnimatedPreviewController.js @@ -47,11 +47,13 @@ * Calculate the preview DPI depending on the framesheet size */ ns.AnimatedPreviewController.prototype.calculateDPI_ = function () { - var framePixelHeight = this.framesheet.getCurrentFrame().getHeight(), + var previewSize = 200, + framePixelHeight = this.framesheet.getCurrentFrame().getHeight(), framePixelWidth = this.framesheet.getCurrentFrame().getWidth(); // TODO (julz) : should have a utility to get a Size from framesheet easily (what about empty framesheets though ?) - return pskl.PixelUtils.calculateDPIForContainer($(".preview-container"), framePixelHeight, framePixelWidth); + //return pskl.PixelUtils.calculateDPIForContainer($(".preview-container"), framePixelHeight, framePixelWidth); + return pskl.PixelUtils.calculateDPI(previewSize, previewSize, framePixelHeight, framePixelWidth); }; ns.AnimatedPreviewController.prototype.updateDPI_ = function () { diff --git a/js/controller/DrawingController.js b/js/controller/DrawingController.js index 22809a3a..f0932409 100644 --- a/js/controller/DrawingController.js +++ b/js/controller/DrawingController.js @@ -71,7 +71,7 @@ body.mouseup($.proxy(this.onMouseup_, this)); // Deactivate right click: - body.contextmenu(this.onCanvasContextMenu_); + //body.contextmenu(this.onCanvasContextMenu_); }; @@ -254,20 +254,21 @@ * @private */ ns.DrawingController.prototype.calculateDPI_ = function() { - var userMessageGap = 80; // Reserve some height to show the user message at the bottom - - var availableViewportHeight = $('.main-panel').height() - userMessageGap, - availableViewportWidth = $('.main-panel').width(), - previewHeight = $(".preview-container").height(), - previewWidth = $(".preview-container").width(), + var availableViewportHeight = $('.main-column').height(), + leftSectionWidth = $('.left-column').width(), + rightSectionWidth = $('.right-column').width(), + availableViewportWidth = $('body').width() - leftSectionWidth - rightSectionWidth, + //previewHeight = $(".preview-container").height(), + //previewWidth = $(".preview-container").width(), framePixelHeight = this.framesheet.getCurrentFrame().getHeight(), framePixelWidth = this.framesheet.getCurrentFrame().getWidth(); var dpi = pskl.PixelUtils.calculateDPI(availableViewportHeight, availableViewportWidth, framePixelHeight, framePixelWidth); - + /* var drawingCanvasHeight = dpi * framePixelHeight; var drawingCanvasWidth = dpi * framePixelWidth; - + */ // Check if preview and drawing canvas overlap + /* var heightGap = drawingCanvasHeight + previewHeight - availableViewportHeight, widthGap = drawingCanvasWidth + previewWidth - availableViewportWidth; if (heightGap > 0 && widthGap > 0) { @@ -275,7 +276,7 @@ var gapDPI = pskl.PixelUtils.calculateDPI(heightGap, widthGap, framePixelHeight, framePixelWidth); // substract gap dpi to initial dpi dpi -= (gapDPI + 1); - } + }*/ return dpi; }; diff --git a/js/controller/PreviewFilmController.js b/js/controller/PreviewFilmController.js index 23eb6a31..6326e514 100644 --- a/js/controller/PreviewFilmController.js +++ b/js/controller/PreviewFilmController.js @@ -181,16 +181,12 @@ previewTileRoot.addEventListener('click', this.onPreviewClick_.bind(this, tileNumber)); - var actionContainer = document.createElement("DIV"); - actionContainer.className = "tile-action-container"; - var canvasPreviewDuplicateAction = document.createElement("button"); canvasPreviewDuplicateAction.setAttribute('rel', 'tooltip'); canvasPreviewDuplicateAction.setAttribute('data-placement', 'right'); canvasPreviewDuplicateAction.setAttribute('title', 'Duplicate this frame'); - canvasPreviewDuplicateAction.className = "tile-action duplicate-frame-action"; - actionContainer.appendChild(canvasPreviewDuplicateAction); - + canvasPreviewDuplicateAction.className = "tile-overlay duplicate-frame-action"; + previewTileRoot.appendChild(canvasPreviewDuplicateAction); canvasPreviewDuplicateAction.addEventListener('click', this.onAddButtonClick_.bind(this, tileNumber)); // TODO(vincz): Eventually optimize this part by not recreating a FrameRenderer. Note that the real optim @@ -202,24 +198,35 @@ previewTileRoot.appendChild(canvasContainer); if(tileNumber > 0 || this.framesheet.getFrameCount() > 1) { - var canvasPreviewDeleteAction = document.createElement("button"); - canvasPreviewDeleteAction.setAttribute('rel', 'tooltip'); - canvasPreviewDeleteAction.setAttribute('data-placement', 'right'); - canvasPreviewDeleteAction.setAttribute('title', 'Delete this frame'); - canvasPreviewDeleteAction.className = "tile-action delete-frame-action"; - canvasPreviewDeleteAction.addEventListener('click', this.onDeleteButtonClick_.bind(this, tileNumber)); - previewTileRoot.appendChild(canvasPreviewDeleteAction); - actionContainer.appendChild(canvasPreviewDeleteAction); - } + // Add 'remove frame' button. + var deleteButton = document.createElement("button"); + deleteButton.setAttribute('rel', 'tooltip'); + deleteButton.setAttribute('data-placement', 'right'); + deleteButton.setAttribute('title', 'Delete this frame'); + deleteButton.className = "tile-overlay delete-frame-action"; + deleteButton.addEventListener('click', this.onDeleteButtonClick_.bind(this, tileNumber)); + previewTileRoot.appendChild(deleteButton); - previewTileRoot.appendChild(actionContainer); + // Add 'dragndrop handle'. + var dndHandle = document.createElement("div"); + dndHandle.setAttribute('rel', 'tooltip'); + dndHandle.setAttribute('title', 'Drag\'n drop'); + dndHandle.setAttribute('data-placement', 'right'); + dndHandle.className = "tile-overlay dnd-action"; + previewTileRoot.appendChild(dndHandle); + } + var tileCount = document.createElement("div"); + tileCount.className = "tile-overlay tile-count"; + tileCount.innerHTML = tileNumber; + previewTileRoot.appendChild(tileCount); + return previewTileRoot; }; ns.PreviewFilmController.prototype.onPreviewClick_ = function (index, evt) { // has not class tile-action: - if(!evt.target.classList.contains('tile-action')) { + if(!evt.target.classList.contains('tile-overlay')) { this.framesheet.setCurrentFrameIndex(index); } }; @@ -239,7 +246,7 @@ * Calculate the preview DPI depending on the framesheet size */ ns.PreviewFilmController.prototype.calculateDPI_ = function () { - var previewSize = 128, + var previewSize = 120, framePixelHeight = this.framesheet.getCurrentFrame().getHeight(), framePixelWidth = this.framesheet.getCurrentFrame().getWidth(); // TODO (julz) : should have a utility to get a Size from framesheet easily (what about empty framesheets though ?) diff --git a/js/lib/less-1.3.3-min.js b/js/lib/less-1.3.3-min.js new file mode 100644 index 00000000..9b0fa6ba --- /dev/null +++ b/js/lib/less-1.3.3-min.js @@ -0,0 +1,9 @@ +// +// LESS - Leaner CSS v1.3.3 +// http://lesscss.org +// +// Copyright (c) 2009-2013, Alexis Sellier +// Licensed under the Apache 2.0 License. +// +(function(e,t){function n(t){return e.less[t.split("/")[1]]}function f(){r.env==="development"?(r.optimization=0,r.watchTimer=setInterval(function(){r.watchMode&&g(function(e,t,n,r,i){t&&S(t.toCSS(),r,i.lastModified)})},r.poll)):r.optimization=3}function m(){var e=document.getElementsByTagName("style");for(var t=0;t0&&(s.splice(o-1,2),o-=2)}return i.hostPart=r[1],i.directories=s,i.path=r[1]+s.join("/"),i.fileUrl=i.path+(r[4]||""),i.url=i.fileUrl+(r[5]||""),i}function w(t,n,i,s){var o=t.contents||{},u=t.files||{},a=b(t.href,e.location.href),f=a.url,c=l&&l.getItem(f),h=l&&l.getItem(f+":timestamp"),p={css:c,timestamp:h},d;r.relativeUrls?r.rootpath?t.entryPath?d=b(r.rootpath+y(a.path,t.entryPath)).path:d=r.rootpath:d=a.path:r.rootpath?d=r.rootpath:t.entryPath?d=t.entryPath:d=a.path,x(f,t.type,function(e,l){v+=e.replace(/@import .+?;/ig,"");if(!i&&p&&l&&(new Date(l)).valueOf()===(new Date(p.timestamp)).valueOf())S(p.css,t),n(null,null,e,t,{local:!0,remaining:s},f);else try{o[f]=e,(new r.Parser({optimization:r.optimization,paths:[a.path],entryPath:t.entryPath||a.path,mime:t.type,filename:f,rootpath:d,relativeUrls:t.relativeUrls,contents:o,files:u,dumpLineNumbers:r.dumpLineNumbers})).parse(e,function(r,i){if(r)return k(r,f);try{n(r,i,e,t,{local:!1,lastModified:l,remaining:s},f),N(document.getElementById("less-error-message:"+E(f)))}catch(r){k(r,f)}})}catch(c){k(c,f)}},function(e,t){throw new Error("Couldn't load "+t+" ("+e+")")})}function E(e){return e.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function S(e,t,n){var r,i=t.href||"",s="less:"+(t.title||E(i));if((r=document.getElementById(s))===null){r=document.createElement("style"),r.type="text/css",t.media&&(r.media=t.media),r.id=s;var o=t&&t.nextSibling||null;(o||document.getElementsByTagName("head")[0]).parentNode.insertBefore(r,o)}if(r.styleSheet)try{r.styleSheet.cssText=e}catch(u){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(e){r.childNodes.length>0?r.firstChild.nodeValue!==e.nodeValue&&r.replaceChild(e,r.firstChild):r.appendChild(e)})(document.createTextNode(e));if(n&&l){C("saving "+i+" to cache.");try{l.setItem(i,e),l.setItem(i+":timestamp",n)}catch(u){C("failed to save")}}}function x(e,t,n,i){function a(t,n,r){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader("Last-Modified")):typeof r=="function"&&r(t.status,e)}var s=T(),u=o?r.fileAsync:r.async;typeof s.overrideMimeType=="function"&&s.overrideMimeType("text/css"),s.open("GET",e,u),s.setRequestHeader("Accept",t||"text/x-less, text/css; q=0.9, */*; q=0.5"),s.send(null),o&&!r.fileAsync?s.status===0||s.status>=200&&s.status<300?n(s.responseText):i(s.status,e):u?s.onreadystatechange=function(){s.readyState==4&&a(s,n,i)}:a(s,n,i)}function T(){if(e.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(t){return C("browser doesn't support AJAX."),null}}function N(e){return e&&e.parentNode.removeChild(e)}function C(e){r.env=="development"&&typeof console!="undefined"&&console.log("less: "+e)}function k(e,t){var n="less-error-message:"+E(t),i='
      • {content}
      • ',s=document.createElement("div"),o,u,a=[],f=e.filename||t,l=f.match(/([^\/]+(\?.*)?)$/)[1];s.id=n,s.className="less-error-message",u="

        "+(e.message||"There is an error in your .less file")+"

        "+'

        in '+l+" ";var c=function(e,t,n){e.extract[t]&&a.push(i.replace(/\{line\}/,parseInt(e.line)+(t-1)).replace(/\{class\}/,n).replace(/\{content\}/,e.extract[t]))};e.stack?u+="
        "+e.stack.split("\n").slice(1).join("
        "):e.extract&&(c(e,0,""),c(e,1,"line"),c(e,2,""),u+="on line "+e.line+", column "+(e.column+1)+":

        "+"
          "+a.join("")+"
        "),s.innerHTML=u,S([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),s.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),r.env=="development"&&(o=setInterval(function(){document.body&&(document.getElementById(n)?document.body.replaceChild(s,document.getElementById(n)):document.body.insertBefore(s,document.body.firstChild),clearInterval(o))},10))}Array.isArray||(Array.isArray=function(e){return Object.prototype.toString.call(e)==="[object Array]"||e instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(e,t){var n=this.length>>>0;for(var r=0;r>>0,n=new Array(t),r=arguments[1];for(var i=0;i>>0,n=0;if(t===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n=t)return-1;n<0&&(n+=t);for(;nh&&(c[u]=c[u].slice(o-h),h=o)}function w(e){var t=e.charCodeAt(0);return t===32||t===10||t===9}function E(e){var t,n,r,i,a;if(e instanceof Function)return e.call(p.parsers);if(typeof e=="string")t=s.charAt(o)===e?e:null,r=1,b();else{b();if(!(t=e.exec(c[u])))return null;r=t[0].length}if(t)return S(r),typeof t=="string"?t:t.length===1?t[0]:t}function S(e){var t=o,n=u,r=o+c[u].length,i=o+=e;while(o=0&&t.charAt(n)!=="\n";n--)r++;return{line:typeof e=="number"?(t.slice(0,e).match(/\n/g)||"").length:null,column:r}}function L(e){return r.mode==="browser"||r.mode==="rhino"?e.filename:n("path").resolve(e.filename)}function A(e,t,n){return{lineNumber:k(e,t).line+1,fileName:L(n)}}function O(e,t){var n=C(e,t),r=k(e.index,n),i=r.line,s=r.column,o=n.split("\n");this.type=e.type||"Syntax",this.message=e.message,this.filename=e.filename||t.filename,this.index=e.index,this.line=typeof i=="number"?i+1:null,this.callLine=e.call&&k(e.call,n).line+1,this.callExtract=o[k(e.call,n).line],this.stack=e.stack,this.column=s,this.extract=[o[i-1],o[i],o[i+1]]}var s,o,u,a,f,l,c,h,p,d=this,t=t||{};t.contents||(t.contents={}),t.rootpath=t.rootpath||"",t.files||(t.files={});var v=function(){},m=this.imports={paths:t.paths||[],queue:[],files:t.files,contents:t.contents,mime:t.mime,error:null,push:function(e,n){var i=this;this.queue.push(e),r.Parser.importer(e,this.paths,function(t,r,s){i.queue.splice(i.queue.indexOf(e),1);var o=s in i.files;i.files[s]=r,t&&!i.error&&(i.error=t),n(t,r,o),i.queue.length===0&&v(i.error)},t)}};return this.env=t=t||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,p={imports:m,parse:function(e,a){var f,d,m,g,y,b,w=[],S,x=null;o=u=h=l=0,s=e.replace(/\r\n/g,"\n"),s=s.replace(/^\uFEFF/,""),c=function(e){var n=0,r=/(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g,i=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,o=/"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g,u=0,a,f=e[0],l;for(var c=0,h,p;c0?"missing closing `}`":"missing opening `{`",filename:t.filename},t)),e.map(function(e){return e.join("")})}([[]]);if(x)return a(x,t);try{f=new i.Ruleset([],E(this.parsers.primary)),f.root=!0}catch(T){return a(new O(T,t))}f.toCSS=function(e){var s,o,u;return function(s,o){var u=[],a;s=s||{},typeof o=="object"&&!Array.isArray(o)&&(o=Object.keys(o).map(function(e){var t=o[e];return t instanceof i.Value||(t instanceof i.Expression||(t=new i.Expression([t])),t=new i.Value([t])),new i.Rule("@"+e,t,!1,0)}),u=[new i.Ruleset(null,o)]);try{var f=e.call(this,{frames:u}).toCSS([],{compress:s.compress||!1,dumpLineNumbers:t.dumpLineNumbers})}catch(l){throw new O(l,t)}if(a=p.imports.error)throw a instanceof O?a:new O(a,t);return s.yuicompress&&r.mode==="node"?n("ycssmin").cssmin(f):s.compress?f.replace(/(\s)+/g,"$1"):f}}(f.eval);if(o=0&&s.charAt(N)!=="\n";N--)C++;x={type:"Parse",message:"Syntax Error on line "+y,index:o,filename:t.filename,line:y,column:C,extract:[b[y-2],b[y-1],b[y]]}}this.imports.queue.length>0?v=function(e){e=x||e,e?a(e):a(null,f)}:a(x,f)},parsers:{primary:function(){var e,t=[];while((e=E(this.mixin.definition)||E(this.rule)||E(this.ruleset)||E(this.mixin.call)||E(this.comment)||E(this.directive))||E(/^[\s\n]+/)||E(/^;+/))e&&t.push(e);return t},comment:function(){var e;if(s.charAt(o)!=="/")return;if(s.charAt(o+1)==="/")return new i.Comment(E(/^\/\/.*/),!0);if(e=E(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new i.Comment(e)},entities:{quoted:function(){var e,t=o,n;s.charAt(t)==="~"&&(t++,n=!0);if(s.charAt(t)!=='"'&&s.charAt(t)!=="'")return;n&&E("~");if(e=E(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new i.Quoted(e[0],e[1]||e[2],n)},keyword:function(){var e;if(e=E(/^[_A-Za-z-][_A-Za-z0-9-]*/))return i.colors.hasOwnProperty(e)?new i.Color(i.colors[e].slice(1)):new i.Keyword(e)},call:function(){var e,n,r,s,a=o;if(!(e=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(c[u])))return;e=e[1],n=e.toLowerCase();if(n==="url")return null;o+=e.length;if(n==="alpha"){s=E(this.alpha);if(typeof s!="undefined")return s}E("("),r=E(this.entities.arguments);if(!E(")"))return;if(e)return new i.Call(e,r,a,t.filename)},arguments:function(){var e=[],t;while(t=E(this.entities.assignment)||E(this.expression)){e.push(t);if(!E(","))break}return e},literal:function(){return E(this.entities.ratio)||E(this.entities.dimension)||E(this.entities.color)||E(this.entities.quoted)||E(this.entities.unicodeDescriptor)},assignment:function(){var e,t;if((e=E(/^\w+(?=\s?=)/i))&&E("=")&&(t=E(this.entity)))return new i.Assignment(e,t)},url:function(){var e;if(s.charAt(o)!=="u"||!E(/^url\(/))return;return e=E(this.entities.quoted)||E(this.entities.variable)||E(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/)||"",x(")"),new i.URL(e.value!=null||e instanceof i.Variable?e:new i.Anonymous(e),t.rootpath)},variable:function(){var e,n=o;if(s.charAt(o)==="@"&&(e=E(/^@@?[\w-]+/)))return new i.Variable(e,n,t.filename)},variableCurly:function(){var e,n,r=o;if(s.charAt(o)==="@"&&(n=E(/^@\{([\w-]+)\}/)))return new i.Variable("@"+n[1],r,t.filename)},color:function(){var e;if(s.charAt(o)==="#"&&(e=E(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/)))return new i.Color(e[1])},dimension:function(){var e,t=s.charCodeAt(o);if(t>57||t<43||t===47||t==44)return;if(e=E(/^([+-]?\d*\.?\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn|dpi|dpcm|dppx|rem|vw|vh|vmin|vm|ch)?/))return new i.Dimension(e[1],e[2])},ratio:function(){var e,t=s.charCodeAt(o);if(t>57||t<48)return;if(e=E(/^(\d+\/\d+)/))return new i.Ratio(e[1])},unicodeDescriptor:function(){var e;if(e=E(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/))return new i.UnicodeDescriptor(e[0])},javascript:function(){var e,t=o,n;s.charAt(t)==="~"&&(t++,n=!0);if(s.charAt(t)!=="`")return;n&&E("~");if(e=E(/^`([^`]*)`/))return new i.JavaScript(e[1],o,n)}},variable:function(){var e;if(s.charAt(o)==="@"&&(e=E(/^(@[\w-]+)\s*:/)))return e[1]},shorthand:function(){var e,t;if(!N(/^[@\w.%-]+\/[@\w.-]+/))return;g();if((e=E(this.entity))&&E("/")&&(t=E(this.entity)))return new i.Shorthand(e,t);y()},mixin:{call:function(){var e=[],n,r,u=[],a=[],f,l,c,h,p,d,v,m=o,b=s.charAt(o),w,S,C=!1;if(b!=="."&&b!=="#")return;g();while(n=E(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/))e.push(new i.Element(r,n,o)),r=E(">");if(E("(")){p=[];while(c=E(this.expression)){h=null,S=c;if(c.value.length==1){var k=c.value[0];k instanceof i.Variable&&E(":")&&(p.length>0&&(d&&T("Cannot mix ; and , as delimiter types"),v=!0),S=x(this.expression),h=w=k.name)}p.push(S),a.push({name:h,value:S});if(E(","))continue;if(E(";")||d)v&&T("Cannot mix ; and , as delimiter types"),d=!0,p.length>1&&(S=new i.Value(p)),u.push({name:w,value:S}),w=null,p=[],v=!1}x(")")}f=d?u:a,E(this.important)&&(C=!0);if(e.length>0&&(E(";")||N("}")))return new i.mixin.Call(e,f,m,t.filename,C);y()},definition:function(){var e,t=[],n,r,u,a,f,c=!1;if(s.charAt(o)!=="."&&s.charAt(o)!=="#"||N(/^[^{]*\}/))return;g();if(n=E(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){e=n[1];do{E(this.comment);if(s.charAt(o)==="."&&E(/^\.{3}/)){c=!0,t.push({variadic:!0});break}if(!(u=E(this.entities.variable)||E(this.entities.literal)||E(this.entities.keyword)))break;if(u instanceof i.Variable)if(E(":"))a=x(this.expression,"expected expression"),t.push({name:u.name,value:a});else{if(E(/^\.{3}/)){t.push({name:u.name,variadic:!0}),c=!0;break}t.push({name:u.name})}else t.push({value:u})}while(E(",")||E(";"));E(")")||(l=o,y()),E(this.comment),E(/^when/)&&(f=x(this.conditions,"expected condition")),r=E(this.block);if(r)return new i.mixin.Definition(e,t,r,f,c);y()}}},entity:function(){return E(this.entities.literal)||E(this.entities.variable)||E(this.entities.url)||E(this.entities.call)||E(this.entities.keyword)||E(this.entities.javascript)||E(this.comment)},end:function(){return E(";")||N("}")},alpha:function(){var e;if(!E(/^\(opacity=/i))return;if(e=E(/^\d+/)||E(this.entities.variable))return x(")"),new i.Alpha(e)},element:function(){var e,t,n,r;n=E(this.combinator),e=E(/^(?:\d+\.\d+|\d+)%/)||E(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||E("*")||E("&")||E(this.attribute)||E(/^\([^()@]+\)/)||E(/^[\.#](?=@)/)||E(this.entities.variableCurly),e||E("(")&&(r=E(this.entities.variableCurly)||E(this.entities.variable)||E(this.selector))&&E(")")&&(e=new i.Paren(r));if(e)return new i.Element(n,e,o)},combinator:function(){var e,t=s.charAt(o);if(t===">"||t==="+"||t==="~"||t==="|"){o++;while(s.charAt(o).match(/\s/))o++;return new i.Combinator(t)}return s.charAt(o-1).match(/\s/)?new i.Combinator(" "):new i.Combinator(null)},selector:function(){var e,t,n=[],r,u;if(E("("))return e=E(this.entity),E(")")?new i.Selector([new i.Element("",e,o)]):null;while(t=E(this.element)){r=s.charAt(o),n.push(t);if(r==="{"||r==="}"||r===";"||r===","||r===")")break}if(n.length>0)return new i.Selector(n)},attribute:function(){var e="",t,n,r;if(!E("["))return;if(t=E(/^(?:[_A-Za-z0-9-]|\\.)+/)||E(this.entities.quoted))(r=E(/^[|~*$^]?=/))&&(n=E(this.entities.quoted)||E(/^[\w-]+/))?e=[t,r,n.toCSS?n.toCSS():n].join(""):e=t;if(!E("]"))return;if(e)return"["+e+"]"},block:function(){var e;if(E("{")&&(e=E(this.primary))&&E("}"))return e},ruleset:function(){var e=[],n,r,u,a;g(),t.dumpLineNumbers&&(a=A(o,s,t));while(n=E(this.selector)){e.push(n),E(this.comment);if(!E(","))break;E(this.comment)}if(e.length>0&&(r=E(this.block))){var f=new i.Ruleset(e,r,t.strictImports);return t.dumpLineNumbers&&(f.debugInfo=a),f}l=o,y()},rule:function(){var e,t,n=s.charAt(o),r,a;g();if(n==="."||n==="#"||n==="&")return;if(e=E(this.variable)||E(this.property)){e.charAt(0)!="@"&&(a=/^([^@+\/'"*`(;{}-]*);/.exec(c[u]))?(o+=a[0].length-1,t=new i.Anonymous(a[1])):e==="font"?t=E(this.font):t=E(this.value),r=E(this.important);if(t&&E(this.end))return new i.Rule(e,t,r,f);l=o,y()}},"import":function(){var e,n,r=o;g();var s=E(/^@import(?:-(once))?\s+/);if(s&&(e=E(this.entities.quoted)||E(this.entities.url))){n=E(this.mediaFeatures);if(E(";"))return new i.Import(e,m,n,s[1]==="once",r,t.rootpath)}y()},mediaFeature:function(){var e,t,n=[];do if(e=E(this.entities.keyword))n.push(e);else if(E("(")){t=E(this.property),e=E(this.entity);if(!E(")"))return null;if(t&&e)n.push(new i.Paren(new i.Rule(t,e,null,o,!0)));else{if(!e)return null;n.push(new i.Paren(e))}}while(e);if(n.length>0)return new i.Expression(n)},mediaFeatures:function(){var e,t=[];do if(e=E(this.mediaFeature)){t.push(e);if(!E(","))break}else if(e=E(this.entities.variable)){t.push(e);if(!E(","))break}while(e);return t.length>0?t:null},media:function(){var e,n,r,u;t.dumpLineNumbers&&(u=A(o,s,t));if(E(/^@media/)){e=E(this.mediaFeatures);if(n=E(this.block))return r=new i.Media(n,e),t.dumpLineNumbers&&(r.debugInfo=u),r}},directive:function(){var e,n,r,u,a,f,l,c,h,p;if(s.charAt(o)!=="@")return;if(n=E(this["import"])||E(this.media))return n;g(),e=E(/^@[a-z-]+/);if(!e)return;l=e,e.charAt(1)=="-"&&e.indexOf("-",2)>0&&(l="@"+e.slice(e.indexOf("-",2)+1));switch(l){case"@font-face":c=!0;break;case"@viewport":case"@top-left":case"@top-left-corner":case"@top-center":case"@top-right":case"@top-right-corner":case"@bottom-left":case"@bottom-left-corner":case"@bottom-center":case"@bottom-right":case"@bottom-right-corner":case"@left-top":case"@left-middle":case"@left-bottom":case"@right-top":case"@right-middle":case"@right-bottom":c=!0;break;case"@page":case"@document":case"@supports":case"@keyframes":c=!0,h=!0;break;case"@namespace":p=!0}h&&(e+=" "+(E(/^[^{]+/)||"").trim());if(c){if(r=E(this.block))return new i.Directive(e,r)}else if((n=p?E(this.expression):E(this.entity))&&E(";")){var d=new i.Directive(e,n);return t.dumpLineNumbers&&(d.debugInfo=A(o,s,t)),d}y()},font:function(){var e=[],t=[],n,r,s,o;while(o=E(this.shorthand)||E(this.entity))t.push(o);e.push(new i.Expression(t));if(E(","))while(o=E(this.expression)){e.push(o);if(!E(","))break}return new i.Value(e)},value:function(){var e,t=[],n;while(e=E(this.expression)){t.push(e);if(!E(","))break}if(t.length>0)return new i.Value(t)},important:function(){if(s.charAt(o)==="!")return E(/^! *important/)},sub:function(){var e;if(E("(")&&(e=E(this.expression))&&E(")"))return e},multiplication:function(){var e,t,n,r;if(e=E(this.operand)){while(!N(/^\/[*\/]/)&&(n=E("/")||E("*"))&&(t=E(this.operand)))r=new i.Operation(n,[r||e,t]);return r||e}},addition:function(){var e,t,n,r;if(e=E(this.multiplication)){while((n=E(/^[-+]\s+/)||!w(s.charAt(o-1))&&(E("+")||E("-")))&&(t=E(this.multiplication)))r=new i.Operation(n,[r||e,t]);return r||e}},conditions:function(){var e,t,n=o,r;if(e=E(this.condition)){while(E(",")&&(t=E(this.condition)))r=new i.Condition("or",r||e,t,n);return r||e}},condition:function(){var e,t,n,r,s=o,u=!1;E(/^not/)&&(u=!0),x("(");if(e=E(this.addition)||E(this.entities.keyword)||E(this.entities.quoted))return(r=E(/^(?:>=|=<|[<=>])/))?(t=E(this.addition)||E(this.entities.keyword)||E(this.entities.quoted))?n=new i.Condition(r,e,t,s,u):T("expected expression"):n=new i.Condition("=",e,new i.Keyword("true"),s,u),x(")"),E(/^and/)?new i.Condition("and",n,E(this.condition)):n},operand:function(){var e,t=s.charAt(o+1);s.charAt(o)==="-"&&(t==="@"||t==="(")&&(e=E("-"));var n=E(this.sub)||E(this.entities.dimension)||E(this.entities.color)||E(this.entities.variable)||E(this.entities.call);return e?new i.Operation("*",[new i.Dimension(-1),n]):n},expression:function(){var e,t,n=[],r;while(e=E(this.addition)||E(this.entity))n.push(e);if(n.length>0)return new i.Expression(n)},property:function(){var e;if(e=E(/^(\*?-?[_a-z0-9-]+)\s*:/))return e[1]}}}};if(r.mode==="browser"||r.mode==="rhino")r.Parser.importer=function(e,t,n,r){!/^([a-z-]+:)?\//.test(e)&&t.length>0&&(e=t[0]+e),w({href:e,title:e,type:r.mime,contents:r.contents,files:r.files,rootpath:r.rootpath,entryPath:r.entryPath,relativeUrls:r.relativeUrls},function(e,i,s,o,u,a){e&&typeof r.errback=="function"?r.errback.call(null,a,t,n,r):n.call(null,e,i,a)},!0)};(function(e){function t(t){return e.functions.hsla(t.h,t.s,t.l,t.a)}function n(t,n){return t instanceof e.Dimension&&t.unit=="%"?parseFloat(t.value*n/100):r(t)}function r(t){if(t instanceof e.Dimension)return parseFloat(t.unit=="%"?t.value/100:t.value);if(typeof t=="number")return t;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function i(e){return Math.min(1,Math.max(0,e))}e.functions={rgb:function(e,t,n){return this.rgba(e,t,n,1)},rgba:function(t,i,s,o){var u=[t,i,s].map(function(e){return n(e,256)});return o=r(o),new e.Color(u,o)},hsl:function(e,t,n){return this.hsla(e,t,n,1)},hsla:function(e,t,n,i){function u(e){return e=e<0?e+1:e>1?e-1:e,e*6<1?o+(s-o)*e*6:e*2<1?s:e*3<2?o+(s-o)*(2/3-e)*6:o}e=r(e)%360/360,t=r(t),n=r(n),i=r(i);var s=n<=.5?n*(t+1):n+t-n*t,o=n*2-s;return this.rgba(u(e+1/3)*255,u(e)*255,u(e-1/3)*255,i)},hsv:function(e,t,n){return this.hsva(e,t,n,1)},hsva:function(e,t,n,i){e=r(e)%360/360*360,t=r(t),n=r(n),i=r(i);var s,o;s=Math.floor(e/60%6),o=e/60-s;var u=[n,n*(1-t),n*(1-o*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return this.rgba(u[a[s][0]]*255,u[a[s][1]]*255,u[a[s][2]]*255,i)},hue:function(t){return new e.Dimension(Math.round(t.toHSL().h))},saturation:function(t){return new e.Dimension(Math.round(t.toHSL().s*100),"%")},lightness:function(t){return new e.Dimension(Math.round(t.toHSL().l*100),"%")},red:function(t){return new e.Dimension(t.rgb[0])},green:function(t){return new e.Dimension(t.rgb[1])},blue:function(t){return new e.Dimension(t.rgb[2])},alpha:function(t){return new e.Dimension(t.toHSL().a)},luma:function(t){return new e.Dimension(Math.round((.2126*(t.rgb[0]/255)+.7152*(t.rgb[1]/255)+.0722*(t.rgb[2]/255))*t.alpha*100),"%")},saturate:function(e,n){var r=e.toHSL();return r.s+=n.value/100,r.s=i(r.s),t(r)},desaturate:function(e,n){var r=e.toHSL();return r.s-=n.value/100,r.s=i(r.s),t(r)},lighten:function(e,n){var r=e.toHSL();return r.l+=n.value/100,r.l=i(r.l),t(r)},darken:function(e,n){var r=e.toHSL();return r.l-=n.value/100,r.l=i(r.l),t(r)},fadein:function(e,n){var r=e.toHSL();return r.a+=n.value/100,r.a=i(r.a),t(r)},fadeout:function(e,n){var r=e.toHSL();return r.a-=n.value/100,r.a=i(r.a),t(r)},fade:function(e,n){var r=e.toHSL();return r.a=n.value/100,r.a=i(r.a),t(r)},spin:function(e,n){var r=e.toHSL(),i=(r.h+n.value)%360;return r.h=i<0?360+i:i,t(r)},mix:function(t,n,r){r||(r=new e.Dimension(50));var i=r.value/100,s=i*2-1,o=t.toHSL().a-n.toHSL().a,u=((s*o==-1?s:(s+o)/(1+s*o))+1)/2,a=1-u,f=[t.rgb[0]*u+n.rgb[0]*a,t.rgb[1]*u+n.rgb[1]*a,t.rgb[2]*u+n.rgb[2]*a],l=t.alpha*i+n.alpha*(1-i);return new e.Color(f,l)},greyscale:function(t){return this.desaturate(t,new e.Dimension(100))},contrast:function(e,t,n,r){return e.rgb?(typeof n=="undefined"&&(n=this.rgba(255,255,255,1)),typeof t=="undefined"&&(t=this.rgba(0,0,0,1)),typeof r=="undefined"?r=.43:r=r.value,(.2126*(e.rgb[0]/255)+.7152*(e.rgb[1]/255)+.0722*(e.rgb[2]/255))*e.alpha255?255:e<0?0:e).toString(16),e.length===1?"0"+e:e}).join("")},operate:function(t,n){var r=[];n instanceof e.Color||(n=n.toColor());for(var i=0;i<3;i++)r[i]=e.operate(t,this.rgb[i],n.rgb[i]);return new e.Color(r,this.alpha+n.alpha)},toHSL:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255,r=this.alpha,i=Math.max(e,t,n),s=Math.min(e,t,n),o,u,a=(i+s)/2,f=i-s;if(i===s)o=u=0;else{u=a>.5?f/(2-i-s):f/(i+s);switch(i){case e:o=(t-n)/f+(t255?255:e<0?0:e).toString(16),e.length===1?"0"+e:e}).join("")},compare:function(e){return e.rgb?e.rgb[0]===this.rgb[0]&&e.rgb[1]===this.rgb[1]&&e.rgb[2]===this.rgb[2]&&e.alpha===this.alpha?0:-1:-1}}}(n("../tree")),function(e){e.Comment=function(e,t){this.value=e,this.silent=!!t},e.Comment.prototype={toCSS:function(e){return e.compress?"":this.value},eval:function(){return this}}}(n("../tree")),function(e){e.Condition=function(e,t,n,r,i){this.op=e.trim(),this.lvalue=t,this.rvalue=n,this.index=r,this.negate=i},e.Condition.prototype.eval=function(e){var t=this.lvalue.eval(e),n=this.rvalue.eval(e),r=this.index,i,i=function(e){switch(e){case"and":return t&&n;case"or":return t||n;default:if(t.compare)i=t.compare(n);else{if(!n.compare)throw{type:"Type",message:"Unable to perform comparison",index:r};i=n.compare(t)}switch(i){case-1:return e==="<"||e==="=<";case 0:return e==="="||e===">="||e==="=<";case 1:return e===">"||e===">="}}}(this.op);return this.negate?!i:i}}(n("../tree")),function(e){e.Dimension=function(e,t){this.value=parseFloat(e),this.unit=t||null},e.Dimension.prototype={eval:function(){return this},toColor:function(){return new e.Color([this.value,this.value,this.value])},toCSS:function(){var e=this.value+this.unit;return e},operate:function(t,n){return new e.Dimension(e.operate(t,this.value,n.value),this.unit||n.unit)},compare:function(t){return t instanceof e.Dimension?t.value>this.value?-1:t.value":e.compress?">":" > ","|":e.compress?"|":" | "}[this.value]}}(n("../tree")),function(e){e.Expression=function(e){this.value=e},e.Expression.prototype={eval:function(t){return this.value.length>1?new e.Expression(this.value.map(function(e){return e.eval(t)})):this.value.length===1?this.value[0].eval(t):this},toCSS:function(e){return this.value.map(function(t){return t.toCSS?t.toCSS(e):""}).join(" ")}}}(n("../tree")),function(e){e.Import=function(t,n,r,i,s,o){var u=this;this.once=i,this.index=s,this._path=t,this.features=r&&new e.Value(r),this.rootpath=o,t instanceof e.Quoted?this.path=/(\.[a-z]*$)|([\?;].*)$/.test(t.value)?t.value:t.value+".less":this.path=t.value.value||t.value,this.css=/css([\?;].*)?$/.test(this.path),this.css||n.push(this.path,function(t,n,r){t&&(t.index=s),r&&u.once&&(u.skip=r),u.root=n||new e.Ruleset([],[])})},e.Import.prototype={toCSS:function(e){var t=this.features?" "+this.features.toCSS(e):"";return this.css?(typeof this._path.value=="string"&&!/^(?:[a-z-]+:|\/)/.test(this._path.value)&&(this._path.value=this.rootpath+this._path.value),"@import "+this._path.toCSS()+t+";\n"):""},eval:function(t){var n,r=this.features&&this.features.eval(t);return this.skip?[]:this.css?this:(n=new e.Ruleset([],this.root.rules.slice(0)),n.evalImports(t),this.features?new e.Media(n.rules,this.features.value):n.rules)}}}(n("../tree")),function(e){e.JavaScript=function(e,t,n){this.escaped=n,this.expression=e,this.index=t},e.JavaScript.prototype={eval:function(t){var n,r=this,i={},s=this.expression.replace(/@\{([\w-]+)\}/g,function(n,i){return e.jsify((new e.Variable("@"+i,r.index)).eval(t))});try{s=new Function("return ("+s+")")}catch(o){throw{message:"JavaScript evaluation error: `"+s+"`",index:this.index}}for(var u in t.frames[0].variables())i[u.slice(1)]={value:t.frames[0].variables()[u].value,toJS:function(){return this.value.eval(t).toCSS()}};try{n=s.call(i)}catch(o){throw{message:"JavaScript evaluation error: '"+o.name+": "+o.message+"'",index:this.index}}return typeof n=="string"?new e.Quoted('"'+n+'"',n,this.escaped,this.index):Array.isArray(n)?new e.Anonymous(n.join(", ")):new e.Anonymous(n)}}}(n("../tree")),function(e){e.Keyword=function(e){this.value=e},e.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(t){return t instanceof e.Keyword?t.value===this.value?0:1:-1}},e.True=new e.Keyword("true"),e.False=new e.Keyword("false")}(n("../tree")),function(e){e.Media=function(t,n){var r=this.emptySelectors();this.features=new e.Value(n),this.ruleset=new e.Ruleset(r,t),this.ruleset.allowImports=!0},e.Media.prototype={toCSS:function(e,t){var n=this.features.toCSS(t);return this.ruleset.root=e.length===0||e[0].multiMedia,"@media "+n+(t.compress?"{":" {\n ")+this.ruleset.toCSS(e,t).trim().replace(/\n/g,"\n ")+(t.compress?"}":"\n}\n")},eval:function(t){t.mediaBlocks||(t.mediaBlocks=[],t.mediaPath=[]);var n=new e.Media([],[]);return this.debugInfo&&(this.ruleset.debugInfo=this.debugInfo,n.debugInfo=this.debugInfo),n.features=this.features.eval(t),t.mediaPath.push(n),t.mediaBlocks.push(n),t.frames.unshift(this.ruleset),n.ruleset=this.ruleset.eval(t),t.frames.shift(),t.mediaPath.pop(),t.mediaPath.length===0?n.evalTop(t):n.evalNested(t)},variable:function(t){return e.Ruleset.prototype.variable.call(this.ruleset,t)},find:function(){return e.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return e.Ruleset.prototype.rulesets.apply(this.ruleset)},emptySelectors:function(){var t=new e.Element("","&",0);return[new e.Selector([t])]},evalTop:function(t){var n=this;if(t.mediaBlocks.length>1){var r=this.emptySelectors();n=new e.Ruleset(r,t.mediaBlocks),n.multiMedia=!0}return delete t.mediaBlocks,delete t.mediaPath,n},evalNested:function(t){var n,r,i=t.mediaPath.concat([this]);for(n=0;n0;n--)t.splice(n,0,new e.Anonymous("and"));return new e.Expression(t)})),new e.Ruleset([],[])},permute:function(e){if(e.length===0)return[];if(e.length===1)return e[0];var t=[],n=this.permute(e.slice(1));for(var r=0;r0){c=!0;for(a=0;athis.params.length)return!1;if(this.required>0&&n>this.params.length)return!1}r=Math.min(n,this.arity);for(var s=0;si.selectors[o].elements.length?Array.prototype.push.apply(r,i.find(new e.Selector(t.elements.slice(1)),n)):r.push(i);break}}),this._lookups[o]=r)},toCSS:function(t,n){var r=[],i=[],s=[],o=[],u=[],a,f,l;this.root||this.joinSelectors(u,t,this.selectors);for(var c=0;c0){f=e.debugInfo(n,this),a=u.map(function(e){return e.map(function(e){return e.toCSS(n)}).join("").trim()}).join(n.compress?",":",\n");for(var c=i.length-1;c>=0;c--)s.indexOf(i[c])===-1&&s.unshift(i[c]);i=s,r.push(f+a+(n.compress?"{":" {\n ")+i.join(n.compress?"":"\n ")+(n.compress?"}":"\n}\n"))}return r.push(o),r.join("")+(n.compress?"\n":"")},joinSelectors:function(e,t,n){for(var r=0;r0)for(i=0;i0&&this.mergeElementsOnToSelectors(g,a);for(s=0;s0&&(l[0].elements=l[0].elements.slice(0),l[0].elements.push(new e.Element(f.combinator,"",0))),y.push(l);else for(o=0;o0?(h=l.slice(0),m=h.pop(),d=new e.Selector(m.elements.slice(0)),v=!1):d=new e.Selector([]),c.length>1&&(p=p.concat(c.slice(1))),c.length>0&&(v=!1,d.elements.push(new e.Element(f.combinator,c[0].elements[0].value,0)),d.elements=d.elements.concat(c[0].elements.slice(1))),v||h.push(d),h=h.concat(p),y.push(h)}a=y,g=[]}}g.length>0&&this.mergeElementsOnToSelectors(g,a);for(i=0;i0?i[i.length-1]=new e.Selector(i[i.length-1].elements.concat(t)):i.push(new e.Selector(t))}}}(n("../tree")),function(e){e.Selector=function(e){this.elements=e},e.Selector.prototype.match=function(e){var t=this.elements,n=t.length,r,i,s,o;r=e.elements.slice(e.elements.length&&e.elements[0].value==="&"?1:0),i=r.length,s=Math.min(n,i);if(i===0||n1?"["+e.value.map(function(e){return e.toCSS(!1)}).join(", ")+"]":e.toCSS(!1)}}(n("./tree"));var o=/^(file|chrome(-extension)?|resource|qrc|app):/.test(location.protocol);r.env=r.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||o?"development":"production"),r.async=r.async||!1,r.fileAsync=r.fileAsync||!1,r.poll=r.poll||(o?1e3:1500);if(r.functions)for(var u in r.functions)r.tree.functions[u]=r.functions[u];var a=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(location.hash);a&&(r.dumpLineNumbers=a[1]),r.watch=function(){return r.watchMode||(r.env="development",f()),this.watchMode=!0},r.unwatch=function(){return clearInterval(r.watchTimer),this.watchMode=!1},/!watch/.test(location.hash)&&r.watch();var l=null;if(r.env!="development")try{l=typeof e.localStorage=="undefined"?null:e.localStorage}catch(c){}var h=document.getElementsByTagName("link"),p=/^text\/(x-)?less$/;r.sheets=[];for(var d=0;d