big updat:
All checks were successful
Android Build / publish (push) Successful in 57s
Linux Build / publish (push) Successful in 53s

- update dependencies
- add webp support and webp conversion for profile images
This commit is contained in:
olcxja 2026-07-02 22:40:46 +02:00
commit 95aaaa69ea
244 changed files with 121382 additions and 86 deletions

109
node_modules/gif.js/site/contents/scripts/main.coffee generated vendored Normal file
View file

@ -0,0 +1,109 @@
require 'browsernizr/test/css/rgba'
require 'browsernizr/test/css/transforms3d'
Modernizr = require 'browsernizr'
require './vendor/mootools.js'
async = require 'async'
ready = require './vendor/ready.js'
now = window.performance?.now?.bind(window.performance) or Date.now
# fallback for browsers not supporting createObjectURL
blobURLSupport = window.URL?.createObjectURL?
buildDataURL = do ->
charMap = {}
charMap[i] = String.fromCharCode(i) for i in [0...256]
return (data) ->
str = ''
for i in [0...data.length]
str += charMap[data[i]]
return 'data:image/gif;base64,' + btoa(str)
loadImage = (src, callback) ->
img = new Image()
img.onload = ->
callback null, img
img.onerror = ->
callback new Error "Could load #{ src }"
img.src = src
setupDemo = (element) ->
element.getElements('.hover-buttons li').addEvents
mouseenter: -> element.addClass @className
mouseleave: -> element.removeClass @className
qslider = element.getElement '.quality input'
qvalue = element.getElement '.quality span'
renderimg = element.getElement 'img.render'
logel = element.getElement 'pre'
gif = new GIF
debug: true
quality: 10
workers: 2
startTime = null
gif.on 'start', ->
startTime = now()
gif.on 'finished', (blob, data) ->
if blobURLSupport
renderimg.src = URL.createObjectURL(blob)
else
renderimg.src = buildDataURL(data)
delta = now() - startTime
logel.set 'text', "Rendered #{ images.length } frame(s) at q#{ gif.options.quality } in #{ delta.toFixed(2) }ms"
gif.on 'progress', (p) ->
logel.set 'text', "Rendering #{ images.length } frame(s) at q#{ gif.options.quality }... #{ Math.round(p * 100) }%"
images = element.getElements('img.original').map (img) -> img.src
async.map images, loadImage, (error, images) ->
throw error if error?
gif.addFrame image, {delay: 500, copy: true} for image in images
gif.render()
qslider.addEvent 'change', ->
val = 31 - parseInt qslider.value
qvalue.set 'text', val
gif.setOption 'quality', val
gif.abort()
gif.render()
(element.getElement '.dither select')?.addEvent 'change', ->
gif.setOption 'dither', if @value is 'None' then false else @value
gif.abort()
gif.render()
delay = element.getElement '.delay'
if delay?
delay.getElement('input').addEvent 'change', ->
value = parseInt this.value
delay.getElement('.value').set 'text', value + 'ms'
for frame in gif.frames
frame.delay = value
gif.abort()
gif.render()
repeat = element.getElement '.repeat'
if repeat?
repeat.getElement('input').addEvent 'change', ->
value = parseInt this.value
value = -1 if value is 0
value = 0 if value is 21
switch value
when 0
txt = 'forever'
when -1
txt = 'none'
else
txt = value
repeat.getElement('.value').set 'text', txt
gif.setOption 'repeat', value
gif.abort()
gif.render()
ready ->
for demo in document.body.querySelectorAll '.demo'
setupDemo demo

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,54 @@
/*!
* domready (c) Dustin Diaz 2012 - License MIT
*/
!function (name, context, definition) {
if (typeof module != 'undefined') module.exports = definition()
else if (typeof define == 'function' && typeof define.amd == 'object') define(definition)
else context[name] = definition()
}('domready', this, function (ready) {
var fns = [], fn, f = false
, doc = document
, testEl = doc.documentElement
, hack = testEl.doScroll
, domContentLoaded = 'DOMContentLoaded'
, addEventListener = 'addEventListener'
, onreadystatechange = 'onreadystatechange'
, readyState = 'readyState'
, loaded = /^loade|c/.test(doc[readyState])
function flush(f) {
loaded = 1
while (f = fns.shift()) f()
}
doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () {
doc.removeEventListener(domContentLoaded, fn, f)
flush()
}, f)
hack && doc.attachEvent(onreadystatechange, fn = function () {
if (/^c/.test(doc[readyState])) {
doc.detachEvent(onreadystatechange, fn)
flush()
}
})
return (ready = hack ?
function (fn) {
self != top ?
loaded ? fn() : fns.push(fn) :
function () {
try {
testEl.doScroll('left')
} catch (e) {
return setTimeout(function() { ready(fn) }, 50)
}
fn()
}()
} :
function (fn) {
loaded ? fn() : fns.push(fn)
})
})