From 08389f091bf2e9c62bb4bf8fac783914dc52cd9e Mon Sep 17 00:00:00 2001 From: bellord13 Date: Sun, 15 Feb 2026 19:38:58 +0300 Subject: [PATCH] fix --- assets/core/core.js | 82 +++++++++++++++++++++++++++--------- assets/core/core.min.js | 2 +- images/colors/black.png | Bin 0 -> 156 bytes images/colors/brown.png | Bin 0 -> 157 bytes images/colors/colors.psd | Bin 26930 -> 61142 bytes images/colors/gray.png | Bin 0 -> 155 bytes images/colors/green.png | Bin 0 -> 154 bytes images/colors/mix.jpg | Bin 0 -> 2176 bytes images/colors/orange.png | Bin 0 -> 157 bytes images/colors/red.png | Bin 0 -> 154 bytes images/colors/violet.png | Bin 0 -> 157 bytes images/colors/white.png | Bin 0 -> 155 bytes images/colors/yellow.png | Bin 0 -> 157 bytes tests/pluginManagerTest.php | 58 +++++++++++++++++++++++++ tests/templaterTest.php | 23 ++++++---- 15 files changed, 135 insertions(+), 30 deletions(-) create mode 100644 images/colors/black.png create mode 100644 images/colors/brown.png create mode 100644 images/colors/gray.png create mode 100644 images/colors/green.png create mode 100644 images/colors/mix.jpg create mode 100644 images/colors/orange.png create mode 100644 images/colors/red.png create mode 100644 images/colors/violet.png create mode 100644 images/colors/white.png create mode 100644 images/colors/yellow.png create mode 100644 tests/pluginManagerTest.php diff --git a/assets/core/core.js b/assets/core/core.js index 5044f7d..4a85680 100644 --- a/assets/core/core.js +++ b/assets/core/core.js @@ -9,7 +9,7 @@ kit.config = kit.config || {}; * @class kitConfig */ var defaultConfig = { - version: '2.0', + version: '2.1', assetsPath: '', requiredDependencies: [], autoloadPluginList: [], @@ -793,7 +793,7 @@ kit.config = kit.config || {}; * @param callback * @param argArr * @param context - * @returns {undefined} + * @return {Promise} */ PluginManager.prototype.exec = function (deps, callback, argArr = [], context = undefined) { var self = this; @@ -813,7 +813,7 @@ kit.config = kit.config || {}; argArr = []; } if(typeof callback !== 'function') { - return undefined; + callback = function(){}; } if(global.config && global.config.requiredDependencies) { @@ -823,11 +823,17 @@ kit.config = kit.config || {}; var depsPromiseCallback = self.__getDepsPromiseCallback(deps); if(depsPromiseCallback) { - depsPromiseCallback().then(function(){ - callback.apply(context, argArr); + return depsPromiseCallback().then(function(){ + return new Promise(function(resolve, reject){ + callback.apply(context, argArr) + resolve(); + }); }); } else { - callback.apply(context, argArr) + return new Promise(function(resolve, reject){ + callback.apply(context, argArr) + resolve(); + }); } }; @@ -836,11 +842,20 @@ kit.config = kit.config || {}; * @see https://requirejs.org/ * @param deps * @param callback + * @return {Promise} */ __proto.define = function (deps, callback) { var self = this; var context = this; + if(typeof deps === 'string'){ + deps = [deps]; + } + + if(typeof callback !== 'function') { + callback = function (){}; + } + var depsPromiseCallback = self.__getDepsPromiseCallback(deps); var getArgArr = function () { @@ -857,11 +872,17 @@ kit.config = kit.config || {}; }.bind(self); if(depsPromiseCallback) { - depsPromiseCallback().then(function(){ - callback.apply(context, getArgArr()); + return depsPromiseCallback().then(function(){ + return new Promise(function(resolve, reject){ + callback.apply(context, getArgArr()); + resolve(); + }); }); } else { - callback.apply(context, getArgArr()) + return new Promise(function(resolve, reject){ + callback.apply(context, getArgArr()) + resolve(); + }); } }; @@ -870,8 +891,9 @@ kit.config = kit.config || {}; * * @param {(string|string[])} deps * @param {function} callback + * @return {Promise} */ - __proto.ready = function(deps, callback = undefined) { + __proto.ready = function(deps = [], callback = undefined) { var self = this; if(typeof deps === 'function') { callback = deps; @@ -880,19 +902,28 @@ kit.config = kit.config || {}; if(typeof callback !== 'function') { callback = function (){}; } - self.__ready(self.exec, [deps, callback], self); + return self.__ready(self.exec, [deps, callback], self); }; __proto.__ready = function(fn, args = [], context = window) { + var promise; var self = this; context = context || this; if (/complete|interactive|loaded/.test(document.readyState)) { - fn.apply(context, args); - } else { - document.addEventListener("DOMContentLoaded", function () { + promise = new Promise(function(resolve, reject){ fn.apply(context, args); - }.bind(this)); + resolve(); + }); + } else { + promise = new Promise(function(resolve, reject){ + document.addEventListener("DOMContentLoaded", function () { + resolve(); + }.bind(this)); + }).then(function(){ + return fn.apply(context, args); + }); } + return promise; }; /** @@ -901,7 +932,7 @@ kit.config = kit.config || {}; * @param {(string|string[])} deps * @param {function} callback */ - __proto.loaded = function(deps, callback = undefined) { + __proto.loaded = function(deps = [], callback = undefined) { var self = this; if(typeof deps === 'function') { callback = deps; @@ -910,19 +941,28 @@ kit.config = kit.config || {}; if(typeof callback !== 'function') { callback = function (){}; } - self.__loaded(self.exec, [deps, callback], self); + return self.__loaded(self.exec, [deps, callback], self); }; __proto.__loaded = function(fn, args = [], context = window) { + var promise; var self = this; context = context || this; if (/complete|interactive|loaded/.test(document.readyState)) { - fn.apply(context, args); - } else { - window.addEventListener("load", function () { + promise = new Promise(function(resolve, reject){ fn.apply(context, args); - }.bind(this)); + resolve(); + }); + } else { + promise = new Promise(function(resolve, reject){ + window.addEventListener("load", function () { + resolve(); + }.bind(this)); + }).then(function(){ + return fn.apply(context, args); + }); } + return promise; }; /** diff --git a/assets/core/core.min.js b/assets/core/core.min.js index 0c0fc3f..38f45fe 100644 --- a/assets/core/core.min.js +++ b/assets/core/core.min.js @@ -1 +1 @@ -var kit,kit=window.kit=window.kit||{};kit.service=kit.service||{},kit.config=kit.config||{},!function(global){var defaultConfig={version:"2.0",assetsPath:"",requiredDependencies:[],autoloadPluginList:[],debug:!0},stateList={undefined:0,registered:1,loading:3,loaded:4,installing:5,installed:6},MD_TYPE={ES:"ES",UMD:"UMD",HMD:"HMD",default:"default"};function Plugin(e,t={}){this.id=e,this.state=stateList.undefined,this.state2=stateList.undefined,this.module={code:"",exports:{}},this.config={autoRequire:!1,loadJsAfterModule:!1,isSetTimestamp:!0,path:"",module:"",type:"default",handler:void 0,onRegister:function(e){},onLoad:function(e){},onInstall:function(e){},js:[],css:[],alias:[],deps:[],debug:!1},this.pluginManager=void 0,this.promise=new Promise(function(e,t){e()}),this.errors=[],this.register(t)}function isAssetLoaded(e){return e=e.match(/^[^#?]*/)[0],document.querySelector('script[src^="'+e+'"]')||document.querySelector('link[href^="'+e+'"]')||document.querySelector('meta[property="kit:file-load"][content="'+e+'"]')}function getUrlWithTimestamp(t){var i=3600*((new Date).getTime()/1e3/3600>>0);try{var e=new URL(t);e.searchParams.append("__pm",String(i)),t=e.toString()}catch(e){t=(t=String(t).split("?")[0])+"?__pm"+i}return t}Plugin.prototype.setPluginManager=function(e){this.pluginManager=e},Plugin.prototype.queuePush=function(i,n=[]){"function"==typeof i&&(this.promise=this.promise.then(function(e){var t=i.apply(this,n);if(t)return t}))},Plugin.prototype.__queue=function(e,i,n=[],o=void 0){var t=this;void 0===o&&(o=t),t.__checkState(e)?i.apply(o,n):t.promise=t.promise.then(function(){return new Promise(function(e,t){i.apply(o,n),e()})}.bind(t))},Plugin.prototype.__exec=function(e,t,i=[],n=void 0){var o=this;void 0===n&&(n=o),o.__checkState(e)?t.apply(n,i):o.promise=o.promise.then(function(){t.apply(n,i)}.bind(o))},Plugin.prototype.__checkState=function(e,t=void 0){return void 0===t?this.state>=e:this.state>=e&&this.state<=t},Plugin.prototype.__check2State=function(e,t=void 0){return void 0===t?this.state2>=e:this.state2>=e&&this.state2<=t},Plugin.prototype.__getValidConfig=function(e={}){e=Object.assign({},e);return"function"!=typeof e.onLoad&&(e.onLoad=function(e){}),"function"!=typeof e.onInstall&&(e.onInstall=function(e){}),"function"!=typeof e.onRegister&&(e.onRegister=function(e){}),"string"!=typeof e.path&&(e.path=""),"string"==typeof e.js?e.js=[e.js]:Array.isArray(e.js)||(e.js=[]),"string"==typeof e.css?e.css=[e.css]:Array.isArray(e.css)||(e.css=[]),"string"==typeof e.alias?e.alias=[e.alias]:Array.isArray(e.alias)||(e.alias=[]),e.autoRequire=!!e.hasOwnProperty("autoRequire")&&!!e.autoRequire,e.loadJsAfterModule=!!e.hasOwnProperty("loadJsAfterModule")&&!!e.loadJsAfterModule,e.isSetTimestamp=!e.hasOwnProperty("isSetTimestamp")||!!e.isSetTimestamp,e.type=e.type||"default","string"==typeof e.deps?e.deps=[e.deps]:Array.isArray(e.deps)||(e.deps=[]),e},Plugin.prototype.__setState=function(e,t=!1){var i=this;(t||i.__checkState(e))&&(i.state=e)},Plugin.prototype.register=function(e={}){var t,i=this,n=i.id;if(this.__checkState(stateList.installed))throw new Error("Plugin "+n+" уже невозможно конфигурировать ("+i.state+"/"+i.state2+")");if("function"==typeof e)t=e,(e=this.config).handler=t,e.type=MD_TYPE.HMD;else{if(this.__checkState(stateList.loaded)||this.__check2State(stateList.loading))throw new Error("Plugin "+n+" уже невозможно конфигурировать ("+i.state+")");if("object"!=typeof e)throw new Error("Plugin.register: plugin "+n+" is not a valid format");e=this.__getValidConfig(e),Object.assign(this.config,e)}this.__checkState(stateList.registered)||(i.config.debug&&console.log(`Plugin ${i.id}: onRegister + event.`),this.state=stateList.registered,this.config.onRegister(this),t=new CustomEvent("onRegister"+this.id+"Plugin",{detail:{plugin:this}}),document.dispatchEvent(t)),e.autoRequire},Plugin.prototype.load=function(e){var n,t,i,o,s,r=this,l=("function"!=typeof e&&(e=function(){}),r.id);return r.__checkState(stateList.registered)?r.__checkState(stateList.loaded)?e():r.__check2State(stateList.loading)?r.__exec(stateList.loaded,e):(r.state2=stateList.loading,(n=r.config).css.forEach(function(e,t,i){r.getStylePromise(n.path+e)}),r.pluginManager&&(t=r.pluginManager.__getDepsPromiseCallback(r.config.deps),r.queuePush(t)),o=n.path+n.module,i="string"==typeof n.module&&""!==n.module&&"ES"===n.type?function(){return r.getESModulePromise(o).then(function(e){e.__esModule=!0,r.module.exports=e}.bind(r))}:"string"==typeof n.module&&""!==n.module&&"UMD"===n.type?isAssetLoaded(o)?void(r.config.debug&&console.warn(`Plugin ${r.id}: Скрипт ${o} уже загружен!`)):function(){return r.httpGet(o).then(function(e){r.module.code=e}.bind(r))}:"HMD"!==n.type||n.hasOwnProperty("handler")&&"function"==typeof n.handler?"string"==typeof n.module&&""!==n.module&&"default"===n.type?isAssetLoaded(o)?void(r.config.debug&&console.warn(`Plugin ${r.id}: Скрипт ${o} уже загружен!`)):function(){return r.getScriptPromise(o)}:void 0:function(){return r.getScriptPromise(o)},s=r.getJsAssetsPromiseCallback(n.js),n.loadJsAfterModule?(r.queuePush(i),r.queuePush(s)):(r.queuePush(s),r.queuePush(i)),t||i||s||(r.state=stateList.loaded),r.__queue(stateList.loaded,function(){r.config.debug&&console.log(`Plugin ${r.id}: onLoad + event.`),r.isLoaded()||(r.state=stateList.loaded),n.onLoad.call(r,r);var e=new CustomEvent("onLoad"+r.id+"Plugin",{detail:{plugin:r}});document.dispatchEvent(e)}),r.__exec(stateList.loaded,function(){e()}.bind(r))):console.warn(`Plugin.load(${l}): is not register!.`),r},Plugin.prototype.install=function(callback){var self=this,global=self.pluginManager.global,require=self.pluginManager.require.bind(self.pluginManager),pluginId=("function"!=typeof callback&&(callback=function(){}),self.id),setGlobals,module,installer;return self.__checkState(stateList.registered)?self.__checkState(stateList.installed)?callback():self.__check2State(stateList.installing)?self.__exec(stateList.installed,callback):(self.__checkState(stateList.loaded)||this.load(),self.state2=stateList.installing,setGlobals=function(t,i){var e,n;void 0!==i&&(e=self.id,n=self.config.alias,t.hasOwnProperty(e)||(t[e]=i),Array.isArray(n))&&n.length&&n.forEach(function(e){t.hasOwnProperty(e)||(t[e]=i)})},module=self.module,installer=function(){var __exports=self.module.exports,event=("ES"===self.config.type&&"string"==typeof self.config.module&&""!==self.config.module?__exports="object"==typeof self.module.exports&&void 0!==self.module.exports.default?self.module.exports.default:self.module.exports:"UMD"===self.config.type&&"string"==typeof self.config.module&&""!==self.config.module?(function(require,exports,module,global){var self=global;eval(module.code)}.bind(global).call(global,require,self.module.exports,module,global),__exports="object"==typeof self.module.exports&&void 0!==self.module.exports.default?self.module.exports.default:self.module.exports):"HMD"===self.config.type&&"function"==typeof self.config.handler&&(__exports=self.config.handler.bind(global).call(global,require,self.module.exports,module,global),void 0===__exports)&&self.module.exports&&(__exports=self.module.exports),"object"==typeof global&&setGlobals(global,__exports),self.state=stateList.installed,console.log(`%cPlugin ${pluginId}: installed.`,"color: green;"),self.config.onInstall.call(self,self),new CustomEvent("onInstall"+self.id+"Plugin",{detail:{plugin:self}}));return document.dispatchEvent(event),!0}.bind(this),this.__queue(stateList.loaded,installer),this.__exec(stateList.loaded,function(){callback()})):console.warn(`Plugin ${pluginId}: is not register!`),self},Plugin.prototype.exec=function(e,t=[],i=void 0){var n=this;void 0===i&&(i=n),n.__checkState(stateList.installed)||(n.load(),n.install()),n.__exec(stateList.installed,e,t,i)},Plugin.prototype.getESModulePromise=function(e){var n=this;return new Promise(function(t,i){import(e).then(function(e){t(e)},function(e){n.errors.push(e),console.log(`%cPlugin ${n.id}: error import module!`,"color: red;"),i(e)})})},Plugin.prototype.httpGet=function(n){var o=this;return new Promise(function(t,i){o.config.debug&&console.log(`Plugin ${o.id}: httpGet `+n);var e=n;o.config.isSetTimestamp&&(e=getUrlWithTimestamp(n)),p=fetch(e,{method:"GET",redirect:"follow"}).then(function(e){if(e.ok)return e.text();throw console.log(`%cPlugin.load(${o.id}): bad status ${e.status}!`,"color: red;"),["bad status",e.status,e.statusText].filter().join(" ")},function(e){i("Network Error")}).then(function(e){t(e)},function(e){i(e)})})},Plugin.prototype.getScriptPromise=function(n){var o=this;if(!isAssetLoaded(n))return new Promise(function(e,t){o.config.debug&&console.log(`Plugin ${o.id}: load script `+n);var i=document.createElement("script");i.async=!0,i.onload=function(){e(i)},i.onerror=function(){var e=new Error("Ошибка загрузки скрипта "+n);o.errors.push(e),console.log(`%cPlugin.load(${o.id}): error load script ${n}!`,"color: red;"),t(e)},i.src=n,o.config.isSetTimestamp&&(i.src=getUrlWithTimestamp(n)),document.head.append(i)});o.config.debug&&console.warn(`Plugin ${o.id}: Скрипт ${n} уже загружен!`)},Plugin.prototype.getStylePromise=function(n){var o=this;return new Promise(function(e,t){var i;isAssetLoaded(n)?(o.config.debug&&console.warn(`Plugin ${o.id}: Стиль ${n} уже загружен`),e()):((i=document.createElement("link")).rel="stylesheet",i.type="text/css",i.media="all",i.href=n,o.config.isSetTimestamp&&(i.href=getUrlWithTimestamp(n)),document.head.append(i),e(i))})},Plugin.prototype.getAsyncScriptListPromise=function(e){e=e.map(this.getScriptPromise.bind(this)).filter(e=>void 0!==e);if(e.length)return Promise.all(e)},Plugin.prototype.getJsAssetsPromiseCallback=function(e=[]){var o=this;if(e.length)return function(){var n=new Promise(function(e,t){e()});return e.forEach(function(e,t,i){n=Array.isArray(e)?n.then(function(){return o.getAsyncScriptListPromise(e.map(e=>o.config.path+e))}):n.then(function(){return o.getScriptPromise(o.config.path+e)})}),n}},Plugin.prototype.__getRealId=function(e){var t,i=e.toLowerCase();if(this.id.toLowerCase()===i)return this.id;for(t of this.config.alias)if(i===t.toLowerCase())return this.id},Plugin.prototype.__is=function(e){return this.id===this.__getRealId(e)},Plugin.prototype.isLoaded=function(){return this.__checkState(stateList.loaded)},Plugin.prototype.isInstalled=function(){return this.__checkState(stateList.installed)},Plugin.prototype.require=function(){return this.isInstalled()||this.config.debug&&console.warn(`Plugin ${this.id}: not instaled!`),this.module.exports};var PluginManager=function(e){this.plugins={},this.global=e},__proto=PluginManager.prototype;function init(e){var o=new PluginManager(e);e.ready=o.ready.bind(o),e.loaded=o.loaded.bind(o),e.exec=o.exec.bind(o),e.require=o.require.bind(o),e.define=o.define.bind(o),e.PluginManager=PluginManager,o.register("pluginManager",{alias:["pm"],type:MD_TYPE.HMD,handler:function(e,t,i,n){return"object"==typeof window&&(window.__PluginManager__=o,window.__pmGlobal__=n),i.exports=o},onInstall:function(e){}}),o.install("pluginManager"),o.register("config",{type:MD_TYPE.HMD,handler:function(e,t,i,n){var o=document.currentScript;if(o)try{var s=new URL(o.src);defaultConfig.assetsPath=s.pathname.split("/").slice(0,-2).join("/")}catch(e){s=o.src.split("?")[0];defaultConfig.assetsPath=s.split("/").slice(0,-2).join("/")}o=n.config||{};n.config=Object.assign({},defaultConfig,o),"object"==typeof window&&(window.__pmConfig__=n.config),document.addEventListener("DOMContentLoaded",function(){console.log("%cDOMContentLoaded","color:#2053ff")}),window.addEventListener("load",e=>{console.log("%cWindowLoaded","color:#2053ff")})},onInstall:function(e){"object"==typeof window&&window.hasOwnProperty("__PluginManagerConfigHandler__")&&"function"==typeof __PluginManagerConfigHandler__&&o.registerPlugins(__PluginManagerConfigHandler__())}}),o.install("config")}PluginManager.prototype.registerPlugins=function(e){for(var t in e)e.hasOwnProperty(t)&&this.register(t,e[t]);return this},PluginManager.prototype.register=function(e,t={}){var i;"string"!=typeof e||""===e?console.warn("Invalid pluginId!",e):(i=this.__getPlugin(e))?i.register(t):((i=new Plugin(e,t)).setPluginManager(this),this.plugins[e]=i)},PluginManager.prototype.__getPlugin=function(e){var t,i;for(t in this.plugins)if(this.plugins.hasOwnProperty(t)&&(i=this.plugins[t]).__is(e))return i},PluginManager.prototype.__getDepsPromiseCallback=function(e=[]){var i=this,t=e.map(function(e){var t=i.__getPlugin(e);if(t)return t.install(),t.isInstalled()?void 0:t.promise;console.log(`%cPluginManager: plugin ${e} not found!`,"color: red;")}).filter(e=>void 0!==e);if(t.length)return function(){return Promise.all(t)}},PluginManager.prototype.__getRealIdList=function(e=[]){var t=this;return e.map(function(e){e=t.__getPlugin(e);if(e)return e.id})},PluginManager.prototype.exec=function(e,t,i=[],n=void 0){"function"==typeof e&&(n=i,i=t,t=e,e=[]),"string"==typeof e&&(e=[e]),void 0===n&&(n=this),void 0===i&&(i=[]),"function"==typeof t&&(global.config&&global.config.requiredDependencies&&(e=Array.from(new Set(e.concat(global.config.requiredDependencies)))),(e=this.__getDepsPromiseCallback(e))?e().then(function(){t.apply(n,i)}):t.apply(n,i))},__proto.define=function(e,t){var i=this,n=this,o=i.__getDepsPromiseCallback(e),s=function(){var t=[];return e.forEach(function(e){i.__getPlugin(e)?t.push(i.require(e)):t.push(void 0)}.bind(i)),t}.bind(i);o?o().then(function(){t.apply(n,s())}):t.apply(n,s())},__proto.ready=function(e,t=void 0){"function"==typeof e&&(t=e,e=[]),this.__ready(this.exec,[e,t="function"!=typeof t?function(){}:t],this)},__proto.__ready=function(e,t=[],i=window){i=i||this,/complete|interactive|loaded/.test(document.readyState)?e.apply(i,t):document.addEventListener("DOMContentLoaded",function(){e.apply(i,t)}.bind(this))},__proto.loaded=function(e,t=void 0){"function"==typeof e&&(t=e,e=[]),this.__loaded(this.exec,[e,t="function"!=typeof t?function(){}:t],this)},__proto.__loaded=function(e,t=[],i=window){i=i||this,/complete|interactive|loaded/.test(document.readyState)?e.apply(i,t):window.addEventListener("load",function(){e.apply(i,t)}.bind(this))},__proto.require=function(e,t){var i,n=this.__getPlugin(e);if(n)return e=n.id,i=n.module,n.install(t="function"!=typeof t?function(){}:t),i.exports;console.warn("PluginManager.require: plugin "+e+" not found!")},__proto.install=function(e,t){var i=this.__getPlugin(e);i?(e=i.id,i.module,i.install(t)):console.warn("PluginManager.install: plugin "+e+" not found!")},init(global)}(kit); \ No newline at end of file +var kit;kit=window.kit=window.kit||{};kit.service=kit.service||{};kit.config=kit.config||{};(function(global){var defaultConfig={version:"2.1",assetsPath:"",requiredDependencies:[],autoloadPluginList:[],debug:true};var stateList={undefined:0,registered:1,loading:3,loaded:4,installing:5,installed:6};var MD_TYPE={ES:"ES",UMD:"UMD",HMD:"HMD",default:"default"};function Plugin(pluginId,config={}){this.id=pluginId;this.state=stateList.undefined;this.state2=stateList.undefined;this.module={code:"",exports:{}};this.config={autoRequire:false,loadJsAfterModule:false,isSetTimestamp:true,path:"",module:"",type:"default",handler:undefined,onRegister:function(plugin){},onLoad:function(plugin){},onInstall:function(plugin){},js:[],css:[],alias:[],deps:[],debug:false};this.pluginManager=undefined,this.promise=new Promise(function(resolve,reject){resolve()});this.errors=[];this.register(config)}Plugin.prototype.setPluginManager=function(pluginManager){this.pluginManager=pluginManager};function isAssetLoaded(src){src=src.match(/^[^#?]*/)[0];return document.querySelector('script[src^="'+src+'"]')||document.querySelector('link[href^="'+src+'"]')||document.querySelector('meta[property="kit:file-load"][content="'+src+'"]')}function getUrlWithTimestamp(url){var t=((new Date).getTime()/1e3/3600>>0)*3600;try{var uri=new URL(url);uri.searchParams.append("__pm",String(t));url=uri.toString()}catch(e){url=String(url).split("?")[0];url=""+url+"?__pm"+t}return url}Plugin.prototype.queuePush=function(callbackPromise,argArr=[]){var self=this;if(typeof callbackPromise!=="function"){return}this.promise=this.promise.then(function(m){var p=callbackPromise.apply(this,argArr);if(p){return p}})};Plugin.prototype.__queue=function(admission,callback,argArr=[],context=undefined){var self=this;if(context===undefined){context=self}if(self.__checkState(admission)){callback.apply(context,argArr)}else{self.promise=self.promise.then(function(){return new Promise(function(resolve,reject){callback.apply(context,argArr);resolve()})}.bind(self))}};Plugin.prototype.__exec=function(admission,callback,argArr=[],context=undefined){var self=this;if(context===undefined){context=self}if(self.__checkState(admission)){callback.apply(context,argArr)}else{self.promise=self.promise.then(function(){callback.apply(context,argArr)}.bind(self))}};Plugin.prototype.__checkState=function(state,stateTo=undefined){if(stateTo===undefined){return this.state>=state}return this.state>=state&&this.state<=stateTo};Plugin.prototype.__check2State=function(state,stateTo=undefined){if(stateTo===undefined){return this.state2>=state}return this.state2>=state&&this.state2<=stateTo};Plugin.prototype.__getValidConfig=function(c={}){var config=Object.assign({},c);if(typeof config.onLoad!=="function"){config.onLoad=function(plugin){}}if(typeof config.onInstall!=="function"){config.onInstall=function(plugin){}}if(typeof config.onRegister!=="function"){config.onRegister=function(plugin){}}if(typeof config.path!=="string"){config.path=""}if(typeof config.js==="string"){config.js=[config.js]}else if(!Array.isArray(config.js)){config.js=[]}if(typeof config.css==="string"){config.css=[config.css]}else if(!Array.isArray(config.css)){config.css=[]}if(typeof config.alias==="string"){config.alias=[config.alias]}else if(!Array.isArray(config.alias)){config.alias=[]}config.autoRequire=config.hasOwnProperty("autoRequire")?!!config.autoRequire:false;config.loadJsAfterModule=config.hasOwnProperty("loadJsAfterModule")?!!config.loadJsAfterModule:false;config.isSetTimestamp=config.hasOwnProperty("isSetTimestamp")?!!config.isSetTimestamp:true;config.type=config.type||"default";if(typeof config.deps==="string"){config.deps=[config.deps]}else if(!Array.isArray(config.deps)){config.deps=[]}return config};Plugin.prototype.__setState=function(state,force=false){var self=this;if(force){self.state=state;return}if(self.__checkState(state)){self.state=state}};Plugin.prototype.register=function(config={}){var self=this;var pluginId=self.id;if(this.__checkState(stateList.installed)){throw new Error("Plugin "+pluginId+" уже невозможно конфигурировать ("+self.state+"/"+self.state2+")")}var handler;if(typeof config==="function"){handler=config;config=this.config;config.handler=handler;config.type=MD_TYPE.HMD}else{if(this.__checkState(stateList.loaded)||this.__check2State(stateList.loading)){throw new Error("Plugin "+pluginId+" уже невозможно конфигурировать ("+self.state+")")}if(typeof config==="object"){config=this.__getValidConfig(config)}else{throw new Error("Plugin.register: plugin "+pluginId+" is not a valid format")}Object.assign(this.config,config)}if(!this.__checkState(stateList.registered)){self.config.debug&&console.log(`Plugin ${self.id}: onRegister + event.`);this.state=stateList.registered;this.config.onRegister(this);var event=new CustomEvent("onRegister"+this.id+"Plugin",{detail:{plugin:this}});document.dispatchEvent(event)}if(config.autoRequire){}};Plugin.prototype.load=function(callback){var self=this;if(typeof callback!=="function"){callback=function(){}}var pluginId=self.id;if(!self.__checkState(stateList.registered)){console.warn(`Plugin.load(${pluginId}): is not register!.`);return self}if(self.__checkState(stateList.loaded)){callback();return self}if(self.__check2State(stateList.loading)){self.__exec(stateList.loaded,callback);return self}self.state2=stateList.loading;var config=self.config;var getModulePromiseCallback=function(){var src=config.path+config.module;if(typeof config.module==="string"&&config.module!==""&&config.type==="ES"){return function(){return self.getESModulePromise(src).then(function(m){m.__esModule=true;self.module.exports=m}.bind(self))}}else if(typeof config.module==="string"&&config.module!==""&&config.type==="UMD"){if(isAssetLoaded(src)){self.config.debug&&console.warn(`Plugin ${self.id}: Скрипт ${src} уже загружен!`);return}else{return function(){return self.httpGet(src).then(function(m){self.module.code=m}.bind(self))}}}else if(config.type==="HMD"&&!(config.hasOwnProperty("handler")&&typeof config.handler==="function")){return function(){return self.getScriptPromise(src)}}else if(typeof config.module==="string"&&config.module!==""&&config.type==="default"){if(isAssetLoaded(src)){self.config.debug&&console.warn(`Plugin ${self.id}: Скрипт ${src} уже загружен!`);return}else{return function(){return self.getScriptPromise(src)}}}return};config.css.forEach(function(item,i,array){self.getStylePromise(config.path+item)});var f0;if(self.pluginManager){f0=self.pluginManager.__getDepsPromiseCallback(self.config.deps);self.queuePush(f0)}var f1=getModulePromiseCallback();var f2=self.getJsAssetsPromiseCallback(config.js);if(config.loadJsAfterModule){self.queuePush(f1);self.queuePush(f2)}else{self.queuePush(f2);self.queuePush(f1)}if(!f0&&!f1&&!f2){self.state=stateList.loaded}self.__queue(stateList.loaded,function(){self.config.debug&&console.log(`Plugin ${self.id}: onLoad + event.`);if(!self.isLoaded()){self.state=stateList.loaded}config.onLoad.call(self,self);var event=new CustomEvent("onLoad"+self.id+"Plugin",{detail:{plugin:self}});document.dispatchEvent(event)});self.__exec(stateList.loaded,function(){callback()}.bind(self));return self};Plugin.prototype.install=function(callback){var self=this,global=self.pluginManager.global,require=self.pluginManager.require.bind(self.pluginManager);if(typeof callback!=="function"){callback=function(){}}var pluginId=self.id;if(!self.__checkState(stateList.registered)){console.warn(`Plugin ${pluginId}: is not register!`);return self}if(self.__checkState(stateList.installed)){callback();return self}if(self.__check2State(stateList.installing)){self.__exec(stateList.installed,callback);return self}if(!self.__checkState(stateList.loaded)){this.load()}self.state2=stateList.installing;var setGlobals=function(global,data){if(data===undefined){return}var pluginId=self.id;var aliasList=self.config.alias;if(!global.hasOwnProperty(pluginId)){global[pluginId]=data}if(Array.isArray(aliasList)&&aliasList.length){aliasList.forEach(function(alias){if(!global.hasOwnProperty(alias)){global[alias]=data}})}};var module=self.module;var installer=function(){var __exports=self.module.exports;if(self.config.type==="ES"&&typeof self.config.module==="string"&&self.config.module!==""){__exports=typeof self.module.exports==="object"&&self.module.exports.default!==undefined?self.module.exports.default:self.module.exports}else if(self.config.type==="UMD"&&typeof self.config.module==="string"&&self.config.module!==""){(function(require,exports,module,global){var self=global;eval(module.code)}).bind(global).call(global,require,self.module.exports,module,global);__exports=typeof self.module.exports==="object"&&self.module.exports.default!==undefined?self.module.exports.default:self.module.exports}else if(self.config.type==="HMD"&&typeof self.config.handler==="function"){__exports=self.config.handler.bind(global).call(global,require,self.module.exports,module,global);if(__exports===undefined&&self.module.exports){__exports=self.module.exports}}if(typeof global==="object"){setGlobals(global,__exports)}self.state=stateList.installed;console.log(`%cPlugin ${pluginId}: installed.`,"color: green;");self.config.onInstall.call(self,self);var event=new CustomEvent("onInstall"+self.id+"Plugin",{detail:{plugin:self}});document.dispatchEvent(event);return true}.bind(this);this.__queue(stateList.loaded,installer);this.__exec(stateList.loaded,function(){callback()});return self};Plugin.prototype.exec=function(callback,argArr=[],context=undefined){var self=this;if(context===undefined){context=self}if(!self.__checkState(stateList.installed)){self.load();self.install()}self.__exec(stateList.installed,callback,argArr,context)};Plugin.prototype.getESModulePromise=function(src){var self=this;return new Promise(function(resolve,reject){import(src).then(function(m){resolve(m)},function(error){self.errors.push(error);console.log(`%cPlugin ${self.id}: error import module!`,"color: red;");reject(error)})})};Plugin.prototype.httpGet=function(url){var self=this;return new Promise(function(resolve,reject){self.config.debug&&console.log(`Plugin ${self.id}: httpGet ${url}`);var url2=url;if(self.config.isSetTimestamp){url2=getUrlWithTimestamp(url)}p=fetch(url2,{method:"GET",redirect:"follow"}).then(function(response){if(response.ok){return response.text()}console.log(`%cPlugin.load(${self.id}): bad status ${response.status}!`,"color: red;");throw["bad status",response.status,response.statusText].filter().join(" ")},function(reason){reject("Network Error")}).then(function(data){resolve(data)},function(reason){reject(reason)})})};Plugin.prototype.getScriptPromise=function(src){var self=this;if(isAssetLoaded(src)){self.config.debug&&console.warn(`Plugin ${self.id}: Скрипт ${src} уже загружен!`);return undefined}return new Promise(function(resolve,reject){self.config.debug&&console.log(`Plugin ${self.id}: load script ${src}`);var script=document.createElement("script");script.async=true;script.onload=function(){resolve(script)};script.onerror=function(){var error=new Error(`Ошибка загрузки скрипта ${src}`);self.errors.push(error);console.log(`%cPlugin.load(${self.id}): error load script ${src}!`,"color: red;");reject(error)};script.src=src;if(self.config.isSetTimestamp){script.src=getUrlWithTimestamp(src)}document.head.append(script)})};Plugin.prototype.getStylePromise=function(src){var self=this;return new Promise(function(resolve,reject){if(isAssetLoaded(src)){self.config.debug&&console.warn(`Plugin ${self.id}: Стиль ${src} уже загружен`);resolve()}else{var link=document.createElement("link");link.rel="stylesheet";link.type="text/css";link.media="all";link.href=src;if(self.config.isSetTimestamp){link.href=getUrlWithTimestamp(src)}document.head.append(link);resolve(link)}})};Plugin.prototype.getAsyncScriptListPromise=function(list){var self=this;var pList=list.map(self.getScriptPromise.bind(self)).filter(p=>p!==undefined);if(pList.length){return Promise.all(pList)}return undefined};Plugin.prototype.getJsAssetsPromiseCallback=function(list=[]){var self=this;if(!list.length){return}return function(){var p=new Promise(function(resolve,reject){resolve()});list.forEach(function(item,i,array){if(Array.isArray(item)){p=p.then(function(){return self.getAsyncScriptListPromise(item.map(src=>self.config.path+src))})}else{p=p.then(function(){return self.getScriptPromise(self.config.path+item)})}});return p}};Plugin.prototype.__getRealId=function(pluginId){var self=this;var pluginIdLowerCase=pluginId.toLowerCase();if(self.id.toLowerCase()===pluginIdLowerCase){return self.id}var alias;for(alias of self.config.alias){if(pluginIdLowerCase===alias.toLowerCase()){return self.id}}return undefined};Plugin.prototype.__is=function(pluginId){var self=this;return self.id===self.__getRealId(pluginId)};Plugin.prototype.isLoaded=function(){var self=this;return self.__checkState(stateList.loaded)};Plugin.prototype.isInstalled=function(){var self=this;return self.__checkState(stateList.installed)};Plugin.prototype.require=function(){var self=this;if(!self.isInstalled()){self.config.debug&&console.warn(`Plugin ${self.id}: not instaled!`)}return self.module.exports};var PluginManager=function(global){this.plugins={};this.global=global};var __proto=PluginManager.prototype;PluginManager.prototype.registerPlugins=function(plugins){for(var pluginId in plugins){if(plugins.hasOwnProperty(pluginId)){this.register(pluginId,plugins[pluginId])}}return this};PluginManager.prototype.register=function(pluginId,config={}){if(typeof pluginId!=="string"||pluginId===""){console.warn(`Invalid pluginId!`,pluginId);return}var plugin=this.__getPlugin(pluginId);if(plugin){plugin.register(config)}else{plugin=new Plugin(pluginId,config);plugin.setPluginManager(this);this.plugins[pluginId]=plugin}};PluginManager.prototype.__getPlugin=function(pluginId){var self=this;var pid,plugin;for(pid in self.plugins){if(self.plugins.hasOwnProperty(pid)){plugin=self.plugins[pid];if(plugin.__is(pluginId)){return plugin}}}return undefined};PluginManager.prototype.__getDepsPromiseCallback=function(pluginIdList=[]){var self=this;var pList=pluginIdList.map(function(pluginId){var plugin=self.__getPlugin(pluginId);if(plugin){plugin.install();if(plugin.isInstalled()){return undefined}return plugin.promise}console.log(`%cPluginManager: plugin ${pluginId} not found!`,"color: red;");return undefined}).filter(p=>p!==undefined);if(!pList.length){return undefined}return function(){return Promise.all(pList)}};PluginManager.prototype.__getRealIdList=function(pluginIdList=[]){var self=this;var pList=pluginIdList.map(function(pluginId){var plugin=self.__getPlugin(pluginId);if(plugin){return plugin.id}return undefined});return pList};PluginManager.prototype.exec=function(deps,callback,argArr=[],context=undefined){var self=this;if(typeof deps==="function"){context=argArr;argArr=callback;callback=deps;deps=[]}if(typeof deps==="string"){deps=[deps]}if(context===undefined){context=self}if(typeof argArr==="undefined"){argArr=[]}if(typeof callback!=="function"){callback=function(){}}if(global.config&&global.config.requiredDependencies){deps=Array.from(new Set(deps.concat(global.config.requiredDependencies)))}var depsPromiseCallback=self.__getDepsPromiseCallback(deps);if(depsPromiseCallback){return depsPromiseCallback().then(function(){return new Promise(function(resolve,reject){callback.apply(context,argArr);resolve()})})}else{return new Promise(function(resolve,reject){callback.apply(context,argArr);resolve()})}};__proto.define=function(deps,callback){var self=this;var context=this;if(typeof deps==="string"){deps=[deps]}if(typeof callback!=="function"){callback=function(){}}var depsPromiseCallback=self.__getDepsPromiseCallback(deps);var getArgArr=function(){var argArr=[];deps.forEach(function(pluginId){var plugin=self.__getPlugin(pluginId);if(plugin){argArr.push(self.require(pluginId));return}argArr.push(undefined)}.bind(self));return argArr}.bind(self);if(depsPromiseCallback){return depsPromiseCallback().then(function(){return new Promise(function(resolve,reject){callback.apply(context,getArgArr());resolve()})})}else{return new Promise(function(resolve,reject){callback.apply(context,getArgArr());resolve()})}};__proto.ready=function(deps=[],callback=undefined){var self=this;if(typeof deps==="function"){callback=deps;deps=[]}if(typeof callback!=="function"){callback=function(){}}return self.__ready(self.exec,[deps,callback],self)};__proto.__ready=function(fn,args=[],context=window){var promise;var self=this;context=context||this;if(/complete|interactive|loaded/.test(document.readyState)){promise=new Promise(function(resolve,reject){fn.apply(context,args);resolve()})}else{promise=new Promise(function(resolve,reject){document.addEventListener("DOMContentLoaded",function(){resolve()}.bind(this))}).then(function(){return fn.apply(context,args)})}return promise};__proto.loaded=function(deps=[],callback=undefined){var self=this;if(typeof deps==="function"){callback=deps;deps=[]}if(typeof callback!=="function"){callback=function(){}}return self.__loaded(self.exec,[deps,callback],self)};__proto.__loaded=function(fn,args=[],context=window){var promise;var self=this;context=context||this;if(/complete|interactive|loaded/.test(document.readyState)){promise=new Promise(function(resolve,reject){fn.apply(context,args);resolve()})}else{promise=new Promise(function(resolve,reject){window.addEventListener("load",function(){resolve()}.bind(this))}).then(function(){return fn.apply(context,args)})}return promise};__proto.require=function(pluginId,callback){var plugin=this.__getPlugin(pluginId);if(!plugin){console.warn("PluginManager.require: plugin "+pluginId+" not found!");return undefined}pluginId=plugin.id;var module=plugin.module;if(typeof callback!=="function"){callback=function(){}}plugin.install(callback);return module.exports};__proto.install=function(pluginId,callback){var plugin=this.__getPlugin(pluginId);if(!plugin){console.warn("PluginManager.install: plugin "+pluginId+" not found!");return undefined}pluginId=plugin.id;var module=plugin.module;plugin.install(callback)};function init(global){var manager=new PluginManager(global);global.ready=manager.ready.bind(manager);global.loaded=manager.loaded.bind(manager);global.exec=manager.exec.bind(manager);global.require=manager.require.bind(manager);var pm;global.define=manager.define.bind(manager);global.PluginManager=PluginManager;manager.register("pluginManager",{alias:["pm"],type:MD_TYPE.HMD,handler:function(require,exports,module,global){if(typeof window==="object"){window.__PluginManager__=manager;window.__pmGlobal__=global}return module.exports=manager},onInstall:function(plugin){}});manager.install("pluginManager");manager.register("config",{type:MD_TYPE.HMD,handler:function(require,exports,module,global){var script=document.currentScript;if(script){try{var uri=new URL(script.src);defaultConfig.assetsPath=uri.pathname.split("/").slice(0,-2).join("/")}catch(e){var path=script.src.split("?")[0];defaultConfig.assetsPath=path.split("/").slice(0,-2).join("/")}}var config=global.config||{};global.config=Object.assign({},defaultConfig,config);if(typeof window==="object"){window.__pmConfig__=global.config}document.addEventListener("DOMContentLoaded",function(){console.log("%cDOMContentLoaded","color:#2053ff")});window.addEventListener("load",event=>{console.log("%cWindowLoaded","color:#2053ff")})},onInstall:function(plugin){if(typeof window==="object"){if(window.hasOwnProperty("__PluginManagerConfigHandler__")&&typeof __PluginManagerConfigHandler__==="function"){manager.registerPlugins(__PluginManagerConfigHandler__())}}}});manager.install("config")}init(global)})(kit); \ No newline at end of file diff --git a/images/colors/black.png b/images/colors/black.png new file mode 100644 index 0000000000000000000000000000000000000000..9b06e43bbfca719fc78bfd10b5f800fb7e9a90eb GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Ak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X>^xl@Ln>~)IcF%yz`((x@O58(n(z*52PP}ezs6rDO~VbY crLsyeI0Z8l{8K)97-$lMr>mdKI;Vst0NJ87lmGw# literal 0 HcmV?d00001 diff --git a/images/colors/brown.png b/images/colors/brown.png new file mode 100644 index 0000000000000000000000000000000000000000..07e6016d38e0d04b5f9929bec60a6875b6c982ea GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Ak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X>^)r^Ln>~)ImgJ$V8Fq=p|JXgv%Z<%C9MqK=g#^UFX0Be du0%1iF`TJoblvA-vlnO-gQu&X%Q~loCIBG(Jc0lK literal 0 HcmV?d00001 diff --git a/images/colors/colors.psd b/images/colors/colors.psd index c11e3f3dbcdcc8eba21c5c6367befd5990a03d21..9a817647b505998ad39d6a98de0c2b9419bbab52 100644 GIT binary patch literal 61142 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 delta 410 zcmcb1mwD4A#t8~s(eEsrJbhVI85kxDWQ*{CIVuc5U{<#=?mg3FPG%k!ODhB8$+664 z2+m^W-;?9n)F#WbvTZ)aGL32T6|OHvoA24GG8!_1jbH*9!N39{zFT@n{?2@PI{XL&1d8$lV zGRad_Q)QB;|NjeEMK59%z4Yu-Op*8g%I6zB3s0&nM~)IcLboz`((*u=Q`$>;w0ig)Vr$n!j@T7Cb;t b`v8NbC*yxj^T&&T1~GWL`njxgN@xNAe;GOb literal 0 HcmV?d00001 diff --git a/images/colors/green.png b/images/colors/green.png new file mode 100644 index 0000000000000000000000000000000000000000..634c90686d97c6c3f0a3faea458c7591416f85e2 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Ak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XY&=~YLn>~)ImgJ$z`()0Ap8HhC}(pIht#3~^(Z`Gew6kB Z28Y#*$&NnCbwG0%JYD@<);T3K0RU0QEd~Gp literal 0 HcmV?d00001 diff --git a/images/colors/mix.jpg b/images/colors/mix.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81e9ec8e905cf7c2e42b26bae04d47a3088b5bae GIT binary patch literal 2176 zcmaKnc|6qn8pnULBVlChlr4>ju?*QMF)ATzBtywiT%1u6k`Re&Mq?WshepzfEES_H zWy^BLZZI87w#cq*&6#em+qr+;_aC3v^L;+g=XpI}&JbrD5VyEV@BsiEP6glr{(-Xq zAWss#{ciyv0LpD&007PxK)~#Bpw|`Pay_>L;*0?I0MIYM+zJflDp!620YkWO1^NRB z>^~rW!1IeAaqct>0)Zi5P}u)CzefIl!Knw3Jb)&k2>~GiFcJhof;jJhQUKs?g@FF~ z5DzaL0p$ZjVEaG-M9=+;MKmpRx*Jiip;;Q%K-tzF`CR|jK6pORA$Fke zM#~wE8r+kr<3__6-sd&D5;%H;hu<|05IpGQVya$=(oPW}naR35mpu10T2AoL zT?K``2M3qJW%eS9o=bn7pl(@q;XA&2(q?25Hk#}TR9@V+Z{?~0Wu*Cw76}15S)PNF!A>*nbtpad-5fW&X!{;jbfXuG<#xI z&S=2HuBLo+?|9v{$hR`kM^V$d{YB{$}$Jy*4L7$MgMI?wjFvd%||Yf8dyOXTJj zge)iLkcW|iu`Roo0_%#G_gq{!fX(cucsF)RPTTCm+?#dns7Oj*`uKa4i|3L2b^bm? zy6Wk(#|NF!eft8=gxF~9W#5dd9hN!ji8^Hd<+YkyO~VuV>=R<)3!IxZ^cq6dIE+Y7 z+wc^k_iuSd)>vL0{B?eA0`v8r#T^*9+6S<+iQPffeUX+NN) zs7x1HN_8t{CMkwGQeJzv=(0#_iW71%OzE}rX7=b@Jx}~e+|rW}W#-gfN}uCc%%5h% zrK0l#$rD2!a5O4zl3`~%%#t@*d2JG2P*bn49`*8wuhFXWSa+#$(i(jytdw;R(bG=B zmOV=pBnMztu6Bv(!yeLXyL~!&2~&B_PoZ7vtHS|fL5c}!l#ze`@ zn!f?xN)<|-kLT;`0~Zz$Bf!FW8n=r^H&qiH{UAqEB}h)O)#MCWeBz}7hE;`wP`s$& za;lG!^7E=!wi7th=uqawqYLaT-;F+ck)%P%l9tVKuR<>RJK3N2I&OnT1{lLMdhO?G z?3zW-gE%E8)iemZDJvEs*#|!567lTT!;)Cl-VflGXa2Mx<;lY$gBa{`{zXlhWcK7~ zJ9`m$Bk!806g6AT*eiN=qs>v9m%8sD^^)sKSeeWcxpQSaZFC3uMolaOkDTYx#OnVzj%A z+B@9%I6&fO*jc5P1{fbuIJ1kH@vR-Zehj9V$#agV8wa1yGA>LZp$4^YCz#PKGA~vs z95(C=RO9pIPml`J_~v_6G?2-l%!^#95T|UvY;q))`?(Q@v?vL-bid(h zXDw1@s$fI)NS3bZ$@=SFz%!8&n)37?S7LifR;l9e(H)O7`t9#-xT4u%*q*n_y>T?u47VvwIu_Boz5FfkV6oolRTnIN9V4-VXxk*PkE}k`5`e>$SW{lO-hM6KHx6wE%Sgq zLJ8OZ7rb^3kIMpC-ve|M;#n7_`xU|R(bL|s*csu)!KKe;X^A-ox*pa5^i!rjK4v`6 zIpDb8=9t#JL82{k|ILPRy!N$MYrd(#s(IlALrkW8T2~HstXPQ;foDqzXpfQA=Ss@r z(?UhMnaDMp>w)3T=$^yB7l+|PBS}%qkpr8#RA|IFZD*)Fudymmd3A(Y$-ng5=5|ER z?QfEUUbn@otGk6lCw1dL8d!GLT2>78%_W;x?AlrcHtKCO5P~8{!Y}df4AfDBwo)36 z;nL+@w&7NblPh?yehv`ixEtBSP#5$_lFLe1yp%p4=P3IQ)08f*r02{53>ZdBW4S8^ zlG4Wp4}K)<3Jf(#d%3TWcl>jx0>)MjRR1maJ;SRe=^jah@UtACS85>?E{>OY$5h`| d->i)q0H@6P-%^)r^Ln>~)ImgJ$V8Fq=q42-i1x_=+OIjJe&z~)ImgJ$z`()0Ap8HhC}(pI2VcEc8JW1j-mJ9@ a%nXjJ7?Z2s2%Q3&!{F)a=d#Wzp$P!A5HH67 literal 0 HcmV?d00001 diff --git a/images/colors/violet.png b/images/colors/violet.png new file mode 100644 index 0000000000000000000000000000000000000000..af9e7442a1259b8e93e495ee1166a2b2d855163f GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Ak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X>^)r^Ln>~)IcLboV8Fq=!RV<4JL_*tA=Z`Wp3Iv*c?%v; d7uLYY@b4ev;{#iqih)Kkc)I$ztaD0e0szN8J1GDF literal 0 HcmV?d00001 diff --git a/images/colors/white.png b/images/colors/white.png new file mode 100644 index 0000000000000000000000000000000000000000..05e762087c53713f3dbdec824a3faee7e3e93fe2 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Ak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XY&~5ZLn>~)IcLboz`((*u(kgA%meqCg)Vr$n!j@T7Cb;t b`v3!@26N);xSj<-gBUzr{an^LB{Ts5dObO% literal 0 HcmV?d00001 diff --git a/images/colors/yellow.png b/images/colors/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..07b0f8458cea29b81c5ba43bf1cbc90917975df9 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Ak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X>^)r^Ln>~)ImgJ$V8Fq=q40m)Lrdk6eN1>#~Ywg44$rjF6*2UngAw5Jn;Yk literal 0 HcmV?d00001 diff --git a/tests/pluginManagerTest.php b/tests/pluginManagerTest.php new file mode 100644 index 0000000..2759d9d --- /dev/null +++ b/tests/pluginManagerTest.php @@ -0,0 +1,58 @@ + + + + +
+
+
+', 100000); diff --git a/tests/templaterTest.php b/tests/templaterTest.php index 03f8abb..9789cf3 100644 --- a/tests/templaterTest.php +++ b/tests/templaterTest.php @@ -1,6 +1,10 @@ - - +service()->assets()->setPlugins([ 'kit:config', 'kit:flex-kit', @@ -12,11 +16,14 @@ if(\Bitrix\Main\Loader::includeModule('wt.core')) { 'kit:theme', ])->render(); } +/** + * @global CMain $APPLICATION + */ $APPLICATION->ShowHead(); ?>
-
templater()->render('kit:input', [ 'TYPE' => 'text', 'HINT' => '', @@ -25,7 +32,7 @@ $APPLICATION->ShowHead(); 'LABEL' => 'value = дв ковычки', ]); ?>
-
templater()->render('kit:input', [ 'TYPE' => 'text', 'HINT' => '', @@ -34,7 +41,7 @@ $APPLICATION->ShowHead(); 'LABEL' => 'value = одинарные ковычки', ]); ?>
-
templater()->render('kit:input', [ 'TYPE' => 'text', 'HINT' => '', @@ -43,7 +50,7 @@ $APPLICATION->ShowHead(); 'LABEL' => 'value = спецсимволы', ]); ?>
-
templater()->render('kit:input', [ 'TYPE' => 'text', 'HINT' => '', @@ -52,7 +59,7 @@ $APPLICATION->ShowHead(); 'LABEL' => 'value = лев пр слеши, лев пр стрелки, дв од кав', ]); ?>
-
templater()->render('kit:input', [ 'TYPE' => 'text', 'HINT' => '',