#wip: Basic GUI structure and starting the server developt.

main
KyMAN 1 month ago
parent f09499b641
commit dda74c1116
  1. 4
      .gitignore
  2. 186
      JSON/Sizerboard.languages_iso.json
  3. 143
      PHP/Sizerboard.php
  4. 6
      Public/.htaccess
  5. 12
      Public/css/Sizerboard.icons.css
  6. 103
      Public/ecma/Sizerboard.Base.ecma.js
  7. 48
      Public/ecma/Sizerboard.DrawBox.ecma.js
  8. 90
      Public/ecma/Sizerboard.Projects.ecma.js
  9. 186
      Public/ecma/Sizerboard.Views.ecma.js
  10. 454
      Public/ecma/Sizerboard.ecma.js
  11. 151
      Public/html/Sizerboard.views.html
  12. 12
      Public/index.html
  13. 58
      Public/index.php
  14. 33
      Public/json/Sizerboard.settings.json
  15. 34
      Public/json/i18n/Sizerboard.i18n.alarabiyah.json
  16. 34
      Public/json/i18n/Sizerboard.i18n.azerbaycanca.json
  17. 34
      Public/json/i18n/Sizerboard.i18n.catala.json
  18. 34
      Public/json/i18n/Sizerboard.i18n.cestina.json
  19. 34
      Public/json/i18n/Sizerboard.i18n.dansk.json
  20. 34
      Public/json/i18n/Sizerboard.i18n.deutsch.json
  21. 52
      Public/json/i18n/Sizerboard.i18n.ellinika.json
  22. 34
      Public/json/i18n/Sizerboard.i18n.english.json
  23. 37
      Public/json/i18n/Sizerboard.i18n.espanol.json
  24. 34
      Public/json/i18n/Sizerboard.i18n.esperanto.json
  25. 34
      Public/json/i18n/Sizerboard.i18n.farsi.json
  26. 34
      Public/json/i18n/Sizerboard.i18n.francais.json
  27. 38
      Public/json/i18n/Sizerboard.i18n.gaeilge.json
  28. 34
      Public/json/i18n/Sizerboard.i18n.hangugeo.json
  29. 34
      Public/json/i18n/Sizerboard.i18n.hindi.json
  30. 34
      Public/json/i18n/Sizerboard.i18n.indonesia.json
  31. 34
      Public/json/i18n/Sizerboard.i18n.italiano.json
  32. 34
      Public/json/i18n/Sizerboard.i18n.ivrit.json
  33. 34
      Public/json/i18n/Sizerboard.i18n.magyar.json
  34. 34
      Public/json/i18n/Sizerboard.i18n.nederlands.json
  35. 34
      Public/json/i18n/Sizerboard.i18n.nihongo.json
  36. 34
      Public/json/i18n/Sizerboard.i18n.polski.json
  37. 34
      Public/json/i18n/Sizerboard.i18n.portugues.json
  38. 34
      Public/json/i18n/Sizerboard.i18n.russkiy.json
  39. 34
      Public/json/i18n/Sizerboard.i18n.slovencina.json
  40. 34
      Public/json/i18n/Sizerboard.i18n.suomi.json
  41. 34
      Public/json/i18n/Sizerboard.i18n.svenska.json
  42. 34
      Public/json/i18n/Sizerboard.i18n.thai.json
  43. 51
      Public/json/i18n/Sizerboard.i18n.turkce.json
  44. 34
      Public/json/i18n/Sizerboard.i18n.ukrainska.json
  45. 34
      Public/json/i18n/Sizerboard.i18n.zhongwen.json
  46. 348
      Public/scss/Sizerboard.base.scss
  47. 301
      Public/scss/Sizerboard.css
  48. 7
      Public/scss/Sizerboard.css.map
  49. 1
      Public/scss/Sizerboard.scss
  50. 23
      Public/scss/Sizerboard.settings.scss
  51. 14
      Sizerboard.apache2.conf
  52. 3
      Tools/sass.sh
  53. 1
      version

4
.gitignore vendored

@ -0,0 +1,4 @@
/Data
/Public/data
*[Ss]ecrets*
.sass-cache

@ -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ú"
}

@ -0,0 +1,143 @@
<?php
class Sizerboard{
private static $default_settings = [];
private $inputs = null;
private $custom_settings = [];
private $slash;
private static $root_paths = ["", __DIR__, __DIR__ . "/.."];
const root_project_path = __DIR__ . "/..";
public function __construct($inputs = null){
$this->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];
}
};

@ -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]

@ -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";}

@ -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();
};

@ -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();
};

@ -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();
};

@ -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();
};

@ -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 `<div data-preloader="` + hash + `"></div>`;
};
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();

@ -0,0 +1,151 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title data-i18n="sizerboard_views">Sizerboard - Views</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta charset="utf-8" />
</head>
<body>
<!-- [[base_view]] -->
<div class="sizerboard {hash}{classes}" id="{hash}" data-hash="{hash}" data-application="{application}" data-url="{url}" data-git="{git}" data-cells="{cells}">
<header>
<h1>
<a href="{url}" data-i18n="sizerboard" title="{{sizerboard}}" data-i18n-without="true">
<span class="logo">
<img src="{logo}" data-i18n="sizerboard" alt="{{sizerboard}}" data-i18n-without="true" />
<span style="background-image:url('{logo}');"></span>
</span>
<span data-i18n="sizerboard">{{sizerboard}}</span>
</a>
</h1>
<nav class="main-menu">
<ul>{main_menu_items}</ul>
</nav>
</header>
<main>
<form class="projects-menu" method="post" action="#" onsubmit="return false;">
<fieldset>
<legend data-i18n="projects_menu">{{projects_menu}}</legend>
<p data-i18n="projects_menu_text">{{projects_menu_text}}</p>
<ul class="group search-box" data-i18n="search" title="{{search}}" data-i18n-without="true">
<li><label for="projects_menu_search">
<span data-icon="search"></span>
<span data-i18n="search">{{search}}</span>
</label></li>
<li class="input"><input type="text" id="projects_menu_search" name="search" data-i18n="{search}" placeholder="{{search}}..." data-i18n-without="true" data-i18n-dotted="true" /></li>
<li class="input"><button type="button" data-i18n="search" title="{{search}}" data-i18n-without="true" onclick="object_name.projects.search(this, event);">
<span data-icon="search"></span>
<span data-i18n="search">{{search}}</span>
</button></li>
<li class="input"><button type="button" data-i18n="add" title="{{add}}" data-i18n-without="true" onclick="object_name.projects.add(this, event);">
<span data-icon="add"></span>
<span data-i18n="add">{{add}}</span>
</button></li>
</ul>
<nav>
<ul>{projects}</ul>
</nav>
</fieldset>
</form>
<form class="draw-box" method="post" action="#" onsubmit="return false;" data-mode="canvas" data-selected="null">
<fieldset>
<legend data-i18n="draw_box">{{draw_box}}</legend>
<p data-i18n="draw_box_text">{{draw_box_text}}</p>
<ul class="group">
<li class="input"><button type="button" data-i18n="html" title="{{html}}" data-i18n-without="true" onclick="object_name.draw_box.show(this, event, 'html');">
<span data-icon="html"></span>
<span data-i18n="html">{{html}}</span>
</button></li>
<li class="input"><button type="button" data-i18n="canvas" title="{{canvas}}" data-i18n-without="true" onclick="object_name.draw_box.show(this, event, 'canvas');" disabled>
<span data-icon="canvas"></span>
<span data-i18n="canvas">{{canvas}}</span>
</button></li>
<li class="input"><button type="button" data-i18n="svg" title="{{svg}}" data-i18n-without="true" onclick="object_name.draw_box.show(this, event, 'svg');">
<span data-icon="svg"></span>
<span data-i18n="svg">{{svg}}</span>
</button></li>
<li class="input"><button type="button" data-i18n="text" title="{{text}}" data-i18n-without="true" onclick="object_name.draw_box.show(this, event, 'text');">
<span data-icon="text"></span>
<span data-i18n="text">{{text}}</span>
</button></li>
</ul>
<div class="fields">
<section class="html" data-visible="false"></section>
<section class="canvas" data-visible="true">
<canvas></canvas>
</section>
<section class="svg" data-visible="false">
<svg></svg>
</section>
<section class="text" data-visible="false">
<textarea name="code" data-i18n="code" data-i18n-dotted="true" data-i18n-without="true" placeholder="{{code}}..."></textarea>
</section>
</div>
</fieldset>
<div class="curtain"></div>
</form>
<fieldset class="actions-box">
<legend data-i18n="actions">{{actions}}</legend>
<p data-i18n="actions_text">{{actions_text}}</p>
<nav class="actions">
<ul>
<li data-i18n="upload" data-i18n-without="true" title="{{upload}}">
<button type="button" onclick="object_name.projects.upload(this, event);">
<span data-icon="upload"></span>
<span data-i18n="upload">{{upload}}</span>
</button>
</li>
<li data-i18n="save" data-i18n-without="true" title="{{save}}">
<button type="button" onclick="object_name.projects.save(this, event);" disabled>
<span data-icon="save"></span>
<span data-i18n="save">{{save}}</span>
</button>
</li>
<li data-i18n="download" data-i18n-without="true" title="{{download}}">
<button type="button" onclick="object_name.projects.download(this, event);" disabled>
<span data-icon="download"></span>
<span data-i18n="download">{{download}}</span>
</button>
</li>
</ul>
</nav>
</fieldset>
</main>
<footer>
<span class="licences">
<a href="https://www.gnu.org/licenses/gpl-3.0.txt" target="_blank" data-i18n="license_gpl" title="GPLv3" data-i18n-without="true">
<span data-i18n="license_text">© 2024-2025 CopyLeft.</span>
<img src="https://www.gnu.org/graphics/gplv3-127x51.png" data-i18n="license_gpl" alt="GPLv3" data-i18n-without="true" />
</a>
<a class="license-image" href="http://creativecommons.org/licenses/by-sa/4.0/" target="_blank" data-i18n="license_creative_commons" data-i18n-without="true" title="Creative Commons">
<img src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" alt="cc-sa" />
</a>
</span>
</footer>
{preloader}
</div>
<!-- [[base_view]] -->
<nav>
<ul>
<!-- [[main_menu_item]] -->
<li data-i18n="{i18n}" title="{{i18n}}" data-i18n-without="true">
<a href="{url}" target="{target}">
<span data-icon="{icon}"></span>
<span data-i18n="{i18n}">{{i18n}}</span>
</a>
</li>
<!-- [[main_menu_item]] -->
<!-- [[project_option]] -->
<li data-name="{name}" data-i="{i}" title="{name}" onclick="object_name.projects.get_in_gui(this, event);" data-selected="false" rol="button">{name}</li>
<!-- [[project_option]] -->
</ul>
</nav>
</body>
</html>

@ -1,12 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title data-i18n="sizerboard">Sizerboard</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta charset="utf-8" />
<script data-type="text/javascript" data-language="ECMAScript 2015" src="/ecma/Sizerboard.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
</head>
<body></body>
</html>

@ -0,0 +1,58 @@
<?php
$default_language_code = "es";
$languages_dictionary = json_decode(file_get_contents(__DIR__ . "/../JSON/Sizerboard.languages_iso.json"), true);
$language_code = $default_language_code;
$languages = [$languages_dictionary[$language_code]];
preg_match('/^\/([a-z]{2})(\/([a-z0-9\-]+))?(\/([a-z0-9\-]+))?\/?$/i', $_SERVER["REQUEST_URI"], $matches, PREG_OFFSET_CAPTURE) &&
count($matches) > 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;
?><!DOCTYPE html>
<html lang="<?=$language_code;?>">
<head>
<title data-i18n="sizerboard">Sizerboard</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta charset="utf-8" />
<style data-type="text/css" data-language="CSS2" data-rel="stylesheet" charset="utf-8">
html,body{
height : 100%;
margin : 0em;
}
</style>
<link type="text/css" data-language="CSS3" rel="stylesheet" href="https://cdn.k3y.pw/css/fonts/local/Roboto.css" data-crossorigin="anonymous" charset="utf-8" />
<link type="text/css" data-language="CSS3" rel="stylesheet" href="https://cdn.k3y.pw/css/fonts/local/RobotoMono.css" data-crossorigin="anonymous" charset="utf-8" />
<link type="text/css" data-language="CSS3" rel="stylesheet" href="https://cdn.k3y.pw/css/fonts/local/FontAwesome5Free.css" data-crossorigin="anonymous" charset="utf-8" />
<link type="text/css" data-language="SASS/CSS3" rel="stylesheet" href="/scss/Sizerboard.css" data-scss="/scss/Sizerboard.scss" data-css-map="/scss/Sizerboard.css.map" data-crossorigin="anonymous" charset="utf-8" />
<link type="text/css" data-language="CSS3" rel="stylesheet" href="/css/Sizerboard.icons.css" data-crossorigin="anonymous" charset="utf-8" />
<script data-type="text/javascript" data-language="ECMAScript 2015" src="/ecma/Sizerboard.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
<script data-type="text/javascript" data-language="ECMAScript 2015" src="/ecma/Sizerboard.Views.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
<script data-type="text/javascript" data-language="ECMAScript 2015" src="/ecma/Sizerboard.Base.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
<script data-type="text/javascript" data-language="ECMAScript 2015" src="/ecma/Sizerboard.Projects.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
<script data-type="text/javascript" data-language="ECMAScript 2015" src="/ecma/Sizerboard.DrawBox.ecma.js" data-crossorigin="anonymous" charset="utf-8"></script>
<script data-type="text/javascript" data-language="ECMAScript 2015" charset="utf-8">
sizerboard = new Sizerboard({
default_language : "<?=$languages_dictionary[$language_code];?>",
language : "<?=$languages_dictionary[$language_code];?>",
default_i18n_files : [<?php foreach($languages as $i => $language){?><?=$i ? ", " : "";?>"/json/i18n/Sizerboard.i18n.<?=$language;?>.json"<?php }?>]
});
</script>
</head>
<body></body>
</html>

@ -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
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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
}
}

@ -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;}
}
}

@ -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 */

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
@import "Sizerboard.settings.scss", "Sizerboard.base.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;

@ -0,0 +1,14 @@
<VirtualHost *:80>
ServerName sizerboard.local
DocumentRoot /Projects/Sizerboard/Public
<Directory /Projects/Sizerboard>
Options +Indexes +FollowSymLinks +MultiViews
DirectoryIndex index.html index.php
AllowOverride all
Order Allow,Deny
Allow from all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error_sizerboard_80.log
CustomLog ${APACHE_LOG_DIR}/access_sizerboard_80.log combined
</VirtualHost>

@ -0,0 +1,3 @@
#!/bin/bash
directory=`dirname $(readlink -f "$0")`
sass $directory/../Public/scss/Sizerboard.scss ../Public/scss/Sizerboard.css;

@ -0,0 +1 @@
0.0.10
Loading…
Cancel
Save