component-classes.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.ClassList = void 0;
  7. exports.default = _default;
  8. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  9. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  10. var _indexOf = _interopRequireDefault(require("lodash/indexOf"));
  11. /**
  12. * source by `component-classes`
  13. * https://github.com/component/classes.git
  14. */
  15. /**
  16. * Whitespace regexp.
  17. */
  18. var re = /\s+/;
  19. var ClassList = /*#__PURE__*/function () {
  20. function ClassList(el) {
  21. (0, _classCallCheck2.default)(this, ClassList);
  22. if (!el || !el.nodeType) {
  23. throw new Error('A DOM element reference is required');
  24. }
  25. this.el = el;
  26. this.list = el.classList;
  27. }
  28. (0, _createClass2.default)(ClassList, [{
  29. key: "array",
  30. value: function array() {
  31. var className = this.el.getAttribute('class') || '';
  32. var str = className.replace(/^\s+|\s+$/g, '');
  33. var arr = str.split(re);
  34. if ('' === arr[0]) arr.shift();
  35. return arr;
  36. }
  37. /**
  38. * Add class `name` if not already present.
  39. *
  40. * @param {String} name
  41. * @return {ClassList}
  42. * @api public
  43. */
  44. }, {
  45. key: "add",
  46. value: function add(name) {
  47. // classList
  48. if (this.list) {
  49. this.list.add(name);
  50. return this;
  51. }
  52. // fallback
  53. var arr = this.array();
  54. var i = (0, _indexOf.default)(arr, name);
  55. if (!~i) arr.push(name);
  56. this.el.className = arr.join(' ');
  57. return this;
  58. }
  59. /**
  60. * Remove class `name` when present, or
  61. * pass a regular expression to remove
  62. * any which match.
  63. *
  64. * @param {String|RegExp} name
  65. * @return {ClassList}
  66. * @api public
  67. */
  68. }, {
  69. key: "remove",
  70. value: function remove(name) {
  71. if ('[object RegExp]' === toString.call(name)) {
  72. return this._removeMatching(name);
  73. }
  74. // classList
  75. if (this.list) {
  76. this.list.remove(name);
  77. return this;
  78. }
  79. // fallback
  80. var arr = this.array();
  81. var i = (0, _indexOf.default)(arr, name);
  82. if (~i) arr.splice(i, 1);
  83. this.el.className = arr.join(' ');
  84. return this;
  85. }
  86. /**
  87. * Remove all classes matching `re`.
  88. *
  89. * @param {RegExp} re
  90. * @return {ClassList}
  91. * @api private
  92. */
  93. }, {
  94. key: "_removeMatching",
  95. value: function _removeMatching(re) {
  96. var arr = this.array();
  97. for (var i = 0; i < arr.length; i++) {
  98. if (re.test(arr[i])) {
  99. this.remove(arr[i]);
  100. }
  101. }
  102. return this;
  103. }
  104. /**
  105. * Toggle class `name`, can force state via `force`.
  106. *
  107. * For browsers that support classList, but do not support `force` yet,
  108. * the mistake will be detected and corrected.
  109. *
  110. * @param {String} name
  111. * @param {Boolean} force
  112. * @return {ClassList}
  113. * @api public
  114. */
  115. }, {
  116. key: "toggle",
  117. value: function toggle(name, force) {
  118. // classList
  119. if (this.list) {
  120. if ('undefined' !== typeof force) {
  121. if (force !== this.list.toggle(name, force)) {
  122. this.list.toggle(name); // toggle again to correct
  123. }
  124. } else {
  125. this.list.toggle(name);
  126. }
  127. return this;
  128. }
  129. // fallback
  130. if ('undefined' !== typeof force) {
  131. if (!force) {
  132. this.remove(name);
  133. } else {
  134. this.add(name);
  135. }
  136. } else {
  137. if (this.has(name)) {
  138. this.remove(name);
  139. } else {
  140. this.add(name);
  141. }
  142. }
  143. return this;
  144. }
  145. /**
  146. * Check if class `name` is present.
  147. *
  148. * @param {String} name
  149. * @api public
  150. */
  151. }, {
  152. key: "has",
  153. value: function has(name) {
  154. return this.list ? this.list.contains(name) : !!~(0, _indexOf.default)(this.array(), name);
  155. }
  156. /**
  157. * Check if class `name` is present.
  158. *
  159. * @param {String} name
  160. * @api public
  161. */
  162. }, {
  163. key: "contains",
  164. value: function contains(name) {
  165. return this.has(name);
  166. }
  167. }]);
  168. return ClassList;
  169. }();
  170. /**
  171. * Wrap `el` in a `ClassList`.
  172. *
  173. * @param {Element} el
  174. * @return {ClassList}
  175. * @api public
  176. */
  177. exports.ClassList = ClassList;
  178. function _default(el) {
  179. return new ClassList(el);
  180. }