color-mode.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { types } from "assets/types.js";
  2. import { option } from "settings/option.js";
  3. const color_modes = Object.freeze({
  4. DARK: "dark",
  5. LIGHT: "light",
  6. })
  7. class color_mode extends option {
  8. #app;
  9. #dark_class;
  10. #light_class;
  11. constructor(
  12. app,
  13. dark_class = "darkmode",
  14. light_class = "lightmode"
  15. ) {
  16. super("color-mode");
  17. types.check_html_element(app);
  18. types.check_string(dark_class);
  19. types.check_string(light_class);
  20. if (dark_class === light_class) {
  21. throw new Error("Dark modeclass and lightmode class is same.");
  22. }
  23. this._add_option(color_modes.DARK);
  24. this._add_option(color_modes.LIGHT);
  25. this._default = color_modes.DARK;
  26. this.#app = app;
  27. this.#dark_class = dark_class;
  28. this.#light_class = light_class;
  29. this.update();
  30. }
  31. reverse() {
  32. if (this.selected === color_modes.DARK) {
  33. this.select(color_modes.LIGHT);
  34. } else {
  35. this.select(color_modes.DARK);
  36. }
  37. this.update();
  38. }
  39. update() {
  40. const app = this.#app;
  41. const darkmode = this.#dark_class;
  42. const lightmode = this.#light_class;
  43. const current = this.selected;
  44. if (app.classList.contains(darkmode)) {
  45. app.classList.remove(darkmode);
  46. }
  47. if (app.classList.contains(lightmode)) {
  48. app.classList.remove(lightmode);
  49. }
  50. if (current === color_modes.DARK) {
  51. app.classList.add(darkmode);
  52. return;
  53. }
  54. app.classList.add(lightmode);
  55. }
  56. }
  57. export { color_mode, color_modes };