File size: 14,178 Bytes
eb29f4f
 
b022cd3
ca22f42
 
 
4447a6f
ca22f42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58d6a1c
4447a6f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58d6a1c
4447a6f
 
 
ca22f42
 
 
 
 
 
 
 
124e21b
 
 
 
ca22f42
 
 
 
 
 
 
 
 
9d98c33
 
 
 
ca22f42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86d8841
9d98c33
cededb6
ca22f42
9d98c33
ca22f42
 
 
 
 
 
 
 
 
 
 
b022cd3
12761b6
b022cd3
 
 
 
 
7732bd8
b022cd3
 
7732bd8
eeff4b0
b022cd3
 
 
eeff4b0
b022cd3
 
 
12761b6
 
b022cd3
 
eeff4b0
ca22f42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cededb6
ca22f42
 
 
5e0f175
ca22f42
6e08c04
f247dc6
ca22f42
cededb6
ca22f42
 
 
5e0f175
ca22f42
6e08c04
f247dc6
ca22f42
 
 
 
5e0f175
cededb6
 
 
ca22f42
 
 
c4f1708
0fef857
7798054
d7a8fa3
c4f1708
0fef857
7798054
d7a8fa3
7ad2fcf
ca22f42
e69ef34
 
 
75510b3
a4b4108
e69ef34
 
 
 
 
 
a4b4108
e69ef34
 
 
 
 
 
ca22f42
 
 
 
 
 
e69ef34
b022cd3
eb29f4f
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
function gradioCustomJS() {
	console.log("gradioCustomJS Started")

	// MARK: berechne Helligkeit der Akzentfarbe
	function berechneHelligkeit(rgb) {
		const match = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/)
		if (!match) throw new Error("Ungültiges Farbformat")

		const r = parseInt(match[1]) / 255
		const g = parseInt(match[2]) / 255
		const b = parseInt(match[3]) / 255
		const rLin = r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4)
		const gLin = g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4)
		const bLin = b <= 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4)
		const luminanz = 0.2126 * rLin + 0.7152 * gLin + 0.0722 * bLin
		return luminanz
	}

	// MARK: Textfarbe bestimmen
	function anpasseTextfarbe(farbe) {
		const luminanz = berechneHelligkeit(farbe)
		const textFarbe = luminanz > 0.4 ? "var(--neutral-950)" : "var(--neutral-50)"
		console.log("Luminanz: " + luminanz + " Text-Farbe: " + textFarbe)
		return textFarbe
	}

	// MARK: Body Styles
	const body = document.querySelector("body")
	body.className = "dark"

	// Catppuccin colors
	const colors = {
		rosewater: "245, 224, 220",
		flamingo: "242, 205, 205",
		pink: "245, 194, 231",
		mauve: "203, 166, 247",
		red: "243, 139, 168",
		maroon: "235, 160, 172",
		peach: "250, 179, 135",
		yellow: "249, 226, 175",
		green: "166, 227, 161",
		teal: "148, 226, 213",
		sky: "137, 220, 235",
		sapphire: "116, 199, 236",
		blue: "137, 180, 250",
	}
	let usedColor = `rgb(${Object.values(colors)[Math.floor(Math.random() * Object.keys(colors).length)]})`

	for (const [colorName, colorValues] of Object.entries(colors)) {
		body.style.setProperty(`--cat-${colorName.replace(/,/g, "-")}`, `rgb(${colorValues})`)
	}

	body.style.setProperty("--primary-600", usedColor)
	body.style.setProperty("--primary-50", "color-mix(in srgb, var(--primary-600) 5%, white)")
	body.style.setProperty("--primary-100", "color-mix(in srgb, var(--primary-600) 10%, white)")
	body.style.setProperty("--primary-200", "color-mix(in srgb, var(--primary-600) 20%, white)")
	body.style.setProperty("--primary-300", "color-mix(in srgb, var(--primary-600) 60%, white)")
	body.style.setProperty("--primary-400", "color-mix(in srgb, var(--primary-600) 70%, white)")
	body.style.setProperty("--primary-500", "color-mix(in srgb, var(--primary-600) 80%, white)")
	body.style.setProperty("--primary-700", "color-mix(in srgb, var(--primary-600), black 20%)")
	body.style.setProperty("--primary-800", "color-mix(in srgb, var(--primary-600), black 35%)")
	body.style.setProperty("--primary-900", "color-mix(in srgb, var(--primary-600), black 55%)")
	body.style.setProperty("--primary-950", "color-mix(in srgb, var(--primary-600), black 65%)")

	body.style.setProperty("--button-primary-background-fill", "var(--primary-600)")
	body.style.setProperty("--button-primary-background-fill-hover", "var(--primary-500)")
	body.style.setProperty("--blur-value", "0px")
	body.style.setProperty("--text-color-by-luminance", anpasseTextfarbe(usedColor))

	// MARK: Selectors & Elements
	const gradioApp = document.querySelector("gradio-app")
	const gradioContainer = document.querySelector("body > gradio-app > div.gradio-container")
	const resolutionModalWrapper = document.createElement("div")
	resolutionModalWrapper.id = "resolution_modal_wrapper"
	resolutionModalWrapper.style.display = "none"
	resolutionModalWrapper.className = "resolution-modal-wrapper"
	const alertModalElem = document.createElement("div")
	const alertModalElemP = document.createElement("p")
	const alertModalElemI = document.createElement("i")
	alertModalElemI.className = "fas fa-exclamation-circle"
	const alertModalElemSpan = document.createElement("span")
	alertModalElemSpan.id = "alertModalText"
	const alertModalElemButton = document.createElement("button")
	alertModalElemButton.className = "lg primary run-btn svelte-cmf5ev"
	alertModalElemButton.id = "alertModalBtn"
	alertModalElemButton.textContent = "Ok"
	alertModalElemP.id = "alertModalP"
	alertModalElemP.append(alertModalElemI, alertModalElemSpan)
	alertModalElem.id = "alertModal"
	alertModalElem.append(alertModalElemP, alertModalElemButton)
	//alertModalElem.innerHTML = '<p></p>'
	resolutionModalWrapper.appendChild(alertModalElem)
	body.appendChild(resolutionModalWrapper)
	let resizeWindowToggleVar = 0

	// MARK: Alert Modal Events
	alertModalElemButton.addEventListener("click", () => {
		oldText = alertModalElemSpan.textContent
		alertModalElemButton.disabled = true
		alertModalElemSpan.innerHTML = 'Der "Ok" Button ändert nur diesen Text. 🫢<br/>In 2.5 Sekunden wird wieder die ursprüngliche Meldung gezeigt. Cool oder?'
		setTimeout(() => {
			alertModalElemSpan.textContent = oldText
			alertModalElemButton.disabled = false
			alertModalElemButton.textContent = "Noch mal?"
		}, 2500)
	})

	//component-15
	const tabNav = document.querySelector("div.tab-nav")
	tabNav.addEventListener("mouseover", () => {
		tabNav.addEventListener("wheel", (event) => {
			event.preventDefault()
			let scrollLeft = 0
			if (Math.sign(event.deltaY) < 0) {
				scrollLeft = -25
			}
			if (Math.sign(event.deltaY) > 0) {
				scrollLeft = +25
			}
			tabNav.scrollLeft = Math.max(0, Math.min(scrollLeft, tabNav.scrollWidth - tabNav.clientWidth))
		})
	})

	tabNav.addEventListener("mouseout", () => {
		tabNav.removeEventListener("wheel", (event) => {
			event.preventDefault()
			// const scrollLeft = tabNav.scrollLeft + 10
			// tabNav.scrollLeft = Math.max(0, Math.min(scrollLeft, tabNav.scrollWidth - tabNav.clientWidth))
		})
	})

	// MARK: Element-Ready function
	function elementReady(selector) {
		return new Promise((resolve, reject) => {
			const el = document.querySelector(selector)
			if (el) {
				resolve(el)
			}

			new MutationObserver((mutationRecords, observer) => {
				Array.from(document.querySelectorAll(selector)).forEach((element) => {
					resolve(element)
					observer.disconnect()
				})
			}).observe(document.documentElement, {
				childList: true,
				subtree: true,
			})
		})
	}

	// MARK: Mobile Check
	function istMobile() {
		// Überprüfen, ob das Gerät ein Touchscreen hat
		if ("ontouchstart" in window || (navigator.maxTouchPoints && window.innerWidth < 768)) {
			resizeWindowToggleVar = 1
			gradioContainer.classList.add("blur-container")
			body.style.setProperty("--blur-value", "12px")
			gradioApp.style.height = "calc(100vh - 120px)"
			resolutionModalWrapper.style.setProperty("--opacity-value", "1")
			alertModalElemSpan.textContent = "Diese Seite ist nicht für mobile Geräte optimiert. Bitte besuche diese Seite von einem Desktop-Computer aus."
			alertModalElemButton.textContent = "Ok"
			resolutionModalWrapper.style.display = ""
		} else if (window.innerWidth < 1024) {
			resizeWindowToggleVar = 1
			gradioContainer.classList.add("blur-container")
			body.style.setProperty("--blur-value", "12px")
			gradioApp.style.height = "calc(100vh - 120px)"
			resolutionModalWrapper.style.setProperty("--opacity-value", "1")
			alertModalElemSpan.textContent = "Bildschirm Auflösung oder Fensterbreite zu gering. Bitte besuche diese Seite von einem Desktop-Computer aus."
			alertModalElemButton.textContent = "Ok"
			resolutionModalWrapper.style.display = ""
		} else {
			gradioContainer.classList.remove("blur-container")
			body.style.setProperty("--blur-value", "0px")
			gradioApp.style.height = ""
			resolutionModalWrapper.style.setProperty("--opacity-value", "0")
			if (resizeWindowToggleVar == 1) {
				setTimeout(() => ((resolutionModalWrapper.style.display = "none"), (resizeWindowToggleVar = 0)), 800)
			}
		}
	}

	// MARK: SVG Animationen & Emojis
	const winking_hand_emoji = document.querySelector(".row-header p i.winking-hand-emoji")
	winking_hand_emoji.innerHTML =
		'<svg aria-hidden="true" class="iconify iconify--noto" preserveAspectRatio="xMidYMid meet" role="img" viewBox="0 0 128 128"><style> @keyframes wink{0%, 60%, 100%{transform: rotate(0deg);}10%, 30%, 70%, 90%{transform: rotate(14deg);}20%, 80%{transform: rotate(-8deg);}40%{transform: rotate(-4deg);}50%{transform: rotate(10deg);}}</style><g style="animation: wink 3s ease-in-out infinite; transform-origin: 50% 50%;"><radialGradient id="a" cx="-779.868" cy="686.689" r="91.008" gradientTransform="scale(1 -1) rotate(45 506.867 1318.897)" gradientUnits="userSpaceOnUse"><stop offset=".353" stop-color="#ffca28"/><stop offset=".872" stop-color="#ffb300"/></radialGradient><path fill="url(#a)" d="M59.53 107.44c-3.95-3.17-40.63-38.84-41.04-39.23-1.62-1.62-2.64-3.3-2.92-4.84-.29-1.6.2-3 1.5-4.3 1.21-1.21 2.69-1.85 4.28-1.85 1.94 0 3.93.92 5.59 2.59l16.63 15.98c.29.28.67.42 1.04.42a1.494 1.494 0 0 0 1.07-2.54L19.13 46.25c-2.66-2.66-3.91-6.73-.75-9.89 1.21-1.21 2.69-1.85 4.28-1.85 1.94 0 3.93.92 5.59 2.59l27.16 26.48c.29.28.67.43 1.05.43s.77-.15 1.06-.44c.58-.58.59-1.52.01-2.11L24.91 28.02c-1.51-1.51-2.42-3.32-2.58-5.08-.15-1.79.48-3.45 1.83-4.8 1.21-1.21 2.69-1.85 4.28-1.85 1.94 0 3.93.92 5.59 2.58L67.3 51.31c.29.28.67.43 1.05.43s.77-.15 1.06-.44c.58-.58.59-1.52.01-2.11L45.26 24.36c-1.52-1.52-2.43-3.32-2.58-5.08-.15-1.79.48-3.45 1.83-4.8 1.21-1.21 2.69-1.85 4.28-1.85 1.94 0 3.93.92 5.59 2.59 8.86 8.7 31.99 31.45 32.77 32.29 2.97 2.05 3.57-1.05 3.72-3.06.17-2.34-2.51-10.51-.95-17.86 2.62-9.77 10.17-8.17 10.34-8.09 4.14 1.94 3.35 4.84 1.88 10.67l-.15 1.15c-1.54 7.62 9.04 30.2 9.82 31.89 4.15 9.08 8.93 27.49-6.9 43.32-17.35 17.35-38.83 8.46-45.38 1.91z"/><path fill="#eda600" d="M81.79 117.18c-10.64 0-19.69-5.09-23.26-8.62-3.21-2.62-23.47-22.18-39.97-38.19-.67-.65-1.06-1.02-1.1-1.07-1.87-1.87-3.03-3.82-3.36-5.66-.38-2.09.27-3.98 1.91-5.63 1.5-1.5 3.34-2.29 5.34-2.29 2.35 0 4.71 1.08 6.65 3.03l16.61 15.96-26.56-27.42c-3.06-3.06-4.6-8.13-.73-11.99 1.5-1.5 3.34-2.29 5.34-2.29 2.35 0 4.71 1.08 6.65 3.03L56.45 62.5 23.84 29.07c-1.74-1.74-2.81-3.87-3-5.99-.19-2.26.59-4.33 2.26-6 1.5-1.5 3.34-2.29 5.34-2.29 2.34 0 4.7 1.07 6.65 3.02l33.26 32.43-24.16-24.83c-1.75-1.75-2.82-3.88-3-6-.19-2.25.59-4.32 2.26-5.99 1.5-1.5 3.34-2.29 5.34-2.29 2.35 0 4.71 1.08 6.65 3.03l7.21 7.07c12.85 12.6 23.59 23.15 24.74 24.33.56.45 1.29.62 1.6.47.2-.1.42-.56.38-1.53-.06-1.7-.3-3.81-.55-6.04-.5-4.48-1.02-9.12-.37-12.18 1.42-5.31 4.21-7.56 6.29-8.53 2.86-1.32 5.63-.86 6.16-.61 5.2 2.44 4.17 6.52 2.75 12.18l-.03.14-.16 1.17c-1.04 5.12 4.3 19.27 9.64 30.8l.08.16c3.57 7.8 10 27.81-7.2 45.01-7.91 7.89-16.47 10.58-24.19 10.58zM21.35 58.72c-1.18 0-2.3.49-3.22 1.41-.95.95-1.28 1.87-1.08 2.97.22 1.21 1.11 2.65 2.5 4.05.01.01.41.4 1.1 1.06 23.42 22.73 37.56 36.24 39.82 38.06l.12.11c5.52 5.52 26.03 15.32 43.26-1.91 15.87-15.87 9.9-34.4 6.59-41.64l-.07-.15c-3.44-7.42-11.26-25.42-9.87-32.6l.23-1.5c1.54-6.12 1.63-7.4-.98-8.66-.77-.14-6.29-.81-8.4 7.06-.53 2.51-.02 7.1.43 11.15.26 2.29.5 4.46.56 6.27.1 2.85-1.25 3.94-2.07 4.34-1.67.81-3.66.12-4.9-.92l-.13-.12c-.61-.66-15.12-14.89-24.72-24.31L53.3 16.3c-2.46-2.47-5.63-2.88-7.76-.75-1.04 1.04-1.51 2.26-1.4 3.61.12 1.41.88 2.88 2.15 4.15L70.5 48.14a3.012 3.012 0 0 1-.02 4.22c-1.11 1.11-3.07 1.13-4.21.03L32.98 19.94c-2.46-2.46-5.64-2.87-7.76-.74-1.04 1.04-1.51 2.26-1.4 3.61.13 1.41.89 2.89 2.15 4.14L58.6 60.41c1.15 1.16 1.14 3.06-.02 4.22-1.11 1.11-3.07 1.13-4.21.03L27.2 38.17c-2.46-2.48-5.64-2.88-7.76-.75-2.59 2.59-1.21 5.8.75 7.77l26.57 27.44a2.988 2.988 0 0 1-.03 4.2c-1.12 1.12-3.06 1.13-4.2.04L25.9 60.89c-1.4-1.41-3.01-2.17-4.55-2.17z"/><path fill="#eda600" d="M84.76 46.54c-5.49 11.21-4.78 26.9 3.46 39.49.93 1.7 2.52.87 1.71-.88-9.95-21.29.48-36.63.48-36.63l-5.65-1.98z"/><path fill="#b0bec5" d="M63.17 4.5c3.02-.79 6.24-.72 9.37.01 3.11.75 6.22 2.33 8.53 4.91 2.26 2.56 3.65 5.67 4.12 8.93.44 3.23.03 6.56-1.5 9.32-.18-3.1-.72-5.95-1.63-8.58-.47-1.31-1.02-2.56-1.69-3.74-.66-1.17-1.44-2.33-2.27-3.28-1.69-1.95-3.98-3.47-6.55-4.65-2.58-1.22-5.39-2.12-8.38-2.92z"/><path fill="#90a4ae" d="M64 13.98c1.67-1.06 3.76-1.28 5.73-.93 1.99.35 3.89 1.34 5.39 2.71 1.49 1.39 2.55 3.14 3.21 4.96.32.91.48 1.87.63 2.8.05.96.05 1.92-.1 2.88-.69-.73-1.23-1.46-1.74-2.17-.59-.67-1.05-1.38-1.58-2.03-1.04-1.29-2.05-2.46-3.14-3.5-1.12-1.01-2.3-1.9-3.67-2.67-1.36-.79-2.89-1.45-4.73-2.05z"/><path fill="#b0bec5" d="M6.83 77.34c1.41 2.76 2.88 5.32 4.59 7.58 1.7 2.26 3.65 4.18 5.92 5.43 1.1.61 2.41 1.14 3.69 1.54 1.29.41 2.63.69 4.01.88 2.76.34 5.66.28 8.73-.19-2.38 2.07-5.56 3.17-8.8 3.41-3.28.22-6.61-.49-9.59-2.17-3-1.71-5.2-4.43-6.58-7.32-1.38-2.91-2.12-6.04-1.97-9.16z"/><path fill="#90a4ae" d="M16.28 76.17c.97 1.68 1.93 3.03 2.98 4.21 1.04 1.18 2.16 2.15 3.38 3.03 1.24.85 2.6 1.6 4.08 2.35.74.38 1.53.68 2.31 1.12.81.35 1.63.72 2.49 1.25-.91.34-1.84.54-2.79.69-.94.04-1.91.09-2.87-.04-1.92-.26-3.84-.93-5.52-2.1-1.65-1.19-3.02-2.84-3.77-4.71-.76-1.86-.98-3.94-.29-5.8z"/></g></svg>'

	const heart_beat_emoji = document.querySelector(".row-header p i.heart-beat-emoji")
	heart_beat_emoji.innerHTML =
		'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style> @keyframes beat{0%{transform: scale(1);}5%{transform: scale(0.75);}20%{transform: scale(1);}30%{transform: scale(1);}35%{transform: scale(0.75);}50%{transform: scale(1);}55%{transform: scale(0.75);}70%{transform: scale(1);}}</style></defs><g style="animation: beat 2s ease-in-out infinite; transform-origin: 50% 50%;"><path fill="#bd0a0a" d="M47.6 300.4L228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6 0 115.2 0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></g></svg>'

	// MARK: Event Listeners

	function resize_eventListener(trigger) {
		if (trigger == "add") {
			istMobile()
			console.log("Window Resize EventListener added.")
			window.addEventListener("resize", () => {
				console.log("Event Window resize.")
				istMobile()
			})
		}
		if (trigger == "remove") {
			console.log("Window Resize EventListener removed.")
			window.removeEventListener("resize", () => {
				console.log("Event Window resize.")
				istMobile()
			})
		}
	}

	elementReady("body > gradio-app > div.gradio-container").then((element) => {
		console.log("Element exist: " + element)
		istMobile()
	})

	resize_eventListener("add")
	return "Custom Gradio JS"
}