From ee0a0747ee9c596c0fd1650ee40eddf6c3bccd37 Mon Sep 17 00:00:00 2001 From: simojenki Date: Mon, 30 Aug 2021 15:56:43 +1000 Subject: [PATCH] Add new icons, repair icon sizing --- package.json | 4 +- src/icon.ts | 143 +++++++++++------ src/server.ts | 17 +- tests/icon.test.ts | 38 +++++ web/icons/Binoculars-14310.svg | 4 - web/icons/Book-22940.svg | 4 + web/icons/Book-453.svg | 4 - web/icons/Cannabis-33270.svg | 3 + web/icons/Children-78186.svg | 6 + web/icons/Classic-Music-11646.svg | 5 - web/icons/Classic-Music-17728.svg | 3 + web/icons/Comedy-2-599.svg | 1 - web/icons/Comedy-5937.svg | 6 + web/icons/Country-Music-113286.svg | 4 + web/icons/Disco-Ball-25777.svg | 12 ++ web/icons/Film-Reel-3230.svg | 1 + web/icons/Fridge-282.svg | 4 + web/icons/Globe-1301.svg | 6 + web/icons/Horror-4387.svg | 6 - web/icons/Horror-88855.svg | 4 + web/icons/New-47652.svg | 4 + web/icons/Old-Woman-77881.svg | 8 + web/icons/Opera-Glasses-102740.svg | 1 + web/icons/Pills-112386.svg | 6 +- web/icons/Pills-92954.svg | 4 + web/icons/Scottish-Thistle-108212.svg | 5 + web/icons/Sleeping-in Bed-14385.svg | 5 + web/icons/Sydney-Opera House-59090.svg | 3 + web/icons/Tango-25015.svg | 6 + web/icons/TripAdvisor-44407.svg | 8 + web/icons/Violin-3421.svg | 6 + web/icons/index.html | 205 +------------------------ web/views/icons.eta | 9 ++ 33 files changed, 270 insertions(+), 275 deletions(-) delete mode 100644 web/icons/Binoculars-14310.svg create mode 100644 web/icons/Book-22940.svg delete mode 100644 web/icons/Book-453.svg create mode 100644 web/icons/Cannabis-33270.svg create mode 100644 web/icons/Children-78186.svg delete mode 100644 web/icons/Classic-Music-11646.svg create mode 100644 web/icons/Classic-Music-17728.svg delete mode 100644 web/icons/Comedy-2-599.svg create mode 100644 web/icons/Comedy-5937.svg create mode 100644 web/icons/Country-Music-113286.svg create mode 100644 web/icons/Disco-Ball-25777.svg create mode 100644 web/icons/Film-Reel-3230.svg create mode 100644 web/icons/Fridge-282.svg create mode 100644 web/icons/Globe-1301.svg delete mode 100644 web/icons/Horror-4387.svg create mode 100644 web/icons/Horror-88855.svg create mode 100644 web/icons/New-47652.svg create mode 100644 web/icons/Old-Woman-77881.svg create mode 100644 web/icons/Opera-Glasses-102740.svg create mode 100644 web/icons/Pills-92954.svg create mode 100644 web/icons/Scottish-Thistle-108212.svg create mode 100644 web/icons/Sleeping-in Bed-14385.svg create mode 100644 web/icons/Sydney-Opera House-59090.svg create mode 100644 web/icons/Tango-25015.svg create mode 100644 web/icons/TripAdvisor-44407.svg create mode 100644 web/icons/Violin-3421.svg create mode 100644 web/views/icons.eta diff --git a/package.json b/package.json index 3c8f45e..07ff87b 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "scripts": { "clean": "rm -Rf build", "build": "tsc", - "dev": "BONOB_SONOS_SERVICE_NAME=bonobDev BONOB_SONOS_DEVICE_DISCOVERY=true nodemon -V ./src/app.ts", - "devr": "BONOB_SONOS_SERVICE_NAME=bonobDev BONOB_SONOS_DEVICE_DISCOVERY=true BONOB_SONOS_AUTO_REGISTER=true nodemon -V ./src/app.ts", + "dev": "BONOB_ICON_FOREGROUND_COLOR=white BONOB_ICON_BACKGROUND_COLOR=darkgrey BONOB_SONOS_SERVICE_NAME=bonobDev BONOB_SONOS_DEVICE_DISCOVERY=true nodemon -V ./src/app.ts", + "devr": "BONOB_ICON_FOREGROUND_COLOR=white BONOB_ICON_BACKGROUND_COLOR=darkgrey BONOB_SONOS_SERVICE_NAME=bonobDev BONOB_SONOS_DEVICE_DISCOVERY=true BONOB_SONOS_AUTO_REGISTER=true nodemon -V ./src/app.ts", "register-dev": "ts-node ./src/register.ts http://$(hostname):4534", "test": "jest" } diff --git a/src/icon.ts b/src/icon.ts index b6ee6a1..51699e2 100644 --- a/src/icon.ts +++ b/src/icon.ts @@ -54,10 +54,7 @@ export interface Icon { export class ColorOverridingIcon implements Icon { rule: () => Boolean; newColors: () => Partial< - Pick< - Transformation, - "backgroundColor" | "foregroundColor" - > + Pick >; icon: Icon; @@ -65,10 +62,7 @@ export class ColorOverridingIcon implements Icon { icon: Icon, rule: () => Boolean, newColors: () => Partial< - Pick< - Transformation, - "backgroundColor" | "foregroundColor" - > + Pick > ) { this.icon = icon; @@ -153,10 +147,7 @@ export const makeFestive = (icon: Icon, clock: Clock = SystemClock): Icon => { const wrap = ( icon: Icon, rule: (clock: Clock) => boolean, - colors: Pick< - Transformation, - "backgroundColor" | "foregroundColor" - > + colors: Pick ) => new ColorOverridingIcon( icon, @@ -168,10 +159,7 @@ export const makeFestive = (icon: Icon, clock: Clock = SystemClock): Icon => { const apply = ( rule: (clock: Clock) => boolean, - colors: Pick< - Transformation, - "backgroundColor" | "foregroundColor" - > + colors: Pick ) => (result = wrap(result, rule, colors)); apply(isChristmas, { @@ -233,14 +221,29 @@ export type ICON = | "conductor" | "reggae" | "music" - | "error"; + | "error" + | "chill" + | "country" + | "dance" + | "disco" + | "film" + | "new" + | "old" + | "cannabis" + | "trip" + | "opera" + | "world" + | "violin" + | "celtic" + | "children" + | "chillout"; const iconFrom = (name: string) => new SvgIcon( fs .readFileSync(path.resolve(__dirname, "..", "web", "icons", name)) .toString() - ).with({ viewPortIncreasePercent: 50 }); + ); export const ICONS: Record = { artists: iconFrom("navidrome-artists.svg"), @@ -253,7 +256,7 @@ export const ICONS: Record = { recentlyAdded: iconFrom("navidrome-recentlyAdded.svg"), recentlyPlayed: iconFrom("navidrome-recentlyPlayed.svg"), mostPlayed: iconFrom("navidrome-mostPlayed.svg"), - discover: iconFrom("Binoculars-14310.svg"), + discover: iconFrom("Opera-Glasses-102740.svg"), mushroom: iconFrom("Mushroom-63864.svg"), african: iconFrom("Africa-48087.svg"), rock: iconFrom("Rock-Music-11007.svg"), @@ -261,37 +264,57 @@ export const ICONS: Record = { punk: iconFrom("Punk-40450.svg"), americana: iconFrom("US-Capitol-104805.svg"), guitar: iconFrom("Guitar-110433.svg"), - book: iconFrom("Book-453.svg"), + book: iconFrom("Book-22940.svg"), oz: iconFrom("Kangaroo-16730.svg"), hipHop: iconFrom("Hip-Hop Music-17757.svg"), rap: iconFrom("Rap-24851.svg"), - horror: iconFrom("Horror-4387.svg"), + horror: iconFrom("Horror-88855.svg"), pop: iconFrom("Ice-Pop Yellow-94532.svg"), blues: iconFrom("Blues-113548.svg"), - classical: iconFrom("Classic-Music-11646.svg"), - comedy: iconFrom("Comedy-2-599.svg"), + classical: iconFrom("Classic-Music-17728.svg"), + comedy: iconFrom("Comedy-5937.svg"), vinyl: iconFrom("Music-Record-102104.svg"), electronic: iconFrom("Electronic-Music-17745.svg"), - pills: iconFrom("Pills-112386.svg"), + pills: iconFrom("Pills-92954.svg"), trumpet: iconFrom("Trumpet-17823.svg"), conductor: iconFrom("Music-Conductor-225.svg"), reggae: iconFrom("Reggae-24843.svg"), music: iconFrom("Music-14097.svg"), error: iconFrom("Error-82783.svg"), + chill: iconFrom("Fridge-282.svg"), + country: iconFrom("Country-Music-113286.svg"), + dance: iconFrom("Tango-25015.svg"), + disco: iconFrom("Disco-Ball-25777.svg"), + film: iconFrom("Film-Reel-3230.svg"), + new: iconFrom("New-47652.svg"), + old: iconFrom("Old-Woman-77881.svg"), + cannabis: iconFrom("Cannabis-33270.svg"), + trip: iconFrom("TripAdvisor-44407.svg"), + opera: iconFrom("Sydney-Opera House-59090.svg"), + world: iconFrom("Globe-1301.svg"), + violin: iconFrom("Violin-3421.svg"), + celtic: iconFrom("Scottish-Thistle-108212.svg"), + children: iconFrom("Children-78186.svg"), + chillout: iconFrom("Sleeping-in Bed-14385.svg"), }; export type RULE = (genre: string) => boolean; -const eq = +export const eq = (expected: string): RULE => (value: string) => expected.toLowerCase() === value.toLowerCase(); -const contains = +export const contains = (expected: string): RULE => (value: string) => value.toLowerCase().includes(expected.toLowerCase()); +export const containsWord = + (expected: string): RULE => + (value: string) => + value.toLowerCase().split(/\W/).includes(expected.toLowerCase()); + const containsWithAllTheNonWordCharsRemoved = (expected: string): RULE => (value: string) => @@ -299,33 +322,55 @@ const containsWithAllTheNonWordCharsRemoved = const GENRE_RULES: [RULE, ICON][] = [ [eq("Acid House"), "mushroom"], - [contains("Goa"), "mushroom"], - [contains("Psy"), "mushroom"], [eq("African"), "african"], [eq("Americana"), "americana"], - [contains("Rock"), "rock"], - [contains("Folk"), "guitar"], - [contains("Book"), "book"], - [contains("Australian"), "oz"], - [contains("Rap"), "rap"], + [eq("Film Score"), "film"], + [eq("Soundtrack"), "film"], + [eq("Stoner Rock"), "cannabis"], + [eq("Turntablism"), "vinyl"], + [eq("Celtic"), "celtic"], + [containsWord("Country"), "country"], + [containsWord("Rock"), "rock"], + [containsWord("Folk"), "guitar"], + [containsWord("Book"), "book"], + [containsWord("Australian"), "oz"], + [containsWord("Baroque"), "violin"], + [containsWord("Rap"), "rap"], [containsWithAllTheNonWordCharsRemoved("Hip Hop"), "hipHop"], - [contains("Horror"), "horror"], - [contains("Metal"), "metal"], - [contains("Punk"), "punk"], - [contains("Pop"), "pop"], - [contains("Blues"), "blues"], - [contains("Classical"), "classical"], - [contains("Comedy"), "comedy"], - [contains("Dub"), "vinyl"], - [contains("Turntable"), "vinyl"], + [containsWithAllTheNonWordCharsRemoved("Trip Hop"), "trip"], + [containsWord("Metal"), "metal"], + [containsWord("Punk"), "punk"], + [containsWord("Blues"), "blues"], + [eq("Classic"), "classical"], + [containsWord("Classical"), "classical"], + [containsWord("Comedy"), "comedy"], + [containsWord("Turntable"), "vinyl"], + [containsWord("Dub"), "electronic"], + [eq("Dubstep"), "electronic"], + [eq("Drum And Bass"), "electronic"], + [contains("Goa"), "mushroom"], + [contains("Psy"), "mushroom"], + [containsWord("Trance"), "pills"], + [containsWord("Techno"), "pills"], + [containsWord("House"), "pills"], + [containsWord("Rave"), "pills"], + [containsWord("Jazz"), "trumpet"], + [containsWord("Orchestra"), "conductor"], + [containsWord("Reggae"), "reggae"], + [containsWord("Disco"), "disco"], + [containsWord("New"), "new"], + [containsWord("Opera"), "opera"], + [containsWord("Vocal"), "opera"], + [containsWord("Ballad"), "opera"], + [containsWord("Western"), "country"], + [containsWord("World"), "world"], [contains("Electro"), "electronic"], - [contains("Trance"), "pills"], - [contains("Techno"), "pills"], - [contains("House"), "pills"], - [contains("Rave"), "pills"], - [contains("Jazz"), "trumpet"], - [contains("Orchestra"), "conductor"], - [contains("Reggae"), "reggae"], + [contains("Dance"), "dance"], + [contains("Pop"), "pop"], + [contains("Horror"), "horror"], + [contains("Children"), "children"], + [contains("Chill"), "chill"], + [contains("Old"), "old"], ]; export function iconForGenre(genre: string): ICON { diff --git a/src/server.ts b/src/server.ts index b5be154..f9612bf 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,7 +1,6 @@ import { option as O } from "fp-ts"; import express, { Express, Request } from "express"; import * as Eta from "eta"; -// import morgan from "morgan"; import path from "path"; import sharp from "sharp"; @@ -412,7 +411,7 @@ function server( return Promise.resolve( makeFestive( - icon.with(serverOpts.iconColors), + icon.with({ viewPortIncreasePercent: 80, ...serverOpts.iconColors }), clock ).toString() ) @@ -420,7 +419,19 @@ function server( .then((data) => res.status(200).type(spec.mimeType).send(data)); } }); - + + app.get("/icons", (_, res) => { + res.render("icons", { + icons: Object.keys(ICONS).map((k) => [ + k, + ((ICONS as any)[k] as Icon) + .with({ viewPortIncreasePercent: 80, ...serverOpts.iconColors }) + .toString() + .replace('', ""), + ]), + }); + }); + const GRAVITY_9 = [ "north", "northeast", diff --git a/tests/icon.test.ts b/tests/icon.test.ts index 8383e61..b41ba7d 100644 --- a/tests/icon.test.ts +++ b/tests/icon.test.ts @@ -3,6 +3,9 @@ import libxmljs from "libxmljs2"; import { ColorOverridingIcon, + contains, + containsWord, + eq, HOLI_COLORS, Icon, iconForGenre, @@ -472,6 +475,41 @@ describe("makeFestive", () => { }); }); +describe("eq", () => { + it("should be true when ===", () => { + expect(eq("Foo")("foo")).toEqual(true); + }); + + it("should be false when not ===", () => { + expect(eq("Foo")("bar")).toEqual(false); + }); +}); + +describe("contains", () => { + it("should be true word is a substring", () => { + expect(contains("Foo")("some foo bar")).toEqual(true); + }); + + it("should be false when not ===", () => { + expect(contains("Foo")("some bar")).toEqual(false); + }); +}); + +describe("containsWord", () => { + it("should be true word is a substring with space delim", () => { + expect(containsWord("Foo")("some foo bar")).toEqual(true); + }); + + it("should be true word is a substring with hyphen delim", () => { + expect(containsWord("Foo")("some----foo-bar")).toEqual(true); + }); + + it("should be false when not ===", () => { + expect(containsWord("Foo")("somefoobar")).toEqual(false); + }); +}); + + describe("iconForGenre", () => { [ ["Acid House", "mushroom"], diff --git a/web/icons/Binoculars-14310.svg b/web/icons/Binoculars-14310.svg deleted file mode 100644 index 924c819..0000000 --- a/web/icons/Binoculars-14310.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/web/icons/Book-22940.svg b/web/icons/Book-22940.svg new file mode 100644 index 0000000..30d5d8b --- /dev/null +++ b/web/icons/Book-22940.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/icons/Book-453.svg b/web/icons/Book-453.svg deleted file mode 100644 index c46be05..0000000 --- a/web/icons/Book-453.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/web/icons/Cannabis-33270.svg b/web/icons/Cannabis-33270.svg new file mode 100644 index 0000000..ed65d5b --- /dev/null +++ b/web/icons/Cannabis-33270.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/icons/Children-78186.svg b/web/icons/Children-78186.svg new file mode 100644 index 0000000..deb12e2 --- /dev/null +++ b/web/icons/Children-78186.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/web/icons/Classic-Music-11646.svg b/web/icons/Classic-Music-11646.svg deleted file mode 100644 index 11983f6..0000000 --- a/web/icons/Classic-Music-11646.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/icons/Classic-Music-17728.svg b/web/icons/Classic-Music-17728.svg new file mode 100644 index 0000000..f1783fd --- /dev/null +++ b/web/icons/Classic-Music-17728.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/icons/Comedy-2-599.svg b/web/icons/Comedy-2-599.svg deleted file mode 100644 index a958933..0000000 --- a/web/icons/Comedy-2-599.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/icons/Comedy-5937.svg b/web/icons/Comedy-5937.svg new file mode 100644 index 0000000..d33d621 --- /dev/null +++ b/web/icons/Comedy-5937.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/web/icons/Country-Music-113286.svg b/web/icons/Country-Music-113286.svg new file mode 100644 index 0000000..fc28de1 --- /dev/null +++ b/web/icons/Country-Music-113286.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/icons/Disco-Ball-25777.svg b/web/icons/Disco-Ball-25777.svg new file mode 100644 index 0000000..c5140c2 --- /dev/null +++ b/web/icons/Disco-Ball-25777.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/web/icons/Film-Reel-3230.svg b/web/icons/Film-Reel-3230.svg new file mode 100644 index 0000000..6664176 --- /dev/null +++ b/web/icons/Film-Reel-3230.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/icons/Fridge-282.svg b/web/icons/Fridge-282.svg new file mode 100644 index 0000000..7e194c9 --- /dev/null +++ b/web/icons/Fridge-282.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/icons/Globe-1301.svg b/web/icons/Globe-1301.svg new file mode 100644 index 0000000..88de992 --- /dev/null +++ b/web/icons/Globe-1301.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/web/icons/Horror-4387.svg b/web/icons/Horror-4387.svg deleted file mode 100644 index 03ce28a..0000000 --- a/web/icons/Horror-4387.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/web/icons/Horror-88855.svg b/web/icons/Horror-88855.svg new file mode 100644 index 0000000..2b2eb8b --- /dev/null +++ b/web/icons/Horror-88855.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/icons/New-47652.svg b/web/icons/New-47652.svg new file mode 100644 index 0000000..c03c81d --- /dev/null +++ b/web/icons/New-47652.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/icons/Old-Woman-77881.svg b/web/icons/Old-Woman-77881.svg new file mode 100644 index 0000000..c60c918 --- /dev/null +++ b/web/icons/Old-Woman-77881.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/web/icons/Opera-Glasses-102740.svg b/web/icons/Opera-Glasses-102740.svg new file mode 100644 index 0000000..ca8af8d --- /dev/null +++ b/web/icons/Opera-Glasses-102740.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/icons/Pills-112386.svg b/web/icons/Pills-112386.svg index e920530..2011e2f 100644 --- a/web/icons/Pills-112386.svg +++ b/web/icons/Pills-112386.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/web/icons/Pills-92954.svg b/web/icons/Pills-92954.svg new file mode 100644 index 0000000..86dbace --- /dev/null +++ b/web/icons/Pills-92954.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/icons/Scottish-Thistle-108212.svg b/web/icons/Scottish-Thistle-108212.svg new file mode 100644 index 0000000..efa5d2d --- /dev/null +++ b/web/icons/Scottish-Thistle-108212.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/icons/Sleeping-in Bed-14385.svg b/web/icons/Sleeping-in Bed-14385.svg new file mode 100644 index 0000000..6a531d8 --- /dev/null +++ b/web/icons/Sleeping-in Bed-14385.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/icons/Sydney-Opera House-59090.svg b/web/icons/Sydney-Opera House-59090.svg new file mode 100644 index 0000000..918efc2 --- /dev/null +++ b/web/icons/Sydney-Opera House-59090.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/icons/Tango-25015.svg b/web/icons/Tango-25015.svg new file mode 100644 index 0000000..246c637 --- /dev/null +++ b/web/icons/Tango-25015.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/web/icons/TripAdvisor-44407.svg b/web/icons/TripAdvisor-44407.svg new file mode 100644 index 0000000..7e1f84f --- /dev/null +++ b/web/icons/TripAdvisor-44407.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/web/icons/Violin-3421.svg b/web/icons/Violin-3421.svg new file mode 100644 index 0000000..a0c70d1 --- /dev/null +++ b/web/icons/Violin-3421.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/web/icons/index.html b/web/icons/index.html index 5aaf649..2d9c829 100644 --- a/web/icons/index.html +++ b/web/icons/index.html @@ -2,211 +2,16 @@ original
-
- hack 1
-
- -
- hack 2
-
- -
- hack 3
-
- -
- hack 4
-
- -
- hack 5
-
- - - - foobar1 - foobar2 - - -
- hack 5 (3 lines)
-
- - - - foobar1 - foobar2 - foobar3 - - -
- hack 5 (4 lines)
-
- - - - foobar1 - foobar2 - foobar3 - foobar4 - - -
- hack 5 (4 lines with viewBox enlarge)
-
- - - - foobar1 - foobar2 - foobar3 - foobar4 - - -
- hack 6a (4 lines with viewBox enlarge)
-
- - - - foobar1 - foobar2 - foobar3 - foobar4 - - -
- hack 6b 1 line
-
- - - - psy - - -
- hack 6b 1 line %
-
- - - - psy - - -
- hack 6b 2 lines
-
- - - - psy - trance - - -
- hack 6b2
-
- - - - alt - pop - - -
- hack 6b3
-
- - - - oz - rock - - -
- hack 6c (3 lines with viewBox enlarge)
-
- - - - oz - hip - hop - - -
- hack 6c with an embedded svg (1 lines with viewBox enlarge)
-
- - - - - oz - - - -
- hack 6c with an embedded svg (3 lines with viewBox enlarge)
-
- - - - - oz - hip - hop - - - -
- hack 6c% (3 lines with viewBox enlarge)
-
- - - - oz - hip - hop - - -
- hack 6
-
- - - - - First line. - Second line. - - - -
- mushroom
+ original
- - +
+ \ No newline at end of file diff --git a/web/views/icons.eta b/web/views/icons.eta new file mode 100644 index 0000000..4cf80f8 --- /dev/null +++ b/web/views/icons.eta @@ -0,0 +1,9 @@ +<% layout('./layout') %> +
+ <% it.icons.forEach(function(icon) { %> + <%= icon[0] %> +
+ <%~ icon[1] %> +


+ <% }) %> +
\ No newline at end of file