2ch commited on
Commit
9ed63c9
·
verified ·
1 Parent(s): 10872d3

Upload 26 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ rsrc/fonts/fonts.png filter=lfs diff=lfs merge=lfs -text
37
+ rsrc/fonts/fs/DejaVuSans.otf filter=lfs diff=lfs merge=lfs -text
code/dbs/DBS1739818248.js ADDED
The diff for this file is too large to render. See raw diff
 
code/ext/ext1740439869.js ADDED
The diff for this file is too large to render. See raw diff
 
code/ext/fribidi.wasm ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6e7b7b51bd82c45e6dff9cd4afeab8826565a19cba7bb5bbf59965ea84976233
3
+ size 33491
code/ext/hb.wasm ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:35b7500cec0f1967a4230cf0676cfb29db0e97bf93f44acc3decdb8a44580afa
3
+ size 443719
code/lang/0.js ADDED
@@ -0,0 +1 @@
 
 
1
+ [File;Edit;Image;Layer;Folder;Select;Filter;View::noun (Top Menu);Window;Language;Log In;Log Out;Create translation::Click it to get to www.Photopea.com/translate;[Account;Terms of Service;Back;About::"About a program" - the orange button at the top;Report a bug;Learn];More;Theme;Use WebGL;[Photopea: advanced image editor::The header at the top of the page;Free online editor supporting PSD, AI, PDF, SVG and CDR formats.::Will be at the top of the page;Create a new image or open existing files from your computer. Save your work as PSD (File - Save as PSD) or as JPG / PNG / SVG (File - Export as).::Will be at the top of the page;Suggest new features at our <GitHub> or <Facebook>. Our goal is to create <the most advanced and affordable photo editor>.::Parts between < and > will become links.;Sponsor links open in a new window.;This feature is not available.;Install Photopea;Drop any files here]];[Open::verb;Publish online;Save::verb;Save as PSD;Print::Press to print on a printer;Open from URL;Open From Computer;Connect With Google Drive;Export as;Export Layers;Script;Open & Place::Open a document and insert it into a current document;[Close;OK::if you keep it empty, "OK" will be used;Reset::if you keep it empty, "Reset" will be used];Local Storage;File Info;Preset Manager;[Artboard;Artboards;New Artboard;Artboard from Layers];Automate;Share;[Storage;From Storage;To Storage;Home;This Device;Give VAR0 a direct access to VAR1.::VAR0 will be replaced with Photopea, and VAR1 will be replaced with Goolge Drive, Dropbox, etc.]];[Step Forward::In history of changes;Step Backward::In history of changes;Clear::Verb, press to clear the selected area;Fill::Verb, press to fill the selected area;Transform::Transform the image;Rotate;Flip VAR0::VAR0 will be replaced with Horizontally/Vertically;Scale VAR0::VAR0 will be replaced with Horizontally/Vertically;Undo / Redo;Perspective;[Auto-Blend::Auto-Blend layers together;Auto-Align::Auto-Align layers against each other];Fade;Apply Image;Defringe;Variables];Adjustments;[Brightness/Contrast;Levels::Levels adjustment;Curves::Curves adjustment;Exposure;Vibrance;Hue/Saturation;Color Balance;Black & White;Photo Filter;Channel Mixer;Color Lookup;Invert;Posterize;Threshold;Gradient Map;Selective Color;[Auto Tone;Auto Contrast;Auto Color];Replace Color;Match Color];[Cut;Copy;Paste::like "insert", not like "toothpaste";New;Delete;Enable;Disable;Copy Merged::Copy not from a layer, but from all layers (all merged together);Apply::Apply Mask - "combine" it with a layer;Again::Repeat the same aciton one more time;Update::A verb];[Duplicate Layer;New Adjustment Layer;Raster Mask;Vector Mask;Add (Reveal All)::Add a mask;[Add (Hide All)::Add a mask;Reveal Selection;Hide Selection;From Transparency];[Clipping Mask;Quick Mask Mode];[Convert to Smart Object;Smart Object];Rasterize::Convert Text layer/vector layer to pixels;Group Layers::Put selected layers into a new group;Merge Down::Merge a layer with one below it;Merge Up::Merge a layer with one above it;[Merge Layers::Merge selected layers;Flatten Image::Merge all layers in a document into one];New Layer;Enable Raster Mask;Disable Raster Mask;Enable Vector Mask;Disable Vector Mask;Enable Clipping Mask;Disable Clipping Mask;New Folder;Add Raster Mask;Delete Raster Mask;Add Vector Mask;Delete Vector Mask;Link Raster Mask;Unlink Raster Mask;Link Vector Mask;Unlink Vector Mask;Enable Layer Effects;[Disable Layer Effects;Scale Effects];Delete Layer;Layer Opacity Change;Blending Change;Rasterize Layer Style;Layer Order::Name of the step, when reordering layers;[Creating Smart Object;Updating Smart Object;Placing Smart Object;Source (Smart Object);Stack Mode::the mode of combining (stacking) multiple images into one];Name Change;Color Change;Edit Adjustment Layer;Convert to Shape;Enable Filter Mask;Disable Filter Mask;Enable Smart Filters;Disable Smart Filters;Add Filter Mask;Delete Filter Mask;Clear Smart Filters;[[Color Fill;Gradient Fill;Pattern Fill;Content Aware];New Fill Layer;Modify Fill Layer];[Layer Via Copy;Layer Via Cut];Filter Mask;Delete Layer Style;Move Smart Filter;Delete Smart Filter;[Link Layers;Unlink Layers];Arrange::Arrange layers;[Bring to Front;Bring Forward;Send Backward;Send to Back];[This layer is Locked.;Lock Change;Lock::noun - a lock on a layer];Animation];[All::As in Select - All;Deselect;Inverse;Modify;Expand::Expand Selection;Contract;Feather::Feather (blur) a Selection;Move Selection;Color Range;Border::The border of a Selection;Transform Selection;Refine Edge::A tool for improving the edge of a selection;Heal Selection;Magic Cut;Subject:: Select - Subject;Grow:: Select - Grow;Similar:: Select - Similar];[Zoom In;Zoom Out;Guides::Vertical and horizontal lines over the image, to help us be more precise;Rulers;Grid;Snap::When moving objects, they will "stick" to other objects, guides, etc.;Snap To;[Document Bounds;All Documents];Pixel Grid;Paths::Elements of vector graphics;Snap to Pixels;[Slices;Slice Options;Clear Slices;Slices from Guides];Show::A verb: to show.;Extras::Visual elements, that are not printed (guides, grid, selections ...);Pattern Preview];[History::History of steps;Layers;Properties;Brush::A brush tool;Character::= a Letter (like a, b, c, ...);Paragraph;Info;Layer Comps::Compositions of layers;Swatches::Gallery of colors;Actions;Histogram::Usually the same in other languages;Navigator;Tool Presets;Glyphs;Notes];[Brush Tool;Clone Tool;Crop Tool;Eraser Tool;Ellipse Select;Eyedropper::A tool to pick color from the image;Gradient Tool;Hand Tool::To move (pan) across the image area;Type Tool;Lasso Select;Magnetic Lasso Select;Move Tool;Magic Wand;Paint Bucket Tool;Polygonal Lasso Select;Rectangle Select;Free Transform;Zoom Tool;Blur Tool;Sharpen Tool;Smudge Tool;Dodge Tool::Make Brighter;Burn Tool::Make Darker;Sponge Tool::Desaturate;Spot Healing Brush Tool;Healing Brush Tool;Patch Tool::Cut from one place and put to another place;Path Select::a tool to select / move paths;Direct Select::a tool to select / move knots of paths;Pen;Free Pen::Draw freely with this pen;Custom Shape;Rectangle;Ellipse;Parametric Shape;Line;Ruler::A ruler tool to measure distances;Quick Selection;Pencil Tool;Perspective Crop;Slice Tool;Slice Select Tool;Color Replacement;Red Eye Tool;Object Selection;Background Eraser;Puppet Warp;Rotate View;Content-Aware Scale;Content-Aware Move Tool;Artboard Tool;Curvature Pen;Magic Eraser;Color Sampler];[Take a picture::Press the button to take a picture;Color Picker;Contour Editor;Canvas Size;Duplicate Into ...;Gradient Editor;Layer Style;New Project;Save for web;Warp;Image Size;[Vectorize Bitmap::Convert raster pixels into vector paths;Reduce Colors::Reduce the number of colors in the image (Edit - Reduce Colors)];[Trim::cut away an empty area around the object;Crop::(verb) Crop the image;Reveal All];Keyboard Shortcuts;Add Guides;[Clear Guides;Guides from Layer;Lock Guides]];[Opacity;Effects;Brightness;[Contrast;Use Legacy];Channel::Color Channel;Exposure;Offset;Gamma correction;Hue;Saturation;Lightness;Colorize;Range;Vibrance;[Size;Interpolation;Nearest Neighbor;Bilinear;Bicubic Sharper];Angle;Roundness;Hardness;Spacing;[Blend Mode;Blend If::Specifies a tonal range for blending];[Sample Size;Sampling Ring];Contour;Style;[Reverse;Relative::When ON, you only write a number, which will be added to the original value;Anchor::To which side the object should be anchored;Dither::Enable dithering];Tolerance;[Contiguous;Anti-alias;Sample All Layers;Resample;Continuous::adapt continuously, while moving;Once::one time];Fill::Noun, the content (filling) of something.;Use global angle;Distance;Spread::Spread the effected area;Noise::add random image noise;Knock out drop shadow::No drop shadow behind the object;Technique;Direction;Depth;Soften;Mode::One of possible modes of the effect;Gradient::from one color to another;Scale::scale the content - 10% or even 200%;Align with layer;Position::Position of the effect;Width;Height;Destination;Type;Foreground;Background;Custom::Color: not foreground or background, but a custom color;Name::Name of something;Create;Format;Keep Aspect Ratio;[Quality;Pages];Duplicate;Move::When you move layers, the Move step will be added to History;Smart Filters;Radius;Amount::Strength of the effect (0 ... 100);Distribution;[Uniform::uniform random distribution;Gaussian];Monochromatic;Cell Size::Mosaic filter creates "cells";Pattern;Flow::A brush has the opacity and the flow;Strength;Protect Detail;Fill Type;Texture;Jitter::Add Noise in Outer Glow;Edge::The inner glow is either from the center, or from the Edge;Source;Target;Channels;Mask::A noun, e.g. a vector mask or a raster mask ;Density;Aligned;[Path;Shape;Pixels;Inches;Centimeters;Millimeters;Percent;Current Path];Shapes;Sides;Preferences;[Length;Ratio;Any::Any ratio of a rectangle;Grid Type;Isometric;Grid Gap;Ruler Units];Reduce noise;Colors;Distances;Rate::Liquify filter: Rate of modification;Auto-Select::Move tool option: click the object to select its layer;Find;Define New;[Photo;Screen::computer screen;Mobile::Mobile device;Ads::Advertisement;Print::A noun];[Free::Not Restricted / Not Limited;Fixed Ratio;Fixed Size];Help;[Live Shape::Shape, that can be reconstructed from parameters at any time;Edit Live Shape;Same Radii::all radiuses of a rectangle should be the same];Fuzziness;[Polygon;Star;Spiral;Square;Arrow;Circle;Dot];[Corner Radius;Inner Radius;Simplify];[Sharp;Crisp;Strong;Smooth]];[Color;[None::No Color;Red;Orange;Yellow;Green;Blue;Purple;Gray;White;Transparent;Black;Cyan::A color;Magenta::A color;Neutral::Apply to neutral colors];Total;Absolute;Preserve Luminosity;Preserve Transparency;Profile::Color Profile];[Drop Shadow;Inner Shadow;Outer Glow;Inner Glow;Bevel and Emboss;Color Overlay;Gradient Overlay;Pattern Overlay;Satin;Stroke::Thick line around an object;Blending Options;Select Pixels];[Tip Shape;Tip Dynamics;Scatter::dont put brush exactly, but randomly around the target spot;Color Dynamics;[Size Jitter::change the size randomly;Minimal Diameter;Angle Jitter::change the angle randomly;Roundness Jitter::change the roundness randomly;Minimal Roundness];[Position Jitter;Count::The number of brush tips;Count Jitter];[Foreground/Background Jitter;Hue Jitter;Saturation Jitter;Brightness Jitter];[Select clone source by holding Alt (or K) and clicking on the image.;Mark Foreground with White, Background with Black, and the unknown area with Gray.;Layer is not editable.;Text Layer must be rasterized first;Smart Object must be rasterized first;Select multiple layers;Straighten Layer::Will rotate the layer, so that the horizon is horizontal;Open a document first.;Close the current window first.;Current Tool Only::Tool Presets only for the current tool;Delete Cropped Pixels];[Record::To record actions;New Action Set;New Action];[Stylus Pressure controls Opacity;Stylus Pressure controls Size];[Normal::One of Blend Modes (when empty, English version will be used);Dissolve::One of Blend Modes (when empty, English version will be used);Darken::...;Multiply::...;Color Burn::...;Linear Burn::...;Darker Color::...;Lighten;Screen;Color Dodge;Linear Dodge;Lighter Color;Overlay;Soft Light;Hard Light;Vivid Light;Linear Light;Pin Light;Hard Mix;Difference;Exclusion;Subtract;Divide;Hue;Saturation;Color;Luminosity;Pass Through::Blend Mode only for Folders;Add::Mathematically]];[Leading::Text style - vertical distance between lines;Tracking::Text style - horizontal spacing between characters;Baseline shift::Move the bottom line of the text;[Convert to Point Text;Convert to Paragraph Text]];[All Layers;Current Layer;Selection;Current & Below::Current layers and all layers below it];[Replace::The new thing replaces the old one;Unite;Subtract;Intersect;Exclude;Merge];[[Linear;Radial;Angle;Reflected;Diamond;Shape Burst];[Softer;Precise];[Outer Bevel;Inner Bevel;Emboss;Pillow Emboss;Stroke Emboss;Stroke Width::The thickness of the stroke line (contour)];[Smooth::A verb: to smooth something;Chisel Hard;Chisel Soft;Smoothness];[Up;Down];[Outside;Center;Inside;From Center::Draw an object from the center];[Shadows;Midtones;Highlights];[Desaturate;Saturate];[Small;Medium;Large];[Caps;Corners;Dashes]];[Choose the object under the cursor;Transform controls;Pixel to Pixel::Zoom the image to 100% (1 image pixel = 1 screen pixel);Fit The Area;[Align Left Edges;Center Horizontally;Align Right Edges;Align Top Edges;Center Vertically;Align Bottom Edges;Equal Gaps::Equal spacing between objects]];[Place into::Place the new photo into:;Current Project;New Project;Resolution;Added into the current project.;A new project was created.;Access to the camera was denied.];[Orientation::Vertical or horizontal;Bend::Text warping: bend the text to a wave, etc.;Horizontal Distortion;Vertical Distortion;[Horizontal;Vertical;Horizontally;Vertically];[None::No Warp;Arc;Arc Lower;Arc Upper;Arch;Bulge;Shell Lower;Shell Upper;Flag;Wave;Fish;Rise;Fish Eye;Inflate;Squeeze;Twist;Custom];[Font;is not available;Will be rendered using;There is unsaved work in::File name will be added after this;Do you really want to close it?];[Swap Colors;Default: White and Black]];[loaded::File was loaded;added::Font was added;Move Guide;Delete Guide;Add Guide;Loading;Load VAR0::Keep VAR0 in a phrase, it will be replaced with a Noun when used];[Filter Gallery;[[Liquify::A filter;[Smudge::Draw over image to spread colors along your stroke;Reconstruct::Recover to original state;Smoothen::Make the effect more smooth;Twirl::Rotate in a spiral;Shrink::Make smaller;Blow::Make bigger;Push Left::ush colors to the left along the stroke;Freeze;Unfreeze]];[Lens Correction]];Blur::A noun;[Average::Average filter - fills the image with an average color;Blur:: A verb;Blur More;Box Blur;Gaussian Blur;Lens Blur;Motion Blur;Radial Blur;Shape Blur;Smart Blur;Surface Blur;Blur Gallery;[Field Blur;Iris Blur;Tilt-Shift;Path Blur;Spin Blur]];Distort;[Displace::Filter: move parts of image according to the brightness from another image;Pinch::Blow or shring around the center;Polar Coordinates;Ripple::Add tiny waves to the image;Shear;Spherize;Wave;ZigZag;Kaleidoscope];Noise::Filetr => Noise;[Add Noise;Despeckle;Dust & Scratches;Median;Reduce Noise];Pixelate;[Color Halftone;Crystallize;Facet;Fragment;Mezzotint;Mosaic;Pointillize];Render;[Clouds;Difference Clouds;Lens Flare;Flame;Fibers];Sharpen;[Sharpen;Sharpen Edges;Sharpen More;Smart Sharpen;Unsharp Mask];Stylize;[Diffuse;Emboss;Extrude;Find Edges;Oil Paint;Solarize;Trace Contour;Wind];Other;[Custom::A Custom kernel of the convolution;High Pass;Maximum;Minimum;Offset::Filter: shift the image horizontally and vertically;Repeat::Filter: Repeat the image many times;Color to Alpha::this filter makes a specific color transparent;Particles;Normal Map];[Undefined Area;Set to Transparent;Repeat Edge Pixels;Wrap Around;Last Filter;Preview];[Artistic;Brush Strokes;Sketch];[Colored Pencil::Following phrases are Filters in the Filter Gallery. Keep them empty to keep the English version in Photopea.;Cutout;Dry Brush;Film Grain;Fresco;Neon Glow;Paint Daubs;Palette Knife;Plastic Wrap;Poster Edges;Rough Pastels;Smudge Stick;Sponge;Underpainting;Watercolor;Accented Edges;Angled Strokes;Crosshatch;Dark Strokes;Ink Outlines;Spatter;Sprayed Strokes;Sumi-e;Diffuse Glow;Glass;Ocean Ripple;Bas Relief;Chalk & Charcoal;Charcoal;Chrome;Conté Crayon;Graphic Pen;Halftone Pattern;Note Paper;Photocopy;Plaster;Reticulation;Stamp;Torn Edges;Water Paper;Glowing Edges;Craquelure;Grain;Mosaic Tiles;Patchwork;Stained Glass;Texturizer::The last filter in the Filter Gallery.];[Edge Width;Edge Brightness;Sharpness;Spray Radius;Light/Dark Balance;Darkness;Distortion;Relief;Thickness;Stroke Pressure;Paper Brightness;Brush Size;Brush Detail;Highlight Area;Intensity;Glow Brightness;Stroke Size;Stroke Detail;Softness;Edge Thickness;Edge Intensity;Edge Simplicity;Edge Fidelity;Posterization;Definition;Texture Coverage;Shadow Intensity;Balance;Direction Balance;Image Balance;Black Intensity;White Intensity;Dark Intensity;Light Intensity;Stroke Width;Stroke Length;Graininess;Glow Amount;Clear Amount;Charcoal Area;Chalk Area;Foreground Level;Background Level;Fiber Length;Crack Spacing;Crack Depth;Crack Brightness;Tile Size;Grout Width;Lighten Grout;Square Size;Ripple Size;Ripple Magnitude;Number of Levels;Glow Size;Glow Color;Detail;Brush Type;Grain Type;Light];[Blocks;Canvas;Frosted;Tiny Lens;Bricks;Burlap;Sandstone];[Simple;Light Rough;Dark Rough;Wide Sharp;Wide Blurry;Sparkle];[Regular;Soft;Sprinkles;Clumped;Contrasty;Enlarged;Stippled;Speckle];[Right Diagonal;Left Diagonal];[Bottom;Bottom Left;Left;Top Left;Top;Top Right;Right;Bottom Right]];[Templates;[Font Filter;Keywords;Randomize];[With Symbols;With Photo];[Thumbnails;List]]
code/lang/8.js ADDED
@@ -0,0 +1 @@
 
 
1
+ [Файл;Редактирование;Изображение;Слой;Папка;Выделить;Фильтр;Просмотр;Окно;Язык;Войти;Выйти;Создать перевод;[Аккаунт;Условия использования;Назад;О сайте;Сообщить об ошибке;Обучение];Ещё;Тема;Использовать WebGL;[Photopea: расширенный редактор изображений;Бесплатный онлайн-редактор, поддерживающий форматы PSD, AI, PDF, SVG и CDR.;Создайте новое изображение или откройте существующие файлы с компьютера. Сохраните свою работу как PSD («Файл» – «Сохранить как PSD») или как JPG / PNG / SVG («Файл» – «Экспортировать как»).;Предлагайте новые возможности в нашем <GitHub> или <Facebook>. Нашей целью является создание <наиболее продвинутого и доступного по цене редактора фотографий>.;Ссылки на спонсоров открываются в новом окне.;Эта функция недоступна.;Установить Photopea;Перетащите сюда любые файлы]];[Открыть;Опубликовать в сети;Сохранить;Сохранить как PSD;Печать;Открыть по ссылке;Открыть с компьютера;Подключиться к Google Диску;Экспортировать как;Экспортировать слои;Скрипты;Открыть и поместить;[Закрыть;Подтвердить;Сбросить];Локальное хранилище;Информация о файле;Менеджер предустановок;[Монтажная область;Монтажные области;Новая монтажная область;Монтажная область из слоёв];Автоматизировать;Поделиться;[Хранилище;Из хранилища;В хранилище;Главная страница;Это устройство;Предоставьте VAR0 прямой доступ к VAR1.]];[Шаг вперёд;Шаг назад;Очистить;Заливка;Трансформация;Поворот;Отразить VAR0;Масштабирование VAR0;Отмена / Повтор;Перспектива;[Автосмешивание;Автовыравнивание];Ослабить;Внешний канал;Обрезка;Переменные];Коррекции;[Яркость/Контрастность;Уровни;Кривые;Экспозиция;Сочность;Тон/Насыщенность;Цветовой баланс;Чёрно-белое;Фотофильтр;Микширование каналов;Поиск цвета;Инвертировать;Постеризация;Порог;Карта градиента;Выборочный цвет;[Автотон;Автоконтраст;Автоцветокоррекция];Замена цвета;Соответствовать цвету];[Вырезать;Копировать;Вставить;Новый;Удалить;Включить;Отключить;Объединение копий;Применить;Повторно;Обновить];[Дублировать слой;Новый слой коррекции;Растровая маска;Векторная маска;Добавить (показать все);[Добавить (скрыть все);Показать выделенную область;Скрыть выделенную область;Из прозрачности];[Маска отсечения;Режим быстрой маски];[Преобразовать в смарт-объект;Смарт-объект];Растрирование;Группа слоёв;Объединить с предыдущим;Объединить с верхним;[Объединить слои;Выполнить сведение];Новый слой;Включить растровую маску;Отключить растровую маску;Включить векторную маску;Отключить векторную маску;Включить маску отсечения;Отключить маску отсечения;Новая папка;Добавить растровую маску;Удалить растровую маску;Добавить векторную маску;Удалить векторную маску;Привязать растровую маску;Отвязать растровую маску;Привязать векторную маску;Отвязать векторную маску;Включить эффекты слоев;[Выключить эффекты слоев;Эффекты Масштабирования];Удалить слой;Изменение прозрачности слоя;Изменение смешивания;Растеризовать стиль слоя;Порядок слоёв;[Создание Смарт-объекта;Обновление Смарт-объекта;Размещение Смарт-объекта;Источник (Смарт-объект);Режим стека];Изменение названия;Изменение цвета;Редактировать корректирующий слой;Преобразовать в Форму;Включить маску фильтра;Выключить маску фильтра;Включить умные фильтры;Выключить умные фильтры;Добавить маску фильтра;Удалить маску фильтра;Очистить умные фильтры;[[Заливка сплошным цветом;Заливка градиента;Заливки узором;С учетом содержимого];Новый заполняющий слой;Изменить заполнениние слоя];[Слой через копию;Слой из вырезанного];Маска фильтра;Удалить стиль слоя;Передвинуть Смарт фильтр;Удалить смарт фильтр;[Объединить слои;Разделить слои];Расставить;[На передний план;Выдвинуть;Отправить назад;На задний план];[Этот слой заблокирован.;Блокировать изменения;Замок];Анимация];[Все;Отменить выделение;Инвертировать;Модификация;Развернуть;Стягивать;Перо;Передвинуть выделение;Цветовой диапазон;Граница;Трансформировать выделение;Уточнить край;Пометить выбранное;Волшебная палочка;Предмет;Смежные пиксели;Подобные оттенки];[Приблизить;Отдалить;Направляющие;Линейки;Сетка;Привязка;Привязка к;[Границы документа;Все документы];Пиксельная сетка;Контуры;Привязка к пикселям;[Фрагменты;Параметры среза;Очистить Фрагменты;кусочки от направляющих];Показать;Дополнения;Просмотр палитры];[История;Слои;Свойства;Кисть;Характер;Параграф;Инфо;Наборы слоев;Образцы;Операция;Гистограмма;Навигатор;Наборы параметров для инструмента;Глифы;Записи];[Инструмент «Кисть»;Инструмент «Штамп»;Инструмент «Рамка»;Инструмент «Ластик»;Выделение в форме эллипса;Пипетка;Инструмент «Градиент»;Инструмент «Рука»;Инструмент «Текст»;Выделение лассо;Выделение магнитным лассо;Инструмент «Перемещение»;Волшебная палочка;Инструмент «Заливка»;Выделение прямолинейным лассо;Прямоугольное выделение;Свободное трансформирование;Инструмент «Масштаб»;Инструмент «Размытие»;Инструмент «Резкость»;Инструмент «Палец»;Инструмент «Осветлитель»;Инструмент «Затемнитель»;Инструмент «Губка»;Инструмент «Точечная восстанавливающая кисть»;Инструмент «Восстанавливающая кисть»;Инструмент «Заплатка»;Выделение контура;Прямой выбор;Ручка;Свободная ручка;Произвольная фигура;Прямоугольник;Эллипс;Параметрическая форма;Линия;Линейка;Быстрое выделение;Инструмент «Карандаш»;Кадрирование перспективы;Инструмент «Фрагмент»;Инструмент «Выделение фрагмента»;Замена цвета;Инструмент «Красные глаза»;Выбор объекта;Убрать фон;Кукольная деформация;Поворот вида;Масштаб с учётом содержимого;Инструмент «Перемещение с учётом содержимого»;Инструмент «Монтажная область»;Ручка кривизны;Магический ластик;Образец цвета];[Сделать снимок;Выбор цвета;Редактор контура;Размер холста;Дублировать в ...;Редактор градиента;Стиль слоя;Новый проект;Сохр��нить для интернета;Деформация;Размер изображения;[Трассировка;Уменьшить количество цветов];[Тримминг;Вырезать;Раскрыть все];Горячие клавиши;Добавить направляющие;[Удалить направляющие;Направляющие из слоя;Закрепить направляющие]];[Непрозр.;Эффекты;Яркость;[Контраст;Использовать прежние];Канал;Выдержка;Смещение;Коррекция гаммы;Тон;Насыщенность;Освещённость;Раскрасить;Диапазон;Сочность;[Размер;Интерполяция;Ближайшего соседа;Билинейная;Бикубическое сглаживание];Угол;Скруглённость;Жёсткость;Интервал;[Режим смешивания;Наложить, если];[Размер образца;Кольцо для отбора проб];Контур;Стиль;[Обратить;Относительно;Расположение;Дизеринг];Допуск;[Непрерывный;Алгоритм сглаживания;Образец всех слоёв;Повторная выборка;Продолжительно;Единожды];Заливка;Использовать глобальный угол;Смещение;Разброс;Шум;Убрать тень;Метод;Направление;Глубина;Смягчать;Режим;Градиент;Масштаб;Выровнять по слою;Позиция;Ширина;Высота;Цель;Тип;Основной;Фоновый;Свой;Имя;Создать;Формат;Сохранять пропорции;[Качество;Страницы];Дублировать;Двигать;Смарт-фильтры;Радиус;Количество;Дистрибуция;[Форма;По Гауссу];Однотонный;Размер ячейки;Шаблон;Нажим;Сила;Защитить детали;Тип обводки;Текстура;Колебание;Край;Источник;Цель;Каналы;Маска;Плотность;Выравнивание;[Контур;Форма;Пиксели;Дюймы;Сантиметры;Миллиметры;Процент;Текущий путь];Формы;Стороны;Параметры;[Длина;Соотношение;Любое;Стиль сетки;Изометрический;Размеры сетки;Разметка линеек];Уменьшить шум;Краски;Расстояния;Скорость;Автовыбор;Поиск;Опред. новый;[Фото;Экран;Мобильный;Реклама;Печать];[Бесплатный;Фикс. соотношение;Зафиксир. размер];Помощь;[Живые фигуры;Изменить фигуру;Те же радиусы];Разброс;[Многоугольник;Звезда;Спираль;Квадратный;Стрелка;Круг;Точка];[Радиус скруглений;Внутренний радиус;Упростить];[Чёткий;Резкий;Сильный;Гладкий]];[Цвет;[Отсутствует;Красный;Оранжевый;Жёлтый;Зелёный;Синий;Фиолетовый;Серый;Белый;Прозрачный;Чёрный;Голубой;Пурпурный;Нейтральный];Всего;Абсолютная;Сохранить свечение;Сохранять прозрачность;Профиль];[Тень;Внутренняя тень;Внешнее свечение;Внутреннее свечение;Тиснение;Наложение цвета;Наложение градиента;Наложение узора;Глянец;Обводка;Параметры наложения;Выберите точки];[Форма кончика;Динамический советник;Разброс;Цветовая динамика;[Колебание размера;Минимальный диаметр;Колебание угла;Округлость колебания;Минимальная окружность];[Позиция колебания;Подсчёт;Подсчёт колебаний];[Основные/Фоновые колебания;Тон колебания;Колебание насыщенности;Колебание яркости];[Выберите источник клонирования, удерживая Alt и нажав на изображение.;Выбрать цвет основной белым, фона чёрным и неизвестную область серой.;Слой не редактируемый.;Слой с текстом должен быть растрирован первым;Смарт-объект должен быть сначала растрирован;Выберите несколько слоёв;Выпрямить слой;Сначала откройте документ.;Сначала закройте текущее окно.;Только активный инструмент;Удалить обрезанные пиксели];[Запись;Новый набор операций;Новая операция];[Нажим управляет непрозрачностью;Нажим управляет размером];[Обычный;Растворение;Замена тёмным;Умножение;Затемнение основы;Линейный затемнитель;Темнее;Замена светлым;Осветление;Осветление основы;Линейный осветлитель;Светлее;Перекрытие;Рассеянный свет;Направленный свет;Яркий свет;Линейный свет;Точечный свет;Жёсткое смешение;Разница;Исключение;Вычитание;Разделение;Тон;Насыщенность;Цвет;Свечение;Пропустить;Добавить]];[Интерлиньяж;Трекинг;Базовая линия;[Преобразовать в короткий текст;Преобразовать в блочный текст]];[Все слои;Текущий слой;– Выделение;Текущие и нижние];[Заменить;Объединение;Разница;Пересечение;Исключающее «ИЛИ»;Слияние];[[Линейный;Радиальные;Угол;Отражение;Алмаз;Разбивка фигуры];[Мягче;Точное];[Внешний скос;Внутренний скос;Рельеф;Выпуклый рельеф;Рельефная кайма;Ширина обводки];[Оптимизировать;Твёрдый резец;Мягкий резец;Гладкость];[Вверх;Вниз];[Снаружи;Центр;Внутри;От центра];[Тени;Средние тоны;Свет];[Снижение насыщенности;Насыщенность];[Маленький;Средний;Большой];[Концы;Углы;Тире]];[Выбрать объект под курсором;Контроль трансформации;Пиксель в пиксель;Подогнать площадь;[Выровнять левые края;Горизонтально по центру;Выровнять правые края;Выровнять верхние края;Вертикально по центру;Выровнять нижние края;Равные пробелы]];[Вставить в;Текущий проект;Новый проект;Разрешение;Добавлено в текущий проект;Был создан новый проект.;Разрешение к камере было заблокировано.];[Ориентация;Изгиб;Искажение по горизонтали;Искажение по вертикали;[Горизонтальная;Вертик. –;по горизонтали;по вертикали];[Нет;Дуга;Дуга вниз;Дуга вверх;Арка;Выпуклость;Нижняя оболочка;Верхняя оболочка;Флаг;Волна;Рыба;Рост;Рыбий глаз;Надуть;Выжать;Поворот;Свой];[Шрифт;недоступен;Будет отображаться с использованием;Есть несохранённая работа в;Вы действительно хотите закрыть файл?];[Замена цветов;По умолчанию: Белое и чёрное]];[загружается;– добавлен;Переместить направляющую;Удалить направляющую;Добавить направляющую;Загрузка;Загрузить: VAR0];[Галерея фильтров;[[Пластика;[Размазать;Перестроить;Разглаживать;Скручивать;Сжать;Надуть;Нажать влево;Заморозить;Разморозить]];[Корректировка объектива]];Размытие;[Среднее;Размытие;Больше размытия;Размытие по рамке;Размытие по Гауссу;Размытие объектива;Размытие в движении;Радиальное размытие;Размытие формы;Смарт-размытие;Поверхностное размытие;Галерея размытия;[Размытие поля;Размытие диафрагмы;Наклон-смещение;Размытие пути;Размытие вращения]];Исказить;[Заменить;Щепотка;Полярные координаты;Волнистый;Сдвиг;Сферизация;Волна;Зигзаг;Калейдоскоп];Шум;[Добавить шум;Удаление пятен;Пыль и царапины;Медиана;Уменьшить шум];Оформление;[Цветные полутона;Кристаллизовать;Фасет;Фрагмент;Глубокая печать;Мозаика;Акварель];Рендеринг;[Облака;Облака с наложением;Блики;Пламя;Волокна];Резкость;[Резкость;Резкость на краях;Больше резкости;Умная резкость;Контурная резкость];Стилизовать;[Рассеить;Тиснение;Вытянуть;Найти края;Масляная краска;Соляризировать;Трассировка контура;Ветер];Другие;[Настройка;Цветовой контраст;Максимум;Минимум;Смещение;Повторить;Цвет в «Альфа» (прозрачность);Частицы;Карта нормалей];[Неопред. область;Обозначить прозрачным;Повторить крайние пиксели;Упаковка;Предыдущий фильтр;Просмотр];[Артистичный;Мазки кистью;Набросок];[Цветной карандаш;Вырезать;Сухая кисть;Зерничность;Фреска;Неоновое свечение;Масляная живопись;Палитровый нож;Пластиковая упаковка;Очерченные края;Пастель;Растушёвка;Губка;Рисование на обороте;Акварель;Акцент на краях;Наклонные штрихи;Перекрёстные штрихи;Тёмные штрихи;Обводка;Разбрызгивание;Аэрограф;Суми-э;Рассеянное свечение;Стекло;Океанские волны;Рельеф;Мел и уголь;Уголь;Хром;Карандаш конте;Тушь;Растровый узор;Почтовая бумага;Ксерокопия;Гипс;Ретикуляция;Линогравюра;Рваные края;Мокрая бумага;Свечение краёв;Кракелюры;Зернистость;Мозаика;Цветная плитка;Витраж;Текстуризатор];[Ширина краёв;Яркость краёв;Резкость;Радиус разбрызгивания;Баланс засветления/затемнения;Затемнение;Искажение;Величина;Толщина;Нажим;Яркость бумаги;Размер кисти;Детализация;Выделить область;Интенсивность;Яркость свечения;Размер штриха;Детализация контуров;Мягкость;Толщина краёв;Интенсивность краёв;Простота краев;Чёткость краёв;Постеризация;Определение;Покрытие текстуры;Интенсивность тени;Баланс;Баланс направления;Баланс изображения;Интенсивность чёрного;Интенсивность белого;Интенсивность тёмного;Интенсивность светлого;Ширина штриха;Ширина штриха;Зернистость;Степень свечения;Оригинал;Угольная область;Меловая область;Основной уровень;Фоновый уровень;Длина волокна;Трещиноватость;Глубина трещин;Освещенность трещин;Размер плитки;Величина зазоров;Яркость зазоров;Размер квадратов;Размер волн;Сила волн;Число уровней;Яркость;Цвет;Детализация;Тип кисти;Тип зерна;Источник];[Блоки;Холсты;Замёрзший;Маленькие линзы;Кирпичи;Мешковина;Известняк];[Простая;Светлая грубая;Тёмная грубая;Широкая резкая;Широкая размытая;Искры];[Обычный;Мягкий;Брызги;Комки;Контрастный;Увеличенные;Пунктирные;Пятна];[Правая диагональ;Левая диагональ];[Вниз;Внизу слева;Слева;Вверху слева;Вверх;Вверху справа;Справа;Внизу справа]];[Шаблоны;[Фильтр шрифтов;Ключевые слова;Случайно];[С символами;С фото];[Миниатюры;Список]]
code/pp/pp1740840958.js ADDED
The diff for this file is too large to render. See raw diff
 
code/storages/deviceStorage.html ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <script>
6
+ var lastMsg, allowed=false, dir=null, noThumbs=null;
7
+
8
+ var locStor = {};
9
+
10
+ function go() {
11
+ console.log("deviceStorage");
12
+ var free = false;
13
+
14
+ window.addEventListener("message", onMessage,false);
15
+
16
+
17
+ var idb = { req: window["indexedDB"].open("deviceStorage") };
18
+ idb.req["onupgradeneeded"] = function(e) {
19
+ //console.log("onupgradeneeded");
20
+ var db = e.target.result;
21
+ var os = db["createObjectStore"]("rsrc", { "keyPath": "k" });
22
+ }
23
+ idb.req["onsuccess"] = function(e) {
24
+ var db = locStor.db = e.target.result; //console.log(db);
25
+ var os = db["transaction"](["rsrc"], "readwrite")["objectStore"]("rsrc");
26
+
27
+ var req = os["get"]("fs0");
28
+ req["onsuccess"] = function(e) {
29
+ if(e.target.result) {
30
+ if(localStorage.getItem("forget")=="1") {
31
+ localStorage.removeItem("forget");
32
+ }
33
+ else {
34
+ locStor.fset = e.target.result["fset"];
35
+ //console.log(locStor.fset);
36
+ dir = locStor.fset;
37
+ }
38
+ //allowed=true; send("ready",true);
39
+ }
40
+ };
41
+ }
42
+
43
+ allowed=false; send("ready",false);
44
+ //allowed = free;
45
+ }
46
+
47
+ async function makeFolder(path) {
48
+ path = __getPath(path); //console.log(path);
49
+ var fld = dir; for(var i=0; i<path.length-1; i++) fld = await fld.getDirectoryHandle(path[i]);
50
+
51
+ var dirHandle = await fld.getDirectoryHandle(path[path.length-1], { create: true });
52
+ send("0","");
53
+ }
54
+
55
+ async function deleteFile(path) {
56
+ path = __getPath(path); //console.log(path);
57
+ var fld = dir; for(var i=0; i<path.length-1; i++) fld = await fld.getDirectoryHandle(path[i]);
58
+
59
+ await fld.removeEntry(path[path.length-1], { recursive: true });
60
+ send("0","");
61
+ }
62
+
63
+ async function saveFile (path, buff) {
64
+ path = __getPath(path); //console.log(path);
65
+ var fld = dir; for(var i=0; i<path.length-1; i++) fld = await fld.getDirectoryHandle(path[i]);
66
+
67
+ var han = await fld.getFileHandle(path[path.length-1],{create:true});
68
+
69
+ var wrt = await han.createWritable();//;.then(function(e) {e.write(buff); return e;}).then(function(e) {e.close()});
70
+ await wrt.write(buff);
71
+ await wrt.close();
72
+ send("0","");
73
+ }
74
+ async function printFile(path) {
75
+ path = __getPath(path); //console.log(path);
76
+ var fld = dir; for(var i=0; i<path.length-1; i++) fld = await fld.getDirectoryHandle(path[i]);
77
+
78
+ var han = await fld.getFileHandle(path[path.length-1]);
79
+ var fil = await han.getFile();
80
+ var buf = await fil.arrayBuffer();
81
+ window.parent.postMessage(buf,"*");
82
+ }
83
+
84
+ var fmap,left,fls, gtime, timg;
85
+ async function printFolder(path) {
86
+ path = __getPath(path); //console.log(path);
87
+ var fld = dir; for(var i=0; i<path.length; i++) fld = await fld.getDirectoryHandle(path[i]);
88
+
89
+ fls = []; fmap={}; left=0; timg=0; gtime=Date.now();
90
+ var time = Date.now(), cnt=0, gotFile=false;
91
+ for await (var entry of fld.values()) {
92
+ var file = [entry.name,-1]; fls.push(file);
93
+
94
+ //if(entry.kind=="file--") { file[1]=100; file.push(0); }
95
+ if(entry.kind=="file") {
96
+ gotFile=true;
97
+ fmap[entry.name]=fls.length-1; left++;
98
+ entry.getFile().then(fileLoaded);
99
+ //var fil = await entry.getFile(); makeFile(fil, file);
100
+ }
101
+ }
102
+ if(!gotFile) send("0",fls);
103
+ }
104
+ async function fileLoaded(fil) {
105
+ file = fls[fmap[fil.name]];
106
+ await makeFile(fil,file); left--;
107
+ if(left==0) {
108
+ console.log(Date.now()-gtime, timg);
109
+ send("0",fls);
110
+ }
111
+ }
112
+
113
+ async function makeFile(fil, file) {
114
+ var np = fil.name.split("."), ext = (np.length==1 ? "" : np.pop()).toLowerCase();
115
+ file[1]=fil.size;
116
+ file.push(~~(fil.lastModified/1000)); //return;
117
+ if(ext=="jpeg") ext="jpg";
118
+ if(ext=="tiff") ext="tif";
119
+ if(["dng","cr2","nef","arw","3fr","fff","gpr"].indexOf(ext)!=-1) ext="tif";
120
+
121
+ if(noThumbs) ext="---";
122
+ var thmb=null;
123
+ if(thmb==null && (ext=="jpg" || ext=="tif")) { // || ext=="--psd"
124
+ var lim = 130000;
125
+ var buf = await fil.slice(0,(lim*1.5>fil.size) ? fil.size : lim).arrayBuffer();
126
+ if(ext=="jpg" && buf.byteLength==fil.size) thmb = bufToUrl(buf, "jpg");
127
+ else thmb=findJPG(fil.name,buf);
128
+ }
129
+ //*
130
+ if(thmb==null && (ext=="psd" || ext=="psb")) {
131
+ var buf = await fil.slice(0,4096).arrayBuffer();
132
+ buf = new Uint8Array(buf); //console.log(buf);
133
+ var off = 26;
134
+ var clen = readUint(buf,off); off+=4; //console.log(clen);
135
+ off+=clen;
136
+ var rlen = readUint(buf,off); off+=4; //console.log(rlen);
137
+
138
+ if(off+rlen<=4096) buf=buf.slice(off,off+rlen);
139
+ else buf = new Uint8Array(await fil.slice(off,off+rlen).arrayBuffer());
140
+
141
+ off = 0;
142
+ while(off<buf.length) {
143
+ var sign = readASCII(buf,off,4); off+=4;
144
+ var resID = readUshort(buf,off); off+=2;
145
+ var sz = buf[off];
146
+ off+=sz+(1-(sz&1))+1;
147
+
148
+ var asiz = readUint(buf,off); off+=4;
149
+ if(resID==1036) {
150
+ //console.log(off, rlen);
151
+ var tsz = readUint(buf,off+20);
152
+ var io = off+28; //console.log(buf.slice(io,io+tsz));
153
+ thmb = bufToUrl(buf.slice(io,io+tsz).buffer,"jpg");
154
+ break;
155
+ }
156
+ off+=asiz+(asiz&1);
157
+ }
158
+ }//*/
159
+ if(thmb==null && fil.size<100000 && ["png","svg","bmp","gif","webp"].indexOf(ext)!=-1) {
160
+ var buf = await fil.arrayBuffer();
161
+ if(ext=="png") {
162
+ var data=new Uint8Array(buf), off=16;
163
+ var bf = new Uint8Array(4), dim=[];
164
+ for(var i=0; i<2; i++) {
165
+ for(var j=0; j<4; j++) bf[j] = data[off+3-j];
166
+ dim.push((new Uint32Array(bf.buffer))[0]);
167
+ }
168
+ if(dim[0]*dim[1]<1e6) thmb=bufToUrl(buf,ext);
169
+ }
170
+ else thmb=bufToUrl(buf,ext);
171
+ }
172
+ if(thmb) { file.push(thmb); timg++; }
173
+ }
174
+
175
+ function findJPG(name, buf) {
176
+ buf = new Uint8Array(buf); //console.log(buf);
177
+ var d8=-1, d9=-1, end=buf.length-1;
178
+ var ints = [];
179
+ for(var i=2; i<end; i++) {
180
+ if(buf[i]==255) {
181
+ var b1=buf[i+1], b2=buf[i+2], b3 = buf[i+3];
182
+ //if(b1==0xd8 && b2==0xff) console.log(name);
183
+ if (d8==-1 && b1==0xd8 && b2==0xff) d8=i;
184
+ else if(d8!=-1 && b1==0xd9) { d9=i; ints.push(d8,d9); d8=d9=-1; }
185
+ }
186
+ }
187
+ if(ints.length!=0) {
188
+ d8=ints[0]; d9=ints[1];
189
+ return bufToUrl(buf.slice(d8, d9+2).buffer, "jpg");
190
+ }
191
+ }
192
+
193
+ var u8 = new Uint8Array(4);
194
+ var u16 = new Uint16Array(u8.buffer);
195
+ var u32 = new Uint32Array(u8.buffer);
196
+ function readASCII (b, o, l) { var out=""; for(var i=0; i<l; i++) out+=String.fromCharCode(b[o+i]); return out; }
197
+ function readUshort(b, o) { u8[0]=b[o+1]; u8[1]=b[o]; return u16[0]; }
198
+ function readUint (b, o) { u8[0]=b[o+3]; u8[1]=b[o+2]; u8[2]=b[o+1]; u8[3]=b[o]; return u32[0]; }
199
+ function bufToUrl(buf, ext) {
200
+ var str=[]; buf=new Uint8Array(buf);
201
+ for(var i=0; i<buf.length; i++) str.push(String.fromCharCode(buf[i]));
202
+ return "data:image/"+ext+(ext=="svg"?"+xml":"")+";base64,"+btoa(str.join(""))
203
+ }
204
+
205
+ async function askPermissions() {
206
+ if(dir) {
207
+ if(await dir.requestPermission({mode:"readwrite"})!="granted") { send("1","You must give us access to some folder."); return; }
208
+ }
209
+ else {
210
+ try { dir = await window.showDirectoryPicker(); }
211
+ catch(e) { console.log(e); send("1","You must give us access to some folder."); return; }
212
+ locStor.fset = dir;
213
+
214
+ var os = locStor.db["transaction"](["rsrc"], "readwrite")["objectStore"]("rsrc");
215
+ var ooo=os["put"]({ "k":"fs0", "fset":locStor.fset });
216
+ ooo.onerror = function(e) { console.log(e); alert("Storing failed. Browser says: "+e["target"]["error"]["message"],7000); }
217
+ }
218
+ allowed = true; printFolder("/");
219
+ }
220
+
221
+ function onMessage(e) {
222
+ if((typeof e.data) == "string") {
223
+ //console.log(e.data);
224
+
225
+ if(window.showDirectoryPicker==null) { send("1","Your browser can not perform this feature."); return; }
226
+
227
+ var msg = null;
228
+ try { msg = JSON.parse(e.data); } catch(e) { return; }
229
+ if(msg.code==null) return;
230
+
231
+ if(!allowed) { askPermissions(); return; }
232
+
233
+
234
+ if(msg.code=="show") {
235
+ noThumbs=msg.nothumbs;
236
+ printFolder(msg.prm);
237
+ }
238
+ else if(msg.code=="load") {
239
+ printFile(msg.prm);
240
+ }
241
+ else if(msg.code=="delete") {
242
+ deleteFile(msg.prm);
243
+ }
244
+ else if(msg.code=="save" && msg.prm.endsWith("/")) makeFolder(msg.prm.slice(0,-1)); // making a folder
245
+ else if(msg.code=="forget") { console.log("forget message"); localStorage.setItem("forget", "1"); send("0",""); }
246
+ else if(msg.code=="rename") {
247
+ send("1","We can not rename files in your coputer yet.");
248
+ }
249
+
250
+ lastMsg=msg;
251
+ }
252
+ else {
253
+ if(lastMsg.code=="save") saveFile(lastMsg.prm, e.data);
254
+ }
255
+ }
256
+
257
+ function __getPath(path) {
258
+ var pth = []; if(path.length>1) pth=path.slice(1).split("/");
259
+ return pth;
260
+ }
261
+
262
+ function send(code,prm) {
263
+ var time = Date.now();
264
+ var str = JSON.stringify({"code":code, "prm":prm});
265
+ //console.log("json", Date.now()-time, str.length);
266
+ window.parent.postMessage(str,"*");
267
+ }
268
+ </script>
269
+ </head>
270
+ <body onload="go()"></body>
271
+ </html>
img/exts.png ADDED
img/nft.png ADDED
img/wows_logo.png ADDED
index.html CHANGED
@@ -1,19 +1,210 @@
1
- <!doctype html>
2
- <html>
 
3
  <head>
4
  <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en">
4
  <head>
5
  <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=5.0, initial-scale=1.0" />
7
+ <meta name="thumbnail" content="https://www.photopea.com/promo/screens/scr5.png" />
8
+ <meta name="theme-color" content="#474747">
9
+
10
+ <title>Photopea | Online Photo Editor</title>
11
+ <meta name="description" content="Photopea Online Photo Editor lets you edit photos, apply effects, filters, add text, crop or resize pictures. Do Online Photo Editing in your browser for free!" />
12
+
13
+ <link rel="apple-touch-icon" href="promo/icon512.png">
14
+ <link rel="icon" sizes="512x512" href="promo/icon512.png">
15
+ <link rel="image_src" type="image/png" href="promo/icon512.png" />
16
+ <link rel="manifest" href="manifest.json">
17
+ <link rel="chrome-webstore-item" href="//chrome.google.com/webstore/detail/fmophgdjdipcbfjiopifpngdjmemonko">
18
+
19
+ <style>
20
+ body, button, input, textarea, select { font-family: "Open Sans", "Segoe UI", sans-serif; }
21
+ body, input, select, button { font-size: 13px; }
22
+
23
+ body { background-image: radial-gradient(rgb(40,40,50), rgb(10, 0, 10)); }
24
+ #cap {
25
+ font-size:1.2em;
26
+ padding:0 2% 1em 2%;
27
+ color:#e6e6e6;
28
+ }
29
+ #cap a { color:inherit; font-weight:bold; }
30
+ #cap p { margin-bottom:1.5em; line-height:1.5em; }
31
+ #cap button { color:white; background-color:rgba(0,0,0,0.15); border:2px solid #3482f6; cursor:pointer; font-size:1.3em; padding:0.4em 1em 0.5em 1em; border-radius:500px; display:block; margin:30px auto; transition: box-shadow .3s; }
32
+ #cap button:hover { box-shadow: 0 0 30px #3482f6; }
33
+ #cap h1 { text-align:center; font-size: 4em; margin:0.5em 0 0 0; }
34
+
35
+ #mid { max-width:1100px; margin:0px auto; }
36
+ #bar { padding:0.4em 0; line-height:2.5em; }
37
+ #bar a { text-decoration:none; font-weight:normal; margin:0 10px; bottom:4px; position:relative; }
38
+
39
+
40
+
41
+ .pair { display:flex; margin:3em 0; }
42
+ .pair div { width:50%; }
43
+ .pair h2 { margin:0; }
44
+
45
+ @media (max-width: 600px) {
46
+ .pair { display:block; margin:3em 1em; }
47
+ .pair div { width:100%; }
48
+ }
49
+
50
+ .pair p { margin: 0.2em 0; opacity:0.6; }
51
+ .pair div {padding: 1em 0;}
52
+ </style>
53
  </head>
54
+
55
+ <body class="theme0">
56
+ <!---->
57
+ <div id="cap">
58
+ <div id="bar">
59
+ <img style="width:36px; height:auto; margin:0 6px -6px 0" width="512" height="512" src="promo/icon512.png" alt="Photopea logo" />
60
+ <b style="font-size:34px; margin-right:20px">Photopea</b>
61
+ <a target="_blank" href="//www.photopea.com/learn" title="Learn photo editing">Learn</a>
62
+ <a target="_blank" href="//www.photopea.com/tuts" title="Graphics tutorials">Tutorials</a>
63
+ <a target="_blank" href="//www.photopea.com/templates" title="Free PSD templates">Templates</a>
64
+ <a target="_blank" href="//www.photopea.com/api" title="Insert a photo editor into your product">API</a>
65
+ </div>
66
+
67
+ <h1>Free Online Photo Editor</h1>
68
+ <h2 style="text-align:center">Unlock your creativity with the best free photo editor.</h2>
69
+ <p style="text-align:center; font-size:1em; opacity:0.6">Transform your photos with professional-grade tools in a free online photo editor that works right in your browser. No downloads, no hassle.</p>
70
+ <button onclick="addPP()">Start using Photopea</button>
71
+
72
+ <div id="mid">
73
+ <div class="pair">
74
+ <div style="text-align:center;">
75
+ <img src="img/table.webp" style="width:80%; height:auto;" width="800" height="800" alt="Photo editor on a laptop" />
76
+ </div>
77
+ <div>
78
+ <h2>Fully Local</h2>
79
+ <p>There are no uploads. Photopea runs on your device, using your CPU and your GPU. All files open instantly, and never leave your device.</p>
80
+
81
+ <h2>Cost-Effective</h2>
82
+ <p>Enjoy all the premium features without spending a dime.</p>
83
+
84
+ <h2>Convenient Editor</h2>
85
+ <p>No need to install heavy software on your device. Just open your browser and start editing.</p>
86
+
87
+ <h2>Runs Everywhere</h2>
88
+ <p>Our photo editor runs on any device. The better hardware you have, the better it runs.</p>
89
+
90
+ <button onclick="addPP()">Start using Photopea</button>
91
+
92
+ </div>
93
+ </div>
94
+
95
+
96
+ <div class="pair">
97
+ <div>
98
+
99
+ <h2>Professional Editor</h2>
100
+ <p>Photopea offers a full suite of editing tools, from basic features like cropping and resizing to advanced features such as layering, masking, and blending.</p>
101
+
102
+ <h2>Full PSD support</h2>
103
+ <p>Photopea fully supports a popular PSD format, both opening and saving files. It is the main format of Photopea.</p>
104
+
105
+ <h2>Swiss knife for graphics</h2>
106
+ <p>Open and edit PNG, JPG, GIF, BMP, WEBP, SVG, PDF, AI, AVIF, DDS, HEIC, TIFF, MP4, TGA, CDR, PDN, EPS, INDD, Figma and
107
+ <a target="_blank" href="//github.com/photopea/photopea?tab=readme-ov-file#supported-formats">40 other formats</a>.</p>
108
+
109
+ <h2>Perfect RAW support</h2>
110
+ <p>Photopea opens DNG, CR2, CR3, NEF, ARW, RW2, RAF, ORF and FFF files. Set the Exposure, Color Balance,
111
+ Contrast, Highlights and Shadows, etc.</p>
112
+ <button onclick="addPP()">Start using Photopea</button>
113
+ </div>
114
+ <div style="text-align:center;">
115
+ <img src="img/hand_phone.webp" style="width:70%; height:auto;" width="1044" height="1328" alt="Photo editor on a phone" />
116
+ </div>
117
+ </div>
118
+
119
+
120
+ <div class="pair">
121
+ <div style="text-align:center">
122
+ <video style="width:80%; height:auto;" muted loop autoplay>
123
+ <source src="img/goats.mp4" type="video/mp4">
124
+ </video>
125
+ <!---->
126
+ </div>
127
+ <div>
128
+ <h2>State-of-the-art AI</h2>
129
+ <p><a target="_blank" href="//x.com/photopeacom/status/1735723561950539852/video/1">Remove background with one click</a>,
130
+ or <a target="_blank" href="//x.com/photopeacom/status/1661425407944425494/video/1">replace any part of an image</a>
131
+ with a new content through a text description.</p>
132
+
133
+ <h2>All Essential Features</h2>
134
+ <p>We have Layers, Masks, Layer Styles, Smart Objects, Adjustment Layers, Channels, Paths and more!</p>
135
+
136
+ <h2>Adjustments and Filters</h2>
137
+ <p>Do you need Levels and Curves? A Gaussian Blur? Or advanced stuff such as Liquify or Puppet Warp? We have it all!</p>
138
+
139
+ <h2>Vector Graphics</h2>
140
+ <p>Create and edit vector graphics directly within the editor. Perfect for designers working on logos, icons, or illustrations.</p>
141
+
142
+ <button onclick="addPP()">Start using Photopea</button>
143
+ </div>
144
+ </div>
145
+
146
+ <h2 style="text-align:center">Who Can Benefit from our Free Photo Editor?</h2>
147
+ <div class="pair">
148
+ <div>
149
+ <h2>Social Media Enthusiasts</h2>
150
+ <p>Enhance your photos before sharing them on platforms like Instagram, Facebook, or Twitter. Make every post stand out with unique edits.</p>
151
+
152
+ <h2>Students and Educators</h2>
153
+ <p>Create stunning visuals for presentations, assignments, and more. Our free online photo editor is a great tool for educational projects.</p>
154
+
155
+ <h2>Small Business Owners</h2>
156
+ <p>Design promotional materials, edit product photos, and create engaging content for your website or online store, all without spending on expensive software.</p>
157
+
158
+ <h2>Graphic Designers</h2>
159
+ <p>Whether you’re a freelancer or part of a design team, Photopea’s free photo editor offers all the features you need to produce professional-quality work.</p>
160
+
161
+ <button onclick="addPP()">Start using Photopea</button>
162
+ </div>
163
+ <div style="text-align:center;">
164
+ <img src="img/laptop.webp" style="width:80%; height:auto;" width="853" height="853" alt="Freelancer using a photo editor" />
165
+ </div>
166
+ </div>
167
+
168
+ <p style="text-align:center">
169
+ <a href="mailto:[email protected]">[email protected]</a>
170
+ | <a target="_blank" href="/privacy.html">Privacy Policy</a>
171
+ | <a target="_blank" href="//x.com/photopeacom">Twitter</a>
172
+ | <a target="_blank" href="//facebook.com/photopea/">Facebook</a>
173
+ | <a target="_blank" href="//reddit.com/r/photopea/">Reddit</a>
174
+ </p>
175
+ </div>
176
  </div>
177
+ <!---->
178
+
179
+ <script>
180
+ var cap = document.getElementById("cap"), added=false;
181
+ var href = window.location.href;
182
+ var ls = window.localStorage, ppp=null; if(ls) { ppp=ls.getItem("_ppp"); if(ppp) ppp=JSON.parse(ppp); } if(ppp==null) ppp={};
183
+
184
+ function addPP() {
185
+ cap.style.display="none";
186
+ if(ppp) { ppp["capShown"]="false"; ls.setItem("_ppp", JSON.stringify(ppp)); }
187
+ if(added) return; added=true; console.log("adding");
188
+ var fls = [
189
+ "style/all09.css",
190
+ "code/ext/ext1740439869.js",
191
+ "code/dbs/DBS1739818248.js",
192
+ "code/pp/pp1740840958.js"
193
+ ];
194
+ for(var i=0; i<fls.length; i++) {
195
+ var url = (window.location.host=="www.photopea.com"?"//vecpea.com/":"")+fls[i], isJS = url.endsWith(".js");
196
+ var el = document.createElement(isJS ? "script" : "link");
197
+ el.setAttribute(isJS ? "src" : "href",url);
198
+ if(!isJS) el.setAttribute("rel","stylesheet");
199
+ else el.async=false;
200
+
201
+ (isJS ? document.body : document.head).appendChild(el);
202
+ }
203
+ }
204
+
205
+ if(href.indexOf("#")!=-1 || href.indexOf("=")!=-1 || ppp["capShown"]=="false") addPP();
206
+ else cap.style.display="";
207
+ </script>
208
+ <script>function removeElementByText(e){let d=`//div[normalize-space() = '${e}']`,o=document.evaluate(d,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;o&&o.remove()}var observer=new MutationObserver(function(e){e.forEach(function(e){if(e.addedNodes&&e.addedNodes.length>0)for(var d=0;d<e.addedNodes.length;d++)e.addedNodes[d]===document.querySelector("body > div.flexrow.app")&&setTimeout(function(){function e(e){var d=document.querySelector(e);d&&d.parentNode&&d.remove()}e("body > div.flexrow.app > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)"),e("body > div.flexrow.app > div > div:nth-child(3) > div > div > span:nth-child(2) > button.fitem.bbtn"),removeElementByText("PeaGames"),removeElementByText("PeaDrive"),removeElementByText("Google Drive"),removeElementByText("OneDrive"),removeElementByText("Dropbox"),removeElementByText("Shared Drives"),removeElementByText("Shared with me"),removeElementByText("Private Folder"),document.querySelector("body > div.flexrow.app > div > div.flexrow > div > div > div.body > div > div:nth-child(1) > div.__web-inspector-hide-shortcut__");var d=document.querySelector("style#hide");d&&d.parentNode&&d.remove(),observer.disconnect()},1e3)})});observer.observe(document.body,{childList:!0,subtree:!0}),addPP();</script></body>
209
+
210
  </html>
manifest.json ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "Photopea",
3
+ "short_name": "Photopea",
4
+ "display": "standalone",
5
+ "display_override": ["window-controls-overlay"],
6
+ "icons": [
7
+ { "src": "promo/icon512.png", "type": "image/png", "sizes": "512x512" },
8
+ { "src": "promo/maskable512.png", "type": "image/png", "sizes": "512x512", "purpose":"maskable" }
9
+ ],
10
+ "start_url": "/?utm_source=homescreen",
11
+ "background_color":"#0f171d",
12
+ "theme_color": "#474747",
13
+ "file_handlers": [
14
+ { "action": "/", "accept": { "image/psd" : [ ".psd" ] } },
15
+ { "action": "/", "accept": { "image/jpeg": [ ".jpeg", ".jpg" ] } },
16
+ { "action": "/", "accept": { "image/png" : [ ".png" ] } },
17
+ { "action": "/", "accept": { "image/webp": [ ".webp" ] } },
18
+ { "action": "/", "accept": { "image/bmp" : [ ".bmp" ] } },
19
+ { "action": "/", "accept": { "image/gif" : [ ".gif" ] } },
20
+ { "action": "/", "accept": { "image/svg+xml": [ ".svg" ] } },
21
+ { "action": "/", "accept": { "application/pdf" : [ ".pdf" ] } },
22
+ { "action": "/", "accept": { "image/tiff": [ ".tif", ".tiff" ] } },
23
+ { "action": "/", "accept": { "image/ai" : [ ".ai" ] } },
24
+
25
+ { "action": "/", "accept": { "image/psb": [ ".psb" ] } },
26
+ { "action": "/", "accept": { "image/xcf": [ ".xcf" ] } },
27
+ { "action": "/", "accept": { "image/sketch": [ ".sketch" ] } },
28
+ { "action": "/", "accept": { "image/xd" : [ ".xd" ] } },
29
+ { "action": "/", "accept": { "image/pxd": [ ".pxd" ] } },
30
+ { "action": "/", "accept": { "image/cdr": [ ".cdr" ] } },
31
+ { "action": "/", "accept": { "image/eps": [ ".eps", ".ps" ] } },
32
+
33
+
34
+ { "action": "/", "accept": { "image/x-icon": [ ".ico" ] } },
35
+ { "action": "/", "accept": { "image/jpx": [ ".jpx" ] } },
36
+ { "action": "/", "accept": { "image/jp2": [ ".jp2" ] } },
37
+
38
+ { "action": "/", "accept": { "image/x-tga": [ ".tga" ] } },
39
+
40
+ { "action": "/", "accept": { "image/vnd-ms.dds": [ ".dds" ] } }
41
+
42
+ ],
43
+ "share_target": {
44
+ "action": "/",
45
+ "method": "POST",
46
+ "enctype": "multipart/form-data",
47
+ "params": {
48
+ "files": [
49
+ {
50
+ "name": "image",
51
+ "accept": ["image/jpeg", "image/png", "image/webp", "image/gif"]
52
+ }
53
+ ]
54
+ }
55
+ }
56
+ }
papi/tpls.json ADDED
The diff for this file is too large to render. See raw diff
 
plugins/gallery.html ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 
2
+ <!DOCTYPE html>
3
+
4
+ <html>
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" />
8
+
9
+ <style>
10
+ body { background-color:#474747; overflow:hidden; }
11
+ label { color:white; font-family:sans-serif; font-size:0.8em; }
12
+ img { margin-right:4px; cursor:pointer; }
13
+ button { padding:0 4px; }
14
+ #cont {
15
+ margin-top:4px;
16
+ overflow-y: scroll;
17
+ /* for Firefox: */
18
+ scrollbar-color: #222222 rgba(0,0,0, 0.2 );
19
+ scrollbar-width: thin;
20
+ }
21
+ #cont::-webkit-scrollbar {
22
+ width: 10px;
23
+ background: rgba(0,0,0,0.2);
24
+ }
25
+ #cont::-webkit-scrollbar-thumb {
26
+ background: #222222;
27
+ margin:2px;
28
+ }
29
+ </style>
30
+ <script>
31
+ var imgs = [], hits = [], done=0;
32
+
33
+ var UNS = location.href.indexOf("uns")!=-1, PAGE=1, sTop=-1, cont, keyws;
34
+
35
+ function update(page) {
36
+ cont = document.getElementById("cont");
37
+ keyws = document.getElementById("keyws");
38
+ if(page==null) { PAGE=1; hits=[]; sTop=-1; }
39
+ else { PAGE = page; sTop=cont.scrollTop; }
40
+
41
+ var ikey = keyws.value;
42
+ if(document.getElementById("isolated").checked) ikey += " isolated";
43
+ ikey = ikey.trim();
44
+ console.log(JSON.stringify(ikey));
45
+
46
+ var url;
47
+ if(!UNS) {
48
+ url = "https://pixabay.com/api/?image_type=photo"+(ikey==""?"":"&q="+encodeURIComponent(ikey))+"&per_page="+100+"&page="+PAGE+"&key=10554583-a5eacb61c2e61105fdfb6eb88&safesearch=true";
49
+ }
50
+ else {
51
+ //var keys = ["lake", "mountains", "tree"]; if(ikey=="") ikey=keys[Math.floor(Math.random()*keys.length)];
52
+ url = "https://api.unsplash.com/search/photos?per_page="+30+"&query="+encodeURIComponent(ikey)+"&page="+PAGE;
53
+ }
54
+ var fnam = "gallery"+(UNS?"1":"");
55
+ if(ikey=="") {
56
+ if(!UNS && Math.random()<0.005) url="gallery.php?url="+encodeURIComponent(url)+"&fnam="+fnam;//+"&r="+Math.random();
57
+ else url=fnam+".json";
58
+ }
59
+ console.log(url);
60
+
61
+
62
+ var req = new XMLHttpRequest();
63
+ req.open("GET", url, true);
64
+ if(UNS) req.setRequestHeader("Authorization", "Client-ID 3twt3nS_LYzp4nViMBB3tmWU0F-wyHUpgfrG1nIuiYs");
65
+ req.onload = imgsLoaded.bind(this);
66
+ req.onerror = function(e) { console.log(e.target.response); }
67
+ req.send();
68
+ }
69
+ function imgsLoaded(e) {
70
+ //console.log(e.target.response);
71
+ var obj = JSON.parse(e.target.response); //console.log(obj);
72
+ var list = obj["hits"]?obj["hits"]:obj["results"];
73
+
74
+ hits = hits.concat(list);
75
+
76
+ var iw = window.innerWidth-29, th=100;
77
+ cont.setAttribute("style","height:"+(window.innerHeight-42)+"px;");
78
+ while(cont.firstChild) cont.removeChild(cont.firstChild);
79
+ cont.scrollTop = 0;
80
+
81
+ //for(var i=0; i<hits.length; i++) if(hits[i]["user_id"]==6314823) hits.splice(i,1);
82
+ var heis = [];
83
+ for(var i=0; i<hits.length; ) {
84
+ var totw = 0, j=i;
85
+ while(j<hits.length) {
86
+ var hit = hits[j], w=hit["previewWidth"], h=hit["previewHeight"];
87
+ if(w==null) { w=hit["width"]; h=hit["height"]; }
88
+
89
+ var nw=w*(th/h);
90
+ if(j<=i+1 || totw+nw < iw) { totw+=nw; j++; }
91
+ else break;
92
+ }
93
+ var num = j-i;
94
+ while(i<j) {
95
+ heis.push(Math.min(th*2,th*((iw-num*4)/totw))); i++;
96
+ }
97
+ }
98
+
99
+ imgs=[];
100
+
101
+ for(var i=0; i<hits.length; i++) {
102
+ var hit = hits[i];
103
+ var img = document.createElement("img");
104
+ img.setAttribute("src",hit["previewURL"]?hit["previewURL"]:hit["urls"]["thumb"]);
105
+ img.setAttribute("height",heis[i]+"px");
106
+ img.addEventListener("click", imgClick);
107
+ cont.appendChild(img);
108
+ imgs.push(img);
109
+ }
110
+ if(sTop!=-1) cont.scrollTop=sTop;
111
+
112
+ cont.appendChild(document.createElement("br"));
113
+ var more = document.createElement("button");
114
+ more.onclick = function(e) { update(PAGE+1); }
115
+ more.textContent="Load More";
116
+ if(keyws.value!="") cont.appendChild(more);
117
+
118
+ console.log(hits);
119
+ }
120
+ function imgClick(e) {
121
+ var ind = imgs.indexOf(e.currentTarget);
122
+ var hit = hits[ind]; console.log(hit);
123
+ var url = hit["largeImageURL"]; if(url==null) url = hit["urls"]["full"];
124
+ var x = "app.open(\""+url+"\",null,true);";
125
+ window.parent.postMessage(x, "*");
126
+ }
127
+ function msg(e) { alert("These images come from www."+(UNS?"Unsplash":"PixaBay")+".com and are free to use for any purpose."); }
128
+
129
+ window.onresize = update;
130
+ </script>
131
+ </head>
132
+
133
+ <body onload="update()">
134
+ <div style="height:22px; overflow:hidden;">
135
+ <button onclick="msg()">?</button>
136
+ <label>Keywords:</label> <input type="text" id="keyws" onchange="update()" value=""></input>
137
+ <input type="checkbox" id="isolated" style="vertical-align:middle;" onchange="update()" /> <label for="isolated">Isolated</label>
138
+ </div>
139
+
140
+ <div id="cont"></div>
141
+ </body>
142
+ </html>
plugins/gallery.json ADDED
@@ -0,0 +1 @@
 
 
1
+ [ERROR 400] Invalid or missing API key (https://pixabay.com/api/docs/).
promo/icon512.png ADDED
promo/maskable512.png ADDED
promo/thumb256.png ADDED
rsrc/basic/basic.zip ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c324480a95737c7624565f354c8e0ae9f6ad7823f84dd76efddfeec6895048c1
3
+ size 60504
rsrc/fonts/fonts.png ADDED

Git LFS Details

  • SHA256: 88208a66b734090063a198ac216f360fa17bebb49f6fd47a837aff224cce730a
  • Pointer size: 132 Bytes
  • Size of remote file: 1.41 MB
rsrc/fonts/fs/DejaVuSans.otf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7da195a74c55bef988d0d48f9508bd5d849425c1770dba5d7bfc6ce9ed848954
3
+ size 757076
style/all09.css ADDED
@@ -0,0 +1,1616 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* cyrillic-ext */
2
+ @font-face {
3
+ font-family: 'Open Sans';
4
+ font-style: italic;
5
+ font-weight: 300 800;
6
+ font-stretch: 100%;
7
+ font-display: swap;
8
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2');
9
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
10
+ }
11
+ /* cyrillic */
12
+ @font-face {
13
+ font-family: 'Open Sans';
14
+ font-style: italic;
15
+ font-weight: 300 800;
16
+ font-stretch: 100%;
17
+ font-display: swap;
18
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2');
19
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
20
+ }
21
+ /* greek-ext */
22
+ @font-face {
23
+ font-family: 'Open Sans';
24
+ font-style: italic;
25
+ font-weight: 300 800;
26
+ font-stretch: 100%;
27
+ font-display: swap;
28
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2');
29
+ unicode-range: U+1F00-1FFF;
30
+ }
31
+ /* greek */
32
+ @font-face {
33
+ font-family: 'Open Sans';
34
+ font-style: italic;
35
+ font-weight: 300 800;
36
+ font-stretch: 100%;
37
+ font-display: swap;
38
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2');
39
+ unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
40
+ }
41
+ /* hebrew */
42
+ @font-face {
43
+ font-family: 'Open Sans';
44
+ font-style: italic;
45
+ font-weight: 300 800;
46
+ font-stretch: 100%;
47
+ font-display: swap;
48
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2');
49
+ unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
50
+ }
51
+ /* math */
52
+ @font-face {
53
+ font-family: 'Open Sans';
54
+ font-style: italic;
55
+ font-weight: 300 800;
56
+ font-stretch: 100%;
57
+ font-display: swap;
58
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2');
59
+ unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
60
+ }
61
+ /* symbols */
62
+ @font-face {
63
+ font-family: 'Open Sans';
64
+ font-style: italic;
65
+ font-weight: 300 800;
66
+ font-stretch: 100%;
67
+ font-display: swap;
68
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2');
69
+ unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, U+1FB00-1FBFF;
70
+ }
71
+ /* vietnamese */
72
+ @font-face {
73
+ font-family: 'Open Sans';
74
+ font-style: italic;
75
+ font-weight: 300 800;
76
+ font-stretch: 100%;
77
+ font-display: swap;
78
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2');
79
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
80
+ }
81
+ /* latin-ext */
82
+ @font-face {
83
+ font-family: 'Open Sans';
84
+ font-style: italic;
85
+ font-weight: 300 800;
86
+ font-stretch: 100%;
87
+ font-display: swap;
88
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2');
89
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
90
+ }
91
+ /* latin */
92
+ @font-face {
93
+ font-family: 'Open Sans';
94
+ font-style: italic;
95
+ font-weight: 300 800;
96
+ font-stretch: 100%;
97
+ font-display: swap;
98
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2');
99
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
100
+ }
101
+ /* cyrillic-ext */
102
+ @font-face {
103
+ font-family: 'Open Sans';
104
+ font-style: normal;
105
+ font-weight: 300 800;
106
+ font-stretch: 100%;
107
+ font-display: swap;
108
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');
109
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
110
+ }
111
+ /* cyrillic */
112
+ @font-face {
113
+ font-family: 'Open Sans';
114
+ font-style: normal;
115
+ font-weight: 300 800;
116
+ font-stretch: 100%;
117
+ font-display: swap;
118
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');
119
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
120
+ }
121
+ /* greek-ext */
122
+ @font-face {
123
+ font-family: 'Open Sans';
124
+ font-style: normal;
125
+ font-weight: 300 800;
126
+ font-stretch: 100%;
127
+ font-display: swap;
128
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');
129
+ unicode-range: U+1F00-1FFF;
130
+ }
131
+ /* greek */
132
+ @font-face {
133
+ font-family: 'Open Sans';
134
+ font-style: normal;
135
+ font-weight: 300 800;
136
+ font-stretch: 100%;
137
+ font-display: swap;
138
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');
139
+ unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
140
+ }
141
+ /* hebrew */
142
+ @font-face {
143
+ font-family: 'Open Sans';
144
+ font-style: normal;
145
+ font-weight: 300 800;
146
+ font-stretch: 100%;
147
+ font-display: swap;
148
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');
149
+ unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
150
+ }
151
+ /* math */
152
+ @font-face {
153
+ font-family: 'Open Sans';
154
+ font-style: normal;
155
+ font-weight: 300 800;
156
+ font-stretch: 100%;
157
+ font-display: swap;
158
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2');
159
+ unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0330, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2034-2037, U+2057, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2102, U+210A-210E, U+2110-2112, U+2115, U+2119-211D, U+2124, U+2128, U+212C-212D, U+212F-2131, U+2133-2138, U+213C-2140, U+2145-2149, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B6, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
160
+ }
161
+ /* symbols */
162
+ @font-face {
163
+ font-family: 'Open Sans';
164
+ font-style: normal;
165
+ font-weight: 300 800;
166
+ font-stretch: 100%;
167
+ font-display: swap;
168
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2');
169
+ unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8B1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA88, U+1FA90-1FABD, U+1FABF-1FAC5, U+1FACE-1FADB, U+1FAE0-1FAE8, U+1FAF0-1FAF8, U+1FB00-1FBFF;
170
+ }
171
+ /* vietnamese */
172
+ @font-face {
173
+ font-family: 'Open Sans';
174
+ font-style: normal;
175
+ font-weight: 300 800;
176
+ font-stretch: 100%;
177
+ font-display: swap;
178
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');
179
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
180
+ }
181
+ /* latin-ext */
182
+ @font-face {
183
+ font-family: 'Open Sans';
184
+ font-style: normal;
185
+ font-weight: 300 800;
186
+ font-stretch: 100%;
187
+ font-display: swap;
188
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');
189
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
190
+ }
191
+ /* latin */
192
+ @font-face {
193
+ font-family: 'Open Sans';
194
+ font-style: normal;
195
+ font-weight: 300 800;
196
+ font-stretch: 100%;
197
+ font-display: swap;
198
+ src: url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');
199
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
200
+ }
201
+
202
+ *{
203
+ border-style: solid;
204
+ border-width: 0;
205
+ border-color: var(--brdr);
206
+ column-rule-style:solid;
207
+ column-rule-color: var(--bg-panel);
208
+ }
209
+
210
+ .autoscale
211
+ {
212
+ width : var(--img20);
213
+ height: var(--img20);
214
+ }
215
+ .miniscale
216
+ {
217
+ width : var(--img15);
218
+ height: var(--img15);
219
+ }
220
+
221
+ .listitem {
222
+ border-bottom-width: 1px;
223
+ padding: 0.2em;
224
+ }
225
+
226
+ .gsicon {
227
+ filter: invert( var(--gs-invert) ) /*drop-shadow(0 var(--sh-dy) 0 var(--sh-clr))*/;
228
+ -webkit-user-drag: none;
229
+ user-drag: none;
230
+ -moz-user-drag: none;
231
+ }
232
+
233
+ .svggallery {
234
+ text-shadow:none;
235
+ line-height:0;
236
+ }
237
+
238
+ .colorpicker .form .flabel, .numlist .flabel {
239
+ display: inline-block;
240
+ min-width : 17px;
241
+ }
242
+
243
+ body {overscroll-behavior-x: contain; /* two-finger swipe left can navigate to a previous website */}
244
+
245
+ body, button{
246
+ margin:0;
247
+ padding: 0;
248
+ background-color: var(--base);
249
+
250
+ user-select: none;
251
+ -moz-user-select: none;
252
+ -webkit-user-select: none;
253
+
254
+ cursor: default;
255
+ overflow-x: hidden;
256
+ /*overflow: hidden;*/
257
+ }
258
+ /*
259
+ .app , button {
260
+ text-shadow: 0 var(--sh-dy) 0 var(--sh-clr);
261
+ }*/
262
+
263
+ .app {
264
+ background-color: var(--base);
265
+ color: var(--text-color);
266
+ position:relative;
267
+ }
268
+
269
+
270
+ .intro {
271
+ box-shadow: 0px 40px 70px rgba(0,0,0,0.35);
272
+ border-radius:20px;
273
+ color: #e6e6e6;
274
+ text-shadow: none;
275
+ line-height:1.7em;
276
+ }
277
+
278
+ .intro .labelitem {
279
+ padding: 0.15em 0.3em;
280
+ }
281
+
282
+ .intro button {
283
+ color: #e6e6e6;
284
+ font-size: 1em;
285
+ margin: 0 0em 0 0;
286
+ cursor: pointer;
287
+ text-shadow: none;
288
+ background-color:rgba(255,255,255,0);
289
+ padding: 0.15em 0.4em;
290
+ border-radius: 0.4em;
291
+ }
292
+ .intro button:hover {
293
+ background-color:rgba(0,0,0,0.35);
294
+ }
295
+
296
+
297
+
298
+ hr {
299
+ border: 0;
300
+ height: 1px;
301
+
302
+ background: var(--bg-panel);
303
+ }
304
+
305
+ .disabled
306
+ {
307
+ opacity:0.5;
308
+ pointer-events: none;
309
+ }
310
+
311
+ .bordered
312
+ {
313
+ border: 1px solid rgba(0,0,0,0.33);
314
+ }
315
+
316
+ .padded
317
+ {
318
+ padding:0.5em;
319
+ }
320
+
321
+ .marged
322
+ {
323
+ margin:0.5em;
324
+ }
325
+
326
+ .flexrow
327
+ {
328
+ display:flex;
329
+ flex-flow:row;
330
+ }
331
+
332
+ .cell
333
+ {
334
+ display:table-cell;
335
+ vertical-align:top;
336
+ }
337
+
338
+ .form
339
+ {
340
+ line-height:2.3em;
341
+ }
342
+ .form .fitem {
343
+ margin-right: 6px;
344
+ }
345
+
346
+ .vlist .fitem
347
+ {
348
+ display:block;
349
+ }
350
+
351
+ .sbar{
352
+ position:relative;
353
+ }
354
+
355
+ .sbar .top {
356
+ font-weight:bold;
357
+ background-color: var(--bg-panel); /*#413d39;*/
358
+ font-size:0.65em;
359
+ text-align: center;
360
+ padding: 0px 2px;
361
+ cursor:pointer;
362
+ height:11px;
363
+ }
364
+
365
+
366
+ .toolbar .tools {
367
+ padding:2px;
368
+ display: inline-flex;
369
+ flex-flow: column wrap;
370
+ }
371
+
372
+ .toolbar .tools .toolbtn {
373
+ border-radius:6px;
374
+ margin:2px 1px 1px 1px;
375
+ padding:4px 4px;
376
+ }
377
+ .toolbar .tools .toolbtn:hover, .toolbar .tools .active {
378
+ background-color: var(--bg-bbtn);
379
+ }
380
+ .toolbar .tools .active {
381
+ border-left-width:3px;
382
+ border-left-color: var(--accent);
383
+ margin-left:-2px;
384
+ border-top-left-radius:0;
385
+ border-bottom-left-radius:0;
386
+ }
387
+ .toolbar .tools button { position:relative; }
388
+
389
+ .toolbar .tools button img
390
+ {
391
+ width:var(--img20);
392
+ height:var(--img20);
393
+ /*width:20px;
394
+ height:20px;*/
395
+ vertical-align:middle;
396
+ }
397
+ .toolbar .scont {
398
+ margin: 3px 0 -6px 0;
399
+ }
400
+ .toolbar .switch
401
+ {
402
+ margin: 0 1px 0 1px;
403
+ width: 15px;
404
+ height: 16px;
405
+ display:inline-block;
406
+ padding: 0px;
407
+ text-align:center;
408
+ border-width: 1px;
409
+ border-radius: 4px;
410
+ font-size: 12px;
411
+ background-color:var(--base);
412
+ overflow:hidden;
413
+ }
414
+
415
+
416
+
417
+ .rightbar {
418
+ display:flex;
419
+ flex-flow: row;
420
+ }
421
+ .rightbar .block{
422
+ /*min-width: 18em;*/
423
+ }
424
+ .rightbar .collapsed{
425
+ width:3em;
426
+ }
427
+ .rightbar .collapsed button {
428
+ display: block;
429
+ margin:0.3em;
430
+ }
431
+
432
+ .rightbar .float
433
+ {
434
+ position:absolute;
435
+ right: 108%;
436
+ /*border-width: 1px;*/
437
+ box-shadow: 0px 8px 40px rgba(0,0,0,0.35);
438
+ background-color: var(--base);
439
+ }
440
+
441
+ .alertcont
442
+ {
443
+ position:absolute;
444
+ width:100%;
445
+ /*pointer-events:none; - search bar aslo has this class, we need to click the options */
446
+ z-index: 10;
447
+ margin-top:5.5em;
448
+ }
449
+
450
+ .alertpanel
451
+ {
452
+ font-size: 1.4em;
453
+ background-color:#ffffff;
454
+ color: #000000;
455
+ padding:0.4em;
456
+ border-radius:0.5em;
457
+ text-align:center;
458
+ text-shadow:none;
459
+ box-shadow: rgba(0,0,0,0.5) 0 0 1em;
460
+
461
+ width:50%; max-width:700px;
462
+ margin: 0px auto 1em auto;
463
+ }
464
+ .tpanel { /* temporary panel */
465
+ transition: all 0.2s cubic-bezier(0.240, 0.575, 0.665, 1.565);
466
+ transform: scale(0.6);
467
+ opacity:0;
468
+ }
469
+
470
+ .selected
471
+ {
472
+ background-color: rgba(0,0,0, var(--alphaDark) );
473
+ }
474
+
475
+ .vcolumn .cont {
476
+ overflow-y:scroll;
477
+ scrollbar-width:none;
478
+ }
479
+
480
+ .vcolumn .cont::-webkit-scrollbar {
481
+ width: 0;
482
+ }
483
+
484
+ .panelblock
485
+ {
486
+ /*border-top-width:1px;*/
487
+ }
488
+
489
+ .highlight
490
+ {
491
+ box-shadow: inset 0 0 10px #33aaff !important;
492
+ }
493
+
494
+
495
+ .panelblock {
496
+ border-bottom-width:4px;
497
+ }
498
+
499
+ .block .panelhead
500
+ {
501
+ /*padding:4px 0 0 0;*/
502
+ /*background: linear-gradient(to bottom, rgba(255,255,255,0.06) 0%, rgba(255,255,255,0.02) 50%, rgba(255,255,255,0) 100%);*/
503
+ background-color: var(--bg-panel);
504
+ /*box-shadow: inset 0px -10px 16px rgba(0,0,0,0.08);*/
505
+ /*padding-top: 3px; */
506
+ /*border-bottom-width: 1px;*/
507
+ /*height:1.6em;*/
508
+ }
509
+ .block .panelhead .label {
510
+ pointer-events: none;
511
+ margin: 4px 7px 0 7px;
512
+ line-height:1.9em;
513
+ }
514
+
515
+ .mainblock .panelhead, .float .panelhead {
516
+ padding: 4px 4px 0 4px;
517
+ }
518
+ .mainblock .panelhead div {
519
+ border-radius: 4px;
520
+ }
521
+ .mainblock .panelhead {
522
+ padding-bottom:4px;
523
+ }
524
+
525
+
526
+ .block .panelhead div
527
+ {
528
+ height:26.1px;
529
+ /*padding:0.2em 0.5em 0.25em 0.5em;*/
530
+ display:inline-block;
531
+ border-top-left-radius:4px;
532
+ border-top-right-radius:4px;
533
+
534
+ opacity: 0.7;
535
+
536
+ margin-right:4px;
537
+
538
+ transition: background 0.25s ease-in-out;
539
+ /*
540
+ border-right-width: 1px;
541
+ border-right-color: var(--brdrDrk);
542
+
543
+ border-top-width: 1px;
544
+ border-top-color: var(--brdrLgt);*/
545
+ }
546
+ .block .panelhead div:hover {
547
+ transition: background 0.25s ease-in-out; background-color: var(--base);
548
+ }
549
+
550
+
551
+ .block .panelhead .active
552
+ {
553
+ background-color: var(--base);
554
+ opacity:1;
555
+ }
556
+ .block .panelhead .active div
557
+ {
558
+
559
+ }
560
+
561
+ .block .panelhead div .cross
562
+ {
563
+ cursor: pointer;
564
+ display:inline-block;
565
+ background-image: var(--icon_cross);
566
+ background-size: 10px 10px;
567
+ background-repeat: no-repeat;
568
+ background-position: center;
569
+ width: 26px;
570
+ height: 26px;
571
+ vertical-align:top;
572
+ }
573
+
574
+
575
+ .block .pbody .fitem
576
+ {
577
+ margin-right: 6px;
578
+ }
579
+
580
+ .mainblock .panelhead {
581
+ border-top-left-radius: 7px;
582
+ }
583
+
584
+ .mainblock .body {
585
+ background-color: var(--bg-canvas);
586
+ }
587
+ .mainblock
588
+ {
589
+ border-bottom-width:0 !important;
590
+ }
591
+
592
+
593
+
594
+ .scrollable
595
+ {
596
+ overflow-x: hidden;
597
+ overflow-y: scroll;
598
+ /* for Firefox: */
599
+ scrollbar-color: var(--brdrDrk) rgba(0,0,0, var(--alphaDark) );
600
+ scrollbar-width: thin;
601
+ }
602
+
603
+
604
+ .scrollable::-webkit-scrollbar {
605
+ width: 10px;
606
+
607
+ }
608
+ .scrollable::-webkit-scrollbar-thumb {
609
+ border-radius:3px;
610
+ background: var(--brdrDrk);
611
+ margin:2px;
612
+ }
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+
622
+
623
+
624
+ .lpbody {
625
+ /*width: 21em;*/
626
+ }
627
+
628
+ .lphead, .lpfoot
629
+ {
630
+ padding:2px;
631
+ }
632
+ .lpineck {
633
+ /*font-size: 12px;*/
634
+ }
635
+
636
+ .lphead {
637
+ border-bottom-width: 1px;
638
+ }
639
+ .block .pbody .lphead .fitem button {
640
+ margin-right:0;
641
+ }
642
+
643
+ .lpfoot
644
+ {
645
+ text-align:right;
646
+ border-top-width: 1px;
647
+ }
648
+ .lpfoot button { padding-bottom:0; }
649
+
650
+ .head
651
+ {
652
+ margin-top: -1px;
653
+ border-top-width: 1px;
654
+ cursor: pointer;
655
+ }
656
+
657
+
658
+ .styleitem .head
659
+ {
660
+ border: none;
661
+ height:22px;
662
+ }
663
+
664
+
665
+ .lpbody .artb
666
+ {
667
+ background-color:rgba(0,0,0,var(--alphaDark));
668
+ /*border-right-width: 3px;*/
669
+ /*border-bottom-width: 2px;
670
+ border-top-width: 2px;*/
671
+ /*box-shadow: inset 0 0 4px var(--bg-panel);*/
672
+ /*background-color: var(--bg-panel);*/
673
+ }
674
+
675
+ .lpbody .selected {
676
+ background-color:var(--bg-bbtn);
677
+ }
678
+
679
+
680
+
681
+ .head .headL div, .head .headR div, .styleitem .head div
682
+ {
683
+ display:inline-block;
684
+ height:100%;
685
+ background-repeat: no-repeat;
686
+ background-position: center;
687
+ }
688
+
689
+ .head div, .styleitem .head
690
+ {
691
+ overflow:hidden;
692
+ white-space: nowrap;
693
+ }
694
+
695
+ .head .headL
696
+ {
697
+ height:100%;
698
+ width:100%;
699
+ display:inline-block;
700
+ }
701
+
702
+ .head { position:relative; }
703
+ .head .headR
704
+ {
705
+ position:absolute;
706
+ right:0;
707
+ display:inline-block;
708
+ height:100%;
709
+ }
710
+
711
+ .head div {
712
+ vertical-align:top; /* a bug in Safari */
713
+ }
714
+
715
+ .head .label
716
+ {
717
+ padding: 0 7px;
718
+ /*max-width: 140px;*/
719
+ }
720
+
721
+ .head .eye
722
+ {
723
+ width: 28px;
724
+ background-image: var(--icon_eye);
725
+ filter: invert( var(--icon_eye_invrt) );
726
+ background-size: var(--img15);
727
+ }
728
+ .head .sqr
729
+ {
730
+ width: 28px;
731
+ background-image: var(--icon_square);
732
+ filter: invert( var(--icon_square_invrt) );
733
+ background-size: var(--img15);
734
+ }
735
+
736
+ .head .cmark
737
+ {
738
+ width: 22px;
739
+ background-image: var(--icon_checkmark);
740
+ filter: invert( var(--icon_checkmark_invrt) );
741
+ }
742
+
743
+
744
+ .head .open
745
+ {
746
+ background-image: var(--icon_arrow_down);
747
+ filter: invert( var(--icon_arrow_down_invrt) );
748
+ background-size: var(--img15);
749
+ width:15px;
750
+ }
751
+
752
+ .head .closed
753
+ {
754
+ background-image: var(--icon_arrow_right);
755
+ filter: invert( var(--icon_arrow_right_invrt) );
756
+ background-size: var(--img15);
757
+ width:15px;
758
+ }
759
+
760
+ .head .chain
761
+ {
762
+ width:8px;
763
+ background-image: var(--icon_chain);
764
+ filter: invert( var(--icon_chain_invrt) );
765
+ background-size: var(--img18);
766
+ }
767
+
768
+ .head .clipp
769
+ {
770
+ width:1em;
771
+ background-image: var(--icon_clipping);
772
+ filter: invert( var(--icon_clipping_invrt) );
773
+ background-size: var(--img15);
774
+ }
775
+
776
+ .head .link
777
+ {
778
+ width:var(--img20);
779
+ background-image: var(--icon_link);
780
+ filter: invert( var(--icon_link_invrt) );
781
+ background-size: var(--img18);
782
+ }
783
+ .head .linkX
784
+ {
785
+ width:var(--img20);
786
+ background-image: var(--icon_linkX);
787
+ filter: invert( var(--icon_linkX_invrt) );
788
+ background-size: var(--img18);
789
+ }
790
+
791
+ .head .lock
792
+ {
793
+ width:1.5em;
794
+ background-image: var(--icon_lock);
795
+ filter: invert( var(--icon_lock_invrt) );
796
+ background-size: var(--img15);
797
+ }
798
+
799
+ .head .lrfx
800
+ {
801
+ width:1.5em;
802
+ background-image: var(--icon_fx);
803
+ filter: invert( var(--icon_fx_invrt) );
804
+ background-size: var(--img15);
805
+ }
806
+
807
+ .head .arfx
808
+ {
809
+ width:1.6em;
810
+ border-left-width:1px;
811
+ }
812
+
813
+ .head .folder
814
+ {
815
+ width:1.7em;
816
+ background-image: var(--icon_folder);
817
+ filter: invert( var(--icon_folder_invrt) );
818
+ background-size: var(--img15);
819
+ }
820
+ .head canvas
821
+ {
822
+ border:1px solid black;
823
+ margin:3px;
824
+ }
825
+
826
+ .head .active canvas
827
+ {
828
+ outline: 2px dashed var(--text-color);
829
+ outline-offset:0px;
830
+ /*border: 1px dashed var(--text-color);
831
+ margin: 3px;*/
832
+ }
833
+
834
+
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+ .hpbody .listitem { cursor: pointer; padding:0.3em; }
850
+
851
+ .topbar{
852
+ /*
853
+ border-bottom-width: 1px;
854
+ border-bottom-color: var(--brdrDrk);
855
+ */
856
+ /*height:32px;*/
857
+ }
858
+
859
+ .topbar button {
860
+ padding-left:5px;
861
+ padding-right:5px;
862
+ margin:4px;
863
+ }
864
+
865
+ .topbar .bbtn {
866
+ margin: 3px 4px 2px 4px;
867
+ }
868
+
869
+
870
+ .contextpanel{
871
+ min-width : 10em;
872
+ box-shadow: 0px 0px 20px rgba(0,0,0,0.2);
873
+ text-shadow: none;
874
+ }
875
+ .cp_dark {
876
+ background-color: var(--base);
877
+ color: var(--text-color);
878
+ }
879
+ .cp_light {
880
+ background-color: #fff;
881
+ color: #000000;
882
+ }
883
+ .cp_trsp {
884
+ background-color: rgba(var(--abs255),var(--abs255),var(--abs255),0.4);
885
+
886
+ color: rgb(calc(255 - var(--abs255)),calc(255 - var(--abs255)),calc(255 - var(--abs255)));
887
+ backdrop-filter: blur(24px);
888
+ -webkit-backdrop-filter: blur(24px);
889
+ border-radius:6px;
890
+
891
+ outline: 1px solid rgba(255,255,255,0.12);
892
+ outline-offset: -2px;
893
+ padding:6px;
894
+ /*border: 1px solid rgba(255,255,255,0.15);*/
895
+ }
896
+
897
+ .contextpanel .check {
898
+ display: inline-block;
899
+ width:15px;
900
+ }
901
+
902
+ .contextpanel .thumb
903
+ {
904
+ width : var(--img20);
905
+ height: var(--img20);
906
+ vertical-align: middle;
907
+ margin: -0.6em 0.8em -0.5em -0.5em;
908
+ }
909
+ .cp_light .thumb {
910
+ filter: invert( 0.2 );
911
+ }
912
+
913
+ .contextpanel hr{
914
+ margin:0.25em 0;
915
+ background: #bebebe;
916
+ }
917
+ .cp_trsp hr { background:rgba(255,255,255,0.15); margin:0.25em 0.65em; }
918
+
919
+ .contextpanel div {
920
+ padding: 0.5em 1em 0.5em 0.7em;
921
+ }
922
+ .cp_trsp div {
923
+ padding: 0.35em 1em 0.35em 0.7em;
924
+ }
925
+
926
+ .cp_light .enab:hover, .cp_light .active {
927
+ /*color:#fff;*/
928
+ background-color: rgba(190,230,255,1);
929
+ }
930
+ .cp_dark .enab:hover, .cp_dark .active {
931
+ /*color:#fff;*/
932
+ background-color: rgba(0,0,0, var(--alphaDark) );
933
+ }
934
+ .cp_trsp .enab:hover, .cp_trsp .active {
935
+ /*color:#fff;*/
936
+ background-color: #206bcd;
937
+ border-radius:6px;
938
+ }
939
+
940
+ .contextpanel .disab {
941
+ opacity:0.4;
942
+ pointer-events: none;
943
+ }
944
+
945
+ .contextpanel .right
946
+ {
947
+ float:right;
948
+ margin-left:2em;
949
+ opacity:0.7;
950
+ }
951
+
952
+ .fitem {
953
+ display:inline-block;
954
+ }
955
+
956
+ label { margin-right:2px; }
957
+
958
+ input, textarea, .labelitem {
959
+ margin: 2px 0;
960
+ padding: 3px;
961
+ box-sizing: border-box;
962
+ }
963
+ /*
964
+ input, textarea, select {
965
+ background-color: var(--bg-input);
966
+ color: var(--text-color);
967
+ border-radius: 3px;
968
+ }*/
969
+ input, textarea, select {
970
+ background-color: var(--bg-input);
971
+ color: var(--text-color);
972
+ border-radius: 3px;
973
+ border: 1px solid var(--bg-input);
974
+ transition: border 0.5s;
975
+ }
976
+
977
+ input:hover, textarea:hover, select:hover, input:focus, textarea:focus, select:focus {
978
+ border: 1px solid var(--accent); /* perhaps replace with var(--accent-color) */
979
+ outline: none!important;
980
+ }
981
+
982
+ textarea { vertical-align:top; }
983
+
984
+
985
+ input[type='range']
986
+ {
987
+ vertical-align:middle;
988
+ padding: 0;
989
+ border: none;
990
+ /*background-color: #000000;*/
991
+ /*box-shadow: inset 0 0 60px rgba(0,0,0,0.5)*/
992
+ }
993
+
994
+ .slider {
995
+ -webkit-appearance: none;
996
+ height: 3px;
997
+ background-color: var(--text-color);
998
+ outline: none;
999
+ opacity: 0.4;
1000
+ transition: opacity .2s;
1001
+ }
1002
+
1003
+ .slider:hover {
1004
+ opacity: 1;
1005
+ }
1006
+
1007
+ .slider::-webkit-slider-thumb {
1008
+ -webkit-appearance: none;
1009
+ appearance: none;
1010
+ width: 11px;
1011
+ height: 11px;
1012
+ border-radius: 50%;
1013
+ background: var(--text-color);
1014
+ cursor: pointer;
1015
+ }
1016
+
1017
+ .slider::-moz-range-thumb {
1018
+ width: 11px;
1019
+ height: 11px;
1020
+ border-radius: 50%;
1021
+ background: var(--text-color);
1022
+ cursor: pointer;
1023
+ }
1024
+
1025
+ .rangecontFloat, .floatcont {
1026
+ background-color: var(--base);
1027
+ border-radius:6px;
1028
+ box-shadow: 0px 0px 20px rgba(0,0,0,0.25);
1029
+ opacity:0; transform: scale(0.95);
1030
+ }
1031
+ .rangecontFloat {
1032
+ padding: 3px 8px 4px 8px;
1033
+ }
1034
+ .floatcont {
1035
+ padding:7px;
1036
+ /*box-shadow: 0px 8px 40px rgba(0,0,0,0.35);*/
1037
+ }
1038
+
1039
+ .mbox input {
1040
+ margin-left: 0.7em;
1041
+ }
1042
+
1043
+
1044
+ .tinput input
1045
+ {
1046
+ width:8em;
1047
+ }
1048
+
1049
+ .brushbutton img, .gradientbutton img .contourbutton img{
1050
+ display: inline-block;
1051
+ }
1052
+
1053
+ .brushbutton {
1054
+
1055
+ }
1056
+
1057
+ .contourbutton {
1058
+ line-height:2.1em;
1059
+
1060
+ }
1061
+
1062
+
1063
+ .ddmenu {
1064
+ display:inline-block;
1065
+ }
1066
+
1067
+ .multicheck .slabel {
1068
+ margin-right: 1em;
1069
+ }
1070
+
1071
+ .colorsample {
1072
+ cursor:pointer;
1073
+ width:2.2em;
1074
+ height: 1.57em;
1075
+ display:inline-block;
1076
+ margin-bottom:-0.55em;
1077
+ border-radius: 3px;
1078
+ }
1079
+
1080
+ .cswatch .colorsample {
1081
+ width:1.3em; height:1.3em;
1082
+ margin-right: 0.1em;
1083
+ border-width: 1px;
1084
+ margin-bottom:-0.3em;
1085
+ }
1086
+
1087
+
1088
+
1089
+ .angleinput input { width:3em; }
1090
+
1091
+
1092
+ /*button img, button canvas, button svg, .mbox img*/
1093
+ .fitem img, .fitem canvas, .fitem svg {
1094
+ vertical-align: middle;
1095
+ }
1096
+
1097
+ .fillbutton canvas {
1098
+ vertical-align:middle;
1099
+ border-radius: 3px;
1100
+ cursor:pointer;
1101
+ }
1102
+
1103
+ button {
1104
+ padding: 2px 5px 3px 5px;
1105
+ border-radius:3px;
1106
+ color: var(--text-color);
1107
+ text-align:center;
1108
+ white-space: nowrap;
1109
+ }
1110
+
1111
+ select {
1112
+ padding: 2px;
1113
+ }
1114
+
1115
+
1116
+ .active {
1117
+ background-color: rgba(0,0,0, var(--alphaDark) );
1118
+ }
1119
+ .bactive {
1120
+ background-color: var(--bg-input);
1121
+ }
1122
+
1123
+ @media (hover: hover) and (pointer: fine) {
1124
+ button:hover {
1125
+ background-color: rgba(0,0,0, var(--alphaDark) );
1126
+ }
1127
+ .bactive:hover {
1128
+ background-color: var(--bg-input);
1129
+ }
1130
+ }
1131
+
1132
+ .bbtn {
1133
+ /*padding-left:5px;
1134
+ padding-right:5px;*/
1135
+ background-color: var(--bg-bbtn);
1136
+
1137
+ border-top-width: 1px;
1138
+ border-top-color: var(--brdrLgt);
1139
+ border-bottom-width: 1px;
1140
+ border-bottom-color: var(--brdrDrk);
1141
+ overflow:hidden;
1142
+ }
1143
+ .bbtn:hover {
1144
+ background-color: var(--bg-bbtnOver);
1145
+ }
1146
+
1147
+ .spread {
1148
+ width: 100%;
1149
+ }
1150
+
1151
+ .nopadding {
1152
+ margin: 0;
1153
+ padding: 0;
1154
+ }
1155
+
1156
+
1157
+
1158
+ .imageset
1159
+ {
1160
+ /*overflow-y: scroll;*/
1161
+ background-color: rgba(0,0,0, var(--alphaDark) );
1162
+ }
1163
+
1164
+ .imageset .image, .imageset canvas
1165
+ {
1166
+ /*border-right: 1px solid rgba(0,0,0,0.2);
1167
+ border-bottom: 1px solid rgba(0,0,0,0.2);*/
1168
+ margin: 0 1px 1px 0;
1169
+ cursor: pointer;
1170
+ vertical-align:middle;
1171
+ }
1172
+ .imageset .selected {
1173
+ outline: 1.5px solid #00aaff;
1174
+ }
1175
+
1176
+ input[type='checkbox']
1177
+ {
1178
+ margin-right: 0.3em;
1179
+ vertical-align:middle;
1180
+ }
1181
+ /*
1182
+ input[type="checkbox"] + label:before {
1183
+ border: 1px solid #333;
1184
+ content: "";
1185
+ display: inline-block;
1186
+ font: 12px sans-serif;
1187
+ font-weight:bold;
1188
+ height: 12px;
1189
+ margin-right:4px;
1190
+ padding: 0;
1191
+ vertical-align: middle;
1192
+ width: 12px;
1193
+ background: #fff;
1194
+ color: #333;
1195
+ }
1196
+ input[type="checkbox"]:checked + label:before { content: "\2713"; }
1197
+ */
1198
+
1199
+
1200
+ .rangedropinput button
1201
+ {
1202
+ margin:0;
1203
+ padding:0.3em 0.1em;
1204
+ }
1205
+
1206
+ .rangedropinput input
1207
+ {
1208
+ margin-right:0;
1209
+ }
1210
+
1211
+ .trangeinput { width:100%; }
1212
+ .trangeinput input[type='text']
1213
+ {
1214
+ margin-left:0;
1215
+ margin-right:0;
1216
+ width:33%;
1217
+ text-align:right;
1218
+ }
1219
+ .trangeinput label
1220
+ {
1221
+ display:inline-block;
1222
+ width:67%;
1223
+ margin:0px;
1224
+ }
1225
+ .trangeinput input[type='range']
1226
+ {
1227
+ margin: -10px 0 0 0;
1228
+ width:100%;
1229
+ }
1230
+
1231
+
1232
+
1233
+ .cbox
1234
+ {
1235
+ padding:0em 0;
1236
+ }
1237
+
1238
+
1239
+ .fontitem
1240
+ {
1241
+ padding:3px 6px;
1242
+ border-radius:0.3em;
1243
+ height:21px;
1244
+ white-space: nowrap;
1245
+ }
1246
+ .fontitem:hover {
1247
+ /*background-color: rgba(255,255,255, 0.6);*/
1248
+ box-shadow: inset 0 0 0.2em rgba(0,0,0,1); /*bottom internal shadow*/
1249
+ }
1250
+ .fontitem .label
1251
+ {
1252
+ display:inline-block; width:9em; overflow:hidden; white-space: nowrap;
1253
+ }
1254
+ .fontitem .thumb
1255
+ {
1256
+ display:inline-block; width:120px; height:20px; margin-left:0.5em;
1257
+ background: url(../rsrc/fonts/fonts.png);
1258
+ }
1259
+
1260
+ .fontitem .star {
1261
+ display: inline-block;
1262
+ background-position: center;
1263
+ background-repeat: no-repeat;
1264
+ background-image: var(--icon_cshape);
1265
+ filter: invert( var(--icon_cshape_invrt) );
1266
+ background-size: var(--img20) var(--img20);
1267
+ width: 20px; height: 20px;
1268
+ vertical-align: top;
1269
+ margin-right:4px;
1270
+ opacity:0.1;
1271
+ }
1272
+
1273
+
1274
+
1275
+
1276
+ .window
1277
+ {
1278
+ position:absolute;
1279
+ z-index: 10;
1280
+ background-color: var(--base);
1281
+ /*border: 1px solid;*/
1282
+ border-radius:6px;
1283
+ min-width : 3em;
1284
+ min-height: 2em;
1285
+ top: 150px;
1286
+ left: 150px;
1287
+ box-shadow: 0px 4px 30px rgba(0,0,0,0.25);
1288
+ }
1289
+
1290
+ .wdisabled {
1291
+ pointer-events: none;
1292
+ }
1293
+
1294
+ .window .vmargin
1295
+ {
1296
+ margin:0.5em 0;
1297
+ }
1298
+
1299
+ .window .whead
1300
+ {
1301
+ /*
1302
+ border-top-width: 1px;
1303
+ border-top-color: var(--brdrLgt);
1304
+ border-bottom-width: 1px;
1305
+ border-bottom-color:var(--brdrDrk);
1306
+ */
1307
+ height:30px;
1308
+
1309
+ font-size: 1.15em;
1310
+ background: linear-gradient(to bottom, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.25) 100%);
1311
+ /*background: linear-gradient(to bottom, #2b2b2b 0%, #282828 50%, #262626 100%);*/
1312
+ /*background: linear-gradient(to bottom, #595959 0%,#626262 3%,#575757 7%,#3c3c3c 90%,#3a3a3a 97%,#2e2e2e 100%);*/
1313
+ /*background: linear-gradient(to bottom, #59574e 0%,#626055 3%,#59574f 7%,#403f3a 90%,#41403b 97%,#383734 100%);*/
1314
+ border-top-left-radius:6px;
1315
+ border-top-right-radius:6px;
1316
+ }
1317
+
1318
+ .window .whead .wname
1319
+ {
1320
+ display: inline-block;
1321
+ padding: 0.3em 0.5em;
1322
+ font-weight: bold;
1323
+ }
1324
+
1325
+ .window .whead .cross
1326
+ {
1327
+ cursor: pointer;
1328
+ display:inline-block;
1329
+ background-image: var(--icon_cross);
1330
+ background-size: 10px 10px;
1331
+ background-repeat: no-repeat;
1332
+ background-position: center;
1333
+ width:30px;
1334
+ height:30px;
1335
+ font-size: 1.3em;
1336
+ position:absolute; right:0;
1337
+
1338
+ }
1339
+
1340
+
1341
+ .window .wide
1342
+ {
1343
+ font-size: 1.2em;
1344
+ display: block;
1345
+ }
1346
+
1347
+ .window .cbox{
1348
+ margin-left:0.4em;
1349
+ }
1350
+
1351
+ .window .cbox, .window .angleinput {
1352
+ display:inline-block;
1353
+ }
1354
+
1355
+ .window .body
1356
+ {
1357
+ padding: 1em;
1358
+ /*line-height:1.6em;*/
1359
+ }
1360
+
1361
+ .window .body .form .block
1362
+ {
1363
+ padding:1em;
1364
+ border: 0.1em solid rgba(0,0,0,0.33);
1365
+ }
1366
+
1367
+
1368
+ .window .hbar > .fitem
1369
+ {
1370
+ margin-right: 1em;
1371
+ }
1372
+
1373
+
1374
+
1375
+
1376
+ .window .imgcont
1377
+ {
1378
+ /*width:512px;
1379
+ height:512px;*/
1380
+ /*background-color: rgba(0,0,0,0.1);*/
1381
+ text-shadow:none;
1382
+ /* keep it because of SVG */
1383
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAAXNSR0IB2cksfwAAAAZQTFRF////yMjIXOIDQgAAABJJREFUeJxjYPjPgBXhEB7uAABycQ/xMT/uAgAAAABJRU5ErkJggg==);
1384
+ }
1385
+
1386
+ /*
1387
+ .window .body .form .tinput .label, .window .body .form .ddmenu .label
1388
+ {
1389
+ display:inline-block;
1390
+ min-width:4em;
1391
+ }
1392
+ */
1393
+
1394
+ .window .flabel, .labfxd .flabel
1395
+ {
1396
+ display:inline-block;
1397
+ min-width:4em;
1398
+ }
1399
+ .label6 .flabel
1400
+ {
1401
+ display:inline-block;
1402
+ min-width:6em;
1403
+ }
1404
+ .label8 .flabel
1405
+ {
1406
+ display:inline-block;
1407
+ min-width:8em;
1408
+ }
1409
+ .label12 .flabel
1410
+ {
1411
+ display:inline-block;
1412
+ min-width:12em;
1413
+ }
1414
+
1415
+ .window .noalign .flabel
1416
+ {
1417
+ min-width:0;
1418
+ }
1419
+ .window .noalign .fitem
1420
+ {
1421
+ margin-right:1em;
1422
+ }
1423
+
1424
+ .window h2 {
1425
+ margin-bottom: 0.2em;
1426
+ }
1427
+
1428
+ .account table {
1429
+ border-width:0px;
1430
+ border-spacing: 20px 0px;
1431
+ width: calc(100% + 40px);
1432
+ margin-left: -20px;
1433
+ font-size:1.2em;
1434
+ text-shadow:none;
1435
+ padding-bottom:1em;
1436
+ }
1437
+
1438
+ .accounttable th, .account table td { box-shadow: 0px 6px 12px rgba(0,0,0,0.25); }
1439
+ .account table th {
1440
+ padding:10px 20px;
1441
+ font-weight:normal;
1442
+ font-size:1.25em;
1443
+ color:white;
1444
+ background-color: #2f6f9f;
1445
+ }
1446
+ .account table td {
1447
+ color:#000;
1448
+ background-color:white;
1449
+ padding: 4px 11px;
1450
+ }
1451
+ .account table td ul {
1452
+ list-style-type: none; padding:0; margin:0;
1453
+ }
1454
+
1455
+ /*
1456
+ table {
1457
+ border-width:2px;
1458
+ font-size: 1.2em;
1459
+ text-align: center;
1460
+ border-collapse: collapse;
1461
+ margin: 6px 0 6px 0;
1462
+ }
1463
+
1464
+ table .left {
1465
+ text-align:left;
1466
+ width: 240px;
1467
+ }
1468
+
1469
+ table td, table th {
1470
+ width:140px;
1471
+ margin:0;
1472
+ padding: 3px 8px;
1473
+ border-width:1px 2px;
1474
+ }
1475
+
1476
+ table th { font-size: 1.2em; border-bottom-width: 2px; background-color:rgba(0,0,0, var(--alphaDark) ); }
1477
+ table .lastrow { font-weight:bold; }
1478
+
1479
+
1480
+ table .yes, table .no { font-weight: bold; font-size:1.6em; }
1481
+
1482
+ table .yes { background-color: rgba(0,255,0,0.2); }
1483
+
1484
+ */
1485
+
1486
+
1487
+
1488
+
1489
+
1490
+
1491
+
1492
+
1493
+ .confbar
1494
+ {
1495
+ line-height:2.3em;
1496
+ }
1497
+
1498
+ .toolconf
1499
+ {
1500
+ display:flex;
1501
+ flex-flow: row;
1502
+ }
1503
+
1504
+ .confbar .toolicon
1505
+ {
1506
+ width : var(--img20);
1507
+ height: var(--img20);
1508
+ margin: 5px 12px -4px 12px;
1509
+ display: absolute;
1510
+ }
1511
+
1512
+ .confbar .body
1513
+ {
1514
+
1515
+ }
1516
+
1517
+ .confbar .fitem {
1518
+ margin-right: 0.35em;
1519
+ }
1520
+
1521
+ .confbar .body > .fitem
1522
+ {
1523
+ margin-right: 1.2em;
1524
+ }
1525
+
1526
+
1527
+ .confbar .body .yesno {
1528
+ padding: 0 3px 0 6px;
1529
+ position: sticky;
1530
+ right: 0;
1531
+ background-color: var(--base);
1532
+ /*box-shadow: 0px 0px 3px rgba(0,0,0,0.25);*/
1533
+ border-left:2px solid rgba(0,0,0,0.15);
1534
+ z-index:5000;
1535
+ }
1536
+
1537
+
1538
+
1539
+ .storageset * { text-shadow:none; }
1540
+ .storage * {position:relative; }
1541
+
1542
+ .storage { background-color:white; color:#222222; }
1543
+
1544
+ .storwindow input { background-color:white; color:#333333; }
1545
+
1546
+ .storage .cont { padding:4px; }
1547
+ .storage img { object-fit: contain; }
1548
+ .storage .name { word-break:break-all; line-height:1.35em; overflow:hidden; display:inline-block; vertical-align:middle; }
1549
+
1550
+ .storage .ext {
1551
+ position:absolute; top:2px; left:2px;
1552
+ color:white; padding:2px 3px 2px 3px; line-height:1em; font-weight:bold; border-radius:2px;
1553
+ }
1554
+
1555
+ .storage .tile {
1556
+ display:inline-block;
1557
+ margin: 0 10px 10px 0;
1558
+ }
1559
+ .storage .tile img {
1560
+ vertical-align:middle;
1561
+ width:44px;
1562
+ height:44px;
1563
+ margin-right:8px;
1564
+ }
1565
+ .storage .tile .name {
1566
+ height:36px;
1567
+ }
1568
+
1569
+
1570
+ .storage .icon {
1571
+ display:inline-block;
1572
+ height:136px;
1573
+ text-align:center;
1574
+ margin: 0 10px 10px 0;
1575
+ }
1576
+ .storage .icon img {
1577
+ width:100px;
1578
+ height:100px;
1579
+ display:block;
1580
+ }
1581
+ .storage .icon .name {
1582
+ width:100px; height:36px;
1583
+ }
1584
+
1585
+
1586
+ .storage .litm {
1587
+ width:100%;
1588
+ }
1589
+ .storage .litm img {
1590
+ width:24px; height:24px;
1591
+ vertical-align:middle; margin-right:16px;
1592
+ }
1593
+ .storage .litm .name {
1594
+ width:300px;
1595
+ }
1596
+
1597
+ .storage .active {
1598
+ background-color: #ddf0ff;
1599
+ }
1600
+
1601
+
1602
+ .storage .bar, .storage .fls { padding:10px; }
1603
+
1604
+ .storage .bar {
1605
+ background-color: rgba(0,0,0,0.05);
1606
+ }
1607
+
1608
+ .storage .bar span {
1609
+ padding: 4px 4px;
1610
+ }
1611
+
1612
+ .storage .btn {
1613
+ cursor:pointer; display:inline-block;
1614
+ background-color: #aaccff; padding: 0.3em 0.6em; border-radius: 0.2em; margin:0px 3px;
1615
+ }
1616
+
templates/index.html ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 
2
+ <!DOCTYPE html>
3
+
4
+ <html>
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" />
8
+
9
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,400i,700,700i" />
10
+ <link rel="stylesheet" href="templates.css" />
11
+
12
+ <title>PSD Templates</title>
13
+ <meta name="description" content="Free PSD Templates">
14
+ <script>fetch("//www.photopea.com/papi/event.php?id=web_Templates");</script>
15
+
16
+ <script src="templates.js"></script>
17
+ <script>
18
+
19
+ var tpls, IFR=false, TYPE=0, RSRC=[], OTPLS;
20
+ var ccat = -1, caut = -1, citm = -1, ordr = 0, cscr = 0; // current scroll
21
+ var lo=localStorage.getItem("ordr"); if(lo) lo=JSON.parse(lo); if(lo && lo[1]>Date.now()-30000) ordr=lo[0];
22
+ var cont, cats, search, back, itms, kwds, add_link;
23
+ function clearNode(node) { while(node.firstChild) node.removeChild(node.firstChild); }
24
+ function isDisplayed(nd) { while(true) { if(nd==document) return true; if(nd==null) return false; nd=nd.parentNode; } }
25
+
26
+ function go() {
27
+ cont = document.getElementById("cont");
28
+ cats = document.getElementById("cats");
29
+ kwds = document.getElementById("kwds");
30
+ search = document.getElementById("search");
31
+ back = document.getElementById("back"); cont.removeChild(back);
32
+ itms = document.getElementById("itms");
33
+ add_link = document.getElementById("add_link");
34
+ window.addEventListener("resize",onResize,false); onResize();
35
+
36
+ var request = new XMLHttpRequest();
37
+ request.open("GET", "../papi/tpls.json", true);
38
+ request.onload = imgsLoaded;
39
+ request.onerror = function(e) { console.log(e.target.response); }
40
+ request.send();
41
+
42
+ if(Math.random()<0.01) {
43
+ var request = new XMLHttpRequest();
44
+ request.open("GET", "../papi/img/reduce.php", true);
45
+ request.send();
46
+ }
47
+
48
+ if(Math.random()<0.01) {
49
+ var request = new XMLHttpRequest();
50
+ request.open("GET", "https://www.photopea.com/papi/updateTemplates.php", true);
51
+ request.send();
52
+ }
53
+
54
+ window.onbeforeunload = trackScroll;
55
+ }
56
+ function trackScroll() { var scrl=[Date.now(),ccat,caut,itms.scrollTop]; if(citm==-1) localStorage.setItem("scrl",JSON.stringify(scrl)); }
57
+ function onResize() {
58
+ if(tpls) updateView();
59
+ }
60
+
61
+ function imgsLoaded(e) {
62
+ var hr=window.location.href, sch = hr.slice(hr.indexOf("/templates")+11);
63
+ var uprt = sch.split("?");
64
+ if(uprt[1]) {
65
+ var prts=uprt[1].split("&");
66
+ for(var i=0; i<prts.length; i++) {
67
+ var kv=prts[i].split("=");
68
+ if(kv[0]=="type") TYPE=parseInt(kv[1]);
69
+ else if(kv[0]=="rsrc") RSRC=kv[1].length==0 ? [] : kv[1].split(",");
70
+ //else console.log(kv);
71
+ }
72
+ }
73
+
74
+ IFR = window.top!=window.self;
75
+ OTPLS = JSON.parse(e.target.response);
76
+ tpls = JSON.parse(e.target.response);
77
+ tpls.categories = tpls.categories[TYPE];
78
+ for(var i=0; i<tpls.list.length; i++) if(tpls.list[i][0]!=TYPE) { tpls.list.splice(i,1); i--; }
79
+
80
+ rebuild(sch, true);
81
+ }
82
+
83
+ function rebuild(sch, firstTime) {
84
+ console.log(sch);
85
+ if(!firstTime) trackScroll();
86
+ citm=-1;
87
+ if(caut<-1) caut=-1;
88
+ if(sch[0]=="-") {
89
+ if(sch[1]=="a") caut=-1;
90
+ if(sch[1]=="c") ccat=-1;
91
+ }
92
+ else if(sch!="") {
93
+ var ci = sch.slice(2).split("?")[0].split("&")[0]; // Facebook might add "?" parameters
94
+ if(sch[0]=="c") {
95
+ var cts=tpls["categories"];
96
+ for(var c in cts) if(toCat(cts[c])==ci) ccat=parseInt(c.slice(1));
97
+ }
98
+ if(sch[0]=="t") {
99
+ var lst=tpls["list"];
100
+ for(var i=0; i<lst.length; i++) if(tempID(lst[i])==ci) citm = i;
101
+ }
102
+ if(sch[0]=="a") {
103
+ var lst=tpls["authors"];
104
+ for(var i=0; i<lst.length; i++) if(lst[i][0]==ci) caut = i;
105
+ }
106
+ if(sch=="authors" ) caut=-2;
107
+ if(sch=="installed") caut=-3;
108
+ }
109
+ console.log(citm,caut);
110
+ var tit="PSD Templates";
111
+ if(ccat!=-1) tit=tpls.categories["c"+ccat] + " | "+tit;
112
+ if (caut==-2) tit="Top Authors";
113
+ else if(caut==-3) tit="Installed";
114
+ else if(caut!=-1) tit="By "+tpls.authors [caut][ 1] + " | "+tit;
115
+ if(citm!=-1) tit=tpls.list [citm][ 9] + " | "+tit;
116
+ if(citm!=-1) document.head.children.namedItem("description").content = tpls.list[citm][9];
117
+ document.title = tit;
118
+
119
+ updateView();
120
+
121
+ itms.scrollTop="0";
122
+ var scrl = localStorage.getItem("scrl");
123
+ if(scrl) {
124
+ scrl=JSON.parse(scrl); if(scrl.length==null) return;
125
+ if(citm==-1 && Date.now()-scrl[0]<60e3 && scrl[1]==ccat && scrl[2]==caut) itms.scrollTop = scrl[3];
126
+ }
127
+ }
128
+
129
+ function updateView() {
130
+ var w = window.innerWidth, h=window.innerHeight;
131
+ var sh = 90; if(w<1000) sh=130; if(w<800) sh=160;
132
+ itms.style.height=(h-sh)+"px";
133
+ cats.style.height=(h- 1)+"px";
134
+
135
+ add_link.style.display=(false?"none":"inline-block");
136
+ add_link.textContent = TYPE==0 ? "Add your own template!" : (TYPE==1 ? "Add your own plugin!":"");
137
+ add_link.setAttribute("href",
138
+ TYPE==0 ? "//www.photopea.com/tuts/publish-your-psd-templates-in-photopea/" : "//www.photopea.com/api/plugins");
139
+
140
+ var tpl=citm!=-1 ? tpls.list[citm]:null;
141
+ var comp;
142
+ if(ordr==0) comp=function(a,b) {return cost0(b)-cost0(a);}
143
+ if(ordr==1) comp=function(a,b) {return cost1(b)-cost1(a);}
144
+ if(ordr==2) comp=function(a,b) {return cost2(b)-cost2(a);}
145
+ tpls.list.sort(comp);
146
+ if(tpl) citm=tpls.list.indexOf(tpl);
147
+
148
+ if(citm==-1 && !isDisplayed(search)) { clearNode(cont); cont.appendChild(search); cont.appendChild(itms); }
149
+ if(citm!=-1) { clearNode(cont); cont.appendChild(back); cont.appendChild(itms); }
150
+ clearNode(itms);
151
+
152
+ var twds = kwds.value.trim().toLowerCase(), wds=twds.split(/[ ,]+/);
153
+ var out = [];
154
+ if (caut==-2) printAuthors (tpls, out);
155
+ else if(caut==-3) printInstalled(tpls, out);
156
+ else makeView(tpls,out,twds,wds,ccat,caut,citm);
157
+
158
+ itms.innerHTML=out.join("\n");
159
+
160
+ var out = [];
161
+ getCats(tpls,ccat,out);
162
+ cats.innerHTML = out.join("\n");
163
+
164
+ if(citm==-1) {
165
+ var ords = document.getElementsByClassName("order");
166
+ for(var i=0; i<3; i++) ords[i].setAttribute("class", "order"+(i==ordr ? " blue":""));
167
+ }
168
+ }
169
+
170
+ function backClicked(e) {
171
+ if(IFR) rebuild("");
172
+ else history.back();
173
+ /*
174
+ citm = -1;
175
+ updateView();
176
+ itms.scrollTo(0,cscr); */
177
+ }
178
+ function itemClicked(id) {
179
+ if(IFR) {
180
+ if(id==null) id = tpls.list[citm][3];
181
+ var ii=RSRC.indexOf(id);
182
+ var msg = "--ot "+id;
183
+ if(TYPE!=0) {
184
+ if(ii==-1) RSRC.push(id); else RSRC.splice(ii,1);
185
+ msg = "--ur "+RSRC.join(",");
186
+ updateView();
187
+ }
188
+ window.parent.postMessage(msg);
189
+ }
190
+ else window.open("//www.Photopea.com#t"+tempID(tpls.list[citm]));
191
+ }
192
+ function catClicked(nc) {
193
+ if(nc==ccat) ccat=-1;
194
+ else ccat=nc;
195
+ citm=-1;
196
+ updateView();
197
+ }
198
+ function setOrder(ord) {
199
+ ordr=ord; localStorage.setItem("ordr",JSON.stringify([ordr, Date.now()]));
200
+ updateView();
201
+ itms.scrollTo(0,0);
202
+ }
203
+ var __time=0;
204
+ function labelClicked(e) {
205
+ var ot = __time; __time=Date.now(); if(__time-ot>200) return;
206
+ var ci = tpls.list[citm];
207
+ var str=tpls.authors[ci[1]][0]+","+ci[3];
208
+ if(window.parent) window.parent.postMessage("--et "+str,"*");
209
+ //alert(str);
210
+ }
211
+ </script>
212
+ </head>
213
+
214
+ <body onload="go()" class="flexrow">
215
+
216
+ <div id="cats" class="scrollable">
217
+ </div>
218
+
219
+ <div id="cont">
220
+ <div id="search">
221
+ <span onclick="setOrder(0)" class="order blue">Hot</span>
222
+ <span onclick="setOrder(1)" class="order">New</span>
223
+ <span onclick="setOrder(2)" class="order" style="margin-right:2em">Top</span>
224
+ <span style="display:inline-block">
225
+ <label>Search:</label> <input type="text" id="kwds" oninput="updateView()" style="margin-right:1.5em;"></input>
226
+ </span>
227
+ <a id="add_link" href="//www.photopea.com/tuts/publish-your-psd-templates-in-photopea/" target="_blank">Add your own template!</a>
228
+ </div>
229
+ <div id="back">
230
+ <span class="back" onclick="backClicked()">&lt; Back</span>
231
+ </div>
232
+ <div id="itms" class="scrollable"></div>
233
+ </div>
234
+ </body>
235
+ </html>
templates/templates.css ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 
2
+
3
+ body { background-color:#333333; font-family:"Open Sans"; color:#a5a5a5; padding:0; margin:0; font-size:14px; }
4
+
5
+ #cont { background-color:#1d1d1d; padding: 26px 0 0 30px; width:100%; }
6
+
7
+ a { /*text-decoration: inherit;*/ color: inherit; }
8
+
9
+ .title { display:block; color:white; }
10
+ .item { position:relative; display:inline-block; margin:0 14px 20px 0; overflow:hidden; }
11
+ .item img { height: 100%; width: 100%; object-fit: contain; cursor:pointer; }
12
+ .item img:hover { object-fit: cover; }
13
+ .cat { margin:9px; padding:2px 0px; cursor:pointer; }
14
+ .top { margin-left: 0px; }
15
+ .clickable: { cursor:pointer; }
16
+ .blue { border-bottom: 3px solid #00eeff; margin-bottom:-3px; }
17
+ .clickable:hover {color:#00eeff;}
18
+ .back { display:inline-block; background-color:rgba(0,0,0,0.5); cursor:pointer; padding:6px 1em; margin: 0.2em 0 0.6em 0; font-size:1.5em; }
19
+ .count { float:right; }
20
+ .cat_title {font-size:1.6em; display:inline-block; margin:4px 0 10px 0;}
21
+ .t2 {font-size:1.2em; }
22
+ .openimg {opacity:0; text-align:center; font-size:4em; position:absolute; top:0; left:0; cursor:pointer;
23
+ color:white; background-color:rgba(0,0,0,0.5); text-shadow: 0 0 8px black; }
24
+ .openimg:hover {opacity:1;}
25
+ h1 {font-size:2em; margin-top:0; margin-bottom:0.4em; font-weight:normal; }
26
+ #cats { padding:0px 20px; min-width:180px; color:white; }
27
+ #cats a { text-decoration:none; }
28
+ #search { font-size:1.3em; margin-bottom: 24px; line-height:2em; }
29
+ #kwds { font-size:1.0em; background-color: black; border:none; color:white; padding:3px; margin-left:0.5em; }
30
+
31
+ .order { margin-right:1.5em; cursor:pointer; }
32
+
33
+ .post {min-width:1000px; margin-top:4px;}
34
+ .post_big { padding:24px; }
35
+ .clc { text-decoration:none; }
36
+ .clc:hover { color:#00eeff; }
37
+
38
+ .scrollable {
39
+ overflow-y: scroll;
40
+ /* for Firefox: */
41
+ scrollbar-color: #222222 #1d1d1d;
42
+ scrollbar-width: thin;
43
+ }
44
+ .scrollable::-webkit-scrollbar {
45
+ width: 8px;
46
+ background: #1d1d1d;
47
+ }
48
+ .scrollable::-webkit-scrollbar-thumb {
49
+ background: rgba(255,255,255,0.5);
50
+ border-radius: 6px;
51
+ margin:4px;
52
+ }
53
+ .flexrow {
54
+ display:flex;
55
+ flex-flow:row;
56
+ }
templates/templates.js ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 
2
+ function printInstalled(tpls,out) {
3
+
4
+ console.log(OTPLS,RSRC);
5
+ var list = OTPLS.list;
6
+
7
+ out.push("<h1>Installed</h1>");
8
+ out.push("<table style=\"font-size:1.2em; line-height:1.7em;\">");
9
+ out.push("<tr><th style=\"width:300px\">Name</th><th></th></tr>");
10
+
11
+ for(var ri=0; ri<RSRC.length; ri++) {
12
+ var id=RSRC[ri], cr=null;
13
+ for(var i=0; i<list.length; i++) if(list[i][3]==id) cr=list[i];
14
+ out.push("<tr><td>")
15
+ if(cr) {
16
+ if(cr[0]==TYPE) out.push("<a class=\"clc\" "+OC("t-"+tempID(cr))+">"+shorten(cr[9],24)+"</a>");
17
+ else out.push(shorten(cr[9],24));
18
+ }
19
+ else out.push("????");
20
+ //out.push("</td><td>Uninstall</td></tr>");
21
+ out.push("<td><a class=\"clickable\" onclick=\"itemClicked('"+id+"')\" style=\"cursor:pointer\" >Uninstall</a></td></tr>");
22
+ }
23
+
24
+ out.push("</table>");
25
+ }
26
+
27
+ function printAuthors(tps, out) {
28
+ var as = JSON.parse(JSON.stringify(tps.authors)), list=tps.list;
29
+
30
+ var to = [0,"Total:",0,0,0,0];
31
+ for(var i=0; i<list.length; i++) {
32
+ var tpl=list[i], ca=as[tpl[1]];
33
+ if(ca.length==2) ca.push(0,0,0,0); // tcount, usages, size, time
34
+ ca[2]++; ca[3]+=tpl[7]; ca[4]+=tpl[8]; ca[5]=Math.max(ca[5],tpl[2]);
35
+ to[2]++; to[3]+=tpl[7]; to[4]+=tpl[8]; to[5]=Math.max(to[5],tpl[2]);
36
+ }
37
+ var nas = []; for(var i=0; i<as.length; i++) if(as[i].length!=2) nas.push(as[i]); as=nas;
38
+
39
+ as.sort(function(a,b) { return b[3]-a[3]; }); as.push(to);
40
+
41
+ var tdr = "<td style=\"text-align:right; width:120px;\">";
42
+ var thr = "<th style=\"text-align:right; width:120px;\">";
43
+
44
+ out.push("<h1>Best Contributors</h1>");
45
+ out.push("<table style=\"font-size:1.2em; line-height:1.7em;\">");
46
+ out.push("<tr><th></th><th>Name</th>"+thr+"#Templates</th>"+thr+"Usages</th>"+thr+"Total Size</th>"+thr+"Last One</th></tr>");
47
+
48
+
49
+ for(var i=0; i<as.length; i++) {
50
+ var ca = as[i], last=i+1==as.length;
51
+ out.push(last ? "<tr style=\"font-weight:bold\">" : "<tr>");
52
+
53
+ if(!last) out.push("<td style=\"text-align:right;\">"+(i+1)+".</td>");
54
+ else out.push("<td></td>");
55
+ out.push("<td style=\"padding-left:10px;\"><a class=\"clc\" "+OC("a-"+ca[0])+">"+shorten(ca[1],24)+"</a></td>");
56
+ out.push(tdr+ca[2]+"</td>");
57
+ out.push(tdr+printNum(ca[3])+"</td>");
58
+ out.push(tdr+printBytes(ca[4])+"</td>");
59
+ out.push(tdr+"<small>"+printAge(ca[5])+" ago</small></td>");
60
+ out.push("</tr>");
61
+ }
62
+ out.push("</table>");
63
+ }
64
+
65
+ function makeView(tps,out,twds,wds,curc,caut,cit) {
66
+ var list = tps.list, cts=tps.categories;
67
+ if(cit==-1) {
68
+ if(caut!=-1) out.push("<h1 style=\"font-size:2.4em\"><a "+OC("-a")+" class=\"clc\">×</a> <b>"+escapeHtml(tps.authors[caut][1])+"</b></h1>");
69
+ var oi = out.length; out.push("");
70
+ var N=0, U=0, S=0;
71
+ for(var i=0; i<list.length; i++) {
72
+ var tpl = list[i], cat=tpl[5], pcat=cat-(cat%10);
73
+ if(caut!=-1 && tpl[1]!=caut) continue;
74
+ if(curc!=-1) {
75
+ if((curc%10)==0) { if(pcat!=curc) continue; }
76
+ else if(curc!=cat) continue;
77
+ }
78
+ if(twds!="") {
79
+ var occ=0, tot=(tpl[8] + " " + tpl[9] + " " + tps.authors[tpl[1]] + " " + cts["c"+tpl[5]]).toLowerCase();
80
+ for(var j=0; j<wds.length; j++) {
81
+ if(tot.indexOf(wds[j])!=-1) occ++;
82
+ }
83
+ if(occ==0) continue;
84
+ }
85
+ makeItem(tps,i, cts,out, false);
86
+ N++; U+=tpl[7]; S+=tpl[8];
87
+ }
88
+ if(caut!=-1) out[oi]="<p>"+N+" Templates • "+printNum(U)+" "+uses()+" • "+printBytes(S)+"</p>";
89
+ }
90
+ else {
91
+ var tpl = list[cit];
92
+ makeItem(tps,cit,cts,out, true);
93
+ out.push("<iframe src=\"comments.html#"+tempID(tpl)+"\" frameborder=\"0\" style=\"border:none; max-width:800px; width:calc(100% - 20px); height:800px; background-color:white;\"></iframe>");
94
+ }
95
+ }
96
+
97
+ function uses() { return TYPE==0?"uses":"installs"; }
98
+ function shorten(str, lim) {
99
+ return (str.length<lim) ?str:str.slice(0,lim-3)+"...";
100
+ }
101
+ function mmd(e) {
102
+ var t=e.target; //if(t.tagName.toLowercase()!="img") return;
103
+ var r = t.getBoundingClientRect();
104
+ t.setAttribute("style", "object-position: "+(100*e.offsetX/r.width)+"% "+(100*e.offsetY/r.height)+"%;");
105
+ }
106
+ function mmo(e) {
107
+ var t=e.target;
108
+ t.setAttribute("style", "object-position: 50% 50%;");
109
+ }
110
+ function toID(str) { return str.toLowerCase().replace(/\s+/g, "-")+".html"; }
111
+ function makeItem(tps, ind,cts,lst, big) {
112
+ var tpl = tps.list[ind], gotR = RSRC.indexOf(tpl[3])!=-1;
113
+ var rst = window.innerWidth-(245+30); //console.log(iw);
114
+ var num = 1; while(rst/num>300) num++;
115
+ var cc = Math.floor(rst/num); //console.log(cc);
116
+ var isz = cc-20; //console.log(isz);
117
+
118
+ var tit = escapeHtml(tpl[9]);
119
+ var lim = ~~(isz/9); //console.log(tpl);
120
+
121
+ if(big) isz=rst/2;
122
+ var wi = (isz+"px");
123
+ var hi = ((isz*9.3/16)+"px");
124
+
125
+ lst.push("<div class=\"item "+(big?"flexrow":"tiny")+"\" "+(big?"":"style=\"width:"+wi+";\" ")+">");
126
+
127
+ var iurl = tpl[4]; //(Math.random()<0.5?"wide.png":"tall.png"); // tpl[3]
128
+ //*
129
+
130
+
131
+ lst.push("<div style=\"width:"+wi+"; min-width:"+wi+"; height:"+hi+"\">"); // ict
132
+ if(!big) lst.push("<a "+OC("t-"+tempID(tpl))+" title=\""+tit+"\">");
133
+ lst.push("<img src=\""+iurl+"\" loading=\"lazy\" onmousemove=\"mmd(event)\" onmouseout=\"mmo(event)\" "
134
+ +(big ? "onclick=\"itemClicked()\" title=\"Open &quot;"+tit+"&quot;\"" : "")+" />");
135
+ //if(big) lst.push("<div class=\"openimg\" style=\"width:"+wi+"; height:"+hi+";\" "+(big ? "onclick=\"itemClicked("+ind+")\" title=\"Open &quot;"+tit+"&quot;\"" : "")+"><br/><br/>Open</div>");
136
+ if(!big) lst.push("</a>");
137
+ lst.push("</div>"); // ict
138
+ lst.push("<div class=\""+"post"+(big?"_big":"")+"\">"); // cmt
139
+
140
+ if(!big) lst.push("<a class=\"clc\" "+OC("t-"+tempID(tpl))+" title=\""+tit+"\">");
141
+ var tag = big?"h1":"span";
142
+ lst.push("<"+tag+" class=\"title "+(big?"t1":"t2")+"\" "+(big?"onclick=\"labelClicked()\"":"")+">" +
143
+ (big?tit:shorten(tit,lim)) + (gotR?" ✅":"") + "</"+tag+">");
144
+ if(!big) lst.push("</a>");
145
+
146
+ var au = tps.authors[tpl[1]];
147
+ var cat = cts["c"+tpl[5]];
148
+ lst.push("<span>")
149
+ lst.push( "By <a class=\"clc\" "+OC("a-"+au[0] )+">" +escapeHtml(big?au[1]:shorten(au[1],~~(lim*0.7)))+"</a>");
150
+ lst.push(" in <a class=\"clc\" "+OC("c-"+toCat(cat))+">" + cat+"</a>");
151
+ lst.push("</span>");
152
+
153
+ if(big) {
154
+ lst.push("<p style=\"white-space: pre-line;\">"+findLinks(escapeHtml(tpl[10]))+"</p>");
155
+ lst.push("<p style=\"font-size:1.5em; margin-bottom: 0em;\">");
156
+ var dstr = printDate(tpl[2]);
157
+
158
+ lst.push("<span title=\""+printNum(tpl[6])+" views"+"\">"+printNum(tpl[7])+" "+uses()+"</span>")
159
+ lst.push(" • "+printBytes(tpl[8]));
160
+ lst.push(" • <span title=\""+((0.001*Date.now()-tpl[2])/(60*60*24)).toFixed(2)+" days ago\">"+dstr+"</span>");// lst.push("<br/>");
161
+
162
+ lst.push("</p>");
163
+ lst.push("<p style=\"font-size:1.2em; margin-top:0.5em;\">");
164
+ var aurl = "//www.Photopea.com#t"+tempID(tpl);
165
+ if(TYPE==0) lst.push("<a href=\""+aurl+"\" target=\"_blank\" class=\"clickable\" >photopea.com#t"+tempID(tpl)+"</a>");
166
+ else lst.push("<a class=\"clickable\" onclick=\"itemClicked()\" style=\"cursor:pointer\" >"+(gotR?"Uninstall":"Install")+"</a>");
167
+ lst.push("</p>");
168
+ }
169
+ else {
170
+ lst.push("<br/><span>");
171
+
172
+ var us=tpl[7], ss=""; //us = Math.floor(Math.random()*1e9);
173
+ if(us<1000) ss=us+"";
174
+ else if(us<1e6) ss=(us/1e3).toFixed(us<1e4 ? 1 : 0)+"K";
175
+ else if(us<1e9) ss=(us/1e6).toFixed(us<1e7 ? 1 : 0)+"M";
176
+
177
+ var sl=ss.length-3;
178
+ if(ss[sl]=="." && ss[sl+1]=="0") ss=ss.slice(0,sl)+ss[sl+2];
179
+
180
+ lst.push(ss+" "+uses());
181
+
182
+
183
+ var ts = printAge(tpl[2]);
184
+
185
+ lst.push(" • "+ts+" ago");
186
+ lst.push("</span>");
187
+ }
188
+ lst.push("</div>"); // cmt
189
+ lst.push("</div>");
190
+ }
191
+
192
+ function OC(tgt) { // onclick
193
+ if(IFR) return "onclick=\"rebuild('"+tgt+"')\" style=\"cursor:pointer;\"";
194
+ if(tgt[0]=="-") tgt="";
195
+ return "href=\""+(tgt==""?"/templates/":tgt)+"\"";
196
+ }
197
+
198
+ function printAge(time) {
199
+ var sts = [60, 60, 24, 30, 12,10000];
200
+ var uns = ["sec","min","hour","day","month","year"];
201
+ var td = (Date.now()/1000) - time, ts="";
202
+ var lim = 1;
203
+ for(var i=0; i<sts.length; i++) {
204
+ var ol=lim; lim*=sts[i];
205
+ if(td<lim) { var n=Math.round(td/ol); ts=n+" "+uns[i]+(n>1?"s":""); break; }
206
+ }
207
+ return ts;
208
+ }
209
+ function printBytes(bs) {
210
+ var bst = bs.toString(2);
211
+ var zrs=0; while(zrs+10<bst.length) zrs+=10;
212
+ var num = (bs/Math.pow(2,zrs)), rn=Math.round(num), fxd=num.toFixed(1);
213
+ num = (rn>99 || fxd[fxd.length-1]=="0") ? rn : fxd;
214
+
215
+ var ext = ["B","KB","MB","GB","TB","PB"][Math.floor(zrs/10)];
216
+ return num+" "+ext;
217
+ }
218
+
219
+ function printDate(d) {
220
+ var dt = new Date(d*1000);
221
+ var mon = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"][dt.getMonth()];
222
+ return mon+" "+(dt.getDate())+", "+dt.getFullYear();
223
+ }
224
+ function printNum(f) { return f.toLocaleString('en-US', {maximumFractionDigits:2}); }
225
+ function tempID(tpl) { return tpl[3].split("").reverse().join(""); }
226
+ function isWhite(c) { return c==" " || c=="\n" || c=="\t"; }
227
+ function isChar(c) { c=c.charCodeAt(0); return (65<=c && c<=90) || (97<=c && c<=122); }
228
+
229
+ function findLinks(str) {
230
+ //return str;
231
+ var iod = [];
232
+ for(var i=0; i<str.length-2; i++) if(str[i]=="." && isChar(str[i+1]) && isChar(str[i+2])) iod.push(i);
233
+ iod.reverse(); //console.log(iod);
234
+
235
+ var omit=["https://", "http://", "//", "www."];
236
+
237
+ var min = 1e9;
238
+ for(var i=0; i<iod.length; i++) {
239
+ var i0=iod[i], i1=i0; if(i0>min) continue;
240
+
241
+ while(i0>0 && !isWhite(str[i0-1])) i0--;
242
+ while(i1<str.length-1 && !isWhite(str[i1+1])) i1++;
243
+ if(str[i0]==" ") i0++; if(str[i1]==" ") i1--;
244
+ var mid = str.slice(i0,i1+1), url=mid;
245
+ for(var j=0; j<omit.length; j++) if(mid.startsWith(omit[j])) mid=mid.slice(omit[j].length);
246
+ if(url.indexOf("//")==-1) url="//"+url;
247
+ str = str.slice(0,i0)+"<a href=\""+url+"\" target=\"_blank\">"+mid+"</a>"+str.slice(i1+1);
248
+ min=i0;
249
+ }
250
+ return str//.replaceAll("\n","<br/>");
251
+ }
252
+
253
+ function escapeHtml(unsafe) {
254
+ return unsafe
255
+ .replace(/&/g, "&amp;")
256
+ .replace(/</g, "&lt;")
257
+ .replace(/>/g, "&gt;")
258
+ .replace(/"/g, "&quot;")
259
+ .replace(/'/g, "&#039;");
260
+ }
261
+
262
+ function getCatCounts(tps) {
263
+ var list = tps.list, cts=tps.categories;
264
+ var ccnt = JSON.parse(JSON.stringify(cts));
265
+ for(var cat in ccnt) ccnt[cat]=0;
266
+ for(var i=0; i<list.length; i++) {
267
+ var tpl = list[i], cat=tpl[5], pcat=cat-(cat%10);
268
+ ccnt["c"+cat]++; if(cat!=pcat) ccnt["c"+pcat]++;
269
+ }
270
+ return ccnt;
271
+ }
272
+
273
+ function getCats(tps, curr,out) {
274
+ var cts=tps.categories, ccnt = getCatCounts(tps);
275
+ out.push("<br/>");
276
+ out.push("<span class=\"cat top clickable\"><a "+OC("authors")+">AUTHORS</a></span>");
277
+ out.push("<span class=\"cat_title\">CATEGORIES</span>");
278
+ for(var cat in cts) {
279
+ if(ccnt[cat]==0) continue;
280
+ var cw = parseInt(cat.slice(1)), isTop = (cw%10)==0; //console.log(cw);
281
+ out.push("<a "+OC(cw==curr ? "-c" : "c-"+toCat(cts[cat]))+">");
282
+ out.push("<div class=\"cat"+(isTop?" top":"") + (cw==curr?" blue":"")+" clickable\" >"); // onclick=\"catClicked("+cw+")\"
283
+ out.push(cts[cat]);
284
+ out.push("<span class=\"count\">"+ccnt[cat]+"</span>");
285
+ out.push("</div>");
286
+ out.push("</a>");
287
+ }
288
+ if(TYPE!=0) out.push("<br/><span class=\"cat top clickable\"><a "+OC("installed")+">INSTALLED ("+RSRC.length+")</a></span>");
289
+ }
290
+ function toCat(cat) {
291
+ var ioa=cat.indexOf(" &");
292
+ if(ioa!=-1) cat=cat.slice(0,ioa)+cat.slice(ioa+2);
293
+ var ioa=cat.indexOf(" /");
294
+ if(ioa!=-1) cat=cat.slice(0,ioa)+cat.slice(ioa+2);
295
+ return cat.toLowerCase().replace(/\s+/g, "-");
296
+ }
297
+
298
+
299
+ function cost0(v) {
300
+ var age = (Date.now()*0.001 - v[2]) / (60*60*24); // age in days
301
+ var cst = (v[7]+1) / age; // usages per day
302
+ var ext = 60*Math.pow(Math.PI,-age*0.15);
303
+
304
+ return cst+ext;
305
+ }
306
+ function cost1(v) { return v[2]; }
307
+ function cost2(v) { return v[7]; }
308
+
309
+