overlay-grid.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. var Immutable = require("immutable");
  2. var fs = require("fs");
  3. var path = require("path");
  4. var baseHorizontal = fs.readFileSync(path.resolve(__dirname, "css/grid-overlay-horizontal.css"), "utf8");
  5. var baseVertical = fs.readFileSync(path.resolve(__dirname, "css/grid-overlay-vertical.css"), "utf8");
  6. function template (string, obj) {
  7. obj = obj || {};
  8. return string.replace(/\{\{(.+?)\}\}/g, function () {
  9. if (obj[arguments[1]]) {
  10. return obj[arguments[1]];
  11. }
  12. return "";
  13. });
  14. }
  15. function getCss(opts) {
  16. var base = opts.selector + " {position:relative;}";
  17. if (opts.horizontal) {
  18. base += baseHorizontal;
  19. }
  20. if (opts.vertical) {
  21. base += baseVertical;
  22. }
  23. return template(base, opts);
  24. }
  25. module.exports.init = function (ui) {
  26. const TRANSMIT_EVENT = "ui:remote-debug:css-overlay-grid";
  27. const READY_EVENT = "ui:remote-debug:css-overlay-grid:ready";
  28. const OPT_PATH = ["remote-debug", "overlay-grid"];
  29. var defaults = {
  30. offsetY: "0",
  31. offsetX: "0",
  32. size: "16px",
  33. selector: "body",
  34. color: "rgba(0, 0, 0, .2)",
  35. horizontal: true,
  36. vertical: true
  37. };
  38. ui.clients.on("connection", function (client) {
  39. client.on(READY_EVENT, function () {
  40. client.emit(TRANSMIT_EVENT, {
  41. innerHTML: getCss(ui.options.getIn(OPT_PATH).toJS())
  42. });
  43. });
  44. });
  45. ui.setOptionIn(OPT_PATH, Immutable.Map({
  46. name: "overlay-grid",
  47. title: "Overlay CSS Grid",
  48. active: false,
  49. tagline: "Add an adjustable CSS overlay grid to your webpage",
  50. innerHTML: ""
  51. }).merge(defaults));
  52. var methods = {
  53. toggle: function (value) {
  54. if (value !== true) {
  55. value = false;
  56. }
  57. if (value) {
  58. ui.setOptionIn(OPT_PATH.concat("active"), true);
  59. ui.enableElement({name: "overlay-grid-js"});
  60. } else {
  61. ui.setOptionIn(OPT_PATH.concat("active"), false);
  62. ui.disableElement({name: "overlay-grid-js"});
  63. ui.clients.emit("ui:element:remove", {id: "__bs_overlay-grid-styles__"});
  64. }
  65. },
  66. adjust: function (data) {
  67. ui.setOptionIn(OPT_PATH, ui.getOptionIn(OPT_PATH).merge(data));
  68. ui.clients.emit(TRANSMIT_EVENT, {
  69. innerHTML: getCss(ui.options.getIn(OPT_PATH).toJS())
  70. });
  71. },
  72. "toggle:axis": function (item) {
  73. ui.setOptionIn(OPT_PATH.concat([item.axis]), item.value);
  74. ui.clients.emit(TRANSMIT_EVENT, {
  75. innerHTML: getCss(ui.options.getIn(OPT_PATH).toJS())
  76. });
  77. },
  78. event: function (event) {
  79. methods[event.event](event.data);
  80. }
  81. };
  82. return methods;
  83. };