class-tools.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. (function(){
  2. function splitOnWhitespace(trigger) {
  3. return trigger.split(/\s+/);
  4. }
  5. function parseClassOperation(trimmedValue) {
  6. var split = splitOnWhitespace(trimmedValue);
  7. if (split.length > 1) {
  8. var operation = split[0];
  9. var classDef = split[1].trim();
  10. var cssClass;
  11. var delay;
  12. if (classDef.indexOf(":") > 0) {
  13. var splitCssClass = classDef.split(':');
  14. cssClass = splitCssClass[0];
  15. delay = htmx.parseInterval(splitCssClass[1]);
  16. } else {
  17. cssClass = classDef;
  18. delay = 100;
  19. }
  20. return {
  21. operation:operation,
  22. cssClass:cssClass,
  23. delay:delay
  24. }
  25. } else {
  26. return null;
  27. }
  28. }
  29. function processClassList(elt, classList) {
  30. var runs = classList.split("&");
  31. for (var i = 0; i < runs.length; i++) {
  32. var run = runs[i];
  33. var currentRunTime = 0;
  34. var classOperations = run.split(",");
  35. for (var j = 0; j < classOperations.length; j++) {
  36. var value = classOperations[j];
  37. var trimmedValue = value.trim();
  38. var classOperation = parseClassOperation(trimmedValue);
  39. if (classOperation) {
  40. if (classOperation.operation === "toggle") {
  41. setTimeout(function () {
  42. setInterval(function () {
  43. elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass);
  44. }, classOperation.delay);
  45. }, currentRunTime);
  46. currentRunTime = currentRunTime + classOperation.delay;
  47. } else {
  48. currentRunTime = currentRunTime + classOperation.delay;
  49. setTimeout(function () {
  50. elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass);
  51. }, currentRunTime);
  52. }
  53. }
  54. }
  55. }
  56. }
  57. function maybeProcessClasses(elt) {
  58. if (elt.getAttribute) {
  59. var classList = elt.getAttribute("classes") || elt.getAttribute("data-classes");
  60. if (classList) {
  61. processClassList(elt, classList);
  62. }
  63. }
  64. }
  65. htmx.defineExtension('class-tools', {
  66. onEvent: function (name, evt) {
  67. if (name === "htmx:afterProcessNode") {
  68. var elt = evt.detail.elt;
  69. maybeProcessClasses(elt);
  70. if (elt.querySelectorAll) {
  71. var children = elt.querySelectorAll("[classes], [data-classes]");
  72. for (var i = 0; i < children.length; i++) {
  73. maybeProcessClasses(children[i]);
  74. }
  75. }
  76. }
  77. }
  78. });
  79. })();