ef.js

Declarative DOM helper experiment

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
// This module contains convenient helper functions return ElementSetup.

import { type ElementSetup } from "./dom.js";
import { effect, isReactive, type ReactiveOrStatic } from "./signals.js";

export function classList<T extends Element>(
  ...values: readonly ReactiveOrStatic<string | null>[]
): ElementSetup<T> {
  return (el) => {
    for (const value of values) {
      if (isReactive(value)) {
        effect(() => {
          const v = value.get();
          if (v) {
            el.classList.add(v);

            return () => {
              el.classList.remove(v);
            };
          }
        });
        continue;
      }

      if (value) {
        el.classList.add(value);
      }
    }
  };
}

export function style<T extends HTMLElement | SVGElement>(
  name: string,
  value: ReactiveOrStatic<string | null>,
): ElementSetup<T> {
  return (el) => {
    if (isReactive(value)) {
      effect(() => {
        const v = value.get();
        if (v === null) {
          el.style.removeProperty(name);
          return;
        }

        el.style.setProperty(name, v);
      });
      return;
    }

    if (value === null) {
      el.style.removeProperty(name);
      return;
    }

    el.style.setProperty(name, value);
  };
}