Android port using PhoneGap
9
build/android/.cordova/config.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"lib": {
|
||||
"www": {
|
||||
"id": "com.mdibaiee.sketchy",
|
||||
"version": "1.2.0",
|
||||
"uri": "https://mdibaiee.github.io/Sketchy/build/web/"
|
||||
}
|
||||
}
|
||||
}
|
BIN
build/android/android.zip
Normal file
20
build/android/config.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<widget id='com.mdibaiee.sketchy' version='1.2.1'>
|
||||
|
||||
<name>Sketchy</name>
|
||||
<description>
|
||||
Free full-featured Sketch app
|
||||
</description>
|
||||
<author email='mdibaiee@aol.com' href='http://dibaiee.ir'>
|
||||
Mahdi Dibaiee
|
||||
</author>
|
||||
<content src='index.html'/>
|
||||
<access origin='*'/>
|
||||
|
||||
<preference name='KeepRunning' value='false'/>
|
||||
<preference name='SplashScreen' value='sketchy'/>
|
||||
<preference name='SetFullScreen' value='true'/>
|
||||
<preference name='FullScreen' value='true'/>
|
||||
<preference name='DisallowOverscroll' value='true'/>
|
||||
</widget>
|
||||
|
||||
|
BIN
build/android/css/fonts/MozTT-Bold.ttf
Normal file
BIN
build/android/css/fonts/MozTT-Light.ttf
Normal file
BIN
build/android/css/fonts/MozTT-Medium.ttf
Normal file
BIN
build/android/css/fonts/MozTT-Regular.ttf
Normal file
BIN
build/android/css/imgs/bg_overlay_pressed_1.png
Normal file
After Width: | Height: | Size: 93 B |
BIN
build/android/css/imgs/bg_overlay_pressed_2.png
Normal file
After Width: | Height: | Size: 94 B |
BIN
build/android/css/imgs/clear.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
build/android/css/imgs/div_line_lg_black.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
build/android/css/imgs/div_line_sm_black.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
build/android/css/imgs/download.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
build/android/css/imgs/header_bg_black.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
build/android/css/imgs/load.png
Normal file
After Width: | Height: | Size: 413 B |
BIN
build/android/css/imgs/menu.png
Normal file
After Width: | Height: | Size: 182 B |
BIN
build/android/css/imgs/redo.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
build/android/css/imgs/settings.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
build/android/css/imgs/undo.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
650
build/android/css/main.css
Normal file
@ -0,0 +1,650 @@
|
||||
@font-face {
|
||||
font-family: 'MozTT-Regular';
|
||||
src: url('fonts/MozTT-Regular.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'MozTT-Light';
|
||||
src: url('fonts/MozTT-Light.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'MozTT-Medium';
|
||||
src: url('fonts/MozTT-Medium.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'MozTT-Bold';
|
||||
src: url('fonts/MozTT-Bold.ttf');
|
||||
}
|
||||
/* Purty Picker Copyright 2013 Jayden Seric (MIT license): https://github.com/jaydenseric/Purty-Picker */
|
||||
/* Core: No touchy! */
|
||||
.color-picker .spectrum {
|
||||
position: relative;
|
||||
/* To position pin, luminosity filter */
|
||||
background: linear-gradient(#808080, transparent), linear-gradient(90deg, #ff0000, #ff2b00, #ff5500, #ff8000, #ffaa00, #ffd500, #ffff00, #d4ff00, #aaff00, #80ff00, #55ff00, #2bff00, #00ff00, #00ff2b, #00ff55, #00ff80, #00ffaa, #00ffd5, #00ffff, #00d4ff, #00aaff, #007fff, #0055ff, #002bff, #0000ff, #2a00ff, #5500ff, #7f00ff, #aa00ff, #d400ff, #ff00ff, #ff00d4, #ff00aa, #ff0080, #ff0055, #ff002b, #ff0000);
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
/* Prevent pin interaction causing content selection */
|
||||
cursor: crosshair;
|
||||
}
|
||||
.color-picker .spectrum.active {
|
||||
cursor: none;
|
||||
}
|
||||
.color-picker .spectrum.active .pin {
|
||||
cursor: none;
|
||||
}
|
||||
.color-picker .spectrum > div {
|
||||
/* Luminosity filter */
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
.color-picker .spectrum .pin {
|
||||
position: absolute;
|
||||
cursor: move;
|
||||
}
|
||||
/* Customization: Default skin */
|
||||
.color-picker {
|
||||
margin: 20px;
|
||||
padding: 11px;
|
||||
border: 1px solid #e3e3e3;
|
||||
border-radius: 4px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.color-picker .color,
|
||||
.color-picker .luminosity {
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
.color-picker .format {
|
||||
display: block;
|
||||
margin: 0 auto 10px auto;
|
||||
}
|
||||
.color-picker .color {
|
||||
-webkit-appearance: none;
|
||||
border: 0;
|
||||
border-radius: 2px;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
font-size: 11px;
|
||||
letter-spacing: 1px;
|
||||
font-family: Consolas, Monaco, 'Andale Mono', monospace;
|
||||
color: rgba(0, 0, 0, 0.6);
|
||||
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.color-picker .color.dark {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
.color-picker .spectrum {
|
||||
height: 150px;
|
||||
/* Arbitary but required */
|
||||
overflow: hidden;
|
||||
/* Prevent pin overflowing container */
|
||||
border-radius: 2px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
.color-picker .spectrum > div {
|
||||
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
.color-picker .spectrum .pin {
|
||||
margin-left: -4px;
|
||||
margin-top: -4px;
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
border: 2px solid white;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.4);
|
||||
border-radius: 100%;
|
||||
}
|
||||
.color-picker .luminosity {
|
||||
margin: 0;
|
||||
}
|
||||
/* ----------------------------------
|
||||
* Seekbars
|
||||
* ---------------------------------- */
|
||||
div[role="slider"] {
|
||||
position: relative;
|
||||
height: 3.5rem;
|
||||
}
|
||||
div[role="slider"] > div {
|
||||
display: block;
|
||||
padding: 0;
|
||||
overflow-y: hidden;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
}
|
||||
div[role="slider"] progress {
|
||||
width: 100%;
|
||||
background: #000;
|
||||
border: none;
|
||||
height: 0.1rem;
|
||||
display: block;
|
||||
border-radius: 0;
|
||||
margin-top: 1.9rem;
|
||||
}
|
||||
div[role="slider"] progress::-moz-progress-bar {
|
||||
background: #01c5ed;
|
||||
height: 0.6rem;
|
||||
margin-top: -0.3rem;
|
||||
border-radius: 0;
|
||||
}
|
||||
div[role="slider"] > label {
|
||||
font-size: 1.5rem;
|
||||
line-height: 3.8rem;
|
||||
font-family: sans-serif;
|
||||
color: #00aacb;
|
||||
float: right;
|
||||
padding: 0 0 0 1rem;
|
||||
height: 3.5rem;
|
||||
width: auto;
|
||||
}
|
||||
div[role="slider"] label:first-of-type {
|
||||
float: left;
|
||||
padding: 0 1rem 0 0;
|
||||
}
|
||||
div[role="slider"] > label.icon {
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
margin-top: 0.5rem;
|
||||
font-size: 0;
|
||||
background: no-repeat right top / 3rem auto;
|
||||
}
|
||||
div[role="slider"] > label.icon:first-of-type {
|
||||
background-position: top left;
|
||||
}
|
||||
div[role="slider"] button {
|
||||
width: 3.2rem;
|
||||
height: 3.2rem;
|
||||
background: url(seekbars/images/ui/handler.png) no-repeat center center / 3rem auto;
|
||||
font: 0/0 a;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
margin: -1.5rem 0 0 -1.6rem;
|
||||
border-radius: 3.2rem;
|
||||
border: solid 0.1rem transparent;
|
||||
transition: border 0.15s ease;
|
||||
padding: 0;
|
||||
z-index: 10;
|
||||
}
|
||||
div[role="slider"] button:active {
|
||||
border: solid 0.5rem #01c5ed;
|
||||
}
|
||||
/* ----------------------------------
|
||||
* Value selector (Single & Multiple)
|
||||
* ---------------------------------- */
|
||||
/* Main dialog setup */
|
||||
form[role="dialog"][data-type="value-selector"] {
|
||||
background: url(value_selector/images/ui/pattern.png) repeat left top, url(value_selector/images/ui/gradient.png) no-repeat left top / 100% 100%;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
z-index: 100;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
padding: 0 0 7rem;
|
||||
color: #fff;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] > section {
|
||||
padding: 0 1.5rem 0;
|
||||
-moz-box-sizing: padding-box;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] h1 {
|
||||
font-weight: 400;
|
||||
font-size: 1.9rem;
|
||||
line-height: 4.8rem;
|
||||
color: #fff;
|
||||
border-bottom: 0.1rem solid #616262;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
margin: 0 -1.5rem;
|
||||
padding: 0 3rem 1rem;
|
||||
height: 4.8rem;
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
/* Specific component code */
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] {
|
||||
position: relative;
|
||||
padding: 0;
|
||||
margin: 0 -1.5rem;
|
||||
max-height: calc(95%);
|
||||
overflow: auto;
|
||||
border-top: solid 0.1rem #222323;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] .scrollable:before {
|
||||
content: "";
|
||||
display: block;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
top: 4.8rem;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 6.9rem;
|
||||
background: url(value_selector/images/ui/shadow.png) repeat-x left top, url(value_selector/images/ui/shadow-invert.png) repeat-x left bottom;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li {
|
||||
margin: 0;
|
||||
padding: 0 1.5rem;
|
||||
height: auto;
|
||||
list-style: none;
|
||||
position: relative;
|
||||
font-weight: lighter;
|
||||
font-size: 2.2rem;
|
||||
line-height: 3.9rem;
|
||||
color: #fff;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li:first-child label {
|
||||
border-top-color: transparent;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li label {
|
||||
outline: none;
|
||||
display: block;
|
||||
color: #fff;
|
||||
border-top: 0.1rem solid #666;
|
||||
border-bottom: 0.1rem solid #000;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li:last-child label {
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li label span {
|
||||
display: block;
|
||||
padding: 1rem 1.5rem;
|
||||
line-height: 4rem;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
/* Pressed status */
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li:active {
|
||||
background-color: #00ABCC;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li:active label {
|
||||
border-color: transparent;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li:active + li label {
|
||||
border-top-color: #000;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li:active label span {
|
||||
color: #fff !important;
|
||||
background-image: none;
|
||||
}
|
||||
/* Checked status */
|
||||
form[role="dialog"][data-type="value-selector"] [role="listbox"] li[aria-selected="true"]:not([data-input]) span {
|
||||
padding-right: 2.6rem;
|
||||
margin-right: 1.2rem;
|
||||
color: #00abcd;
|
||||
background: transparent url(value_selector/images/icons/checked.png) no-repeat 100% 50%;
|
||||
background-size: 2rem;
|
||||
}
|
||||
/* Menu & buttons setup */
|
||||
form[role="dialog"][data-type="value-selector"] menu {
|
||||
white-space: nowrap;
|
||||
margin: 0;
|
||||
padding: 1.5rem;
|
||||
border-top: solid 0.1rem rgba(255, 255, 255, 0.1);
|
||||
background: #2d2d2d url(value_selector/images/ui/pattern.png) repeat left top;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] menu button::-moz-focus-inner {
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] menu button,
|
||||
.button {
|
||||
width: calc(49.5%);
|
||||
height: 3.8rem;
|
||||
margin: 0 0 1rem;
|
||||
padding: 0 1.5rem;
|
||||
-moz-box-sizing: border-box;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
background: #fafafa url(value_selector/images/ui/default.png) repeat-x left bottom / auto 100%;
|
||||
border: 0.1rem solid #a6a6a6;
|
||||
border-radius: 0.3rem;
|
||||
font-weight: 500;
|
||||
font-size: 1.6rem;
|
||||
line-height: 3.8rem;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
text-shadow: 0.1rem 0.1rem 0 rgba(255, 255, 255, 0.3);
|
||||
text-decoration: none;
|
||||
outline: none;
|
||||
}
|
||||
/* Press (default & affirmative) */
|
||||
form[role="dialog"][data-type="value-selector"] menu button:active,
|
||||
form[role="dialog"][data-type="value-selector"] menu button.affirmative:active,
|
||||
.button:active {
|
||||
border-color: #008aaa;
|
||||
background: #008aaa;
|
||||
color: #333;
|
||||
}
|
||||
/* affirmative */
|
||||
form[role="dialog"][data-type="value-selector"] menu button.affirmative,
|
||||
.button.affirmative {
|
||||
background-image: url(value_selector/images/ui/affirmative.png);
|
||||
background-color: #00caf2;
|
||||
border-color: #008eab;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] menu button:last-child {
|
||||
margin-left: 1rem;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] menu button,
|
||||
form[role="dialog"][data-type="value-selector"] menu button:first-child {
|
||||
margin: 0;
|
||||
}
|
||||
form[role="dialog"][data-type="value-selector"] menu button.full,
|
||||
.button.full {
|
||||
width: 100%;
|
||||
}
|
||||
/* Right to left tweaks */
|
||||
html[dir="rtl"] #value-selector li input:checked + span,
|
||||
html[dir="rtl"] #value-selector li[aria-selected="true"] span {
|
||||
padding-left: 2.6rem;
|
||||
margin-left: 1.2rem;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
font-size: 10px;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
}
|
||||
*::-moz-focus-inner {
|
||||
border: none;
|
||||
}
|
||||
*:focus {
|
||||
outline: none;
|
||||
}
|
||||
.hidden {
|
||||
display: none !important;
|
||||
visibility: none !important;
|
||||
}
|
||||
div#container {
|
||||
position: absolute;
|
||||
}
|
||||
canvas {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
canvas:first-of-type {
|
||||
background: white;
|
||||
}
|
||||
.separator {
|
||||
display: block;
|
||||
height: 4.8rem;
|
||||
width: 0.1rem;
|
||||
}
|
||||
.separator.long {
|
||||
background: url('imgs/div_line_lg_black.png');
|
||||
}
|
||||
.separator.small {
|
||||
background: url('imgs/div_line_sm_black.png');
|
||||
}
|
||||
.separator.left {
|
||||
float: left;
|
||||
}
|
||||
.separator.right {
|
||||
float: right;
|
||||
}
|
||||
.separator.menu {
|
||||
position: relative;
|
||||
left: -3rem;
|
||||
}
|
||||
.overlay {
|
||||
z-index: 9999;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 5.3rem;
|
||||
}
|
||||
button {
|
||||
-moz-appearance: none;
|
||||
z-index: 1;
|
||||
position: relative;
|
||||
border: none;
|
||||
}
|
||||
.close {
|
||||
display: block;
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
padding: 0 0 0.2rem 0.2rem;
|
||||
font-size: 10pt;
|
||||
border: 1px solid #e3e3e3;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
top: -2%;
|
||||
left: 97%;
|
||||
}
|
||||
.picker,
|
||||
.about,
|
||||
.tour,
|
||||
.vote {
|
||||
font-family: 'MozTT-Light';
|
||||
width: 30rem;
|
||||
height: 24.6rem;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
margin-top: -12.3rem;
|
||||
margin-left: -15rem;
|
||||
}
|
||||
.picker .color-picker,
|
||||
.about .color-picker,
|
||||
.tour .color-picker,
|
||||
.vote .color-picker {
|
||||
margin: 0;
|
||||
}
|
||||
.about,
|
||||
.tour,
|
||||
.vote {
|
||||
background: #262626;
|
||||
padding: 1rem 2rem;
|
||||
height: 23rem;
|
||||
margin-top: -11.5rem;
|
||||
margin-left: -17rem;
|
||||
border-radius: 0.2rem;
|
||||
color: white;
|
||||
box-shadow: 0 0 0.3rem black;
|
||||
}
|
||||
.about a,
|
||||
.tour a,
|
||||
.vote a,
|
||||
.about a:link,
|
||||
.tour a:link,
|
||||
.vote a:link,
|
||||
.about a:visited,
|
||||
.tour a:visited,
|
||||
.vote a:visited,
|
||||
.about a:active,
|
||||
.tour a:active,
|
||||
.vote a:active {
|
||||
color: white;
|
||||
}
|
||||
.about .close,
|
||||
.tour .close,
|
||||
.vote .close {
|
||||
background: #262626;
|
||||
color: white;
|
||||
border: 1px solid gray;
|
||||
}
|
||||
.about p,
|
||||
.tour p,
|
||||
.vote p {
|
||||
font-size: 11pt;
|
||||
}
|
||||
.about span,
|
||||
.tour span,
|
||||
.vote span {
|
||||
font-size: 8pt;
|
||||
}
|
||||
.tour .button,
|
||||
.vote .button {
|
||||
width: 30rem;
|
||||
position: absolute;
|
||||
bottom: 1rem;
|
||||
left: 1.8rem;
|
||||
}
|
||||
.vote {
|
||||
height: 30rem;
|
||||
}
|
||||
header {
|
||||
width: 100%;
|
||||
height: 5.3rem;
|
||||
background: url('imgs/header_bg_black.png');
|
||||
}
|
||||
header button {
|
||||
width: 5rem;
|
||||
height: 5rem;
|
||||
}
|
||||
header .menu {
|
||||
background: url('imgs/menu.png') -12px center no-repeat;
|
||||
float: left;
|
||||
}
|
||||
header .menu:active {
|
||||
background: url('imgs/menu.png') -12px center no-repeat, url('imgs/bg_overlay_pressed_1.png') left no-repeat;
|
||||
}
|
||||
header .save {
|
||||
background: url('imgs/download.png') center center no-repeat;
|
||||
float: right;
|
||||
}
|
||||
header .save:active {
|
||||
background: url('imgs/download.png') center center no-repeat, url('imgs/bg_overlay_pressed_2.png') center center;
|
||||
}
|
||||
header .load {
|
||||
background: url('imgs/load.png') center center no-repeat;
|
||||
float: right;
|
||||
}
|
||||
header .load:active {
|
||||
background: url('imgs/load.png') center center no-repeat, url('imgs/bg_overlay_pressed_2.png') center center;
|
||||
}
|
||||
header #title {
|
||||
color: white;
|
||||
font-size: 11pt;
|
||||
font-family: 'MozTT-Regular';
|
||||
float: left;
|
||||
margin: 1.5rem 0;
|
||||
position: relative;
|
||||
left: -2rem;
|
||||
}
|
||||
#menu {
|
||||
width: 15.4rem;
|
||||
height: 100%;
|
||||
display: block;
|
||||
background: #262626;
|
||||
position: absolute;
|
||||
left: -15.4rem;
|
||||
top: 5rem;
|
||||
color: white;
|
||||
transition: left 0.3s ease-out;
|
||||
border-collapse: collapse;
|
||||
overflow: hidden;
|
||||
}
|
||||
#menu.pulled {
|
||||
left: 0;
|
||||
transition: left 0.3s ease-out;
|
||||
}
|
||||
#menu button[id^='set'],
|
||||
#menu p,
|
||||
#menu .bottom button {
|
||||
background: none;
|
||||
display: block;
|
||||
width: 75%;
|
||||
color: white;
|
||||
text-align: left;
|
||||
margin: 1rem 2.5rem;
|
||||
font-family: 'MozTT-Light' !important;
|
||||
font-size: 9pt;
|
||||
padding: 0 0.6rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
#menu p {
|
||||
width: 65%;
|
||||
}
|
||||
#menu span {
|
||||
float: right;
|
||||
font-size: 7pt;
|
||||
padding-top: 0.3rem;
|
||||
}
|
||||
#menu div[role='slider'] {
|
||||
width: 60%;
|
||||
float: right;
|
||||
margin: 0 2rem 0 0;
|
||||
}
|
||||
#menu div[role='slider'] div {
|
||||
overflow: visible;
|
||||
}
|
||||
#menu div[role='slider'] div button {
|
||||
margin-top: -3.4rem;
|
||||
left: 0%;
|
||||
}
|
||||
#menu hr {
|
||||
clear: both;
|
||||
padding: 0.7rem 0;
|
||||
margin-bottom: 0.7rem;
|
||||
border: none;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
#menu *[class^='icon'] {
|
||||
display: block;
|
||||
margin: 1rem 0.5rem;
|
||||
font-family: 'MozTT-Regular' !important;
|
||||
}
|
||||
#menu *[class^='icon']:nth-of-type(2) {
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
#menu *[class^='icon']:before {
|
||||
content: '';
|
||||
background-size: 2rem;
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
display: block;
|
||||
float: left;
|
||||
margin: -0.3rem 0.5rem 0 0;
|
||||
}
|
||||
#menu .icon-settings:before {
|
||||
background-image: url('imgs/settings.png');
|
||||
}
|
||||
#menu .icon-clear:before {
|
||||
background-image: url('imgs/clear.png');
|
||||
}
|
||||
#menu .icon-undo:before {
|
||||
background-image: url('imgs/undo.png');
|
||||
}
|
||||
#menu .icon-redo:before {
|
||||
background-image: url('imgs/redo.png');
|
||||
}
|
||||
#menu .options {
|
||||
display: table-row;
|
||||
vertical-align: top;
|
||||
margin-top: 1rem;
|
||||
width: 100%;
|
||||
}
|
||||
#menu .bottom {
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
bottom: 5rem;
|
||||
}
|
||||
#menu .bottom button[class^='icon'] {
|
||||
margin-left: 3.5rem;
|
||||
}
|
||||
#menu .bottom button {
|
||||
margin-left: 5rem;
|
||||
}
|
BIN
build/android/css/seekbars/images/ui/handler.png
Normal file
After Width: | Height: | Size: 636 B |
BIN
build/android/css/seekbars/images/ui/handler@1.5x.png
Normal file
After Width: | Height: | Size: 960 B |
BIN
build/android/css/seekbars/images/ui/handler@2x.png
Normal file
After Width: | Height: | Size: 938 B |
79
build/android/css/seekbars/seekbars.css
Normal file
@ -0,0 +1,79 @@
|
||||
/* ----------------------------------
|
||||
* Seekbars
|
||||
* ---------------------------------- */
|
||||
div[role="slider"] {
|
||||
position: relative;
|
||||
height: 3.5rem;
|
||||
}
|
||||
|
||||
div[role="slider"] > div {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
div[role="slider"] progress {
|
||||
width: 100%;
|
||||
background: #000;
|
||||
border: none;
|
||||
height: 0.1rem;
|
||||
display: block;
|
||||
border-radius: 0;
|
||||
margin-top: 1.9rem;
|
||||
}
|
||||
|
||||
div[role="slider"] progress::-moz-progress-bar {
|
||||
background: #01c5ed;
|
||||
height: 0.6rem;
|
||||
margin-top: -0.3rem;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
div[role="slider"] > label {
|
||||
font-size: 1.5rem;
|
||||
line-height: 3.8rem;
|
||||
font-family: sans-serif;
|
||||
color: #00aacb;
|
||||
float: right;
|
||||
padding: 0 0 0 1rem;
|
||||
height: 3.5rem;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
div[role="slider"] label:first-of-type {
|
||||
float: left;
|
||||
padding: 0 1rem 0 0;
|
||||
}
|
||||
|
||||
div[role="slider"] > label.icon {
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
margin-top: 0.5rem;
|
||||
font-size: 0;
|
||||
background: no-repeat right top / 3rem auto;
|
||||
}
|
||||
|
||||
div[role="slider"] > label.icon:first-of-type {
|
||||
background-position: top left;
|
||||
}
|
||||
|
||||
div[role="slider"] button {
|
||||
width: 3.2rem;
|
||||
height: 3.2rem;
|
||||
background: url(seekbars/images/ui/handler.png) no-repeat center center / 3rem auto;
|
||||
font: 0/0 a;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
margin: -1.5rem 0 0 -1.6rem;
|
||||
border-radius: 3.2rem;
|
||||
border: solid 0.1rem transparent;
|
||||
transition: border 0.15s ease;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div[role="slider"] button:active {
|
||||
border: solid 0.5rem #01c5ed;
|
||||
}
|
BIN
build/android/css/switches/images/check/danger.png
Normal file
After Width: | Height: | Size: 583 B |
BIN
build/android/css/switches/images/check/danger@1.5x.png
Normal file
After Width: | Height: | Size: 946 B |
BIN
build/android/css/switches/images/check/danger@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
build/android/css/switches/images/check/default.png
Normal file
After Width: | Height: | Size: 583 B |
BIN
build/android/css/switches/images/check/default@1.5x.png
Normal file
After Width: | Height: | Size: 946 B |
BIN
build/android/css/switches/images/check/default@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
build/android/css/switches/images/radio/danger.png
Normal file
After Width: | Height: | Size: 578 B |
BIN
build/android/css/switches/images/radio/danger@1.5x.png
Normal file
After Width: | Height: | Size: 893 B |
BIN
build/android/css/switches/images/radio/danger@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
build/android/css/switches/images/radio/default.png
Normal file
After Width: | Height: | Size: 575 B |
BIN
build/android/css/switches/images/radio/default@1.5x.png
Normal file
After Width: | Height: | Size: 889 B |
BIN
build/android/css/switches/images/radio/default@2x.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
build/android/css/switches/images/switch/background.png
Normal file
After Width: | Height: | Size: 755 B |
BIN
build/android/css/switches/images/switch/background@1.5x.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
build/android/css/switches/images/switch/background_off.png
Normal file
After Width: | Height: | Size: 475 B |
BIN
build/android/css/switches/images/switch/background_off@1.5x.png
Normal file
After Width: | Height: | Size: 616 B |
BIN
build/android/css/value_selector/images/icons/checked.png
Normal file
After Width: | Height: | Size: 177 B |
BIN
build/android/css/value_selector/images/icons/checked@1.5x.png
Normal file
After Width: | Height: | Size: 392 B |
BIN
build/android/css/value_selector/images/icons/checked@2x.png
Normal file
After Width: | Height: | Size: 601 B |
BIN
build/android/css/value_selector/images/ui/affirmative.png
Normal file
After Width: | Height: | Size: 101 B |
BIN
build/android/css/value_selector/images/ui/default.png
Normal file
After Width: | Height: | Size: 82 B |
BIN
build/android/css/value_selector/images/ui/gradient.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
build/android/css/value_selector/images/ui/gradient@1.5x.png
Normal file
After Width: | Height: | Size: 7.7 KiB |
BIN
build/android/css/value_selector/images/ui/pattern.png
Normal file
After Width: | Height: | Size: 6.7 KiB |
BIN
build/android/css/value_selector/images/ui/shadow-invert.png
Normal file
After Width: | Height: | Size: 83 B |
After Width: | Height: | Size: 154 B |
BIN
build/android/css/value_selector/images/ui/shadow-invert@2x.png
Normal file
After Width: | Height: | Size: 86 B |
BIN
build/android/css/value_selector/images/ui/shadow.png
Normal file
After Width: | Height: | Size: 82 B |
BIN
build/android/css/value_selector/images/ui/shadow@1.5x.png
Normal file
After Width: | Height: | Size: 154 B |
BIN
build/android/css/value_selector/images/ui/shadow@2x.png
Normal file
After Width: | Height: | Size: 87 B |
275
build/android/index.html
Normal file
@ -0,0 +1,275 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Sketchy</title>
|
||||
<meta charset='UTF-8'>
|
||||
<link rel='stylesheet' href='css/main.css'>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<button class='menu'></button>
|
||||
<span class='separator long left menu'></span>
|
||||
<p id='title'>Sketchy</p>
|
||||
<button class='save'></button>
|
||||
<span class='separator small right'></span>
|
||||
<button class='load'></button>
|
||||
</header>
|
||||
|
||||
<div id='container'>
|
||||
<canvas></canvas>
|
||||
<canvas></canvas>
|
||||
</div>
|
||||
|
||||
<div id='menu'>
|
||||
<div class='options'>
|
||||
<p class='icon-settings'>Settings</p>
|
||||
<div class='general'>
|
||||
<button id='settype'>Brush Type<span>Sketch</span></button>
|
||||
<button id='setcolor'>Color<span>#000000</span></button>
|
||||
<button id='setbg'>Background<span>#ffffff</span></button>
|
||||
<p id='lineWidth'>Line Width <span>2</span></p>
|
||||
<div role="slider" class='lineWidth'>
|
||||
<div>
|
||||
<progress value="2" min="1" max="100"></progress>
|
||||
<button style='left: 2%'>handler</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<hr>
|
||||
<div class='sketch'>
|
||||
<p class='icon-settings'>Sketch</p>
|
||||
<p id='connectTelorance'>Telorance<span>40</span></p>
|
||||
<div role="slider" class='connectTelorance'>
|
||||
<div>
|
||||
<progress value="40" min="1" max="100"></progress>
|
||||
<button style='left: 40%'>handler</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='fur hidden'>
|
||||
<p class='icon-settings'>Fur</p>
|
||||
<p id='connectTelorance'>Telorance<span>40</span></p>
|
||||
<div role="slider" class='connectTelorance'>
|
||||
<div>
|
||||
<progress value="40" min="10" max="100"></progress>
|
||||
<button style='left: 40%'>handler</button>
|
||||
</div>
|
||||
</div>
|
||||
<p id='furLength'>Fur Length<span>50</span></p>
|
||||
<div role="slider" class='furLength'>
|
||||
<div>
|
||||
<progress value="50" min="1" max="100"></progress>
|
||||
<button style='left: 50%'>handler</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='line hidden'>
|
||||
<button id='setlineJoin'>Line Join<span>Round</span></button>
|
||||
<button id='setlineCap'>Line Cap<span>Round</span></button>
|
||||
|
||||
<p class='fill'>Fill<span>No</span></p>
|
||||
<p class='stroke'>Stroke<span>Yes</span></p>
|
||||
</div>
|
||||
|
||||
<div class='shape hidden'>
|
||||
<p class='icon-settings'>Shape</p>
|
||||
<button id='setshape'>Type<span>Circle</span></button>
|
||||
<p class='fill'>Fill<span>No</span></p>
|
||||
<p class='stroke'>Stroke<span>Yes</span></p>
|
||||
<div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class='bottom'>
|
||||
<button id='clear' class='icon-clear'>Clear</button>
|
||||
<button id='undo' class='icon-undo'>Undo</button>
|
||||
<button id='redo' class='icon-redo'>Redo</button>
|
||||
<hr>
|
||||
<button id='about'>About</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<form role='dialog' data-type='value-selector' id='type' class='hidden single'>
|
||||
<section class='scrollable'>
|
||||
<h1>Brush Type</h1>
|
||||
<ol role='listbox'>
|
||||
<li aria-selected='true' data-target='sketch'><label><span>Sketch</span></label></li>
|
||||
<li data-target='fur'><label><span>Fur</span></label></li>
|
||||
<li data-target='pencil'><label><span>Pencil</span></label></li>
|
||||
<li data-target='line'><label><span>Line</span></label></li>
|
||||
<li data-target='shape'><label><span>Shape</span></label></li>
|
||||
<!--<li><label><span>Eraser</span></label></li>-->
|
||||
</ol>
|
||||
</section>
|
||||
<menu>
|
||||
<button class='affirmative full'>Cancel</button>
|
||||
</menu>
|
||||
</form>
|
||||
|
||||
<form role='dialog' data-type='value-selector' id='lineJoin' class='hidden single'>
|
||||
<section class='scrollable'>
|
||||
<h1>Line Join</h1>
|
||||
<ol role='listbox'>
|
||||
<li aria-selected='true'><label><span>Round</span></label></li>
|
||||
<li><label><span>Bevel</span></label></li>
|
||||
<li><label><span>Miter</span></label></li>
|
||||
</ol>
|
||||
</section>
|
||||
<menu>
|
||||
<button class='affirmative full'>Cancel</button>
|
||||
</menu>
|
||||
</form>
|
||||
|
||||
<form role='dialog' data-type='value-selector' id='shape' class='hidden single'>
|
||||
<section class='scrollable'>
|
||||
<h1>Shape Type</h1>
|
||||
<ol role='listbox'>
|
||||
<li aria-selected='true' data-target='shape'><label><span>Circle</span></label></li>
|
||||
<li data-target='shape'><label><span>Rectangle</span></label></li>
|
||||
<li data-target='shape'><label><span>Square</span></label></li>
|
||||
<li data-target='shape'><label><span>Triangle</span></label></li>
|
||||
</ol>
|
||||
<menu>
|
||||
<button class='affirmative full'>Cancel</button>
|
||||
</menu>
|
||||
</section>
|
||||
</form>
|
||||
|
||||
|
||||
<form role='dialog' data-type='value-selector' id='lineCap' class='hidden single'>
|
||||
<section class='scrollable'>
|
||||
<h1>Line Cap</h1>
|
||||
<ol role='listbox'>
|
||||
<li aria-selected='true'><label><span>Round</span></label></li>
|
||||
<li><label><span>Square</span></label></li>
|
||||
<li><label><span>Butt</span></label></li>
|
||||
</ol>
|
||||
</section>
|
||||
<menu>
|
||||
<button class='affirmative full'>Cancel</button>
|
||||
</menu>
|
||||
</form>
|
||||
|
||||
<form role='dialog' data-type='value-selector' id='save' class='hidden confirm'>
|
||||
<section class='scrollable'>
|
||||
<h1>Save</h1>
|
||||
<h1>Type</h1>
|
||||
<ol role='listbox'>
|
||||
<li id='exp' aria-selected='true'><label><span>Export to Image</span></label></li>
|
||||
<li id='pro'><label><span>Sketchy Project</span></label></li>
|
||||
</ol>
|
||||
<h1>Background</h1>
|
||||
<ol role='listbox'>
|
||||
<li aria-selected='true'><label><span>White</span></label></li>
|
||||
<li><label><span>Current Color</span></label></li>
|
||||
<li><label><span>Transparent</span></label></li>
|
||||
</ol>
|
||||
<h1>File Name</h1>
|
||||
<ol role='listbox'>
|
||||
<li aria-selected='true' data-input><label><span contenteditable>My Sketch</span></label></li>
|
||||
</ol>
|
||||
<br>
|
||||
<span class='special'>Note: You must disable pop-up blocker to save your sketch.</span>
|
||||
</section>
|
||||
<menu>
|
||||
<button class='affirmative' type='button'>Cancel</button>
|
||||
<button class='affirmative' type='button'>Save</button>
|
||||
</menu>
|
||||
</form>
|
||||
|
||||
<form role='dialog' data-type='value-selector' id='load' class='hidden confirm'>
|
||||
<section class='scrollable'>
|
||||
<h1>Load</h1>
|
||||
<h1 class='hidden'>file</h1>
|
||||
<ol role='listbox'>
|
||||
</ol>
|
||||
</section>
|
||||
<menu>
|
||||
<button class='affirmative' type='button'>Cancel</button>
|
||||
<button class='affirmative' type='button'>Load</button>
|
||||
</menu>
|
||||
</form>
|
||||
|
||||
|
||||
<!-- COLOR PICKER -->
|
||||
<div class='picker overlay hidden'>
|
||||
<div class='color-picker'>
|
||||
<input value='Hex' class='format' type='hidden' selected>
|
||||
<input class='color' val='#000000'>
|
||||
<div class="spectrum">
|
||||
<div>
|
||||
<div class="pin"></div>
|
||||
</div>
|
||||
</div>
|
||||
<input class="luminosity" type="range" min="0" max="100" />
|
||||
</div>
|
||||
<button class='close'>x</button>
|
||||
</div>
|
||||
|
||||
<div class='about overlay hidden'>
|
||||
<p>Sketchy</p>
|
||||
<span>Sketchy is a free sketch / paint application for Firefox.<br />Current version: 1.2</span>
|
||||
<p>Developer</p>
|
||||
<span>Sketchy was found by Mahdi Dibaiee. More info: <a href='http://about.me/mdibaiee'>About.me</a>
|
||||
<br><br>
|
||||
Contact: <br>
|
||||
<a href='https://twitter.com/mdibaiee'>Twitter</a> •
|
||||
<a href='mailto:mdibaiee@aol.com'>Email</a>
|
||||
<br><br>
|
||||
<a href='http://mdibaiee.github.io/Sketchy/changelog.html'>Changelog</a>
|
||||
</span>
|
||||
<button class='close'>x</button>
|
||||
</div>
|
||||
|
||||
<div class='tour overlay hidden'>
|
||||
<p>Tips</p>
|
||||
<span>Hey! Let me give you some tips to help you along the way,</span><br /><br />
|
||||
<span>To finish a line, hold your finger for 1 second on mobile, or double click on desktop.</span><br />
|
||||
<span>Line join, fill / stroke are applied when the line is finished.</span><br /><br />
|
||||
<span>If you found something missing, please get in touch with us.</span>
|
||||
<button class='button'>Gotcha!</button>
|
||||
<button class='close'>x</button>
|
||||
</div>
|
||||
|
||||
<div class='vote overlay hidden'>
|
||||
<p>King of Firefox OS Apps</p>
|
||||
<span>Hey! FirefoxOSGuide.com has started a competition, judging the best Firefox OS application by users' vote.</span><br /><span>Would you consider taking a few minutes to vote for us, please?</span><br /><br />
|
||||
<span>We're working to add new features to Sketchy like sharing and maybe some 'hosted' addons.</span><br /><br />
|
||||
<span>If you would like to see something in Sketchy's new version, please get in touch with us.</span>
|
||||
<br /><br />
|
||||
<a href='http://bit.ly/1irTueS'>What's your Favorite Firefox OS application?</a>
|
||||
<br />
|
||||
<a href='http://bit.ly/1hosWbM'>Original post on Firefox OS Guide</a>
|
||||
<button class='button'>OK!</button>
|
||||
<button class='close'>x</button>
|
||||
</div>
|
||||
|
||||
<!-- PRELOADER -->
|
||||
<div class='hidden'>
|
||||
<img src='css/value_selector/images/ui/pattern.png'>
|
||||
<img src='css/value_selector/images/ui/gradient.png'>
|
||||
<img src='css/value_selector/images/ui/shadow.png'>
|
||||
<img src='css/value_selector/images/ui/shadow-invert.png'>
|
||||
<img src='css/value_selector/images/icons/checked.png'>
|
||||
<img src='css/value_selector/images/ui/default.png'>
|
||||
<img src='css/value_selector/images/ui/affirmative.png'>
|
||||
</div>
|
||||
|
||||
<script src='js/libs/zepto.min.js'></script>
|
||||
<script src='js/libs/touch.js'></script>
|
||||
<script src='js/libs/color-picker-touch.js'></script>
|
||||
<script src='js/functions.js'></script>
|
||||
<script src='js/shared.js'></script>
|
||||
<script src='js/events.js'></script>
|
||||
<script src='js/diff.js'></script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
1
build/android/js/diff.js
Normal file
@ -0,0 +1 @@
|
||||
$(document).ready(function(){$("*").off("click mousemove mousedown mouseup mouseleave").on("click mousemove mousedown mouseup mouseleave",function(a){a.preventDefault}),window.save=function(){var a=c.getImageData(0,0,width(),height());switch(save.background){case"white":c.fillStyle="white",c.globalCompositeOperation="destination-over",c.fillRect(0,0,width(),height()),c.fillStyle=settings.color,c.globalCompositeOperation=settings.composite;break;case"current color":c.fillStyle=settings.bg,c.globalCompositeOperation="destination-over",c.fillRect(0,0,width(),height()),c.globalCompositeOperation=settings.composite}var b=$c[0].toDataURL();if("sketchy project"==save.type){var d,e=JSON.parse(localStorage.getItem("projects"));e&&e.some(function(a,b){return a.name==save["file name"]?(d=b,!0):!1})?confirm("A sketch with this name already exists. Do you want to overwrite "+save["file name"]+"?")&&(console.log(d),e[d]={name:save["file name"],data:b,points:window.points,settings:settings},localStorage.setItem("projects",JSON.stringify(e))):(e?e.push({name:save["file name"],data:b,points:window.points,settings:settings}):e=[{name:save["file name"],data:b,points:window.points,settings:settings}],localStorage.setItem("projects",JSON.stringify(e)))}else{window.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(a){{var c=dataToBlob(b);a.root.getFile(save["file name"]+".png",{create:!0},function(a){a.createWriter(function(a){a.write(c),alert("Your Sketch was saved successfuly: "+this.result)},function(){alert("Something bad happened trying to save your sketch "+save["file name"]+"\n Possible reasons:\n Duplicate Name \n Not enough permission")})})}},function(a){alert("Couldn't access filesystem\n"+a.message)})}c.putImageData(a,0,0)},window.load=function(){var a=JSON.parse(localStorage.getItem("projects")).filter(function(a){return a.name==load.file})[0],b=document.createElement("img");b.src=a.data,b.onload=function(){c.clearRect(0,0,width(),height()),c.drawImage(b,0,0),window.points=a.points,window.points.history=[{data:c.createImageData($c.width(),$c.height()),points:[]},{data:c.getImageData(0,0,width(),height()),points:a.points}],$c.first().css("background",a.settings.bg),window.settings.bg=a.settings.bg}},localStorage.getItem("sawVote")||($(".vote").removeClass("hidden"),localStorage.setItem("sawVote",!0))});
|