"
+ );
+ });
+ } else {
+ $('#shapes-cont').html(
+ "
Sorry, we couldn't find any results for "" +
+ encodeURIComponent(value) +
+ '". Please try a different query.
'
+ );
+ }
+ });
+ } else {
+ $('#pixabay').removeClass('hide-pixabay');
+ $('#landing').removeClass('hide-landing');
+ }
+ } else if ($('#video-tool').hasClass('tool-active')) {
+ var URL =
+ 'https://pixabay.com/api/videos/?key=' +
+ API_KEY +
+ '&q=' +
+ encodeURIComponent(value);
+ $('#images-grid').html('');
+ if (value != '') {
+ $('#landing').addClass('hide-landing');
+ $('#pixabay').addClass('hide-pixabay');
+ $.getJSON(URL, function (data) {
+ if (parseInt(data.totalHits) > 0) {
+ $.each(data.hits, function (i, hit) {
+ var video = hit.videos.medium.url;
+ $('#images-grid').append(
+ "
" +
+ hit.user +
+ "" +
+ fancyTimeFormat(hit.duration) +
+ "

"
+ );
+ //createVideoThumbnail(video, 250, 0, true).then(function(data){
+ $(".image-grid-item[data-src='" + video + "']")
+ .find('img')
+ .attr(
+ 'src',
+ 'https://i.vimeocdn.com/video/' +
+ hit.picture_id +
+ '_640x360.jpg'
+ );
+ //});
+ });
+ } else {
+ $('#shapes-cont').html(
+ "
Sorry, we couldn't find any results for "" +
+ encodeURIComponent(value) +
+ '". Please try a different query.
'
+ );
+ }
+ });
+ } else {
+ $('#pixabay').removeClass('hide-pixabay');
+ $('#landing').removeClass('hide-landing');
+ }
+ } else if ($('#shape-tool').hasClass('tool-active')) {
+ if (value == '') {
+ $('#shapes-cont').html(
+ '
Shapes
Emojis
'
+ );
+ populateGrid('shape-tool');
+ } else {
+ $('.row-title').remove();
+ $('.gallery-row').remove();
+ $('#shapes-cont').html("
");
+ var combined = shape_grid_items.concat(emoji_items);
+ var flag = false;
+ combined.forEach(function (item) {
+ if (item.indexOf(value) > -1) {
+ flag = true;
+ if (item.indexOf('emoji') > -1) {
+ $('.gallery-row').append(
+ "
"
+ );
+ } else {
+ $('.gallery-row').append(
+ "
"
+ );
+ }
+ }
+ });
+ if (!flag) {
+ $('#shapes-cont').html(
+ "
Sorry, we couldn't find any results for "" +
+ encodeURIComponent(value) +
+ '". Please try a different query.
'
+ );
+ }
+ }
+ } else if ($('#text-tool').hasClass('tool-active')) {
+ if (value == '') {
+ $('#browser-container').html(text_browser);
+ populateGrid('text-tool');
+ } else {
+ $('#shapes-cont').html('');
+ $('.row-title').remove();
+ var flag = false;
+ fonts.forEach(function (font) {
+ if (font.toLowerCase().indexOf(value) > -1) {
+ flag = true;
+ WebFont.load({
+ google: {
+ families: [font],
+ },
+ });
+ $('#shapes-cont').append(
+ "
" +
+ font +
+ '
'
+ );
+ }
+ });
+ if (!flag) {
+ $('#shapes-cont').html(
+ "
Sorry, we couldn't find any results for "" +
+ encodeURIComponent(value) +
+ '". Please try a different query.
'
+ );
+ }
+ }
+ }
+}
+
+function searchCategory() {
+ $('#browser-search input').val($(this).attr('data-name'));
+ $('#delete-search').addClass('show-delete');
+ search();
+ $('#pixabay').addClass('hide-pixabay');
+}
+
+function deleteSearch() {
+ $('#browser-search input').val('');
+ $('#delete-search').removeClass('show-delete');
+ if ($('#shape-tool').hasClass('tool-active')) {
+ $('#shapes-cont').html(
+ '
Shapes
Emojis
'
+ );
+ populateGrid('shape-tool');
+ } else if ($('#image-tool').hasClass('tool-active')) {
+ $('#images-grid').html('');
+ $('#landing').removeClass('hide-landing');
+ $('#pixabay').removeClass('hide-pixabay');
+ } else if ($('#video-tool').hasClass('tool-active')) {
+ $('#images-grid').html('');
+ $('#landing').removeClass('hide-landing');
+ $('#pixabay').removeClass('hide-pixabay');
+ } else if ($('#text-tool').hasClass('tool-active')) {
+ $('#browser-container').html(text_browser);
+ populateGrid('text-tool');
+ }
+}
+$(document).on('click', '#delete-search', deleteSearch);
+$(document).on('input', '#browser-search input', searchInput);
+$(document).on('click', '#search-button', search);
+$(document).on('click', '.category', searchCategory);
+
+function replaceAudioBackground() {
+ var src = $(this).attr('data-src');
+ newAudioLayer(src);
+ /*
+ if ($(this).hasClass("audio-item-active")) {
+ background_audio = false;
+ background_key = false;
+ $(this).removeClass("audio-item-active");
+ save();
+ } else {
+ var src = $(this).attr("data-src");
+ if (background_audio != false) {
+ $("#audio-upload-button").removeClass("remove-audio");
+ $("#audio-upload-button").html('

Upload audio');
+ }
+ db.collection("projects").doc({id: 1}).update({
+ audiosrc: src,
+ });
+ background_audio = new Audio(src);
+ background_audio.crossOrigin = "anonymous";
+ background_key = src;
+ save();
+ $(this).addClass("audio-item-active");
+ }
+ */
+}
+$(document).on('click', '.audio-item', replaceAudioBackground);
+
+function previewAudioBackground(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var src = $(this).parent().attr('data-src');
+ if ($(this).find('img').attr('src') == 'assets/play-button.svg') {
+ temp_audio = new Audio(src);
+ temp_audio.crossOrigin = 'anonymous';
+ temp_audio.currentTime = 0;
+ temp_audio.play();
+ $(this).find('img').attr('src', 'assets/pause-button.svg');
+ } else {
+ if (temp_audio != false) {
+ temp_audio.pause();
+ }
+ $(this).find('img').attr('src', 'assets/play-button.svg');
+ }
+}
+$(document).on('click', '.audio-preview', previewAudioBackground);
+
+/* Filters options */
+function checkFilter() {
+ resetFilters();
+ if (canvas.getActiveObject()) {
+ var obj = canvas.getActiveObject();
+ if (
+ canvas.getActiveObjects().length == 1 &&
+ (obj.type == 'image' || obj.type == 'video')
+ ) {
+ var value = 'none';
+ if (obj.filters.length > 0) {
+ obj.filters.forEach(function (filter) {
+ if (
+ filter.type == 'BlackWhite' ||
+ filter.type == 'Invert' ||
+ filter.type == 'Sepia' ||
+ filter.type == 'Kodachrome' ||
+ filter.type == 'Polaroid' ||
+ filter.type == 'Technicolor' ||
+ filter.type == 'Brownie' ||
+ filter.type == 'Vintage'
+ ) {
+ value = filter.type;
+ } else if (filter.type == 'Brightness') {
+ sliders
+ .find((x) => x.name == 'filter-brightness')
+ .slider.setValue(filter.brightness * 100);
+ } else if (filter.type == 'Contrast') {
+ sliders
+ .find((x) => x.name == 'filter-contrast')
+ .slider.setValue(filter.contrast * 100);
+ } else if (filter.type == 'Vibrance') {
+ sliders
+ .find((x) => x.name == 'filter-vibrance')
+ .slider.setValue(filter.vibrance * 100);
+ } else if (filter.type == 'Saturation') {
+ sliders
+ .find((x) => x.name == 'filter-saturation')
+ .slider.setValue(filter.saturation * 100);
+ } else if (filter.type == 'HueRotation') {
+ sliders
+ .find((x) => x.name == 'filter-hue')
+ .slider.setValue(filter.rotation * 100);
+ } else if (filter.type == 'Blur') {
+ blurslider.setValue(filter.blur * 100);
+ } else if (filter.type == 'Noise') {
+ noiseslider.setValue(filter.noise);
+ }
+ $('#filters-list').val(value);
+ $('#filters-list').niceSelect('update');
+ });
+ } else {
+ $('#filters-list').val(value);
+ $('#filters-list').niceSelect('update');
+ }
+ }
+ }
+}
+function clearFilters() {
+ if (canvas.getActiveObject()) {
+ var obj = canvas.getActiveObject();
+ obj.filters = $.grep(obj.filters, function (i) {
+ return (
+ i.type != 'BlackWhite' &&
+ i.type != 'Invert' &&
+ i.type != 'Sepia' &&
+ i.type != 'Kodachrome' &&
+ i.type != 'Polaroid' &&
+ i.type != 'Technicolor' &&
+ i.type != 'Brownie' &&
+ i.type != 'Vintage'
+ );
+ });
+ canvas.renderAll();
+ }
+}
+function applyFilter(name) {
+ if (canvas.getActiveObject()) {
+ var obj = canvas.getActiveObject();
+ if (name == 'Sepia') {
+ obj.filters.push(new f.Sepia());
+ } else if (name == 'Invert') {
+ obj.filters.push(new f.Invert());
+ } else if (name == 'BlackWhite') {
+ obj.filters.push(new f.BlackWhite());
+ } else if (name == 'Kodachrome') {
+ obj.filters.push(new f.Kodachrome());
+ } else if (name == 'Polaroid') {
+ obj.filters.push(new f.Polaroid());
+ } else if (name == 'Technicolor') {
+ obj.filters.push(new f.Technicolor());
+ } else if (name == 'Vintage') {
+ obj.filters.push(new f.Vintage());
+ } else if (name == 'Brownie') {
+ obj.filters.push(new f.Brownie());
+ }
+ obj.applyFilters();
+ canvas.renderAll();
+ save();
+ }
+}
+function updateMediaFilters() {
+ var value = $(this).val();
+ if (canvas.getActiveObject()) {
+ clearFilters();
+ applyFilter(value);
+ }
+}
+$(document).on('change', '#filters select', updateMediaFilters);
+
+function resetFilters() {
+ if (canvas.getActiveObject()) {
+ var object = canvas.getActiveObject();
+ if (object.filters) {
+ if (!object.filters.find((x) => x.type == 'Blur')) {
+ blurslider.setValue(0);
+ }
+ if (!object.filters.find((x) => x.type == 'Noise')) {
+ noiseslider.setValue(0);
+ }
+ if (object.filters.length > 0) {
+ sliders.forEach(function (slider) {
+ var name = '';
+ if (slider.name == 'filter-hue') {
+ name = 'HueRotation';
+ } else if (slider.name == 'filter-brightness') {
+ name = 'Brightness';
+ } else if (slider.name == 'filter-vibrance') {
+ name = 'Vibrance';
+ } else if (slider.name == 'filter-contrast') {
+ name = 'Contrast';
+ } else if (slider.name == 'filter-saturation') {
+ name = 'Saturation';
+ }
+ if (!object.filters.find((x) => x.type == name)) {
+ slider.slider.setValue(0);
+ }
+ });
+ } else {
+ sliders.forEach(function (slider) {
+ slider.slider.setValue(0);
+ });
+ }
+ } else {
+ sliders.forEach(function (slider) {
+ slider.slider.setValue(0);
+ });
+ }
+ }
+}
+function removeFilters() {
+ sliders.forEach(function (slider) {
+ slider.slider.setValue(0);
+ });
+}
+$(document).on('click', '#reset-filters', removeFilters);
+
+function updateChromaValues() {
+ if (canvas.getActiveObject()) {
+ var obj = canvas.getActiveObject();
+ if ($('.status-active').attr('id') == 'status-on') {
+ if (obj.filters.find((x) => x.type == 'RemoveColor')) {
+ obj.filters.find((x) => x.type == 'RemoveColor').distance =
+ chromaslider.getValue() / 100;
+ obj.filters.find((x) => x.type == 'RemoveColor').color = $(
+ '#chroma-color input'
+ ).val();
+ } else {
+ obj.filters.push(
+ new f.RemoveColor({
+ distance: chromaslider.getValue() / 100,
+ color: $('#chroma-color input').val(),
+ })
+ );
+ }
+ obj.applyFilters();
+ canvas.renderAll();
+ save();
+ } else {
+ if (obj.filters.find((x) => x.type == 'RemoveColor')) {
+ obj.filters = $.grep(obj.filters, function (i) {
+ return i.type != 'RemoveColor';
+ });
+ obj.applyFilters();
+ canvas.renderAll();
+ save();
+ }
+ }
+ }
+}
+
+function updateChromaUI() {
+ if (canvas.getActiveObject()) {
+ var obj = canvas.getActiveObject();
+ if (obj.filters) {
+ if (obj.filters.length > 0) {
+ if (obj.filters.find((x) => x.type == 'RemoveColor')) {
+ $('.status-active').removeClass('status-active');
+ $('#status-on').addClass('status-active');
+ chromaslider.setValue(
+ obj.filters.find((x) => x.type == 'RemoveColor').distance
+ );
+ $('#chroma-color input').val(
+ obj.filters.find((x) => x.type == 'RemoveColor').color
+ );
+ $('#color-chroma-side').css(
+ 'background-color',
+ obj.filters.find((x) => x.type == 'RemoveColor').color
+ );
+ } else {
+ $('.status-active').removeClass('status-active');
+ $('#status-off').addClass('status-active');
+ chromaslider.setValue(1);
+ $('#chroma-color input').val('#FFFFFF');
+ $('#color-chroma-side').css('background-color', '#FFFFF');
+ }
+ }
+ }
+ }
+}
+
+function toggleChroma() {
+ if (canvas.getActiveObject()) {
+ $('.status-active').removeClass('status-active');
+ $(this).addClass('status-active');
+ updateChromaValues();
+ }
+}
+
+$(document).on(
+ 'click',
+ '.status-trigger:not(.status-active)',
+ toggleChroma
+);
+
+async function getColor() {
+ try {
+ const selectedColor = await eyeDropper.open();
+ colormode = 'chroma';
+ o_fill.setColor(selectedColor.sRGBHex);
+ } catch (err) {}
+}
+$(document).on('click', '.pcr-current-color', getColor);
+
+function closeFilters() {
+ $('.show-filters').removeClass('show-filters');
+}
+
+function openFilters() {
+ $('#filters-parent').addClass('show-filters');
+}
+
+$(document).on('click', '#filters-button', openFilters);
+$(document).on('click', '#filters-close', closeFilters);
+
+function toggleSpeed(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ $('#speed-settings').toggleClass('show-speed');
+ $('#speed-arrow').toggleClass('arrow-on');
+}
+function setSpeed(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ speed = parseFloat($(this).attr('data-speed'));
+ $('#speed span').html($(this).html());
+ toggleSpeed(e);
+ save();
+}
+
+$(document).on('click', '.speed', setSpeed);
+$(document).on('click', '#speed', toggleSpeed);
+
+function showMore() {
+ $('#more-over').css(
+ 'top',
+ $('#more-tool').offset().top + 5 - $('#more-over').height() / 4
+ );
+ $('#more-over').addClass('more-show');
+}
+function hideMore() {
+ $('#more-over').removeClass('more-show');
+}
+
+function handleLottieUpload() {
+ var filething = $('#filepick3').get(0).files;
+ var reader = new FileReader();
+ reader.onload = function (event) {
+ newLottieAnimation(
+ artboard.get('left') + artboard.get('width') / 2,
+ artboard.get('top') + artboard.get('height') / 2,
+ event.target.result
+ );
+ };
+ reader.readAsDataURL(filething.item(0));
+}
+
+$(document).on('change', '#filepick3', handleLottieUpload);
+
+function uploadLottie() {
+ $('#filepick3').click();
+}
+$(document).on('click', '#upload-lottie', uploadLottie);
diff --git a/src/js/webm-writer2.js b/src/js/webm-writer2.js
new file mode 100644
index 0000000..ce8e75c
--- /dev/null
+++ b/src/js/webm-writer2.js
@@ -0,0 +1,1165 @@
+/**
+ * A tool for presenting an ArrayBuffer as a stream for writing some simple data
+ * types.
+ *
+ * By Nicholas Sherlock, with updates from jimbankoski
+ *
+ * - make it work off frames with timestamps from webcodecs
+ * - make it write via Native File IO apis instead of FileWriter
+ * - remove alpha and transparency
+ * -
+ *
+ * Released under the WTFPLv2 https://en.wikipedia.org/wiki/WTFPL
+ */
+
+'use strict';
+
+(function() {
+/*
+ * Create an ArrayBuffer of the given length and present it as a writable stream
+ * with methods for writing data in different formats.
+ */
+let ArrayBufferDataStream = function(length) {
+ this.data = new Uint8Array(length);
+ this.pos = 0;
+};
+
+ArrayBufferDataStream.prototype.seek = function(toOffset) {
+ this.pos = toOffset;
+};
+
+ArrayBufferDataStream.prototype.writeBytes = function(arr) {
+ for (let i = 0; i < arr.length; i++) {
+ this.data[this.pos++] = arr[i];
+ }
+};
+
+ArrayBufferDataStream.prototype.writeByte = function(b) {
+ this.data[this.pos++] = b;
+};
+
+// Synonym:
+ArrayBufferDataStream.prototype.writeU8 =
+ ArrayBufferDataStream.prototype.writeByte;
+
+ArrayBufferDataStream.prototype.writeU16BE = function(u) {
+ this.data[this.pos++] = u >> 8;
+ this.data[this.pos++] = u;
+};
+
+ArrayBufferDataStream.prototype.writeDoubleBE = function(d) {
+ let bytes = new Uint8Array(new Float64Array([d]).buffer);
+
+ for (let i = bytes.length - 1; i >= 0; i--) {
+ this.writeByte(bytes[i]);
+ }
+};
+
+ArrayBufferDataStream.prototype.writeFloatBE = function(d) {
+ let bytes = new Uint8Array(new Float32Array([d]).buffer);
+
+ for (let i = bytes.length - 1; i >= 0; i--) {
+ this.writeByte(bytes[i]);
+ }
+};
+
+/**
+ * Write an ASCII string to the stream
+ */
+ArrayBufferDataStream.prototype.writeString = function(s) {
+ for (let i = 0; i < s.length; i++) {
+ this.data[this.pos++] = s.charCodeAt(i);
+ }
+};
+
+/**
+ * Write the given 32-bit integer to the stream as an EBML variable-length
+ * integer using the given byte width (use measureEBMLVarInt).
+ *
+ * No error checking is performed to ensure that the supplied width is correct
+ * for the integer.
+ *
+ * @param i Integer to be written
+ * @param width Number of bytes to write to the stream
+ */
+ArrayBufferDataStream.prototype.writeEBMLVarIntWidth = function(i, width) {
+ switch (width) {
+ case 1:
+ this.writeU8((1 << 7) | i);
+ break;
+ case 2:
+ this.writeU8((1 << 6) | (i >> 8));
+ this.writeU8(i);
+ break;
+ case 3:
+ this.writeU8((1 << 5) | (i >> 16));
+ this.writeU8(i >> 8);
+ this.writeU8(i);
+ break;
+ case 4:
+ this.writeU8((1 << 4) | (i >> 24));
+ this.writeU8(i >> 16);
+ this.writeU8(i >> 8);
+ this.writeU8(i);
+ break;
+ case 5:
+ /*
+ * JavaScript converts its doubles to 32-bit integers for bitwise
+ * operations, so we need to do a division by 2^32 instead of a
+ * right-shift of 32 to retain those top 3 bits
+ */
+ this.writeU8((1 << 3) | ((i / 4294967296) & 0x7));
+ this.writeU8(i >> 24);
+ this.writeU8(i >> 16);
+ this.writeU8(i >> 8);
+ this.writeU8(i);
+ break;
+ default:
+ throw new Error('Bad EBML VINT size ' + width);
+ }
+};
+
+/**
+ * Return the number of bytes needed to encode the given integer as an EBML
+ * VINT.
+ */
+ArrayBufferDataStream.prototype.measureEBMLVarInt = function(val) {
+ if (val < (1 << 7) - 1) {
+ /* Top bit is set, leaving 7 bits to hold the integer, but we can't store
+ * 127 because "all bits set to one" is a reserved value. Same thing for the
+ * other cases below:
+ */
+ return 1;
+ } else if (val < (1 << 14) - 1) {
+ return 2;
+ } else if (val < (1 << 21) - 1) {
+ return 3;
+ } else if (val < (1 << 28) - 1) {
+ return 4;
+ } else if (val < 34359738367) { // 2 ^ 35 - 1 (can address 32GB)
+ return 5;
+ } else {
+ throw new Error('EBML VINT size not supported ' + val);
+ }
+};
+
+ArrayBufferDataStream.prototype.writeEBMLVarInt = function(i) {
+ this.writeEBMLVarIntWidth(i, this.measureEBMLVarInt(i));
+};
+
+/**
+ * Write the given unsigned 32-bit integer to the stream in big-endian order
+ * using the given byte width. No error checking is performed to ensure that the
+ * supplied width is correct for the integer.
+ *
+ * Omit the width parameter to have it determined automatically for you.
+ *
+ * @param u Unsigned integer to be written
+ * @param width Number of bytes to write to the stream
+ */
+ArrayBufferDataStream.prototype.writeUnsignedIntBE = function(u, width) {
+ if (width === undefined) {
+ width = this.measureUnsignedInt(u);
+ }
+
+ // Each case falls through:
+ switch (width) {
+ case 5:
+ this.writeU8(
+ Math.floor(u / 4294967296)); // Need to use division to access >32
+ // bits of floating point var
+ case 4:
+ this.writeU8(u >> 24);
+ case 3:
+ this.writeU8(u >> 16);
+ case 2:
+ this.writeU8(u >> 8);
+ case 1:
+ this.writeU8(u);
+ break;
+ default:
+ throw new Error('Bad UINT size ' + width);
+ }
+};
+
+/**
+ * Return the number of bytes needed to hold the non-zero bits of the given
+ * unsigned integer.
+ */
+ArrayBufferDataStream.prototype.measureUnsignedInt = function(val) {
+ // Force to 32-bit unsigned integer
+ if (val < (1 << 8)) {
+ return 1;
+ } else if (val < (1 << 16)) {
+ return 2;
+ } else if (val < (1 << 24)) {
+ return 3;
+ } else if (val < 4294967296) {
+ return 4;
+ } else {
+ return 5;
+ }
+};
+
+/**
+ * Return a view on the portion of the buffer from the beginning to the current
+ * seek position as a Uint8Array.
+ */
+ArrayBufferDataStream.prototype.getAsDataArray = function() {
+ if (this.pos < this.data.byteLength) {
+ return this.data.subarray(0, this.pos);
+ } else if (this.pos == this.data.byteLength) {
+ return this.data;
+ } else {
+ throw new Error('ArrayBufferDataStream\'s pos lies beyond end of buffer');
+ }
+};
+
+if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
+ module.exports = ArrayBufferDataStream;
+} else {
+ self.ArrayBufferDataStream = ArrayBufferDataStream;
+}
+}());
+'use strict';
+
+/**
+ * Allows a series of Blob-convertible objects (ArrayBuffer, Blob, String, etc)
+ * to be added to a buffer. Seeking and overwriting of blobs is allowed.
+ *
+ * You can supply a FileWriter, in which case the BlobBuffer is just used as
+ * temporary storage before it writes it through to the disk.
+ *
+ * By Nicholas Sherlock
+ *
+ * Released under the WTFPLv2 https://en.wikipedia.org/wiki/WTFPL
+ */
+(function() {
+let BlobBuffer = function(fs) {
+ return function(destination) {
+ let buffer = [], writePromise = Promise.resolve(), fileWriter = null,
+ fd = null;
+
+ if (destination &&
+ destination.constructor.name === 'FileSystemWritableFileStream') {
+ fileWriter = destination;
+ } else if (fs && destination) {
+ fd = destination;
+ }
+
+ // Current seek offset
+ this.pos = 0;
+
+ // One more than the index of the highest byte ever written
+ this.length = 0;
+
+ // Returns a promise that converts the blob to an ArrayBuffer
+ function readBlobAsBuffer(blob) {
+ return new Promise(function(resolve, reject) {
+ let reader = new FileReader();
+
+ reader.addEventListener('loadend', function() {
+ resolve(reader.result);
+ });
+
+ reader.readAsArrayBuffer(blob);
+ });
+ }
+
+ function convertToUint8Array(thing) {
+ return new Promise(function(resolve, reject) {
+ if (thing instanceof Uint8Array) {
+ resolve(thing);
+ } else if (thing instanceof ArrayBuffer || ArrayBuffer.isView(thing)) {
+ resolve(new Uint8Array(thing));
+ } else if (thing instanceof Blob) {
+ resolve(readBlobAsBuffer(thing).then(function(buffer) {
+ return new Uint8Array(buffer);
+ }));
+ } else {
+ // Assume that Blob will know how to read this thing
+ resolve(readBlobAsBuffer(new Blob([thing])).then(function(buffer) {
+ return new Uint8Array(buffer);
+ }));
+ }
+ });
+ }
+
+ function measureData(data) {
+ let result = data.byteLength || data.length || data.size;
+
+ if (!Number.isInteger(result)) {
+ throw new Error('Failed to determine size of element');
+ }
+
+ return result;
+ }
+
+ /**
+ * Seek to the given absolute offset.
+ *
+ * You may not seek beyond the end of the file (this would create a hole
+ * and/or allow blocks to be written in non- sequential order, which isn't
+ * currently supported by the memory buffer backend).
+ */
+ this.seek = function(offset) {
+ if (offset < 0) {
+ throw new Error('Offset may not be negative');
+ }
+
+ if (isNaN(offset)) {
+ throw new Error('Offset may not be NaN');
+ }
+
+ if (offset > this.length) {
+ throw new Error('Seeking beyond the end of file is not allowed');
+ }
+
+ this.pos = offset;
+ };
+
+ /**
+ * Write the Blob-convertible data to the buffer at the current seek
+ * position.
+ *
+ * Note: If overwriting existing data, the write must not cross preexisting
+ * block boundaries (written data must be fully contained by the extent of a
+ * previous write).
+ */
+ this.write = function(data) {
+ let newEntry = {offset: this.pos, data: data, length: measureData(data)},
+ isAppend = newEntry.offset >= this.length;
+
+ this.pos += newEntry.length;
+ this.length = Math.max(this.length, this.pos);
+
+ // After previous writes complete, perform our write
+ writePromise = writePromise.then(async function() {
+ if (fd) {
+ return new Promise(function(resolve, reject) {
+ convertToUint8Array(newEntry.data).then(function(dataArray) {
+ let totalWritten = 0, buffer = Buffer.from(dataArray.buffer),
+
+ handleWriteComplete = function(err, written, buffer) {
+ totalWritten += written;
+
+ if (totalWritten >= buffer.length) {
+ resolve();
+ } else {
+ // We still have more to write...
+ fs.write(
+ fd, buffer, totalWritten,
+ buffer.length - totalWritten,
+ newEntry.offset + totalWritten, handleWriteComplete);
+ }
+ };
+
+ fs.write(
+ fd, buffer, 0, buffer.length, newEntry.offset,
+ handleWriteComplete);
+ });
+ });
+ } else if (fileWriter) {
+ return new Promise(function(resolve, reject) {
+ fileWriter.seek(newEntry.offset)
+ .then(() => {fileWriter.write(new Blob([newEntry.data]))})
+ .then(() => {resolve();
+ })
+ });
+ } else if (!isAppend) {
+ // We might be modifying a write that was already buffered in memory.
+
+ // Slow linear search to find a block we might be overwriting
+ for (let i = 0; i < buffer.length; i++) {
+ let entry = buffer[i];
+
+ // If our new entry overlaps the old one in any way...
+ if (!(newEntry.offset + newEntry.length <= entry.offset ||
+ newEntry.offset >= entry.offset + entry.length)) {
+ if (newEntry.offset < entry.offset ||
+ newEntry.offset + newEntry.length >
+ entry.offset + entry.length) {
+ throw new Error('Overwrite crosses blob boundaries');
+ }
+
+ if (newEntry.offset == entry.offset &&
+ newEntry.length == entry.length) {
+ // We overwrote the entire block
+ entry.data = newEntry.data;
+
+ // We're done
+ return;
+ } else {
+ return convertToUint8Array(entry.data)
+ .then(function(entryArray) {
+ entry.data = entryArray;
+
+ return convertToUint8Array(newEntry.data);
+ })
+ .then(function(newEntryArray) {
+ newEntry.data = newEntryArray;
+
+ entry.data.set(
+ newEntry.data, newEntry.offset - entry.offset);
+ });
+ }
+ }
+ }
+ // Else fall through to do a simple append, as we didn't overwrite any
+ // pre-existing blocks
+ }
+
+ buffer.push(newEntry);
+ });
+ };
+
+ /**
+ * Finish all writes to the buffer, returning a promise that signals when
+ * that is complete.
+ *
+ * If a FileWriter was not provided, the promise is resolved with a Blob
+ * that represents the completed BlobBuffer contents. You can optionally
+ * pass in a mimeType to be used for this blob.
+ *
+ * If a FileWriter was provided, the promise is resolved with null as the
+ * first argument.
+ */
+ this.complete = function(mimeType) {
+ if (fd || fileWriter) {
+ writePromise = writePromise.then(function() {
+ return null;
+ });
+ } else {
+ // After writes complete we need to merge the buffer to give to the
+ // caller
+ writePromise = writePromise.then(function() {
+ let result = [];
+
+ for (let i = 0; i < buffer.length; i++) {
+ result.push(buffer[i].data);
+ }
+
+ return new Blob(result, {type: mimeType});
+ });
+ }
+
+ return writePromise;
+ };
+ };
+};
+
+if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
+ module.exports = BlobBuffer(require('fs'));
+} else {
+ self.BlobBuffer = BlobBuffer(null);
+}
+})();
+/**
+ * WebM video encoder for Google Chrome. This implementation is suitable for
+ * creating very large video files, because it can stream Blobs directly to a
+ * FileWriter without buffering the entire video in memory.
+ *
+ * When FileWriter is not available or not desired, it can buffer the video in
+ * memory as a series of Blobs which are eventually returned as one composite
+ * Blob.
+ *
+ * By Nicholas Sherlock.
+ *
+ * Based on the ideas from Whammy: https://github.com/antimatter15/whammy
+ *
+ * Released under the WTFPLv2 https://en.wikipedia.org/wiki/WTFPL
+ */
+
+'use strict';
+
+(function() {
+function extend(base, top) {
+ let target = {};
+
+ [base, top].forEach(function(obj) {
+ for (let prop in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, prop)) {
+ target[prop] = obj[prop];
+ }
+ }
+ });
+
+ return target;
+}
+
+/**
+ * @param {String} string
+ * @returns {number}
+ */
+function byteStringToUint32LE(string) {
+ let a = string.charCodeAt(0), b = string.charCodeAt(1),
+ c = string.charCodeAt(2), d = string.charCodeAt(3);
+
+ return (a | (b << 8) | (c << 16) | (d << 24)) >>> 0;
+}
+
+
+// Just a little utility so we can tag values as floats for the EBML encoder's
+// benefit
+function EBMLFloat32(value) {
+ this.value = value;
+}
+
+function EBMLFloat64(value) {
+ this.value = value;
+}
+
+/**
+ * Write the given EBML object to the provided ArrayBufferStream.
+ *
+ * @param buffer
+ * @param {Number} bufferFileOffset - The buffer's first byte is at this
+ * position inside the video file.
+ * This is used to complete offset and
+ * dataOffset fields in each EBML structure, indicating the file offset of the
+ * first byte of the EBML element and its data payload.
+ * @param {*} ebml
+ */
+function writeEBML(buffer, bufferFileOffset, ebml) {
+ // Is the ebml an array of sibling elements?
+ if (Array.isArray(ebml)) {
+ for (let i = 0; i < ebml.length; i++) {
+ writeEBML(buffer, bufferFileOffset, ebml[i]);
+ }
+ // Is this some sort of raw data that we want to write directly?
+ } else if (typeof ebml === 'string') {
+ buffer.writeString(ebml);
+ } else if (ebml instanceof Uint8Array) {
+ buffer.writeBytes(ebml);
+ } else if (ebml.id) {
+ // We're writing an EBML element
+ ebml.offset = buffer.pos + bufferFileOffset;
+
+ buffer.writeUnsignedIntBE(ebml.id); // ID field
+
+ // Now we need to write the size field, so we must know the payload size:
+
+ if (Array.isArray(ebml.data)) {
+ // Writing an array of child elements. We won't try to measure the size of
+ // the children up-front
+
+ let sizePos, dataBegin, dataEnd;
+
+ if (ebml.size === -1) {
+ // Write the reserved all-one-bits marker to note that the size of this
+ // element is unknown/unbounded
+ buffer.writeByte(0xFF);
+ } else {
+ sizePos = buffer.pos;
+
+ /* Write a dummy size field to overwrite later. 4 bytes allows an
+ * element maximum size of 256MB, which should be plenty (we don't want
+ * to have to buffer that much data in memory at one time anyway!)
+ */
+ buffer.writeBytes([0, 0, 0, 0]);
+ }
+
+ dataBegin = buffer.pos;
+
+ ebml.dataOffset = dataBegin + bufferFileOffset;
+ writeEBML(buffer, bufferFileOffset, ebml.data);
+
+ if (ebml.size !== -1) {
+ dataEnd = buffer.pos;
+
+ ebml.size = dataEnd - dataBegin;
+
+ buffer.seek(sizePos);
+ buffer.writeEBMLVarIntWidth(ebml.size, 4); // Size field
+
+ buffer.seek(dataEnd);
+ }
+ } else if (typeof ebml.data === 'string') {
+ buffer.writeEBMLVarInt(ebml.data.length); // Size field
+ ebml.dataOffset = buffer.pos + bufferFileOffset;
+ buffer.writeString(ebml.data);
+ } else if (typeof ebml.data === 'number') {
+ // Allow the caller to explicitly choose the size if they wish by
+ // supplying a size field
+ if (!ebml.size) {
+ ebml.size = buffer.measureUnsignedInt(ebml.data);
+ }
+
+ buffer.writeEBMLVarInt(ebml.size); // Size field
+ ebml.dataOffset = buffer.pos + bufferFileOffset;
+ buffer.writeUnsignedIntBE(ebml.data, ebml.size);
+ } else if (ebml.data instanceof EBMLFloat64) {
+ buffer.writeEBMLVarInt(8); // Size field
+ ebml.dataOffset = buffer.pos + bufferFileOffset;
+ buffer.writeDoubleBE(ebml.data.value);
+ } else if (ebml.data instanceof EBMLFloat32) {
+ buffer.writeEBMLVarInt(4); // Size field
+ ebml.dataOffset = buffer.pos + bufferFileOffset;
+ buffer.writeFloatBE(ebml.data.value);
+ } else if (ebml.data instanceof Uint8Array) {
+ buffer.writeEBMLVarInt(ebml.data.byteLength); // Size field
+ ebml.dataOffset = buffer.pos + bufferFileOffset;
+ buffer.writeBytes(ebml.data);
+ } else {
+ throw new Error('Bad EBML datatype ' + typeof ebml.data);
+ }
+ } else {
+ throw new Error('Bad EBML datatype ' + typeof ebml.data);
+ }
+}
+
+/**
+ * @typedef {Object} Frame
+ * @property {string} frame - Raw VP8 frame data
+ * @property {Number} trackNumber - From 1 to 126 (inclusive)
+ * @property {Number} timecode
+ */
+
+/**
+ * @typedef {Object} Cluster
+ * @property {Number} timecode - Start time for the cluster
+ */
+
+/**
+ * @param ArrayBufferDataStream - Imported library
+ * @param BlobBuffer - Imported library
+ *
+ * @returns WebMWriter
+ *
+ * @constructor
+ */
+let WebMWriter = function(ArrayBufferDataStream, BlobBuffer) {
+ return function(options) {
+ let MAX_CLUSTER_DURATION_MSEC = 5000000, DEFAULT_TRACK_NUMBER = 1,
+ writtenHeader = false, videoWidth = 0, videoHeight = 0,
+ firstTimestampEver = true, earliestTimestamp = 0,
+
+
+ /**
+ *
+ * @type {Frame[]}
+ */
+ clusterFrameBuffer = [], clusterStartTime = 0, clusterDuration = 0,
+ lastTimeCode = 0,
+
+ optionDefaults = {
+ fileWriter: null, // Chrome FileWriter in order to stream to a file
+ // instead of buffering to memory (optional)
+ fd: null, // Node.JS file descriptor to write to instead of buffering
+ // (optional)
+ codec: 'VP8', // Codec to write to webm file
+
+ },
+
+ seekPoints = {
+ Cues: {id: new Uint8Array([0x1C, 0x53, 0xBB, 0x6B]), positionEBML: null},
+ SegmentInfo:
+ {id: new Uint8Array([0x15, 0x49, 0xA9, 0x66]), positionEBML: null},
+ Tracks:
+ {id: new Uint8Array([0x16, 0x54, 0xAE, 0x6B]), positionEBML: null},
+ },
+
+ ebmlSegment, // Root element of the EBML document
+
+ segmentDuration = {
+ 'id': 0x4489, // Duration
+ 'data': new EBMLFloat64(0)
+ },
+
+ seekHead,
+
+ cues = [],
+
+ blobBuffer = new BlobBuffer(options.fileWriter || options.fd);
+
+ function fileOffsetToSegmentRelative(fileOffset) {
+ return fileOffset - ebmlSegment.dataOffset;
+ }
+
+
+ /**
+ * Create a SeekHead element with descriptors for the points in the global
+ * seekPoints array.
+ *
+ * 5 bytes of position values are reserved for each node, which lie at the
+ * offset point.positionEBML.dataOffset, to be overwritten later.
+ */
+ function createSeekHead() {
+ let seekPositionEBMLTemplate = {
+ 'id': 0x53AC, // SeekPosition
+ 'size': 5, // Allows for 32GB video files
+ 'data': 0 // We'll overwrite this when the file is complete
+ },
+
+ result = {
+ 'id': 0x114D9B74, // SeekHead
+ 'data': []
+ };
+
+ for (let name in seekPoints) {
+ let seekPoint = seekPoints[name];
+
+ seekPoint.positionEBML = Object.create(seekPositionEBMLTemplate);
+
+ result.data.push({
+ 'id': 0x4DBB, // Seek
+ 'data': [
+ {
+ 'id': 0x53AB, // SeekID
+ 'data': seekPoint.id
+ },
+ seekPoint.positionEBML
+ ]
+ });
+ }
+
+ return result;
+ }
+
+ /**
+ * Write the WebM file header to the stream.
+ */
+ function writeHeader() {
+ seekHead = createSeekHead();
+
+ let ebmlHeader = {
+ 'id': 0x1a45dfa3, // EBML
+ 'data': [
+ {
+ 'id': 0x4286, // EBMLVersion
+ 'data': 1
+ },
+ {
+ 'id': 0x42f7, // EBMLReadVersion
+ 'data': 1
+ },
+ {
+ 'id': 0x42f2, // EBMLMaxIDLength
+ 'data': 4
+ },
+ {
+ 'id': 0x42f3, // EBMLMaxSizeLength
+ 'data': 8
+ },
+ {
+ 'id': 0x4282, // DocType
+ 'data': 'webm'
+ },
+ {
+ 'id': 0x4287, // DocTypeVersion
+ 'data': 2
+ },
+ {
+ 'id': 0x4285, // DocTypeReadVersion
+ 'data': 2
+ }
+ ]
+ },
+
+ segmentInfo = {
+ 'id': 0x1549a966, // Info
+ 'data': [
+ {
+ 'id': 0x2ad7b1, // TimecodeScale
+ 'data': 1e6 // Times will be in microseconds (1e6 nanoseconds
+ // per step = 1ms)
+ },
+ {
+ 'id': 0x4d80, // MuxingApp
+ 'data': 'webm-writer-js',
+ },
+ {
+ 'id': 0x5741, // WritingApp
+ 'data': 'webm-writer-js'
+ },
+ segmentDuration // To be filled in later
+ ]
+ },
+
+ videoProperties = [
+ {
+ 'id': 0xb0, // PixelWidth
+ 'data': videoWidth
+ },
+ {
+ 'id': 0xba, // PixelHeight
+ 'data': videoHeight
+ }
+ ];
+
+ let tracks = {
+ 'id': 0x1654ae6b, // Tracks
+ 'data': [{
+ 'id': 0xae, // TrackEntry
+ 'data': [
+ {
+ 'id': 0xd7, // TrackNumber
+ 'data': DEFAULT_TRACK_NUMBER
+ },
+ {
+ 'id': 0x73c5, // TrackUID
+ 'data': DEFAULT_TRACK_NUMBER
+ },
+ {
+ 'id': 0x83, // TrackType
+ 'data': 1
+ },
+ {
+ 'id': 0xe0, // Video
+ 'data': videoProperties
+ },
+ {
+ 'id': 0x9c, // FlagLacing
+ 'data': 0
+ },
+ {
+ 'id': 0x22b59c, // Language
+ 'data': 'und'
+ },
+ {
+ 'id': 0xb9, // FlagEnabled
+ 'data': 1
+ },
+ {
+ 'id': 0x88, // FlagDefault
+ 'data': 1
+ },
+ {
+ 'id': 0x55aa, // FlagForced
+ 'data': 0
+ },
+
+ {
+ 'id': 0x86, // CodecID
+ 'data': 'V_' + options.codec
+ }, /*
+ (options.codec == 'VP8' ?
+ {
+ 'id': 0x63A2, // Codec private data
+ 'data': []
+ } :
+ {
+ 'id': 0x63A2, // Codec private data for vp9
+ 'data': [
+ {
+ 'id': 1, // vp9 Profile
+ 'size': 1,
+ 'data': 0
+ },
+ {
+ 'id': 2, // Feature level
+ 'size': 1,
+ 'data': 10
+ },
+ {
+ 'id': 3, // bitdepth level
+ 'size': 1,
+ 'data': 8
+ },
+ {
+ 'id': 4, // color sampling
+ 'size': 1,
+ 'data': 0
+ }
+ ]
+ }),
+ {
+ 'id': 0x258688, // CodecName
+ 'data': options.codec
+ },*/
+ ]
+ }]
+ };
+
+ ebmlSegment = {
+ 'id': 0x18538067, // Segment
+ 'size': -1, // Unbounded size
+ 'data': [
+ seekHead,
+ segmentInfo,
+ tracks,
+ ]
+ };
+
+ let bufferStream = new ArrayBufferDataStream(256);
+
+ writeEBML(bufferStream, blobBuffer.pos, [ebmlHeader, ebmlSegment]);
+ blobBuffer.write(bufferStream.getAsDataArray());
+
+ // Now we know where these top-level elements lie in the file:
+ seekPoints.SegmentInfo.positionEBML.data =
+ fileOffsetToSegmentRelative(segmentInfo.offset);
+ seekPoints.Tracks.positionEBML.data =
+ fileOffsetToSegmentRelative(tracks.offset);
+
+ writtenHeader = true;
+ }
+
+ /**
+ * Create a SimpleBlock element to hold the given frame.
+ *
+ * @param {Frame} frame
+ *
+ * @return A SimpleBlock EBML element.
+ */
+ function createSimpleBlockForframe(frame) {
+ let bufferStream = new ArrayBufferDataStream(1 + 2 + 1);
+
+ if (!(frame.trackNumber > 0 && frame.trackNumber < 127)) {
+ throw new Error('TrackNumber must be > 0 and < 127');
+ }
+
+ bufferStream.writeEBMLVarInt(
+ frame.trackNumber); // Always 1 byte since we limit the range of
+ // trackNumber
+ bufferStream.writeU16BE(frame.timecode);
+
+ // Flags byte
+ bufferStream.writeByte(
+ (frame.type == "key" ? 1 : 0) << 7 // frame
+ );
+
+ return {
+ 'id': 0xA3, // SimpleBlock
+ 'data': [bufferStream.getAsDataArray(), frame.frame]
+ };
+ }
+
+ /**
+ * Create a Cluster EBML node.
+ *
+ * @param {Cluster} cluster
+ *
+ * Returns an EBML element.
+ */
+ function createCluster(cluster) {
+ return {
+ 'id': 0x1f43b675,
+ 'data': [{
+ 'id': 0xe7, // Timecode
+ 'data': Math.round(cluster.timecode)
+ }]
+ };
+ }
+
+ function addCuePoint(trackIndex, clusterTime, clusterFileOffset) {
+ cues.push({
+ 'id': 0xBB, // Cue
+ 'data': [
+ {
+ 'id': 0xB3, // CueTime
+ 'data': clusterTime
+ },
+ {
+ 'id': 0xB7, // CueTrackPositions
+ 'data': [
+ {
+ 'id': 0xF7, // CueTrack
+ 'data': trackIndex
+ },
+ {
+ 'id': 0xF1, // CueClusterPosition
+ 'data': fileOffsetToSegmentRelative(clusterFileOffset)
+ }
+ ]
+ }
+ ]
+ });
+ }
+
+ /**
+ * Write a Cues element to the blobStream using the global `cues` array of
+ * CuePoints (use addCuePoint()). The seek entry for the Cues in the
+ * SeekHead is updated.
+ */
+ function writeCues() {
+ let ebml = {'id': 0x1C53BB6B, 'data': cues},
+
+ cuesBuffer = new ArrayBufferDataStream(
+ 16 +
+ cues.length *
+ 32); // Pretty crude estimate of the buffer size we'll need
+
+ writeEBML(cuesBuffer, blobBuffer.pos, ebml);
+ blobBuffer.write(cuesBuffer.getAsDataArray());
+
+ // Now we know where the Cues element has ended up, we can update the
+ // SeekHead
+ seekPoints.Cues.positionEBML.data =
+ fileOffsetToSegmentRelative(ebml.offset);
+ }
+
+ /**
+ * Flush the frames in the current clusterFrameBuffer out to the stream as a
+ * Cluster.
+ */
+ function flushClusterFrameBuffer() {
+ if (clusterFrameBuffer.length === 0) {
+ return;
+ }
+
+ // First work out how large of a buffer we need to hold the cluster data
+ let rawImageSize = 0;
+
+ for (let i = 0; i < clusterFrameBuffer.length; i++) {
+ rawImageSize += clusterFrameBuffer[i].frame.byteLength;
+ }
+
+ let buffer = new ArrayBufferDataStream(
+ rawImageSize +
+ clusterFrameBuffer.length *
+ 64), // Estimate 64 bytes per block header
+
+ cluster = createCluster({
+ timecode: Math.round(clusterStartTime),
+ });
+
+ for (let i = 0; i < clusterFrameBuffer.length; i++) {
+ cluster.data.push(createSimpleBlockForframe(clusterFrameBuffer[i]));
+ }
+
+ writeEBML(buffer, blobBuffer.pos, cluster);
+ blobBuffer.write(buffer.getAsDataArray());
+
+ addCuePoint(
+ DEFAULT_TRACK_NUMBER, Math.round(clusterStartTime), cluster.offset);
+
+ clusterFrameBuffer = [];
+ clusterDuration = 0;
+ }
+
+ function validateOptions() {
+ }
+
+ /**
+ *
+ * @param {Frame} frame
+ */
+ function addFrameToCluster(frame) {
+ frame.trackNumber = DEFAULT_TRACK_NUMBER;
+ var time = frame.intime / 1000;
+ if (firstTimestampEver) {
+ earliestTimestamp = time;
+ time = 0;
+ firstTimestampEver = false;
+ } else {
+ time = time - earliestTimestamp;
+ }
+ lastTimeCode = time;
+ if (clusterDuration == 0) clusterStartTime = time;
+
+ // Frame timecodes are relative to the start of their cluster:
+ // frame.timecode = Math.round(clusterDuration);
+ frame.timecode = Math.round(time - clusterStartTime);
+
+ clusterFrameBuffer.push(frame);
+ clusterDuration = frame.timecode + 1;
+
+ if (clusterDuration >= MAX_CLUSTER_DURATION_MSEC) {
+ flushClusterFrameBuffer();
+ }
+ }
+
+ /**
+ * Rewrites the SeekHead element that was initially written to the stream
+ * with the offsets of top level elements.
+ *
+ * Call once writing is complete (so the offset of all top level elements
+ * is known).
+ */
+ function rewriteSeekHead() {
+ let seekHeadBuffer = new ArrayBufferDataStream(seekHead.size),
+ oldPos = blobBuffer.pos;
+
+ // Write the rewritten SeekHead element's data payload to the stream
+ // (don't need to update the id or size)
+ writeEBML(seekHeadBuffer, seekHead.dataOffset, seekHead.data);
+
+ // And write that through to the file
+ blobBuffer.seek(seekHead.dataOffset);
+ blobBuffer.write(seekHeadBuffer.getAsDataArray());
+ blobBuffer.seek(oldPos);
+ }
+
+ /**
+ * Rewrite the Duration field of the Segment with the newly-discovered
+ * video duration.
+ */
+ function rewriteDuration() {
+ let buffer = new ArrayBufferDataStream(8), oldPos = blobBuffer.pos;
+
+ // Rewrite the data payload (don't need to update the id or size)
+ buffer.writeDoubleBE(lastTimeCode);
+
+ // And write that through to the file
+ blobBuffer.seek(segmentDuration.dataOffset);
+ blobBuffer.write(buffer.getAsDataArray());
+
+ blobBuffer.seek(oldPos);
+ }
+
+ /**
+ * Add a frame to the video.
+ *
+ * @param {HTMLCanvasElement|String} frame - A Canvas element that
+ * contains the frame, or a WebP string you obtained by calling
+ * toDataUrl() on an image yourself.
+ *
+ */
+ this.addFrame = function(frame) {
+ if (!writtenHeader) {
+ videoWidth = options.width;
+ videoHeight = options.height;
+ writeHeader();
+ }
+ if (frame.constructor.name == 'EncodedVideoChunk') {
+ let frameData = new Uint8Array(frame.byteLength);
+ frame.copyTo(frameData);
+ addFrameToCluster({
+ frame: frameData,
+ intime: frame.timestamp,
+ type: frame.type,
+ });
+ return;
+ }
+ };
+
+ /**
+ * Finish writing the video and return a Promise to signal completion.
+ *
+ * If the destination device was memory (i.e. options.fileWriter was not
+ * supplied), the Promise is resolved with a Blob with the contents of the
+ * entire video.
+ */
+ this.complete = function() {
+ if (!writtenHeader) {
+ writeHeader();
+ }
+ firstTimestampEver = true;
+
+ flushClusterFrameBuffer();
+
+ writeCues();
+ rewriteSeekHead();
+ rewriteDuration();
+
+ return blobBuffer.complete('video/webm');
+ };
+
+ this.getWrittenSize = function() {
+ return blobBuffer.length;
+ };
+
+ options = extend(optionDefaults, options || {});
+ validateOptions();
+ };
+ };
+
+ if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
+ module.exports =
+ WebMWriter(require('./ArrayBufferDataStream'), require('./BlobBuffer'));
+} else {
+ self.WebMWriter =
+ WebMWriter(self.ArrayBufferDataStream, self.BlobBuffer);
+}
+})();
diff --git a/src/magic-check.min.css b/src/magic-check.min.css
new file mode 100644
index 0000000..94ee8ec
--- /dev/null
+++ b/src/magic-check.min.css
@@ -0,0 +1 @@
+@keyframes a{0%{border-color:silver}to{border-color:#3e97eb}}.magic-checkbox,.magic-radio{position:absolute;display:none}.magic-checkbox[disabled],.magic-radio[disabled]{cursor:not-allowed}.magic-checkbox+label,.magic-radio+label{position:relative;display:block;padding-left:30px;cursor:pointer;vertical-align:middle}.magic-checkbox+label:hover:before,.magic-radio+label:hover:before{animation-duration:.4s;animation-fill-mode:both;animation-name:a}.magic-checkbox+label:before,.magic-radio+label:before{position:absolute;top:0;left:0;display:inline-block;width:20px;height:20px;content:'';border:1px solid silver}.magic-checkbox+label:after,.magic-radio+label:after{position:absolute;display:none;content:''}.magic-checkbox[disabled]+label,.magic-radio[disabled]+label{cursor:not-allowed;color:#e4e4e4}.magic-checkbox[disabled]+label:after,.magic-checkbox[disabled]+label:before,.magic-checkbox[disabled]+label:hover,.magic-radio[disabled]+label:after,.magic-radio[disabled]+label:before,.magic-radio[disabled]+label:hover{cursor:not-allowed}.magic-checkbox[disabled]+label:hover:before,.magic-radio[disabled]+label:hover:before{border:1px solid #e4e4e4;animation-name:none}.magic-checkbox[disabled]+label:before,.magic-radio[disabled]+label:before{border-color:#e4e4e4}.magic-checkbox:checked+label:before,.magic-radio:checked+label:before{animation-name:none}.magic-checkbox:checked+label:after,.magic-radio:checked+label:after{display:block}.magic-radio+label:before{border-radius:50%}.magic-radio+label:after{top:6px;left:6px;width:8px;height:8px;border-radius:50%;background:#3e97eb}.magic-radio:checked+label:before{border:1px solid #3e97eb}.magic-radio:checked[disabled]+label:before{border:1px solid #c9e2f9}.magic-radio:checked[disabled]+label:after{background:#c9e2f9}.magic-checkbox+label:before{border-radius:3px}.magic-checkbox+label:after{top:2px;left:7px;box-sizing:border-box;width:6px;height:12px;transform:rotate(45deg);border:2px solid #fff;border-top:0;border-left:0}.magic-checkbox:checked+label:before{border:#3e97eb;background:#3e97eb}.magic-checkbox:checked[disabled]+label:before{border:#c9e2f9;background:#c9e2f9}
diff --git a/src/meta.png b/src/meta.png
new file mode 100644
index 0000000..51ab5f4
Binary files /dev/null and b/src/meta.png differ
diff --git a/src/nice-select.css b/src/nice-select.css
new file mode 100644
index 0000000..7d311e1
--- /dev/null
+++ b/src/nice-select.css
@@ -0,0 +1,124 @@
+.nice-select {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #fff;
+ border-radius: 5px;
+ border: solid 1px #D3DADF;
+ box-sizing: border-box;
+ clear: both;
+ cursor: pointer;
+ display: block;
+ float: left;
+ font-family: inherit;
+ font-size: 14px;
+ font-weight: normal;
+ height: 42px;
+ line-height: 40px;
+ outline: none;
+ padding-left: 18px;
+ padding-right: 30px;
+ position: relative;
+ text-align: left !important;
+ transition: all 0.2s ease-in-out;
+ user-select: none;
+ white-space: nowrap;
+ box-sizing: border-box;
+ width: auto; }
+ .nice-select:hover {
+ border-color: #dbdbdb; }
+ .nice-select:active, .nice-select.open, .nice-select:focus {
+ border-color: #D3DADF; border-width: 1.5px; }
+ .nice-select:after {
+ border-bottom: 2px solid #999;
+ border-right: 2px solid #999;
+ content: '';
+ display: block;
+ height: 5px;
+ margin-top: -4px;
+ pointer-events: none;
+ position: absolute;
+ right: 12px;
+ top: 50%;
+ transform-origin: 66% 66%;
+ transform: rotate(45deg);
+ transition: all 0.15s ease-in-out;
+ width: 5px; }
+ .nice-select.open:after {
+ transform: rotate(-135deg); }
+ .nice-select.open .list {
+ opacity: 1;
+ pointer-events: auto;
+ transform: scaleY(1) translateY(0); }
+ .nice-select.disabled {
+ border-color: #ededed;
+ color: #999;
+ pointer-events: none; }
+ .nice-select.disabled:after {
+ border-color: #cccccc; }
+ .nice-select.wide {
+ width: 100%; }
+ .nice-select.wide .list {
+ left: 0 !important;
+ right: 0 !important; }
+ .nice-select.right {
+ float: right; }
+ .nice-select.right .list {
+ left: auto;
+ right: 0; }
+ .nice-select.small {
+ font-size: 12px;
+ height: 36px;
+ line-height: 34px; }
+ .nice-select.small:after {
+ height: 4px;
+ width: 4px; }
+ .nice-select.small .option {
+ line-height: 34px;
+ min-height: 34px; }
+ .nice-select .list {
+ background-color: #fff;
+ border-radius: 5px;
+ border: 1px solid rgba(68, 68, 68, 0.11);
+ box-sizing: border-box;
+ margin-top: 4px;
+ opacity: 0;
+ overflow: hidden;
+ padding: 0;
+ pointer-events: none;
+ position: absolute;
+ margin-left: -1px;
+ top: 100%;
+ left: 0;
+ -webkit-transform-origin: 50% 0;
+ -ms-transform-origin: 50% 0;
+ transform-origin: 50% 0;
+ transform: scaleY(0.75) translateY(-21px);
+ transition: all .15s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
+ z-index: 9; }
+ .nice-select .list:hover .option:not(:hover) {
+ background-color: transparent !important; }
+ .nice-select .option {
+ cursor: pointer;
+ font-weight: 400;
+ line-height: 40px;
+ list-style: none;
+ min-height: 40px;
+ outline: none;
+ padding-left: 18px;
+ padding-right: 29px;
+ text-align: left;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s; }
+ .nice-select .option:hover, .nice-select .option.focus, .nice-select .option.selected.focus {
+ background-color: #f6f6f6; }
+ .nice-select .option.selected {
+ font-weight: bold; }
+ .nice-select .option.disabled {
+ background-color: transparent;
+ color: #999;
+ cursor: default; }
+
+.no-csspointerevents .nice-select .list {
+ display: none; }
+
+.no-csspointerevents .nice-select.open .list {
+ display: block; }
diff --git a/src/pickr.css b/src/pickr.css
new file mode 100644
index 0000000..ad2e421
--- /dev/null
+++ b/src/pickr.css
@@ -0,0 +1 @@
+/*! Pickr 1.7.2 MIT | https://github.com/Simonwep/pickr */.pickr{position:relative;overflow:visible;transform:translateY(0)}.pickr *{box-sizing:border-box;outline:none;border:none;-webkit-appearance:none}.pickr .pcr-button{position:relative;height:2em;width:2em;padding:.5em;cursor:pointer;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;border-radius:.15em;background:url('data:image/svg+xml;utf8,
') no-repeat 50%;background-size:0;transition:all .3s}.pickr .pcr-button:before{background:url('data:image/svg+xml;utf8,
');background-size:.5em;z-index:-1;z-index:auto}.pickr .pcr-button:after,.pickr .pcr-button:before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;border-radius:.15em}.pickr .pcr-button:after{transition:background .3s;background:currentColor}.pickr .pcr-button.clear{background-size:70%}.pickr .pcr-button.clear:before{opacity:0}.pickr .pcr-button.clear:focus{box-shadow:0 0 0 1px hsla(0,0%,100%,.85),0 0 0 3px currentColor}.pickr .pcr-button.disabled{cursor:not-allowed}.pcr-app *,.pickr *{box-sizing:border-box;outline:none;border:none;-webkit-appearance:none}.pcr-app button.pcr-active,.pcr-app button:focus,.pcr-app input.pcr-active,.pcr-app input:focus,.pickr button.pcr-active,.pickr button:focus,.pickr input.pcr-active,.pickr input:focus{box-shadow:0 0 0 1px hsla(0,0%,100%,.85),0 0 0 3px currentColor}.pcr-app .pcr-palette,.pcr-app .pcr-slider,.pickr .pcr-palette,.pickr .pcr-slider{transition:box-shadow .3s}.pcr-app .pcr-palette:focus,.pcr-app .pcr-slider:focus,.pickr .pcr-palette:focus,.pickr .pcr-slider:focus{box-shadow:0 0 0 1px hsla(0,0%,100%,.85),0 0 0 3px rgba(0,0,0,.25)}.pcr-app{position:fixed;display:flex;flex-direction:column;z-index:10000;border-radius:.1em;background:#fff;opacity:0;visibility:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;box-shadow:0 .15em 1.5em 0 rgba(0,0,0,.1),0 0 1em 0 rgba(0,0,0,.03);left:0;top:0}.pcr-app.visible{transition:opacity .3s;visibility:visible;opacity:1}.pcr-app .pcr-swatches{display:flex;flex-wrap:wrap;margin-top:.75em}.pcr-app .pcr-swatches.pcr-last{margin:0}@supports (display:grid){.pcr-app .pcr-swatches{display:grid;align-items:center;grid-template-columns:repeat(auto-fit,1.75em)}}.pcr-app .pcr-swatches>button{font-size:1em;position:relative;width:calc(1.75em - 5px);height:calc(1.75em - 5px);border-radius:.15em;cursor:pointer;margin:2.5px;flex-shrink:0;justify-self:center;transition:all .15s;overflow:hidden;background:transparent;z-index:1}.pcr-app .pcr-swatches>button:before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8,
');background-size:6px;border-radius:.15em;z-index:-1}.pcr-app .pcr-swatches>button:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:currentColor;border:1px solid rgba(0,0,0,.05);border-radius:.15em;box-sizing:border-box}.pcr-app .pcr-swatches>button:hover{-webkit-filter:brightness(1.05);filter:brightness(1.05)}.pcr-app .pcr-swatches>button:not(.pcr-active){box-shadow:none}.pcr-app .pcr-interaction{display:flex;flex-wrap:wrap;align-items:center;margin:0 -.2em}.pcr-app .pcr-interaction>*{margin:0 .2em}.pcr-app .pcr-interaction input{letter-spacing:.07em;font-size:.75em;text-align:center;cursor:pointer;color:#75797e;background:#f1f3f4;border-radius:.15em;transition:all .15s;padding:.45em .5em;margin-top:.75em}.pcr-app .pcr-interaction input:hover{-webkit-filter:brightness(.975);filter:brightness(.975)}.pcr-app .pcr-interaction input:focus{box-shadow:0 0 0 1px hsla(0,0%,100%,.85),0 0 0 3px rgba(66,133,244,.75)}.pcr-app .pcr-interaction .pcr-result{color:#75797e;text-align:left;flex:1 1 8em;min-width:8em;transition:all .2s;border-radius:.15em;background:#f1f3f4;cursor:text}.pcr-app .pcr-interaction .pcr-result::-moz-selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-result::selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-type.active{color:#fff;background:#4285f4}.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear,.pcr-app .pcr-interaction .pcr-save{width:auto;color:#fff}.pcr-app .pcr-interaction .pcr-cancel:hover,.pcr-app .pcr-interaction .pcr-clear:hover,.pcr-app .pcr-interaction .pcr-save:hover{-webkit-filter:brightness(.925);filter:brightness(.925)}.pcr-app .pcr-interaction .pcr-save{background:#4285f4}.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear{background:#f44250}.pcr-app .pcr-interaction .pcr-cancel:focus,.pcr-app .pcr-interaction .pcr-clear:focus{box-shadow:0 0 0 1px hsla(0,0%,100%,.85),0 0 0 3px rgba(244,66,80,.75)}.pcr-app .pcr-selection .pcr-picker{position:absolute;height:18px;width:18px;border:2px solid #fff;border-radius:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pcr-app .pcr-selection .pcr-color-chooser,.pcr-app .pcr-selection .pcr-color-opacity,.pcr-app .pcr-selection .pcr-color-palette{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column;cursor:grab;cursor:-webkit-grab}.pcr-app .pcr-selection .pcr-color-chooser:active,.pcr-app .pcr-selection .pcr-color-opacity:active,.pcr-app .pcr-selection .pcr-color-palette:active{cursor:grabbing;cursor:-webkit-grabbing}.pcr-app[data-theme=nano]{width:14.25em;max-width:95vw}.pcr-app[data-theme=nano] .pcr-swatches{margin-top:.6em;padding:0 .6em}.pcr-app[data-theme=nano] .pcr-interaction{padding:0 .6em .6em}.pcr-app[data-theme=nano] .pcr-selection{display:grid;grid-gap:.6em;grid-template-columns:1fr 4fr;grid-template-rows:5fr auto auto;align-items:center;height:10.5em;width:100%;align-self:flex-start}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-preview{grid-area:2/1/4/1;height:100%;width:100%;display:flex;flex-direction:row;justify-content:center;margin-left:.6em}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-preview .pcr-last-color{display:none}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-preview .pcr-current-color{position:relative;background:currentColor;width:2em;height:2em;border-radius:50em;overflow:hidden}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-preview .pcr-current-color:before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8,
');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-palette{grid-area:1/1/2/3;width:100%;height:100%;z-index:1}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-palette .pcr-palette{border-radius:.15em;width:100%;height:100%}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-palette .pcr-palette:before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8,
');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-chooser{grid-area:2/2/2/2}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-opacity{grid-area:3/2/3/2}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-chooser,.pcr-app[data-theme=nano] .pcr-selection .pcr-color-opacity{height:.5em;margin:0 .6em}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-chooser .pcr-picker,.pcr-app[data-theme=nano] .pcr-selection .pcr-color-opacity .pcr-picker{top:50%;transform:translateY(-50%)}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-chooser .pcr-slider,.pcr-app[data-theme=nano] .pcr-selection .pcr-color-opacity .pcr-slider{flex-grow:1;border-radius:50em}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-chooser .pcr-slider{background:linear-gradient(90deg,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-opacity .pcr-slider{background:linear-gradient(90deg,transparent,#000),url('data:image/svg+xml;utf8,
');background-size:100%,.25em}
\ No newline at end of file
diff --git a/src/range-slider.min.css b/src/range-slider.min.css
new file mode 100644
index 0000000..394ff60
--- /dev/null
+++ b/src/range-slider.min.css
@@ -0,0 +1 @@
+.range-slider{position:relative;box-sizing:border-box;padding:10px 0;font-family:Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.range-slider *{box-sizing:border-box}.range-slider .rs-hidden{opacity:0!important}.range-slider .rs-bar{position:relative;width:100%;height:3px;background:#d3d3d3;cursor:pointer}.range-slider .rs-progress{width:0;height:100%}.range-slider .rs-progress::before{content:"";display:block;position:relative;left:-7px;width:8px;min-height:100%}.range-slider .rs-wrap{position:absolute;left:7px;right:7px}.range-slider>.rs-bar>.rs-wrap{top:0;bottom:0;z-index:9}.range-slider .rs-handle{position:absolute;width:14px;height:14px;margin-left:-7px;margin-top:-7px;left:0;top:50%}.range-slider.rs-design-3d .rs-bar{height:14px;border-radius:40px;border:1px solid #ddd;background:#eee}.range-slider.rs-design-3d .rs-bar::after{content:"";position:absolute;left:-3px;right:-3px;top:-3px;bottom:-3px;border-radius:40px;z-index:-1;background:-moz-linear-gradient(top,#ececec 0,#fefefe 100%)!important;background:-webkit-linear-gradient(top,#ececec 0,#fefefe 100%)!important;background:-o-linear-gradient(top,#ececec 0,#fefefe 100%)!important;background:-ms-linear-gradient(top,#ececec 0,#fefefe 100%)!important;background:linear-gradient(to bottom,#ececec 0,#fefefe 100%)!important}.range-slider.rs-design-3d .rs-progress{border-radius:0 40px 40px 0}.range-slider.rs-design-3d .rs-progress::before{left:-11px;width:12px;border-radius:40px 0 0 40px}.range-slider.rs-design-3d .rs-handle{width:22px;height:22px;margin-left:-11px;margin-top:-11px;border-radius:5px;background:-moz-linear-gradient(bottom,#e2e2e2 0,#fefefe 100%)!important;background:-webkit-linear-gradient(bottom,#e2e2e2 0,#fefefe 100%)!important;background:-o-linear-gradient(bottom,#e2e2e2 0,#fefefe 100%)!important;background:-ms-linear-gradient(bottom,#e2e2e2 0,#fefefe 100%)!important;background:linear-gradient(to top,#e2e2e2 0,#fefefe 100%)!important;-webkit-box-shadow:0 2px 6px rgba(0,0,0,.4);-moz-box-shadow:0 2px 6px rgba(0,0,0,.4);box-shadow:0 2px 6px rgba(0,0,0,.4)}.range-slider.rs-design-3d.rs-active .rs-handle{-webkit-box-shadow:0 1px 3px rgba(0,0,0,.4);-moz-box-shadow:0 1px 3px rgba(0,0,0,.4);box-shadow:0 1px 3px rgba(0,0,0,.4)}.range-slider.rs-design-3d .rs-handle::after{content:"";position:absolute;top:3px;bottom:3px;left:3px;right:3px;border-radius:3px;background:-moz-linear-gradient(top,#e2e2e2 0,#fefefe 100%)!important;background:-webkit-linear-gradient(top,#e2e2e2 0,#fefefe 100%)!important;background:-o-linear-gradient(top,#e2e2e2 0,#fefefe 100%)!important;background:-ms-linear-gradient(top,#e2e2e2 0,#fefefe 100%)!important;background:linear-gradient(to bottom,#e2e2e2 0,#fefefe 100%)!important}.range-slider.rs-design-3d .rs-wrap{left:11px;right:11px}.range-slider.rs-size-medium{font-size:12px}.range-slider.rs-size-small{font-size:11px}.range-slider.rs-size-large{font-size:14px}.range-slider.rs-size-small .rs-bar{height:2px}.range-slider.rs-size-small .rs-wrap{left:5px;right:5px}.range-slider.rs-size-small .rs-handle{width:10px;height:10px;margin-left:-5px;margin-top:-5px}.range-slider.rs-size-large .rs-bar{height:4px}.range-slider.rs-size-large .rs-wrap{left:10px;right:10px}.range-slider.rs-size-large .rs-handle{width:20px;height:20px;margin-left:-10px;margin-top:-10px}.range-slider.rs-design-2d.rs-size-small .rs-progress::before{left:-5px;width:6px}.range-slider.rs-design-3d.rs-size-small .rs-bar{height:9px}.range-slider.rs-design-3d.rs-size-small .rs-progress::before{left:-8px;width:9px}.range-slider.rs-design-3d.rs-size-small .rs-handle{width:16px;height:16px;margin-left:-8px;margin-top:-8px;border-radius:3px}.range-slider.rs-design-3d.rs-size-small .rs-handle::after{top:2px;bottom:2px;left:2px;right:2px;border-radius:2px}.range-slider.rs-design-3d.rs-size-small .rs-wrap{left:8px;right:8px}.range-slider.rs-design-2d.rs-size-large .rs-progress::before{left:-10px;width:11px}.range-slider.rs-design-3d.rs-size-large .rs-bar{height:21px}.range-slider.rs-design-3d.rs-size-large .rs-progress::before{left:-16px;width:17px}.range-slider.rs-design-3d.rs-size-large .rs-bar::after{left:-4px;right:-4px;top:-4px;bottom:-4px}.range-slider.rs-design-3d.rs-size-large .rs-handle{width:32px;height:32px;margin-left:-16px;margin-top:-16px;border-radius:6px}.range-slider.rs-design-3d.rs-size-large .rs-wrap{left:16px;right:16px}.rs-handle{background:#d3d3d3}.rs-theme-default .rs-progress,.rs-theme-default.rs-design-2d .rs-progress::before{background:#add8e6}.rs-theme-default .rs-handle,.rs-theme-default.rs-design-3d .rs-progress,.rs-theme-default.rs-design-3d .rs-progress::before{background:#00bfff}.rs-theme-positive .rs-progress,.rs-theme-positive.rs-design-2d .rs-progress::before{background:#90ee90}.rs-theme-positive .rs-handle,.rs-theme-positive.rs-design-3d .rs-progress,.rs-theme-positive.rs-design-3d .rs-progress::before{background:#32cd32}.rs-theme-attention .rs-progress,.rs-theme-attention.rs-design-2d .rs-progress::before{background:#fb9}.rs-theme-attention .rs-handle,.rs-theme-attention.rs-design-3d .rs-progress,.rs-theme-attention.rs-design-3d .rs-progress::before{background:orange}.range-slider.rs-handle-round .rs-handle{border-radius:50px!important}.range-slider.rs-handle-round .rs-handle::after{border-radius:50px!important}.range-slider.rs-handle-rect.rs-design-2d .rs-progress::before{left:-3px;width:4px}.range-slider.rs-handle-rect.rs-design-2d .rs-handle{width:6px;margin-left:-3px}.range-slider.rs-handle-rect.rs-design-2d .rs-wrap{left:3px;right:3px}.range-slider.rs-handle-rect.rs-size-small.rs-design-2d .rs-progress::before{left:-2px;width:3px}.range-slider.rs-handle-rect.rs-size-small.rs-design-2d .rs-handle{width:4px;margin-left:-2px}.range-slider.rs-handle-rect.rs-size-small.rs-design-2d .rs-wrap{left:2px;right:2px}.range-slider.rs-handle-rect.rs-size-large.rs-design-2d .rs-progress::before{left:-3px;width:4px}.range-slider.rs-handle-rect.rs-size-large.rs-design-2d .rs-handle{width:6px;margin-left:-3px}.range-slider.rs-handle-rect.rs-size-large.rs-design-2d .rs-wrap{left:3px;right:3px}.range-slider.rs-handle-rect.rs-design-3d .rs-progress::before{left:-6px;width:7px}.range-slider.rs-handle-rect.rs-design-3d .rs-handle{width:12px;margin-left:-6px;border-radius:3px}.range-slider.rs-handle-rect.rs-design-3d .rs-handle::after{top:2px;bottom:2px;left:2px;right:2px;border-radius:2px}.range-slider.rs-handle-rect.rs-design-3d .rs-wrap{left:6px;right:6px}.range-slider.rs-handle-rect.rs-size-small.rs-design-3d .rs-progress::before{left:-5px;width:6px}.range-slider.rs-handle-rect.rs-size-small.rs-design-3d .rs-handle{width:10px;margin-left:-5px}.range-slider.rs-handle-rect.rs-size-small.rs-design-3d .rs-wrap{left:5px;right:5px}.range-slider.rs-handle-rect.rs-size-large.rs-design-3d .rs-progress::before{left:-8px;width:9px}.range-slider.rs-handle-rect.rs-size-large.rs-design-3d .rs-handle{width:16px;margin-left:-8px;border-radius:4px}.range-slider.rs-handle-rect.rs-size-large.rs-design-3d .rs-handle::after{top:3px;bottom:3px;left:3px;right:3px;border-radius:3px}.range-slider.rs-handle-rect.rs-size-large.rs-design-3d .rs-wrap{left:8px;right:8px}.range-slider.rs-size-medium.rs-labels-top{padding-top:19px}.range-slider.rs-size-medium.rs-labels-bottom{padding-bottom:19px}.range-slider.rs-size-small.rs-labels-top{padding-top:16px}.range-slider.rs-size-small.rs-labels-bottom{padding-bottom:16px}.range-slider.rs-size-large.rs-labels-top{padding-top:22px}.range-slider.rs-size-large.rs-labels-bottom{padding-bottom:22px}.rs-labels{position:absolute;left:0;right:0;color:#cce}.rs-labels div{-moz-transition:opacity .15s;-ms-transition:opacity .15s;-o-transition:opacity .15s;transition:opacity .15s}.range-slider.rs-labels-top .rs-labels,.range-slider.rs-labels-top .rs-labels div{top:0}.range-slider.rs-labels-bottom .rs-labels,.range-slider.rs-labels-bottom .rs-labels div{bottom:0}.rs-labels .rs-label-left,.rs-labels .rs-label-middle,.rs-labels .rs-label-right{position:absolute;overflow:hidden;white-space:nowrap;text-overflow:clip}.rs-labels>.rs-label-left,.rs-labels>.rs-label-right{max-width:45%;padding:0 2%;opacity:.7}.rs-labels>.rs-label-left{left:0}.rs-labels>.rs-label-right{right:0}.rs-labels .rs-label-middle{-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%)}.range-slider .rs-popup{position:absolute;left:50%;padding:8px 14px;text-align:center;background:#d3d3d3;color:grey;white-space:nowrap;opacity:.9;visibility:visible;z-index:1000;-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);-moz-transition:visibility .25s,opacity .25s;-ms-transition:visibility .25s,opacity .25s;-o-transition:visibility .25s,opacity .25s;transition:visibility .25s,opacity .25s}.range-slider .rs-popup.rs-hidden{visibility:hidden}.range-slider .rs-popup::after{content:"";position:absolute;left:50%;border-left:7px solid transparent;border-right:7px solid transparent}.range-slider .rs-popup-top::after{top:100%;border-top:7px solid #d3d3d3}.range-slider .rs-popup-bottom::after{bottom:100%;border-bottom:7px solid #d3d3d3}.range-slider.rs-size-small .rs-popup-top{bottom:180%}.range-slider.rs-size-small .rs-popup-bottom{top:180%}.range-slider.rs-size-medium .rs-popup-top{bottom:165%}.range-slider.rs-size-medium .rs-popup-bottom{top:165%}.range-slider.rs-size-large .rs-popup-top{bottom:150%}.range-slider.rs-size-large .rs-popup-bottom{top:150%}.range-slider.rs-size-small .rs-popup{font-size:9px}.range-slider.rs-size-small .rs-popup::after{margin-left:-6px;border-width:6px}.range-slider.rs-size-medium .rs-popup{font-size:10px}.range-slider.rs-size-medium .rs-popup::after{margin-left:-7px;border-width:7px}.range-slider.rs-size-large .rs-popup{font-size:11px}.range-slider.rs-size-large .rs-popup::after{margin-left:-8px;border-width:8px}
diff --git a/src/styles.css b/src/styles.css
new file mode 100644
index 0000000..3fa0fe6
--- /dev/null
+++ b/src/styles.css
@@ -0,0 +1,2816 @@
+:root {
+ --panel-back: #141629;
+ --panel-stroke: #222544;
+ --main-back: #070a1b;
+ --main-text-color: #fff;
+ --secondary-text-color: #a0a5d0;
+ --input-color: #22233e;
+ --accent-color: #166ef1;
+ --button-hover: #262746;
+}
+/*
+:root {
+ --panel-back: #FFF;
+ --panel-stroke: #EDEFF3;
+ --main-back: #F8F9FC;
+ --main-text-color: #333333;
+ --secondary-text-color: #a0a5d0;
+ --input-color: #EDEFF3;
+ --accent-color: #166EF1;
+ --button-hover: #262746;
+}
+*/
+html,
+body {
+ margin: 0px;
+ overflow: hidden;
+ background: var(--main-back);
+ height: 100%;
+}
+/* Logo */
+#logo {
+ top: 0px;
+ left: 0px;
+ position: fixed;
+ margin-right: 0px;
+ text-align: center;
+ height: 60px;
+ line-height: 60px;
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 600;
+ background: var(--panel-back);
+ width: 76px;
+ border-right: 1px solid var(--panel-stroke);
+ box-sizing: border-box;
+}
+#logo:after {
+ content: "";
+ display: block;
+ height: 1px;
+ width: 40px;
+ background-color: var(--panel-stroke);
+ margin-left: 18px;
+}
+#logo img {
+ vertical-align: middle;
+ width: 22px;
+}
+
+/* Navigation */
+#top-canvas {
+ position: absolute;
+ top: 10px;
+ left: 0px;
+ z-index: 99999999;
+ width: 100%;
+}
+#undo {
+ position: absolute;
+ top: 0px;
+ left: 10px;
+ font-family: Inter;
+ font-size: 14px;
+ color: var(--secondary-text-color);
+ vertical-align: middle;
+ opacity: 0.5;
+ height: 32px;
+ line-height: 32px;
+ border-radius: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-weight: 500;
+ background: var(--panel-back);
+}
+#redo {
+ background: var(--panel-back);
+ position: absolute;
+ top: 0px;
+ left: 94px;
+ font-family: Inter;
+ font-size: 14px;
+ color: var(--secondary-text-color);
+ vertical-align: middle;
+ opacity: 0.5;
+ height: 32px;
+ line-height: 32px;
+ border-radius: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-weight: 500;
+}
+#undo img,
+#redo img {
+ vertical-align: middle;
+ margin-top: -3px;
+ margin-right: 3px;
+}
+#redo img {
+ transform: scaleX(-1);
+}
+.history-active {
+ opacity: 0.9 !important;
+ z-index: 9999999;
+}
+.history-active:hover {
+ cursor: pointer !important;
+ background-color: var(--input-color) !important;
+}
+/* Top right controls (zoom, hand tool) */
+#other-controls {
+ position: absolute;
+ right: 20px;
+ top: 0px;
+ color: var(--main-text-color);
+ font-family: Inter;
+ height: 100%;
+ font-size: 14px;
+}
+#zoom-options {
+ top: 33px;
+ right: -10px;
+ position: absolute;
+ background-color: var(--panel-back);
+ width: 150px;
+ border-radius: 5px 0px 5px 5px;
+ overflow: hidden;
+}
+#zoom-level {
+ margin-right: -10px;
+ height: 32px;
+ vertical-align: middle;
+ width: 65px;
+ text-align: right;
+ background: var(--panel-back) !important;
+ border-radius: 5px;
+ opacity: 0.9;
+}
+#zoom-level span {
+ line-height: 32px;
+}
+#zoom-level:hover {
+ background-color: var(--button-hover) !important;
+ cursor: pointer;
+}
+#zoom-level img {
+ margin-left: 5px;
+ margin-right: 5px;
+}
+.zoom-options-item {
+ height: 32px;
+ line-height: 32px;
+ border-bottom: 1px solid var(--panel-stroke);
+ text-indent: 15px;
+ color: var(--main-text-color) !important;
+}
+.zoom-options-item:last-child {
+ border-bottom: none !important;
+}
+.zoom-options-item:hover {
+ cursor: pointer;
+ background-color: var(--button-hover) !important;
+}
+.zoom-hidden {
+ visibility: hidden !important;
+}
+.zoom-open {
+ transform: scaleY(-1);
+}
+#hand-tool {
+ height: 32px;
+ width: 32px;
+ position: absolute;
+ top: 0px;
+ right: 60px;
+ line-height: 32px;
+ text-align: center;
+ background-color: var(--panel-back);
+ border-radius: 5px;
+ opacity: 0.9;
+}
+#hand-tool:not(.hand-active):hover {
+ cursor: pointer;
+ background-color: var(--button-hover) !important;
+}
+#hand-tool img {
+ margin-bottom: -1px;
+ margin-left: -1px;
+ width: 14px;
+}
+.hand-active {
+ background-color: var(--accent-color) !important;
+}
+.hand-active:hover {
+ cursor: pointer;
+}
+/* Bottom of canvas */
+#bottom-canvas {
+ position: absolute;
+ bottom: 0px;
+ right: -20px;
+ z-index: 9999999;
+ width: 100%;
+}
+#sponsor {
+ position: absolute;
+ bottom: 10px;
+ left: -10px;
+ height: 32px;
+ line-height: 32px;
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 500;
+ color: var(--accent-color);
+ background: rgba(22, 95, 205, 0.1);
+ text-align: center;
+ text-decoration: none;
+ padding-left: 10px;
+ padding-right: 10px;
+ border-radius: 5px;
+}
+#sponsor img {
+ margin-right: 3px;
+ margin-bottom: -2px;
+}
+#sponsor:hover {
+ background: rgba(22, 95, 205, 0.3) !important;
+}
+#alyssa-credit {
+ color: var(--secondary-text-color);
+ font-size: 14px;
+ font-weight: 500;
+ position: absolute;
+ right: -20px;
+ bottom: 15px;
+ font-family: Inter;
+ width: 200px;
+ filter: drop-shadow(0px 1px 15px #141629);
+ text-decoration: none !important;
+}
+#alyssa-credit:hover {
+ filter: drop-shadow(0px 1px 10px #141629) !important;
+}
+#alyssa-credit span {
+ color: var(--main-text-color) !important;
+ text-decoration: none !important;
+ display: inline-block;
+}
+#alyssa-credit img {
+ display: inline-block;
+ margin-left: 5px;
+ border-radius: 50%;
+ vertical-align: middle;
+ width: 18px;
+ margin-top: -2px;
+}
+.hide-folder {
+ display: none !important;
+}
+.project-active {
+ text-align: center !important;
+ width: 50% !important;
+}
+/* Toolbar */
+#toolbar {
+ position: absolute;
+ height: calc(100% - 340px);
+ width: 76px;
+ background-color: var(--panel-back);
+ border-right: 1px solid var(--panel-stroke);
+ left: 0px;
+ top: 0px;
+ box-sizing: border-box;
+ z-index: 99999;
+ box-shadow: 1px 0px 0px #000000;
+}
+#tool-wrap {
+ overflow-y: overlay;
+ margin-top: 60px;
+ height: calc(100% - 60px);
+}
+.tool {
+ border-radius: 5px;
+ width: 55px;
+ height: 50px;
+ text-align: center;
+ position: relative;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 10px;
+}
+.tool:not(.tool-active):hover {
+ cursor: pointer;
+ background-color: var(--input-color) !important;
+}
+.tool-active {
+ background-color: var(--accent-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+}
+.tool-active:hover {
+ cursor: pointer;
+}
+.tool img {
+ margin: auto;
+ width: 16px;
+ margin-top: 7px;
+}
+#shape-tool img {
+ width: 18px !important;
+}
+#upload-tool img {
+ width: 20px !important;
+}
+#audio-tool img {
+ width: 20px !important;
+}
+.tool p {
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-weight: 500;
+ font-size: 12px;
+ margin: 0px;
+}
+.tool-active p {
+ color: var(--main-text-color) !important;
+}
+/* Browse area */
+#behind-browser {
+ position: absolute;
+ height: 100%;
+ width: 299px;
+ left: 76px;
+ background: var(--panel-back);
+ border-right: 1px solid var(--panel-stroke);
+ z-index: 1;
+ box-sizing: border-box;
+}
+#browser {
+ position: absolute;
+ height: calc(100% - 450px);
+ width: 299px;
+ background-color: var(--panel-back);
+ border-right: 1px solid var(--panel-stroke);
+ left: 76px;
+ top: 110px;
+ box-sizing: border-box;
+ z-index: 999999;
+ overflow-y: overlay;
+ display: block;
+ overflow-x: hidden;
+}
+.collapsed {
+ display: none !important;
+}
+#browser-container {
+ width: 260px;
+ margin-left: auto;
+ margin-right: auto;
+ height: 100%;
+}
+#collapse {
+ position: absolute;
+ right: 18px;
+ top: 23px;
+}
+#collapse:hover {
+ cursor: pointer;
+}
+#images-grid {
+ width: 100%;
+ line-height: 0;
+ -webkit-column-count: 2;
+ -webkit-column-gap: 15px;
+ -moz-column-count: 2;
+ -moz-column-gap: 15px;
+ column-count: 2;
+ column-gap: 15px;
+ padding-bottom: 10px;
+}
+.image-grid-item,
+.video-grid-item {
+ width: 120px;
+ margin-bottom: 15px;
+ position: relative;
+}
+.image-grid-item:hover,
+.video-grid-item:hover {
+ cursor: pointer;
+}
+.image-grid-item img,
+.video-grid-item img {
+ width: 100%;
+ background-image: url("assets/loading.gif");
+ background-size: 30px;
+ background-color: var(--panel-back);
+ background-repeat: no-repeat;
+ background-position: center;
+ min-height: 25px;
+}
+.image-grid-item .credit {
+ display: none;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 12px;
+ text-align: right;
+ text-decoration: none;
+ text-shadow: 0px 1px 5px #000000;
+ width: 110px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ z-index: 9;
+ height: 20px;
+ line-height: 20px;
+}
+.image-grid-item #time-video {
+ font-size: 12px;
+ color: var(--main-text-color);
+ text-align: center;
+ background: rgba(0, 0, 0, 0.8);
+ border-radius: 5px;
+ height: 25px;
+ line-height: 25px;
+ position: absolute;
+ left: 5px;
+ bottom: 5px;
+ font-family: Inter;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+.image-grid-item:hover .credit {
+ display: block !important;
+}
+.delete-media {
+ opacity: 0.9;
+ position: absolute;
+ top: 7px;
+ right: 7px;
+ width: 25px !important;
+ z-index: 99999;
+ visibility: hidden;
+}
+.image-grid-item:hover .delete-media,
+.video-grid-item:hover .delete-media {
+ visibility: visible !important;
+}
+.more-active {
+ visibility: visible !important;
+}
+.gallery-row {
+ margin-top: 20px;
+ display: grid;
+ grid-gap: 15px;
+ width: 100%;
+ grid-auto-columns: auto;
+ grid-template-columns: 52px 52px 52px 52px;
+ overflow: hidden;
+}
+.scroll-row:before {
+ content: "";
+ display: block;
+ position: absolute;
+ background: linear-gradient(270deg, rgba(20, 22, 41, 0) 0%, #141629 63.28%);
+ width: 50px;
+ height: 80px;
+ margin-left: -10px;
+ z-index: 99999;
+ pointer-events: none;
+}
+.gallery-row::-webkit-scrollbar {
+ width: 0; /* Remove scrollbar space */
+ background: transparent; /* Optional: just make scrollbar invisible */
+}
+#browser-search {
+ margin-top: 15px;
+ margin-bottom: 20px;
+}
+#search-fixed {
+ position: fixed;
+ top: 0px;
+ width: 279px;
+ padding-left: 19px;
+ margin-left: -19px;
+ z-index: 999999;
+ background-color: var(--panel-back);
+ padding-top: 10px;
+}
+.search-scrolling {
+ box-shadow: 0px 8px 4px -4px rgba(12, 13, 26, 0.5);
+}
+.audio-browser {
+ padding-bottom: 11px;
+}
+#browser-search input {
+ background-color: var(--input-color);
+ border: 0px;
+ box-sizing: border-box;
+ height: 35px;
+ width: calc(100% - 70px);
+ border-radius: 5px;
+ text-indent: 28px;
+ font-size: 14px;
+ font-family: Inter;
+ color: var(--main-text-color);
+ outline: none !important;
+ padding-right: 30px;
+ display: inline-block;
+ box-sizing: border-box;
+ vertical-align: top;
+}
+#search-button {
+ background-color: var(--accent-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 5px;
+ display: inline-block;
+ width: 45px;
+ color: #fff;
+ font-family: Inter;
+ font-size: 14px;
+ height: 35px;
+ vertical-align: top;
+ box-sizing: border-box;
+ text-align: center;
+ line-height: 35px;
+ font-weight: 500;
+ margin-left: 5px;
+}
+#search-button:hover {
+ cursor: pointer;
+ opacity: 0.7;
+}
+#search-icon {
+ position: absolute;
+ left: 30px;
+ margin-top: 10px;
+}
+#delete-search {
+ position: absolute;
+ right: 75px;
+ margin-top: 8px;
+ width: 20px;
+ visibility: hidden;
+}
+#delete-search:hover {
+ cursor: pointer;
+ opacity: 0.5;
+}
+.show-delete {
+ visibility: visible !important;
+}
+#pixabay {
+ right: 0px;
+ margin-left: 0px;
+ margin-top: 10px;
+ margin-right: 75px;
+ opacity: 0.4;
+ position: absolute;
+ display: inline-block;
+}
+.hide-pixabay {
+ display: none !important;
+}
+/* Images "landing" */
+#landing {
+ width: calc(100% - 20px);
+ display: block;
+}
+.upload-landing {
+ margin-top: 15px !important;
+}
+.hide-landing {
+ display: none !important;
+}
+#landing-text {
+ color: var(--secondary-text-color);
+ font-size: 12px;
+ line-height: normal;
+ font-family: Inter;
+}
+.audio-landing-text {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+#landing-text a {
+ text-decoration: none !important;
+ color: var(--main-text-color);
+}
+#categories {
+ margin-top: 15px;
+}
+.category {
+ width: 100%;
+ border: 1px solid var(--panel-stroke);
+ height: 38px;
+ line-height: 38px;
+ color: #fff;
+ font-size: 12px;
+ font-family: Inter;
+ border-radius: 5px;
+ margin-bottom: 8px;
+}
+.category:hover {
+ cursor: pointer;
+ background: var(--panel-stroke);
+}
+.category img {
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+ margin-right: 10px;
+ width: 20px;
+}
+#shapes-cont {
+ padding-bottom: 10px;
+}
+#shapes-row .grid-item img {
+ width: unset !important;
+}
+.grid-item,
+.grid-emoji-item {
+ background-color: var(--input-color);
+ border-radius: 5px;
+ height: 60px;
+ width: 60px;
+ text-align: center;
+ position: relative;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ visibility: visible;
+}
+.grid-item:hover,
+.grid-emoji-item:hover {
+ cursor: pointer;
+}
+.grid-item img,
+.grid-emoji-item img {
+ width: 30px;
+ margin: auto;
+ text-align: center;
+ position: absolute;
+ top: 0px;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+ max-height: 100%;
+}
+.row-title {
+ font-family: Inter;
+ font-size: 14px;
+ color: var(--secondary-text-color);
+ font-weight: 500;
+}
+.right-arrow {
+ position: absolute;
+ margin-left: 253px;
+ margin-top: 23px;
+ z-index: 99999;
+}
+.right-arrow:hover,
+.left-arrow:hover {
+ cursor: pointer;
+}
+.right-arrow img,
+.left-arrow img {
+ width: 10px;
+}
+.left-arrow {
+ position: absolute;
+ margin-left: 0px;
+ margin-top: 23px;
+ z-index: 99999;
+}
+.arrow-hidden {
+ visibility: hidden !important;
+}
+.left-arrow img {
+ transform: scaleX(-1);
+}
+/* No results */
+#no-results {
+ color: var(--secondary-text-color);
+ font-size: 14px;
+ font-family: Inter;
+ text-align: center;
+ margin-top: 10px;
+ line-height: normal;
+}
+/* Text browser */
+.add-text {
+ width: 100%;
+ color: var(--main-text-color);
+ background-color: var(--input-color);
+ font-family: Inter;
+ margin-bottom: 10px;
+ border-radius: 5px;
+ text-indent: 10px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+}
+.add-text:hover {
+ cursor: pointer;
+ background-color: var(--button-hover) !important;
+}
+#heading-text {
+ font-size: 22px;
+ font-weight: 700;
+ height: 44px;
+ line-height: 44px;
+}
+#subheading-text {
+ font-size: 16px;
+ font-weight: 500;
+ height: 34px;
+ line-height: 34px;
+}
+#body-text {
+ font-size: 12px;
+ font-weight: 400;
+ height: 28px;
+ line-height: 28px;
+}
+#item-text {
+ font-size: 16px;
+ font-weight: 500;
+ height: 34px;
+ line-height: 34px;
+}
+/* Upload browser */
+#upload-button,
+#audio-upload-button {
+ height: 38px;
+ line-height: 38px;
+ width: 93%;
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 600;
+ text-align: center;
+ border-radius: 5px;
+ background: var(--accent-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ margin-top: 20px;
+}
+.uploading {
+ opacity: 0.6 !important;
+ pointer-events: none !important;
+}
+#upload-button:hover,
+#audio-upload-button:hover {
+ opacity: 0.6;
+ cursor: pointer;
+}
+#upload-button img,
+#audio-upload-button img {
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 5px;
+}
+.remove-audio {
+ background-color: #e00e53 !important;
+}
+#upload-tabs {
+ width: calc(100% - 20px);
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.upload-tab {
+ width: calc(100% / 2);
+ display: inline-block;
+ text-align: center;
+ font-family: Inter;
+ color: var(--secondary-text-color);
+ font-size: 14px;
+ font-weight: 500;
+ vertical-align: middle;
+ height: 42px;
+ line-height: 40px;
+ border-bottom: 1px solid var(--panel-stroke);
+ box-sizing: border-box;
+}
+.upload-tab-active {
+ border-bottom: 3px solid var(--accent-color) !important;
+ color: var(--main-text-color) !important;
+}
+.upload-tab:not(.upload-tab-active):hover {
+ cursor: pointer;
+ opacity: 0.6;
+}
+/* Properties panel */
+#properties {
+ position: absolute;
+ right: 0px;
+ top: 0px;
+ width: 300px;
+ height: calc(100% - 340px);
+ background-color: var(--panel-back);
+ border-left: 1px solid var(--panel-stroke);
+ z-index: 999;
+ overflow-y: overlay;
+}
+#properties-overlay {
+ width: 100%;
+ height: 100%;
+ z-index: 99999;
+ background-color: #000;
+ opacity: 0.4;
+ position: fixed;
+ visibility: hidden;
+}
+.properties-disabled {
+ visibility: visible !important;
+}
+/* Align controls */
+#align {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ margin-top: 20px;
+ margin-bottom: 15px;
+}
+#align-v,
+#align-h {
+ display: inline-block;
+}
+#align-v {
+ margin-right: 25px;
+}
+.align {
+ margin-right: 15px;
+}
+.align:hover {
+ cursor: pointer;
+ opacity: 0.7;
+}
+.align-off {
+ opacity: 0.3 !important;
+ pointer-events: none;
+}
+hr {
+ width: 260px;
+ margin-left: auto;
+ margin-right: auto;
+ border: none;
+ height: 1px;
+ background-color: var(--panel-stroke);
+ margin-bottom: 20px;
+}
+/* Property sections */
+.panel-section {
+ width: 260px;
+ margin-left: auto;
+ margin-right: auto;
+}
+.property-title {
+ font-family: Inter;
+ color: var(--main-text-color);
+ font-weight: 600;
+ font-size: 14px;
+ margin-bottom: 10px;
+}
+table {
+ width: 100%;
+}
+table,
+th {
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-weight: 500 !important;
+ font-size: 14px;
+ border-spacing: 0px 10px;
+}
+th {
+ height: 35px;
+}
+.name-col {
+ text-align: left;
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-weight: 400 !important;
+ font-size: 14px;
+}
+.value-col {
+ text-align: right;
+ width: 189px;
+ display: flex;
+ align-items: center;
+ margin-left: auto;
+}
+/* Dropdows */
+.nice-select,
+.list,
+li {
+ background-color: var(--input-color) !important;
+ border: none;
+ width: 100% !important;
+ height: 35px;
+ padding-left: 11px;
+ font-weight: normal !important;
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 14px !important;
+}
+.list {
+ height: unset !important;
+ max-height: 150px;
+ overflow-y: overlay !important;
+}
+.nice-select:after {
+ border-bottom: 1.5px solid var(--secondary-text-color) !important;
+ border-right: 1.5px solid var(--secondary-text-color) !important;
+}
+/* Inputs */
+input:invalid {
+ outline: none !important;
+ border: 0px !important;
+ box-shadow: none !important;
+}
+input:required {
+ box-shadow: none !important;
+}
+.property-input {
+ display: inline-block;
+}
+.property-input input {
+ background-color: var(--input-color) !important;
+ border: none;
+ color: var(--main-text-color);
+ height: 35px;
+ font-family: Inter !important;
+ width: 91px;
+ box-sizing: border-box;
+ text-indent: 11px;
+ border-radius: 5px;
+ font-weight: normal;
+ font-size: 14px;
+}
+.property-input:nth-child(2) input {
+ margin-left: 7px;
+}
+.property-input:after {
+ content: attr(data-label);
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-weight: 400;
+ font-size: 14px;
+ margin-top: 10px;
+ margin-left: -20px;
+ text-align: right;
+ position: absolute;
+}
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+input[type="number"] {
+ -moz-appearance: textfield;
+}
+/* Color input */
+#canvas-color,
+#chroma-color
+#object-color,
+.object-color,
+#text-color,
+#object-color,
+#object-color-stroke,
+#object-color-shadow {
+ align-items: center;
+ display: flex;
+}
+#canvas-color input,
+#chroma-color input,
+#text-color input,
+#object-color input,
+#object-color-fill input,
+#object-color-stroke input,
+#object-color-shadow input {
+ width: 80px;
+ background-color: var(--input-color);
+ border-radius: 0px 5px 5px 0px;
+ color: var(--main-text-color);
+ height: 35px;
+ border: none;
+ font-size: 14px;
+ text-indent: 9px;
+ display: inline-block;
+ vertical-align: middle;
+ margin-top: -27px;
+ margin-left: -4px;
+ font-family: Inter;
+ font-weight: normal;
+ box-sizing: border-box;
+ margin-top: 0px;
+ align-items: center;
+}
+#text-color input {
+ margin-top: 0px!important;
+}
+#color-side,
+#color-chroma-side,
+#color-fill-side,
+#color-text-side,
+#color-stroke-side,
+#color-shadow-side {
+ height: 35px;
+ border-radius: 5px 0px 0px 5px;
+ background-color: var(--main-text-color);
+ width: 35px;
+ display: inline-block;
+ box-sizing: border-box;
+}
+#canvas-color-opacity input,
+#object-o input,
+#object-color-opacity input,
+#object-color-fill-opacity input,
+#color-text-opacity input,
+#object-color-stroke-opacity input,
+#object-color-shadow-opacity input,
+#object-shadow-o input,
+#text-h input,
+#text-v input {
+ width: 71px !important;
+}
+/* Duration input */
+#duration-cell {
+ text-align: left !important;
+}
+/* Color input */
+#color-picker {
+ position: absolute;
+ top: 100px;
+ left: 100px;
+}
+.pcr-app {
+ background-color: var(--panel-back) !important;
+ font-family: Inter;
+ position: absolute !important;
+ right: 320px !important;
+ left: unset !important;
+ top: 250px !important;
+ z-index: 999999999!important;
+}
+.pcr-result {
+ background-color: var(--input-color) !important;
+ border-radius: 5px !important;
+ color: #69708a !important;
+}
+.pcr-type {
+ border-radius: 5px !important;
+ background-color: var(--input-color) !important;
+}
+.pcr-type.active {
+ background-color: #0f6df7 !important;
+}
+/* Opacity input */
+#select-opacity,
+.select-filter,
+#select-shadow-opacity,
+#select-line,
+#select-letter {
+ width: 102px;
+ margin-right: 7px;
+ display: inline-block;
+ vertical-align: middle;
+ z-index: 1;
+}
+.rs-handle {
+ background-color: var(--main-text-color) !important;
+ border: 7px solid var(--main-text-color);
+ box-sizing: border-box;
+ box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.2) !important;
+ width: 13px !important;
+ height: 13px !important;
+ margin-top: -8px !important;
+ border-radius: 30px !important;
+ position: absolute !important;
+ transform: translate(-7.5px, 0px);
+}
+.rs-progress {
+ background-color: #116df7 !important;
+ height: 2px !important;
+ border-radius: 30px !important;
+ box-sizing: border-box !important;
+}
+.rs-bar {
+ height: 2px !important;
+ background-color: #222544 !important;
+ border-radius: 30px !important;
+ box-sizing: border-box !important;
+}
+.rs-wrap {
+ position: relative !important;
+}
+.rs-theme-default .rs-progress,
+.rs-theme-default.rs-design-2d .rs-progress::before {
+ background-color: #116df7 !important;
+ border-radius: 30px 0px 0px 30px !important;
+}
+/* Text align & format controls */
+.align-text,
+.format-text,
+.line-join {
+ display: inline-block;
+ background-color: var(--input-color);
+ height: 35px;
+ width: 47px;
+ box-sizing: border-box;
+ text-align: center;
+ line-height: 47px;
+ position: relative;
+}
+.align-text:nth-of-type(1),
+.format-text:nth-of-type(1),
+.line-join:nth-of-type(1) {
+ border-radius: 5px 0px 0px 5px;
+}
+.align-text:nth-of-type(4),
+.format-text:nth-of-type(4),
+.line-join:nth-of-type(4) {
+ border-radius: 0px 5px 5px 0px;
+}
+.align-text img,
+.format-text img,
+.line-join img {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ left: 0px;
+ bottom: 0px;
+ margin: auto;
+}
+.align-text-active,
+.format-text-active,
+.line-join-active {
+ background-color: var(--accent-color) !important;
+}
+.align-text:not(.align-text-active):hover,
+.format-text:not(.format-text-active):hover,
+.line-join:not(.line-join-active):hover {
+ background-color: var(--button-hover) !important;
+ cursor: pointer;
+}
+.format-text-active:hover {
+ cursor: pointer;
+}
+.left-col {
+ text-align: left !important;
+}
+/* Buttons */
+#group-objects,
+#ungroup-objects {
+ height: 35px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 5px;
+ background-color: var(--accent-color);
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-weight: 500;
+ font-size: 14px;
+ text-align: center;
+ line-height: 35px;
+ width: 100%;
+ vertical-align: middle;
+}
+#image-buttons {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+#filters-button {
+ height: 35px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 5px;
+ background-color: var(--input-color);
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-weight: 500;
+ font-size: 14px;
+ text-align: center;
+ line-height: 35px;
+ width: 48%;
+ display: inline-block;
+ vertical-align: middle;
+}
+.filters-video {
+ width: 100%!important;
+}
+#crop-image {
+ height: 35px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 5px;
+ background-color: var(--accent-color);
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-weight: 600;
+ font-size: 14px;
+ text-align: center;
+ line-height: 35px;
+ width: 48%;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+}
+#crop-image img, #filters-button img {
+ vertical-align: middle;
+ margin-right: 5px;
+ margin-top: -4px;
+}
+#crop-image:hover,
+#filters-button:hover,
+#group-objects:hover,
+#ungroup-objects:hover {
+ cursor: pointer;
+ opacity: 0.6;
+}
+/* Controls area */
+#controls {
+ position: absolute;
+ bottom: 0px;
+ left: 0px;
+ width: 100%;
+ height: 60px;
+ border-top: 1px solid var(--panel-stroke);
+ background-color: var(--panel-back);
+ z-index: 99999999;
+ box-shadow: 0px -1px 0px #000000;
+}
+#playback {
+ position: absolute;
+ margin: auto;
+ left: 0px;
+ right: 0px;
+ text-align: center;
+ height: 60px;
+ bottom: 0px;
+}
+#playback * {
+ margin-bottom: -25px;
+}
+#play-button:hover,
+#skip-backward:hover,
+#skip-forward:hover {
+ cursor: pointer;
+}
+#skip-forward,
+#skip-backward {
+ display: inline-block;
+}
+#skip-backward {
+ transform: scaleX(-1);
+ margin-right: 15px;
+}
+#skip-forward {
+ margin-left: 15px;
+}
+#current-time {
+ position: absolute;
+ margin-left: auto;
+ margin-right: auto;
+ left: 0px;
+ right: 0px;
+ transform: translate(-110px, 20px);
+ width: 100px;
+}
+#current-time input,
+#total-time input {
+ text-align: left;
+ background-color: transparent;
+ color: var(--main-text-color);
+ border: none;
+ font-family: Inter;
+ font-weight: normal;
+ font-size: 14px;
+ width: 62px;
+}
+#current-time input:focus,
+#total-time input:focus {
+ border: none !important;
+ outline: none !important;
+}
+#total-time {
+ position: absolute;
+ margin-left: auto;
+ margin-right: auto;
+ left: 0px;
+ right: 0px;
+ width: 100px;
+ transform: translate(110px, 3px);
+}
+/* Share button (temp) */
+#share {
+ width: 160px;
+ position: absolute;
+ right: 160px;
+ top: 10px;
+ height: 38px;
+ line-height: 38px;
+ text-align: center;
+ background-color: #30314e;
+ color: var(--main-text-color);
+ border-radius: 5px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ font-family: Inter;
+ font-weight: 500;
+ font-size: 14px;
+}
+#share img {
+ margin-bottom: -3px;
+ margin-right: 5px;
+}
+#share:hover {
+ cursor: pointer;
+ opacity: 0.7;
+}
+/* Download button */
+#download {
+ height: 38px;
+ font-family: Inter;
+ color: var(--main-text-color);
+ font-size: 14px;
+ font-weight: 500;
+ text-align: center;
+ line-height: 38px;
+ background-color: var(--accent-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 5px;
+ padding-left: 20px;
+ padding-right: 20px;
+ position: absolute;
+ right: 15px;
+ bottom: 12px;
+}
+#download img {
+ vertical-align: middle;
+ margin-right: 5px;
+ margin-top: -2px;
+}
+#download:hover {
+ cursor: pointer;
+ opacity: 0.7;
+}
+/* Import / export modal */
+#import-export-modal {
+ width: 300px;
+ height: 265px;
+ background-color: var(--panel-back);
+ border: 1px solid var(--panel-stroke);
+ border-radius: 5px;
+ box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.3);
+ position: absolute;
+ right: 160px;
+ bottom: 70px;
+ visibility: hidden;
+ display: block;
+ z-index: 99999999999;
+}
+.subtitle {
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ margin-left: 20px;
+}
+.header-2 {
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ margin-left: 20px;
+}
+#import-project,
+#export-project {
+ background: var(--input-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 5px;
+ color: #fff;
+ text-align: center;
+ height: 38px;
+ line-height: 38px;
+ margin-left: 20px;
+ width: calc(100% - 40px);
+ margin-left: auto;
+ margin-right: auto;
+ font-family: Inter;
+ font-size: 14px;
+}
+#import-project img,
+#export-project img {
+ vertical-align: middle;
+ margin-right: 5px;
+ margin-bottom: 5px;
+}
+#import-project:hover,
+#export-project:hover {
+ cursor: pointer;
+ opacity: 0.7;
+}
+/* Download modal */
+#download-modal {
+ width: 300px;
+ height: 255px;
+ background-color: var(--panel-back);
+ border: 1px solid var(--panel-stroke);
+ border-radius: 5px;
+ box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.3);
+ position: absolute;
+ right: 17px;
+ bottom: 70px;
+ visibility: hidden;
+ z-index: 9999999999;
+}
+#background-overlay {
+ height: calc(100% - 60px);
+ width: 100%;
+ position: absolute;
+ background: #070a1b;
+ opacity: 0.6;
+ visibility: hidden;
+ z-index: 999999999;
+ left: 0px;
+ bottom: 60px;
+}
+.modal-open {
+ visibility: visible !important;
+}
+.header {
+ font-family: Inter;
+ color: var(--main-text-color);
+ font-style: normal;
+ font-weight: bold;
+ font-size: 14px;
+ margin-left: 20px;
+}
+.subheader {
+ font-family: Inter;
+ color: var(--secondary-text-color);
+ font-style: normal;
+ font-weight: 500;
+ font-size: 14px;
+ margin-left: 20px;
+}
+#radio {
+ margin-left: 10px;
+ margin-bottom: 20px;
+}
+.magic-radio:checked + label:before {
+ background-color: var(--accent-color) !important;
+ border: 0px !important;
+}
+.magic-radio + label:after {
+ background-color: #fff;
+ border: 0px !important;
+}
+.magic-checkbox + label:before,
+.magic-radio + label:before {
+ border: 0px !important;
+ background-color: #3a3f61;
+}
+label {
+ font-family: Inter;
+ font-style: normal;
+ font-weight: 400;
+ font-size: 14px;
+ color: var(--main-text-color);
+ margin-left: 10px;
+ margin-bottom: 14px;
+}
+label span {
+ color: var(--secondary-text-color);
+}
+#download-real {
+ height: 38px;
+ font-family: Inter;
+ color: var(--main-text-color);
+ font-size: 14px;
+ font-weight: 600;
+ text-align: center;
+ line-height: 38px;
+ background-color: var(--accent-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 5px;
+ width: 85%;
+ margin: auto;
+}
+#download-real:not(.downloading):hover {
+ opacity: 0.6;
+ cursor: pointer;
+}
+.downloading {
+ opacity: 0.6 !important;
+ pointer-events: none;
+}
+/* Canvas */
+#canvas-area {
+ position: absolute;
+ top: 0px;
+ left: 375px;
+ height: calc(100% - 342px);
+ width: calc(100% - 675px);
+ box-sizing: border-box;
+ overflow: hidden;
+}
+.canvas-full {
+ left: 76px !important;
+ width: calc(100% - 376px) !important;
+}
+.canvas-container {
+ left: 0px;
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
+ margin: auto;
+}
+canvas {
+ top: 0px !important;
+ bottom: 0px !important;
+ left: 0px;
+ right: 0px;
+ margin: auto;
+ width: 100%;
+ height: 100%;
+}
+#replace-image {
+ position: absolute;
+ bottom: 10px;
+ left: 0px;
+ right: 0px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ z-index: 999999999;
+ opacity: 0;
+ transition: all 0.25s cubic-bezier(0.05, 0.03, 0.35, 1);
+ pointer-events: none;
+}
+.replace-active {
+ bottom: 20px !important;
+ opacity: 1 !important;
+}
+.load-media {
+ position: absolute;
+ bottom: 10px;
+ left: 0px;
+ right: 0px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ z-index: 999999999;
+ opacity: 0;
+ transition: all 0.25s cubic-bezier(0.05, 0.03, 0.35, 1);
+ pointer-events: none;
+}
+.loading-active {
+ bottom: 20px !important;
+ opacity: 1 !important;
+}
+/* Layer list */
+#layer-list {
+ position: absolute;
+ height: 245px;
+ width: 375px;
+ left: 0px;
+ bottom: 60px;
+ background-color: var(--panel-back);
+ box-sizing: border-box;
+ border-right: 1px solid var(--panel-stroke);
+ z-index: 9999999;
+}
+#layer-inner-list {
+ width: 100%;
+ height: 100%;
+ overflow: overlay;
+ margin-top: 5px;
+}
+.layer {
+ width: 100%;
+ margin-bottom: 2px;
+ box-sizing: border-box;
+}
+.layer:hover {
+ cursor: pointer;
+}
+.layer:nth-child(odd),
+.layer:nth-child(odd) .properties {
+ background: var(--panel-back);
+}
+.layer:nth-child(even),
+layer:nth-child(even) .properties {
+ background: var(--input-color);
+}
+.layer-selected {
+ background: var(--accent-color) !important;
+}
+.layer-selected .properties {
+ background: #0b2854 !important;
+}
+.layer-name,
+.property-name {
+ height: 35px;
+ width: 100%;
+ color: var(--main-text-color);
+ line-height: 35px;
+ font-weight: 500;
+ font-family: "Inter", sans-serif;
+ font-size: 14px;
+ text-indent: 25px;
+ display: inline-block;
+}
+.layer-custom-name {
+ background: transparent;
+ color: var(--main-text-color);
+ outline: none;
+ border: 0px;
+ font-weight: 500;
+ font-size: 14px;
+ font-family: "Inter";
+ height: 25px;
+}
+.name-active {
+ background: #fff !important;
+ color: #000 !important;
+ border-radius: 5px;
+}
+.layer-custom-name:focus {
+ outline: none;
+}
+.droparrow {
+ margin-right: 12px;
+ transform: rotate(30deg);
+ opacity: 0.8;
+}
+.layer-icon {
+ margin-top: -1px;
+ margin-right: 10px;
+ width: 13px;
+ vertical-align: middle;
+}
+.layeron {
+ /*
+ transform: scale(1, -1);
+ */
+ transform: rotate(0deg) !important;
+}
+.droparrow:hover {
+ opacity: 1 !important;
+}
+.layer-name:hover .lock,
+.layer-name:hover .freeze {
+ opacity: 0.8 !important;
+}
+.layer-name:hover .lock:hover,
+.layer-name:hover .freeze:hover {
+ opacity: 1 !important;
+}
+.layer-options {
+ float: right;
+ margin-top: 5px;
+ margin-right: 15px;
+}
+.lock {
+ display: inline-block;
+ width: 17px;
+ opacity: 0;
+ margin-right: 7px;
+}
+.freeze {
+ display: inline-block;
+ width: 17px;
+ opacity: 0;
+}
+.locked,
+.frozen {
+ opacity: 1 !important;
+ width: 17px;
+}
+.property-name {
+ color: var(--secondary-text-color) !important;
+ margin-bottom: 2px;
+ text-indent: 50px !important;
+ text-transform: capitalize;
+ display: inline-block;
+}
+.property-name:not(:last-child) {
+ border-bottom: 1px solid #222544;
+}
+.property-name:hover .freeze-prop {
+ opacity: 0.8 !important;
+}
+.property-name:hover .freeze-prop:hover {
+ opacity: 1 !important;
+}
+.freeze-prop {
+ width: 17px;
+ float: right;
+ margin-right: 15px;
+ margin-top: 7px;
+ opacity: 0;
+}
+.property-keyframe {
+ width: 9px;
+ height: 9px;
+ display: inline-block;
+ margin-right: 12px;
+ margin-left: -2px;
+ background: var(--secondary-text-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 1px;
+ transform: rotate(45deg);
+ opacity: 0.8;
+}
+.property-keyframe:hover {
+ opacity: 1 !important;
+}
+#layerhead {
+ text-indent: 25px;
+ font-family: "Inter", sans-serif;
+ font-weight: 600;
+ font-size: 12px;
+ color: var(--secondary-text-color);
+ line-height: 40px;
+ height: 40px;
+ width: 375px;
+ position: fixed;
+ margin-top: -35px;
+ background-color: var(--panel-back);
+ box-sizing: border-box;
+ border-bottom: 1px solid var(--panel-stroke);
+ border-top: 1px solid var(--panel-stroke);
+ border-right: 1px solid var(--panel-stroke);
+}
+.hovering {
+ background: var(--main-text-color);
+ height: 2px !important;
+}
+#nothing {
+ width: 20px;
+ height: 20px;
+ display: block;
+ opacity: 0;
+ position: absolute;
+}
+/* Timeline area */
+#timearea {
+ position: absolute;
+ bottom: 60px;
+ left: 375px;
+ height: 245px;
+ background-color: var(--main-back);
+ width: calc(100% - 375px);
+ border-top: 1px solid var(--panel-stroke);
+ z-index: 999;
+}
+#timeline-handle {
+ height: 3px;
+ width: 100%;
+ position: absolute;
+ bottom: 337px;
+ z-index: 999999999999 !important;
+}
+#timeline-handle:hover {
+ cursor: ns-resize;
+ background-color: var(--panel-stroke);
+}
+#seekarea {
+ height: 100%;
+ z-index: 99999;
+ width: calc(100% - 375px);
+ overflow-x: auto;
+ overflow-y: hidden;
+ position: fixed;
+ border-bottom: 1px solid var(--panel-stroke);
+ border-top: 1px solid var(--panel-stroke);
+ margin-top: -35px;
+ box-sizing: border-box;
+ pointer-events: none;
+}
+#seekarea:before {
+ content: "";
+ display: block;
+ position: fixed;
+ width: 100%;
+ height: 40px;
+ background-color: var(--main-back);
+}
+#seekevents {
+ height: 40px;
+ width: 100%;
+ position: fixed;
+ pointer-events: all;
+}
+#inner-seekarea {
+ height: 100%;
+ box-sizing: border-box;
+}
+#timeline {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ overflow: overlay;
+ box-sizing: border-box;
+}
+#inner-timeline {
+ width: 2000px;
+ box-sizing: border-box;
+ margin-top: 6px;
+}
+.row {
+ height: 35px;
+ width: 100%;
+ position: relative;
+ margin-bottom: 2px;
+}
+.row-el {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ background-color: #0b182c;
+}
+.main-row .row-el {
+ background-color: #106cf6;
+ cursor: pointer;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+}
+.main-row .row-el:before {
+ background-color: var(--main-back);
+ opacity: 0.7;
+ display: block;
+ content: "";
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ z-index: 999;
+}
+.trim-row {
+ position: absolute;
+ background-color: inherit;
+ display: block;
+ content: "";
+ height: 100%;
+ width: 100%;
+ z-index: 9999;
+}
+.trim-row:before {
+ width: 5px;
+ position: absolute;
+ display: block;
+ content: "";
+ height: 100%;
+ z-index: 9999 !important;
+}
+.trim-row:hover:before {
+ cursor: ew-resize;
+}
+.trim-row:after {
+ width: 7px;
+ position: absolute;
+ right: 0px;
+ height: 100%;
+ content: "";
+ z-index: 9999 !important;
+}
+.trim-row:hover:after {
+ cursor: ew-resize;
+}
+.keyframe {
+ z-index: 999;
+ width: 0px;
+ height: 0px;
+ border-radius: 50%;
+ background: var(--accent-color);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ position: absolute;
+ top: 50%;
+ transform: translate(0, -50%);
+ box-sizing: border-box;
+}
+.keyframe-selected:after {
+ box-shadow: 0px 0px 0px 2px var(--main-text-color),
+ inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05) !important;
+}
+.keyframe:after {
+ content: "";
+ display: block;
+ margin-left: -4.5px;
+ width: 9px;
+ height: 9px;
+ background: inherit;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ border-radius: 1px;
+ transform: rotate(45deg);
+ box-sizing: border-box;
+}
+/* Keyframe snap */
+#line-snap {
+ width: 1px;
+ height: calc(100% - 5px);
+ background-color: red;
+ position: absolute;
+ opacity: 0;
+ z-index: 99999;
+ margin-top: 5px;
+}
+.line-active {
+ opacity: 1 !important;
+}
+/* Keyframe properties */
+#keyframe-properties {
+ width: 220px;
+ height: 90px;
+ background-color: var(--panel-back);
+ border: 1px solid var(--panel-stroke);
+ position: absolute;
+ top: 100px;
+ left: 100px;
+ border-radius: 5px;
+ z-index: 99999999;
+ opacity: 0;
+ display: none;
+}
+#easing {
+ width: 192px;
+ margin-left: auto;
+ margin-right: auto;
+}
+#buttons {
+ display: table;
+ width: 100%;
+ height: 38px;
+ margin-top: 60px;
+}
+#delete-keyframe,
+#apply-easing {
+ display: table-cell;
+}
+#delete-keyframe span {
+ background-color: #30314e;
+ color: var(--main-text-color);
+ border-radius: 5px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ font-family: Inter;
+ font-weight: 600;
+ font-size: 14px;
+ text-align: center;
+ line-height: 38px;
+ display: block;
+ width: 90%;
+ height: 100%;
+}
+#apply-easing span {
+ background-color: var(--accent-color);
+ color: var(--main-text-color);
+ border-radius: 5px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.05),
+ inset 0px -2px 1px rgba(0, 0, 0, 0.05);
+ font-family: Inter;
+ font-weight: 600;
+ font-size: 14px;
+ text-align: center;
+ line-height: 38px;
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+#apply-easing span:hover,
+#delete-keyframe span:hover {
+ opacity: 0.6;
+ cursor: pointer;
+}
+.show-properties {
+ opacity: 1 !important;
+ display: block !important;
+}
+/* Seek ghost */
+#seek-hover {
+ height: 100%;
+ background-color: #fff;
+ width: 3px;
+ opacity: 0.3;
+ margin-top: 40px;
+ pointer-events: none;
+ top: 0px;
+ z-index: 99999999;
+ position: absolute;
+ border-radius: 5px;
+}
+/* Seekbar */
+#seekbar {
+ margin-top: 40px;
+ height: 100%;
+ width: 2px;
+ background-color: var(--secondary-text-color);
+ position: absolute;
+ z-index: 99999999;
+ pointer-events: all;
+ top: 0px;
+}
+#seekbar:hover {
+ outline: 3px solid rgba(255, 255, 255, 0.1);
+ box-sizing: border-box;
+}
+#seekbar:hover,
+.keyframe:hover {
+ cursor: ew-resize;
+}
+#seekbar:after {
+ background: url(assets/seeker.svg);
+ display: block;
+ content: "";
+ position: absolute;
+ width: 13px;
+ height: 18px;
+ margin-left: -6px;
+ margin-top: -10px;
+ z-index: 9;
+ box-sizing: border-box;
+}
+/* Seekbar numbers */
+#time-numbers {
+ height: 40px;
+ width: max-content;
+ position: absolute;
+ z-index: 99999999;
+ top: 0px;
+}
+.time-number {
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 500;
+ color: var(--secondary-text-color);
+ text-align: center;
+ width: 20px;
+ position: relative;
+ margin-top: 10px;
+ display: inline-block;
+ transform: translateX(-10px);
+}
+.time-number span {
+ display: block;
+ width: 1px;
+ height: 6px;
+ background-color: #3c406f;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 6px;
+}
+#timeline-zoom {
+ position: absolute;
+ left: 64px;
+ bottom: 30px;
+ z-index: 99999;
+ width: 135px;
+}
+#timeline-big,
+#timeline-small {
+ position: absolute;
+ bottom: 20px;
+ left: 25px;
+ width: 25px;
+}
+#timeline-small {
+ left: 218px;
+ width: 18px;
+}
+#speed {
+ left: 250px;
+ position: absolute;
+ bottom: 12px;
+ z-index: 99999;
+ font-family: Inter;
+ color: var(--main-text-color);
+ border-radius: 5px;
+ height: 40px;
+ line-height: 40px;
+ padding-left: 5px;
+ padding-right: 5px;
+ font-size: 14px;
+}
+.show-speed {
+ visibility: visible!important;
+}
+.speed {
+ width: 100%;
+ height: 32px;
+ font-size: 14px;
+ text-indent: 15px;
+ line-height: 32px;
+ border-bottom: 1px solid var(--panel-stroke);
+}
+.speed:hover {
+ cursor: pointer;
+ background: var(--input-color);
+}
+#speed img {
+ vertical-align: middle;
+}
+#speed:hover {
+ cursor: pointer;
+ background-color: var(--input-color);
+}
+#speed-arrow {
+ transform: scaleY(1);
+}
+.arrow-on {
+ transform: scaleY(-1)!important;
+}
+#speed-settings {
+ background-color: var(--panel-back);
+ width: 80px;
+ position: absolute;
+ z-index: 9999;
+ margin-top: -220px;
+ margin-left: -10px;
+ border: 1px solid var(--panel-stroke);
+ border-radius: 5px;
+ visibility: hidden;
+}
+.noselect {
+ -webkit-touch-callout: none; /* iOS Safari */
+ -webkit-user-select: none; /* Safari */
+ -khtml-user-select: none; /* Konqueror HTML */
+ -moz-user-select: none; /* Old versions of Firefox */
+ -ms-user-select: none; /* Internet Explorer/Edge */
+ user-select: none; /* Non-prefixed version, currently
+ supported by Chrome, Edge, Opera and Firefox */
+}
+#video-upload {
+ display: none;
+}
+#filepick,
+#filepick2,
+#filepick3,
+#audio-thing {
+ position: absolute;
+ z-index: 9999;
+ display: none;
+}
+/* Audio items */
+#audio-list {
+ width: 100%;
+ display: block;
+ width: calc(100% + 40px);
+ margin-left: -20px;
+}
+.audio-item {
+ width: calc(100% - 40px);
+ height: 68px;
+ border-radius: 5px;
+ border: 1px solid var(--panel-stroke);
+ margin-bottom: 10px;
+ margin-left: 20px;
+ box-sizing: border-box;
+}
+.audio-item:hover {
+ cursor: pointer;
+ background: var(--input-color);
+}
+.audio-item-active {
+ border: 1px solid var(--accent-color);
+ background-color: rgba(22, 95, 205, 0.1) !important;
+}
+.audio-preview {
+ display: inline-block;
+ vertical-align: middle;
+ margin-top: 10px;
+ margin-left: 8px;
+}
+.audio-preview img {
+ width: 10px;
+}
+.audio-thumb {
+ width: 50px;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+ margin-top: 6px;
+ border-radius: 5px;
+}
+.audio-info {
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+ font-family: Inter;
+ font-size: 12px;
+ margin-top: 8px;
+}
+.audio-info-title {
+ color: var(--main-text-color);
+}
+.audio-info-desc {
+ margin-top: 2px;
+ color: var(--secondary-text-color) !important;
+ text-decoration: none !important;
+}
+.audio-info-duration {
+ margin-top: 3px;
+ color: var(--secondary-text-color) !important;
+ font-size: 10px !important;
+}
+#nolayers {
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 60px;
+ display: block;
+}
+.yaylayers {
+ display: none !important;
+}
+::placeholder {
+ color: var(--secondary-text-color);
+ opacity: 1;
+}
+
+:-ms-input-placeholder {
+ color: var(--secondary-text-color);
+}
+
+::-ms-input-placeholder {
+ color: var(--secondary-text-color);
+}
+.selection-area {
+ background: rgba(46, 115, 252, 0.11);
+ border: 2px solid rgba(98, 155, 255, 0.81);
+ border-radius: 0.1em;
+ z-index: 999999999999 !important;
+}
+.gallery-row::-webkit-scrollbar,
+#layer-inner-list::-webkit-scrollbar {
+ width: 0px !important;
+ height: 0px !important;
+ background: transparent !important;
+}
+
+/* Upload popup */
+#upload-popup {
+ position: absolute;
+ z-index: 999999999999;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 100%;
+ display: none;
+}
+#upload-popup-container {
+ position: absolute;
+ left: 0px;
+ right: 0px;
+ top: 0px;
+ bottom: 0px;
+ margin: auto;
+ height: 320px;
+ width: 500px;
+ background: var(--panel-back);
+ border: 1px solid var(--panel-stroke);
+ border-radius: 5px;
+ z-index: 9999999;
+}
+#upload-popup-header {
+ height: 48px;
+ width: 100%;
+ position: relative;
+ line-height: 48px;
+}
+#upload-popup-title {
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-weight: 600;
+ font-size: 14px;
+ margin-left: 15px;
+}
+#upload-popup-close {
+ position: absolute;
+ top: 12px;
+ right: 15px;
+ width: 20px;
+ z-index: 999999999;
+}
+#upload-popup-close:hover {
+ cursor: pointer;
+ opacity: .7;
+}
+#upload-drop-area {
+ width: calc(100% - 30px);
+ margin: auto;
+ margin-top: 0px;
+ margin-bottom: 15px;
+ height: 200px;
+ border: 2px dashed var(--panel-stroke);
+ border-radius: 5px;
+ text-align: center;
+}
+#upload-drop-area:hover {
+ cursor: pointer;
+ background: var(--input-color);
+}
+.dropping {
+ background: var(--input-color)!important;
+}
+#upload-drop-group {
+ width: 200px;
+ margin: auto;
+ text-align: center;
+ margin-top: 60px;
+}
+#upload-drop-group img {
+ margin-bottom: 5px;
+}
+#upload-drop-title {
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 600;
+}
+#upload-drop-subtitle {
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 400;
+ margin-top: 5px;
+}
+#upload-link {
+ width: calc(100% - 30px);
+ margin-left: auto;
+ margin-right: auto;
+ height: 48px;
+}
+#upload-link input {
+ background: var(--input-color);
+ border-radius: 5px;
+ display: inline-block;
+ box-sizing: border-box;
+ vertical-align: middle;
+ width: 83%;
+ height: 38px;
+ line-height: 38px;
+ text-decoration: none;
+ outline: none;
+ border: 0px;
+ text-indent: 10px;
+ color: var(--main-text-color);
+}
+#upload-link-add {
+ background: var(--accent-color);
+ color: var(--main-text-color);
+ text-align: center;
+ font-family: Inter;
+ height: 38px;
+ line-height: 38px;
+ border-radius: 5px;
+ display: inline-block;
+ width: 15%;
+ margin-left: 5px;
+ vertical-align: middle;
+ box-sizing: border-box;
+ font-size: 14px;
+}
+#upload-link-add:hover {
+ opacity: .7;
+ cursor: pointer;
+}
+.upload-show {
+ display: block!important;
+}
+#upload-overlay {
+ background: #000;
+ opacity: .5;
+ z-index: 99999;
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+}
+
+/* Filters popup */
+#filters-parent {
+ top: 50px;
+ right: 10px;
+ width: 250px;
+ height: calc(100% - 100px);
+ position: absolute;
+ z-index: 9999;
+ background: var(--panel-back);
+ border: 1px solid var(--panel-stroke);
+ border-radius: 5px;
+ overflow: hidden;
+ visibility: hidden;
+}
+.show-filters {
+ visibility: visible!important;
+}
+#filters {
+ overflow-y: overlay;
+ width: 100%;
+ margin-top: 45px;
+ height: calc(100% - 45px);
+}
+#blur {
+ padding-bottom: 20px;
+}
+#filters-container {
+ width: 100%;
+ height: 100%;
+}
+#filters-header {
+ position: fixed;
+ width: 250px;
+ background: var(--panel-back);
+ height: 45px;
+ line-height: 45px;
+ z-index: 99999;
+ margin-top: -45px;
+ box-shadow: 0px 8px 4px -4px rgb(12 13 26 / 50%);
+}
+#filters-header #filters-title {
+ margin-top: 0px!important;
+}
+#filters-title {
+ color: var(--main-text-color);
+ font-size: 14px;
+ font-weight: 500;
+ font-family: Inter;
+ margin-left: 15px;
+ margin-top: 10px;
+}
+#reset-filters {
+ float: right;
+ margin-top: -20px;
+ margin-right: 15px;
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ background: var(--input-color);
+ border-radius: 5px;
+ padding-left: 8px;
+ padding-right: 8px;
+ height: 25px;
+ line-height: 25px;
+ text-align: center;
+}
+#reset-filters:hover {
+ cursor: pointer;
+ opacity: .7;
+}
+#reset-filters img {
+ margin-right: 3px;
+ margin-bottom: -2px;
+}
+#filters-close {
+ position: absolute;
+ right: 15px;
+ top: 13px;
+ width: 20px;
+}
+#filters-close:hover {
+ cursor: pointer;
+ opacity: .6;
+}
+#filters .nice-select {
+ width: calc(100% - 30px)!important;
+ margin-left: 15px!important;
+ margin-top: 15px!important;
+ margin-bottom: 10px!important;
+}
+#filters hr {
+ margin-top: 15px!important;
+ margin-bottom: 15px!important;
+ width: calc(100% - 30px)!important;
+ margin-left: 15px!important;
+}
+.filter-row {
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-weight:400 !important;
+ font-size: 14px;
+ margin-top: 25px;
+ margin-left: 15px;
+}
+.property-filter-input {
+ display: inline-block;
+}
+.property-filter-input input {
+ background-color: var(--input-color) !important;
+ border: none;
+ color: var(--main-text-color);
+ height: 35px;
+ font-family: Inter !important;
+ width: 41px;
+ box-sizing: border-box;
+ text-indent: 11px;
+ border-radius: 5px;
+ font-weight: normal;
+ font-size: 14px;
+}
+.property-filter-input:after {
+ content: attr(data-label);
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-weight: 400;
+ font-size: 14px;
+ margin-top: 10px;
+ margin-left: -20px;
+ text-align: right;
+ position: absolute;
+}
+.select-filter {
+ float: right;
+ margin-top: 10px;
+ margin-right: 15px;
+ width: 120px;
+}
+#status-toggle {
+ width: 120px;
+ background: var(--input-color);
+ border-radius: 5px;
+ float: right;
+ margin-right: 15px;
+ height: 35px;
+ line-height: 35px;
+ margin-top: -10px;
+ overflow: hidden;
+}
+.status-trigger {
+ width: 48%;
+ color: var(--secondary-text-color);
+ font-size: 14px;
+ font-family: Inter;
+ text-align: center;
+ display: inline-block;
+ box-sizing: border-box;
+}
+.status-active {
+ background: var(--accent-color);
+ color: var(--main-text-color)!important;
+}
+.status-trigger:not(.status-active):hover {
+ cursor: pointer;
+ opacity: .7;
+}
+#chroma-color {
+ float: right;
+ margin-right: 15px;
+ margin-top: -8px;
+}
+#chroma-color input {
+ margin-top: -27px!important;
+ width: 85px!important;
+}
+#filter-color {
+ margin-top: 30px;
+ margin-bottom: 25px;
+}
+
+/* Eyedropper */
+#eyedropper {
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ margin-top: 5px;
+}
+.pcr-current-color:hover {
+ cursor:pointer;
+}
+.lottie-canvas {
+ display: none;
+}
+
+/* Animated text */
+#animated-text {
+ width: 100%!important;
+}
+#animated-text input {
+ width: 119px;
+ display: inline-block;
+}
+#animatedset {
+ width: 30px;
+ padding-left: 15px;
+ padding-right: 15px;
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ background: var(--accent-color);
+ border-radius: 5px;
+ text-align: center;
+ display: inline-block;
+ height: 35px;
+ line-height: 35px;
+ vertical-align: middle;
+ margin-left: 8px;
+ margin-top: -3px;
+}
+#animatedset:hover {
+ cursor: pointer;
+ opacity: .7;
+}
+
+#order-toggle {
+ width: 100%;
+ background: var(--input-color);
+ border-radius: 5px;
+ height: 35px;
+ line-height: 35px;
+ overflow: hidden;
+}
+.order-toggle-item, .order-toggle-item-2 {
+ width: 50%;
+ color: var(--secondary-text-color);
+ font-size: 14px;
+ font-family: Inter;
+ text-align: center;
+ display: inline-block;
+ box-sizing: border-box;
+}
+.order-toggle-item-active, .order-toggle-item-active-2 {
+ background: var(--accent-color);
+ color: var(--main-text-color)!important;
+}
+.order-toggle-item:not(.order-toggle-item-active):hover, .order-toggle-item-2:not(.order-toggle-item-active-2):hover {
+ cursor: pointer;
+ opacity: .7;
+}
+
+/* Animated text grid */
+.animated-text-grid {
+ display: grid;
+ grid-gap: 15px;
+ grid-auto-columns: auto;
+ grid-template-columns: 75px 75px 75px;
+}
+.animated-text-item {
+ background: var(--input-color);
+ border-radius: 5px;
+ height: 82px;
+ width: 82px;
+ text-align: center;
+ position: relative;
+ box-shadow: inset 0px 2px 2px rgb(255 255 255 / 5%), inset 0px -2px 1px rgb(0 0 0 / 5%);
+}
+.animated-text-item:hover {
+ cursor: pointer;
+ background: var(--button-hover)!important;
+}
+
+/* More menu */
+#more-over {
+ position: absolute;
+ background: var(--panel-back);
+ width: 200px;
+ border-radius: 5px;
+ left: 80px;
+ z-index: 999999999;
+ border: 1px solid var(--panel-stroke);
+ top: 200px;
+ display: none;
+}
+.more-show {
+ display: block!important;
+}
+#clear-project, #upload-lottie {
+ height: 38px;
+ color: var(--secondary-text-color);
+ font-size: 14px;
+ font-family: Inter;
+ display: inline-block;
+ width: 100%;
+ line-height: 38px;
+ vertical-align: middle;
+}
+#clear-project:hover, #upload-lottie:hover {
+ cursor: pointer;
+ background: var(--input-color)!important;
+}
+#clear-project img {
+ vertical-align: middle;
+ display: inline-block;
+ margin-left: 15px;
+ margin-right: 5px;
+ margin-top: -5px;
+}
+#upload-lottie img {
+ margin-left: 16px;
+ margin-right: 5px;
+ margin-top: -5px;
+ vertical-align: middle;
+ display: inline-block;
+}
+
+/* Scrollbar width */
+::-webkit-scrollbar {
+ width: 15px;
+ height: 15px;
+ background: transparent;
+}
+/* Track */
+::-webkit-scrollbar-track {
+ background: transparent;
+}
+/* Handle */
+::-webkit-scrollbar-thumb {
+ background-color: rgba(160, 165, 208, 0.2);
+ border: 4.5px solid transparent;
+ border-radius: 10px;
+ background-clip: padding-box;
+ opacity: 0.3;
+}
+::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(160, 165, 208, 0.4);
+}
+/* Weird scrollbar gap */
+::-webkit-scrollbar-corner {
+ background: transparent;
+}
+#optimized {
+ padding: 20px;
+ height: min-content;
+ width: 300px;
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ border-radius: 5px;
+ background: var(--panel-back);
+ border: 1px solid var(--panel-stroke);
+ box-sizing: border-box;
+ box-shadow: 0 4px 100px rgb(0 0 0 / 25%);
+ z-index: 9999999999;
+}
+#emoji {
+ font-size: 16px;
+}
+#opt-title {
+ color: var(--main-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 700;
+ margin-top: 10px;
+}
+#opt-desc {
+ color: var(--secondary-text-color);
+ font-family: Inter;
+ font-size: 14px;
+ font-weight: 500;
+ margin-top: 10px;
+ line-height: 22px;
+}
+#disclaimer {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: fixed;
+ z-index: 999999999;
+ display: none;
+}
+#opt-button {
+ height: 40px;
+ line-height: 40px;
+ background: var(--accent-color);
+ color: var(--main-text-color);
+ font-family: Inter;
+ text-align: center;
+ font-size: 14px;
+ margin-top: 20px;
+ border-radius: 5px;
+ box-shadow: inset 0 2px 2px rgb(255 255 255 / 5%), inset 0 -2px 1px rgb(0 0 0 / 5%);
+ font-weight: 500;
+ display: block;
+ text-decoration: none;
+}
+#disc-overlay {
+ background: #000;
+ opacity: .6;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+@media only screen and (max-width: 1000px) {
+ #disclaimer {
+ display: block!important;
+ }
+ #controls, #top-canvas, #bottom-canvas {
+ display: none;
+ }
+}