skintools.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. (function (global, factory) {
  2. if (typeof define === "function" && define.amd) {
  3. define("/Plugin/skintools", [], factory);
  4. } else if (typeof exports !== "undefined") {
  5. factory();
  6. } else {
  7. var mod = {
  8. exports: {}
  9. };
  10. factory();
  11. global.PluginSkintools = mod.exports;
  12. }
  13. })(this, function () {
  14. "use strict";
  15. if (window.localStorage) {
  16. var getLevel = function getLevel(url, tag) {
  17. var arr = url.split('/').reverse();
  18. var level;
  19. var path = '';
  20. for (var i = 0; i < arr.length; i++) {
  21. if (arr[i] === tag) {
  22. level = i;
  23. }
  24. }
  25. for (var m = 1; m < level; m++) {
  26. path += '../';
  27. }
  28. return path;
  29. };
  30. var layout = 'iconbar';
  31. var settingsName = "remark.".concat(layout, ".skinTools");
  32. var settings = localStorage.getItem(settingsName);
  33. if (settings) {
  34. if (settings[0] === '{') {
  35. settings = JSON.parse(settings);
  36. }
  37. if (settings.primary && settings.primary !== 'primary') {
  38. var head = document.head;
  39. var link = document.createElement('link');
  40. link.type = 'text/css';
  41. link.rel = 'stylesheet';
  42. link.href = "".concat(getLevel(window.location.pathname, layout), "assets/skins/").concat(settings.primary, ".css");
  43. link.id = 'skinStyle';
  44. head.appendChild(link);
  45. }
  46. if (settings.sidebar && settings.sidebar === 'dark') {
  47. var menubarFn = setInterval(function () {
  48. var menubar = document.getElementsByClassName('site-menubar');
  49. if (menubar.length > 0) {
  50. clearInterval(menubarFn);
  51. menubar[0].className += ' site-menubar-dark';
  52. }
  53. }, 5);
  54. }
  55. var navbarFn = setInterval(function () {
  56. var navbar = document.getElementsByClassName('site-navbar');
  57. if (navbar.length > 0) {
  58. clearInterval(navbarFn);
  59. if (settings.navbar && settings.navbar !== 'primary') {
  60. navbar[0].className += " bg-".concat(settings.navbar, "-600");
  61. }
  62. if (settings.navbarInverse && settings.navbarInverse !== 'false') {
  63. navbar[0].className += ' navbar-inverse';
  64. }
  65. }
  66. }, 5);
  67. }
  68. if (document.addEventListener) {
  69. document.addEventListener('DOMContentLoaded', function () {
  70. var $body = $(document.body);
  71. var $doc = $(document);
  72. var $win = $(window);
  73. var Storage = {
  74. set: function set(key, value) {
  75. if (!window.localStorage) {
  76. return null;
  77. }
  78. if (!key || !value) {
  79. return null;
  80. }
  81. if (Object(value) === value) {
  82. value = JSON.stringify(value);
  83. }
  84. localStorage.setItem(key, value);
  85. },
  86. get: function get(key) {
  87. if (!window.localStorage) {
  88. return null;
  89. }
  90. var value = localStorage.getItem(key);
  91. if (!value) {
  92. return null;
  93. }
  94. if (value[0] === '{') {
  95. value = JSON.parse(value);
  96. }
  97. return value;
  98. }
  99. };
  100. var Skintools = {
  101. tpl: '<div class="site-skintools">' + '<div class="site-skintools-inner">' + '<div class="site-skintools-toggle">' + '<i class="icon wb-settings primary-600"></i>' + '</div>' + '<div class="site-skintools-content">' + '<div class="nav-tabs-horizontal">' + '<ul role="tablist" class="nav nav-tabs nav-tabs-line">' + '<li role="presentation" class="nav-item"><a class="nav-link active" role="tab" aria-controls="skintoolsSidebar" href="#skintoolsSidebar" data-toggle="tab" aria-expanded="true">Sidebar</a></li>' + '<li class="nav-item" role="presentation"><a class="nav-link" role="tab" aria-controls="skintoolsNavbar" href="#skintoolsNavbar" data-toggle="tab" aria-expanded="false">Navbar</a></li>' + '<li class="nav-item" role="presentation"><a class="nav-link" role="tab" aria-controls="skintoolsPrimary" href="#skintoolsPrimary" data-toggle="tab" aria-expanded="false">Primary</a></li>' + '</ul>' + '<div class="tab-content">' + '<div role="tabpanel" id="skintoolsSidebar" class="tab-pane active"></div>' + '<div role="tabpanel" id="skintoolsNavbar" class="tab-pane"></div>' + '<div role="tabpanel" id="skintoolsPrimary" class="tab-pane"></div>' + '<button class="btn btn-outline btn-block btn-primary mt-20" id="skintoolsReset" type="button">Reset</button>' + '</div>' + '</div>' + '</div>' + '</div>' + '</div>',
  102. skintoolsSidebar: ['dark', 'light'],
  103. skintoolsNavbar: ['primary', 'brown', 'cyan', 'green', 'grey', 'indigo', 'orange', 'pink', 'purple', 'red', 'teal', 'yellow'],
  104. navbarSkins: 'bg-primary-600 bg-brown-600 bg-cyan-600 bg-green-600 bg-grey-600 bg-indigo-600 bg-orange-600 bg-pink-600 bg-purple-600 bg-red-600 bg-teal-600 bg-yellow-700',
  105. skintoolsPrimary: ['primary', 'brown', 'cyan', 'green', 'grey', 'indigo', 'orange', 'pink', 'purple', 'red', 'teal', 'yellow'],
  106. storageKey: settingsName,
  107. defaultSettings: {
  108. sidebar: 'light',
  109. navbar: 'indigo',
  110. navbarInverse: 'true',
  111. primary: 'indigo'
  112. },
  113. init: function init() {
  114. var self = this;
  115. this.path = getLevel(window.location.pathname, layout);
  116. this.overflow = false;
  117. this.$siteSidebar = $('.site-menubar');
  118. this.$siteNavbar = $('.site-navbar');
  119. this.$container = $(this.tpl);
  120. this.$toggle = $('.site-skintools-toggle', this.$container);
  121. this.$content = $('.site-skintools-content', this.$container);
  122. this.$tabContent = $('.tab-content', this.$container);
  123. this.$sidebar = $('#skintoolsSidebar', this.$content);
  124. this.$navbar = $('#skintoolsNavbar', this.$content);
  125. this.$primary = $('#skintoolsPrimary', this.$content);
  126. this.build(this.$sidebar, this.skintoolsSidebar, 'skintoolsSidebar', 'radio', 'Sidebar Skins');
  127. this.build(this.$navbar, ['inverse'], 'skintoolsNavbar', 'checkbox', 'Navbar Type');
  128. this.build(this.$navbar, this.skintoolsNavbar, 'skintoolsNavbar', 'radio', 'Navbar Skins');
  129. this.build(this.$primary, this.skintoolsPrimary, 'skintoolsPrimary', 'radio', 'Primary Skins');
  130. this.$container.appendTo($body);
  131. this.$toggle.on('click', function () {
  132. self.$container.toggleClass('is-open');
  133. });
  134. $('#skintoolsSidebar input').on('click', function () {
  135. self.sidebarEvents(this);
  136. });
  137. $('#skintoolsNavbar input').on('click', function () {
  138. self.navbarEvents(this);
  139. });
  140. $('#skintoolsPrimary input').on('click', function () {
  141. self.primaryEvents(this);
  142. });
  143. $('#skintoolsReset').on('click', function () {
  144. self.reset();
  145. });
  146. this.initLocalStorage();
  147. },
  148. initLocalStorage: function initLocalStorage() {
  149. var self = this;
  150. this.settings = Storage.get(this.storageKey);
  151. if (this.settings === null) {
  152. this.settings = $.extend(true, {}, this.defaultSettings);
  153. Storage.set(this.storageKey, this.settings);
  154. }
  155. if (this.settings && $.isPlainObject(this.settings)) {
  156. $.each(this.settings, function (n, v) {
  157. switch (n) {
  158. case 'sidebar':
  159. $("input[value=\"".concat(v, "\"]"), self.$sidebar).prop('checked', true);
  160. self.sidebarImprove(v);
  161. break;
  162. case 'navbar':
  163. $("input[value=\"".concat(v, "\"]"), self.$navbar).prop('checked', true);
  164. self.navbarImprove(v);
  165. break;
  166. case 'navbarInverse':
  167. var flag = v !== 'false';
  168. $('input[value="inverse"]', self.$navbar).prop('checked', flag);
  169. self.navbarImprove('inverse', flag);
  170. break;
  171. case 'primary':
  172. $("input[value=\"".concat(v, "\"]"), self.$primary).prop('checked', true);
  173. self.primaryImprove(v);
  174. break;
  175. }
  176. });
  177. }
  178. },
  179. updateSetting: function updateSetting(item, value) {
  180. this.settings[item] = value;
  181. Storage.set(this.storageKey, this.settings);
  182. },
  183. title: function title(content) {
  184. return $("<h4 class=\"site-skintools-title\">".concat(content, "</h4>"));
  185. },
  186. item: function item(type, name, id, content) {
  187. var item = "<div class=\"".concat(type, "-custom ").concat(type, "-").concat(content, "\"><input id=\"").concat(id, "\" type=\"").concat(type, "\" name=\"").concat(name, "\" value=\"").concat(content, "\"><label for=\"").concat(id, "\">").concat(content, "</label></div>");
  188. return $(item);
  189. },
  190. build: function build($wrap, data, name, type, title) {
  191. if (title) {
  192. this.title(title).appendTo($wrap);
  193. }
  194. for (var i = 0; i < data.length; i++) {
  195. this.item(type, name, "".concat(name, "-").concat(data[i]), data[i]).appendTo($wrap);
  196. }
  197. },
  198. sidebarEvents: function sidebarEvents(self) {
  199. var val = $(self).val();
  200. this.sidebarImprove(val);
  201. this.updateSetting('sidebar', val);
  202. },
  203. navbarEvents: function navbarEvents(self) {
  204. var val = $(self).val();
  205. var checked = $(self).prop('checked');
  206. this.navbarImprove(val, checked);
  207. if (val === 'inverse') {
  208. this.updateSetting('navbarInverse', checked.toString());
  209. } else {
  210. this.updateSetting('navbar', val);
  211. }
  212. },
  213. primaryEvents: function primaryEvents(self) {
  214. var val = $(self).val();
  215. this.primaryImprove(val);
  216. this.updateSetting('primary', val);
  217. },
  218. sidebarImprove: function sidebarImprove(val) {
  219. if (val === 'light') {
  220. // this.$siteSidebar.removeClass('site-menubar-dark');
  221. this.$siteSidebar.removeClass('site-menubar-dark').addClass("site-menubar-".concat(val));
  222. } else if (val === 'dark') {
  223. // this.$siteSidebar.addClass('site-menubar-' + val);
  224. this.$siteSidebar.removeClass('site-menubar-light');
  225. }
  226. },
  227. navbarImprove: function navbarImprove(val, checked) {
  228. if (val === 'inverse') {
  229. checked ? this.$siteNavbar.addClass('navbar-inverse') : this.$siteNavbar.removeClass('navbar-inverse');
  230. } else {
  231. var bg = "bg-".concat(val, "-600");
  232. if (val === 'yellow') {
  233. bg = 'bg-yellow-700';
  234. }
  235. if (val === 'primary') {
  236. bg = '';
  237. }
  238. this.$siteNavbar.removeClass(this.navbarSkins).addClass(bg);
  239. }
  240. },
  241. primaryImprove: function primaryImprove(val) {
  242. var $link = $('#skinStyle', $('head'));
  243. var href = "".concat(this.path, "assets/skins/").concat(val, ".css");
  244. if (val === 'primary') {
  245. $link.remove();
  246. return;
  247. }
  248. if ($link.length === 0) {
  249. $('head').append("<link id=\"skinStyle\" href=\"".concat(href, "\" rel=\"stylesheet\" type=\"text/css\"/>"));
  250. } else {
  251. $link.attr('href', href);
  252. }
  253. },
  254. reset: function reset() {
  255. localStorage.clear();
  256. this.initLocalStorage();
  257. }
  258. };
  259. Skintools.init();
  260. });
  261. }
  262. }
  263. });