-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcolorscroll.js
More file actions
123 lines (118 loc) · 5 KB
/
colorscroll.js
File metadata and controls
123 lines (118 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
* Lumos ColorScroll 1.0.3
* Copyright 2023 Timothy Ricks
* Released under the MIT License
* Released on: August 12, 2023
*/
let sectionModes = {};
let sectionModeTotal;
let cardModeTotal;
window.addEventListener("DOMContentLoaded", (event) => {
// attribute value checker
function attr(defaultVal, attrVal) {
const defaultValType = typeof defaultVal;
if (typeof attrVal !== "string" || attrVal.trim() === "") return defaultVal;
if (attrVal === "true" && defaultValType === "boolean") return true;
if (attrVal === "false" && defaultValType === "boolean") return false;
if (isNaN(attrVal) && defaultValType === "string") return attrVal;
if (!isNaN(attrVal) && defaultValType === "number") return +attrVal;
return defaultVal;
}
// variables
const targetStylesheet = document.querySelector("#lumos-colors");
if (targetStylesheet) {
// get colors
const rules = targetStylesheet.sheet.cssRules || targetStylesheet.sheet.rules;
sectionModeTotal = countModes(/sm0-\d+/g, rules);
cardModeTotal = countModes(/cm0-\d+/g, rules);
function getResolvedValue(value) {
const variables = value.match(/var\(([^)]+)\)/g);
if (variables) {
for (const variable of variables) {
const variableName = variable.match(/var\(([^)]+)\)/)[1].trim();
const variableValue = getComputedStyle(document.documentElement).getPropertyValue(variableName);
value = value.replace(variable, variableValue);
}
}
return value;
}
function countModes(classNamePattern, rules) {
const uniqueClassNames = new Set();
for (const rule of rules) {
const ruleText = rule.cssText || rule.style.cssText;
const classNames = ruleText.match(classNamePattern);
if (classNames) {
classNames.forEach((className) => {
uniqueClassNames.add(className);
});
}
}
return uniqueClassNames.size;
}
for (let i = 1; i <= sectionModeTotal; i++) {
let sectionIndex = i;
sectionModes[`sectionMode${sectionIndex}`] = {};
sectionModes[`sectionMode${sectionIndex}`]["mode"] = {};
for (let i = 1; i <= cardModeTotal; i++) {
sectionModes[`sectionMode${sectionIndex}`][`cardMode${i}`] = {};
}
}
for (const rule of rules) {
if (rule instanceof CSSStyleRule) {
for (let i = 1; i <= sectionModeTotal; i++) {
let sectionIndex = i;
if (rule.selectorText.includes(`[class*="sm0-${sectionIndex}"],`)) {
for (let i = 0; i < rule.style.length; i++) {
const property = rule.style[i];
const value = getResolvedValue(rule.style.getPropertyValue(property));
sectionModes[`sectionMode${sectionIndex}`]["mode"][property] = value;
}
}
for (let i = 1; i <= cardModeTotal; i++) {
const selector = `:is([section-mode="${sectionIndex}"], [class*="sm0-${sectionIndex}"]) :is([card-mode="${i}"], [class*="cm0-${i}"])`;
if (rule.selectorText.includes(selector)) {
for (let j = 0; j < rule.style.length; j++) {
const property = rule.style[j];
const value = getResolvedValue(rule.style.getPropertyValue(property));
sectionModes[`sectionMode${sectionIndex}`][`cardMode${i}`][property] = value;
}
}
}
}
}
}
let durationSetting = attr(0.4, $("#lumos-colors").attr("colorscroll-speed")),
easeSetting = attr("power1.out", $("#lumos-colors").attr("colorscroll-ease")),
offsetSetting = attr(50, $("#lumos-colors").attr("colorscroll-offset")),
breakpointSetting = attr(0, $("#lumos-colors").attr("colorscroll-breakpoint"));
// scrolltrigger code
gsap.registerPlugin(ScrollTrigger);
$("[colorscroll-mode]").each(function () {
let modeIndex = +$(this).attr("colorscroll-mode");
let modeCurrent = sectionModes[`sectionMode${modeIndex}`];
if (modeCurrent !== undefined) {
ScrollTrigger.create({
trigger: $(this),
start: `top ${offsetSetting}%`,
end: `bottom ${offsetSetting}%`,
onToggle: ({ self, isActive }) => {
if (isActive) {
gsap.matchMedia().add(`(min-width: ${breakpointSetting}px)`, () => {
gsap.to("body", { ...sectionModes[`sectionMode${modeIndex}`]["mode"], duration: durationSetting, ease: easeSetting });
for (let i = 1; i <= cardModeTotal; i++) {
let cards = $(`[card-mode="${i}"], [class*="cm0-${i}"]`);
cards.each(function (index) {
if ($(this).closest("[section-mode]:not(body), [class*='sm0']:not(body)").length) {
cards = cards.not($(this));
}
});
gsap.to(cards, { ...sectionModes[`sectionMode${modeIndex}`][`cardMode${i}`], duration: durationSetting, ease: easeSetting });
}
});
}
}
});
}
});
}
});