Mattthew
commited on
Commit
•
cabd7e6
1
Parent(s):
ecf0e74
Upload 4 files
Browse files- artists_and_tags.js +557 -0
- index.css +722 -0
- index.html +196 -15
- index.js +1406 -0
artists_and_tags.js
ADDED
@@ -0,0 +1,557 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
var artistsData = [
|
2 |
+
["Alma-Tadema","Lawrence","romanticism|victorian|history|opulent|ancient|opulent"],
|
3 |
+
["Anatsui","El","abstract|sculpture|contemporary|African|recycled-materials|Ghanaian|textiles"],
|
4 |
+
["Andersen","Sarah","cartoon|comics|high-contrast|contemporary|collage|femininity|fashion|mixed-media"],
|
5 |
+
["Balfour","Ronald","art-deco|art-nouveau|watercolor|contemporary|vibrant|abstract|organic"],
|
6 |
+
["Basquiat","Jean-Michel","expressionism|messy|neo-expressionism|street-art|African-American|graffiti|punk|contemporary"],
|
7 |
+
["Beaux","Cecilia","impressionism|portraits|portraits|elegant|femininity|American"],
|
8 |
+
["Blanche","John","fantasy|science-fiction|portraits|elegant|French"],
|
9 |
+
["Bontecou","Lee","sculpture|abstract|contemporary|abstract|mixed-media"],
|
10 |
+
["Burgert","Jonas","contemporary|figurative|surrealism|allegory|large-scale|German"],
|
11 |
+
["Burlet","Richard","art-nouveau|impressionism|figurative|urban-life|characters|cityscapes|French"],
|
12 |
+
["Cassatt","Mary","impressionism|characters|portraits|pastel"],
|
13 |
+
["Cézanne","Paul","impressionism|cubism|romanticism|post-impressionism|still-life|landscapes|geometric"],
|
14 |
+
["Chicago","Judy","abstract|vibrant|psychedelic|feminism|sculpture|installation|activism|femininity|empowerment"],
|
15 |
+
["Ciurlionis","Mikalojus Konstantinas","dark|art-nouveau|symbolist|spirituality|Lithuanian|mysticism"],
|
16 |
+
["Clark","Alson Skinner","landscapes|impressionism|impressionism|seascapes|atmospheric"],
|
17 |
+
["Cowper","Frank Cadogan","Victorian|history|romanticism|British|opulent"],
|
18 |
+
["Crewdson","Gregory","photography|surrealism|dark|eerie|suburbia|American"],
|
19 |
+
["Davis","Stuart","cubism|abstract|social-realism|American|rural-life|printmaking"],
|
20 |
+
["Dubbeldam","Ton","pointillism|landscapes|vibrant|contemporary|architecture|conceptual|geometric|Dutch"],
|
21 |
+
["Earles","Amy","watercolor|characters|whimsical|dark|abstract-expressionism|gestural|American"],
|
22 |
+
["Eliasson","Olafur","installation|contemporary|environmentalism|immersive|nature"],
|
23 |
+
["Evans","Walker","photography|monochromatic|documentary|photography|American|great-depression|portraits|social-commentary"],
|
24 |
+
["Fahrenkrog","Ludwig","expressionism|symbolist|mysticism|eerie|German"],
|
25 |
+
["Flavin","Dan","installation|minimalism|light-art|sculpture|conceptual|sculpture|contemporary"],
|
26 |
+
["Frankenthaler","Helen","abstract|expressionism|watercolor|abstract-expressionism|color-field|painting|feminism|printmaking|contemporary"],
|
27 |
+
["Gascar","Henri","impressionism|landscapes|French|atmospheric"],
|
28 |
+
["Goldberger","Sacha","photography|portraits|characters|contemporary|portraits|mixed-media|identity-exploration|immigrants"],
|
29 |
+
["Gonzalez-Torres","Felix","installation|conceptual|installation|minimalism|LGBTQ|contemporary"],
|
30 |
+
["Haacke","Hans","installation|photography|sculpture|conceptual|installation|environmentalism|politics|contemporary"],
|
31 |
+
["Hammons","David","installation|abstract|conceptual|installation|African-American|social-commentary|contemporary"],
|
32 |
+
["Haring","Keith","graffiti|street-art|expressionism|flat-colors|high-contrast|vibrant|pop-art|activism|LGBTQ"],
|
33 |
+
["Hartley","Marsden","landscapes|portraits|primitivism|expressionism|modern|American|landscapes|abstract"],
|
34 |
+
["Hassam","Childe","impressionism|cityscapes|American|landscapes|American|impressionism"],
|
35 |
+
["Hatoum","Mona","installation|sculpture|photography|installation|conceptual|displacement|body-art|contemporary"],
|
36 |
+
["Hawkes","Pam","figurativism|portraits|contemporary|ceramics|figurative|nature|organic|delicate"],
|
37 |
+
["Heizer","Michael","installation|landscapes|angular|land-art|earthworks|nature|large-scale"],
|
38 |
+
["Herrera","Carolina","photography|characters|fashion|minimalism|abstract|contemporary"],
|
39 |
+
["Holler","Carsten","contemporary|immersive|interactive|experiential|playful"],
|
40 |
+
["Huyghe","Pierre","conceptual|contemporary|conceptual|multimedia|surrealism"],
|
41 |
+
["Irwin","Robert","installation|angular|minimalism|installation|environmentalism|contemporary"],
|
42 |
+
["Judd","Donald","angular|installation|minimalism|sculpture|industrial-materials|contemporary"],
|
43 |
+
["Kahlo","Frida","surrealism|portraits|vibrant|Mexican|self-portraits|feminism"],
|
44 |
+
["Kelly","Ellsworth","abstract|flat-colors|minimalism|color-field|geometric|abstract|contemporary"],
|
45 |
+
["Kentridge","William","messy|monochromatic|drawing|animation|printmaking|African|politics|contemporary"],
|
46 |
+
["Koons","Jeff","sculpture|pop-art|vibrant|contemporary|kitsch|consumerism|post-modern"],
|
47 |
+
["Krasner","Lee","expressionism|abstract|high-contrast|abstract-expressionism|color-field|gestural|improvisation|feminism"],
|
48 |
+
["Kruger","Barbara","high-contrast|graphic-design|conceptual|feminism|text-based|montage|advertising|contemporary"],
|
49 |
+
["Kusama","Yayoi","vibrant|polka-dots|installation|fashion|pop-art|contemporary|infinity-rooms|feminism|contemporary"],
|
50 |
+
["Lawrence","Jacob","cubism|angular|modern|African-American|social-realism|harlem-renaissance|contemporary"],
|
51 |
+
["Lawson","Ernest","impressionism|landscapes|everyday-life|American|American|impressionism"],
|
52 |
+
["LeWitt","Sol","conceptual|minimalism|sculpture|geometric|abstract|wall-drawings|contemporary|serial-art"],
|
53 |
+
["Lin","Maya","installation|land-art|architecture|identity-exploration|environmentalism|contemporary"],
|
54 |
+
["List","Herbert","photography|monochromatic|high-contrast|surrealism|portraits|German"],
|
55 |
+
["Mapplethorpe","Robert","photography|figure-studies|BDSM|monochromatic|portraits|homo-eroticism|LGBTQ"],
|
56 |
+
["Martin","Agnes","minimalism|abstract-expressionism|grids|color-field|spirituality|contemporary"],
|
57 |
+
["Merian","Maria Sibylla","biological|nature|naturalist|botanical|insects|observational"],
|
58 |
+
["Metcalf","Willard","tonalism|landscapes|muted-colors|American"],
|
59 |
+
["Morimoto","Kōji","contemporary|surrealism|illustration|Japanese|monsters|cute"],
|
60 |
+
["Mostyn","Thomas Edwin","landscapes|still-life|portraits|romanticism|pre-raphaelite|landscapes|dream-like|British|mysticism"],
|
61 |
+
["Murakami","Takashi","pop-art|manga-anime|flat-colors|Japanese|cute|contemporary"],
|
62 |
+
["Nan","Juliana","contemporary|multimedia|identity-exploration|African"],
|
63 |
+
["Nauman","Bruce","conceptual|sculpture|performance|neon|contemporary"],
|
64 |
+
["Neel","Alice","high-contrast|portraits|expressionism|figurative|portraits|social-realism|feminism|contemporary"],
|
65 |
+
["Neshat","Shirin","contemporary|video-art|photography|Iranian|feminism|identity-exploration"],
|
66 |
+
["Noguchi","Isamu","sculpture|landscape-architecture|sculpture|organic|Japanese"],
|
67 |
+
["O'Keeffe","Georgia","figurativism|abstract|watercolor|modern|precisionism|American|flowers|southwest|landscapes"],
|
68 |
+
["Ofili","Chris","watercolor|expressionism|contemporary|figurative|painting|afro-futurism|mixed-media|post-colonialism"],
|
69 |
+
["Parreno","Philippe","installation|contemporary|installation|multimedia|film|conceptual|post-modern"],
|
70 |
+
["Perry","Lilla Cabot","impressionism|interiors|gardens|American"],
|
71 |
+
["Ribemont-Dessaignes","Georges","Dadaism|avant-garde|French"],
|
72 |
+
["Ringgold","Faith","pop-art|abstract|expressionism|feminism|quilting|African-American|activism|contemporary"],
|
73 |
+
["Scully","Sean","abstract|angular|minimalism|grids"],
|
74 |
+
["Serra","Richard","sculpture|installation|minimalism|large-scale|contemporary"],
|
75 |
+
["Sherman","Cindy","photography|portraits|conceptual|photography|self-portraits|feminism|post-modern|identity-exploration|contemporary"],
|
76 |
+
["Sims","David","contemporary|photography|fashion|British"],
|
77 |
+
["Singer","Andy","pop-art|consumerism|celebrity|American"],
|
78 |
+
["Smart","Jeffrey","surrealism|Scottish|dream-like"],
|
79 |
+
["Smith","Kiki","minimalism|feminism|sculpture|body-art|performance|contemporary"],
|
80 |
+
["Smithson","Robert","land-art|sculpture|conceptual|earthworks|environmentalism|post-minimalism"],
|
81 |
+
["Suddese","Kate Van","contemporary|abstract|mixed-media|organic|vibrant"],
|
82 |
+
["Sutherland","Graham","abstract|landscapes|expressionism|surrealism|portraits|distortion|British|battle-scenes|eerie"],
|
83 |
+
["Tanning","Dorothea","surrealism|surrealism|dream-like|figure-studies|metamorphosis|eerie"],
|
84 |
+
["Tenniel","John","kids-book|fantasy|whimsical|drawing"],
|
85 |
+
["Thomson","Tom","expressionism|art-nouveau|impressionism|landscapes|Canadian|landscapes|nature|wilderness"],
|
86 |
+
["Toth","Alex","cartoon|comics|high-contrast|figurative|animals|wildlife|bronze"],
|
87 |
+
["Turrell","James","light-art|vibrant|installation|installation|sculpture|contemporary"],
|
88 |
+
["Uhlig","Daniela","digital|portraits|characters|contemporary|landscapes|dream-like|ethereal|surrealism|German"],
|
89 |
+
["Valadon","Suzanne","post-impressionism|nudes|mysterious"],
|
90 |
+
["Valdi","Thiago","contemporary|urban-life|street-art|colorful|Brazilian"],
|
91 |
+
["Varo","Remedios","surrealism|low-contrast|magical-realism|Spanish|surrealism"],
|
92 |
+
["Vonnoh","Robert","impressionism|bronze|sculpture|American"],
|
93 |
+
["Walker","Kara","silhouettes|African-American|identity-exploration|contemporary"],
|
94 |
+
["Warhol","Andy","pop-art|vibrant|portraits|celebrity|contemporary"],
|
95 |
+
["Weiwei","Ai","contemporary|installation|social-commentary|activism|politics|Chinese"],
|
96 |
+
["Wiley","Kehinde","photorealism|portraits|vibrant|colorful|contemporary|portraits|African-American|baroque|identity-exploration"],
|
97 |
+
["Wilson","Wes","contemporary|art-nouveau|psychedelic"],
|
98 |
+
["Woodman","Francesca","feminism|self-portraits|photography|feminism|surrealism|still-life|contemporary"],
|
99 |
+
["Wu","Bayard","fantasy|fashion|illustration|Chinese|LGBTQ|contemporary"],
|
100 |
+
["Wylie","Rose","figurative|portraits|painting|observational|painting|contemporary"],
|
101 |
+
["Abts","Tomma","abstract|angular|geometric|modern|minimalism|contemporary|color-field"],
|
102 |
+
["Acconci","Vito","dark|installation|architecture|sculpture|performance|conceptual"],
|
103 |
+
["Adams","Ansel","monochromatic|high-contrast|nature|American|landscapes|photography|landscapes|monochromatic"],
|
104 |
+
["Aoshima","Chiho","pop-art|colorful|whimsical|manga-anime|fantasy|vibrant|Japanese|digital|futuristic"],
|
105 |
+
["Araki","Hirohiko","manga-anime|Japanese|characters|pop-culture|illustration|manga-anime|graphic-novel|surrealism"],
|
106 |
+
["Bacon","Francis","expressionism|British|portraits|abstract|dark|figurative|distortion|surrealism"],
|
107 |
+
["Banksy","","street-art|graffiti|high-contrast|politics|social-commentary|anonymous|urban-life"],
|
108 |
+
["Barney","Matthew","photography|surrealism|sculpture|video-art|performance|multimedia|film|conceptual"],
|
109 |
+
["Bosch","Hieronymus","whimsical|renaissance|religion|mysticism|surrealism|allegory|religion|fantasy"],
|
110 |
+
["Botticelli","Sandro","renaissance|Italian|figurative|mythology|religion|femininity|religion|dream-like"],
|
111 |
+
["Chagall","Marc","fauvism|impressionism|surrealism|stained-glass|Russian|French|Jewish|colorful|folklore|romanticism"],
|
112 |
+
["Constable","John","landscapes|romanticism|dark|nature|British|oil-painting|skies"],
|
113 |
+
["Creed","Martin","installation|abstract|expressionism|minimalism|conceptual|British|playful|interactive"],
|
114 |
+
["Crumb","Robert","comics|characters|American|underground|satire|underground|satire|counter-culture"],
|
115 |
+
["Dalí","Salvador","surrealism|dark|Spanish|dream-like|oil-painting|dreams|illusion|metaphysics"],
|
116 |
+
["Degas","Edgar","impressionism|French|ballet|pastel|drawing|portraits|dancers|femininity"],
|
117 |
+
["Delacroix","Eugene","romanticism|French|history|oil-painting|sketching|orientalism|colorful|vibrant"],
|
118 |
+
["Doig","Peter","figurativism|landscapes|abstract|British|Canadian|large-scale|dream-like|nature"],
|
119 |
+
["Duchamp","Marcel","surrealism|cubism|fauvism|expressionism|impressionism|conceptual|dadaism"],
|
120 |
+
["Ernst","Max","surrealism|expressionism|German|Dadaism|collage|oil-painting|automatism|mythology"],
|
121 |
+
["Escher","M. C.","angular|high-contrast|surrealism|Dutch|lithography|woodblock-prints|geometric|illusion|mathematics"],
|
122 |
+
["Freud","Lucian","portraits|expressionism|British|realism|oil-painting|figurative|flesh"],
|
123 |
+
["Gaudi","Antoni","architecture|angular|Spanish|organic|mosaic|art-nouveau|fantasy"],
|
124 |
+
["Gauguin","Paul","impressionism|primitivism|French|exoticism|oil-painting|colorful|tropics|spirituality"],
|
125 |
+
["Giacometti","Alberto","sculpture|expressionism|Swiss|bronze|figurative|portraits|emaciation"],
|
126 |
+
["Goya","Francisco","romanticism|portraits|Spanish|etching|social-commentary|oil-painting|dark|politics|satire|horror"],
|
127 |
+
["Hiroshige","","ukiyo-e|landscapes|Japanese|woodblock-prints|nature|Edo-period|printmaking|Japanese"],
|
128 |
+
["Hirst","Damien","conceptual|contemporary|installation|British|shock-art|mixed-media|sculpture|animals|death"],
|
129 |
+
["Hockney","David","pools|cubism|vibrant|colorful|British|pop-art|portraits"],
|
130 |
+
["Hokusai","Katsushika","ukiyo-e|high-contrast|Japanese|woodblock-prints|nature|Edo-period|waves|japanese"],
|
131 |
+
["Hopper","Edward","impressionism|American|realism|architecture|landscapes|oil-painting|urban-life|solitude|loneliness|nostalgia"],
|
132 |
+
["Horn","Roni","conceptual|sculpture|photography|American|minimalism|installation|nature|environmentalism"],
|
133 |
+
["Kandinsky","Wassily","bauhaus|expressionism|abstract|vibrant|Russian|modern|spirituality"],
|
134 |
+
["Klee","Paul","bauhaus|expressionism|abstract|surrealism|German|drawing|playful"],
|
135 |
+
["Klein","William","photography|monochromatic|abstract|American|urban-life|fashion|minimalism"],
|
136 |
+
["Klein","Yves","abstract|monochromatic|expressionism|French|performance|modern|color-field|fashion"],
|
137 |
+
["Kleiner","Carl","abstract|surrealism|portraits|graphic-design|American|digital|collage|pop-art"],
|
138 |
+
["Klimt","Gustav","art-nouveau|Austrian|erotica|mosaic|portraits|golden|female-figures"],
|
139 |
+
["Larson","Gary","cartoon|American|newspaper|satire|pop-culture|comics|satire|animals|slice-of-life"],
|
140 |
+
["Lichtenstein","Roy","comics|portraits|abstract|expressionism|American|pop-art"],
|
141 |
+
["Magritte","Rene","surrealism|cloudscapes|art-deco|cubism|impressionism|Belgian|illusion"],
|
142 |
+
["Manet","Édouard","impressionism|portraits|French|still-life|realism|femininity|modern-life|controversy"],
|
143 |
+
["Matisse","Henri","fauvism|impressionism|French|collage|sculpture|color-field|colorful|cut-outs|decorative"],
|
144 |
+
["Michelangelo","","renaissance|Italian|sculpture|frescoes|religion|figurative|ceiling-painting|religion"],
|
145 |
+
["Miró","Joan","abstract|Spanish|surrealism|sculpture|drawing|color-field|colorful|outer-space|playful"],
|
146 |
+
["Miyazaki","Hayao","whimsical|manga-anime|kids-book|Japanese|animation|fantasy|adventure"],
|
147 |
+
["Modigliani","Amedeo","expressionism|fauvism|portraits|Italian|sculpture|modern|romanticism"],
|
148 |
+
["Mondrian","Piet","cubism|vibrant|angular|Dutch|abstract|geometric|primary-colors|abstract"],
|
149 |
+
["Monet","Claude","impressionism|landscapes|seascapes|French|plein-air|color-field|water-lilies"],
|
150 |
+
["Morisot","Berthe","impressionism|feminism|landscapes|portraits|French|still-life|domestic-scenes|fleeting-moments"],
|
151 |
+
["Moriyama","Daido","photography|Japanese|urban-life|monochromatic|post-war|documentary|grungy|urban-life"],
|
152 |
+
["Mucha","Alphonse","art-nouveau|portraits|Czech|commercial-art|posters|decorative|femininity|decorative|stained-glass"],
|
153 |
+
["Munch","Edvard","expressionism|impressionism|Norwegian|anxiety|oil-painting|dark|melancholy"],
|
154 |
+
["Okamoto","Tarō","surrealism|gutai|Japanese|abstract|sculpture|avant-garde|performance"],
|
155 |
+
["Picasso","Pablo","cubism|surrealism|impressionism|Spanish|sculpture|modern|collage|African-influence"],
|
156 |
+
["Pollock","Jackson","abstract|messy|expressionism|American|drip-painting|action-painting"],
|
157 |
+
["Potter","Beatrix","whimsical|watercolor|kids-book|British|animals|book-illustration|nature|animals"],
|
158 |
+
["Renoir","Pierre-Auguste","impressionism|portraits|French|landscapes|plein-air|female-figures|pastel-colors|femininity|outdoor-scenes"],
|
159 |
+
["Richter","Gerhard","abstract|German|photorealism|photography|oil-painting|contemporary|blurry|multimedia"],
|
160 |
+
["Rijn","Rembrandt van","baroque|portraits|Dutch|etching|self-portraits|history|religion"],
|
161 |
+
["Rothko","Mark","abstract|expressionism|American|color-field|large-scale|minimalism|spirituality"],
|
162 |
+
["Rubens","Peter Paul","baroque|renaissance|romanticism|Flemish|history|painting|oil-painting|mythology|nudes"],
|
163 |
+
["Schulz","Charles","comics|cartoon|American|characters|nostalgia|childhood|social-commentary"],
|
164 |
+
["Shimamoto","Shozo","performance|gutai|Japanese|abstract|mixed-media|post-war|action-painting|collaborative"],
|
165 |
+
["Spiegelman","Art","cartoon|comics|American|history|graphic-novel|autobiographical|Holocaust|animals"],
|
166 |
+
["Strand","Paul","photography|monochromatic|American|photography|landscapes|portraits|abstract|minimalism|still-life|urban-life"],
|
167 |
+
["Sugimoto","Hiroshi","photography|monochromatic|Japanese|conceptual|seascapes|long-exposure|architecture|geometric"],
|
168 |
+
["Tezuka","Osamu","cartoon|manga-anime|Japanese|manga-anime|animation|characters|science-fiction|robots-cyborgs"],
|
169 |
+
["Titian","","renaissance|dark|Italian|portraits|religion|oil-painting|mythology|mythology|painting|religion|colorful"],
|
170 |
+
["Toulouse-Lautrec","Henri de","impressionism|art-nouveau|French|posters|lithography|portraits|nightlife|cabaret|bold-colors"],
|
171 |
+
["Turner","J.M.W.","romanticism|landscapes|seascapes|British|watercolor|atmospheric"],
|
172 |
+
["Utamaro","Kitagawa","ukiyo-e|Japanese|woodblock-prints|Edo-period|female-figures|nature|portraits|fashion|genre-scenes"],
|
173 |
+
["Velázquez","Diego","baroque|Spanish|portraits|religion|oil-painting|realism|royalty|history|Spanish"],
|
174 |
+
["Vermeer","Johannes","baroque|interiors|portraits|Dutch|genre-scenes|domestic-scenes|illusion"],
|
175 |
+
["Ware","Chris","cartoon|comics|American|graphic-novel|modern-life|characters|slice-of-life"],
|
176 |
+
["Watterson","Bill","friendship|American|characters|nostalgia|colorful"],
|
177 |
+
["Whistler","James Abbott McNeill","whimsical|low-contrast|American|tonalism|portraits|etching|tonalism|interiors"],
|
178 |
+
["Woodring","Jim","surrealism|comics|American|fantasy|characters|pen-and-ink|psychedelic|dream-like|aliens|creatures"],
|
179 |
+
["Nielsen","Kay","Fantasy|Exoticism|fantasy|orientalism|Illustration|Graphic-design|Painting"],
|
180 |
+
["Nesterov","Mikhail","Religion|Spirituality|religion|Figurative|Romanticism|Painting"],
|
181 |
+
["Bloch","Albert","Satire|Social-commentary|Impressionism|Realism|Painting|Engraving"],
|
182 |
+
["Kawase","Hasui","Plein-air|Slice-of-life|landscapes|ukiyo-e|Printmaking"],
|
183 |
+
["Fontana","Franco","Conceptual|Metamorphosis|abstract|Spatialism|Painting|Sculpture"],
|
184 |
+
["Stelfreeze","Brian","Activism|Social-realism|comics|Illustration|contemporary|digital"],
|
185 |
+
["Hughes","Nicholas","Surreal|Symbolist|Realism|figurativism|Painting"],
|
186 |
+
["Ditlev","Jan","Dreams|landscapes|Realism|Painting|Printmaking"],
|
187 |
+
["Szukalski","Stanisław","Metaphysics|Mysticism|Surrealism|primitivism|Sculpture"],
|
188 |
+
["Ancher","Helga","Observational|Slice-of-life|Realism|impressionism|Painting"],
|
189 |
+
["MacDonald","Frances","Allegory|Nostalgia|landscapes|impressionism|Painting"],
|
190 |
+
["Flint","Alex Russell","Social-commentary|Environmentalism|abstract|abstract-Expressionism|Painting|Illustration"],
|
191 |
+
["Pasquini","Alice","Documentary|Social-realism|Public-Art|contemporary|Street-art|Mural-painting"],
|
192 |
+
["Grimly","Gris","dark|comics|Whimsical|fantasy|Surrealism|Illustration"],
|
193 |
+
["Smith","Samantha Keely","Dream-like|Loneliness|abstract|abstract-Expressionism|contemporary|Painting"],
|
194 |
+
["Semenov","Anton","Surreal|Symbolist|Surrealism|shock-art|digital|Painting"],
|
195 |
+
["Podolchak","Ihor","Metaphysics|Surrealism|underground|Film|Painting"],
|
196 |
+
["Rousse","Georges","Femininity|Mysticism|Impressionism|Neo-Impressionism|Post-Impressionism|Painting"],
|
197 |
+
["Vrubel","Mikhail","Symbolist|Religion|Painting|Sculpture"],
|
198 |
+
["Biddle","George","politics|Activism|Impressionism|contemporary|Painting|Illustration"],
|
199 |
+
["Pissarro","Camille","impressionism|Observational|Impressionism|Painting|Printmaking"],
|
200 |
+
["Selimoglu","Niyazi","Exoticism|Futurism|Geometric|Orientalism|Painting|Printmaking"],
|
201 |
+
["Sidibé","Malick","Documentary|Slice-of-life|Harlem-Renaissance|Photography"],
|
202 |
+
["the Elder","Lucas Cranach","Religion|Allegory|religion|Renaissance|Painting"],
|
203 |
+
["Manabe","Johji","Science-fiction|Metamorphosis|abstract|contemporary|Illustration"],
|
204 |
+
["Tarnowski","Artur","Symbolist|Nostalgia|Realism|Romanticism|Painting"],
|
205 |
+
["Garcin","Gilbert","Surreal|Conceptual|abstract|contemporary|Sculpture|Installation"],
|
206 |
+
["Smilde","Berndnaut","Surreal|Metamorphosis|installation|installation|Installation|Photography"],
|
207 |
+
["Ladrönn","José","Fantasy|Science-fiction|comics|comics|Illustration"],
|
208 |
+
["Shatseva","Tanya","Russian|Surrealism|eerie|contemporary|Painting"],
|
209 |
+
["Tessari","Vittorio","Satire|Social-commentary|abstract|Realism|Painting"],
|
210 |
+
["Cruz-Diez","Carlos","Conceptual|illusion|Kinetic|Light-art"],
|
211 |
+
["Bak","Karol","Conceptual|Metamorphosis|Impressionism|contemporary|Painting"],
|
212 |
+
["Robinson","Charles","Satire|politics|Realism|Painting"],
|
213 |
+
["Korovin","Konstantin","impressionism|Plein-air|Impressionism|Painting"],
|
214 |
+
["Rattner","Abraham","expressionism|Symbolist|Expressionism|Painting|Sculpture"],
|
215 |
+
["Hamilton","Richard","Pop-art|Consumerism|Pop-Art|Mixed-media"],
|
216 |
+
["Toraji","","Commercial-art|Sculpture|Installation"],
|
217 |
+
["Shinkai","Makoto","Slice-of-life|Fleeting-moments|manga-anime|contemporary|Film"],
|
218 |
+
["Aldridge","Miles","Femininity|Consumerism|Pop-Art|Pop-art|Illustration"],
|
219 |
+
["Rydingsvard","Ursula von","Metamorphosis|abstract|Minimalism|Sculpture"],
|
220 |
+
["Whitaker","William","Documentary|Social-realism|landscapes|contemporary|Painting"],
|
221 |
+
["Weissenbruch","Hendrik","Plein-air|Observational|landscapes|Painting"],
|
222 |
+
["Wilkes","Cathy","Activism|Social-commentary|Surrealism|contemporary|Photography"],
|
223 |
+
["Rocafort","Kenneth","illustration|Science-fiction|comics|Fantasy|contemporary|Illustration|Graphic-novel"],
|
224 |
+
["Knight","Nick","Fantasy|Adventure|Surrealism|Pop-art|Illustration"],
|
225 |
+
["Jensen","Georg","Symbolist|Plein-air|Realism|Painting"],
|
226 |
+
["Hobbema","Meindert","Observational|Plein-air|landscapes|Dutch-Golden-Age|Painting"],
|
227 |
+
["Khnopff","Fernand","Symbolist|metaphysics|Painting|Sculpture"],
|
228 |
+
["Carte","Anto","Dream-like|Fantasy|abstract|contemporary|Painting"],
|
229 |
+
["the Elder","Lorenzo Costa","Religion|Allegory|religion|Renaissance|Painting"],
|
230 |
+
["Broom","Lee","Activism|Social-commentary|abstract|Harlem-Renaissance|Painting"],
|
231 |
+
["the Elder","Jan van Kessel","Observational|Allegory|Still-Life|Nature|Baroque|Painting"],
|
232 |
+
["Mendoza","Eddie","Consumerism|Commercial-art|urban-life|underground|Painting"],
|
233 |
+
["Prendergast","Maurice","impressionism|Observational|Impressionism|Painting"],
|
234 |
+
["Ohman","Jack","Satire|politics|comics|Illustration|contemporary|Painting"],
|
235 |
+
["Killion","Tom","Plein-air|Observational|landscapes|contemporary|Printmaking"],
|
236 |
+
["Roybal","Antonio","Social-realism|Slice-of-life|Social-Realism|contemporary|Painting"],
|
237 |
+
["Solomon","Simeon","Symbolist|Metaphysics|abstract|contemporary|Painting"],
|
238 |
+
["Thomas","Mickalene","Femininity|Identity-exploration|Collage|Portraits|contemporary|Painting|Photography"],
|
239 |
+
["Ozeri","Yigal","Observational|Slice-of-life|Realism|contemporary|Painting"],
|
240 |
+
["Picabia","Francis","Dadaism|Surreal|Dadaism|Surrealism|Painting"],
|
241 |
+
["Aagaard","Zacharias Martin","Observational|Slice-of-life|landscapes|Romanticism|Painting"],
|
242 |
+
["Tindle","David","Symbolist|Metaphysics|Surrealism|contemporary|Sculpture"],
|
243 |
+
["Dossena","Emilio Giuseppe","Conceptual|metaphysics|abstract|contemporary|Sculpture"],
|
244 |
+
["Ketner","Jeremiah","Activism|Social-commentary|abstract|contemporary|Painting"],
|
245 |
+
["Lagorio","Lev","Plein-air|Observational|landscapes|Realism|Painting"],
|
246 |
+
["Britenbucher","Renie","Fleeting-moments|Observational|Portraits|contemporary|Painting"],
|
247 |
+
["Holloway","Zena","Photography|British|underwater|animals|portraits"],
|
248 |
+
["Pinturicchio","","Painting|Renaissance|Religion|Allegory"],
|
249 |
+
["Cold","Chris","Activism|Social-commentary|Land-Art|contemporary|Painting"],
|
250 |
+
["Spriggs","Ian","Surreal|Symbolist|Illustration|contemporary|Painting"],
|
251 |
+
["Marcela-Froideval","François","Fantasy|Science-fiction|contemporary|Graphic-novel"],
|
252 |
+
["Caniglia","Jeremy","dark|Satire|Surrealism|contemporary|Painting"],
|
253 |
+
["Nagy","Tibor","Symbolist|metaphysics|abstract|contemporary|Sculpture"],
|
254 |
+
["Münter","Gabriele","expressionism|Symbolist|Expressionism|Painting"],
|
255 |
+
["Fouquet","Jean","Religion|Allegory|Renaissance|renaissance|Painting"],
|
256 |
+
["Gorky","Arshile","Surreal|Symbolist|abstract-Expressionism|Surrealism|Painting|Drawing"],
|
257 |
+
["Raphael","","Renaissance|Painting"],
|
258 |
+
["Ross","Bob","Commercial-art|Consumerism|landscapes|contemporary|Painting"],
|
259 |
+
["Mosina","Inna","Femininity|Identity-exploration|Ballet|Photography|contemporary|Sculpture"],
|
260 |
+
["Disney","Walt","Fantasy|Adventure|Cartoon|contemporary|Animation"],
|
261 |
+
["Lasdun","Denys","Architecture|metaphysics|Architecture|contemporary"],
|
262 |
+
["Ravesteyn","Jan van","Observational|Plein-air|Baroque|Architecture|Sculpture"],
|
263 |
+
["HUSH","","Street-art|Activism|Painting"],
|
264 |
+
["Heysen","Nora","Femininity|Consumerism|landscapes|contemporary|Painting"],
|
265 |
+
["Fumito","Ueda","Dream-like|Surreal|video-games|contemporary|Video-art"],
|
266 |
+
["Watts","James Thomas","Symbolist|Allegory|Victorian|Painting"],
|
267 |
+
["Saarinen","Eero","Architecture|metaphysics|modern|Modern|Architecture"],
|
268 |
+
["Fautrier","Jean","Metaphysics|abstract-expressionism|Painting|Sculpture"],
|
269 |
+
["Davis","Jim","comics|Satire|comics|Illustration|contemporary"],
|
270 |
+
["Taaffe","Philip","Surreal|Symbolist|abstract|contemporary|Painting"],
|
271 |
+
["Permeke","Constant","expressionism|Symbolist|Expressionism|Painting|Sculpture"],
|
272 |
+
["Qwek","Dom","Fantasy|Adventure|contemporary|Illustration"],
|
273 |
+
["Solomon","Barbara Stauffacher","Pop-art|Commercial-art|Graphic-Design|contemporary|Graphic-design"],
|
274 |
+
["Vivanco","Kelly","Femininity|Consumerism|Sculpture|contemporary|Photography"],
|
275 |
+
["Grasso","Laurent","Surreal|Conceptual|Surrealism|contemporary|Sculpture"],
|
276 |
+
["Francés","Victoria","expressionism|Metaphysics|abstract|contemporary|Painting"],
|
277 |
+
["Fegredo","Duncan","Fantasy|Adventure|comics|contemporary|Illustration"],
|
278 |
+
["Shwedoff","Yuri","Surreal|Fantasy|contemporary|Illustration"],
|
279 |
+
["Nicholson","William","Observational|Slice-of-life|abstract|Modern|Painting"],
|
280 |
+
["Cotton","Olive","Australian|Modern|photography"],
|
281 |
+
["Clausen","George","Observational|Plein-air|Realism|Painting"],
|
282 |
+
["Howitt","Alex","Fleeting-moments|Slice-of-life|Illustration|contemporary|Painting"],
|
283 |
+
["Cormon","Fernand","impressionism|Observational|Realism|Painting"],
|
284 |
+
["Sueur","Eustache Le","impressionism|Fleeting-moments|portraits|Baroque|Painting"],
|
285 |
+
["Williams","Kyffin","Surreal|Symbolist|landscapes|contemporary|Painting"],
|
286 |
+
["Hegarty","Valerie","Social-commentary|metamorphosis|sculpture|Painting"],
|
287 |
+
["Telgemeier","Raina","autobiographical|Slice-of-life|comics|graphic-novel|contemporary|Graphic-novel"],
|
288 |
+
["Mashkov","Ilya","expressionism|Symbolist|russian|painting"],
|
289 |
+
["Steinlen","Théophile","Observational|Allegory|Art-Nouveau|Printmaking"],
|
290 |
+
["Bissell","Robert","impressionism|Plein-air|Wildlife|contemporary|Painting"],
|
291 |
+
["Lhote","André","Symbolist|impressionism|Cubism|Painting"],
|
292 |
+
["Morris","Sarah","Femininity|Identity-exploration|abstract|contemporary|Painting"],
|
293 |
+
["Truitt","Anne","minimalism|Conceptual|Minimalism|Sculpture"],
|
294 |
+
["Launay","Melissa","Surreal|Symbolist|abstract|contemporary|Painting"],
|
295 |
+
["Roy","Pierre","impressionism|Observational|abstract|contemporary|Painting"],
|
296 |
+
["Jiaying","He","Femininity|Identity-exploration|Realism|contemporary|Painting"],
|
297 |
+
["Achenbach","Andreas","Plein-air|Observational|landscapes|Romanticism|Painting"],
|
298 |
+
["Barnet","Will","Activism|Social-commentary|abstract|contemporary|Painting"],
|
299 |
+
["Bellotto","Bernardo","Observational|Plein-air|landscapes|Rococo|Painting"],
|
300 |
+
["Bernini","Gian Lorenzo","Religion|Allegory|Baroque|Sculpture"],
|
301 |
+
["Herriman","George","Satire|politics|comics|contemporary|Illustration"],
|
302 |
+
["Wooten","Ben","Femininity|Identity-exploration|abstract|contemporary|Painting"],
|
303 |
+
["Sudworth","Anne","Femininity|Metaphysics|landscapes|contemporary|Illustration"],
|
304 |
+
["Belkina","Katerina","Femininity|Identity-exploration|portraits|contemporary|Photography"],
|
305 |
+
["Parrish","Maxfield","Fantasy|Nostalgia|Art-Nouveau|Painting"],
|
306 |
+
["Fleischer","Max","comics|dark|Animation|contemporary"],
|
307 |
+
["Oshii","Mamoru","Science-fiction|Metaphysics|manga-anime|contemporary|Animation"],
|
308 |
+
["Etchells","Tim","Conceptual|metaphysics|conceptual|contemporary|Painting"],
|
309 |
+
["Mutu","Wangechi","Feminism|Identity-exploration|Collage|contemporary|Mixed-media"],
|
310 |
+
["Chambers","Tom","Fleeting-moments|Observational|abstract|contemporary|Illustration"],
|
311 |
+
["Maillol","Aristide","Surreal|metaphysics|modern|Art-Nouveau|Sculpture"],
|
312 |
+
["the Younger","Hans Holbein","Anthropoformism|portraits|Renaissance|Painting"],
|
313 |
+
["Werkman","H.N.","activism|Typography|Printmaking"],
|
314 |
+
["Seliger","Mark","Anxiety|Metaphysics|Portraits|Photography|contemporary|Photography"],
|
315 |
+
["Loughridge","Lee","autobiographical|Conceptual|abstract|contemporary|Illustration"],
|
316 |
+
["Andreev","Alex","Death|Displacement|Surrealism|contemporary|Painting"],
|
317 |
+
["Zerbe","Karl","Documentary|Dreams|Surrealism|Expressionism|Painting"],
|
318 |
+
["Addams","Charles","Social-commentary|Cartoon|contemporary|Illustration"],
|
319 |
+
["Castelfranco","Giorgio Barbarelli da","Environmentalism|Fantasy|Rococo|Renaissance|Painting"],
|
320 |
+
["Fuke","Ryohei","Fleeting-moments|Identity-exploration|landscapes|contemporary|Painting"],
|
321 |
+
["Gahō","Hashimoto","Kitsch|Politics|Printmaking|ukiyo-e"],
|
322 |
+
["Bergland","Don","Religion|Social-realism|landscapes|contemporary|Photography"],
|
323 |
+
["Manara","Milo","Controversy|Femininity|erotica|Comics|Illustration"],
|
324 |
+
["Guanzhong","Wu","Feminism|Homo-eroticism|landscapes|contemporary|Illustration"],
|
325 |
+
["Johns","Jasper","Dream-like|Mysticism|abstract-Expressionism|Painting|Printmaking"],
|
326 |
+
["Kelsner","Alfred","Metamorphosis|Surreal|abstract|contemporary|Painting"],
|
327 |
+
["Mulready","Augustus Edwin","Symbolist|Commercial-art|Realism|Romanticism|Painting"],
|
328 |
+
["Moonan","John","Nostalgia|Slice-of-life|abstract|contemporary|Painting"],
|
329 |
+
["Dauterman","Russell","Observational|Plein-air|comics|superheroes|contemporary|Illustration"],
|
330 |
+
["Vogelsang","Elke","abstract|contemporary|Painting"],
|
331 |
+
["Ledroit","Olivier","comics|Fantasy|fantasy|Illustration"],
|
332 |
+
["Casson","A. J.","Mathematics|Punk|landscapes|contemporary|Painting"],
|
333 |
+
["Gray","Eileen","Friendship|Loneliness|abstract|contemporary|Painting"],
|
334 |
+
["Olsen","Greg","outer-space|Spirituality|Wildlife|contemporary|Painting"],
|
335 |
+
["Jover","Loui","eerie|satire|Illustration|contemporary"],
|
336 |
+
["Veeber","Kuno","Science-fiction|Exoticism|abstract|contemporary|Painting"],
|
337 |
+
["Musgrove","Scott","Adventure|Advertising|landscapes|contemporary|Illustration"],
|
338 |
+
["Munnings","Alfred","horses|modern|Painting"],
|
339 |
+
["Abbott","Elenore","fantasy|watercolor|art-nouveau|dream-like|ethereal|romanticism|pastel-colors|femininity|mythology"],
|
340 |
+
["Anderson","Richard","digital|fantasy|dark|messy|surreal|gothic|horror|psychedelic"],
|
341 |
+
["Argyle","Steve","fantasy|characters|whimsical|colorful|cartoon|playful"],
|
342 |
+
["Bagshaw","Tom","characters|dark|fantasy|surreal|horror|eerie|melancholy|dark"],
|
343 |
+
["Balaskas","Christopher","vibrant|digital|landscapes|science-fiction|futuristic|eerie|outer-space"],
|
344 |
+
["Bana","Benedick","characters|science-fiction|messy|monochromatic|3D-rendering|grungy|industrial|cyberpunk|dystopia"],
|
345 |
+
["Barker","Cicely Mary","fantasy|whimsical|characters|folklore|magic|magic|nostalgia"],
|
346 |
+
["Barlowe","Wayne","science-fiction|fantasy|dark|alien-worlds|alien-worlds|dystopia|mythology|creatures|eerie"],
|
347 |
+
["Bautista","Chiara","fantasy|dark|whimsical|dream-like|mysterious|surreal|magic|illusion"],
|
348 |
+
["Bean","Alan","science-fiction|outer-space|metaphysics|astronaut|painting"],
|
349 |
+
["Becket-Griffith","Jasmine","fantasy|portraits|whimsical|vibrant|gothic|fairies|magic|romanticism"],
|
350 |
+
["Bell","Julie","fantasy|nature|dragons|magic|mythology|magic|magic|wilderness"],
|
351 |
+
["Bergsma","Jody","watercolor|fantasy|whimsical|fairies|mythology|dream-like|magical-realism|ethereal"],
|
352 |
+
["Berkey","John","fantasy|science-fiction|eerie|outer-space|futuristic"],
|
353 |
+
["Bilal","Enki","science-fiction|comics|cyberpunk|urban-life|grungy|futuristic|dystopia|surreal"],
|
354 |
+
["Binkley","Ed","fantasy|mythology|dream-like|magic|ethereal|mythology|whimsical"],
|
355 |
+
["Bogle","Lee","portraits|fantasy|surreal|dream-like|eerie|ethereal"],
|
356 |
+
["Bonestell","Chesley","science-fiction|alien-worlds|outer-space|futuristic"],
|
357 |
+
["Bosma","Sam","cartoon|comics|fantasy|characters|playful|whimsical|colorful|animation"],
|
358 |
+
["Bosschart","Johfra","whimsical|fantasy|surreal|dream-like|magic|mythology|ethereal|dream-like"],
|
359 |
+
["Boulet","Susan Seddon","fantasy|magical-realism|nature|whimsical|ethereal|magic|dream-like|femininity"],
|
360 |
+
["Bowater","Charlie","fantasy|digital|portraits|characters|dark|gothic|eerie"],
|
361 |
+
["Bradley","Noah","dark|landscapes|fantasy|eerie|dark|dark|eerie|eerie|eerie"],
|
362 |
+
["Briclot","Aleksi","fantasy|dark|grungy|dystopia|horror|gothic"],
|
363 |
+
["Brom","Gerald","dark|fantasy|horror|gothic|horror|dark|eerie|horror"],
|
364 |
+
["Brooks","Mark","comics|fantasy|science-fiction"],
|
365 |
+
["Brown","Patrick","fantasy|comics|colorful"],
|
366 |
+
["Burdisio","Alejandro","digital|landscapes|fantasy|science-fiction|dark|atmospheric|eerie|magic|eerie"],
|
367 |
+
["Burns","Jim","science-fiction|characters|cyberpunk|grungy|urban-life|dark|futuristic|dystopia|noir"],
|
368 |
+
["Cai","Zhichao","fantasy|digital|whimsical|dream-like|magic|ethereal|surreal"],
|
369 |
+
["Caldwell","Clyde","fantasy|science-fiction|mythology|female-figures|pulp"],
|
370 |
+
["Callebaut","Vincent","architecture|science-fiction|3D-rendering|futuristic|surreal|fantasy|cyberpunk|utopia|dystopia"],
|
371 |
+
["Canete","Eric","fantasy|characters|messy|ethereal|whimsical|vibrant"],
|
372 |
+
["Carman","Bill","fantasy|pop-art|surrealism|colorful|whimsical|playful|vibrant|psychedelic"],
|
373 |
+
["Chen","Bo","fantasy|magic|whimsical|dream-like|magic|ethereal|magic|illusion"],
|
374 |
+
["Christensen","James C.","whimsical|fantasy|mythology|ethereal|mysterious|magic|dream-like"],
|
375 |
+
["Clark","Amanda","fantasy|landscapes|characters|watercolor|dream-like|magic|whimsical|ethereal"],
|
376 |
+
["Corben","Richard","science-fiction|horror|comics|dark|horror|dark|eerie|horror"],
|
377 |
+
["Dean","Roger","landscapes|fantasy|science-fiction|magic|eerie|dream-like|ethereal"],
|
378 |
+
["Deharme","Lise","fantasy|whimsical|dream-like|magic|ethereal|magic|dream-like|surreal"],
|
379 |
+
["Dell'otto","Gabriele","comics|fantasy|colorful"],
|
380 |
+
["Delort","Nicolas","monochromatic|fantasy|dark|gothic|horror|dark|eerie|labyrinths"],
|
381 |
+
["Delville","Jean","fantasy|surrealism|dream-like|magic|metaphysics"],
|
382 |
+
["Demizu","Posuka","manga-anime|fantasy|whimsical|colorful|playful|vibrant|adventure|contemporary|illustration"],
|
383 |
+
["Deschambault","Martin","digital|landscapes|science-fiction|eerie|eerie|minimalism|atmospheric|mysterious|futuristic"],
|
384 |
+
["Deschamps","Eric","fantasy|science-fiction|digital|surreal"],
|
385 |
+
["Detmold","Charles Maurice","fantasy|watercolor|art-nouveau|ethereal|mythology|magic|opulent|dream-like"],
|
386 |
+
["Detmold","Edward Julius","fantasy|watercolor|art-nouveau|ethereal|mythology|magic|opulent|dream-like"],
|
387 |
+
["DiTerlizzi","Tony","fantasy|whimsical|magic|magic|magic|vibrant|playful"],
|
388 |
+
["Dittmann","Anna","portraits|fantasy|digital|ethereal|dream-like|mysterious"],
|
389 |
+
["Dorman","Dave","science-fiction|horror|fantasy|photorealism|dark|horror|dark"],
|
390 |
+
["Drysdale","TJ","photography|fantasy|landscapes|magic|dream-like|ethereal|eerie|magic"],
|
391 |
+
["Earle","Eyvind","magical-realism|magic-realism|fantasy|high-contrast|dream-like|whimsical|surreal|colorful"],
|
392 |
+
["Easley","Jeff","fantasy"],
|
393 |
+
["Edlin","Tyler","fantasy|digital|landscapes|dream-like|ethereal|magic|whimsical|magic|magic"],
|
394 |
+
["Edmiston","Jason","fantasy|horror|characters|portraits|illustration|dark|eerie|monochromatic|ethereal"],
|
395 |
+
["Edwards","Les","science-fiction|horror|fantasy|illustration|outer-space|creatures|dark|horror"],
|
396 |
+
["Eggleton","Bob","science-fiction|fantasy|horror|illustration|aliens|landscapes|colorful|dream-like"],
|
397 |
+
["Ejsing","Jesper","fantasy|illustration|characters|mythology|whimsical|magic|adventure"],
|
398 |
+
["Ellger","Christine","fantasy|magical-realism|illustration|dream-like|folklore|ethereal|surreal"],
|
399 |
+
["Ellis","Dean","science-fiction|vibrant|illustration|cyberpunk|futuristic|technology|neon"],
|
400 |
+
["Elmore","Larry","fantasy|illustration|superheroes|fantasy|medieval|battle-scenes"],
|
401 |
+
["Elorza","Joseba","photography|surrealism|collage|science-fiction|outer-space|dream-like|abstract"],
|
402 |
+
["Elson","Peter","science-fiction|outer-space|illustration|space-ships|robots-cyborgs|futuristic"],
|
403 |
+
["Emshwiller","Ed","science-fiction|illustration|outer-space|aliens|pulp|colorful"],
|
404 |
+
["Eng","Kilian","digital|landscapes|science-fiction|fantasy|atmospheric"],
|
405 |
+
["Engle","Jason A.","fantasy|science-fiction|dark|illustration|creatures|dark|dark"],
|
406 |
+
["Fabry","Glenn","fantasy|science-fiction|comics|illustration|grungy|violence"],
|
407 |
+
["Fairhurst","Andy","science-fiction|fantasy|horror|digital|illustration|eerie|horror"],
|
408 |
+
["Falero","Luis Ricardo","figurativism|fantasy|nudes|painting|dream-like|romanticism|erotica"],
|
409 |
+
["Fate","Vincent Di","science-fiction|fantasy|illustration|outer-space|eerie|futuristic|outer-space"],
|
410 |
+
["Ferez","Andrew","surrealism|fantasy|illustration|dream-like|fragmentation|eerie"],
|
411 |
+
["Finch","David","comics|fantasy|illustration|superheroes|grungy|noir"],
|
412 |
+
["Finlay","Virgil","comics|science-fiction|fantasy|horror|dark|high-contrast|pulp|eerie"],
|
413 |
+
["Finnstark","Anato","digital|fantasy|illustration|whimsical|magic|colorful|magic|playful"],
|
414 |
+
["Fitzgerald","John Anster","fantasy|whimsical|illustration|folklore|pastel|magic"],
|
415 |
+
["Foss","Chris","vibrant|science-fiction|outer-space|illustration|psychedelic|alien-worlds|psychedelic"],
|
416 |
+
["Frazetta","Frank","fantasy|dark|illustration|barbarians|muscles"],
|
417 |
+
["Freas","Kelly","science-fiction|fantasy|illustration|adventure|eerie|eerie|colorful"],
|
418 |
+
["Froud","Brian","fantasy|dark|whimsical|illustration|fairies|mythology|magic|magic"],
|
419 |
+
["Froud","Wendy","fantasy|dark|whimsical|illustration|fairies|mythology|magic|magic"],
|
420 |
+
["Gaughan","Jack","science-fiction|vibrant|illustration|aliens|outer-space|colorful|alien-worlds"],
|
421 |
+
["Gerard","Justin","fantasy|whimsical|illustration|dream-like|folklore|magic|magic"],
|
422 |
+
["Giancola","Donato","fantasy|science-fiction|illustration|mythology|painting"],
|
423 |
+
["Giger","H.R.","science-fiction|dark|monochromatic|painting|surreal|robots-cyborgs|horror"],
|
424 |
+
["Giraud","Jean","comics|psychedelic|surrealism|fantasy|science-fiction|illustration|dream-like|psychedelic"],
|
425 |
+
["Gonzalez","Josan","science-fiction|illustration|cyberpunk|futuristic|technology|grungy|atmospheric"],
|
426 |
+
["Guay","Rebecca","watercolor|digital|fantasy|illustration|dream-like|ethereal|magic"],
|
427 |
+
["Guidice","Rick","science-fiction|illustration|space-ships|outer-space|adventure"],
|
428 |
+
["Gurney","James","fantasy|landscapes|illustration|realism|painting|atmospheric|magic"],
|
429 |
+
["Gustafson","Scott","magic-realism|whimsical|kids-book|fantasy|illustration|playful|colorful"],
|
430 |
+
["Hardy","David A.","landscapes|science-fiction|illustration|outer-space"],
|
431 |
+
["Harris","John","dark|science-fiction|outer-space|messy|illustration|dark|dystopia|grungy"],
|
432 |
+
["Hase","Ryohei","magical-realism|surrealism|fantasy|digital|illustration|dream-like|ethereal|mysterious"],
|
433 |
+
["Hideyoshi","Lorenz","digital|science-fiction|illustration|cyberpunk|futuristic|dark|neon|dystopia"],
|
434 |
+
["Hildebrandt","Brothers","fantasy|vibrant|illustration|superheroes|painting"],
|
435 |
+
["Hong","Kuang","fantasy|digital|dark|illustration|mythology|dark|eerie"],
|
436 |
+
["Horkey","Aaron","fantasy|comics|illustration|etching|decorative"],
|
437 |
+
["Horley","Alex","fantasy|dark|characters|illustration|dark|dark|grungy|horror"],
|
438 |
+
["Horsley","Ralph","science-fiction|fantasy|whimsical|vibrant|dark|high-contrast|colorful|monochromatic|geometric|angular"],
|
439 |
+
["Howe","John","fantasy|dark|eerie|portraits|landscapes|nature|characters"],
|
440 |
+
["Huang","Shilin","fantasy|characters|dream-like|mysterious|magic|mythology"],
|
441 |
+
["Hughes","Edward Robert","romanticism|characters|fantasy|impressionism|whimsical|dream-like|ethereal|nostalgia"],
|
442 |
+
["Hutter","Michael","surrealism|fantasy|science-fiction|dream-like|horror|surreal|eerie"],
|
443 |
+
["Jansson","Alexander","fantasy|whimsical|dark|dream-like|mythology|surreal"],
|
444 |
+
["Jean","James","fantasy|mythology|colorful|mysterious"],
|
445 |
+
["Jia","Ruan","digital|portraits|fantasy|dark|colorful|futuristic|surreal"],
|
446 |
+
["Jones","Jeffrey Catherine","fantasy|figurativism|realism"],
|
447 |
+
["Jones","Peter Andrew","science-fiction|fantasy|futuristic|eerie|alien-worlds|outer-space"],
|
448 |
+
["Jusko","Joe","comics|fantasy"],
|
449 |
+
["Kaluta","M.W.","fantasy|whimsical|romanticism|nostalgia|victorian|dream-like|ethereal"],
|
450 |
+
["Karcz","Michal","landscapes|fantasy|science-fiction|photography|futuristic|surreal|eerie"],
|
451 |
+
["Katsuya","Terada","manga-anime|fantasy|portraits|colorful|magic"],
|
452 |
+
["Kelly","Ken","fantasy|characters|mythology|vibrant|whimsical"],
|
453 |
+
["Kikuchi","Hideyuki","horror|fantasy|manga-anime|dark|eerie|dark|eerie"],
|
454 |
+
["Kirby","Jack","comics|science-fiction"],
|
455 |
+
["Koike","Kazuo","manga-anime|comics|fantasy"],
|
456 |
+
["Kon","Satoshi","whimsical|high-contrast|fantasy|manga-anime|surreal|dream-like"],
|
457 |
+
["Kutsche","Michael K","characters|fantasy|dark|whimsical|dream-like|mysterious|mythology"],
|
458 |
+
["Kuvshinov","Ilya","vibrant|digital|fantasy|manga-anime|dream-like|romanticism|ethereal|surreal"],
|
459 |
+
["Lacoste","Raphael","fantasy|landscapes|dark|mysterious|atmospheric|eerie|dream-like"],
|
460 |
+
["Langley","Clint","comics|fantasy|digital|dark|grungy|urban-life|dystopia|noir"],
|
461 |
+
["Lecouffe-Deharme","Bastien","digital|dark|fantasy|characters|surreal|ethereal|magic"],
|
462 |
+
["Lee","Alan","fantasy|romanticism|dream-like|nostalgia|mythology|whimsical|ethereal"],
|
463 |
+
["Lehr","Paul","science-fiction|fantasy|vibrant|colorful|high-contrast|futuristic|eerie|surreal"],
|
464 |
+
["Lewandowski","Mariusz","fantasy|surrealism|dark|dream-like|mysterious|eerie"],
|
465 |
+
["Liefeld","Rob","comics|science-fiction|fantasy"],
|
466 |
+
["Madureira","Joe","comics|fantasy"],
|
467 |
+
["Maitz","Don","science-fiction|fantasy|eerie|futuristic|surreal"],
|
468 |
+
["Maleev","Alex","comics|fantasy|high-contrast|dark|dark|noir"],
|
469 |
+
["Maniak","Slawomir","fantasy|dark|surreal|dream-like|eerie|mysterious|dark"],
|
470 |
+
["Manzanedo","Antonio J.","fantasy|dark|characters|mysterious|dark"],
|
471 |
+
["Mars","Chris","surrealism|dark|fantasy|dream-like|eerie|eerie|abstract"],
|
472 |
+
["Martinière","Stephan","science-fiction|fantasy|landscapes|dark|futuristic|surreal|atmospheric"],
|
473 |
+
["Matthews","Rodney","fantasy|science-fiction|futuristic|eerie|colorful"],
|
474 |
+
["Mattingly","David B.","science-fiction|fantasy|eerie|futuristic|surreal|vibrant"],
|
475 |
+
["Mayhew","Mike","comics|fantasy|portraits"],
|
476 |
+
["McCaffrey","Anne","dragons|fantasy|science-fiction|mythology|adventure|magic"],
|
477 |
+
["McCall","Robert","science-fiction|outer-space|futuristic"],
|
478 |
+
["McFarlane","Todd","comics|fantasy|dark"],
|
479 |
+
["McKie","Angus","vibrant|science-fiction|fantasy|futuristic"],
|
480 |
+
["McPharlin","Dan","science-fiction|vibrant|surrealism|abstract|dream-like|ethereal|magic"],
|
481 |
+
["McQuarrie","Ralph","science-fiction|landscapes|eerie|futuristic"],
|
482 |
+
["McQue","Ian","science-fiction|fantasy|messy|grungy|dark|grungy|surreal"],
|
483 |
+
["Mead","Syd","science-fiction|abstract|angular|futuristic|minimalism|technology|modern"],
|
484 |
+
["Minguez","Victor Adame","fantasy|characters|digital|colorful|whimsical|mysterious"],
|
485 |
+
["Moebius","","comics|psychedelic|surrealism|fantasy|science-fiction|dream-like"],
|
486 |
+
["Mohrbacher","Peter","surrealism|fantasy|dark|whimsical|dream-like|ethereal|mythology"],
|
487 |
+
["Monge","Jean-Baptiste","dark|fantasy|surreal|eerie|mysterious|dark"],
|
488 |
+
["Moore","Alan","comics|dark|science-fiction|horror|fantasy|vibrant|dystopia|grungy|noir"],
|
489 |
+
["Moore","Chris","science-fiction|high-contrast|cyberpunk|dystopia|technology|futuristic"],
|
490 |
+
["Moore","Tony","comics|horror|science-fiction|magic|gothic|eerie|mythology|magic"],
|
491 |
+
["Mullins","Craig","dark|fantasy|surrealism|mythology|dream-like|horror"],
|
492 |
+
["Mumford","Dan","digital|vibrant|fantasy|psychedelic|surrealism|colorful|dreams|psychedelic"],
|
493 |
+
["Nasmith","Ted","fantasy|landscapes|ethereal|magic|mythology|atmospheric"],
|
494 |
+
["Nauck","Todd","comics|characters|science-fiction|superheroes|adventure"],
|
495 |
+
["Nerdrum","Odd","dark|characters|fantasy|figurative|melancholy"],
|
496 |
+
["Nihei","Tsutomu","manga-anime|science-fiction|dark|monochromatic|cyberpunk|dystopia|industrial|alien-worlds"],
|
497 |
+
["Nirasawa","Yasushi","fantasy|characters|dark|creatures|mythology|monsters"],
|
498 |
+
["Nizovtsev","Victor","magical-realism|vibrant|whimsical|fantasy|magic|mysterious|dream-like|surreal"],
|
499 |
+
["Norem","Earl","fantasy|dark|battle-scenes|mythology"],
|
500 |
+
["Oakes","Terry","fantasy|science-fiction|magic|outer-space|colorful|adventure"],
|
501 |
+
["Ohrai","Noriyoshi","fantasy|science-fiction|futuristic|impressionism"],
|
502 |
+
["Okon","Marek","digital|science-fiction|dark|surreal|robots-cyborgs|horror|magic"],
|
503 |
+
["Paick","James","digital|landscapes|fantasy|science-fiction|vibrant|ethereal|eerie|immersive"],
|
504 |
+
["Parkes","Michael","magical-realism|fantasy|art-nouveau|dream-like|spirituality|ethereal"],
|
505 |
+
["Parkinson","Keith","fantasy|mythology|whimsical"],
|
506 |
+
["Pennington","Bruce","science-fiction|fantasy|vibrant|landscapes|futuristic|outer-space"],
|
507 |
+
["Razell","Aliza","photography|fantasy|surrealism|dream-like|ethereal|eerie|conceptual"],
|
508 |
+
["Rebelka","Jakub","surrealism|fantasy|dream-like|illusion"],
|
509 |
+
["Rekunenko","Valentin","fantasy|surrealism|dream-like|whimsical"],
|
510 |
+
["Rigney","Brad","fantasy|characters|dark|mythology|surreal"],
|
511 |
+
["Rocha","Andreas","digital|landscapes|fantasy|dark|atmospheric"],
|
512 |
+
["Różalski","Jakub","landscapes|fantasy|science-fiction|battle-scenes|steampunk|futuristic|dystopia"],
|
513 |
+
["Ruas","Joao","dark|comics|characters|fantasy|gothic|noir|horror"],
|
514 |
+
["Rutkowski","Greg","digital|landscapes|fantasy|dark|atmospheric|surreal|eerie|eerie"],
|
515 |
+
["Shaw","Barclay","science-fiction|dark|angular|cyberpunk|futuristic|industrial|neon"],
|
516 |
+
["Shirow","Masamune","manga-anime|cartoon|manga-anime|comics|characters|fantasy|science-fiction|robots-cyborgs"],
|
517 |
+
["Simonetti","Marc","landscapes|digital|fantasy|dark|surreal|dream-like"],
|
518 |
+
["Smith","Adrian","dark|fantasy|digital|characters|grungy|dark"],
|
519 |
+
["Sorayama","Hajime","characters|science-fiction|robots-cyborgs|futuristic|erotica|technology"],
|
520 |
+
["Sparth","","digital|fantasy|science-fiction|landscapes|futuristic|surreal|minimalism|abstract"],
|
521 |
+
["Stålenhag","Simon","landscapes|digital|science-fiction|nostalgia|rural-life|futurism|suburbia|eerie"],
|
522 |
+
["Staples","Greg","comics|fantasy|adventure|characters|colorful"],
|
523 |
+
["Stokes","Anne","fantasy|dark|characters|whimsical|mysterious|gothic|eerie"],
|
524 |
+
["Stout","William","dark|fantasy|mythology|gothic"],
|
525 |
+
["Struzan","Drew","portraits|fantasy|science-fiction|nostalgia"],
|
526 |
+
["Sum","Brian","science-fiction|digital|characters|cyberpunk|futuristic"],
|
527 |
+
["Suuronen","Matti","architecture|photography|science-fiction|futuristic|minimalism|modern|eerie"],
|
528 |
+
["Swanland","Raymond","fantasy|digital|dark|dark|eerie|atmospheric|dark"],
|
529 |
+
["Theurer","Heather","fantasy|romanticism|renaissance|ethereal|erotica|mythology|dream-like|baroque"],
|
530 |
+
["Thole","Karel","surrealism|dark|science-fiction|horror|dream-like|horror"],
|
531 |
+
["Uno","Aquirax","surreal|metaphysics|contemporary|painting|fantasy|vibrant|portraits|dream-like|abstract"],
|
532 |
+
["Urschel","Jan","dark|digital|landscapes|science-fiction|atmospheric|dark|dystopia"],
|
533 |
+
["Vacher","Christophe","cloudscapes|landscapes|fantasy|magical-realism|ethereal|dream-like"],
|
534 |
+
["Vess","Charles","fantasy|comics|magic|dream-like|mythology|whimsical|romanticism"],
|
535 |
+
["Walotsky","Ron","science-fiction|fantasy|surreal|futuristic"],
|
536 |
+
["Whelan","Michael","science-fiction|fantasy|dream-like|surreal|vibrant|eerie|outer-space|alien-worlds"],
|
537 |
+
["White","Tim","science-fiction|fantasy|landscapes|atmospheric|immersive"],
|
538 |
+
["Williams","Gilbert","fantasy|landscapes|whimsical|magic|nostalgia"],
|
539 |
+
["Williamson","Al","comics|science-fiction|fantasy|adventure|mythology"],
|
540 |
+
["Wong","Liam","photography|colorful|vibrant|science-fiction|futuristic|dystopia|urban-life"],
|
541 |
+
["Woodroffe","Patrick","science-fiction|surrealism|dream-like|illusion|eerie|eerie"],
|
542 |
+
["Zand","Amir","science-fiction|digital|vibrant|futuristic|robots-cyborgs|technology"],
|
543 |
+
];
|
544 |
+
|
545 |
+
// first category must be 'important' and last must be 'other' or things won't work
|
546 |
+
// tag names cannot be 'image-item' or 'hidden' because well, this isn't coded that well, lol
|
547 |
+
var tagCategories = [
|
548 |
+
['important'],
|
549 |
+
['mediums',"3D-rendering","animation","architecture","assemblage","body-art","book-illustration","bronze","calligraphy","caricature","cartoon","ceiling-painting","ceramics","collage","comics","digital","drawing","earthworks","enamel","engraving","etching","experiential","film","frescoes","graffiti","graphic-design","graphic-novel","illuminated-manuscripts","illustration","immersive","industrial-materials","infinity-rooms","installation","interactive","jewelry","kinetic","land-art","landscape-architecture","light-art","lithography","manga-anime","mixed-media","montage","mosaic","multimedia","mural-painting","newspaper","oil-painting","painting","pastel","pen-and-ink","performance","photography","posters","printmaking","public-art","quilting","recycled-materials","sculpture","sketching","stained-glass","street-art","tapestry","textiles","typography","video-art","video-games","wall-drawings","watercolor","woodblock-prints"],
|
550 |
+
['styles',"abstract","action-painting","African-influence","afro-futurism","angular","anthropoformism","atmospheric","blurry","bohemian","bold-colors","color-field","colorful","cute","cyberpunk","dark","decorative","delicate","drip-painting","eerie","elegant","ethereal","figurative","flat-colors","folk-art","fragmentation","futuristic","geometric","gestural","golden","gothic","grids","grungy","high-contrast","illusion","improvisation","industrial","kids-book","large-scale","long-exposure","low-contrast","opulent","magic-realism","Maximalism","melancholy","messy","miniature","monochromatic","muted-colors","mysterious","naturalist","neon","noir","observational","organic","pastel-colors","photorealism","pin-up","playful","polka-dots","precisionism","primary-colors","propaganda","psychedelic","pulp","Rococo","steampunk","text-based","vibrant","whimsical"],
|
551 |
+
['themes',"activism","adventure","advertising","allegory","anxiety","autobiographical","childhood","commercial-art","conceptual","consumerism","controversy","death","displacement","distortion","documentary","dream-like","dreams","dystopia","empowerment","environmentalism","exoticism","fantasy","femininity","feminism","fleeting-moments","folklore","friendship","futurism","homo-eroticism","horror","identity-exploration","kitsch","loneliness","magic","mathematics","metamorphosis","metaphysics","mysticism","nightlife","nostalgia","observational","plein-air","politics","punk","religion","satire","science-fiction","slice-of-life","social-commentary","solitude","spirituality","surreal","symbolist","utopia"],
|
552 |
+
['subjects',"alien-worlds","aliens","animals","ballet","barbarians","battle-scenes","BDSM","biological","botanical","cabaret","celebrity","characters","cityscapes","cloudscapes","contemporary-life","counter-culture","creatures","dancers","domestic-scenes","dragons","emaciation","erotica","everyday-life","fairies","fashion","female-figures","figure-studies","flesh","flowers","gardens","genre-scenes","great-depression","history","holocaust","horses","immigrants","insects","interiors","kabuki-yakusha-e","labyrinths","landscapes","modern-life","monsters","muscles","mythology","nature","nudes","outdoor-scenes","outer-space","plein-air","pools","pop-culture","portraits","robots-cyborgs","royalty","rural-life","seascapes","self-portraits","silhouettes","skies","Southwest","space-ships","still-life","suburbia","superheroes","technology","tropics","underwater","urban-life","violence","water-lilies","waves","wilderness","wildlife"],
|
553 |
+
['movements',"abstract-expressionism","art-deco","art-Nouveau","automatism","avant-garde","baroque","bauhaus","collaborative","cubism","cut-outs","dadaism","Dutch-golden-age","earthworks","expressionism","fauvism","figurativism","gutai","harlem-renaissance","impressionism","magical-realism","minimalism","neo-expressionism","neo-impressionism","orientalism","pointillism","pop-art","post-colonialism","post-impressionism","post-minimalism","primitivism","realism","romanticism","serial-art","shock-art","social-realism","spatialism","surrealism","tonalism","underground"],
|
554 |
+
['periods',"ancient","Ancient-Egyptian","Ancient-Greek","contemporary","Edo-period","medieval","modern","post-colonialism","post-modern","post-war","pre-raphaelite","renaissance","ukiyo-e","Victorian"],
|
555 |
+
['identities',"African","African-American","Albanian","Algerian","American","Angolan","anonymous","Argentinean","Armenian","Asian","Australian","Austrian","Azerbaijani","Bahraini","Bangladeshi","Barbadian","Belarusian","Belgian","Bengali","Bosnian","Brazilian","British","Bulgarian","Cameroonian","Canadian","Catalan","Chilean","Chinese","Colombian","CostaRican","Croatian","Cuban","Cypriot","Czech","Dane","Dominican","Dutch","Ecuadorian","Egyptian","Emirati","Estonian","Ethiopian","European","Filipino","Finnish","Flemish","French","Georgian","German","Ghanaian","Greek","Guatemalan","Guyanese","Hungarian","Icelandic","Indian","Indonesian","Iranian","Iraqi","Irish","Islamic","Israeli","Italian","Jamaican","Japanese","Jewish","Kenyan","Latvian","Lebanese","LGBTQ","Libyan","Lithuanian","Luxembourger","Macedonian","Mexican","Moldovan","Mongol","Montenegrin","Moroccan","Namibian","Native-American","New-Zealander","Nigerian","Norwegian","Palestinian","Peruvian","Polish","Portuguese","PuertoRican","Qatari","Romanian","Russian","Saudi","Scottish","Serbian","Slovak","Slovenian","SouthAfrican","SouthKorean","Spanish","Sudanese","Swedish","Swiss","Syrian","Thai","Tunisian","Turkish","Ukrainian","Uruguayan","Venezuelan","Vietnamese","Yemeni"],
|
556 |
+
['other']
|
557 |
+
];
|
index.css
ADDED
@@ -0,0 +1,722 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
html, body {
|
2 |
+
background-color: black;
|
3 |
+
color: #fff;
|
4 |
+
font-family: 'Poppins', sans-serif;
|
5 |
+
font-size: 16px;
|
6 |
+
margin: 0;
|
7 |
+
padding: 0;
|
8 |
+
height: 100%;
|
9 |
+
}
|
10 |
+
|
11 |
+
h3 {
|
12 |
+
margin: 5px;
|
13 |
+
}
|
14 |
+
|
15 |
+
h4 {
|
16 |
+
margin: 0px;
|
17 |
+
font-weight: normal;
|
18 |
+
text-align: center;
|
19 |
+
line-height: 150%;
|
20 |
+
}
|
21 |
+
|
22 |
+
#layout {
|
23 |
+
display: flex;
|
24 |
+
flex-direction: column;
|
25 |
+
height: 100%;
|
26 |
+
}
|
27 |
+
|
28 |
+
#rows {
|
29 |
+
display: flex;
|
30 |
+
flex-direction: row;
|
31 |
+
flex-grow: 1;
|
32 |
+
overflow: auto;
|
33 |
+
}
|
34 |
+
|
35 |
+
#toggles {
|
36 |
+
position: fixed;
|
37 |
+
top: 0;
|
38 |
+
left: 0;
|
39 |
+
width: calc(40% - 20px);
|
40 |
+
height: calc(100% - 80px);
|
41 |
+
display: flex;
|
42 |
+
flex-direction: column;
|
43 |
+
flex-wrap: wrap;
|
44 |
+
opacity: 1;
|
45 |
+
line-height: 140%;
|
46 |
+
padding: 20px;
|
47 |
+
overflow: auto;
|
48 |
+
transition: opacity 50ms 100ms linear;
|
49 |
+
}
|
50 |
+
|
51 |
+
#gutter {
|
52 |
+
position: fixed;
|
53 |
+
top: 0;
|
54 |
+
left: 40%;
|
55 |
+
width: 40px;
|
56 |
+
height: calc(100% - 40px);
|
57 |
+
flex-shrink: 0;
|
58 |
+
background: black;
|
59 |
+
background: linear-gradient(90deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 80%);
|
60 |
+
border-right: 1px solid #222;
|
61 |
+
}
|
62 |
+
|
63 |
+
#image-container {
|
64 |
+
display: flex;
|
65 |
+
flex-direction: row;
|
66 |
+
flex-wrap: wrap;
|
67 |
+
align-items: flex-start;
|
68 |
+
justify-content: space-around;
|
69 |
+
margin-left: calc(40% + 40px);
|
70 |
+
margin-top: 20px;
|
71 |
+
margin-bottom: 20px;
|
72 |
+
width: 100%;
|
73 |
+
}
|
74 |
+
|
75 |
+
#alert {
|
76 |
+
position: fixed;
|
77 |
+
z-index: 1;
|
78 |
+
opacity: 0;
|
79 |
+
top: 10px;
|
80 |
+
right: -52px;
|
81 |
+
padding: 10px;
|
82 |
+
color: #00ffe6;
|
83 |
+
background-color: #008679;
|
84 |
+
border: 1px solid #00ffe6;
|
85 |
+
border-radius: 3px;
|
86 |
+
box-shadow: 0 5px 20px #0000007d;
|
87 |
+
}
|
88 |
+
|
89 |
+
#alert.show {
|
90 |
+
right: 12px;
|
91 |
+
opacity: 1;
|
92 |
+
transition: all 100ms ease-in;
|
93 |
+
}
|
94 |
+
|
95 |
+
footer {
|
96 |
+
flex-shrink: 0;
|
97 |
+
padding: 5px 10px;
|
98 |
+
text-align: center;
|
99 |
+
color: #aaa;
|
100 |
+
background-color: #222;
|
101 |
+
border-top: 1px solid black;
|
102 |
+
font-size: 10px;
|
103 |
+
}
|
104 |
+
|
105 |
+
footer.special {
|
106 |
+
color: #00ffe6;
|
107 |
+
background-color: #008679;
|
108 |
+
font-size: 14px;
|
109 |
+
}
|
110 |
+
|
111 |
+
footer > div {
|
112 |
+
position: relative;
|
113 |
+
opacity: 0.8;
|
114 |
+
}
|
115 |
+
|
116 |
+
footer a {
|
117 |
+
text-decoration: none;
|
118 |
+
color: #fff;
|
119 |
+
}
|
120 |
+
|
121 |
+
footer span strong {
|
122 |
+
font-weight: bold;
|
123 |
+
color: #fff;
|
124 |
+
}
|
125 |
+
|
126 |
+
footer #why {
|
127 |
+
font-weight: bold;
|
128 |
+
color: #fff;
|
129 |
+
}
|
130 |
+
|
131 |
+
#close_footer {
|
132 |
+
position: absolute;
|
133 |
+
top: 0;
|
134 |
+
right: 0;
|
135 |
+
}
|
136 |
+
|
137 |
+
footer #close_footer strong {
|
138 |
+
display: block;
|
139 |
+
background-color: #aaa;
|
140 |
+
color: #222;
|
141 |
+
border-radius: 40px;
|
142 |
+
line-height: 150%;
|
143 |
+
cursor: pointer;
|
144 |
+
}
|
145 |
+
|
146 |
+
footer.special #close_footer strong {
|
147 |
+
background-color: #00ffe6;
|
148 |
+
color: #008679;
|
149 |
+
}
|
150 |
+
|
151 |
+
#layout.footerHidden #toggles {
|
152 |
+
height: calc(100% - 40px);
|
153 |
+
}
|
154 |
+
|
155 |
+
#layout.footerHidden #gutter {
|
156 |
+
height: calc(100%);
|
157 |
+
}
|
158 |
+
|
159 |
+
#layout.footerHidden footer {
|
160 |
+
display: none;
|
161 |
+
}
|
162 |
+
|
163 |
+
.divider {
|
164 |
+
border-bottom: 1px solid #333;
|
165 |
+
margin: 10px 40px 5px 0;
|
166 |
+
}
|
167 |
+
|
168 |
+
#toggles.hide {
|
169 |
+
opacity: 0;
|
170 |
+
transition: opacity 50ms linear;
|
171 |
+
}
|
172 |
+
|
173 |
+
#options_info,
|
174 |
+
#options_prompts,
|
175 |
+
#options_artist_sort,
|
176 |
+
#options_tag_sort {
|
177 |
+
margin-right: 10px;
|
178 |
+
}
|
179 |
+
|
180 |
+
#options_info > span:first-child,
|
181 |
+
#options_prompts > span:first-child,
|
182 |
+
#options_artist_sort > span:first-child,
|
183 |
+
#options_tag_sort > span:first-child {
|
184 |
+
margin-left: 21px;
|
185 |
+
}
|
186 |
+
|
187 |
+
#toggles label {
|
188 |
+
margin: 0 20px 0 0;
|
189 |
+
white-space: nowrap;
|
190 |
+
opacity: 0.8;
|
191 |
+
cursor: pointer;
|
192 |
+
}
|
193 |
+
|
194 |
+
#toggles label:hover {
|
195 |
+
opacity: 1;
|
196 |
+
}
|
197 |
+
|
198 |
+
#toggles #artistsShown {
|
199 |
+
margin: 0 0 0 21px;
|
200 |
+
white-space: nowrap;
|
201 |
+
position: relative;
|
202 |
+
top: 1px;
|
203 |
+
color: #ffe300;
|
204 |
+
opacity: 0.8;
|
205 |
+
}
|
206 |
+
|
207 |
+
#toggles label.top_all {
|
208 |
+
font-weight: bold;
|
209 |
+
}
|
210 |
+
|
211 |
+
#toggles label.top_control {
|
212 |
+
color: #ffe300;
|
213 |
+
}
|
214 |
+
|
215 |
+
#toggles label.top_control.warning {
|
216 |
+
color: #ff0000;
|
217 |
+
}
|
218 |
+
|
219 |
+
#toggles label.no_matches {
|
220 |
+
opacity: 0.3;
|
221 |
+
cursor: default;
|
222 |
+
}
|
223 |
+
|
224 |
+
#toggles label.category {
|
225 |
+
color: #00d5c0;
|
226 |
+
font-weight: bold;
|
227 |
+
padding-bottom: 5px;
|
228 |
+
margin: 10px 40px 0 0;
|
229 |
+
border-bottom: 1px solid #333;
|
230 |
+
}
|
231 |
+
|
232 |
+
#toggles label.hidden {
|
233 |
+
display: none;
|
234 |
+
}
|
235 |
+
|
236 |
+
#toggles label .most_used_indicator {
|
237 |
+
display: inline-block;
|
238 |
+
width: 14px;
|
239 |
+
height: 14px;
|
240 |
+
visibility: hidden;
|
241 |
+
margin-right: -14px;
|
242 |
+
position: relative;
|
243 |
+
top: 1px;
|
244 |
+
left: 4px;
|
245 |
+
color: #ffe300;
|
246 |
+
font-style: normal;
|
247 |
+
}
|
248 |
+
|
249 |
+
|
250 |
+
|
251 |
+
#toggles #artistsMatching {
|
252 |
+
opacity: 0.8;
|
253 |
+
cursor: default;
|
254 |
+
}
|
255 |
+
|
256 |
+
#toggles .count {
|
257 |
+
opacity: 0.5;
|
258 |
+
}
|
259 |
+
|
260 |
+
#toggles .link {
|
261 |
+
display: inline-block;
|
262 |
+
width: 20px;
|
263 |
+
height: 20px;
|
264 |
+
opacity: 0.7;
|
265 |
+
cursor: pointer;
|
266 |
+
box-sizing: border-box;
|
267 |
+
margin-left: 5px;
|
268 |
+
padding-left: 2px;
|
269 |
+
border-radius: 4px;
|
270 |
+
line-height: 130%;
|
271 |
+
}
|
272 |
+
|
273 |
+
#toggles .link.selected {
|
274 |
+
background-color: #444;
|
275 |
+
opacity: 1;
|
276 |
+
cursor: default;
|
277 |
+
}
|
278 |
+
|
279 |
+
#toggles .link:hover {
|
280 |
+
opacity: 1;
|
281 |
+
}
|
282 |
+
|
283 |
+
#toggles .link:hover::after {
|
284 |
+
position: absolute;
|
285 |
+
top: 20px;
|
286 |
+
left: 20px;
|
287 |
+
background-color: black;
|
288 |
+
padding: 0px 4px;
|
289 |
+
border: 1px solid #777;
|
290 |
+
border-radius: 3px;
|
291 |
+
color: #ddd;
|
292 |
+
box-shadow: 0 5px 10px black;
|
293 |
+
}
|
294 |
+
|
295 |
+
#infoI:hover::after {
|
296 |
+
content: 'instructions';
|
297 |
+
}
|
298 |
+
|
299 |
+
#infoA:hover::after {
|
300 |
+
content: 'about';
|
301 |
+
}
|
302 |
+
|
303 |
+
#infoX:hover::after {
|
304 |
+
content: 'export';
|
305 |
+
}
|
306 |
+
|
307 |
+
#promptA:hover::after {
|
308 |
+
content: 'artwork';
|
309 |
+
}
|
310 |
+
|
311 |
+
#promptP:hover::after {
|
312 |
+
content: 'portraits';
|
313 |
+
}
|
314 |
+
|
315 |
+
#promptL:hover::after {
|
316 |
+
content: 'landscapes';
|
317 |
+
}
|
318 |
+
|
319 |
+
#sortAA:hover::after {
|
320 |
+
content: 'alpha';
|
321 |
+
}
|
322 |
+
|
323 |
+
#sortAR:hover::after {
|
324 |
+
content: 'random';
|
325 |
+
}
|
326 |
+
|
327 |
+
#sortTA:hover::after {
|
328 |
+
content: 'alpha';
|
329 |
+
}
|
330 |
+
|
331 |
+
#sortTC:hover::after {
|
332 |
+
content: 'count';
|
333 |
+
}
|
334 |
+
|
335 |
+
.information {
|
336 |
+
display: none;
|
337 |
+
z-index: 2;
|
338 |
+
position: fixed;
|
339 |
+
top: 20px;
|
340 |
+
left: 20px;
|
341 |
+
width: calc(40% - 40px);
|
342 |
+
max-height: calc(100% - 110px);
|
343 |
+
padding: 20px;
|
344 |
+
overflow: auto;
|
345 |
+
background-color: #222;
|
346 |
+
border-radius: 2px;
|
347 |
+
border: 1px solid black;
|
348 |
+
box-shadow: 0 1px 0px #ffffff3d;
|
349 |
+
}
|
350 |
+
|
351 |
+
.information div {
|
352 |
+
opacity: 0.8;
|
353 |
+
}
|
354 |
+
|
355 |
+
.information h2, .information h3, .information ul{
|
356 |
+
margin-top: 0;
|
357 |
+
margin-left: 0;
|
358 |
+
}
|
359 |
+
|
360 |
+
.information h3 {
|
361 |
+
margin-bottom: 10px;
|
362 |
+
}
|
363 |
+
|
364 |
+
.information a {
|
365 |
+
color: #00ffe7;
|
366 |
+
font-weight: bold;
|
367 |
+
text-decoration: none;
|
368 |
+
}
|
369 |
+
|
370 |
+
|
371 |
+
.information a:hover {
|
372 |
+
color: #fff;
|
373 |
+
}
|
374 |
+
|
375 |
+
|
376 |
+
.information.shown {
|
377 |
+
display: block;
|
378 |
+
}
|
379 |
+
|
380 |
+
#instructions {
|
381 |
+
}
|
382 |
+
|
383 |
+
#about {
|
384 |
+
|
385 |
+
}
|
386 |
+
|
387 |
+
#export textarea {
|
388 |
+
resize: vertical;
|
389 |
+
width: 100%;
|
390 |
+
height: 200px;
|
391 |
+
}
|
392 |
+
|
393 |
+
#export .buttons {
|
394 |
+
display: flex;
|
395 |
+
flex-direction: row;
|
396 |
+
}
|
397 |
+
|
398 |
+
#export .buttons div {
|
399 |
+
cursor: pointer;
|
400 |
+
opacity: 0.8;
|
401 |
+
padding: 10px;
|
402 |
+
}
|
403 |
+
|
404 |
+
#export .buttons div:hover {
|
405 |
+
opacity: 1;
|
406 |
+
}
|
407 |
+
|
408 |
+
#filtersHidingAll {
|
409 |
+
display: none;
|
410 |
+
font-size: 24px;
|
411 |
+
color: #444;
|
412 |
+
text-align: center;
|
413 |
+
font-weight: bold;
|
414 |
+
position: relative;
|
415 |
+
top: 50%;
|
416 |
+
transform: translate(0%, -50%);
|
417 |
+
margin: 0 40px;
|
418 |
+
line-height: 220%;
|
419 |
+
}
|
420 |
+
|
421 |
+
#filtersHidingAll.shown {
|
422 |
+
display: block;
|
423 |
+
}
|
424 |
+
|
425 |
+
.image-item {
|
426 |
+
position: relative;
|
427 |
+
display: flex;
|
428 |
+
flex-direction: column;
|
429 |
+
align-items: center;
|
430 |
+
padding: 10px;
|
431 |
+
width: 256px;
|
432 |
+
background-color: #222;
|
433 |
+
border-radius: 2px;
|
434 |
+
margin: 0 5px 20px 5px;
|
435 |
+
box-shadow: 0 1px 0px #ffffff3d;
|
436 |
+
border: 1px solid black;
|
437 |
+
overflow: hidden;
|
438 |
+
}
|
439 |
+
|
440 |
+
.image-item.hidden {
|
441 |
+
display: none;
|
442 |
+
}
|
443 |
+
|
444 |
+
.image-item > span {
|
445 |
+
height: 84px;
|
446 |
+
position: relative;
|
447 |
+
display: block;
|
448 |
+
width: 100%;
|
449 |
+
}
|
450 |
+
|
451 |
+
.image-item h3 {
|
452 |
+
display: flex;
|
453 |
+
justify-content: center;
|
454 |
+
opacity: 0.8;
|
455 |
+
cursor: pointer;
|
456 |
+
height: 22px;
|
457 |
+
}
|
458 |
+
|
459 |
+
.image-item h4 {
|
460 |
+
width: 258px;
|
461 |
+
height: 52px;
|
462 |
+
opacity: 0.5;
|
463 |
+
cursor: pointer;
|
464 |
+
overflow: hidden;
|
465 |
+
position: absolute;
|
466 |
+
left: -1px;
|
467 |
+
padding-bottom: 6px;
|
468 |
+
box-sizing: border-box;
|
469 |
+
}
|
470 |
+
|
471 |
+
.image-item h3:hover {
|
472 |
+
opacity: 1;
|
473 |
+
}
|
474 |
+
|
475 |
+
.image-item h4:hover {
|
476 |
+
z-index: 1;
|
477 |
+
height: initial;
|
478 |
+
opacity: 1;
|
479 |
+
background-color: #222;
|
480 |
+
border-bottom: 1px solid #111;
|
481 |
+
color: #888;
|
482 |
+
}
|
483 |
+
|
484 |
+
.image-item .firstN {
|
485 |
+
margin-right: 8px;
|
486 |
+
white-space: nowrap;
|
487 |
+
}
|
488 |
+
|
489 |
+
.image-item .lastN {
|
490 |
+
white-space: nowrap;
|
491 |
+
}
|
492 |
+
|
493 |
+
.image-item > div {
|
494 |
+
width: 256px;
|
495 |
+
height: 256px;
|
496 |
+
text-align: center;
|
497 |
+
border: 1px solid black;
|
498 |
+
border-radius: 2px;
|
499 |
+
overflow: hidden;
|
500 |
+
}
|
501 |
+
|
502 |
+
.image-item .imgTools {
|
503 |
+
display: flex;
|
504 |
+
flex-direction: row;
|
505 |
+
align-items: end;
|
506 |
+
height: 100%;
|
507 |
+
background-color: #666;
|
508 |
+
opacity: 0.8;
|
509 |
+
}
|
510 |
+
|
511 |
+
.image-item .imgTools:hover {
|
512 |
+
opacity: 1;
|
513 |
+
}
|
514 |
+
|
515 |
+
.image-item .imgTools > div {
|
516 |
+
position: relative;
|
517 |
+
opacity: 0.7;
|
518 |
+
cursor: pointer;
|
519 |
+
}
|
520 |
+
|
521 |
+
.image-item .imgTools > div:hover {
|
522 |
+
opacity: 1;
|
523 |
+
}
|
524 |
+
|
525 |
+
.image-item .imgTools span {
|
526 |
+
position: absolute;
|
527 |
+
display: block;
|
528 |
+
width: 24px;
|
529 |
+
height: 24px;
|
530 |
+
border-radius: 4px;
|
531 |
+
top: 50%;
|
532 |
+
left: 50%;
|
533 |
+
transform: translate(-50%, -50%);
|
534 |
+
box-sizing: border-box;
|
535 |
+
background-color: #545454;
|
536 |
+
box-shadow: 0 0 5px #777
|
537 |
+
}
|
538 |
+
|
539 |
+
.image-item .art_prev {
|
540 |
+
width: 50px;
|
541 |
+
height: 50px;
|
542 |
+
background-color: #333;
|
543 |
+
border-radius: 0px 4px 0px 0px;
|
544 |
+
}
|
545 |
+
|
546 |
+
.image-item .art_next {
|
547 |
+
width: 50px;
|
548 |
+
height: 50px;
|
549 |
+
background-color: #333;
|
550 |
+
border-radius: 4px 0px 0px 0px;
|
551 |
+
}
|
552 |
+
|
553 |
+
.image-item .art_star {
|
554 |
+
flex-grow: 1;
|
555 |
+
width: 128px;
|
556 |
+
height: 100%;
|
557 |
+
}
|
558 |
+
|
559 |
+
.image-item .art_star span {
|
560 |
+
font-size: 48px;
|
561 |
+
width: 60px;
|
562 |
+
height: 60px;
|
563 |
+
line-height: 120%;
|
564 |
+
padding: 0;
|
565 |
+
filter: grayscale(100%);
|
566 |
+
background-color: initial;
|
567 |
+
box-shadow: none;
|
568 |
+
}
|
569 |
+
|
570 |
+
.image-item .imgBox {
|
571 |
+
position: relative;
|
572 |
+
z-index: 0;
|
573 |
+
top: -256px;
|
574 |
+
left: 0px;
|
575 |
+
width: 256px;
|
576 |
+
aspect-ratio: 1 / 1;
|
577 |
+
overflow: hidden;
|
578 |
+
border-radius: 2px;
|
579 |
+
background-color: #222;
|
580 |
+
cursor: pointer;
|
581 |
+
animation-name: reduce;
|
582 |
+
animation-duration: 100ms;
|
583 |
+
animation-timing-function: linear;
|
584 |
+
animation-iteration-count: 1;
|
585 |
+
animation-direction: forward;
|
586 |
+
}
|
587 |
+
|
588 |
+
.image-item:hover .imgBox {
|
589 |
+
position: fixed;
|
590 |
+
z-index: 1;
|
591 |
+
top: 0px;
|
592 |
+
left: 20px;
|
593 |
+
width: 40%;
|
594 |
+
cursor: not-allowed;
|
595 |
+
transform: translateY(20px);
|
596 |
+
animation-name: enlarge;
|
597 |
+
animation-duration: 100ms;
|
598 |
+
animation-timing-function: east-out;
|
599 |
+
animation-iteration-count: 1;
|
600 |
+
animation-direction: forward;
|
601 |
+
}
|
602 |
+
|
603 |
+
@keyframes enlarge {
|
604 |
+
0% {
|
605 |
+
opacity: 0;
|
606 |
+
transform: translateY(0px);
|
607 |
+
}
|
608 |
+
100% {
|
609 |
+
opacity: 1;
|
610 |
+
transform: translateY(20px);
|
611 |
+
}
|
612 |
+
}
|
613 |
+
|
614 |
+
@keyframes reduce {
|
615 |
+
0% {
|
616 |
+
opacity: 0;
|
617 |
+
}
|
618 |
+
100% {
|
619 |
+
opacity: 1;
|
620 |
+
}
|
621 |
+
}
|
622 |
+
|
623 |
+
.image-item img {
|
624 |
+
display: block;
|
625 |
+
width: 256px;
|
626 |
+
}
|
627 |
+
|
628 |
+
.image-item img.hidden {
|
629 |
+
display: none;
|
630 |
+
}
|
631 |
+
|
632 |
+
.image-item:hover .imgBox img {
|
633 |
+
width: 100%;
|
634 |
+
}
|
635 |
+
|
636 |
+
.image-item.favorite {
|
637 |
+
border: 1px solid #ffc10080;
|
638 |
+
box-shadow: 0 0px 15px #ffe20045;
|
639 |
+
}
|
640 |
+
|
641 |
+
.image-item.favorite .art_star span {
|
642 |
+
filter: grayscale(0%);
|
643 |
+
}
|
644 |
+
|
645 |
+
#layout.edit_mode #toggles {
|
646 |
+
width: calc(100% - 40px);
|
647 |
+
transition: width 200ms ease-out;
|
648 |
+
}
|
649 |
+
|
650 |
+
#layout.edit_mode #gutter {
|
651 |
+
left: calc(100% - 40px);
|
652 |
+
transition: left 200ms ease-out;
|
653 |
+
}
|
654 |
+
|
655 |
+
#layout.edit_mode #image-container {
|
656 |
+
opacity: 0.2;
|
657 |
+
margin-left: 100%;
|
658 |
+
overflow: hidden;
|
659 |
+
transition: width 200ms ease-out;
|
660 |
+
}
|
661 |
+
|
662 |
+
#edit_most_used {
|
663 |
+
color: #ffe300;
|
664 |
+
opacity: 0.8;
|
665 |
+
cursor: pointer;
|
666 |
+
margin: 5px 0 0 21px;
|
667 |
+
}
|
668 |
+
|
669 |
+
#edit_most_used:hover {
|
670 |
+
opacity: 1;
|
671 |
+
}
|
672 |
+
|
673 |
+
#edit_most_used.hidden {
|
674 |
+
display: none;
|
675 |
+
}
|
676 |
+
|
677 |
+
#layout.edit_mode #edit_most_used {
|
678 |
+
font-weight: bold;
|
679 |
+
color: #ff0000;
|
680 |
+
}
|
681 |
+
|
682 |
+
#layout.edit_mode .top_control,
|
683 |
+
#layout.edit_mode .divider,
|
684 |
+
#layout.edit_mode #options_prompts,
|
685 |
+
#layout.edit_mode #options_tag_sort,
|
686 |
+
#layout.edit_mode #options_artist_sort,
|
687 |
+
#layout.edit_mode #options_info,
|
688 |
+
#layout.edit_mode .category .count {
|
689 |
+
visibility: hidden;
|
690 |
+
}
|
691 |
+
|
692 |
+
#layout.edit_mode .category {
|
693 |
+
color: #fff;
|
694 |
+
opacity: 0.5;
|
695 |
+
}
|
696 |
+
|
697 |
+
#layout.edit_mode .category:hover {
|
698 |
+
cursor: default;
|
699 |
+
opacity: 0.5;
|
700 |
+
}
|
701 |
+
|
702 |
+
#layout.edit_mode [data-category-name="important"] {
|
703 |
+
opacity: 1;
|
704 |
+
color: #ffe300;
|
705 |
+
}
|
706 |
+
|
707 |
+
#layout.edit_mode [data-category-name="important"]:hover {
|
708 |
+
opacity: 1;
|
709 |
+
}
|
710 |
+
|
711 |
+
#layout.edit_mode #toggles .was_moved {
|
712 |
+
font-weight: bold;
|
713 |
+
color: #ffe300;
|
714 |
+
}
|
715 |
+
|
716 |
+
#layout.edit_mode #toggles input {
|
717 |
+
visibility: hidden;
|
718 |
+
}
|
719 |
+
|
720 |
+
#layout.edit_mode #toggles .most_used_indicator {
|
721 |
+
visibility: visible;
|
722 |
+
}
|
index.html
CHANGED
@@ -1,19 +1,200 @@
|
|
1 |
<!DOCTYPE html>
|
2 |
<html>
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
<
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
<
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
</body>
|
19 |
-
</html>
|
|
|
1 |
<!DOCTYPE html>
|
2 |
<html>
|
3 |
+
<head>
|
4 |
+
<script type="text/javascript" src="artists_and_tags.js"></script>
|
5 |
+
<script type="text/javascript" src="index.js"></script>
|
6 |
+
<link rel="stylesheet" href="index.css">
|
7 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
8 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
9 |
+
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap" rel="stylesheet">
|
10 |
+
</head>
|
11 |
+
<body>
|
12 |
+
<div id="layout">
|
13 |
+
<div id="rows">
|
14 |
+
<div id="instructions" class="information">
|
15 |
+
<div>
|
16 |
+
<h2>How to</h2>
|
17 |
+
<h3>Clicking an artist's...</h3>
|
18 |
+
<ul>
|
19 |
+
<li><strong>name</strong> copies them to clipboard</li>
|
20 |
+
<li><strong>tags</strong> toggles those checkmarks</li>
|
21 |
+
<li><strong>star</strong> marks them as favorite</li>
|
22 |
+
<li>🎨, 🧑, and 🏞️ switches the prompt/image</li>
|
23 |
+
</ul>
|
24 |
+
<h3>Permissive filter</h3>
|
25 |
+
<ul>
|
26 |
+
<li><strong>checked:</strong> artists matching <strong>any</strong> checked tags</li>
|
27 |
+
<li><strong>unchecked:</strong> artists matching <strong>all</strong> checked tags</li>
|
28 |
+
<li>use unchecked to filter your favorites</li>
|
29 |
+
</ul>
|
30 |
+
<h3>Hide low-use tags</h3>
|
31 |
+
<ul>
|
32 |
+
<li><strong>checked:</strong> hides tags that match less than 3 artists</li>
|
33 |
+
<li>note that all hidden tags are unchecked</li>
|
34 |
+
</ul>
|
35 |
+
<h3>When using Stable Diffusion</h3>
|
36 |
+
<ul>
|
37 |
+
<li>Reproduce these styles with the prompt with "by {Artist full name}, ...."
|
38 |
+
<li>Adding the style tags to the prompt can also help</li>
|
39 |
+
<li>You can combine the styles of two are more artists</li>
|
40 |
+
</ul>
|
41 |
+
</div>
|
42 |
+
</div>
|
43 |
+
<div id="about" class="information">
|
44 |
+
<div>
|
45 |
+
<h2>About</h2>
|
46 |
+
<h3>Incomplete beta version!</h3>
|
47 |
+
<p>
|
48 |
+
I'll add the full 3000k+ database of artists soon. I want to work out any major issues first. Please <a href="https://huggingface.co/spaces/mattthew/SDXL-artists-browser/discussions" target="_blank">give feedback on Huggingface</a>.
|
49 |
+
</p>
|
50 |
+
<h3>How to support this project</h3>
|
51 |
+
<ul>
|
52 |
+
<li>Please tell a friends or share on your socials</li>
|
53 |
+
<li>Suggest artists I should add or remove</li>
|
54 |
+
<li>Suggest features and report bugs</li>
|
55 |
+
<li><a href="https://huggingface.co/spaces/mattthew/SDXL-artists-browser/discussions" target="_blank">Leave all feedback on Huggingface</a></li>
|
56 |
+
<li>I don't need money. Thanks always feels nice!</li>
|
57 |
+
</ul>
|
58 |
+
<h3>Image parameters</h3>
|
59 |
+
<ul>
|
60 |
+
<li>
|
61 |
+
All: Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 10, Seed: 42, Size: 1024x1024, Model hash: 31e35c80fc, Model: sd_xl_base_1.0, Version: v1.5.1
|
62 |
+
</li>
|
63 |
+
<li>
|
64 |
+
🎨 Prompt: by {Artist full name}, artwork image, Negative prompt: frame, border, text, signature
|
65 |
+
</li>
|
66 |
+
<li>
|
67 |
+
🧑 Prompt: by {Artist full name}, image of a gently smiling, portrait of a person, head and torso, sitting in their room, Negative prompt: self-portrait, outside, frame, border, text, signature
|
68 |
+
</li>
|
69 |
+
<li>
|
70 |
+
🏞️ Prompt: by {Artist full name}, image of a landscape, outdoor natural scenery, water, bridge, Negative prompt: people, person, frame, border, text, signature
|
71 |
+
</li>
|
72 |
+
</ul>
|
73 |
+
<h3>Disclaimers</h3>
|
74 |
+
<ul>
|
75 |
+
<li>This tools is just for fun. This information NOT be correct! The tags are from a mix of sources and manual input. Many tags are AI generated. I make corrections when I happen to spot them or when submitted.</li>
|
76 |
+
<li>Remember, SDXL is only a crude imitation of these artists. Check out these artists' actual artwork for more inspiration!</li>
|
77 |
+
<li>This database has more straight white male artists than in the actual population. That's because they've been favored by art-collectors, past and present. Please suggest artists I should add.</li>
|
78 |
+
<li>My code doesn't use cookies and sends nothing to any server. But it's hosted on Huggingface, and I can't control if they cookie you</li>
|
79 |
+
<li>Open source. Database is Creatives Commons licence</li>
|
80 |
+
<li>I don't get nor do I want compensation for this</li>
|
81 |
+
<li>I'm not affiliated with Stability AI</li>
|
82 |
+
<li>Use at your own risk 🧟</li>
|
83 |
+
</ul>
|
84 |
+
<h3>What's with the sedan?</h3>
|
85 |
+
<ul>
|
86 |
+
<li>
|
87 |
+
All images were generated with the same seed (42). For many artists, especially with the 🎨 prompt, that seed produces a car, which is not in the prompt. Other seeds will cause a different visual element across many artists.
|
88 |
+
</li>
|
89 |
+
</ul>
|
90 |
+
<h3>Missing images</h3>
|
91 |
+
<p>
|
92 |
+
If artists are listed in the database file, but their image files are missing, the files are listed below.
|
93 |
+
</p>
|
94 |
+
<ul id="missing_images_report"></ul>
|
95 |
+
</div>
|
96 |
+
</div>
|
97 |
+
<div id="export" class="information">
|
98 |
+
<div>
|
99 |
+
<h2>Export/Import favorited artists</h2>
|
100 |
+
<textarea placeholder="foo" autocomplete="You haven't favorited any artists yet."></textarea>
|
101 |
+
<div class="buttons">
|
102 |
+
<div id="export_to_clipboard">copy to clipboard</div>
|
103 |
+
<div id="export_import">import</div>
|
104 |
+
</div>
|
105 |
+
</div>
|
106 |
+
</div>
|
107 |
+
<div id="toggles">
|
108 |
+
<div id="options_info">
|
109 |
+
<span class="count">documents:</span>
|
110 |
+
<span class="link" id="infoI">⁉️ </span>
|
111 |
+
<span class="link" id="infoA">📓 </span>
|
112 |
+
<span class="link" id="infoX">📤 </span>
|
113 |
+
</div>
|
114 |
+
<div id="options_prompts">
|
115 |
+
<span class="count">show me:</span>
|
116 |
+
<span class="link selected" id="promptA">🎨</span>
|
117 |
+
<span class="link" id="promptP">🧑</span>
|
118 |
+
<span class="link" id="promptL">🏞️</span>
|
119 |
+
</div>
|
120 |
+
<div id="options_artist_sort">
|
121 |
+
<span class="count">sort artists by:</span>
|
122 |
+
<span class="link selected" id="sortAR">🎰</span>
|
123 |
+
<span class="link" id="sortAA">🔠</span>
|
124 |
+
</div>
|
125 |
+
<div id="options_tag_sort">
|
126 |
+
<span class="count">sort tags by:</span>
|
127 |
+
<span class="link selected" id="sortTC">📶</span>
|
128 |
+
<span class="link" id="sortTA">🔠</span>
|
129 |
+
</div>
|
130 |
+
<div class="divider"></div>
|
131 |
+
<label class="top_control top_all">
|
132 |
+
<input type="checkbox" checked="checked" name="check-all" value="check-all" autocomplete="off"><span>all artists</span><span class="count"></span>
|
133 |
+
</label>
|
134 |
+
<div id="artistsShown" class="top_control">
|
135 |
+
<span class="count"></span>
|
136 |
+
</div>
|
137 |
+
<div class="divider"></div>
|
138 |
+
<label class="top_control">
|
139 |
+
<input type="checkbox" checked="checked" name="mode" value="mode" autocomplete="off"><span>permissive</span><span class="count"></span>
|
140 |
+
</label>
|
141 |
+
<label class="top_control">
|
142 |
+
<input type="checkbox" checked="checked" name="use_categories" value="use_categories" autocomplete="off"><span>use categories</span><span class="count"></span>
|
143 |
+
</label>
|
144 |
+
<label class="top_control">
|
145 |
+
<input type="checkbox" checked="checked" name="low_count" value="low_count" autocomplete="off"><span>hide low-use tags</span><span class="count"></span>
|
146 |
+
</label>
|
147 |
+
<label class="top_control">
|
148 |
+
<input type="checkbox" checked="checked" name="favorite" value="favorite" autocomplete="off"><span>favorited</span><span class="count"></span>
|
149 |
+
</label>
|
150 |
+
<div class="divider"></div>
|
151 |
+
<span id="edit_most_used" class="hidden">edit</span>
|
152 |
+
<!-- JS will insert checkboxes here -->
|
153 |
+
</div>
|
154 |
+
<div id="gutter"></div>
|
155 |
+
<div id="image-container">
|
156 |
+
<div id="filtersHidingAll">
|
157 |
+
these filters hide every image<br>
|
158 |
+
check-mark any tag or ‟permissive”<br>
|
159 |
+
👀
|
160 |
+
</div>
|
161 |
+
<!-- JS will insert images here -->
|
162 |
+
<!--
|
163 |
+
<div class="image-item tag1 tag2">
|
164 |
+
<span>
|
165 |
+
<h3>
|
166 |
+
<span class="firstN">Name</span>
|
167 |
+
<span class="lastN">Name</span>
|
168 |
+
</h3>
|
169 |
+
<h4>
|
170 |
+
tag1, tag2
|
171 |
+
</h4>
|
172 |
+
</span>
|
173 |
+
<div>
|
174 |
+
<div class="imgTools">
|
175 |
+
<div class="art_prev"></div>
|
176 |
+
<div class="art_star"></div>
|
177 |
+
<div class="art_next"></div>
|
178 |
+
</div>
|
179 |
+
<div class="imgBox">
|
180 |
+
<img alt="First Last - art" src="images/SDXL_1_0/First_Last-artwork.jpg">
|
181 |
+
<img alt="First Last - art" src="images/SDXL_1_0/First_Last-potrait.jpg">
|
182 |
+
<img alt="First Last - art" src="images/SDXL_1_0/First_Last-landscape.jpg">
|
183 |
+
</div>
|
184 |
+
</div>
|
185 |
+
</div>
|
186 |
+
-->
|
187 |
+
</div>
|
188 |
</div>
|
189 |
+
<footer class="special">
|
190 |
+
<div>
|
191 |
+
<span><strong>Beta v0.9 - Missing 2,500 artist! Click the 📓 at the top left -</strong></span>
|
192 |
+
<span>Enjoy this SDXL artist browser by</span>
|
193 |
+
<a href="https://huggingface.co/mattthew" target="_blank">Mattthew</a>
|
194 |
+
<div id="close_footer"><strong> x </strong></div>
|
195 |
+
</div>
|
196 |
+
</footer>
|
197 |
+
</div>
|
198 |
+
<div id="alert"></div>
|
199 |
</body>
|
200 |
+
</html>
|
index.js
ADDED
@@ -0,0 +1,1406 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
//
|
2 |
+
//
|
3 |
+
//
|
4 |
+
//
|
5 |
+
// global variables
|
6 |
+
var timer;
|
7 |
+
var artTypes = ['🎨','🧑','🏞️'];
|
8 |
+
var imgTypeShown = 0;
|
9 |
+
var log = '';
|
10 |
+
var editMode = false;
|
11 |
+
var windowWidth = 0;
|
12 |
+
|
13 |
+
//
|
14 |
+
//
|
15 |
+
//
|
16 |
+
// functions
|
17 |
+
function startUp() {
|
18 |
+
updateFooter();
|
19 |
+
insertArtists();
|
20 |
+
insertCheckboxesFromArtistsData();
|
21 |
+
insertCheckboxesFromCategories();
|
22 |
+
loadCheckboxesState();
|
23 |
+
showHideCategories();
|
24 |
+
loadOptionsState();
|
25 |
+
loadFavoritesState();
|
26 |
+
hideAllArtists();
|
27 |
+
unhideBasedOnPermissiveSetting();
|
28 |
+
updateArtistsCountPerTag('start');
|
29 |
+
rotatePromptsImages();
|
30 |
+
sortArtists();
|
31 |
+
sortTags();
|
32 |
+
loadMostUsedTags();
|
33 |
+
updateArtistsCountPerCategory();
|
34 |
+
showHideLowCountTags();
|
35 |
+
}
|
36 |
+
|
37 |
+
function updateFooter() {
|
38 |
+
let proto = window.location.protocol;
|
39 |
+
if (proto.startsWith('http')) {
|
40 |
+
var footer = document.getElementsByTagName('footer')[0];
|
41 |
+
footer.classList.add('special');
|
42 |
+
var el1 = document.createElement('span');
|
43 |
+
el1.textContent = 'Why are most artists are missing?! ';
|
44 |
+
el1.id = 'why';
|
45 |
+
footer.querySelectorAll('div')[0].prepend(el1);
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
function insertArtists() {
|
50 |
+
// artistsData is defined in the artists_and_tags.js file
|
51 |
+
let missingFiles = '';
|
52 |
+
var container = document.getElementById('image-container');
|
53 |
+
let imagePromises = artistsData.map((artist) => {
|
54 |
+
var last = artist[0];
|
55 |
+
var first = artist[1];
|
56 |
+
var tags1 = artist[2].replaceAll('|', ' ').toLowerCase();
|
57 |
+
// class names can't start with a number, but some tags do
|
58 |
+
// in these cases prepending with 'qqqq-'
|
59 |
+
tags1 = tags1.replace(/(^|\s)(\d)/g, '$1qqqq-$2');
|
60 |
+
var tags2 = artist[2].replaceAll('|', ', ').toLowerCase();
|
61 |
+
var itemDiv = document.createElement('div');
|
62 |
+
itemDiv.className = 'image-item ' + tags1;
|
63 |
+
var itemHeader = document.createElement('span');
|
64 |
+
var h3 = document.createElement('h3');
|
65 |
+
itemHeader.appendChild(h3);
|
66 |
+
var firstN = document.createElement('span');
|
67 |
+
var lastN = document.createElement('span');
|
68 |
+
firstN.className = 'firstN';
|
69 |
+
lastN.className = 'lastN';
|
70 |
+
firstN.textContent = `${first}`;
|
71 |
+
lastN.textContent = `${last}`;
|
72 |
+
h3.appendChild(firstN);
|
73 |
+
h3.appendChild(lastN);
|
74 |
+
h3.title = 'copy to clipboard';
|
75 |
+
var h4 = document.createElement('h4');
|
76 |
+
h4.textContent = tags2;
|
77 |
+
h4.title = 'check/uncheck these tags';
|
78 |
+
itemHeader.appendChild(h4);
|
79 |
+
itemDiv.appendChild(itemHeader);
|
80 |
+
var box = document.createElement('div');
|
81 |
+
var imgTools = document.createElement('div');
|
82 |
+
imgTools.className = 'imgTools';
|
83 |
+
var artPrev = document.createElement('div');
|
84 |
+
artPrev.className = 'art_prev';
|
85 |
+
var artPrevSpan = document.createElement('span');
|
86 |
+
artPrevSpan.textContent = '🧑';
|
87 |
+
artPrev.appendChild(artPrevSpan);
|
88 |
+
imgTools.appendChild(artPrev);
|
89 |
+
var artStar = document.createElement('div');
|
90 |
+
artStar.className = 'art_star';
|
91 |
+
var artStarSpan = document.createElement('span');
|
92 |
+
artStarSpan.textContent = '⭐️';
|
93 |
+
artStar.appendChild(artStarSpan);
|
94 |
+
imgTools.appendChild(artStar);
|
95 |
+
var artNext = document.createElement('div');
|
96 |
+
artNext.className = 'art_next';
|
97 |
+
var artNextSpan = document.createElement('span');
|
98 |
+
artNextSpan.textContent = '🏞️';
|
99 |
+
artNext.appendChild(artNextSpan);
|
100 |
+
imgTools.appendChild(artNext);
|
101 |
+
box.appendChild(imgTools);
|
102 |
+
var imgBox = document.createElement('div');
|
103 |
+
imgBox.className = 'imgBox';
|
104 |
+
var imgArtwork = document.createElement('img');
|
105 |
+
var imgPortrait = document.createElement('img');
|
106 |
+
var imgLandscape = document.createElement('img');
|
107 |
+
imgArtwork.alt = `${first} ${last}` + ' - artwork';
|
108 |
+
imgPortrait.alt = `${first} ${last}` + ' - portrait';
|
109 |
+
imgLandscape.alt = `${first} ${last}` + ' - landscape';
|
110 |
+
imgArtwork.className = 'img_artwork';
|
111 |
+
imgPortrait.className = 'img_portrait hidden';
|
112 |
+
imgLandscape.className = 'img_landscape hidden';
|
113 |
+
let src = 'images/SDXL_1_0_thumbs/';
|
114 |
+
if(first == '') {
|
115 |
+
src += last.replaceAll(' ', '_');
|
116 |
+
} else {
|
117 |
+
src += first.replaceAll(' ', '_') + '_' + last.replaceAll(' ', '_');
|
118 |
+
}
|
119 |
+
imgBox.appendChild(imgArtwork);
|
120 |
+
imgBox.appendChild(imgPortrait);
|
121 |
+
imgBox.appendChild(imgLandscape);
|
122 |
+
box.appendChild(imgBox);
|
123 |
+
itemDiv.appendChild(box);
|
124 |
+
container.appendChild(itemDiv);
|
125 |
+
return Promise.allSettled([
|
126 |
+
new Promise((resolve, reject) => {
|
127 |
+
imgArtwork.onload = resolve;
|
128 |
+
imgArtwork.onerror = () => {
|
129 |
+
missingFiles += '<li>' + first + '_' + last + '-artwork.webp</li>';
|
130 |
+
reject();
|
131 |
+
};
|
132 |
+
imgArtwork.src = src + '-artwork.webp';
|
133 |
+
}),
|
134 |
+
new Promise((resolve, reject) => {
|
135 |
+
imgPortrait.onload = resolve;
|
136 |
+
imgPortrait.onerror = () => {
|
137 |
+
missingFiles += '<li>' + first + '_' + last + '-portrait.webp</li>';
|
138 |
+
reject();
|
139 |
+
};
|
140 |
+
imgPortrait.src = src + '-portrait.webp';
|
141 |
+
}),
|
142 |
+
new Promise((resolve, reject) => {
|
143 |
+
imgLandscape.onload = resolve;
|
144 |
+
imgLandscape.onerror = () => {
|
145 |
+
missingFiles += '<li>' + first + '_' + last + '-landscape.webp</li>';
|
146 |
+
reject();
|
147 |
+
};
|
148 |
+
imgLandscape.src = src + '-landscape.webp';
|
149 |
+
})
|
150 |
+
]);
|
151 |
+
});
|
152 |
+
let report = document.getElementById('missing_images_report');
|
153 |
+
Promise.allSettled(imagePromises).then(() => {
|
154 |
+
if(missingFiles.indexOf('webp')>0) {
|
155 |
+
report.innerHTML = missingFiles;
|
156 |
+
} else {
|
157 |
+
report.innerHTML = '<li>No thumbnails files are missing! Enlarged images are loaded on hover. If any are missing, they\'ll be listed here at that time.</li>'
|
158 |
+
}
|
159 |
+
});
|
160 |
+
}
|
161 |
+
|
162 |
+
function insertCheckboxesFromArtistsData() {
|
163 |
+
var uniqueTags = new Set();
|
164 |
+
artistsData.forEach(function(artist) {
|
165 |
+
var tags = artist[2].split('|');
|
166 |
+
tags.forEach(function(tag) {
|
167 |
+
uniqueTags.add(tag.toLowerCase());
|
168 |
+
});
|
169 |
+
});
|
170 |
+
var uTags = Array.from(uniqueTags);
|
171 |
+
var toggles = document.getElementById('toggles');
|
172 |
+
for(i=0,il=uTags.length;i<il;i++) {
|
173 |
+
if(uTags[i].length > 0) {
|
174 |
+
// 👆 shouldn't need to sanitize database, but just in case
|
175 |
+
var label = document.createElement('label');
|
176 |
+
var el = document.createElement('i');
|
177 |
+
el.className = 'most_used_indicator';
|
178 |
+
el.textContent = '+';
|
179 |
+
var input = document.createElement('input');
|
180 |
+
input.type = 'checkbox';
|
181 |
+
input.name = uTags[i];
|
182 |
+
input.value = uTags[i];
|
183 |
+
input.checked = true;
|
184 |
+
var span1 = document.createElement('span');
|
185 |
+
span1.textContent = uTags[i];
|
186 |
+
var span2 = document.createElement('span');
|
187 |
+
span2.className = 'count';
|
188 |
+
label.appendChild(el);
|
189 |
+
label.appendChild(input);
|
190 |
+
label.appendChild(span1);
|
191 |
+
label.appendChild(span2);
|
192 |
+
toggles.appendChild(label);
|
193 |
+
}
|
194 |
+
}
|
195 |
+
var checkAll = document.querySelector('input[name="check-all"]');
|
196 |
+
var divs = document.querySelectorAll('.image-item');
|
197 |
+
checkAll.parentNode.querySelector('.count').textContent = ' - ' + divs.length.toLocaleString();
|
198 |
+
}
|
199 |
+
|
200 |
+
function insertCheckboxesFromCategories() {
|
201 |
+
var useCategories = document.querySelector('input[name="use_categories"]').checked;
|
202 |
+
for(i=0,il=tagCategories.length;i<il;i++) {
|
203 |
+
let name = tagCategories[i][0];
|
204 |
+
var label = document.createElement('label');
|
205 |
+
label.dataset.categoryName = name;
|
206 |
+
label.className = 'category';
|
207 |
+
var input = document.createElement('input');
|
208 |
+
input.type = 'checkbox';
|
209 |
+
input.name = name;
|
210 |
+
input.value = name;
|
211 |
+
input.checked = true;
|
212 |
+
var span1 = document.createElement('span');
|
213 |
+
span1.textContent = name;
|
214 |
+
var span2 = document.createElement('span');
|
215 |
+
span2.className = 'count';
|
216 |
+
label.appendChild(input);
|
217 |
+
label.appendChild(span1);
|
218 |
+
label.appendChild(span2);
|
219 |
+
toggles.appendChild(label);
|
220 |
+
}
|
221 |
+
}
|
222 |
+
|
223 |
+
function loadCheckboxesState() {
|
224 |
+
let state = JSON.parse(localStorage.getItem('tagsChecked')) || {};
|
225 |
+
let allChecked = true;
|
226 |
+
for (let name in state) {
|
227 |
+
if (document.querySelector('input[name="'+name+'"]')) {
|
228 |
+
document.querySelector('input[name="'+name+'"]').checked = state[name];
|
229 |
+
if(name != 'mode' && name != 'use_categories') {
|
230 |
+
if(!state[name]) {
|
231 |
+
allChecked = false;
|
232 |
+
}
|
233 |
+
}
|
234 |
+
}
|
235 |
+
}
|
236 |
+
if(!allChecked) {
|
237 |
+
document.querySelector('input[name="check-all"]').checked = false;
|
238 |
+
}
|
239 |
+
}
|
240 |
+
|
241 |
+
function storeCheckboxState(checkbox) {
|
242 |
+
let state = JSON.parse(localStorage.getItem('tagsChecked')) || {};
|
243 |
+
state[checkbox.name] = checkbox.checked;
|
244 |
+
localStorage.setItem('tagsChecked', JSON.stringify(state));
|
245 |
+
}
|
246 |
+
|
247 |
+
function storeCheckboxStateAll(isChecked) {
|
248 |
+
let state = {};
|
249 |
+
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
250 |
+
checkboxes.forEach(function(checkbox) {
|
251 |
+
let isTop = checkbox.parentNode.classList.contains('top_control');
|
252 |
+
if(!isTop || checkbox.name == 'favorite') {
|
253 |
+
// is a tag checkbox, not a setting
|
254 |
+
if(isChecked) {
|
255 |
+
state[checkbox.name] = true;
|
256 |
+
} else {
|
257 |
+
state[checkbox.name] = false;
|
258 |
+
}
|
259 |
+
}
|
260 |
+
});
|
261 |
+
localStorage.setItem('tagsChecked', JSON.stringify(state));
|
262 |
+
}
|
263 |
+
|
264 |
+
function loadOptionsState() {
|
265 |
+
let state = JSON.parse(localStorage.getItem('tagsChecked')) || {};
|
266 |
+
if(state['prompt']) {
|
267 |
+
document.getElementById('options_prompts').querySelectorAll('.selected')[0].classList.remove('selected');
|
268 |
+
document.getElementById(state['prompt']).classList.add('selected');
|
269 |
+
if(state['prompt'] == 'promptA') {
|
270 |
+
imgTypeShown = 0;
|
271 |
+
} else if(state['prompt'] == 'promptP') {
|
272 |
+
imgTypeShown = 1;
|
273 |
+
} else if(state['prompt'] == 'promptL') {
|
274 |
+
imgTypeShown = 2;
|
275 |
+
}
|
276 |
+
} else {
|
277 |
+
// promptA is already highlighted by HTML
|
278 |
+
imgTypeShown = 0;
|
279 |
+
}
|
280 |
+
if(state['artistSort']) {
|
281 |
+
document.getElementById('options_artist_sort').querySelectorAll('.selected')[0].classList.remove('selected');
|
282 |
+
document.getElementById(state['artistSort']).classList.add('selected');
|
283 |
+
} else {
|
284 |
+
// sortAR is already highlighted by HTML
|
285 |
+
}
|
286 |
+
if(state['tagSort']) {
|
287 |
+
document.getElementById('options_tag_sort').querySelectorAll('.selected')[0].classList.remove('selected');
|
288 |
+
document.getElementById(state['tagSort']).classList.add('selected');
|
289 |
+
} else {
|
290 |
+
// sortTC is already highlighted by HTML
|
291 |
+
}
|
292 |
+
}
|
293 |
+
|
294 |
+
function highlightSelectedOption(selected) {
|
295 |
+
if(selected == 'prev' || selected == 'next') {
|
296 |
+
if(selected == 'prev') {
|
297 |
+
imgTypeShown--;
|
298 |
+
if(imgTypeShown < 0) { imgTypeShown = 2; }
|
299 |
+
} else if(selected == 'next') {
|
300 |
+
imgTypeShown++;
|
301 |
+
if(imgTypeShown > 2) { imgTypeShown = 0; }
|
302 |
+
}
|
303 |
+
var links = document.getElementById('options_prompts').querySelectorAll('.link');
|
304 |
+
links.forEach(function(link) {
|
305 |
+
link.classList.remove('selected');
|
306 |
+
});
|
307 |
+
if(imgTypeShown == 0) {
|
308 |
+
document.getElementById('promptA').classList.add('selected');
|
309 |
+
doAlert('Showing artwork');
|
310 |
+
} else if(imgTypeShown == 1) {
|
311 |
+
document.getElementById('promptP').classList.add('selected');
|
312 |
+
doAlert('Showing portraits');
|
313 |
+
} else if(imgTypeShown == 2) {
|
314 |
+
document.getElementById('promptL').classList.add('selected');
|
315 |
+
doAlert('Showing landscapes');
|
316 |
+
}
|
317 |
+
} else {
|
318 |
+
if(selected == 'promptA') {
|
319 |
+
imgTypeShown = 0;
|
320 |
+
doAlert('Showing artwork');
|
321 |
+
} else if(selected == 'promptP') {
|
322 |
+
imgTypeShown = 1;
|
323 |
+
doAlert('Showing portraits');
|
324 |
+
} else if(selected == 'promptL') {
|
325 |
+
imgTypeShown = 2;
|
326 |
+
doAlert('Showing landscapes');
|
327 |
+
}
|
328 |
+
var links = document.getElementById(selected).parentNode.querySelectorAll('.link');
|
329 |
+
links.forEach(function(link) {
|
330 |
+
link.classList.remove('selected');
|
331 |
+
});
|
332 |
+
document.getElementById(selected).classList.add('selected');
|
333 |
+
}
|
334 |
+
}
|
335 |
+
|
336 |
+
function storeOptionsState() {
|
337 |
+
let state = JSON.parse(localStorage.getItem('tagsChecked')) || {};
|
338 |
+
if(document.getElementById('promptA').classList.contains('selected')) {
|
339 |
+
state['prompt'] = 'promptA';
|
340 |
+
} else if(document.getElementById('promptP').classList.contains('selected')) {
|
341 |
+
state['prompt'] = 'promptP';
|
342 |
+
} else {
|
343 |
+
state['prompt'] = 'promptL';
|
344 |
+
}
|
345 |
+
if(document.getElementById('sortAR').classList.contains('selected')) {
|
346 |
+
state['artistSort'] = 'sortAR';
|
347 |
+
} else {
|
348 |
+
state['artistSort'] = 'sortAA';
|
349 |
+
}
|
350 |
+
if(document.getElementById('sortTC').classList.contains('selected')) {
|
351 |
+
state['tagSort'] = 'sortTC';
|
352 |
+
} else {
|
353 |
+
state['tagSort'] = 'sortTA';
|
354 |
+
}
|
355 |
+
localStorage.setItem('tagsChecked', JSON.stringify(state));
|
356 |
+
}
|
357 |
+
|
358 |
+
function rotatePromptsImages() {
|
359 |
+
// hide all images
|
360 |
+
let images = document.querySelectorAll('.imgBox img');
|
361 |
+
images.forEach(function(image) {
|
362 |
+
image.classList.add('hidden');
|
363 |
+
});
|
364 |
+
// unhide images matching highlighted option (imgTypeShown)
|
365 |
+
if(imgTypeShown == 0) {
|
366 |
+
images = document.querySelectorAll('.img_artwork');
|
367 |
+
} else if(imgTypeShown == 1) {
|
368 |
+
images = document.querySelectorAll('.img_portrait');
|
369 |
+
} else if(imgTypeShown == 2) {
|
370 |
+
images = document.querySelectorAll('.img_landscape');
|
371 |
+
}
|
372 |
+
images.forEach(function(image) {
|
373 |
+
image.classList.remove('hidden');
|
374 |
+
});
|
375 |
+
// switch prev and next button icons
|
376 |
+
let artIndex = 0;
|
377 |
+
artIndex = imgTypeShown-1;
|
378 |
+
if(artIndex < 0) { artIndex = 2; }
|
379 |
+
let prevButtons = document.querySelectorAll('.art_prev span');
|
380 |
+
prevButtons.forEach(function(span) {
|
381 |
+
span.textContent = artTypes[artIndex];
|
382 |
+
});
|
383 |
+
artIndex = imgTypeShown+1;
|
384 |
+
if(artIndex > 2) { artIndex = 0; }
|
385 |
+
let nextButtons = document.querySelectorAll('.art_next span');
|
386 |
+
nextButtons.forEach(function(span) {
|
387 |
+
span.textContent = artTypes[artIndex];
|
388 |
+
});
|
389 |
+
}
|
390 |
+
|
391 |
+
function updateArtistsCountPerTag(whoCalled) {
|
392 |
+
var permissiveCheckbox = document.querySelector('input[name="mode"]');
|
393 |
+
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
394 |
+
var divs = document.querySelectorAll('.image-item');
|
395 |
+
var hiddenDivs = document.querySelectorAll('.image-item.hidden');
|
396 |
+
if(permissiveCheckbox.checked || whoCalled == 'start') {
|
397 |
+
// on page load, we need to add all the counts first
|
398 |
+
checkboxes.forEach(function(checkbox) {
|
399 |
+
let isTop = checkbox.parentNode.classList.contains('top_control');
|
400 |
+
if(!isTop) {
|
401 |
+
var theClass = checkbox.name.replace(/(^|\s)(\d)/g, '$1qqqq-$2');
|
402 |
+
var matchingDivs = document.querySelectorAll('.image-item.' + theClass);
|
403 |
+
var count = matchingDivs.length;
|
404 |
+
checkbox.parentNode.classList.remove('no_matches');
|
405 |
+
checkbox.parentNode.querySelector('input').disabled = false;
|
406 |
+
checkbox.parentNode.querySelector('.count').textContent = ' - ' + count.toLocaleString();
|
407 |
+
}
|
408 |
+
});
|
409 |
+
updateArtistsCountPerCategory();
|
410 |
+
}
|
411 |
+
if(!permissiveCheckbox.checked) {
|
412 |
+
checkboxes.forEach(function(checkbox) {
|
413 |
+
let isTop = checkbox.parentNode.classList.contains('top_control');
|
414 |
+
if(!isTop) {
|
415 |
+
var count = 0;
|
416 |
+
// class names can't start with a number, but some tags do
|
417 |
+
// in these cases prepending with 'qqqq-'
|
418 |
+
var theClass = checkbox.name.replace(/(^|\s)(\d)/g, '$1qqqq-$2');
|
419 |
+
if(!permissiveCheckbox.checked) {
|
420 |
+
// for strict mode, for each checkbox, only count artists with a classes matching all checked checkboxes
|
421 |
+
var matchingDivs = document.querySelectorAll('.image-item.' + theClass + ':not(.hidden)');
|
422 |
+
count = matchingDivs.length;
|
423 |
+
if(count == 0) {
|
424 |
+
checkbox.parentNode.classList.add('no_matches');
|
425 |
+
checkbox.parentNode.querySelector('input').disabled = true;
|
426 |
+
} else {
|
427 |
+
checkbox.parentNode.classList.remove('no_matches');
|
428 |
+
checkbox.parentNode.querySelector('input').disabled = false;
|
429 |
+
}
|
430 |
+
}
|
431 |
+
checkbox.parentNode.querySelector('.count').textContent = ' - ' + count.toLocaleString();
|
432 |
+
}
|
433 |
+
});
|
434 |
+
}
|
435 |
+
updateCountOfArtistsShown(divs, hiddenDivs);
|
436 |
+
}
|
437 |
+
|
438 |
+
function updateArtistsCountPerCategory() {
|
439 |
+
var imageItems = document.querySelectorAll('.image-item');
|
440 |
+
let counts = [];
|
441 |
+
for(i=0,il=tagCategories.length; i<il; i++) {
|
442 |
+
counts[i] = 0;
|
443 |
+
}
|
444 |
+
imageItems.forEach(function(imageItem) {
|
445 |
+
var classes = Array.from(imageItem.classList).map(className => {
|
446 |
+
// class names can't start with a number,
|
447 |
+
// so some classes were prepending with 'qqqq-'
|
448 |
+
// which must be ignored
|
449 |
+
return className.replace(/^qqqq-/, '');
|
450 |
+
});
|
451 |
+
for(i=0,il=tagCategories.length; i<il; i++) {
|
452 |
+
if(tagCategories[i].map(c => c.toLowerCase()).some(c => classes.includes(c))) {
|
453 |
+
counts[i]++;
|
454 |
+
}
|
455 |
+
}
|
456 |
+
});
|
457 |
+
for(i=0,il=tagCategories.length; i<il; i++) {
|
458 |
+
let label = document.querySelector('[data-category-name="' + tagCategories[i][0] + '"]');
|
459 |
+
label.querySelector('.count').textContent = ' - ' + counts[i].toLocaleString();
|
460 |
+
}
|
461 |
+
}
|
462 |
+
|
463 |
+
function updateCountOfArtistsShown(divs, hiddenDivs) {
|
464 |
+
if(!divs) {
|
465 |
+
// when this is called by change of a checkbox, divs is not passed
|
466 |
+
var divs = document.querySelectorAll('.image-item');
|
467 |
+
var hiddenDivs = document.querySelectorAll('.image-item.hidden');
|
468 |
+
}
|
469 |
+
var visible = divs.length - hiddenDivs.length;
|
470 |
+
var percent = Math.round((visible / divs.length) * 100) + '%';
|
471 |
+
if(percent == '0%') {
|
472 |
+
percent = '<1%';
|
473 |
+
}
|
474 |
+
var el = document.getElementById('artistsShown').querySelector('.count');
|
475 |
+
el.textContent = 'shown - ' + visible.toLocaleString() + ' / ' + percent;
|
476 |
+
}
|
477 |
+
|
478 |
+
function checkAllInCategory(theCheckbox) {
|
479 |
+
let thisLabel = theCheckbox.parentNode;
|
480 |
+
if (thisLabel.classList.contains('category')) {
|
481 |
+
let container = document.getElementById('toggles');
|
482 |
+
let labels = container.getElementsByTagName('label');
|
483 |
+
let isChecking = false;
|
484 |
+
for (let label of labels) {
|
485 |
+
// If we reach 'thisLabel', start checking.
|
486 |
+
if(label === thisLabel) {
|
487 |
+
isChecking = true;
|
488 |
+
continue; // Skip 'thisLabel' itself.
|
489 |
+
}
|
490 |
+
// If 'isChecking' is true and we found another 'category', stop checking.
|
491 |
+
if(isChecking && label.classList.contains('category')) {
|
492 |
+
break;
|
493 |
+
}
|
494 |
+
// If 'isChecking' is true, check or uncheck the checkbox inside the current label.
|
495 |
+
if(isChecking) {
|
496 |
+
if(!label.classList.contains('hidden')) {
|
497 |
+
// hidden labels must remain unchecked
|
498 |
+
let checkbox = label.querySelector('input[type="checkbox"]');
|
499 |
+
if(checkbox) {
|
500 |
+
checkbox.checked = theCheckbox.checked;
|
501 |
+
}
|
502 |
+
}
|
503 |
+
}
|
504 |
+
}
|
505 |
+
}
|
506 |
+
}
|
507 |
+
|
508 |
+
function hideAllArtists() {
|
509 |
+
var imageItems = document.querySelectorAll('.image-item');
|
510 |
+
imageItems.forEach(function(imageItem) {
|
511 |
+
imageItem.classList.add('hidden');
|
512 |
+
});
|
513 |
+
}
|
514 |
+
|
515 |
+
function unhideBasedOnPermissiveSetting() {
|
516 |
+
var permissiveCheckbox = document.querySelector('input[name="mode"]');
|
517 |
+
if(permissiveCheckbox.checked) {
|
518 |
+
permissiveCheckbox.parentNode.classList.remove('warning');
|
519 |
+
unhideArtistsPermissive();
|
520 |
+
} else {
|
521 |
+
permissiveCheckbox.parentNode.classList.add('warning');
|
522 |
+
unhideArtistsStrict();
|
523 |
+
}
|
524 |
+
var unHidden = document.querySelectorAll('.image-item').length - document.querySelectorAll('.image-item.hidden').length;
|
525 |
+
if(unHidden == 0) {
|
526 |
+
document.getElementById('filtersHidingAll').classList.add('shown');
|
527 |
+
} else {
|
528 |
+
document.getElementById('filtersHidingAll').classList.remove('shown');
|
529 |
+
}
|
530 |
+
}
|
531 |
+
|
532 |
+
function unhideArtistsPermissive() {
|
533 |
+
// permissive mode unhides images that match ANY checked tag
|
534 |
+
// the set of checkboxes is derived from the unique tags within the imageItem (Artists) classes
|
535 |
+
var imageItems = document.querySelectorAll('.image-item');
|
536 |
+
var checkboxes = Array.from(document.querySelectorAll('input[type="checkbox"]'))
|
537 |
+
.filter(cb => !cb.parentNode.classList.contains("top_control"));
|
538 |
+
checkboxes.push(document.querySelector('input[name="favorite"]'));
|
539 |
+
var checked = checkboxes.filter(cb => cb.checked).map(cb => cb.name);
|
540 |
+
imageItems.forEach(function(imageItem) {
|
541 |
+
var classes = Array.from(imageItem.classList).map(className => {
|
542 |
+
// class names can't start with a number,
|
543 |
+
// so some classes were prepending with 'qqqq-'
|
544 |
+
// which must be ignored
|
545 |
+
return className.replace(/^qqqq-/, '');
|
546 |
+
});
|
547 |
+
if(checked.some(c => classes.includes(c))) {
|
548 |
+
imageItem.classList.remove('hidden');
|
549 |
+
}
|
550 |
+
});
|
551 |
+
}
|
552 |
+
|
553 |
+
function unhideArtistsStrict() {
|
554 |
+
// strict mode unhides images that match ALL checked tags
|
555 |
+
// the set of checkboxes is derived from the unique tags within the imageItem (Artists) classes
|
556 |
+
var imageItems = document.querySelectorAll('.image-item');
|
557 |
+
var checkboxes = Array.from(document.querySelectorAll('input[type="checkbox"]'))
|
558 |
+
.filter(cb => !cb.parentNode.classList.contains("top_control"));
|
559 |
+
checkboxes.push(document.querySelector('input[name="favorite"]'));
|
560 |
+
var checked = checkboxes.filter(cb => cb.checked).map(cb => cb.name);
|
561 |
+
if(checked.length > 0) {
|
562 |
+
imageItems.forEach(function(imageItem, index) {
|
563 |
+
var classes = Array.from(imageItem.classList).map(className => {
|
564 |
+
// class names can't start with a number,
|
565 |
+
// so some classes were prepending with 'qqqq-'
|
566 |
+
// which must be ignored
|
567 |
+
return className.replace(/^qqqq-/, '');
|
568 |
+
});
|
569 |
+
if(checked.every(c => classes.includes(c))) {
|
570 |
+
imageItem.classList.remove('hidden');
|
571 |
+
}
|
572 |
+
});
|
573 |
+
} else {
|
574 |
+
// while not strictly logical, it's needed because
|
575 |
+
// nothing would be checkable if strict is entered while everything is unchecked
|
576 |
+
imageItems.forEach(function(imageItem) {
|
577 |
+
imageItem.classList.remove('hidden');
|
578 |
+
});
|
579 |
+
}
|
580 |
+
}
|
581 |
+
|
582 |
+
function unhideAristsExact() {
|
583 |
+
// exact mode isn't currently used because almost no two artists have the same set of tags
|
584 |
+
// exact mode unhides images that match ALL checked tags and NO unchecked tags
|
585 |
+
// the set of checkboxes is derived from the unique tags within the imageItem (Artists) classes
|
586 |
+
var imageItems = document.querySelectorAll('.image-item');
|
587 |
+
var checkboxes = Array.from(document.querySelectorAll('input[type="checkbox"]'))
|
588 |
+
.filter(cb => !cb.parentNode.classList.contains("top_control"));
|
589 |
+
checkboxes.push(document.querySelector('input[name="favorite"]'));
|
590 |
+
var checked = checkboxes.filter(cb => cb.checked).map(cb => cb.name);
|
591 |
+
var unchecked = checkboxes.filter(cb => !cb.checked).map(cb => cb.name);
|
592 |
+
if(checked.length > 0) {
|
593 |
+
imageItems.forEach(function(imageItem, index) {
|
594 |
+
var classes = Array.from(imageItem.classList);
|
595 |
+
if(checked.every(c => classes.includes(c))) {
|
596 |
+
if(unchecked.every(c => !classes.includes(c))) {
|
597 |
+
imageItem.classList.remove('hidden');
|
598 |
+
}
|
599 |
+
}
|
600 |
+
});
|
601 |
+
}
|
602 |
+
}
|
603 |
+
|
604 |
+
function checkOrUncheckAll(isChecked) {
|
605 |
+
var divs = document.querySelectorAll('.image-item');
|
606 |
+
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
607 |
+
if(isChecked) {
|
608 |
+
checkboxes.forEach(function(checkbox) {
|
609 |
+
let label = checkbox.parentNode;
|
610 |
+
let isTop = label.classList.contains('top_control');
|
611 |
+
let isHidden = label.classList.contains('hidden');
|
612 |
+
if(!isTop || checkbox.name == 'favorite') {
|
613 |
+
if(!isHidden) {
|
614 |
+
// hidden label must not be checked
|
615 |
+
checkbox.checked = true;
|
616 |
+
}
|
617 |
+
};
|
618 |
+
});
|
619 |
+
} else {
|
620 |
+
checkboxes.forEach(function(checkbox) {
|
621 |
+
let label = checkbox.parentNode;
|
622 |
+
let isTop = label.classList.contains('top_control');
|
623 |
+
if(!isTop || checkbox.name == 'favorite') {
|
624 |
+
checkbox.checked = false;
|
625 |
+
}
|
626 |
+
});
|
627 |
+
}
|
628 |
+
}
|
629 |
+
|
630 |
+
function showInstructions() {
|
631 |
+
document.getElementById('instructions').classList.add('shown');
|
632 |
+
hideToggles();
|
633 |
+
}
|
634 |
+
|
635 |
+
function showAbout() {
|
636 |
+
document.getElementById('about').classList.add('shown');
|
637 |
+
hideToggles();
|
638 |
+
}
|
639 |
+
|
640 |
+
function showExport() {
|
641 |
+
document.getElementById('export').classList.add('shown');
|
642 |
+
hideToggles();
|
643 |
+
var textarea = document.getElementById('export').getElementsByTagName('textarea')[0];
|
644 |
+
var favorites = localStorage.getItem('favoritedArtists');
|
645 |
+
var value = '';
|
646 |
+
if(favorites) {
|
647 |
+
value += 'You have favorited these artists:\r\n';
|
648 |
+
for (let key in JSON.parse(favorites)) {
|
649 |
+
if (JSON.parse(favorites)[key] === true) {
|
650 |
+
let names = key.split("|");
|
651 |
+
if(!names[0]) { names[0] = '(no first name)'; }
|
652 |
+
value += '•' + names[0] + ',' + names[1] + '\r\n';
|
653 |
+
}
|
654 |
+
}
|
655 |
+
value += '\r\n\r\nTo import these favorites later, click "copy to clipboard" and save to any file. Then paste the text from that file into this text box, and click "import". The imported text must contain the JSON string below (the curly brackets and what\'s between them). It must not contain any other more than one set of curly brackets.\r\n\r\n' + favorites;
|
656 |
+
textarea.value = value;
|
657 |
+
} else {
|
658 |
+
value += 'You haven\'t favorited any artists yet.\r\n\r\n';
|
659 |
+
value += 'To import favorites that you exported earlier, paste the text into this text box, and click "import".';
|
660 |
+
}
|
661 |
+
}
|
662 |
+
|
663 |
+
function copyExportToClipboard() {
|
664 |
+
var favorites = document.getElementById('export').getElementsByTagName('textarea')[0].value;
|
665 |
+
navigator.clipboard.writeText(favorites);
|
666 |
+
doAlert('Favorites copied to clipboard!');
|
667 |
+
}
|
668 |
+
|
669 |
+
function importFavorites() {
|
670 |
+
let el = document.getElementById('export').getElementsByTagName('textarea')[0];
|
671 |
+
let favorites = el.value;
|
672 |
+
let startCount = (favorites.match(/{/g) || []).length;
|
673 |
+
let endCount = (favorites.match(/}/g) || []).length;
|
674 |
+
if (startCount > 1 || endCount > 1) {
|
675 |
+
el.value = 'That text can\'t be imported because it contains multiple curly brackets {}.'
|
676 |
+
return null;
|
677 |
+
}
|
678 |
+
let start = favorites.indexOf('{');
|
679 |
+
let end = favorites.lastIndexOf('}');
|
680 |
+
if (start === -1 || end === -1) {
|
681 |
+
el.value = 'That text can\'t be imported because it contains zero curly brackets {}.'
|
682 |
+
return null;
|
683 |
+
}
|
684 |
+
let jsonString = favorites.substring(start, end + 1);
|
685 |
+
try {
|
686 |
+
let jsonObject = JSON.parse(jsonString);
|
687 |
+
// Check structure of each key-value pair in jsonObject
|
688 |
+
for (let key in jsonObject) {
|
689 |
+
let value = jsonObject[key];
|
690 |
+
if (!key.includes('|') || typeof value !== 'boolean') {
|
691 |
+
el.value = 'That text can\'t be imported because the JSON string it contains doesn\'t contain a valid list of artists.'
|
692 |
+
return null;
|
693 |
+
}
|
694 |
+
}
|
695 |
+
if(confirm('This will overwrite any saved favorites. Are you sure?')) {
|
696 |
+
localStorage.setItem('favoritedArtists', jsonString);
|
697 |
+
alert('Favorites were imported!');
|
698 |
+
loadFavoritesState();
|
699 |
+
} else {
|
700 |
+
alert('Okay, you have cancelled the import.');
|
701 |
+
return null;
|
702 |
+
}
|
703 |
+
} catch(e) {
|
704 |
+
el.value = 'That text can\'t be imported because it doesn\'t contain a valid JSON sting.'
|
705 |
+
return null;
|
706 |
+
}
|
707 |
+
}
|
708 |
+
|
709 |
+
function hideInformation() {
|
710 |
+
var information = document.querySelectorAll('.information');
|
711 |
+
information.forEach(function(element) {
|
712 |
+
element.classList.remove('shown');
|
713 |
+
});
|
714 |
+
showToggles();
|
715 |
+
}
|
716 |
+
|
717 |
+
function sortTags() {
|
718 |
+
if(document.getElementById('sortTC').classList.contains('selected')) {
|
719 |
+
sortTagsByCount();
|
720 |
+
} else {
|
721 |
+
sortTagsByAlpha();
|
722 |
+
}
|
723 |
+
}
|
724 |
+
|
725 |
+
function sortTagsByAlpha() {
|
726 |
+
var useCategories = document.querySelector('input[name="use_categories"]').checked;
|
727 |
+
let container = document.getElementById('toggles');
|
728 |
+
let labels = Array.from(container.getElementsByTagName('label'));
|
729 |
+
if (!useCategories) {
|
730 |
+
// <labels> with class="category" are hidden, sort all other labels together by alpha
|
731 |
+
labels.sort(function(a, b) {
|
732 |
+
var aValue = a.querySelector('input[type="checkbox"]').name;
|
733 |
+
var bValue = b.querySelector('input[type="checkbox"]').name;
|
734 |
+
return aValue.localeCompare(bValue);
|
735 |
+
});
|
736 |
+
labels.forEach(function(label) {
|
737 |
+
let isTop = label.classList.contains('top_control');
|
738 |
+
if(!isTop) {
|
739 |
+
// appendChild will move the element to the end of the container
|
740 |
+
container.appendChild(label);
|
741 |
+
}
|
742 |
+
});
|
743 |
+
} else {
|
744 |
+
let labelMap = labels.reduce((acc, label) => {
|
745 |
+
// map: keys are checkbox names, values are corresponding parent label element
|
746 |
+
let checkboxName = label.querySelector('input[type="checkbox"]').name;
|
747 |
+
acc[checkboxName.toLowerCase()] = label;
|
748 |
+
return acc;
|
749 |
+
}, {});
|
750 |
+
// sort tags that exist in tagCategories under that category
|
751 |
+
tagCategories.forEach(arrayOfTags => {
|
752 |
+
// first append the label that matches the category name
|
753 |
+
let categoryName = arrayOfTags[0];
|
754 |
+
let categoryLabel = labelMap[categoryName.toLowerCase()];
|
755 |
+
if (categoryLabel) {
|
756 |
+
container.appendChild(categoryLabel);
|
757 |
+
}
|
758 |
+
// the append the sorted labels that match the tag
|
759 |
+
let arrayOfTagsLower = arrayOfTags.slice(1).map(tag => tag.toLowerCase());
|
760 |
+
arrayOfTagsLower.sort();
|
761 |
+
arrayOfTagsLower.forEach(tag => {
|
762 |
+
let label = labelMap[tag];
|
763 |
+
if (label) {
|
764 |
+
let isTop = label.classList.contains('top_control');
|
765 |
+
if(!isTop) {
|
766 |
+
label.dataset.isInCategory = categoryLabel.dataset.categoryName;
|
767 |
+
// appendChild will move the element to the end of the container
|
768 |
+
container.appendChild(label);
|
769 |
+
}
|
770 |
+
// remove this label from the map
|
771 |
+
delete labelMap[tag];
|
772 |
+
}
|
773 |
+
});
|
774 |
+
if(categoryName == 'important') {
|
775 |
+
container.appendChild(document.getElementById('edit_most_used'));
|
776 |
+
}
|
777 |
+
});
|
778 |
+
// this leaves all the tags that didn't exist in tagCategories sorted at the top
|
779 |
+
let leftoverLabelsKeys = Object.keys(labelMap);
|
780 |
+
leftoverLabelsKeys.sort();
|
781 |
+
leftoverLabelsKeys.forEach(key => {
|
782 |
+
let label = labelMap[key];
|
783 |
+
if (label && !label.classList.contains('top_control') && !label.classList.contains('category')) {
|
784 |
+
label.dataset.isInCategory = 'other';
|
785 |
+
container.appendChild(label);
|
786 |
+
}
|
787 |
+
});
|
788 |
+
}
|
789 |
+
}
|
790 |
+
|
791 |
+
function sortTagsByCount() {
|
792 |
+
var useCategories = document.querySelector('input[name="use_categories"]').checked;
|
793 |
+
let container = document.getElementById('toggles');
|
794 |
+
let labels = Array.from(container.getElementsByTagName('label'));
|
795 |
+
if (!useCategories) {
|
796 |
+
labels.sort(function(a, b) {
|
797 |
+
var numA = parseInt(a.querySelector('.count').textContent.replace(/,/g, '').trim().substring(2),10);
|
798 |
+
var numB = parseInt(b.querySelector('.count').textContent.replace(/,/g, '').trim().substring(2),10);
|
799 |
+
return numB - numA;
|
800 |
+
});
|
801 |
+
labels.forEach(function(label) {
|
802 |
+
let isTop = label.classList.contains('top_control');
|
803 |
+
if(!isTop) {
|
804 |
+
// appendChild will move the element to the end of the container
|
805 |
+
container.appendChild(label);
|
806 |
+
}
|
807 |
+
});
|
808 |
+
} else {
|
809 |
+
let labelMap = labels.reduce((acc, label) => {
|
810 |
+
// map: keys are checkbox names, values are corresponding parent label element
|
811 |
+
let checkboxName = label.querySelector('input[type="checkbox"]').name;
|
812 |
+
acc[checkboxName.toLowerCase()] = label;
|
813 |
+
return acc;
|
814 |
+
}, {});
|
815 |
+
tagCategories.forEach(arrayOfTags => {
|
816 |
+
let categoryName = arrayOfTags[0];
|
817 |
+
let categoryLabel = labelMap[categoryName.toLowerCase()];
|
818 |
+
if (categoryLabel) {
|
819 |
+
container.appendChild(categoryLabel);
|
820 |
+
}
|
821 |
+
// get the list of tags from the category array
|
822 |
+
let arrayOfTagsLower = arrayOfTags.slice(1).map(tag => tag.toLowerCase());
|
823 |
+
// Sort by the number in each label
|
824 |
+
arrayOfTagsLowerExisting = [];
|
825 |
+
arrayOfTagsLower.forEach(function(tag) {
|
826 |
+
if(labelMap[tag]) {
|
827 |
+
arrayOfTagsLowerExisting.push(tag);
|
828 |
+
}
|
829 |
+
});
|
830 |
+
arrayOfTagsLowerExisting.sort((a, b) => {
|
831 |
+
let labelA = labelMap[a];
|
832 |
+
let labelB = labelMap[b];
|
833 |
+
if(labelA && labelB){
|
834 |
+
let numA = parseInt(labelA.querySelector('.count').textContent.replace(/,/g, '').trim().substring(2), 10);
|
835 |
+
let numB = parseInt(labelB.querySelector('.count').textContent.replace(/,/g, '').trim().substring(2), 10);
|
836 |
+
return numB - numA;
|
837 |
+
} else {
|
838 |
+
return 0;
|
839 |
+
}
|
840 |
+
});
|
841 |
+
arrayOfTagsLowerExisting.forEach(tag => {
|
842 |
+
let label = labelMap[tag];
|
843 |
+
if (label) {
|
844 |
+
let isTop = label.classList.contains('top_control');
|
845 |
+
if (!isTop) {
|
846 |
+
// appendChild will move the element to the end of the container
|
847 |
+
label.dataset.isInCategory = categoryLabel.dataset.categoryName;
|
848 |
+
container.appendChild(label);
|
849 |
+
}
|
850 |
+
// remove this label from the map
|
851 |
+
delete labelMap[tag];
|
852 |
+
}
|
853 |
+
});
|
854 |
+
if(categoryName == 'important') {
|
855 |
+
container.appendChild(document.getElementById('edit_most_used'));
|
856 |
+
}
|
857 |
+
});
|
858 |
+
let leftoverLabelsKeys = Object.keys(labelMap);
|
859 |
+
// Sort the leftover labels keys by the number in each label
|
860 |
+
leftoverLabelsKeys.sort((a, b) => {
|
861 |
+
let labelA = labelMap[a];
|
862 |
+
let labelB = labelMap[b];
|
863 |
+
if(labelA && labelB){
|
864 |
+
let numA = parseInt(labelA.querySelector('.count').textContent.replace(/,/g, '').trim().substring(2), 10);
|
865 |
+
let numB = parseInt(labelB.querySelector('.count').textContent.replace(/,/g, '').trim().substring(2), 10);
|
866 |
+
return numB - numA;
|
867 |
+
} else {
|
868 |
+
return 0;
|
869 |
+
}
|
870 |
+
});
|
871 |
+
leftoverLabelsKeys.forEach(key => {
|
872 |
+
let label = labelMap[key];
|
873 |
+
if (label && !label.classList.contains('top_control') && !label.classList.contains('category')) {
|
874 |
+
label.dataset.isInCategory = 'other';
|
875 |
+
container.appendChild(label);
|
876 |
+
}
|
877 |
+
});
|
878 |
+
}
|
879 |
+
}
|
880 |
+
|
881 |
+
function loadMostUsedTags() {
|
882 |
+
let state = JSON.parse(localStorage.getItem('mustUsedTags')) || {};
|
883 |
+
let mostUsedCategory = document.querySelector('[data-category-name="important"]');
|
884 |
+
for(let tag in state) {
|
885 |
+
if (state[tag]) {
|
886 |
+
let label = document.querySelector('input[name="'+ tag +'"]').parentNode;
|
887 |
+
label.classList.add('is_most_used');
|
888 |
+
label.querySelectorAll('.most_used_indicator')[0].textContent = '-';
|
889 |
+
mostUsedCategory.after(label);
|
890 |
+
updateTagArrayToMatchMostUsed(true,label,tag);
|
891 |
+
}
|
892 |
+
};
|
893 |
+
}
|
894 |
+
|
895 |
+
function updateTagArrayToMatchMostUsed(isAdding,label,tag) {
|
896 |
+
// need to updated tagCategories because it's used to show sums of the categories
|
897 |
+
// the first category in tagCategories stores the important tags unless the database is messed up
|
898 |
+
if(isAdding) {
|
899 |
+
tagCategories[0].push(tag);
|
900 |
+
// remove tag from its original category
|
901 |
+
for(i=0,il<tagCategories.length; i<il; i++) {
|
902 |
+
if(tagCategories[i][0] == label.dataset.isInCategory) {
|
903 |
+
tagCategories[i] = tagCategories[i].filter(function(ele){
|
904 |
+
return ele != tag;
|
905 |
+
});
|
906 |
+
break;
|
907 |
+
}
|
908 |
+
}
|
909 |
+
} else {
|
910 |
+
tagCategories[0] = tagCategories[0].filter(function(ele){
|
911 |
+
return ele != tag;
|
912 |
+
});
|
913 |
+
// add tag back to it's original category
|
914 |
+
for(i=0,il<tagCategories.length; i<il; i++) {
|
915 |
+
if(tagCategories[i][0] == label.dataset.isInCategory) {
|
916 |
+
tagCategories[i].push(tag);
|
917 |
+
break;
|
918 |
+
}
|
919 |
+
}
|
920 |
+
}
|
921 |
+
}
|
922 |
+
|
923 |
+
function storeMostUsedState(label) {
|
924 |
+
var name = label.querySelector('input').name;
|
925 |
+
let state = JSON.parse(localStorage.getItem('mustUsedTags')) || {};
|
926 |
+
state[name] = label.classList.contains('is_most_used');
|
927 |
+
localStorage.setItem('mustUsedTags', JSON.stringify(state));
|
928 |
+
}
|
929 |
+
|
930 |
+
function enterExitEditMostUsedMode(doExit) {
|
931 |
+
let inputs = Array.from(document.querySelectorAll('input'));
|
932 |
+
if(editMode || doExit) {
|
933 |
+
// exit edit mode
|
934 |
+
editMode = false;
|
935 |
+
document.getElementById('edit_most_used').textContent = 'edit';
|
936 |
+
document.getElementById('layout').classList.remove('edit_mode');
|
937 |
+
inputs.forEach(function(input) {
|
938 |
+
input.disabled = false;
|
939 |
+
});
|
940 |
+
let labels = Array.from(document.querySelectorAll('.was_moved'));
|
941 |
+
labels.forEach(function(label) {
|
942 |
+
// clean up classes added to track moved tags during edit mode
|
943 |
+
label.classList.remove('was_moved');
|
944 |
+
})
|
945 |
+
updateArtistsCountPerCategory();
|
946 |
+
} else {
|
947 |
+
// enter edit mode
|
948 |
+
editMode = true;
|
949 |
+
document.getElementById('edit_most_used').textContent = 'exit editing';
|
950 |
+
document.getElementById('layout').classList.add('edit_mode');
|
951 |
+
inputs.forEach(function(input) {
|
952 |
+
input.disabled = true;
|
953 |
+
});
|
954 |
+
}
|
955 |
+
}
|
956 |
+
|
957 |
+
function addRemoveIsMostUsed(label) {
|
958 |
+
let mostUsedCategory = document.querySelector('[data-category-name="important"]');
|
959 |
+
if(label.classList.contains('is_most_used')) {
|
960 |
+
// remove it
|
961 |
+
label.classList.remove('is_most_used');
|
962 |
+
label.querySelectorAll('.most_used_indicator')[0].textContent = '+';
|
963 |
+
let originalCategory = document.querySelector('[data-category-name="' + label.dataset.isInCategory + '"]');
|
964 |
+
originalCategory.after(label);
|
965 |
+
updateTagArrayToMatchMostUsed(false,label,label.querySelector('input').name);
|
966 |
+
} else {
|
967 |
+
// add it
|
968 |
+
label.classList.add('is_most_used');
|
969 |
+
label.querySelectorAll('.most_used_indicator')[0].textContent = '-';
|
970 |
+
mostUsedCategory.after(label);
|
971 |
+
updateTagArrayToMatchMostUsed(true,label,label.querySelector('input').name);
|
972 |
+
}
|
973 |
+
label.classList.add('was_moved');
|
974 |
+
}
|
975 |
+
|
976 |
+
function sortArtists() {
|
977 |
+
if(document.getElementById('sortAR').classList.contains('selected')) {
|
978 |
+
sortArtistsByRandom();
|
979 |
+
} else {
|
980 |
+
sortArtistsByAlpha();
|
981 |
+
}
|
982 |
+
}
|
983 |
+
|
984 |
+
function sortArtistsByAlpha() {
|
985 |
+
var imageItems = Array.from(document.querySelectorAll('.image-item'));
|
986 |
+
imageItems.sort(function(a, b) {
|
987 |
+
var aValue = a.querySelector('.lastN').textContent;
|
988 |
+
var bValue = b.querySelector('.lastN').textContent;
|
989 |
+
return aValue.localeCompare(bValue);
|
990 |
+
});
|
991 |
+
imageItems.forEach(function(item) {
|
992 |
+
// appendChild will move the element to the end of the container
|
993 |
+
document.getElementById('image-container').appendChild(item);
|
994 |
+
});
|
995 |
+
}
|
996 |
+
|
997 |
+
function sortArtistsByRandom() {
|
998 |
+
var imageItems = Array.from(document.querySelectorAll('.image-item'));
|
999 |
+
imageItems.forEach(function(item) {
|
1000 |
+
item.dataset.randomRank = Math.random();
|
1001 |
+
});
|
1002 |
+
imageItems.sort(function(a, b) {
|
1003 |
+
var aValue = a.dataset.randomRank;
|
1004 |
+
var bValue = b.dataset.randomRank;
|
1005 |
+
return bValue - aValue;
|
1006 |
+
});
|
1007 |
+
imageItems.forEach(function(item) {
|
1008 |
+
// appendChild will move the element to the end of the container
|
1009 |
+
document.getElementById('image-container').appendChild(item);
|
1010 |
+
});
|
1011 |
+
}
|
1012 |
+
|
1013 |
+
function hideToggles() {
|
1014 |
+
document.getElementById('toggles').classList.add('hide');
|
1015 |
+
}
|
1016 |
+
|
1017 |
+
function showToggles() {
|
1018 |
+
document.getElementById('toggles').classList.remove('hide');
|
1019 |
+
}
|
1020 |
+
|
1021 |
+
function addOrRemoveFavorite(artist) {
|
1022 |
+
if(artist.classList.contains('favorite')) {
|
1023 |
+
artist.classList.remove('favorite');
|
1024 |
+
} else {
|
1025 |
+
artist.classList.add('favorite');
|
1026 |
+
}
|
1027 |
+
}
|
1028 |
+
|
1029 |
+
function loadFavoritesState() {
|
1030 |
+
let state = JSON.parse(localStorage.getItem('favoritedArtists')) || {};
|
1031 |
+
let artists = document.getElementsByClassName('image-item');
|
1032 |
+
for(let artist of artists) {
|
1033 |
+
let artistName = artist.getElementsByClassName('firstN')[0].textContent + '|' + artist.getElementsByClassName('lastN')[0].textContent;
|
1034 |
+
if(state[artistName]) {
|
1035 |
+
artist.classList.add('favorite');
|
1036 |
+
} else {
|
1037 |
+
artist.classList.remove('favorite');
|
1038 |
+
}
|
1039 |
+
}
|
1040 |
+
updateFavoritesCount();
|
1041 |
+
}
|
1042 |
+
|
1043 |
+
function storeFavoriteState(artist) {
|
1044 |
+
var artistName = artist.getElementsByClassName('firstN')[0].textContent + '|' + artist.getElementsByClassName('lastN')[0].textContent;
|
1045 |
+
var isFavorited = artist.classList.contains('favorite');
|
1046 |
+
let state = JSON.parse(localStorage.getItem('favoritedArtists')) || {};
|
1047 |
+
state[artistName] = isFavorited;
|
1048 |
+
localStorage.setItem('favoritedArtists', JSON.stringify(state));
|
1049 |
+
}
|
1050 |
+
|
1051 |
+
function updateFavoritesCount() {
|
1052 |
+
var favoritedArtists = document.getElementsByClassName('favorite');
|
1053 |
+
var favoriteCount = favoritedArtists.length;
|
1054 |
+
var favoriteCounter = document.querySelectorAll('input[name="favorite"]')[0].parentNode.querySelector('.count');
|
1055 |
+
favoriteCounter.textContent = ' - ' + favoriteCount;
|
1056 |
+
}
|
1057 |
+
|
1058 |
+
function doAlert(str) {
|
1059 |
+
var alert = document.getElementById('alert');
|
1060 |
+
alert.textContent = str;
|
1061 |
+
alert.classList.remove('show');
|
1062 |
+
window.clearTimeout(timer);
|
1063 |
+
timer = setTimeout(showAlert, 100);
|
1064 |
+
}
|
1065 |
+
|
1066 |
+
function showAlert() {
|
1067 |
+
var alert = document.getElementById('alert');
|
1068 |
+
alert.classList.add('show');
|
1069 |
+
timer = setTimeout(hideAlert, 2000);
|
1070 |
+
}
|
1071 |
+
|
1072 |
+
function hideAlert() {
|
1073 |
+
var alert = document.getElementById('alert');
|
1074 |
+
alert.classList.remove('show');
|
1075 |
+
}
|
1076 |
+
|
1077 |
+
function copyStuffToClipboard(item,stuff) {
|
1078 |
+
if(stuff == 'name') {
|
1079 |
+
var str = item.closest('.image-item').getElementsByClassName('firstN')[0].textContent +
|
1080 |
+
' ' + item.closest('.image-item').getElementsByClassName('lastN')[0].textContent;
|
1081 |
+
doAlert('Copied to name clipboard!');
|
1082 |
+
} else if(stuff == 'tags') {
|
1083 |
+
console.log(item);
|
1084 |
+
var str = item.textContent;
|
1085 |
+
doAlert('Copied to tags clipboard!');
|
1086 |
+
}
|
1087 |
+
navigator.clipboard.writeText(str);
|
1088 |
+
}
|
1089 |
+
|
1090 |
+
function toggleThisArtistsTags(tagsStr) {
|
1091 |
+
let names = tagsStr.split(', ');
|
1092 |
+
let allChecked = true;
|
1093 |
+
for(i=0,il=names.length;i<il;i++) {
|
1094 |
+
if(!document.querySelector('input[name="'+names[i]+'"]').checked) {
|
1095 |
+
allChecked = false;
|
1096 |
+
break;
|
1097 |
+
}
|
1098 |
+
}
|
1099 |
+
for(i=0,il=names.length;i<il;i++) {
|
1100 |
+
var checkbox = document.querySelector('input[name="'+names[i]+'"]');
|
1101 |
+
if(allChecked) {
|
1102 |
+
checkbox.checked = false;
|
1103 |
+
} else {
|
1104 |
+
checkbox.checked = true;
|
1105 |
+
}
|
1106 |
+
storeCheckboxState(checkbox);
|
1107 |
+
}
|
1108 |
+
}
|
1109 |
+
|
1110 |
+
function showHideCategories() {
|
1111 |
+
let useCategories = document.querySelectorAll('input[name="use_categories"]')[0].checked;
|
1112 |
+
let categories = document.getElementsByClassName('category');
|
1113 |
+
for(let category of categories) {
|
1114 |
+
if(useCategories) {
|
1115 |
+
category.classList.remove('hidden');
|
1116 |
+
} else {
|
1117 |
+
category.classList.add('hidden');
|
1118 |
+
}
|
1119 |
+
}
|
1120 |
+
let editLink = document.getElementById('edit_most_used');
|
1121 |
+
if(useCategories) {
|
1122 |
+
editLink.classList.remove('hidden');
|
1123 |
+
} else {
|
1124 |
+
editLink.classList.add('hidden');
|
1125 |
+
}
|
1126 |
+
}
|
1127 |
+
|
1128 |
+
function showHideLowCountTags() {
|
1129 |
+
var hideLowCount = document.querySelector('input[name="low_count"]').checked;
|
1130 |
+
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
1131 |
+
checkboxes.forEach(function(checkbox) {
|
1132 |
+
if(hideLowCount) {
|
1133 |
+
if(checkbox.parentNode.classList.contains('category') || checkbox.parentNode.classList.contains('no_matches')) {
|
1134 |
+
// skip hide
|
1135 |
+
} else {
|
1136 |
+
let count = parseInt(checkbox.parentNode.querySelector('.count').textContent.replace(/,/g, '').trim().substring(2),10);
|
1137 |
+
if(count < 3) {
|
1138 |
+
checkbox.checked = false;
|
1139 |
+
checkbox.parentNode.classList.add('hidden');
|
1140 |
+
}
|
1141 |
+
}
|
1142 |
+
} else {
|
1143 |
+
checkbox.parentNode.classList.remove('hidden');
|
1144 |
+
}
|
1145 |
+
showHideCategories();
|
1146 |
+
});
|
1147 |
+
}
|
1148 |
+
|
1149 |
+
function loadLargerImages(imageItem) {
|
1150 |
+
let images = imageItem.querySelectorAll('img');
|
1151 |
+
let missingFiles = '';
|
1152 |
+
let imagePromises = Array.from(images).map((img) => {
|
1153 |
+
if(img.src.indexOf('_thumbs') > -1) {
|
1154 |
+
let first = img.closest('.image-item').querySelector('.firstN');
|
1155 |
+
let last = img.closest('.image-item').querySelector('.lastN');
|
1156 |
+
return new Promise((resolve, reject) => {
|
1157 |
+
img.onload = () => {
|
1158 |
+
resolve();
|
1159 |
+
}
|
1160 |
+
img.onerror = () => {
|
1161 |
+
missingFiles += '<li>' + first + '_' + last + '-artwork.webp</li>';
|
1162 |
+
reject();
|
1163 |
+
};
|
1164 |
+
img.src = img.src.replace('_thumbs','');
|
1165 |
+
});
|
1166 |
+
}
|
1167 |
+
});
|
1168 |
+
let report = document.getElementById('missing_images_report');
|
1169 |
+
if(imagePromises.length > 0) {
|
1170 |
+
Promise.allSettled(imagePromises).then(() => {
|
1171 |
+
if(missingFiles.indexOf('webp')>0) {
|
1172 |
+
report.innerHTML += missingFiles;
|
1173 |
+
}
|
1174 |
+
});
|
1175 |
+
}
|
1176 |
+
}
|
1177 |
+
|
1178 |
+
function hideLargerImageBackup(imageItem) {
|
1179 |
+
// very fast mouse movement from the thumbnail to the larger image can
|
1180 |
+
// cause the browser to fail to detect that CSS imageItem:hover is no longer true
|
1181 |
+
// therefore we need this backup, but we minimize mousemove listening
|
1182 |
+
windowWidth = window.innerWidth;
|
1183 |
+
let layout = document.getElementById('layout');
|
1184 |
+
// store a reference to the bound function, allowing it to be removed
|
1185 |
+
imageItem.boundMouseMoveFunc = mouseMoveFunc.bind(null, imageItem);
|
1186 |
+
layout.addEventListener('mousemove', imageItem.boundMouseMoveFunc);
|
1187 |
+
timer = setTimeout(function() {
|
1188 |
+
cleanupEventListener(imageItem);
|
1189 |
+
}, 200);
|
1190 |
+
}
|
1191 |
+
|
1192 |
+
function mouseMoveFunc(imageItem, e) {
|
1193 |
+
if (e.clientX < (windowWidth * 0.4)) {
|
1194 |
+
imageItem.getElementsByClassName('imgBox')[0].style.position = 'relative';
|
1195 |
+
}
|
1196 |
+
}
|
1197 |
+
|
1198 |
+
function cleanupEventListener(imageItem) {
|
1199 |
+
imageItem.getElementsByClassName('imgBox')[0].style.position = '';
|
1200 |
+
let layout = document.getElementById('layout');
|
1201 |
+
// remove the previously bound function
|
1202 |
+
layout.removeEventListener('mousemove', imageItem.boundMouseMoveFunc);
|
1203 |
+
}
|
1204 |
+
|
1205 |
+
//
|
1206 |
+
//
|
1207 |
+
//
|
1208 |
+
//
|
1209 |
+
//
|
1210 |
+
//
|
1211 |
+
//
|
1212 |
+
//
|
1213 |
+
//
|
1214 |
+
//
|
1215 |
+
//
|
1216 |
+
//
|
1217 |
+
//
|
1218 |
+
//
|
1219 |
+
//
|
1220 |
+
//
|
1221 |
+
// content loaded function
|
1222 |
+
document.addEventListener("DOMContentLoaded", function() {
|
1223 |
+
//
|
1224 |
+
//
|
1225 |
+
startUp();
|
1226 |
+
//
|
1227 |
+
//
|
1228 |
+
// add checkbox event listeners
|
1229 |
+
var checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
1230 |
+
checkboxes.forEach(function(checkbox) {
|
1231 |
+
let isTop = checkbox.parentNode.classList.contains('top_control');
|
1232 |
+
if(!isTop || checkbox.name == 'favorite') {
|
1233 |
+
// normal checkboxes
|
1234 |
+
checkbox.addEventListener('change', function(e) {
|
1235 |
+
checkAllInCategory(e.target);
|
1236 |
+
hideAllArtists();
|
1237 |
+
unhideBasedOnPermissiveSetting();
|
1238 |
+
storeCheckboxState(e.target);
|
1239 |
+
updateArtistsCountPerTag('click');
|
1240 |
+
});
|
1241 |
+
} else {
|
1242 |
+
// top checkboxes
|
1243 |
+
if(checkbox.name == 'check-all') {
|
1244 |
+
checkbox.addEventListener('change', function(e) {
|
1245 |
+
checkOrUncheckAll(this.checked);
|
1246 |
+
storeCheckboxStateAll(this.checked);
|
1247 |
+
hideAllArtists();
|
1248 |
+
unhideBasedOnPermissiveSetting();
|
1249 |
+
updateArtistsCountPerTag('click');
|
1250 |
+
});
|
1251 |
+
} else if(checkbox.name == 'mode') {
|
1252 |
+
checkbox.addEventListener('change', function(e) {
|
1253 |
+
hideAllArtists();
|
1254 |
+
unhideBasedOnPermissiveSetting();
|
1255 |
+
updateArtistsCountPerTag('click');
|
1256 |
+
storeCheckboxState(e.target);
|
1257 |
+
});
|
1258 |
+
} else if(checkbox.name == 'use_categories') {
|
1259 |
+
checkbox.addEventListener('change', function(e) {
|
1260 |
+
showHideCategories();
|
1261 |
+
sortTags();
|
1262 |
+
storeCheckboxState(e.target);
|
1263 |
+
});
|
1264 |
+
} else if(checkbox.name == 'low_count') {
|
1265 |
+
checkbox.addEventListener('change', function(e) {
|
1266 |
+
showHideLowCountTags();
|
1267 |
+
storeCheckboxState(e.target);
|
1268 |
+
});
|
1269 |
+
}
|
1270 |
+
}
|
1271 |
+
});
|
1272 |
+
// add options event listeners
|
1273 |
+
var infoI = document.getElementById('infoI');
|
1274 |
+
infoI.addEventListener('click', function(e) {
|
1275 |
+
showInstructions();
|
1276 |
+
});
|
1277 |
+
var infoA = document.getElementById('infoA');
|
1278 |
+
infoA.addEventListener('click', function(e) {
|
1279 |
+
showAbout();
|
1280 |
+
});
|
1281 |
+
var infoE = document.getElementById('infoX');
|
1282 |
+
infoX.addEventListener('click', function(e) {
|
1283 |
+
showExport();
|
1284 |
+
});
|
1285 |
+
// prompt options
|
1286 |
+
var promptA = document.getElementById('promptA');
|
1287 |
+
promptA.addEventListener('click', function(e) {
|
1288 |
+
highlightSelectedOption('promptA');
|
1289 |
+
rotatePromptsImages();
|
1290 |
+
storeOptionsState();
|
1291 |
+
});
|
1292 |
+
var promptP = document.getElementById('promptP');
|
1293 |
+
promptP.addEventListener('click', function(e) {
|
1294 |
+
highlightSelectedOption('promptP');
|
1295 |
+
rotatePromptsImages();
|
1296 |
+
storeOptionsState();
|
1297 |
+
});
|
1298 |
+
var promptL = document.getElementById('promptL');
|
1299 |
+
promptL.addEventListener('click', function(e) {
|
1300 |
+
highlightSelectedOption('promptL');
|
1301 |
+
rotatePromptsImages();
|
1302 |
+
storeOptionsState();
|
1303 |
+
});
|
1304 |
+
// add information event listeners
|
1305 |
+
var export_to_clipboard = document.getElementById('export_to_clipboard');
|
1306 |
+
export_to_clipboard.addEventListener('click', function(e) {
|
1307 |
+
copyExportToClipboard();
|
1308 |
+
});
|
1309 |
+
var export_import = document.getElementById('export_import');
|
1310 |
+
export_import.addEventListener('click', function(e) {
|
1311 |
+
importFavorites();
|
1312 |
+
});
|
1313 |
+
var information = document.querySelectorAll('.information');
|
1314 |
+
information.forEach(function(element) {
|
1315 |
+
element.addEventListener('mouseleave', function(e) {
|
1316 |
+
if (!element.contains(e.relatedTarget)) {
|
1317 |
+
hideInformation();
|
1318 |
+
}
|
1319 |
+
});
|
1320 |
+
});
|
1321 |
+
// sort options
|
1322 |
+
var sortTA = document.getElementById('sortTA');
|
1323 |
+
sortTA.addEventListener('click', function(e) {
|
1324 |
+
sortTagsByAlpha();
|
1325 |
+
highlightSelectedOption('sortTA');
|
1326 |
+
storeOptionsState();
|
1327 |
+
});
|
1328 |
+
var sortTC = document.getElementById('sortTC');
|
1329 |
+
sortTC.addEventListener('click', function(e) {
|
1330 |
+
sortTagsByCount();
|
1331 |
+
highlightSelectedOption('sortTC');
|
1332 |
+
storeOptionsState();
|
1333 |
+
});
|
1334 |
+
var sortAA = document.getElementById('sortAA');
|
1335 |
+
sortAA.addEventListener('click', function(e) {
|
1336 |
+
sortArtistsByAlpha();
|
1337 |
+
highlightSelectedOption('sortAA');
|
1338 |
+
storeOptionsState();
|
1339 |
+
});
|
1340 |
+
var sortAR = document.getElementById('sortAR');
|
1341 |
+
sortAR.addEventListener('click', function(e) {
|
1342 |
+
sortArtistsByRandom();
|
1343 |
+
highlightSelectedOption('sortAR');
|
1344 |
+
storeOptionsState();
|
1345 |
+
});
|
1346 |
+
// must used mode
|
1347 |
+
var mostUsed = document.getElementById('edit_most_used');
|
1348 |
+
mostUsed.addEventListener('click', function(e) {
|
1349 |
+
enterExitEditMostUsedMode();
|
1350 |
+
});
|
1351 |
+
document.addEventListener('keydown', function(event) {
|
1352 |
+
if (event.key === 'Escape' || event.keyCode === 27) {
|
1353 |
+
// event.key for modern browsers, event.keyCode for older ones
|
1354 |
+
enterExitEditMostUsedMode('exit');
|
1355 |
+
hideInformation();
|
1356 |
+
}
|
1357 |
+
});
|
1358 |
+
var labels = document.querySelectorAll('label');
|
1359 |
+
Array.from(labels).forEach(function(label) {
|
1360 |
+
label.addEventListener('click', function(e) {
|
1361 |
+
if(editMode) {
|
1362 |
+
addRemoveIsMostUsed(this);
|
1363 |
+
storeMostUsedState(this);
|
1364 |
+
}
|
1365 |
+
});
|
1366 |
+
});
|
1367 |
+
// add artist event listeners
|
1368 |
+
var imageItems = document.getElementsByClassName('image-item');
|
1369 |
+
Array.from(imageItems).forEach(function(imageItem) {
|
1370 |
+
imageItem.addEventListener('mouseenter', function(e) {
|
1371 |
+
hideToggles();
|
1372 |
+
loadLargerImages(e.target);
|
1373 |
+
timer = setTimeout(hideLargerImageBackup.bind(this, this), 200);
|
1374 |
+
});
|
1375 |
+
imageItem.addEventListener('mouseleave', function(e) {
|
1376 |
+
showToggles();
|
1377 |
+
});
|
1378 |
+
imageItem.querySelector('.art_star').addEventListener('click', function(e) {
|
1379 |
+
addOrRemoveFavorite(this.closest('.image-item'));
|
1380 |
+
storeFavoriteState(this.closest('.image-item'));
|
1381 |
+
updateFavoritesCount();
|
1382 |
+
});
|
1383 |
+
imageItem.querySelector('.art_prev').addEventListener('click', function(e) {
|
1384 |
+
highlightSelectedOption('prev');
|
1385 |
+
rotatePromptsImages();
|
1386 |
+
storeOptionsState();
|
1387 |
+
});
|
1388 |
+
imageItem.querySelector('.art_next').addEventListener('click', function(e) {
|
1389 |
+
highlightSelectedOption('next');
|
1390 |
+
rotatePromptsImages();
|
1391 |
+
storeOptionsState();
|
1392 |
+
});
|
1393 |
+
imageItem.getElementsByTagName('h3')[0].addEventListener('click', function(e) {
|
1394 |
+
copyStuffToClipboard(this,'name');
|
1395 |
+
});
|
1396 |
+
imageItem.getElementsByTagName('h4')[0].addEventListener('click', function(e) {
|
1397 |
+
copyStuffToClipboard(this, 'tags')
|
1398 |
+
// toggleThisArtistsTags(this.textContent);
|
1399 |
+
});
|
1400 |
+
});
|
1401 |
+
// add footer event listeners
|
1402 |
+
var closeFooter = document.getElementById('close_footer');
|
1403 |
+
closeFooter.addEventListener('click', function(e) {
|
1404 |
+
document.getElementById('layout').classList.add('footerHidden');
|
1405 |
+
});
|
1406 |
+
});
|