diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..00fedbe
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+/Data
+/Public/data
+*[Ss]ecrets*
+.sass-cache
\ No newline at end of file
diff --git a/JSON/Sizerboard.languages_iso.json b/JSON/Sizerboard.languages_iso.json
new file mode 100644
index 0000000..2a8e707
--- /dev/null
+++ b/JSON/Sizerboard.languages_iso.json
@@ -0,0 +1,186 @@
+{
+ "aa" : "afar",
+ "ab" : "abjasio",
+ "ae" : "avéstico",
+ "af" : "afrikáans",
+ "ak" : "akano",
+ "am" : "amhárico",
+ "an" : "aragonés",
+ "ar" : "alarabiyah",
+ "as" : "asamés",
+ "av" : "avar",
+ "ay" : "aimara",
+ "az" : "azerbaycanca",
+ "ba" : "baskir",
+ "be" : "bielorruso",
+ "bg" : "búlgaro",
+ "bh" : "bhoyapurí",
+ "bi" : "bislama",
+ "bm" : "bambara",
+ "bn" : "bengalí",
+ "bo" : "tibetano",
+ "br" : "bretón",
+ "bs" : "bosnio",
+ "ca" : "catalan",
+ "ce" : "checheno",
+ "ch" : "chamorro",
+ "co" : "corso",
+ "cr" : "cree",
+ "cs" : "cestina",
+ "cu" : "eslavo eclesiástico antiguo",
+ "cv" : "chuvasio",
+ "cy" : "galés",
+ "da" : "dansk",
+ "de" : "alemán",
+ "dv" : "maldivo",
+ "dz" : "dzongkha",
+ "ee" : "ewé",
+ "el" : "ellinika",
+ "en" : "english",
+ "eo" : "esperanto",
+ "es" : "espanol",
+ "et" : "estonio",
+ "eu" : "euskera",
+ "fa" : "farsi",
+ "ff" : "fula",
+ "fi" : "suomi",
+ "fj" : "fiyiano",
+ "fo" : "feroés",
+ "fr" : "francais",
+ "fy" : "frisón",
+ "ga" : "gaeilge",
+ "gd" : "gaélico escocés",
+ "gl" : "gallego",
+ "gn" : "guaraní",
+ "gu" : "guyaratí",
+ "gv" : "manés",
+ "ha" : "hausa",
+ "he" : "ivrit",
+ "hi" : "hindi",
+ "ho" : "hiri motu",
+ "hr" : "croata",
+ "ht" : "haitiano",
+ "hu" : "magyar",
+ "hy" : "armenio",
+ "hz" : "herero",
+ "ia" : "interlingua",
+ "id" : "indonesia",
+ "ie" : "occidental",
+ "ig" : "igbo",
+ "ii" : "yi de Sichuán",
+ "ik" : "iñupiaq",
+ "io" : "ido",
+ "is" : "islandés",
+ "it" : "italiano",
+ "iu" : "inuktitut",
+ "ja" : "nihongo",
+ "jv" : "javanés",
+ "ka" : "georgiano",
+ "kg" : "kongo",
+ "ki" : "kikuyu",
+ "kj" : "kuanyama",
+ "kk" : "kazajo",
+ "kl" : "groenlandés",
+ "km" : "camboyano",
+ "kn" : "canarés",
+ "ko" : "hangugeo",
+ "kr" : "kanuri",
+ "ks" : "cachemiro",
+ "ku" : "kurdo",
+ "kv" : "komi",
+ "kw" : "córnico",
+ "ky" : "kirguís",
+ "la" : "latín",
+ "lb" : "luxemburgués",
+ "lg" : "luganda",
+ "li" : "limburgués",
+ "ln" : "lingala",
+ "lo" : "lao",
+ "lt" : "lituano",
+ "lu" : "luba-katanga",
+ "lv" : "letón",
+ "mg" : "malgache",
+ "mh" : "marshalés",
+ "mi" : "maorí",
+ "mk" : "macedonio",
+ "ml" : "malayalam",
+ "mn" : "mongol",
+ "mr" : "maratí",
+ "ms" : "malayo",
+ "mt" : "maltés",
+ "my" : "birmano",
+ "na" : "nauruano",
+ "nb" : "noruego bokmål",
+ "nd" : "ndebele del norte",
+ "ne" : "nepalí",
+ "ng" : "ndonga",
+ "nl" : "nederlands",
+ "nn" : "nynorsk",
+ "no" : "noruego",
+ "nr" : "ndebele del sur",
+ "nv" : "navajo",
+ "ny" : "chichewa",
+ "oc" : "occitano",
+ "oj" : "ojibwa",
+ "om" : "oromo",
+ "or" : "oriya",
+ "os" : "osético",
+ "pa" : "panyabí",
+ "pi" : "pali",
+ "pl" : "polski",
+ "ps" : "pastú",
+ "pt" : "portugues",
+ "qc" : "quechua",
+ "rm" : "romanche",
+ "rn" : "kirundi",
+ "ro" : "rumano",
+ "ru" : "russkiy",
+ "rw" : "ruandés",
+ "sa" : "sánscrito",
+ "sc" : "sardo",
+ "sd" : "sindhi",
+ "se" : "sami septentrional",
+ "sg" : "sango",
+ "si" : "cingalés",
+ "sk" : "eslovaco",
+ "sl" : "slovencina",
+ "sm" : "samoano",
+ "sn" : "shona",
+ "so" : "somalí",
+ "sq" : "albanés",
+ "sr" : "serbio",
+ "ss" : "suazi",
+ "st" : "sesotho",
+ "su" : "sundanés",
+ "sv" : "svenska",
+ "sw" : "suajili",
+ "ta" : "tamil",
+ "te" : "télugu",
+ "tg" : "tayiko",
+ "th" : "thai",
+ "ti" : "tigriña",
+ "tk" : "turcomano",
+ "tl" : "tagalo",
+ "tn" : "setsuana",
+ "to" : "tongano",
+ "tr" : "turkce",
+ "ts" : "tsonga",
+ "tt" : "tártaro",
+ "tw" : "twi",
+ "ty" : "tahitiano",
+ "ug" : "uigur",
+ "uk" : "ukrainska",
+ "ur" : "urdu",
+ "uz" : "uzbeko",
+ "ve" : "venda",
+ "vi" : "vietnamita",
+ "vo" : "volapük",
+ "wa" : "valón",
+ "wo" : "wolof",
+ "xh" : "xhosa",
+ "yi" : "yídish",
+ "yo" : "yoruba",
+ "za" : "chuan",
+ "zh" : "zhongwen",
+ "zu" : "zulú"
+}
\ No newline at end of file
diff --git a/PHP/Sizerboard.php b/PHP/Sizerboard.php
new file mode 100644
index 0000000..0196c64
--- /dev/null
+++ b/PHP/Sizerboard.php
@@ -0,0 +1,143 @@
+slash = strpos(__DIR__, '/') === null ? '\\' : '/';
+
+ $this->inputs = $inputs;
+
+ }
+
+ public function nulls($nulls = null){
+ return is_bool($nulls) ? $nulls : $this->settings("nulls", null, false, false);
+ }
+
+ public function default_value($default = null, $nulls = null){
+ return $default !== null || $this->nulls($nulls) ? $default : $this->settings("default_value", null, null, true);
+ }
+
+ public static function is_dictionary($value){
+ return is_array($value) && array_values($value) != $value;
+ }
+
+ public function settings($keys, $inputs = null, $default = null, $nulls = null){
+
+ $keys = array_filter(array_unique(array_map(fn($key) => is_string($key) && ($key = trim($key)) ? $key : null, $keys)), fn($key) => $key);
+
+ if(count($keys)){
+
+ $nulls = $this->nulls($nulls);
+
+ foreach(array_merge(
+ is_array($inputs) ? (self::is_dictionary($inputs) ? [$inputs] : $inputs) : [],
+ [$this->inputs, $this->custom_settings, self::$default_settings]
+ ) as $subinputs)
+ if(self::is_dictionary($subinputs))
+ foreach($keys as $key)
+ if(isset($subinputs[$key]) && ($nulls || $subinputs[$key] !== null))
+ return $subinputs[$key];
+ };
+ return $this->default_value($default, $nulls);
+ }
+
+ public static function string_variables($string, $variables = null, $default = null){
+
+ $variables = array_filter(is_array($variables) ? (self::is_dictionary($variables) ? [$variables] : $variables) : [], fn($item) => self::is_dictionary($item));
+
+ return preg_replace_callback('/\{([^\{\}]+)\}/', function($values) use($variables){
+ foreach($variables as $subset)
+ if(isset($subset[$values[1]]))
+ return $subset[$values[1]];
+ return $default ?? $values[0];
+ }, $string);
+ }
+
+ public static function check($conditions, $shift = 0){
+
+ $error = 0;
+ $k = 0;
+ $i = -1;
+
+ if(is_array($conditions) && !self::is_dictionary($conditions))
+ foreach($conditions as $condition){
+ $ignore = false;
+ $i ++;
+ if(is_array($condition)){
+ if(($l = count($condition)) == 2)
+ list($condition, $ignore) = $condition;
+ else
+ list($suberror, $sub_k) = self::check($condition);
+ };
+ if(is_callable($condition) ? $condition() : (is_bool($condition) ? $condition : false)){
+ $ignore ||
+ ($error |= 1 << ($shift + $k + $i));
+ break;
+ };
+ };
+
+ return [$error, $k + $shift + $i];
+ }
+
+ public function fix_path($path){
+
+ $error = self::check([
+ fn() => $path === null,
+ fn() => !is_string($path),
+ [fn() => !$path, true]
+ ], 1)[0];
+ $results = null;
+
+ $error ||
+ ($results = preg_replace('/[\/\\\\]+/', $this->slash, self::string_variables($path, [
+ "project_path" => self::root_project_path
+ ])));
+
+ return [$results, $error];
+ }
+
+ public function get_absolute_path($path){
+
+ $error = self::check([
+ fn() => $path === null,
+ fn() => !is_string($path),
+ [fn() => !$path, true]
+ ], 1)[0];
+ $absolute_path = null;
+
+ if(!$error){
+ foreach($this->root_paths as $root)
+ if(file_exists($full_path = $this->fix_path($root . '/' . $path)[0])){
+ $absolute_path = $full_path;
+ break;
+ };
+ $absolute_path === null &&
+ ($error |= 1 << 4);
+ };
+
+ return [$absolute_path, $error];
+ }
+
+ public function load_file($path){
+
+ list($path, $error) = $this->absolute_path($path);
+ $data = null;
+
+ if(!$error)
+ try{
+ $data = file_get_contents($path);
+ }catch(\Exception $exception){
+ $error |= 1 << 0;
+ };
+
+ return [$data, $error];
+ }
+
+ };
\ No newline at end of file
diff --git a/Public/.htaccess b/Public/.htaccess
new file mode 100755
index 0000000..0596cc2
--- /dev/null
+++ b/Public/.htaccess
@@ -0,0 +1,6 @@
+Header set Access-Control-Allow-Origin "*"
+RewriteEngine On
+RewriteBase /
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
\ No newline at end of file
diff --git a/Public/css/Sizerboard.icons.css b/Public/css/Sizerboard.icons.css
new file mode 100644
index 0000000..c4025b2
--- /dev/null
+++ b/Public/css/Sizerboard.icons.css
@@ -0,0 +1,12 @@
+.sizerboard [data-icon=home]::before{content : "\f015"; font-family : "FA5FS";}
+.sizerboard [data-icon=documentation]::before{content : "\f05a"; font-family : "FA5FS";}
+.sizerboard [data-icon=git]::before{content : "\f841"; font-family : "FA5FB";}
+.sizerboard [data-icon=search]::before{content : "\f002"; font-family : "FA5FS";}
+.sizerboard [data-icon=add]::before{content : "\f067"; font-family : "FA5FS";}
+.sizerboard [data-icon=html]::before{content : "\f121"; font-family : "FA5FS";}
+.sizerboard [data-icon=canvas]::before{content : "\f1c5"; font-family : "FA5FR";}
+.sizerboard [data-icon=svg]::before{content : "\f279"; font-family : "FA5FS";}
+.sizerboard [data-icon=text]::before{content : "\f1c9"; font-family : "FA5FR";}
+.sizerboard [data-icon=upload]::before{content : "\f093"; font-family : "FA5FS";}
+.sizerboard [data-icon=save]::before{content : "\f0c7"; font-family : "FA5FS";}
+.sizerboard [data-icon=download]::before{content : "\f019"; font-family : "FA5FS";}
\ No newline at end of file
diff --git a/Public/ecma/Sizerboard.Base.ecma.js b/Public/ecma/Sizerboard.Base.ecma.js
new file mode 100644
index 0000000..a16af21
--- /dev/null
+++ b/Public/ecma/Sizerboard.Base.ecma.js
@@ -0,0 +1,103 @@
+Sizerboard.Base = function(sizerboard, inputs){
+
+ const self = this,
+ screen_cache = {x : 0, y : 0},
+ texts_cache = {}
+ let started = false,
+ thread = null;
+
+ const construct = () => {
+
+ sizerboard.print("info", "sizerboard_base_building");
+
+ sizerboard.print("ok", "sizerboard_base_built");
+
+ };
+
+ const changes_thread_method = () => {
+
+ if(screen_cache.x != sizerboard.item_self.offsetWidth || screen_cache.y != sizerboard.item_self.offsetHeight){
+
+ screen_cache.x = sizerboard.item_self.offsetWidth;
+ screen_cache.y = sizerboard.item_self.offsetHeight;
+
+ sizerboard.item_self.style.fontSize = (screen_cache[screen_cache.x < screen_cache.y ? "x" : "y"] / Number(sizerboard.item_self.getAttribute("data-cells"))) + "px";
+
+ };
+
+ ["projects_menu", "draw_box"].forEach(key => {
+
+ const text_box = sizerboard.item_self.querySelector("p[data-i18n=" + key + "_text]");
+ let y;
+
+ if(text_box && (
+ !texts_cache[key] ||
+ text_box.innerText != texts_cache[key].text ||
+ (y = text_box.offsetHeight / Number(sizerboard.item_self.style.fontSize.slice(0, -2))) != texts_cache[key].y
+ )){
+
+ (texts_cache[key] || (texts_cache[key] = {})).text = text_box.innerText;
+ texts_cache[key].y = y;
+
+ text_box.parentNode.querySelector("p+ul").style.top = y + "em";
+ text_box.parentNode.querySelector("p+ul+*").style.top = (1.4 + y) + "em";
+
+ };
+
+ });
+
+ };
+
+ this.start = callback => {
+
+ const end = status => typeof callback == "function" && callback(status);
+
+ sizerboard.print("info", "sizerboard_base_starting");
+
+ if(started){
+ sizerboard.print("warn", "sizerboard_base_already_started");
+ end(false);
+ return false;
+ };
+ started = true;
+
+ sizerboard.preload(sizerboard.settings("position"), (position, error, asynchronous) => {
+ if(error)
+ return;
+
+ const classes = sizerboard.settings("class"),
+ hash = sizerboard.hash();
+
+ position.innerHTML = sizerboard.views.get("base_view", {
+ application : sizerboard.settings(["application_name", "application"]),
+ git : sizerboard.settings(["application_git", "git"]),
+ url : sizerboard.settings(["application_url", "url"]),
+ hash : hash,
+ classes : classes ? " " + classes : "",
+ cells : sizerboard.settings("cells"),
+ main_menu_items : sizerboard.views.get_multiple_items("main_menu_item", sizerboard.settings("main_menu_items"))[0],
+ preloader : sizerboard.build_preloader((view, error, asynchronous) => {
+ if(error)
+ return;
+
+ const self_error = sizerboard.set_self(view, hash);
+
+ if(self_error)
+ return;
+
+ thread = sizerboard.thread_add(changes_thread_method);
+
+ sizerboard.print("ok", "sizerboard_base_started");
+ end(true);
+
+ }),
+ projects : sizerboard.views.get_multiple_items("project_option", [])[0]
+ })[0];
+ });
+
+ return true;
+ };
+
+ construct();
+
+};
\ No newline at end of file
diff --git a/Public/ecma/Sizerboard.DrawBox.ecma.js b/Public/ecma/Sizerboard.DrawBox.ecma.js
new file mode 100644
index 0000000..e8bc0a5
--- /dev/null
+++ b/Public/ecma/Sizerboard.DrawBox.ecma.js
@@ -0,0 +1,48 @@
+Sizerboard.DrawBox = function(sizerboard, inputs){
+
+ const self = this;
+ let started = false;
+
+ const construct = () => {
+
+ sizerboard.print("info", "sizerboard_draw_box_building");
+
+ sizerboard.print("ok", "sizerboard_draw_box_built");
+
+ };
+
+ this.start = callback => {
+
+ const end = status => typeof callback == "function" && callback(status);
+
+ sizerboard.print("info", "sizerboard_draw_box_starting");
+
+ if(started){
+ sizerboard.print("warn", "sizerboard_draw_box_already_started");
+ end(false);
+ return false;
+ };
+ started = true;
+
+ sizerboard.print("ok", "sizerboard_draw_box_started");
+ end(true);
+
+ return true;
+ };
+
+ this.show = (item, event, key) => {
+ if(item.hasAttribute("disabled"))
+ return;
+
+ sizerboard.item_self.querySelector(".draw-box").setAttribute("data-mode", key);
+ sizerboard.item_self.querySelectorAll(".draw-box .fields>[data-visible=true]").forEach(section => section.setAttribute("data-visible", false));
+ item.parentNode.parentNode.querySelectorAll("[disabled]").forEach(button => button.removeAttribute("disabled"));
+
+ sizerboard.item_self.querySelector(".draw-box .fields>." + key).setAttribute("data-visible", true);
+ item.setAttribute("disabled", true);
+
+ };
+
+ construct();
+
+};
\ No newline at end of file
diff --git a/Public/ecma/Sizerboard.Projects.ecma.js b/Public/ecma/Sizerboard.Projects.ecma.js
new file mode 100644
index 0000000..3b81cbf
--- /dev/null
+++ b/Public/ecma/Sizerboard.Projects.ecma.js
@@ -0,0 +1,90 @@
+Sizerboard.Projects = function(sizerboard, inputs){
+
+ const self = this;
+ let started = false,
+ cache = "",
+ autosearch_thread;
+
+ const construct = () => {
+
+ sizerboard.print("info", "sizerboard_projects_building");
+
+ sizerboard.print("ok", "sizerboard_projects_built");
+
+ };
+
+ this.start = callback => {
+
+ const end = status => typeof callback == "function" && callback(status);
+
+ sizerboard.print("info", "sizerboard_projects_starting");
+
+ if(started){
+ sizerboard.print("warn", "sizerboard_projects_already_started");
+ end(false);
+ return false;
+ };
+ started = true;
+
+ sizerboard.preload("#projects_menu_search", (item, error, asynchronous) => (
+ error ||
+ (autosearch_thread = sizerboard.thread_add(autosearch_thread_method))
+ ));
+
+ sizerboard.print("ok", "sizerboard_projects_started");
+ end(true);
+
+ return true;
+ };
+
+ const autosearch_thread_method = () => {
+
+ const text = sizerboard.item_self.querySelector(".projects-menu .search-box [name=search]").value;
+
+ if(text != cache){
+ cache = text;
+ sizerboard.item_self.querySelectorAll(".projects-menu nav li").forEach(item => item.setAttribute("data-visible", !cache || item.innerText.includes(cache)));
+ };
+
+ };
+
+ this.search = (item, event) => {};
+
+ this.add = (item, event) => {
+
+ let name = item.parentNode.parentNode.querySelector("[type=text]").value,
+ error = (
+ name === undefined ? 1 << 0 :
+ name === null ? 1 << 1 :
+ typeof name != "string" ? 1 << 2 :
+ !name ? 1 << 3 :
+ !(name = name.trim()) ? 1 << 4 :
+ /[^a-z0-9_\- ]/i.test(name) ? 1 << 5 :
+ sizerboard.item_self.querySelector(".projects-menu nav li[data-name=" + name + "]") ? 1 << 6 :
+ ["null"].includes(name) ? 1 << 7 :
+ 0) << 1;
+
+ error ||
+ (sizerboard.item_self.querySelector(".projects-menu nav>ul").innerHTML += sizerboard.views.get("project_option", {
+ name : name,
+ i : sizerboard.item_self.querySelectorAll(".projects-menu nav li").length
+ })[0]);
+
+ };
+
+ this.get_in_gui = (item, event) => {
+
+ sizerboard.item_self.querySelectorAll(".projects-menu nav li[data-selected=true]").forEach(item => {
+ item.hasAttribute("disabled") && item.removeAttribute("disabled");
+ item.setAttribute("data-selected", false);
+ });
+
+ sizerboard.item_self.querySelector(".draw-box").setAttribute("data-selected", item.getAttribute("data-name"));
+ item.setAttribute("data-selected", true);
+ item.setAttribute("disabled", true);
+
+ };
+
+ construct();
+
+};
\ No newline at end of file
diff --git a/Public/ecma/Sizerboard.Views.ecma.js b/Public/ecma/Sizerboard.Views.ecma.js
new file mode 100644
index 0000000..2cdf56b
--- /dev/null
+++ b/Public/ecma/Sizerboard.Views.ecma.js
@@ -0,0 +1,186 @@
+Sizerboard.Views = function(sizerboard, inputs){
+
+ const self = this,
+ views = {};
+ let started = false,
+ default_overwrite = false;
+
+ const construct = () => {
+
+ sizerboard.print("info", "sizerboard_views_building");
+
+ sizerboard.print("ok", "sizerboard_views_built");
+
+ };
+
+ this.start = callback => {
+
+ const end = status => typeof callback == "function" && callback(status);
+
+ sizerboard.print("info", "sizerboard_views_starting");
+
+ if(started){
+ sizerboard.print("warn", "sizerboard_views_already_started");
+ end(false);
+ return false;
+ };
+ started = true;
+
+ default_overwrite = sizerboard.settings(["views_overwrite", "overwrite"]);
+
+ sizerboard.execute_array_items(["default_views_files", "views_files"], (key, callback) => {
+ self.add(sizerboard.settings(key), true, callback);
+ }, () => {
+ sizerboard.print("ok", "sizerboard_views_started");
+ end(true);
+ });
+
+ return true;
+ };
+
+ const add_json = (data, overwrite, callback) => {
+
+ let json;
+
+ try{
+ json = JSON.parse(data);
+ }catch(exception){};
+
+ if(json)
+ add(json instanceof Array ? json : [json], overwrite, callback, 0);
+ else
+ callback();
+
+ };
+
+ const add = (inputs, overwrite, callback, i) => {
+
+ if(!inputs || (i || (i = 0)) >= inputs.length){
+ typeof callback == "function" && callback();
+ return;
+ };
+
+ const end = () => add(inputs, overwrite, callback, i + 1);
+
+ if(!inputs[i]){
+ end();
+ return;
+ };
+
+ switch(typeof inputs[i]){
+ case "string":
+ if(/^(\[(.+|[\r\n]+)\]|\{(.+|[\r\n]+)\})$/.test(inputs[i].trim()))
+ add_json(inputs[i], overwrite, end);
+ else if(/^[^\s][^\r\n]+[^\s]$/.test(inputs[i]))
+ sizerboard.load_file(inputs[i], response => add([response], overwrite, end, 0));
+ else{
+
+ let matches;
+
+ while(matches = inputs[i].match(/\<\!\-{2} *\[{2}([^\[\]]+)\]{2} *\-{2}\>/)){
+
+ const key = matches[1].trim();
+
+ inputs[i] = inputs[i].substring(matches.index + matches[0].length);
+
+ if(matches = inputs[i].match(new RegExp("\\<\\!\\-{2} *\\[{2} *" + key + " *\\]{2} *\\-{2}\\>"))){
+ (overwrite || views[key] === undefined) && (views[key] = inputs[i].substring(0, matches.index));
+ inputs[i] = inputs[i].substring(matches.index + matches[0].length);
+ };
+
+ };
+
+ end();
+
+ };
+ break;
+ case "object":
+ if(inputs[i] instanceof Array)
+ add(inputs[i], overwrite, end, 0);
+ else{
+ for(const key in inputs[i])
+ typeof inputs[i] == "string" && (overwrite || views[key] === undefined) && (views[key] = inputs[i]);
+ end();
+ };
+ break;
+ default:
+ end();
+ break;
+ };
+
+ };
+
+ this.add = (inputs, overwrite, callback) => add(
+ typeof inputs == "object" && inputs instanceof Array ? inputs : [inputs],
+ typeof overwrite == "boolean" ? overwrite : default_overwrite,
+ callback,
+ 0
+ );
+
+ this.validate = key => (
+ key === undefined ? 1 << 0 :
+ key === null ? 1 << 1 :
+ typeof key != "string" ? 1 << 2 :
+ !key ? 1 << 3 :
+ !(key = key.trim()) ? 1 << 4 :
+ views[key] === undefined ? 1 << 5 :
+ 0);
+
+ const set_variables = (view, variables, _default) => view.replace(/(object_name)/g, "{$1}").replace(/\{([^\{\}]+)\}|\{{2}([^\{\}]+)\}{2}/g, (all, key, i18n) => {
+ if(key){
+ for(let i = 0, l = variables.length; i < l; i ++)
+ if(variables[i][key] !== undefined)
+ return variables[i][key];
+ }else{
+
+ for(let i = 0, l = variables.length; i < l; i ++)
+ if(variables[i][i18n] !== undefined){
+ i18n = variables[i][i18n];
+ break;
+ };
+
+ const text = sizerboard.i18n(i18n, variables, _default === undefined ? null : _default);
+
+ return text !== null ? text : i18n;
+ };
+ return all;
+ });
+
+ const get_variables_array = variables => (
+ variables && typeof variables == "object" ? variables instanceof Array ? variables : [variables] : []
+ ).filter(subset => subset && typeof subset == "object");
+
+ this.get = (key, variables, _default) => {
+
+ let error = self.validate(key) << 1,
+ view = _default;
+
+ !error && (view = set_variables(views[key], get_variables_array(variables).concat([{
+ object_name : sizerboard.object_name
+ }]), _default));
+
+ return [view, error];
+ };
+
+ this.get_multiple_items = (key, items, variables, _default) => {
+
+ let error = (
+ (self.validate(key) << 0) |
+ ((
+ items === undefined ? 1 << 0 :
+ items === null ? 1 << 1 :
+ typeof items != "object" ? 1 << 2 :
+ !(items instanceof Array) ? 1 << 3 :
+ items.some(item => !item || typeof item != "object") ? 1 << 4 :
+ 0) << 7) |
+ 0),
+ results = null;
+
+ !error && (results = items.map(item => set_variables(views[key], get_variables_array(variables).concat([item]), _default)).join(""));
+
+ return [results, error];
+ };
+
+ construct();
+
+};
\ No newline at end of file
diff --git a/Public/ecma/Sizerboard.ecma.js b/Public/ecma/Sizerboard.ecma.js
index e074f9c..0f693e1 100644
--- a/Public/ecma/Sizerboard.ecma.js
+++ b/Public/ecma/Sizerboard.ecma.js
@@ -7,19 +7,88 @@ Sizerboard = function(inputs){
default_text : "",
autostart : true,
default_language : "english",
- timeout : 2000
+ timeout : 2000,
+ print_format : "[{type}] {yyyy}{mm}{dd} {hh}{ii}{ss} [{line}]{file}({method}): {message}",
+ gui_mode : "light",
+ frames_per_second : 24,
+ position : "body",
+ default_settings_files : [
+ "/json/Sizerboard.settings.json",
+ "/json/Sizerboard.settings.secrets.json"
+ ],
+ object_name : "sizerboard"
},
settings = {},
- sentences = {};
+ sentences = {},
+ print_types = [
+ ["unkn", "unknown"],
+ ["info", "information"],
+ [" ok ", "ok", "yes", "y"],
+ ["erro", "error", "wrong"],
+ ["warn", "warning"],
+ ["exce", "except", "exception"],
+ ["note", "test", "tests", "notes", "data"]
+ ],
+ print_styles = {
+ unkn : {
+ dark : "color : #AAA;",
+ light : "color : #666;"
+ },
+ info : {
+ dark : "color : #99F;",
+ light : "color : #009;"
+ },
+ ok : {
+ dark : "color : #9F9;",
+ light : "color : #090;"
+ },
+ note : {
+ dark : "color : #222;",
+ light : "color : #EFEFEF;"
+ }
+ },
+ threads = [],
+ hashes = [];
let started = false,
language, default_language,
allow_settings_nulls, default_text, default_value,
- ajax_timeout;
+ ajax_timeout,
+ print_format = "[{type}] {yyyy}{mm}{dd} {hh}{ii}{ss} [{line}]{file}({method}): {message}",
+ gui_mode = "light",
+ threads_interval,
+ frames_per_second = 24,
+ preload_timeout = 2000,
+ hashes_alphabet, hashes_length;
+
+ const re_trace_block = new RegExp("^(" + [
+ /\s*at\s+(([^\s]+)\s+\()?(([^\(\)\:]+\:)?[^\(\)\:]+)(\:([0-9]+)\:[0-9]+)?\)?/.source, // Webkit
+ /([^\@]+)\@([^:]+\:[^\:]+)\:([0-9]+)\:[0-9]+/.source, // Gecko
+ ].join("|") + ")$");
+
+ let object_name = this.object_name;
+ let item_self = this.item_self = document;
+ let hash_self = this.hash_self;
+
+ let base = this.base;
+ let views = this.views;
+ let projects = this.projects;
+ let draw_box = this.draw_box;
const construct = () => {
basic_values();
+ self.print("info", "sizerboard_building");
+
+ object_name = self.object_name = self.settings("object_name");
+
+ base = self.base = new Sizerboard.Base(self, inputs);
+ views = self.views = new Sizerboard.Views(self, inputs);
+ projects = self.projects = new Sizerboard.Projects(self, inputs);
+ draw_box = self.draw_box = new Sizerboard.DrawBox(self, inputs);
+
+ self.print("ok", "sizerboard_built");
+
self.settings("autostart") && self.start();
};
@@ -32,26 +101,52 @@ Sizerboard = function(inputs){
language = self.settings(["language", "default_language"]);
default_language = self.settings(["default_language", "language"]);
ajax_timeout = self.settings(["ajax_timeout", "timeout"]);
+ print_format = self.settings("print_format");
+ gui_mode = self.settings("gui_mode");
};
this.start = callback => {
const end = status => typeof callback == "function" && callback(status);
+
+ self.print("info", "sizerboard_starting");
if(started){
+ self.print("warn", "sizerboard_already_started");
end(false);
return false;
};
started = true;
+ basic_values();
+
+ self.print("info", "settings_loading");
self.execute_array_items(["default_settings_files", "settings_files"], (key, callback) => {
self.settings_add(self.settings(key), true, callback);
+ basic_values();
}, () => {
+ self.print("ok", "settings_loaded");
+
+ frames_per_second = self.settings("frames_per_second");
+ preload_timeout = self.settings(["preload_timeout", "timeout"]);
+ hashes_alphabet = self.settings(["hashes_alphabet", "alphabet"]);
+ hashes_length = self.settings(["hashes_length", "length"]);
+
+ threads_interval = setInterval(threads_method, 1000 / frames_per_second);
+
+ self.print("info", "i18n_loading");
self.execute_array_items(["default_i18n_files", "i18n_files"], (key, callback) => {
self.i18n_add(self.settings(key), true, callback);
}, () => {
- end(true);
+ self.print("ok", "i18n_loaded");
+
+ self.execute_array_items([views, base, projects, draw_box], (item, callback) => {
+ item.start(callback);
+ }, () => {
+ self.print("ok", "sizerboard_started");
+ end(true);
+ });
});
});
@@ -61,15 +156,17 @@ Sizerboard = function(inputs){
this.nulls = nulls => typeof nulls == "boolean" ? nulls : allow_settings_nulls;
this.default_value = (_default, nulls) => _default !== undefined && (_default !== null || self.nulls(nulls)) ? _default : default_value;
+
+ this.set_keys = keys => (typeof keys == "object" && keys instanceof Array ? keys : [keys]).filter(key => typeof key == "string" && key.trim()).map(key => key.trim());
- this.settings = (keys, inputs, _default, nulls) => {
+ this.settings = (keys, own_inputs, _default, nulls) => {
- const m = (keys = (typeof inputs == "object" && inputs instanceof Array ? inputs : [inputs]).filter(subinputs => typeof subinpunts == "string" && subinputs.trim()).map(subinputs => subinputs.trim())).length;
+ const m = (keys = self.set_keys(keys)).length;
if(m){
- const l = (inputs = (
- inputs == "object" ? inputs instanceof Array ? inputs : [inputs] : []
+ const l = (own_inputs = (
+ own_inputs == "object" ? own_inputs instanceof Array ? own_inputs : [own_inputs] : []
).concat(
[inputs, settings, default_settings]
)).length;
@@ -77,10 +174,10 @@ Sizerboard = function(inputs){
nulls = self.nulls(nulls);
for(let i = 0; i < l; i ++)
- if(typeof inputs[i] == "object")
+ if(own_inputs[i] && typeof own_inputs[i] == "object")
for(let j = 0; j < m; j ++)
- if(inputs[i][keys[j]] !== undefined && (nulls || inputs[i][keys[j]] !== null))
- return inputs[i][keys[j]];
+ if(own_inputs[i][keys[j]] !== undefined && (nulls || own_inputs[i][keys[j]] !== null))
+ return own_inputs[i][keys[j]];
};
return self.default_value(_default, nulls);
};
@@ -93,7 +190,7 @@ Sizerboard = function(inputs){
timeout = ajax_timeout,
date = Date.now();
- ajax.send("get", url, true);
+ ajax.open("get", url, true);
ajax.timeout = timeout;
ajax.onreadystatechange = () => {
if(ended)
@@ -111,17 +208,32 @@ Sizerboard = function(inputs){
return ajax;
};
+
+ this.execute_json = (data, yes, no) => {
+
+ let json;
+
+ try{
+ json = JSON.parse(data);
+ }catch(exception){};
+
+ if(json)
+ typeof yes == "function" && yes(json);
+ else
+ typeof no == "function" && no();
+
+ };
this.execute_array_dictionaries = (inputs, partial_callback, full_callback, i) => {
- if(typeof inputs != "object" || inputs instanceof Array || (i || (i = 0)) >= inputs.length){
+ if(!inputs || typeof inputs != "object" || !(inputs instanceof Array) || (i || (i = 0)) >= inputs.length){
typeof full_callback == "function" && full_callback();
return;
};
const end = () => {
- inputs[i] && typeof partial_callback == "function" && partial_callback(inputs[i]);
- execute_array_dictionaries(inputs, partial_callback, full_callback, i + 1);
+ inputs[i] && typeof inputs[i] == "object" && typeof partial_callback == "function" && partial_callback(inputs[i]);
+ self.execute_array_dictionaries(inputs, partial_callback, full_callback, i + 1);
};
if(!inputs[i]){
@@ -130,25 +242,16 @@ Sizerboard = function(inputs){
};
if(typeof inputs[i] == "object"){
- if(inputs[i] instanceof Array){
+ if(inputs[i] instanceof Array)
self.execute_array_dictionaries(inputs[i], partial_callback, end, 0);
- return;
- };
+ else
+ end();
}else if(typeof inputs[i] == "string"){
-
- let json;
-
- if(/^(\{(.|[\r\n])*\}|\[(.|[\r\n])*)\])$/.test(inputs[i].trim())){
- try{
- json = JSON.parse(inputs[i]);
- }catch(exception){};
- json && self.execute_array_dictionaries(json instanceof Array ? json : [json], partial_callback, end, 0);
- }else
+ if(/^(\{(.|[\r\n])*\}|\[(.|[\r\n])*\])$/.test(inputs[i].trim()))
+ self.execute_json(inputs[i], json => self.execute_array_dictionaries(json instanceof Array ? json : [json], partial_callback, end, 0), end);
+ else
self.load_file(inputs[i], data => {
- try{
- json = JSON.parse(data);
- }catch(exception){};
- json && self.execute_array_dictionaries(json instanceof Array ? json : [json], partial_callback, end, 0);
+ self.execute_json(data, json => self.execute_array_dictionaries(json instanceof Array ? json : [json], partial_callback, end, 0), end);
});
}else
end();
@@ -158,12 +261,12 @@ Sizerboard = function(inputs){
this.execute_array_items = (items, action, callback, i) => {
(typeof items != "object" || !(items instanceof Array)) && (items = [items]);
- if(!items || i >= items.length){
+ if(!items || (i || (i = 0)) >= items.length){
typeof callback == "function" && callback();
return;
};
- const end = () => execute_array_items(items, action, callback, i + 1);
+ const end = () => self.execute_array_items(items, action, callback, i + 1);
if(typeof action == "function")
action(items[i], end);
@@ -176,8 +279,9 @@ Sizerboard = function(inputs){
typeof overwrite != "boolean" && (overwrite = settings_overwrite);
self.execute_array_dictionaries(inputs, data => {
for(const key in data)
- if(overwrite || settings[key] === undefined)
- settings[key] = data[key];
+ (overwrite || settings[key] === undefined) &&
+ !/^Sizerboard.*_(start|end)$/.test(key) &&
+ (settings[key] = data[key]);
}, callback);
};
@@ -189,6 +293,7 @@ Sizerboard = function(inputs){
if(typeof data[language] == "object")
for(const key in data[language])
(overwrite || sentences[language][key] === undefined) &&
+ !/^Sizerboard.*_(start|end)$/.test(key) &&
(sentences[language][key] = data[language][key]);
};
}, callback);
@@ -200,7 +305,7 @@ Sizerboard = function(inputs){
typeof variables == "object" && variables instanceof Array ? variables : [variables]
).filter(variables => typeof variables == "object")).length;
- return string.replace(/\{([^\{\}]+)\}/g, (all, key) => {
+ return ("" + string).replace(/\{([^\{\}]+)\}/g, (all, key) => {
for(let i = 0; i < l; i ++)
if(variables[i][key] !== undefined)
return variables[i][key];
@@ -212,24 +317,285 @@ Sizerboard = function(inputs){
const i18n = (keys, _default) => {
- const j = (keys = (typeof keys == "object" && keys instanceof Array ? keys : [keys]).filter(key => typeof key == "string").map(key => key.trim()).filter(key => key));
+ const m = (keys = self.set_keys(keys)).length;
- if(j){
+ if(m){
- const languages = [language, default_language].concat(Object.keys(sentences)),
+ const languages = [language, default_language].concat(Object.keys(sentences)).filter((language, i, array) => array.indexOf(language) == i),
l = languages.length;
for(let i = 0; i < l; i ++)
- if(languages[i] && typeof languages[i] == "object")
- for(let j = 0; j < l; j ++)
- if(languages[i][keys[j]] !== undefined)
- return languages[i][keys[j]];
+ if(sentences[languages[i]])
+ for(let j = 0; j < m; j ++)
+ if(sentences[languages[i]][keys[j]] !== undefined)
+ return sentences[languages[i]][keys[j]];
return keys[0];
};
return self.default_text(_default);
};
- this.i18n = (keys, variables, _default) => self.string_variables(i18n(keys, _default), variables, _default);
+ this.i18n = (keys, variables, _default) => {
+
+ const text = i18n(keys, _default);
+
+ return self.string_variables(typeof text == "object" ? text.join("") : text, variables, _default);
+ };
+
+ this.get_print_type = type => {
+
+ const l = print_types.length;
+
+ type = type.toLowerCase();
+
+ for(let i = 0; i < l; i ++)
+ if(print_types[i].includes(type))
+ return print_types[i][0].toUpperCase();
+ return print_types[0][0];
+ };
+
+ this.get_trace = i => (new Error()).stack.replace(/^Error\s*?[\r\n]+/, "").trim().split(/[\r\n]+/).slice(1 + (i || 0)).map(line => {
+
+ const matches = line.match(re_trace_block);
+
+ return matches ? {
+ file : matches[4] || matches[9],
+ method : matches[3] || matches[8] || "",
+ line : Number(matches[7] || matches[10])
+ } : null;
+ }).filter(line => line);
+
+ this.print = (type, message, variables, i) => {
+
+ const date = new Date(),
+ own = {
+ ...((
+ variables ? typeof variables == "object" ? [variables] : variables instanceof Array ? variables : [] : []
+ ).reduce((results, set) => typeof set == "object" ? {...results, ...set} : results, {})),
+ ...self.get_trace(i || 1)[0],
+ raw_type : type,
+ type : self.get_print_type(type)
+ };
+
+ ["year", "month", "day", "hours", "minutes", "seconds"].forEach(key => {
+
+ const k = key != "minutes" ? key[0] : "i";
+
+ own[k + k] = ("00" + (own[k] = (own[key] = date["get" + (
+ key == "year" ? "FullYear" :
+ key == "day" ? "Date" :
+ key[0].toUpperCase() + key.substring(1)
+ )]()) % 100)).slice(-2);
+
+ });
+ own.yyyy = own.year;
+
+ const final_message = self.string_variables(print_format, {
+ ...own,
+ message : self.i18n(message, own)
+ });
+
+ switch(own.type){
+ case "INFO":
+ console.log("%c" + final_message, print_styles.info[gui_mode]);
+ break;
+ case " OK ":
+ console.log("%c" + final_message, print_styles.ok[gui_mode]);
+ break;
+ case "ERRO":
+ case "EXCE":
+ console.error(final_message);
+ break;
+ case "WARN":
+ console.warn(final_message);
+ break;
+ case "NOTE":
+ console.log("%c" + final_message, print_styles.note[gui_mode]);
+ break;
+ case "UNKN":
+ default:
+ console.log("%c" + final_message, print_styles.unkn[gui_mode]);
+ break;
+ };
+
+ };
+
+ const threads_method = () => threads.forEach(thread => {
+ if(thread)
+ try{
+ thread();
+ }catch(exception){};
+ });
+
+ this.thread_add = callback => {
+
+ let error = (
+ callback === undefined ? 1 << 0 :
+ callback === null ? 1 << 1 :
+ typeof callback != "function" ? 1 << 2 :
+ 0) << 1,
+ i = null;
+
+ if(!error){
+
+ const l = threads.length;
+
+ for(i = 0; i < l; i ++)
+ if(!threads[i])
+ break;
+
+ threads[i] = callback;
+
+ };
+
+ return [i, error];
+ };
+
+ this.thread_remove = i => {
+
+ let error = (
+ i === undefined ? 1 << 0 :
+ i === null ? 1 << 1 :
+ isNaN(i) ? 1 << 2 :
+ i != i >> 0 ? 1 << 3 :
+ i < 0 ? 1 << 4 :
+ i >= threads.length ? 1 << 5 :
+ 0) << 1;
+
+ !i && (threads[i] = null);
+
+ return error;
+ };
+
+ this.preload = (selector, callback) => {
+
+ let callback_is_function = typeof callback == "function",
+ error = (
+ ((
+ selector === undefined ? 1 << 0 :
+ selector === null ? 1 << 1 :
+ 0) << 0) |
+ ((
+ callback === undefined ? 1 << 0 :
+ callback === null ? 1 << 1 :
+ !callback_is_function ? 1 << 2 :
+ 0) << 10) |
+ 0) << 1,
+ item = null,
+ asynchronous = false;
+ const end = () => callback_is_function && callback(item, error, asynchronous);
+
+ if(!error){
+ switch(typeof selector){
+ case "string":
+ if(!(error |= (
+ !selector ? 1 << 5 :
+ !(selector = selector.trim()) ? 1 << 6 :
+ 0) << 5)){
+
+ try{
+ (item = item_self.querySelector(selector)) && end();
+ }catch(exception){
+ error |= 1 << 7;
+ end();
+ };
+
+ if(!item && !error){
+
+ const date = Date.now(),
+ [thread, suberror] = self.thread_add(() => {
+ if(item = item_self.querySelector(selector)){
+ self.thread_remove(thread);
+ end();
+ }else if(Date.now() - date > preload_timeout){
+ self.thread_remove(thread);
+ error |= 1 << 8;
+ end();
+ };
+ });
+
+ };
+
+ };
+ break;
+ case "object":
+ if(selector.tagName || selector.nodeName)
+ item = selector;
+ else
+ error |= 1 << 4;
+ end();
+ break;
+ default:
+ error |= 1 << 3;
+ end();
+ break;
+ };
+ };
+
+ return error;
+ };
+
+ this.hash = () => {
+
+ let hash;
+ const l = hashes_alphabet.length;
+
+ do{
+ hash = "";
+ while((hash += hashes_alphabet[Math.random() * l >> 0]).length < hashes_length);
+ }while(
+ hashes.includes(hash) ||
+ /^[0-9]/.test(hash) ||
+ document.querySelector("#" + hash + ",." + hash + ",[name=" + hash + "]")
+ );
+ hashes.push(hash);
+
+ return hash;
+ };
+
+ this.build_preloader = callback => {
+
+ const hash = self.hash();
+
+ self.preload("[data-preloader=" + hash + "]", (preloader, error, asynchronous) => {
+ typeof callback == "function" && callback(error ? null : preloader.parentNode, error, asynchronous);
+ preloader.remove();
+ });
+
+ return `
`;
+ };
+
+ this.set_self = (item, hash) => {
+
+ let error = ((
+ ((item_self.tagName || item_self.nodeName) != "#document" ? 1 << 0 : 0) |
+ (hash_self ? 1 << 1 : 0) |
+ 0) || (
+ ((
+ item === undefined ? 1 << 0 :
+ item === null ? 1 << 1 :
+ typeof item != "object" ? 1 << 2 :
+ !item.tagName && !item.nodeName ? 1 << 3 :
+ (item.tagName || item.nodeName) == "#document" ? 1 << 4 :
+ 0) << 2) |
+ ((
+ hash === undefined ? 1 << 0 :
+ hash === null ? 1 << 1 :
+ typeof hash != "string" ? 1 << 2 :
+ !hash ? 1 << 3 :
+ !hash.trim() ? 1 << 4 :
+ hash != hash.trim() ? 1 << 5 :
+ hash.split("").some(character => !hashes_alphabet.includes(character)) ? 1 << 6 :
+ hash.length < hashes_length ? 1 << 7 :
+ 0) << 7) |
+ 0)) << 1;
+
+ if(!error){
+ item_self = self.item_self = item;
+ hash_self = self.hash_self = hash;
+ };
+
+ return error;
+ };
construct();
diff --git a/Public/html/Sizerboard.views.html b/Public/html/Sizerboard.views.html
new file mode 100644
index 0000000..3021c24
--- /dev/null
+++ b/Public/html/Sizerboard.views.html
@@ -0,0 +1,151 @@
+
+
+
+ Sizerboard - Views
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {preloader}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Public/index.html b/Public/index.html
deleted file mode 100644
index 6481d1a..0000000
--- a/Public/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- Sizerboard
-
-
-
-
-
-
-
-
diff --git a/Public/index.php b/Public/index.php
new file mode 100644
index 0000000..a0f452c
--- /dev/null
+++ b/Public/index.php
@@ -0,0 +1,58 @@
+ 1 &&
+ ($language_code = $matches[1][0]);
+
+ if($language_code != $default_language_code && isset($languages_dictionary[$language_code]))
+ $languages[] = $languages_dictionary[$language_code];
+ else
+ $language_code = $default_language_code;
+
+?>
+
+
+ Sizerboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Public/json/Sizerboard.settings.json b/Public/json/Sizerboard.settings.json
new file mode 100644
index 0000000..432cab6
--- /dev/null
+++ b/Public/json/Sizerboard.settings.json
@@ -0,0 +1,33 @@
+{
+ "nulls" : false,
+ "default_value" : null,
+ "default_text" : "",
+ "autostart" : true,
+ "default_language" : "english",
+ "timeout" : 2000,
+ "print_format" : "[{type}] {yyyy}{mm}{dd} {hh}{ii}{ss} [{line}]{file}({method}): {message}",
+ "gui_mode" : "light",
+ "frames_per_second" : 24,
+ "position" : "body",
+ "views_overwrite" : false,
+ "default_views_files" : "/html/Sizerboard.views.html",
+ "logo" : "/images/Sizerboard.webp",
+ "application_name" : "Sizerboard",
+ "application_url" : "https://sizerboard.k3y.pw/",
+ "application_git" : "https://git.k3y.pw/KyMAN/Sizerboard",
+ "cells" : 40,
+ "main_menu_items" : [
+ {"i18n" : "home", "icon" : "home", "url" : "/", "target" : "_self"},
+ {"i18n" : "documentation", "icon" : "documentation", "url" : "/doc", "target" : "_blank"},
+ {"i18n" : "git", "icon" : "git", "url" : "https://git.k3y.pw/KyMAN/Sizerboard", "target" : "_blank"}
+ ],
+ "default_i18n_files" : [
+ "/json/i18n/Sizerboard.i18n.english.json",
+ "/json/i18n/Sizerboard.i18n.espanol.json",
+ "/json/i18n/Sizerboard.i18n.nihongo.json",
+ "/json/i18n/Sizerboard.i18n.russkiy.json",
+ "/json/i18n/Sizerboard.i18n.alarabiyah.json"
+ ],
+ "hashes_alphabet" : "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",
+ "hashes_length" : 11
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.alarabiyah.json b/Public/json/i18n/Sizerboard.i18n.alarabiyah.json
new file mode 100644
index 0000000..9d77f93
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.alarabiyah.json
@@ -0,0 +1,34 @@
+{
+ "alarabiyah" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "المدير",
+ "documentation" : "الوثائق",
+ "git" : "Git",
+ "projects_menu" : "قائمة بالمشروع",
+ "projects_menu_text" : "هذه قائمة المشروع ثم يمكنك التصفية باسم المشاريع التي تملكها، وإذا لم يكن هناك اسم، يمكنك خلقه.",
+ "search" : "البحث",
+ "add" : "مضافا إليها",
+ "draw_box" : "الإطار",
+ "draw_box_text" : "وسيتضمن هذا الإطار رسومات وأدوات وصناديق نصية للتحرير.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "النص",
+ "code" : "المدونة",
+ "actions" : "الإجراءات",
+ "actions_text" : "ويتضمن هذا الإطار الإجراءات العامة ضد مشاريعكم.",
+ "upload" : "فوق",
+ "save" : "أنقذ",
+ "download" : "تحميل",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.azerbaycanca.json b/Public/json/i18n/Sizerboard.i18n.azerbaycanca.json
new file mode 100644
index 0000000..8ca6e35
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.azerbaycanca.json
@@ -0,0 +1,34 @@
+{
+ "azerbaycanca" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : " Principal",
+ "documentation" : "Tarix",
+ "git" : "Qeydiyyat",
+ "projects_menu" : "Elanlar",
+ "projects_menu_text" : "Bu layihə meneceridir. Sonra siz öz layihələrin adı ilə filter edə bilərsiniz, və adı varsa, onu yaraya bilərsiniz.",
+ "search" : "Axtarış",
+ "add" : "Axtarış",
+ "draw_box" : "Tarix",
+ "draw_box_text" : "Bu səhifə konfiqurasiyalar, alətlər və məhsul qutusu daxil edəcək.",
+ "html" : " HTML",
+ "canvas" : "Qeydiyyat",
+ "svg" : "QALEREYA",
+ "text" : "Tarix",
+ "code" : "Qeydiyyat",
+ "actions" : "Proqramlar",
+ "actions_text" : "Bu səhifə sizin layihələrinə qarşı ümumi həyata malikdir.",
+ "upload" : "Qeydiyyat",
+ "save" : "Daxil ol",
+ "download" : "Pulsuz",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.catala.json b/Public/json/i18n/Sizerboard.i18n.catala.json
new file mode 100644
index 0000000..c681ace
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.catala.json
@@ -0,0 +1,34 @@
+{
+ "catala" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Principal",
+ "documentation" : "Documentació",
+ "git" : "Git",
+ "projects_menu" : "Menú del projecte",
+ "projects_menu_text" : "Aquest és el menú del projecte. Si no hi ha cap nom, podeu crear-lo.",
+ "search" : "Cerca",
+ "add" : "Afegir",
+ "draw_box" : "Box dibuixat",
+ "draw_box_text" : "Aquest marc conté dibuixos representatius, eines i caixa de text per a l'edició.",
+ "html" : "HTML",
+ "canvas" : "Llenç",
+ "svg" : "SVG",
+ "text" : "Text",
+ "code" : "Codi",
+ "actions" : "Accions",
+ "actions_text" : "Aquest marc conté les accions generals contra els vostres projectes.",
+ "upload" : "Amunt",
+ "save" : "Save",
+ "download" : "Descàrrega",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.cestina.json b/Public/json/i18n/Sizerboard.i18n.cestina.json
new file mode 100644
index 0000000..6d5f46c
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.cestina.json
@@ -0,0 +1,34 @@
+{
+ "cestina" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Čeština",
+ "documentation" : "Odkazy",
+ "git" : "Čeština",
+ "projects_menu" : "Nabídka projektu",
+ "projects_menu_text" : "Jedná se o nabídku projektu. Poté můžete filtrovat podle názvu projektů, které vlastníte, a pokud není jméno, můžete jej vytvořit.",
+ "search" : "Hledat",
+ "add" : "Čeština",
+ "draw_box" : "Box nakreslený",
+ "draw_box_text" : "Tento rámec bude obsahovat reprezentativní výkresy, nástroje a textové pole pro úpravy.",
+ "html" : "ČEŠTINA",
+ "canvas" : "Čeština",
+ "svg" : "ČEŠTINA",
+ "text" : "Čeština",
+ "code" : "Kód",
+ "actions" : "Akce",
+ "actions_text" : "Tento rámec obsahuje obecné akce proti svým projektům.",
+ "upload" : "Nahoru",
+ "save" : "Čeština",
+ "download" : "Čeština",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.dansk.json b/Public/json/i18n/Sizerboard.i18n.dansk.json
new file mode 100644
index 0000000..6379914
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.dansk.json
@@ -0,0 +1,34 @@
+{
+ "dansk" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "I NÆRHEDEN AF Sizerboard",
+ "home" : "Fyrste",
+ "documentation" : "Dokumentation",
+ "git" : "Git",
+ "projects_menu" : "Projektmenu",
+ "projects_menu_text" : "Dette er projektmenuen. Så kan du filtrere ved at nævne de projekter, du ejer, og hvis der ikke er noget navn, kan du oprette det.",
+ "search" : "Søg Søg Søg",
+ "add" : "Tilføj Tilføj Tilføj Tilføj",
+ "draw_box" : "Box tegnet",
+ "draw_box_text" : "Denne ramme indeholder repræsentative tegninger, værktøjer og tekstboks til redigering.",
+ "html" : "HTML",
+ "canvas" : "Fotolærred",
+ "svg" : "SVG",
+ "text" : "Tekst tekst",
+ "code" : "Kodekode",
+ "actions" : "Handlinger",
+ "actions_text" : "Denne ramme indeholder de generelle handlinger mod dine projekter.",
+ "upload" : "Up Up Up Up",
+ "save" : "Gem Gem Gem Gem Gem Gem",
+ "download" : "Download Download Download Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.deutsch.json b/Public/json/i18n/Sizerboard.i18n.deutsch.json
new file mode 100644
index 0000000..dcab14c
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.deutsch.json
@@ -0,0 +1,34 @@
+{
+ "deutsch" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Auftraggeber",
+ "documentation" : "Dokumentation",
+ "git" : "Gier",
+ "projects_menu" : "Projektmenü",
+ "projects_menu_text" : "Das ist das Projektmenü. Dann können Sie mit Namen die Projekte filtern, die Sie besitzen, und wenn es keinen Namen gibt, können Sie es erstellen.",
+ "search" : "Suche",
+ "add" : "Hinzufügen",
+ "draw_box" : "Feld gezogen",
+ "draw_box_text" : "Dieser Rahmen enthält repräsentative Zeichnungen, Werkzeuge und Textbox zur Bearbeitung.",
+ "html" : "HTML",
+ "canvas" : "~",
+ "svg" : "SVG",
+ "text" : "Text",
+ "code" : "Code",
+ "actions" : "Maßnahmen",
+ "actions_text" : "Dieser Rahmen enthält die allgemeinen Aktionen gegen Ihre Projekte.",
+ "upload" : "Nach oben",
+ "save" : "Speichern",
+ "download" : "Downloads",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.ellinika.json b/Public/json/i18n/Sizerboard.i18n.ellinika.json
new file mode 100644
index 0000000..9e04205
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.ellinika.json
@@ -0,0 +1,52 @@
+{
+ "ellinika" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Πριγκιπ Πριγκιερ",
+ "documentation" : "Τεκμηρίωση",
+ "git" : "Git Git",
+ "projects_menu" : "Πρόγραμμα μενού μενού",
+ "projects_menu_text" : [
+ "Αυτό είναι το μενού του έργου. Στη συνέχεια μπορείτε να ",
+ "φιλτράρετε με το όνομα τα έργα που διαθέτετε και αν δεν υπάρχει ",
+ "όνομα, μπορείτε να το δημιουργήσετε."
+ ],
+ "search" : "Αναζήτηση Αναζήτηση Αναζήτηση",
+ "add" : "Προσθήκη Προσθήκη",
+ "draw_box" : "Box",
+ "draw_box_text" : "Αυτό το πλαίσιο θα περιέχει αντιπροσωπευτικά σχέδια, εργαλεία και πλαίσιο κειμένου για επεξεργασία.",
+ "html" : "HTML HTML HTML HTML",
+ "canvas" : "Canvas",
+ "svg" : "MODE",
+ "text" : "Κείμενο κείμενο κείμενο κείμενο κείμενο κείμενο κείμενο κείμενο κείμενο κείμενο",
+ "code" : "Κώδικα κώδικα",
+ "actions" : "Δράση",
+ "actions_text" : "Το πλαίσιο αυτό περιέχει τις γενικές δράσεις κατά των έργων σας.",
+ "upload" : [
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up ",
+ "Up Up Up Up"
+ ],
+ "save" : "Εξοικονομήστε",
+ "download" : "Download Download Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.english.json b/Public/json/i18n/Sizerboard.i18n.english.json
new file mode 100644
index 0000000..261ee17
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.english.json
@@ -0,0 +1,34 @@
+{
+ "english" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Principal",
+ "documentation" : "Documentation",
+ "git" : "Git",
+ "projects_menu" : "Project menu",
+ "projects_menu_text" : "This is the project menu. Then you can filter by name the projects you own, and if there is no name, you can create it.",
+ "search" : "Search",
+ "add" : "Add",
+ "draw_box" : "Box drawn",
+ "draw_box_text" : "This framework will contain representative drawings, tools and text box for editing.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Text",
+ "code" : "Code",
+ "actions" : "Actions",
+ "actions_text" : "This framework contains the general actions against your projects.",
+ "upload" : "Up",
+ "save" : "Save",
+ "download" : "Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.espanol.json b/Public/json/i18n/Sizerboard.i18n.espanol.json
new file mode 100644
index 0000000..7b4a317
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.espanol.json
@@ -0,0 +1,37 @@
+{
+ "espanol" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Principal",
+ "documentation" : "Documentación",
+ "git" : "Git",
+ "projects_menu" : "Menú de proyectos",
+ "projects_menu_text" : [
+ "Este es el menú de proyectos. A continuación podrás filtrar por nombre los proyectos que ",
+ "posees, y en caso de no existir el nombre, lo podrás crear."
+ ],
+ "search" : "Buscar",
+ "add" : "Añadir",
+ "draw_box" : "Caja de dibujado",
+ "draw_box_text" : "Este marco contendrá los dibujos representativos, sus herramientas y el cuadro de texto para edición.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Texto",
+ "code" : "Código",
+ "actions" : "Acciones",
+ "actions_text" : "Este marco contiene las acciones generales contra tus proyectos.",
+ "upload" : "Subir",
+ "save" : "Guardar",
+ "download" : "Descargar",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.esperanto.json b/Public/json/i18n/Sizerboard.i18n.esperanto.json
new file mode 100644
index 0000000..4ed6dbe
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.esperanto.json
@@ -0,0 +1,34 @@
+{
+ "esperanto" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Ĉefa rektoro",
+ "documentation" : "Dokumentado",
+ "git" : "Git",
+ "projects_menu" : "Projekto menuo",
+ "projects_menu_text" : "Tio estas la projekto menuo. Tiam vi povas filtri laŭ la projektoj, kiujn vi posedas, kaj se ne ekzistas nomo, vi povas krei ĝin.",
+ "search" : "Serĉo",
+ "add" : "Aldonu",
+ "draw_box" : "La skatolo",
+ "draw_box_text" : "Tiu kadro enhavos reprezentajn desegnaĵojn, ilojn kaj tekstkeston por redaktado.",
+ "html" : "HTML HTML HTML HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Teksto teksto",
+ "code" : "Kodo",
+ "actions" : "Agoj",
+ "actions_text" : "Ĉi tiu kadro enhavas la ĝeneralajn agojn kontraŭ viaj projektoj.",
+ "upload" : "Supren ĝis",
+ "save" : "Savi",
+ "download" : "Elŝutu",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.farsi.json b/Public/json/i18n/Sizerboard.i18n.farsi.json
new file mode 100644
index 0000000..0f92858
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.farsi.json
@@ -0,0 +1,34 @@
+{
+ "farsi" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "مدیر ارشد",
+ "documentation" : "مستندات",
+ "git" : "Git",
+ "projects_menu" : "Project menu",
+ "projects_menu_text" : "این منو پروژه است. سپس می توانید با نام پروژه هایی که مالک آن هستید فیلتر کنید و اگر نامی وجود نداشته باشد، می توانید آن را ایجاد کنید.",
+ "search" : "جستجو جستجو",
+ "add" : "Add Add",
+ "draw_box" : "جعبه",
+ "draw_box_text" : "این چارچوب شامل نقشه های نمایندگی، ابزار و جعبه متن برای ویرایش خواهد بود.",
+ "html" : "HTML HTML",
+ "canvas" : "بوم بوم",
+ "svg" : "SVG SVG",
+ "text" : "متن متن متن متن",
+ "code" : "کد",
+ "actions" : "اقدامات",
+ "actions_text" : "این چارچوب شامل اقدامات عمومی علیه پروژه های شما است.",
+ "upload" : "Up Up Up",
+ "save" : "Save Save",
+ "download" : "Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.francais.json b/Public/json/i18n/Sizerboard.i18n.francais.json
new file mode 100644
index 0000000..cdce96f
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.francais.json
@@ -0,0 +1,34 @@
+{
+ "francais" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Principal",
+ "documentation" : "Documentation",
+ "git" : "Git",
+ "projects_menu" : "Menu du projet",
+ "projects_menu_text" : "C'est le menu du projet. Ensuite, vous pouvez filtrer par nom les projets que vous possédez, et s'il n'y a pas de nom, vous pouvez le créer.",
+ "search" : "Recherche",
+ "add" : "Add",
+ "draw_box" : "Encadré",
+ "draw_box_text" : "Ce cadre comprendra des dessins représentatifs, des outils et une boîte de texte pour l'édition.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Texte",
+ "code" : "Code",
+ "actions" : "Mesures à prendre",
+ "actions_text" : "Ce cadre contient les actions générales contre vos projets.",
+ "upload" : "Debout",
+ "save" : "Save",
+ "download" : "Télécharger",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.gaeilge.json b/Public/json/i18n/Sizerboard.i18n.gaeilge.json
new file mode 100644
index 0000000..3ecd1bd
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.gaeilge.json
@@ -0,0 +1,38 @@
+{
+ "gaeilge" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "SEIRBHÍS DO CHUSTAIMÉIRÍ",
+ "home" : "Príomhoide",
+ "documentation" : "Cáipéisí",
+ "git" : "Bláthanna cumhra: cumhráin",
+ "projects_menu" : "Roghchlár Tionscadail",
+ "projects_menu_text" : [
+ "Is é seo an roghchlár tionscadail. Ansin, is féidir leat na ",
+ "tionscadail a bhfuil tú féin a scagadh de réir ainm, agus mura ",
+ "bhfuil aon ainm ann, is féidir leat é a chruthú."
+ ],
+ "search" : "Cuardaigh Cuardaigh Cuardaigh",
+ "add" : "Déan teagmháil linn",
+ "draw_box" : "Bosca tarraingt",
+ "draw_box_text" : "Beidh líníochtaí ionadaíocha, uirlisí agus bosca téacs le haghaidh eagarthóireachta sa chreat seo.",
+ "html" : "HTML",
+ "canvas" : "Canbhás",
+ "svg" : "SVG",
+ "text" : "Téacs téacs",
+ "code" : "Cód an Chóid",
+ "actions" : "Gníomhaíochtaí",
+ "actions_text" : "Tá na gníomhaíochtaí ginearálta i gcoinne do thionscadail sa chreat seo.",
+ "upload" : "Suas",
+ "save" : "Sábháil Sábháil",
+ "download" : "Íoslódáil",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.hangugeo.json b/Public/json/i18n/Sizerboard.i18n.hangugeo.json
new file mode 100644
index 0000000..5371742
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.hangugeo.json
@@ -0,0 +1,34 @@
+{
+ "hangugeo" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard의 특징",
+ "home" : "주 메뉴",
+ "documentation" : "회사연혁",
+ "git" : "사이트맵",
+ "projects_menu" : "프로젝트 메뉴",
+ "projects_menu_text" : "프로젝트 메뉴입니다. 그런 다음 당신은 자신의 프로젝트 이름을 입력 할 수 있습니다, 그리고 이름이없는 경우, 당신은 그것을 만들 수 있습니다.",
+ "search" : "제품정보",
+ "add" : "기타",
+ "draw_box" : "회사 소개",
+ "draw_box_text" : "이 프레임 워크는 편집을위한 대표 도면, 도구 및 텍스트 상자를 포함합니다.",
+ "html" : "HTML 지원",
+ "canvas" : "인기 카테고리",
+ "svg" : "사이트맵",
+ "text" : "이름 *",
+ "code" : "* 이름",
+ "actions" : "기타",
+ "actions_text" : "이 프레임 워크는 프로젝트에 대한 일반적인 조치를 포함합니다.",
+ "upload" : "지원하다",
+ "save" : "제품 정보",
+ "download" : "다운로드",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.hindi.json b/Public/json/i18n/Sizerboard.i18n.hindi.json
new file mode 100644
index 0000000..797a493
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.hindi.json
@@ -0,0 +1,34 @@
+{
+ "hindi" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "प्रधान",
+ "documentation" : "प्रलेखन",
+ "git" : "गिट",
+ "projects_menu" : "परियोजना मेनू",
+ "projects_menu_text" : "यह परियोजना मेनू है। फिर आप अपनी परियोजनाओं को नाम से फ़िल्टर कर सकते हैं और यदि कोई नाम नहीं है तो आप इसे बना सकते हैं।.",
+ "search" : "खोज",
+ "add" : "जोड़ें",
+ "draw_box" : "बॉक्स खींचा",
+ "draw_box_text" : "इस ढांचे में संपादन के लिए प्रतिनिधि चित्र, उपकरण और टेक्स्ट बॉक्स शामिल होंगे।.",
+ "html" : "एचटीएमएल",
+ "canvas" : "कैनवास",
+ "svg" : "SVG",
+ "text" : "पाठ",
+ "code" : "कोड",
+ "actions" : "कार्य",
+ "actions_text" : "इस ढांचे में आपकी परियोजनाओं के खिलाफ सामान्य कार्य शामिल हैं।.",
+ "upload" : "ऊपर",
+ "save" : "सहेजें",
+ "download" : "डाउनलोड",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.indonesia.json b/Public/json/i18n/Sizerboard.i18n.indonesia.json
new file mode 100644
index 0000000..1d4bda1
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.indonesia.json
@@ -0,0 +1,34 @@
+{
+ "indonesia" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "LOGIN",
+ "home" : "Login",
+ "documentation" : "Sitemap",
+ "git" : "Login",
+ "projects_menu" : "Menu Proyek",
+ "projects_menu_text" : "Ini adalah menu proyek. Kemudian Anda dapat menyaring dengan nama proyek yang Anda miliki, dan jika tidak ada nama, Anda dapat membuatnya.",
+ "search" : "Sitemap",
+ "add" : "Login",
+ "draw_box" : "Kotak ditarik",
+ "draw_box_text" : "Kerangka ini akan berisi gambar perwakilan, alat dan kotak teks untuk mengedit.",
+ "html" : "LOGIN",
+ "canvas" : "Login",
+ "svg" : "LOGIN",
+ "text" : "Login",
+ "code" : "Login",
+ "actions" : "Sitemap",
+ "actions_text" : "Kerangka ini berisi tindakan umum terhadap proyek Anda.",
+ "upload" : "Sitemap",
+ "save" : "Sitemap",
+ "download" : "Login",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.italiano.json b/Public/json/i18n/Sizerboard.i18n.italiano.json
new file mode 100644
index 0000000..8558e9d
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.italiano.json
@@ -0,0 +1,34 @@
+{
+ "italiano" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Principale",
+ "documentation" : "Documentazione",
+ "git" : "Gi",
+ "projects_menu" : "Menu di progetto",
+ "projects_menu_text" : "Questo è il menu del progetto. Quindi è possibile filtrare per nome i progetti che si possiede, e se non c'è un nome, è possibile crearlo.",
+ "search" : "Ricerca",
+ "add" : "Aggiungi",
+ "draw_box" : "Designazione delle merci",
+ "draw_box_text" : "Questo quadro conterrà disegni rappresentativi, strumenti e casella di testo per la modifica.",
+ "html" : "HTML",
+ "canvas" : "Telaio",
+ "svg" : "SVG",
+ "text" : "Testo",
+ "code" : "Codice",
+ "actions" : "Azioni",
+ "actions_text" : "Questo quadro contiene le azioni generali contro i vostri progetti.",
+ "upload" : "Su",
+ "save" : "Salva",
+ "download" : "Scarica",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.ivrit.json b/Public/json/i18n/Sizerboard.i18n.ivrit.json
new file mode 100644
index 0000000..5442704
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.ivrit.json
@@ -0,0 +1,34 @@
+{
+ "ivrit" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "ראשי",
+ "documentation" : "מסמך",
+ "git" : "Git",
+ "projects_menu" : "תפריט Project",
+ "projects_menu_text" : "זהו תפריט הפרויקט. לאחר מכן תוכל לסנן בשם הפרויקטים שבבעלותך, ואם אין שם, תוכל ליצור את זה.",
+ "search" : "חיפוש חיפוש",
+ "add" : "הוסף",
+ "draw_box" : "Box",
+ "draw_box_text" : "מסגרת זו תכיל רישומים מייצגים, כלים ותיבת טקסט לעריכה.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "טקסט",
+ "code" : "קודקוד",
+ "actions" : "פעולות",
+ "actions_text" : "מסגרת זו כוללת את הפעולות הכלליות נגד הפרויקטים שלך.",
+ "upload" : "למעלה",
+ "save" : "להציל",
+ "download" : "הורד Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.magyar.json b/Public/json/i18n/Sizerboard.i18n.magyar.json
new file mode 100644
index 0000000..adf3405
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.magyar.json
@@ -0,0 +1,34 @@
+{
+ "magyar" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Elnök",
+ "documentation" : "Dokumentáció",
+ "git" : "Ajándék",
+ "projects_menu" : "Project menü",
+ "projects_menu_text" : "Ez a projekt menü. Ezután szűrheti a saját projekteket, és ha nincs neve, létrehozhatja.",
+ "search" : "Keresés",
+ "add" : "Hozzáadás",
+ "draw_box" : "Box rajz",
+ "draw_box_text" : "Ez a keret reprezentatív rajzokat, eszközöket és szövegdobozokat tartalmaz a szerkesztéshez.",
+ "html" : "HTML",
+ "canvas" : "Vászon",
+ "svg" : "SVG",
+ "text" : "Szöveg",
+ "code" : "Kód",
+ "actions" : "Akciók",
+ "actions_text" : "Ez a keret tartalmazza az általános intézkedéseket a projektek ellen.",
+ "upload" : "Felül",
+ "save" : "Mentés",
+ "download" : "Letöltés",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.nederlands.json b/Public/json/i18n/Sizerboard.i18n.nederlands.json
new file mode 100644
index 0000000..01f719c
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.nederlands.json
@@ -0,0 +1,34 @@
+{
+ "nederlands" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Directeur",
+ "documentation" : "Document",
+ "git" : "Git",
+ "projects_menu" : "Project Menu",
+ "projects_menu_text" : "Dit is het project menu. Dan filter je met naam de projecten die je bezit, en als er geen naam is, kun je het creëren.",
+ "search" : "Zoek",
+ "add" : "Advocaat",
+ "draw_box" : "Box getekend",
+ "draw_box_text" : "Dit framewerk bevat representatieve tekeningen, gereedschap en tekstbus voor editing.",
+ "html" : "HTM",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Text",
+ "code" : "Code",
+ "actions" : "Actie",
+ "actions_text" : "Dit framewerk bevat de algemene acties tegen je projecten.",
+ "upload" : "Omhoog",
+ "save" : "Red",
+ "download" : "Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.nihongo.json b/Public/json/i18n/Sizerboard.i18n.nihongo.json
new file mode 100644
index 0000000..b4ac211
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.nihongo.json
@@ -0,0 +1,34 @@
+{
+ "nihongo" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboardの特長",
+ "home" : "代表取締役",
+ "documentation" : "ドキュメント",
+ "git" : "ログイン",
+ "projects_menu" : "プロジェクトメニュー",
+ "projects_menu_text" : "プロジェクトメニューです。 そこで、自分のプロジェクト名を絞り、名前がない場合、作成できます。.",
+ "search" : "アクセス",
+ "add" : "追加する",
+ "draw_box" : "ボックス描画",
+ "draw_box_text" : "このフレームワークには、編集用の代表的な図面、ツール、テキストボックスが含まれます。.",
+ "html" : "アーカイブ",
+ "canvas" : "キャンバス",
+ "svg" : "SVGの特長",
+ "text" : "テキスト",
+ "code" : "コードコード",
+ "actions" : "アクション",
+ "actions_text" : "このフレームワークには、プロジェクトに対する一般的なアクションが含まれています。.",
+ "upload" : "ニュース",
+ "save" : "保存する",
+ "download" : "ダウンロード",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.polski.json b/Public/json/i18n/Sizerboard.i18n.polski.json
new file mode 100644
index 0000000..d5714aa
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.polski.json
@@ -0,0 +1,34 @@
+{
+ "polski" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "MKWBZK",
+ "home" : "Wydawca",
+ "documentation" : "Dokumentacja",
+ "git" : "Git",
+ "projects_menu" : "Project menu",
+ "projects_menu_text" : "Jest to projekt menu. Wtedy możesz filtrować, nazywać je własnymi projektami i jeśli nie ma imienia, to możesz ją stworzyć.",
+ "search" : "Search Search",
+ "add" : "Addd",
+ "draw_box" : "Box",
+ "draw_box_text" : "Takie ramy zawierają rysunki reprezentacyjne, narzędzia i skrzynie tekstowe do edycji.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Tekst",
+ "code" : "Kodeks",
+ "actions" : "Akcja",
+ "actions_text" : "Zasady te obejmują działania przeciwko projektom.",
+ "upload" : "Up",
+ "save" : "Save",
+ "download" : "Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.portugues.json b/Public/json/i18n/Sizerboard.i18n.portugues.json
new file mode 100644
index 0000000..84190a7
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.portugues.json
@@ -0,0 +1,34 @@
+{
+ "portugues" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Director",
+ "documentation" : "Documentação",
+ "git" : "Git",
+ "projects_menu" : "Menu de projeto",
+ "projects_menu_text" : "Este é o menu do projeto. Então você pode filtrar por nome os projetos que você possui, e se não houver nenhum nome, você pode criá-lo.",
+ "search" : "Pesquisar",
+ "add" : "Adicionar",
+ "draw_box" : "Caixa retirada",
+ "draw_box_text" : "Esta estrutura conterá desenhos representativos, ferramentas e caixa de texto para edição.",
+ "html" : "HTML",
+ "canvas" : "Lona",
+ "svg" : "SVG",
+ "text" : "Texto",
+ "code" : "Código",
+ "actions" : "Acções",
+ "actions_text" : "Esta estrutura contém as ações gerais contra seus projetos.",
+ "upload" : "Para cima",
+ "save" : "Salvar",
+ "download" : "Baixar",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.russkiy.json b/Public/json/i18n/Sizerboard.i18n.russkiy.json
new file mode 100644
index 0000000..2711f36
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.russkiy.json
@@ -0,0 +1,34 @@
+{
+ "russkiy" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Principal",
+ "documentation" : "Документация",
+ "git" : "Git",
+ "projects_menu" : "Меню проекта",
+ "projects_menu_text" : "Это меню проекта. Затем вы можете отфильтровать по названию проекты, которые у вас есть, и если нет имени, вы можете его создать.",
+ "search" : "Поиск",
+ "add" : "Добавить",
+ "draw_box" : "Вставка",
+ "draw_box_text" : "Эти рамки будут содержать репрезентативные чертежи, инструменты и текстовые ящики для редактирования.",
+ "html" : "HTML",
+ "canvas" : "Холст",
+ "svg" : "SVG",
+ "text" : "Текст",
+ "code" : "Код",
+ "actions" : "Действия",
+ "actions_text" : "Эта основа содержит общие действия против ваших проектов.",
+ "upload" : "Вверх",
+ "save" : "Сохранить",
+ "download" : "Скачать",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.slovencina.json b/Public/json/i18n/Sizerboard.i18n.slovencina.json
new file mode 100644
index 0000000..1671c5e
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.slovencina.json
@@ -0,0 +1,34 @@
+{
+ "slovencina" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Všeobecný",
+ "documentation" : "Aktuality",
+ "git" : "Všeobecný",
+ "projects_menu" : "Ponuka projektu",
+ "projects_menu_text" : "Toto je ponuka projektu. Potom môžete filtrovať podľa názvu projektov, ktoré vlastníte, a ak neexistuje názov, môžete ho vytvoriť.",
+ "search" : "Vyhľadávanie",
+ "add" : "Pridať",
+ "draw_box" : "Box nakreslený",
+ "draw_box_text" : "Tento rámec bude obsahovať reprezentatívne výkresy, nástroje a text box pre editáciu.",
+ "html" : "AKTUALITY",
+ "canvas" : "Canvas",
+ "svg" : "SVOJE",
+ "text" : "Aktuality",
+ "code" : "Kód",
+ "actions" : "Akcie",
+ "actions_text" : "Tento rámec obsahuje všeobecné akcie proti vašim projektom.",
+ "upload" : "Hore",
+ "save" : "Uložiť",
+ "download" : "Na stiahnutie",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.suomi.json b/Public/json/i18n/Sizerboard.i18n.suomi.json
new file mode 100644
index 0000000..04a9f0b
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.suomi.json
@@ -0,0 +1,34 @@
+{
+ "suomi" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Pääasiallinen",
+ "documentation" : "Dokumentointi",
+ "git" : "Git",
+ "projects_menu" : "Hankkeen menu",
+ "projects_menu_text" : "Tämä on projektin menu. Sitten voit suodattaa omistamiasi projekteja nimeltä ja jos nimeä ei ole, voit luoda sen.",
+ "search" : "Etsintä",
+ "add" : "Lisää",
+ "draw_box" : "Box piirretty",
+ "draw_box_text" : "Tämä kehys sisältää edustavia piirustuksia, työkaluja ja tekstiruudun editointiin.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Teksti",
+ "code" : "Code",
+ "actions" : "Toimia",
+ "actions_text" : "Tämä kehys sisältää yleiset toimet projektejasi vastaan.",
+ "upload" : "Up",
+ "save" : "Säästäminen",
+ "download" : "Download Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.svenska.json b/Public/json/i18n/Sizerboard.i18n.svenska.json
new file mode 100644
index 0000000..db694f6
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.svenska.json
@@ -0,0 +1,34 @@
+{
+ "svenska" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "Principal",
+ "documentation" : "Dokumentation",
+ "git" : "Git",
+ "projects_menu" : "Projektmeny",
+ "projects_menu_text" : "Detta är projektmenyn. Då kan du filtrera efter namn på de projekt du äger, och om det inte finns något namn kan du skapa det.",
+ "search" : "Sök efter Sök",
+ "add" : "Lägg till",
+ "draw_box" : "Box dras",
+ "draw_box_text" : "Denna ram kommer att innehålla representativa ritningar, verktyg och textruta för redigering.",
+ "html" : "HTML",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "Texttext",
+ "code" : "Kodkod",
+ "actions" : "Åtgärder",
+ "actions_text" : "Detta ramverk innehåller de allmänna åtgärderna mot dina projekt.",
+ "upload" : "Upp",
+ "save" : "Spara",
+ "download" : "Ladda ner",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.thai.json b/Public/json/i18n/Sizerboard.i18n.thai.json
new file mode 100644
index 0000000..5114b0a
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.thai.json
@@ -0,0 +1,34 @@
+{
+ "thai" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "ข้อมูล",
+ "documentation" : "เอกสาร",
+ "git" : "Git",
+ "projects_menu" : "เมนู",
+ "projects_menu_text" : "นี่คือเมนูโครงการ จากนั้นคุณสามารถกรองโดยชื่อโครงการที่คุณเป็นเจ้าของและถ้าไม่มีชื่อคุณสามารถสร้าง.",
+ "search" : "ค้นหา",
+ "add" : "เพิ่ม",
+ "draw_box" : "กล่องวาด",
+ "draw_box_text" : "กรอบนี้มีภาพวาดเครื่องมือและเครื่องมือข้อความสําหรับการแก้ไข.",
+ "html" : "HTML",
+ "canvas" : "ผ้าใบ",
+ "svg" : "SVG",
+ "text" : "ข้อความ",
+ "code" : "รหัส",
+ "actions" : "การกระทํา",
+ "actions_text" : "กรอบนี้มีการกระทําทั่วไปกับโครงการของคุณ.",
+ "upload" : "ขึ้น",
+ "save" : "บันทึก",
+ "download" : "ดาวน์โหลด",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.turkce.json b/Public/json/i18n/Sizerboard.i18n.turkce.json
new file mode 100644
index 0000000..f7c2f86
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.turkce.json
@@ -0,0 +1,51 @@
+{
+ "turkce" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "MVBCKYR",
+ "home" : "Müdür",
+ "documentation" : "Dokümantasyon",
+ "git" : "Git Git Git Git",
+ "projects_menu" : "Project menu",
+ "projects_menu_text" : "Bu proje menüsüdür. Sonra kendi olduğunuz projelerle filtreleyebilirsiniz ve isim yoksa onu yaratabilirsiniz.",
+ "search" : "Arama Arama",
+ "add" : [
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add ",
+ "Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add"
+ ],
+ "draw_box" : "Kutu",
+ "draw_box_text" : "Bu çerçeve, düzenleme için temsilci çizimleri, araçları ve metin kutusu içerecektir.",
+ "html" : "HTML HTML HTML HTML",
+ "canvas" : "Blood",
+ "svg" : "SVG",
+ "text" : "Text Text Text Text",
+ "code" : "Kod Kodu",
+ "actions" : "Eylemler",
+ "actions_text" : "Bu çerçeve, projelerinize karşı genel eylemleri içerir.",
+ "upload" : "Up Up Up Up",
+ "save" : "Kaydet Kaydet Kaydet",
+ "download" : "Download Download Download Download Download",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.ukrainska.json b/Public/json/i18n/Sizerboard.i18n.ukrainska.json
new file mode 100644
index 0000000..a65e55f
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.ukrainska.json
@@ -0,0 +1,34 @@
+{
+ "ukrainska" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "МКВБКГКСБ",
+ "home" : "Головна",
+ "documentation" : "Документація",
+ "git" : "Навігація",
+ "projects_menu" : "Меню проекту",
+ "projects_menu_text" : "Це меню проекту. Тоді ви можете відфільтрувати свої проекти, і якщо немає назви, ви можете створити його.",
+ "search" : "Пошук",
+ "add" : "Додати",
+ "draw_box" : "Коробка намальована",
+ "draw_box_text" : "Цей каркас буде містити представницькі креслення, інструменти та текстове поле для редагування.",
+ "html" : "УКРАЇНСЬКА",
+ "canvas" : "Полотно",
+ "svg" : "СВГ",
+ "text" : "Головна",
+ "code" : "Коди",
+ "actions" : "Акції",
+ "actions_text" : "У цьому розділі зібрані загальні дії щодо ваших проектів.",
+ "upload" : "Вгору",
+ "save" : "Зберегти",
+ "download" : "Завантажити",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/json/i18n/Sizerboard.i18n.zhongwen.json b/Public/json/i18n/Sizerboard.i18n.zhongwen.json
new file mode 100644
index 0000000..f0cbd91
--- /dev/null
+++ b/Public/json/i18n/Sizerboard.i18n.zhongwen.json
@@ -0,0 +1,34 @@
+{
+ "zhongwen" : {
+
+ "Sizerboard_common_start" : null,
+ "Sizerboard_common_end" : null,
+
+ "Sizerboard_start" : null,
+ "Sizerboard_end" : null,
+
+ "Sizerboard_base_start" : null,
+ "sizerboard" : "Sizerboard",
+ "home" : "特等",
+ "documentation" : "文件",
+ "git" : "专 员",
+ "projects_menu" : "项目菜单",
+ "projects_menu_text" : "这就是项目菜单。 然后,你可以以你自己的项目的名义进行过滤,如果没有名字,你可以创建。.",
+ "search" : "搜索",
+ "add" : "增 编",
+ "draw_box" : "方框",
+ "draw_box_text" : "这一框架将包含有代表性的图画、工具和文字箱以供编辑。.",
+ "html" : "传真",
+ "canvas" : "Canvas",
+ "svg" : "SVG",
+ "text" : "案文",
+ "code" : "法典",
+ "actions" : "行动",
+ "actions_text" : "该框架载有针对贵项目的一般行动。.",
+ "upload" : "页: 1",
+ "save" : "Save",
+ "download" : "下载",
+ "Sizerboard_base_end" : null
+
+ }
+}
\ No newline at end of file
diff --git a/Public/scss/Sizerboard.base.scss b/Public/scss/Sizerboard.base.scss
new file mode 100644
index 0000000..7c69c31
--- /dev/null
+++ b/Public/scss/Sizerboard.base.scss
@@ -0,0 +1,348 @@
+.sizerboard{
+
+ position : absolute;
+ top : 0em;
+ left : 0em;
+ width : 100%;
+ height : 100%;
+ overflow : hidden;
+
+ &,input,button,textarea{font-family : $font-family;}
+
+ [data-visible=false]{display : none;}
+
+ [data-icon]::before{
+ font-family : $font-family;
+ margin-right : .4em;
+ }
+
+ a[href]{text-decoration : none;}
+ a[href],[onmousedown],[onmouseup],[onclick]{
+ color : $color-primary;
+ cursor : pointer;
+ transition-property : color;
+ transition-duration : $transition-out;
+ &:hover,&:focus{
+ color : $color-secondary;
+ transition-duration : $transition-in;
+ }
+ }
+ [type=text],[type=password],[type=date],[type=datetime],[type=time],textarea{
+ width : 100%;
+ box-sizing : border-box;
+ }
+ button,[type=button],[type=submit],[type=reset],[rol=button],[type=text],[type=password],[type=date],[type=datetime],[type=time],textarea{
+ color : $color-primary;
+ font-size : 1em;
+ border : .1em solid $color-primary;
+ box-shadow : 0em 0em .4em inset $color-primary;
+ border-radius : $border-radius;
+ transition-property : color,border-color,box-shadow;
+ transition-duration : $transition-out;
+ &:hover,&:focus{
+ color : $color-secondary;
+ border-color : $color-secondary;
+ box-shadow : 0em 0em .4em inset $color-secondary;
+ transition-duration : $transition-in;
+ }
+ }
+ button,[type=button],[type=submit],[type=reset],[rol=button]{cursor : pointer;}
+ a[href],[onmousedown],[onmouseup],[onclick]{
+ outline : none;
+ &[disabled],&[readonly],&[data-selected=true]{&,&:hover{
+ color : $color-grey;
+ cursor : default;
+ }}
+ }
+ button,[type=button],[type=submit],[type=reset],[rol=button],[type=text],[type=password],[type=date],[type=datetime],[type=time],textarea{
+ outline : none;
+ box-sizing : border-box;
+ &[disabled],&[readonly],&[data-selected=true]{&,&:hover,&:focus{
+ color : $color-grey;
+ border-color : $color-grey;
+ cursor : default;
+ box-shadow : 0em 0em .4em inset $color-grey;
+ }}
+ }
+
+ label{
+ padding : 0em .4em;
+ font-weight : 900;
+ white-space : nowrap;
+ border : .1em solid $color-grey;
+ border-radius : $border-radius;
+ box-shadow : 0em 0em .4em inset $color-grey;
+ &>*{font-size : .9em;}
+ &::after{content : ":";}
+ }
+
+ .group{
+ display : table;
+ margin : 0em;
+ padding : 0em;
+ list-style-type : none;
+ border-collapse : collapse;
+ li{
+ display : table-cell;
+ &>*{
+ border-radius : 0em;
+ padding : .1em .4em;
+ padding-block : none;
+ padding-inline : none;
+ }
+ }
+ &>:first-child>*{border-radius : $border-radius 0em 0em $border-radius;}
+ &>:last-child>*{border-radius : 0em $border-radius $border-radius 0em;}
+ }
+
+ header,main,footer{
+ position : absolute;
+ left : 0em;
+ width : 100%;
+ }
+ header,footer{
+ background-color : $color-fore;
+ color : $color-back;
+ }
+
+ header{
+ top : 0em;
+ height : $header-height;
+ z-index : 20;
+ }
+
+ main{
+ top : $header-height;
+ bottom : $footer-height;
+ background-color : $color-back;
+ color : $color-fore;
+ z-index : 10;
+ overflow : hidden;
+ &>form{
+ display : block;
+ position : absolute;
+ top : 0em;
+ height : 100%;
+ overflow : hidden;
+ &>fieldset{
+ position : absolute;
+ top : 0em;
+ left : 0em;
+ right : 0em;
+ bottom : 0em;
+ margin : $box-margin;
+ padding : 0em;
+ border : none;
+ &>legend{
+ display : block;
+ width : 100%;
+ font-size : 1.2em;
+ font-weight : 900;
+ border-bottom : .15em solid $color-fore;
+ }
+ &>p{
+ margin : 0em;
+ padding : 1em 0em;
+ font-size : .85em;
+ }
+ }
+ }
+ }
+
+ footer{
+ bottom : 0em;
+ height : $footer-height;
+ z-index : 30;
+ }
+
+ .main-menu{
+ position : absolute;
+ bottom : 0em;
+ left : 50%;
+ margin-bottom : .2em;
+ margin-left : -20em;
+ width : 40em;
+ text-align : center;
+ ul{
+ margin : 0em;
+ padding : 0em;
+ list-style-type : none;
+ }
+ li{
+ display : inline-block;
+ margin : 0em 1em;
+ }
+ }
+
+ h1{
+ margin : 0em;
+ }
+
+ .projects-menu{
+ left : 0em;
+ width : $projects-menu-width;
+ }
+
+ .search-box{
+ position : absolute;
+ top : 7.6em;
+ width : 100%;
+ &>:first-child>*{border-bottom-left-radius : 0em;}
+ &>:last-child>*{border-bottom-right-radius : 0em;}
+ &>:nth-child(2){width : 100%;}
+ label{
+ font-weight : 400;
+ &::after{content : "";}
+ }
+ [data-icon]{
+ &::before{margin : 0em;}
+ &+[data-i18n]{display : none;}
+ }
+ button[data-i18n=search]{display : none;}
+ &+nav{
+ position : absolute;
+ top : 9em;
+ left : 0em;
+ bottom : 0em;
+ width : 100%;
+ border : .1em solid $color-fore;
+ background-color : $color-back;
+ overflow : auto;
+ box-sizing : border-box;
+ border-radius : 0em 0em $border-radius $border-radius;
+ box-shadow : .1em .1em .2em $color-grey;
+ &>ul{
+ margin : 0em;
+ padding : 0em;
+ list-style-type : none;
+ // &>:last-child{border-radius : 0em 0em $border-radius $border-radius;}
+ }
+ li{
+ padding : .2em .4em;
+ border-radius : 0em;
+ box-sizing : border-box;
+ }
+ }
+ }
+
+ .draw-box{
+ left : $projects-menu-width;
+ right : 0em;
+ .group{
+ position : absolute;
+ top : 2.6em;
+ left : 0em;
+ &>:first-child>button{border-bottom-left-radius : 0em;}
+ &>:last-child>button{border-bottom-right-radius : 0em;}
+ }
+ .fields{
+ position : absolute;
+ top : 4em;
+ left : 0em;
+ bottom : 0em;
+ width : 100%;
+ border : .1em solid $color-fore;
+ background-color : $color-back;
+ box-sizing : border-box;
+ border-radius : 0em $border-radius $border-radius $border-radius;
+ box-shadow : .1em .1em .2em $color-fore;
+ &>section{&,&>*{
+ position : absolute;
+ top : 0em;
+ left : 0em;
+ width : 100%;
+ height : 100%;
+ }}
+ &>section>*{border-radius : 0em $border-radius $border-radius $border-radius;}
+ textarea{
+ font-family : $font-mono;
+ color : $color-fore;
+ resize : none;
+ }
+ }
+ .curtain{
+ position : absolute;
+ top : 0em;
+ left : 0em;
+ width : 100%;
+ height : 100%;
+ background-color : $color-back;
+ opacity : .8;
+ }
+ &:not([data-selected=null])>.curtain{display : none;}
+ }
+
+ .actions-box{
+ position : absolute;
+ right : 0em;
+ bottom : 0em;
+ border : none;
+ &>legend,&>p{display : none;}
+ ul{
+ position : absolute;
+ right : 0em;
+ bottom : 0em;
+ margin : .5em;
+ padding : 0em;
+ list-style-type : none;
+ overflow : visible;
+ &>li{
+ display : "block";
+ position : relative;
+ text-align : right;
+ }
+ }
+ li{margin : .2em 0em;}
+ button{
+ min-width : 2em;
+ height : 2em;
+ text-align : right;
+ white-space : nowrap;
+ box-sizing : border-box;
+ border-radius : 1em;
+ span{
+ font-size : 1.3em;
+ font-weight : 900;
+ }
+ [data-icon]{
+ display : inline-block;
+ position : absolute;
+ top : 0em;
+ right : 0em;
+ width : 1.5em;
+ text-align : center;
+ margin : .2em 0em;
+ &::before{margin : 0em;}
+ }
+ [data-i18n]{
+ display : block;
+ padding-right : 0em;
+ width : 0em;
+ overflow : hidden;
+ opacity : 0;
+ transition-property : padding-right,width,opacity;
+ transition-duration : $transition-out;
+ }
+ &:hover>[data-i18n]{
+ padding-right : 1.3em;
+ width : 6em;
+ opacity : 1;
+ transition-duration : $transition-in;
+ }
+ }
+ }
+
+ .licences{
+ display : block;
+ width : 100%;
+ text-align : center;
+ font-size : .85em;
+ font-weight : 900;
+ img{
+ width : auto;
+ height : 1em;
+ }
+ a>*{vertical-align : middle;}
+ }
+
+}
\ No newline at end of file
diff --git a/Public/scss/Sizerboard.css b/Public/scss/Sizerboard.css
new file mode 100644
index 0000000..f3c07d6
--- /dev/null
+++ b/Public/scss/Sizerboard.css
@@ -0,0 +1,301 @@
+.sizerboard {
+ position: absolute;
+ top: 0em;
+ left: 0em;
+ width: 100%;
+ height: 100%;
+ overflow: hidden; }
+ .sizerboard, .sizerboard input, .sizerboard button, .sizerboard textarea {
+ font-family: "Roboto"; }
+ .sizerboard [data-visible=false] {
+ display: none; }
+ .sizerboard [data-icon]::before {
+ font-family: "Roboto";
+ margin-right: .4em; }
+ .sizerboard a[href] {
+ text-decoration: none; }
+ .sizerboard a[href], .sizerboard [onmousedown], .sizerboard [onmouseup], .sizerboard [onclick] {
+ color: #2282D4;
+ cursor: pointer;
+ transition-property: color;
+ transition-duration: 1s; }
+ .sizerboard a[href]:hover, .sizerboard a[href]:focus, .sizerboard [onmousedown]:hover, .sizerboard [onmousedown]:focus, .sizerboard [onmouseup]:hover, .sizerboard [onmouseup]:focus, .sizerboard [onclick]:hover, .sizerboard [onclick]:focus {
+ color: #D48222;
+ transition-duration: 0.2s; }
+ .sizerboard [type=text], .sizerboard [type=password], .sizerboard [type=date], .sizerboard [type=datetime], .sizerboard [type=time], .sizerboard textarea {
+ width: 100%;
+ box-sizing: border-box; }
+ .sizerboard button, .sizerboard [type=button], .sizerboard [type=submit], .sizerboard [type=reset], .sizerboard [rol=button], .sizerboard [type=text], .sizerboard [type=password], .sizerboard [type=date], .sizerboard [type=datetime], .sizerboard [type=time], .sizerboard textarea {
+ color: #2282D4;
+ font-size: 1em;
+ border: 0.1em solid #2282D4;
+ box-shadow: 0em 0em 0.4em inset #2282D4;
+ border-radius: 0.3em;
+ transition-property: color,border-color,box-shadow;
+ transition-duration: 1s; }
+ .sizerboard button:hover, .sizerboard button:focus, .sizerboard [type=button]:hover, .sizerboard [type=button]:focus, .sizerboard [type=submit]:hover, .sizerboard [type=submit]:focus, .sizerboard [type=reset]:hover, .sizerboard [type=reset]:focus, .sizerboard [rol=button]:hover, .sizerboard [rol=button]:focus, .sizerboard [type=text]:hover, .sizerboard [type=text]:focus, .sizerboard [type=password]:hover, .sizerboard [type=password]:focus, .sizerboard [type=date]:hover, .sizerboard [type=date]:focus, .sizerboard [type=datetime]:hover, .sizerboard [type=datetime]:focus, .sizerboard [type=time]:hover, .sizerboard [type=time]:focus, .sizerboard textarea:hover, .sizerboard textarea:focus {
+ color: #D48222;
+ border-color: #D48222;
+ box-shadow: 0em 0em 0.4em inset #D48222;
+ transition-duration: 0.2s; }
+ .sizerboard button, .sizerboard [type=button], .sizerboard [type=submit], .sizerboard [type=reset], .sizerboard [rol=button] {
+ cursor: pointer; }
+ .sizerboard a[href], .sizerboard [onmousedown], .sizerboard [onmouseup], .sizerboard [onclick] {
+ outline: none; }
+ .sizerboard a[href][disabled], .sizerboard a[href][disabled]:hover, .sizerboard a[href][readonly], .sizerboard a[href][readonly]:hover, .sizerboard a[href][data-selected=true], .sizerboard a[href][data-selected=true]:hover, .sizerboard [onmousedown][disabled], .sizerboard [onmousedown][disabled]:hover, .sizerboard [onmousedown][readonly], .sizerboard [onmousedown][readonly]:hover, .sizerboard [onmousedown][data-selected=true], .sizerboard [onmousedown][data-selected=true]:hover, .sizerboard [onmouseup][disabled], .sizerboard [onmouseup][disabled]:hover, .sizerboard [onmouseup][readonly], .sizerboard [onmouseup][readonly]:hover, .sizerboard [onmouseup][data-selected=true], .sizerboard [onmouseup][data-selected=true]:hover, .sizerboard [onclick][disabled], .sizerboard [onclick][disabled]:hover, .sizerboard [onclick][readonly], .sizerboard [onclick][readonly]:hover, .sizerboard [onclick][data-selected=true], .sizerboard [onclick][data-selected=true]:hover {
+ color: #898989;
+ cursor: default; }
+ .sizerboard button, .sizerboard [type=button], .sizerboard [type=submit], .sizerboard [type=reset], .sizerboard [rol=button], .sizerboard [type=text], .sizerboard [type=password], .sizerboard [type=date], .sizerboard [type=datetime], .sizerboard [type=time], .sizerboard textarea {
+ outline: none;
+ box-sizing: border-box; }
+ .sizerboard button[disabled], .sizerboard button[disabled]:hover, .sizerboard button[disabled]:focus, .sizerboard button[readonly], .sizerboard button[readonly]:hover, .sizerboard button[readonly]:focus, .sizerboard button[data-selected=true], .sizerboard button[data-selected=true]:hover, .sizerboard button[data-selected=true]:focus, .sizerboard [type=button][disabled], .sizerboard [type=button][disabled]:hover, .sizerboard [type=button][disabled]:focus, .sizerboard [type=button][readonly], .sizerboard [type=button][readonly]:hover, .sizerboard [type=button][readonly]:focus, .sizerboard [type=button][data-selected=true], .sizerboard [type=button][data-selected=true]:hover, .sizerboard [type=button][data-selected=true]:focus, .sizerboard [type=submit][disabled], .sizerboard [type=submit][disabled]:hover, .sizerboard [type=submit][disabled]:focus, .sizerboard [type=submit][readonly], .sizerboard [type=submit][readonly]:hover, .sizerboard [type=submit][readonly]:focus, .sizerboard [type=submit][data-selected=true], .sizerboard [type=submit][data-selected=true]:hover, .sizerboard [type=submit][data-selected=true]:focus, .sizerboard [type=reset][disabled], .sizerboard [type=reset][disabled]:hover, .sizerboard [type=reset][disabled]:focus, .sizerboard [type=reset][readonly], .sizerboard [type=reset][readonly]:hover, .sizerboard [type=reset][readonly]:focus, .sizerboard [type=reset][data-selected=true], .sizerboard [type=reset][data-selected=true]:hover, .sizerboard [type=reset][data-selected=true]:focus, .sizerboard [rol=button][disabled], .sizerboard [rol=button][disabled]:hover, .sizerboard [rol=button][disabled]:focus, .sizerboard [rol=button][readonly], .sizerboard [rol=button][readonly]:hover, .sizerboard [rol=button][readonly]:focus, .sizerboard [rol=button][data-selected=true], .sizerboard [rol=button][data-selected=true]:hover, .sizerboard [rol=button][data-selected=true]:focus, .sizerboard [type=text][disabled], .sizerboard [type=text][disabled]:hover, .sizerboard [type=text][disabled]:focus, .sizerboard [type=text][readonly], .sizerboard [type=text][readonly]:hover, .sizerboard [type=text][readonly]:focus, .sizerboard [type=text][data-selected=true], .sizerboard [type=text][data-selected=true]:hover, .sizerboard [type=text][data-selected=true]:focus, .sizerboard [type=password][disabled], .sizerboard [type=password][disabled]:hover, .sizerboard [type=password][disabled]:focus, .sizerboard [type=password][readonly], .sizerboard [type=password][readonly]:hover, .sizerboard [type=password][readonly]:focus, .sizerboard [type=password][data-selected=true], .sizerboard [type=password][data-selected=true]:hover, .sizerboard [type=password][data-selected=true]:focus, .sizerboard [type=date][disabled], .sizerboard [type=date][disabled]:hover, .sizerboard [type=date][disabled]:focus, .sizerboard [type=date][readonly], .sizerboard [type=date][readonly]:hover, .sizerboard [type=date][readonly]:focus, .sizerboard [type=date][data-selected=true], .sizerboard [type=date][data-selected=true]:hover, .sizerboard [type=date][data-selected=true]:focus, .sizerboard [type=datetime][disabled], .sizerboard [type=datetime][disabled]:hover, .sizerboard [type=datetime][disabled]:focus, .sizerboard [type=datetime][readonly], .sizerboard [type=datetime][readonly]:hover, .sizerboard [type=datetime][readonly]:focus, .sizerboard [type=datetime][data-selected=true], .sizerboard [type=datetime][data-selected=true]:hover, .sizerboard [type=datetime][data-selected=true]:focus, .sizerboard [type=time][disabled], .sizerboard [type=time][disabled]:hover, .sizerboard [type=time][disabled]:focus, .sizerboard [type=time][readonly], .sizerboard [type=time][readonly]:hover, .sizerboard [type=time][readonly]:focus, .sizerboard [type=time][data-selected=true], .sizerboard [type=time][data-selected=true]:hover, .sizerboard [type=time][data-selected=true]:focus, .sizerboard textarea[disabled], .sizerboard textarea[disabled]:hover, .sizerboard textarea[disabled]:focus, .sizerboard textarea[readonly], .sizerboard textarea[readonly]:hover, .sizerboard textarea[readonly]:focus, .sizerboard textarea[data-selected=true], .sizerboard textarea[data-selected=true]:hover, .sizerboard textarea[data-selected=true]:focus {
+ color: #898989;
+ border-color: #898989;
+ cursor: default;
+ box-shadow: 0em 0em 0.4em inset #898989; }
+ .sizerboard label {
+ padding: 0em .4em;
+ font-weight: 900;
+ white-space: nowrap;
+ border: 0.1em solid #898989;
+ border-radius: 0.3em;
+ box-shadow: 0em 0em 0.4em inset #898989; }
+ .sizerboard label > * {
+ font-size: .9em; }
+ .sizerboard label::after {
+ content: ":"; }
+ .sizerboard .group {
+ display: table;
+ margin: 0em;
+ padding: 0em;
+ list-style-type: none;
+ border-collapse: collapse; }
+ .sizerboard .group li {
+ display: table-cell; }
+ .sizerboard .group li > * {
+ border-radius: 0em;
+ padding: .1em .4em;
+ padding-block: none;
+ padding-inline: none; }
+ .sizerboard .group > :first-child > * {
+ border-radius: 0.3em 0em 0em 0.3em; }
+ .sizerboard .group > :last-child > * {
+ border-radius: 0em 0.3em 0.3em 0em; }
+ .sizerboard header, .sizerboard main, .sizerboard footer {
+ position: absolute;
+ left: 0em;
+ width: 100%; }
+ .sizerboard header, .sizerboard footer {
+ background-color: #222;
+ color: #EFEFEF; }
+ .sizerboard header {
+ top: 0em;
+ height: 4em;
+ z-index: 20; }
+ .sizerboard main {
+ top: 4em;
+ bottom: 1em;
+ background-color: #EFEFEF;
+ color: #222;
+ z-index: 10;
+ overflow: hidden; }
+ .sizerboard main > form {
+ display: block;
+ position: absolute;
+ top: 0em;
+ height: 100%;
+ overflow: hidden; }
+ .sizerboard main > form > fieldset {
+ position: absolute;
+ top: 0em;
+ left: 0em;
+ right: 0em;
+ bottom: 0em;
+ margin: 0.4em;
+ padding: 0em;
+ border: none; }
+ .sizerboard main > form > fieldset > legend {
+ display: block;
+ width: 100%;
+ font-size: 1.2em;
+ font-weight: 900;
+ border-bottom: 0.15em solid #222; }
+ .sizerboard main > form > fieldset > p {
+ margin: 0em;
+ padding: 1em 0em;
+ font-size: .85em; }
+ .sizerboard footer {
+ bottom: 0em;
+ height: 1em;
+ z-index: 30; }
+ .sizerboard .main-menu {
+ position: absolute;
+ bottom: 0em;
+ left: 50%;
+ margin-bottom: .2em;
+ margin-left: -20em;
+ width: 40em;
+ text-align: center; }
+ .sizerboard .main-menu ul {
+ margin: 0em;
+ padding: 0em;
+ list-style-type: none; }
+ .sizerboard .main-menu li {
+ display: inline-block;
+ margin: 0em 1em; }
+ .sizerboard h1 {
+ margin: 0em; }
+ .sizerboard .projects-menu {
+ left: 0em;
+ width: 10em; }
+ .sizerboard .search-box {
+ position: absolute;
+ top: 7.6em;
+ width: 100%; }
+ .sizerboard .search-box > :first-child > * {
+ border-bottom-left-radius: 0em; }
+ .sizerboard .search-box > :last-child > * {
+ border-bottom-right-radius: 0em; }
+ .sizerboard .search-box > :nth-child(2) {
+ width: 100%; }
+ .sizerboard .search-box label {
+ font-weight: 400; }
+ .sizerboard .search-box label::after {
+ content: ""; }
+ .sizerboard .search-box [data-icon]::before {
+ margin: 0em; }
+ .sizerboard .search-box [data-icon] + [data-i18n] {
+ display: none; }
+ .sizerboard .search-box button[data-i18n=search] {
+ display: none; }
+ .sizerboard .search-box + nav {
+ position: absolute;
+ top: 9em;
+ left: 0em;
+ bottom: 0em;
+ width: 100%;
+ border: 0.1em solid #222;
+ background-color: #EFEFEF;
+ overflow: auto;
+ box-sizing: border-box;
+ border-radius: 0em 0em 0.3em 0.3em;
+ box-shadow: 0.1em 0.1em 0.2em #898989; }
+ .sizerboard .search-box + nav > ul {
+ margin: 0em;
+ padding: 0em;
+ list-style-type: none; }
+ .sizerboard .search-box + nav li {
+ padding: .2em .4em;
+ border-radius: 0em;
+ box-sizing: border-box; }
+ .sizerboard .draw-box {
+ left: 10em;
+ right: 0em; }
+ .sizerboard .draw-box .group {
+ position: absolute;
+ top: 2.6em;
+ left: 0em; }
+ .sizerboard .draw-box .group > :first-child > button {
+ border-bottom-left-radius: 0em; }
+ .sizerboard .draw-box .group > :last-child > button {
+ border-bottom-right-radius: 0em; }
+ .sizerboard .draw-box .fields {
+ position: absolute;
+ top: 4em;
+ left: 0em;
+ bottom: 0em;
+ width: 100%;
+ border: 0.1em solid #222;
+ background-color: #EFEFEF;
+ box-sizing: border-box;
+ border-radius: 0em 0.3em 0.3em 0.3em;
+ box-shadow: 0.1em 0.1em 0.2em #222; }
+ .sizerboard .draw-box .fields > section, .sizerboard .draw-box .fields > section > * {
+ position: absolute;
+ top: 0em;
+ left: 0em;
+ width: 100%;
+ height: 100%; }
+ .sizerboard .draw-box .fields > section > * {
+ border-radius: 0em 0.3em 0.3em 0.3em; }
+ .sizerboard .draw-box .fields textarea {
+ font-family: "Roboto Mono";
+ color: #222;
+ resize: none; }
+ .sizerboard .draw-box .curtain {
+ position: absolute;
+ top: 0em;
+ left: 0em;
+ width: 100%;
+ height: 100%;
+ background-color: #EFEFEF;
+ opacity: .8; }
+ .sizerboard .draw-box:not([data-selected=null]) > .curtain {
+ display: none; }
+ .sizerboard .actions-box {
+ position: absolute;
+ right: 0em;
+ bottom: 0em;
+ border: none; }
+ .sizerboard .actions-box > legend, .sizerboard .actions-box > p {
+ display: none; }
+ .sizerboard .actions-box ul {
+ position: absolute;
+ right: 0em;
+ bottom: 0em;
+ margin: .5em;
+ padding: 0em;
+ list-style-type: none;
+ overflow: visible; }
+ .sizerboard .actions-box ul > li {
+ display: "block";
+ position: relative;
+ text-align: right; }
+ .sizerboard .actions-box li {
+ margin: .2em 0em; }
+ .sizerboard .actions-box button {
+ min-width: 2em;
+ height: 2em;
+ text-align: right;
+ white-space: nowrap;
+ box-sizing: border-box;
+ border-radius: 1em; }
+ .sizerboard .actions-box button span {
+ font-size: 1.3em;
+ font-weight: 900; }
+ .sizerboard .actions-box button [data-icon] {
+ display: inline-block;
+ position: absolute;
+ top: 0em;
+ right: 0em;
+ width: 1.5em;
+ text-align: center;
+ margin: .2em 0em; }
+ .sizerboard .actions-box button [data-icon]::before {
+ margin: 0em; }
+ .sizerboard .actions-box button [data-i18n] {
+ display: block;
+ padding-right: 0em;
+ width: 0em;
+ overflow: hidden;
+ opacity: 0;
+ transition-property: padding-right,width,opacity;
+ transition-duration: 1s; }
+ .sizerboard .actions-box button:hover > [data-i18n] {
+ padding-right: 1.3em;
+ width: 6em;
+ opacity: 1;
+ transition-duration: 0.2s; }
+ .sizerboard .licences {
+ display: block;
+ width: 100%;
+ text-align: center;
+ font-size: .85em;
+ font-weight: 900; }
+ .sizerboard .licences img {
+ width: auto;
+ height: 1em; }
+ .sizerboard .licences a > * {
+ vertical-align: middle; }
+
+/*# sourceMappingURL=Sizerboard.css.map */
diff --git a/Public/scss/Sizerboard.css.map b/Public/scss/Sizerboard.css.map
new file mode 100644
index 0000000..146f182
--- /dev/null
+++ b/Public/scss/Sizerboard.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["Sizerboard.base.scss","Sizerboard.settings.scss"],
+"names": [],
+"file": "Sizerboard.css"
+}
diff --git a/Public/scss/Sizerboard.scss b/Public/scss/Sizerboard.scss
new file mode 100644
index 0000000..925eccb
--- /dev/null
+++ b/Public/scss/Sizerboard.scss
@@ -0,0 +1 @@
+@import "Sizerboard.settings.scss", "Sizerboard.base.scss";
\ No newline at end of file
diff --git a/Public/scss/Sizerboard.settings.scss b/Public/scss/Sizerboard.settings.scss
new file mode 100644
index 0000000..3b49e75
--- /dev/null
+++ b/Public/scss/Sizerboard.settings.scss
@@ -0,0 +1,23 @@
+// colors
+$color-primary : #2282D4;
+$color-secondary : #D48222;
+$color-fore : #222;
+$color-back : #EFEFEF;
+$color-grey : mix($color-fore, $color-back, 50%);
+
+// Sizes
+$header-height : 4em;
+$footer-height : 1em;
+$projects-menu-width : 10em;
+$border-radius : .3em;
+$box-margin : .4em;
+
+// Fonts
+$font-family : "Roboto";
+$font-mono : "Roboto Mono";
+$font-icons : "FA5FS";
+
+// Transitions
+$transition-in : .2s;
+$transition-out : 1s;
+$transition : ($transition-out - $transition-in) * .5 + $transition-in;
\ No newline at end of file
diff --git a/Sizerboard.apache2.conf b/Sizerboard.apache2.conf
new file mode 100755
index 0000000..dc94eed
--- /dev/null
+++ b/Sizerboard.apache2.conf
@@ -0,0 +1,14 @@
+
+ ServerName sizerboard.local
+ DocumentRoot /Projects/Sizerboard/Public
+
+ Options +Indexes +FollowSymLinks +MultiViews
+ DirectoryIndex index.html index.php
+ AllowOverride all
+ Order Allow,Deny
+ Allow from all
+ Require all granted
+
+ ErrorLog ${APACHE_LOG_DIR}/error_sizerboard_80.log
+ CustomLog ${APACHE_LOG_DIR}/access_sizerboard_80.log combined
+
diff --git a/Tools/sass.sh b/Tools/sass.sh
new file mode 100755
index 0000000..92e61ff
--- /dev/null
+++ b/Tools/sass.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+directory=`dirname $(readlink -f "$0")`
+sass $directory/../Public/scss/Sizerboard.scss ../Public/scss/Sizerboard.css;
\ No newline at end of file
diff --git a/version b/version
new file mode 100644
index 0000000..b0a1227
--- /dev/null
+++ b/version
@@ -0,0 +1 @@
+0.0.10
\ No newline at end of file