├── .gitignore ├── fonts ├── RG2014B.ttf ├── RG2014C.ttf ├── RG2014D.ttf ├── RG2014E.ttf ├── RG2014EM.ttf ├── RG2014F.ttf ├── RG2014EEM.ttf ├── roadgeek_2005_arrows_1-webfont.eot ├── roadgeek_2005_arrows_1-webfont.ttf ├── roadgeek_2005_arrows_2-webfont.eot ├── roadgeek_2005_arrows_2-webfont.ttf ├── roadgeek_2005_series_c-webfont.eot ├── roadgeek_2005_series_c-webfont.ttf ├── roadgeek_2005_series_d-webfont.eot ├── roadgeek_2005_series_d-webfont.ttf ├── roadgeek_2005_series_e-webfont.eot ├── roadgeek_2005_series_e-webfont.ttf ├── roadgeek_2005_arrows_1-webfont.woff ├── roadgeek_2005_arrows_1-webfont.woff2 ├── roadgeek_2005_arrows_2-webfont.woff ├── roadgeek_2005_arrows_2-webfont.woff2 ├── roadgeek_2005_old_parks-webfont.eot ├── roadgeek_2005_old_parks-webfont.ttf ├── roadgeek_2005_old_parks-webfont.woff ├── roadgeek_2005_old_parks-webfont.woff2 ├── roadgeek_2005_series_c-webfont.woff ├── roadgeek_2005_series_c-webfont.woff2 ├── roadgeek_2005_series_d-webfont.woff ├── roadgeek_2005_series_d-webfont.woff2 ├── roadgeek_2005_series_e-webfont.woff ├── roadgeek_2005_series_e-webfont.woff2 ├── roadgeek_2005_series_em-webfont.eot ├── roadgeek_2005_series_em-webfont.ttf ├── roadgeek_2005_series_em-webfont.woff ├── roadgeek_2005_series_em-webfont.woff2 ├── roadgeek_2005_mittelschrift-webfont.eot ├── roadgeek_2005_mittelschrift-webfont.ttf ├── roadgeek_2005_mittelschrift-webfont.woff └── roadgeek_2005_mittelschrift-webfont.woff2 ├── img ├── example │ ├── image.png │ └── nh-to-maine-95.png ├── select.svg ├── shields-with-backs │ ├── NL-2.svg │ ├── NL-3.svg │ ├── VA-2.svg │ ├── VA-3.svg │ ├── WI-2.svg │ ├── rec2-3.svg │ ├── TN2-2.svg │ ├── TN2-3.svg │ ├── MI-2.svg │ ├── rec-2.svg │ ├── rec-3.svg │ ├── US-3.svg │ ├── US-2.svg │ ├── VA2-2.svg │ ├── cir-2.svg │ ├── elp-2.svg │ ├── PA-3.svg │ ├── rec2-2.svg │ ├── PA-2.svg │ ├── WA-2.svg │ ├── NE-2-LINK.svg │ ├── NS-3-CONN.svg │ ├── NC-2.svg │ ├── FL-2.svg │ ├── FL-3.svg │ ├── CO-2.svg │ ├── CO-3.svg │ ├── OH-3.svg │ ├── OK-3.svg │ ├── OH-2.svg │ ├── elp-3.svg │ ├── NY-2.svg │ ├── NY-3.svg │ ├── AR-3.svg │ ├── OK-2.svg │ ├── cir-3.svg │ ├── AR-2.svg │ ├── IN-2.svg │ ├── IN-3.svg │ ├── FL-2-TOLL.svg │ ├── RI-3.svg │ ├── RI-2.svg │ ├── MT-2.svg │ ├── TX-2.svg │ ├── MT-3.svg │ ├── OR-2.svg │ ├── AZ-3.svg │ ├── AL-2.svg │ ├── MD-2.svg │ ├── MD-3.svg │ ├── UT-2.svg │ ├── AL-3.svg │ ├── OR-3.svg │ ├── MO-2.svg │ ├── MO-3.svg │ ├── AZ-2.svg │ ├── IL-2.svg │ ├── AK-2.svg │ └── AK-3.svg ├── shields-without-backs │ ├── NL-2.svg │ ├── NL-3.svg │ ├── rec2-3.svg │ ├── rec-3.svg │ ├── rec-2.svg │ ├── MI-2.svg │ ├── US-3.svg │ ├── US-2.svg │ ├── rec2-2.svg │ ├── WI-2.svg │ ├── NE-LINK.svg │ ├── NS-3-CONN.svg │ ├── TN2-3.svg │ ├── TN2-2.svg │ ├── VA-2.svg │ ├── NC-2.svg │ ├── FL-2.svg │ ├── FL-3.svg │ ├── CO-2.svg │ ├── VA-3.svg │ ├── PA-3.svg │ ├── OK-3.svg │ ├── PA-2.svg │ ├── elp-3.svg │ ├── NY-2.svg │ ├── OK-2.svg │ ├── AR-3.svg │ ├── NY-3.svg │ ├── VA2-2.svg │ ├── cir-2.svg │ ├── elp-2.svg │ ├── cir-3.svg │ ├── IN-2.svg │ ├── AR-2.svg │ ├── IN-3.svg │ ├── FL-2-TOLL.svg │ ├── RI-3.svg │ ├── RI-2.svg │ ├── MT-2.svg │ ├── TX-2.svg │ ├── MT-3.svg │ ├── AL-2.svg │ ├── MD-2.svg │ ├── MD-3.svg │ ├── AL-3.svg │ ├── AZ-3.svg │ ├── MO-2.svg │ ├── MO-3.svg │ └── IL-2.svg └── other-symbols │ └── QC-Exit.svg ├── README.md ├── js ├── ExitTab.js ├── Panel.js ├── lib.js ├── Shield.js └── Sign.js └── css └── form.css /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | ._* 4 | 5 | # Windows 6 | Thumbs.db 7 | -------------------------------------------------------------------------------- /fonts/RG2014B.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/RG2014B.ttf -------------------------------------------------------------------------------- /fonts/RG2014C.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/RG2014C.ttf -------------------------------------------------------------------------------- /fonts/RG2014D.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/RG2014D.ttf -------------------------------------------------------------------------------- /fonts/RG2014E.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/RG2014E.ttf -------------------------------------------------------------------------------- /fonts/RG2014EM.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/RG2014EM.ttf -------------------------------------------------------------------------------- /fonts/RG2014F.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/RG2014F.ttf -------------------------------------------------------------------------------- /fonts/RG2014EEM.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/RG2014EEM.ttf -------------------------------------------------------------------------------- /img/example/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/img/example/image.png -------------------------------------------------------------------------------- /img/example/nh-to-maine-95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/img/example/nh-to-maine-95.png -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_1-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_1-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_1-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_1-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_2-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_2-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_2-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_2-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_c-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_c-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_c-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_c-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_d-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_d-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_d-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_d-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_e-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_e-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_e-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_e-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_1-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_1-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_1-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_1-webfont.woff2 -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_2-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_2-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_arrows_2-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_arrows_2-webfont.woff2 -------------------------------------------------------------------------------- /fonts/roadgeek_2005_old_parks-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_old_parks-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_old_parks-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_old_parks-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_old_parks-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_old_parks-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_old_parks-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_old_parks-webfont.woff2 -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_c-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_c-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_c-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_c-webfont.woff2 -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_d-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_d-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_d-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_d-webfont.woff2 -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_e-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_e-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_e-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_e-webfont.woff2 -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_em-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_em-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_em-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_em-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_em-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_em-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_series_em-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_series_em-webfont.woff2 -------------------------------------------------------------------------------- /fonts/roadgeek_2005_mittelschrift-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_mittelschrift-webfont.eot -------------------------------------------------------------------------------- /fonts/roadgeek_2005_mittelschrift-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_mittelschrift-webfont.ttf -------------------------------------------------------------------------------- /fonts/roadgeek_2005_mittelschrift-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_mittelschrift-webfont.woff -------------------------------------------------------------------------------- /fonts/roadgeek_2005_mittelschrift-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dki-os/SignMaker/HEAD/fonts/roadgeek_2005_mittelschrift-webfont.woff2 -------------------------------------------------------------------------------- /img/select.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /img/shields-with-backs/NL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /img/shields-with-backs/NL-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /img/shields-without-backs/NL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /img/shields-without-backs/NL-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /img/other-symbols/QC-Exit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/shields-with-backs/VA-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /img/shields-with-backs/VA-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sign Maker 2 | 3 | ![SignMaker Preview Thumbnail](https://repository-images.githubusercontent.com/203719668/9e0b3000-6151-11ea-8adb-d5824ff3f5e3) 4 | 5 | A JavaScript-based app for creating highway guide signs. Based off of [Kurumi's Sign Maker](http://www.kurumi.com/roads/signmaker). Allows for the creation of highway guide signs in the style defined by the United States FHWA in their [MUTCD](https://mutcd.fhwa.dot.gov/kno_2009r1r2.htm). 6 | 7 | ## Acknowledgements 8 | 9 | Typefaces sourced from the [Roadgeek 2005 Font Family by Michael Adams](https://n1en.org/roadgeek-fonts/). 10 | Route shields are sourced from [Wikipedia](https://en.wikipedia.org/wiki/Numbered_highways_in_the_United_States). 11 | 12 | ## License 13 | 14 | [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.txt) 15 | -------------------------------------------------------------------------------- /img/shields-with-backs/WI-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /img/shields-with-backs/rec2-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /img/shields-without-backs/rec2-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /js/ExitTab.js: -------------------------------------------------------------------------------- 1 | class ExitTab { 2 | /** 3 | * Creates a new ExitTab. 4 | * @param {string} number - Number to display on the exit tab. 5 | * @param {string} [position=null] - Position to display the exit tab relative to the sign. 6 | * @param {string} [width=null] - Width of the exit tab (narrow or wide). 7 | */ 8 | constructor (number = null, position = null, width = null) { 9 | this.number = number; 10 | if (this.positions.includes(position)) { 11 | this.position = position; 12 | } else { 13 | this.position = this.positions[1]; 14 | } 15 | if (this.widths.includes(width)) { 16 | this.width = width; 17 | } else { 18 | this.width = this.widths[0]; 19 | } 20 | } 21 | } 22 | 23 | ExitTab.prototype.positions = ["Left", "Center", "Right"]; 24 | ExitTab.prototype.widths = ["Narrow", "Wide", "Full", "Edge"]; 25 | -------------------------------------------------------------------------------- /img/shields-with-backs/TN2-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /js/Panel.js: -------------------------------------------------------------------------------- 1 | class Panel { 2 | /** 3 | * Creates a new Panel consisting of a sign and an exit tab. 4 | * @param {string} color - Background color of the sign and exit tab. 5 | * @param {Sign} sign - Sign to make up the panel. 6 | * @param {String} corner - Choice of Sharp or Rounded Corners on the Panel 7 | * @param {ExitTab} [exitTab=null] - Optional exit tab to include in the panel. 8 | */ 9 | constructor(sign, color, exitTab = null, corner) { 10 | if (Object.keys(lib.colors).includes(color)) { 11 | this.color = color; 12 | } else { 13 | this.color = "Green"; 14 | } 15 | if (Object.keys(this.cornerType).includes(corner)) { 16 | this.corner = corner; 17 | } else { 18 | this.corner = this.cornerType[0]; 19 | } 20 | this.sign = sign; 21 | this.exitTab = exitTab; 22 | } 23 | } 24 | Panel.prototype.cornerType = ["Round", "Sharp"]; 25 | -------------------------------------------------------------------------------- /img/shields-with-backs/TN2-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /img/shields-with-backs/MI-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /img/shields-with-backs/rec-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-with-backs/rec-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-without-backs/rec-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-without-backs/rec-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-without-backs/MI-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-with-backs/US-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /img/shields-with-backs/US-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /img/shields-without-backs/US-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-without-backs/US-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-with-backs/VA2-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 11 | 12 | -------------------------------------------------------------------------------- /img/shields-with-backs/cir-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 11 | 12 | -------------------------------------------------------------------------------- /img/shields-with-backs/elp-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 11 | 12 | -------------------------------------------------------------------------------- /img/shields-with-backs/PA-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /img/shields-with-backs/rec2-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-with-backs/PA-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /img/shields-with-backs/WA-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /img/shields-without-backs/rec2-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /img/shields-without-backs/WI-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 12 | 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /img/shields-with-backs/NE-2-LINK.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 12 | 13 | 14 | 15 | 16 | 19 | 20 | -------------------------------------------------------------------------------- /img/shields-without-backs/NE-LINK.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | -------------------------------------------------------------------------------- /img/shields-with-backs/NS-3-CONN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /img/shields-without-backs/NS-3-CONN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /img/shields-without-backs/TN2-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 15 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /img/shields-without-backs/TN2-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 15 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-with-backs/NC-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /img/shields-without-backs/VA-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 12 | 15 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-with-backs/FL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /img/shields-without-backs/NC-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 16 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-without-backs/FL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /img/shields-with-backs/FL-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /img/shields-without-backs/FL-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /img/shields-with-backs/CO-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-with-backs/CO-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-without-backs/CO-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-without-backs/VA-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 12 | 15 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-without-backs/PA-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 13 | 14 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-with-backs/OH-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-with-backs/OK-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /img/shields-without-backs/OK-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /img/shields-without-backs/PA-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 13 | 14 | 15 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /img/shields-with-backs/OH-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 12 | 13 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /img/shields-with-backs/elp-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /img/shields-without-backs/elp-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /img/shields-with-backs/NY-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | 14 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-without-backs/NY-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 16 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /img/shields-with-backs/NY-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | 11 | 14 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /img/shields-with-backs/AR-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 17 | 18 | -------------------------------------------------------------------------------- /img/shields-with-backs/OK-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | 14 | 17 | 18 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-without-backs/OK-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | 14 | 17 | 18 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-without-backs/AR-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 17 | 18 | -------------------------------------------------------------------------------- /img/shields-without-backs/NY-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 16 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /img/shields-without-backs/VA2-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-without-backs/cir-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-without-backs/elp-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-with-backs/cir-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 13 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /img/shields-without-backs/cir-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 13 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /img/shields-with-backs/AR-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 17 | 18 | -------------------------------------------------------------------------------- /img/shields-with-backs/IN-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 12 | 14 | 16 | 24 | 25 | -------------------------------------------------------------------------------- /img/shields-without-backs/IN-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 12 | 14 | 16 | 24 | 25 | -------------------------------------------------------------------------------- /img/shields-without-backs/AR-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 18 | 19 | -------------------------------------------------------------------------------- /img/shields-with-backs/IN-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 12 | 14 | 16 | 25 | 26 | -------------------------------------------------------------------------------- /img/shields-without-backs/IN-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 12 | 14 | 16 | 25 | 26 | -------------------------------------------------------------------------------- /img/shields-with-backs/FL-2-TOLL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-without-backs/FL-2-TOLL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /img/shields-with-backs/RI-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 13 | 15 | 16 | 18 | 19 | 22 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /img/shields-without-backs/RI-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 13 | 15 | 16 | 18 | 19 | 22 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /img/shields-with-backs/RI-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | 14 | 16 | 17 | 19 | 20 | 22 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /img/shields-without-backs/RI-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | 14 | 16 | 17 | 19 | 20 | 22 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /css/form.css: -------------------------------------------------------------------------------- 1 | form { 2 | background-color: rgba(255, 255, 255, 0.125); 3 | 4 | width: -moz-max-content; 5 | width: -webkit-max-content; 6 | width: intrinsic; 7 | margin: 1rem auto 0; 8 | padding: 0.5rem; 9 | } 10 | 11 | form, select, input, textarea { 12 | font-family: "Series E"; 13 | font-size: 1rem; 14 | } 15 | 16 | select, input, textarea, label, legend { 17 | width: 7.5rem; 18 | margin: 0.25rem; 19 | } 20 | 21 | select, input, textarea { 22 | background-color: rgb(230, 230, 230); 23 | border: none; 24 | border-radius: 0.25rem; 25 | 26 | padding: 0.25rem; 27 | } 28 | 29 | select { 30 | background: rgb(230, 230, 230) url(../img/select.svg) no-repeat right ; 31 | -moz-appearance: none; 32 | -webkit-appearance: none; 33 | appearance: none; 34 | 35 | padding-right: 17px; 36 | } 37 | 38 | input[type=button] { 39 | -moz-appearance: none; 40 | -webkit-appearance: none; 41 | appearance: none; 42 | 43 | cursor: pointer; 44 | transition: background-color 0.5s; 45 | } 46 | input[type=button]:hover { 47 | background-color: rgb(160, 160, 160); 48 | } 49 | input[type=checkbox] { 50 | width: auto; 51 | } 52 | textarea { 53 | min-width: 15.5rem; 54 | } 55 | 56 | label { 57 | text-align: right; 58 | display: inline-block; 59 | } 60 | 61 | .shiftButton { 62 | width: 3.5rem; 63 | } 64 | 65 | #shieldBacksLabel { 66 | width: auto; 67 | } 68 | 69 | fieldset { 70 | border: none; 71 | margin: 0.5rem 0; 72 | } 73 | 74 | #shields div { 75 | border-radius: 0.25rem; 76 | 77 | width: -moz-max-content; 78 | width: -webkit-max-content; 79 | width: intrinsic; 80 | margin-left: 0.25rem; 81 | } 82 | #shields div:nth-child(odd) { 83 | background-color: rgba(255, 255, 255, 0.33); 84 | } 85 | #shields label, #shields select:first-of-type { 86 | width: auto; 87 | } 88 | #shields label { 89 | margin: 0; 90 | } 91 | 92 | #controlCitiesLabel { 93 | position: relative; 94 | top: -5rem; 95 | } 96 | 97 | #guideArrowLanes { 98 | width: 2.25rem; 99 | } 100 | 101 | #actionMessage { 102 | width: 15.75rem; 103 | } 104 | #oSNum { 105 | margin-left: 8.5rem; 106 | } 107 | 108 | input[value="New Shield"], input[value="New Sign"] { 109 | margin-bottom: 0.75rem; 110 | } 111 | input[value=Delete]:hover { 112 | background-color: rgb(255, 200, 200); 113 | } 114 | -------------------------------------------------------------------------------- /img/shields-with-backs/MT-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | 25 | 26 | -------------------------------------------------------------------------------- /img/shields-with-backs/TX-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 12 | 13 | 14 | 22 | 24 | 26 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /img/shields-without-backs/MT-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | 25 | 26 | -------------------------------------------------------------------------------- /img/shields-without-backs/TX-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 12 | 13 | 14 | 22 | 24 | 26 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /img/shields-with-backs/MT-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | 25 | 26 | -------------------------------------------------------------------------------- /img/shields-without-backs/MT-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | 25 | 26 | -------------------------------------------------------------------------------- /js/lib.js: -------------------------------------------------------------------------------- 1 | const lib = (function() { 2 | 3 | /** 4 | * Clears out the children from a given element. 5 | * @param {Element} parentElmt - Parent element to be cleared of children. 6 | */ 7 | const clearChildren = function(parentElmt) { 8 | while (parentElmt.firstChild) { 9 | parentElmt.removeChild(parentElmt.firstChild); 10 | } 11 | }; 12 | 13 | /** 14 | * Creates and appends an option element to a given Select element. 15 | * @param {Element} selectElmt - Select element to be appended to. 16 | * @param {string} value - Value to be held by the option. 17 | * @param {boolean} [selected=false] - Whether or not the new option should be auto-selected. 18 | * @param {string} [text] - Display text for the option. 19 | */ 20 | const appendOption = function(selectElmt, value, {selected = false, text} = {}) { 21 | if (!text) { 22 | text = value; 23 | } 24 | const optionElmt = document.createElement("option"); 25 | optionElmt.value = value; 26 | optionElmt.selected = selected; 27 | optionElmt.appendChild(document.createTextNode(text)); 28 | selectElmt.appendChild(optionElmt); 29 | }; 30 | 31 | // FHW-defined colors. 32 | const colors = { 33 | Green : "rgb(0, 95, 77)", 34 | Blue : "rgb(0, 67, 123)", 35 | Brown : "rgb(98, 51, 30)", 36 | Yellow : "rgb(255, 178, 0)", 37 | White : "rgb(255, 255, 255)", 38 | Black : "rgb(0, 0, 0)" 39 | }; 40 | 41 | const specialCharacters = { 42 | sideLeftArrow : "h", // "h" is left-side up arrow in Roadgeek 2005 Arrows 1 43 | sideRightArrow : "H", // "H" is right-side up arrow in Roadgeek 2005 Arrows 1 44 | 45 | "Left/Down Arrow" : "f", // "f" is left-down arrow in Roadgeek 2005 Arrows 1 46 | "Left/Up Arrow" : "F", 47 | "Left Arrow" : "j", // "j" is left arrow in Roadgeek 2005 Arrows 1 48 | "Right/Down Arrow" : "F", // "F" is right-down arrow in Roadgeek 2005 Arrows 1 49 | "Right/Up Arrow" : "f", 50 | "Right Arrow" : "J", // "J" is right arrow in Roadgeek 2005 Arrows 1 51 | 52 | "Up Arrow" : "4", // "4" is up arrow in Roadgeek 2005 Arrows 2 53 | "Down Arrow" : "$" // "$" is down arrow in roadgeek 2005 arrows 2 54 | }; 55 | 56 | const shieldPositions = { 57 | Left : "row", 58 | Above : "column", 59 | Right : "row-reverse" 60 | }; 61 | 62 | return { 63 | clearChildren : clearChildren, 64 | appendOption : appendOption, 65 | colors : colors, 66 | specialCharacters : specialCharacters, 67 | shieldPositions : shieldPositions 68 | }; 69 | })(); 70 | -------------------------------------------------------------------------------- /img/shields-with-backs/OR-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 25 | 26 | -------------------------------------------------------------------------------- /img/shields-with-backs/AZ-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 12 | 13 | 25 | 26 | -------------------------------------------------------------------------------- /img/shields-with-backs/AL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 23 | 24 | -------------------------------------------------------------------------------- /img/shields-with-backs/MD-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 14 | 15 | 16 | 29 | 30 | -------------------------------------------------------------------------------- /img/shields-with-backs/MD-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 14 | 15 | 16 | 29 | 30 | -------------------------------------------------------------------------------- /img/shields-without-backs/AL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 23 | 24 | -------------------------------------------------------------------------------- /img/shields-without-backs/MD-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 14 | 15 | 16 | 29 | 30 | -------------------------------------------------------------------------------- /img/shields-without-backs/MD-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 14 | 15 | 16 | 29 | 30 | -------------------------------------------------------------------------------- /img/shields-with-backs/UT-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 11 | 14 | 15 | 16 | 18 | 27 | 30 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /img/shields-with-backs/AL-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 23 | 24 | -------------------------------------------------------------------------------- /img/shields-without-backs/AL-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 24 | 25 | -------------------------------------------------------------------------------- /img/shields-with-backs/OR-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 27 | 28 | -------------------------------------------------------------------------------- /img/shields-without-backs/AZ-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 12 | 24 | 25 | -------------------------------------------------------------------------------- /img/shields-with-backs/MO-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 11 | 12 | 19 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /img/shields-with-backs/MO-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 11 | 12 | 19 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /img/shields-without-backs/MO-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 20 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /img/shields-without-backs/MO-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 12 | 13 | 20 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /js/Shield.js: -------------------------------------------------------------------------------- 1 | class Shield { 2 | /** 3 | * Creates anew a route shield. 4 | * @param {string} [type="I-"] - Type of shield. 5 | * @param {number} [routeNumber="1"] - Route number to display on shield. 6 | * @param {boolean} [to=false] - Whether or not the shield should be signed as "TO". 7 | * @param {string} [bannerType] - Directional banner to display. 8 | * @param {string} [bannerPosition] - Where to place the directional banner relative to the shield. 9 | */ 10 | constructor({type = "I", routeNumber = "1", to = false, bannerType, bannerPosition} = {}) { 11 | if (Object.keys(this.types).includes(type)) { 12 | this.type = type; 13 | } else { 14 | this.type = "I"; 15 | } 16 | this.type = type; 17 | this.routeNumber = routeNumber; 18 | this.to = to; 19 | if (this.bannerTypes.includes(bannerType)) { 20 | this.bannerType = bannerType; 21 | } else { 22 | this.bannerType = this.bannerTypes[0]; 23 | } 24 | if (this.bannerPositions.includes(bannerPosition)) { 25 | this.bannerPosition = bannerPosition; 26 | } else { 27 | this.bannerPosition = this.bannerPositions[0]; 28 | } 29 | } 30 | } 31 | 32 | Shield.prototype.bannerTypes = [ 33 | "None", 34 | "Arterial", 35 | "North", 36 | "East", 37 | "South", 38 | "West", 39 | "Jct", 40 | "Begin", 41 | "End", 42 | "Spur", 43 | "Alt", 44 | "Truck", 45 | "Trunk", 46 | "Bus", 47 | "Byp", 48 | "Loop", 49 | "Express", 50 | "Local", 51 | "Inner", 52 | "Outer", 53 | "Future", 54 | "Toll", 55 | "City", 56 | "Conn", 57 | "To" 58 | ]; 59 | Shield.prototype.bannerPositions = ["Above", "Right", "Left"]; 60 | Shield.prototype.types = { 61 | "I-" : "I", 62 | "US" : "US", 63 | "AL" : "AL", 64 | "AK" : "AK", 65 | "AZ" : "AZ", 66 | "AR" : "AR", 67 | "CA" : "CA", 68 | "CO" : "CO", 69 | "CT" : "rec2", 70 | "DE" : "cir", 71 | "DC" : "DC", 72 | "FL" : "FL", 73 | "GA" : "GA", 74 | "HI" : "HI", 75 | "ID" : "ID", 76 | "IL" : "IL", 77 | "IN" : "IN", 78 | "IA" : "cir", 79 | "KS" : "KS", 80 | "KY" : "cir", 81 | "LA" : "LA", 82 | "ME" : "rec", 83 | "MD" : "MD", 84 | "MA" : "rec", 85 | "MI" : "MI", 86 | "MN" : "MN", 87 | "MS" : "elp", 88 | "MO" : "MO", 89 | "MT" : "MT", 90 | "MT 2nd" : "MT2", 91 | "NB" : "NB", 92 | "NE" : "NE", 93 | "NL" : "NL", 94 | "NS" : "NS", 95 | "NV" : "NV", 96 | "NH" : "NH", 97 | "NJ" : "elp", 98 | "NM" : "NM", 99 | "NY" : "NY", 100 | "NC" : "NC", 101 | "ND" : "ND", 102 | "OH" : "OH", 103 | "OK" : "OK", 104 | "OR" : "OR", 105 | "PA" : "PA", 106 | "PEI" : "PEI", 107 | "QC" : "QC", 108 | "QC 2nd" : "QC2", 109 | "RI" : "RI", 110 | "SC" : "SC", 111 | "SD" : "SD", 112 | "TN" : "TN", 113 | "TN 2nd" : "TN2", 114 | "TX" : "TX", 115 | "UT" : "UT", 116 | "VT" : "VT", 117 | "VT 2nd" : "cir", 118 | "VA" : "VA", 119 | "VA 2nd" : "VA2", 120 | "WA" : "WA", 121 | "WV" : "rec2", 122 | "WI" : "WI", 123 | "WY" : "WY", 124 | "C-" : "C" 125 | }; 126 | -------------------------------------------------------------------------------- /img/shields-with-backs/AZ-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 10 | 12 | 13 | 28 | 29 | -------------------------------------------------------------------------------- /js/Sign.js: -------------------------------------------------------------------------------- 1 | class Sign { 2 | 3 | /** 4 | * Cretes a new sign. 5 | * @param {Object} [opt] - Optional parameters. 6 | * @param {string} [opt.controlText="New Sign"] - Control cities to display on the sign. 7 | * @param {string} [opt.shieldPosition] - Where the shields should be displayed relative to the control cities. 8 | * @param {boolean} [opt.shieldBacks=false] - Whether or not shields should be displayed with backings. 9 | * @param {string} [opt.guideArrow] - Which guide arrow to display on the sign, if any. 10 | * @param {number} [opt.guideArrowLanes=1] - Number of lanes actoss to display guide arrows. 11 | * @param {string} [opt.otherSymbols] - Other symbols on the bottom of signs (like Quebec style exit markers) 12 | * @param {string} [opt.oSNum=""] - Number to place on otherSymbol 13 | * @param {string} [opt.actionMessage=""] - Custom subtext to display on the sign. 14 | * @param {Shield[]} [opt.shields] - Array of shields to include on sign. 15 | */ 16 | constructor({ 17 | controlText = "New Sign", 18 | shieldPosition, 19 | shieldBacks = false, 20 | guideArrow, 21 | guideArrowLanes = 1, 22 | otherSymbol, 23 | oSNum = "", 24 | actionMessage = "", 25 | shields = [] 26 | } = {} 27 | ) { 28 | this.controlText = controlText; 29 | if (this.shieldPositions.includes(shieldPosition)) { 30 | this.shieldPosition = shieldPosition; 31 | } else { 32 | this.shieldPosition = "Above"; 33 | } 34 | if (this.otherSymbols.includes(otherSymbol)) { 35 | this.otherSymbol = otherSymbol; 36 | } 37 | else { 38 | this.otherSymbol = "None"; 39 | } 40 | this.shieldBacks = shieldBacks; 41 | if (this.guideArrows.includes(guideArrow)) { 42 | this.guideArrow = guideArrow; 43 | } else { 44 | this.guideArrow = "None"; 45 | } 46 | if (guideArrowLanes >= 0 && guideArrowLanes <= 6) { 47 | this.guideArrowLanes = guideArrowLanes; 48 | } else { 49 | this.guideArrowLanes = 0; 50 | } 51 | this.oSNum = oSNum; 52 | this.actionMessage = actionMessage; 53 | this.shields = shields; 54 | } 55 | 56 | /** 57 | * Create a new shield for the post. Add it to the end of the list of existing shields. 58 | */ 59 | newShield() { 60 | const newShield = new Shield(); 61 | this.shields.push(newShield); 62 | } 63 | 64 | /** 65 | * Delete an existing shield at the requested index. 66 | * @param {number} shieldIndex - Position of the shield in the array of shields on this sign to delete. 67 | */ 68 | deleteShield(shieldIndex) { 69 | this.shields.splice(shieldIndex, 1); 70 | } 71 | } 72 | 73 | Sign.prototype.shieldPositions = ["Left", "Above", "Right"]; 74 | Sign.prototype.guideArrows = [ 75 | "None", 76 | "Side Left", 77 | "Side Right", 78 | "Exit Only", 79 | "Left/Down Arrow", 80 | "Left Arrow", 81 | "Left/Up Arrow", 82 | "Right/Down Arrow", 83 | "Right Arrow", 84 | "Right/Up Arrow", 85 | "Down Arrow", 86 | "Up Arrow" 87 | ]; 88 | Sign.prototype.otherSymbols = [ 89 | "None", 90 | "Quebec-Style Exit Marker", 91 | "Quebec-Left" 92 | ] 93 | -------------------------------------------------------------------------------- /img/shields-with-backs/IL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 12 | 14 | 31 | 32 | -------------------------------------------------------------------------------- /img/shields-without-backs/IL-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 12 | 14 | 31 | 32 | -------------------------------------------------------------------------------- /img/shields-with-backs/AK-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 27 | 37 | 38 | -------------------------------------------------------------------------------- /img/shields-with-backs/AK-3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 27 | 37 | 38 | --------------------------------------------------------------------------------