diff --git a/README.md b/README.md
index 80fcca9..2a12343 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
-## What is AFJROTC Ribbon Rack Builder?
-A rack builder for ribbons, badges, ranks, etc.
+## What is AFJROTC/CAP Ribbon Rack Builder?
+An **AFJROTC & CAP** rack builder for ribbons, badges, ranks, arcs, tapes, etc.
Vist the website [here](https://dotwith.github.io/afjrotc-ribbon-rack-builder/).
-## Credit!
-Some ribbons are taken from here the [Wikipedia](https://en.m.wikipedia.org/wiki/Junior_Reserve_Officers%27_Training_Corps).
+## Cite
+- [Wikipedia, AFJROTC](https://en.m.wikipedia.org/wiki/Junior_Reserve_Officers%27_Training_Corps).
+- [Wikipedia, CAP](https://en.wikipedia.org/wiki/Awards_and_decorations_of_the_Civil_Air_Patrol).
diff --git a/styles.css b/afjrotc/app.css
similarity index 71%
rename from styles.css
rename to afjrotc/app.css
index 544e2d4..a05d28d 100644
--- a/styles.css
+++ b/afjrotc/app.css
@@ -1,49 +1,3 @@
-@font-face {
- font-family: FFDINWeb;
- src: url('fonts/FFDINWeb.ttf');
-}
-
-@font-face {
- font-family: Stratum;
- src: url('fonts/Stratum.ttf');
-}
-
-@font-face {
- font-family: StratumBold;
- src: url('fonts/StratumBold.ttf');
-}
-
-body {
- font-family: FFDINWeb, Arial, sans-serif;
- font-weight: 400;
- letter-spacing: normal;
- color: #0e172d;
-}
-
-h1 {
- font-weight: 700;
- font-family: Stratum, Arial, sans-serif;
- text-transform: uppercase;
- font-style: normal;
- text-align: center;
-}
-
-h2 {
- font-weight: 500;
- font-family: Stratum, Arial, sans-serif;
- text-transform: uppercase;
- font-style: normal;
- text-align: center;
-}
-
-h3 {
- font-weight: 200;
- font-family: Stratum, Arial, sans-serif;
- text-transform: uppercase;
- font-style: normal;
- text-align: center;
-}
-
.container {
max-width: 1000px;
margin: 0 auto;
@@ -133,6 +87,7 @@ input[type="range"]::-ms-thumb {
width: 60px;
height: 60px;
margin-right: 24px;
+ object-fit: contain;
}
.badge-checkbox {
@@ -219,24 +174,6 @@ input[type="range"]::-ms-thumb {
gap: 10px;
}
-button {
- font-family: StratumBold;
- font-style: normal;
- font-weight: 500;
- font-size: 17px;
- line-height: 20px;
- letter-spacing: 2px;
- text-align: center;
- height: 40px;
- text-transform: uppercase;
- border: 0px solid #ffffff;
- border-top-color: rgb(255, 255, 255);
- border-right-color: rgb(255, 255, 255);
- border-bottom-color: rgb(255, 255, 255);
- border-left-color: rgb(255, 255, 255);
- border-radius: 0px;
-}
-
.tabs {
border: 1px solid #ccc;
}
diff --git a/afjrotc/app.html b/afjrotc/app.html
new file mode 100644
index 0000000..fd7bacb
--- /dev/null
+++ b/afjrotc/app.html
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+ Air Force JROTC
+
+
+
+
+
+
+
+
+
+
+
Air Force JROTC
+
Check the box next to each ribbon you would like to have
+ sorted.
+
+
+
+
+ - Ribbons
+ - Ranks
+ - Arcs
+ - Badges
+
+
+
+
+
+
+
+
+
+
+
+
Your Ribbon Rack
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app.js b/afjrotc/app.js
similarity index 100%
rename from app.js
rename to afjrotc/app.js
diff --git a/arcs/_meta.json b/afjrotc/arcs/_meta.json
similarity index 100%
rename from arcs/_meta.json
rename to afjrotc/arcs/_meta.json
diff --git a/arcs/_template_arc.svg b/afjrotc/arcs/_template_arc.svg
similarity index 100%
rename from arcs/_template_arc.svg
rename to afjrotc/arcs/_template_arc.svg
diff --git a/arcs/academics_arc.svg b/afjrotc/arcs/academics_arc.svg
similarity index 100%
rename from arcs/academics_arc.svg
rename to afjrotc/arcs/academics_arc.svg
diff --git a/arcs/cadet_challenge_arc.svg b/afjrotc/arcs/cadet_challenge_arc.svg
similarity index 100%
rename from arcs/cadet_challenge_arc.svg
rename to afjrotc/arcs/cadet_challenge_arc.svg
diff --git a/arcs/color_guard_arc.svg b/afjrotc/arcs/color_guard_arc.svg
similarity index 100%
rename from arcs/color_guard_arc.svg
rename to afjrotc/arcs/color_guard_arc.svg
diff --git a/arcs/community_service_arc.svg b/afjrotc/arcs/community_service_arc.svg
similarity index 100%
rename from arcs/community_service_arc.svg
rename to afjrotc/arcs/community_service_arc.svg
diff --git a/arcs/cyberpatriot_arc.svg b/afjrotc/arcs/cyberpatriot_arc.svg
similarity index 100%
rename from arcs/cyberpatriot_arc.svg
rename to afjrotc/arcs/cyberpatriot_arc.svg
diff --git a/arcs/drill_team_arc.svg b/afjrotc/arcs/drill_team_arc.svg
similarity index 100%
rename from arcs/drill_team_arc.svg
rename to afjrotc/arcs/drill_team_arc.svg
diff --git a/arcs/flag_detail_arc.svg b/afjrotc/arcs/flag_detail_arc.svg
similarity index 100%
rename from arcs/flag_detail_arc.svg
rename to afjrotc/arcs/flag_detail_arc.svg
diff --git a/arcs/honor_guard_arc.svg b/afjrotc/arcs/honor_guard_arc.svg
similarity index 100%
rename from arcs/honor_guard_arc.svg
rename to afjrotc/arcs/honor_guard_arc.svg
diff --git a/arcs/honor_roll_arc.svg b/afjrotc/arcs/honor_roll_arc.svg
similarity index 100%
rename from arcs/honor_roll_arc.svg
rename to afjrotc/arcs/honor_roll_arc.svg
diff --git a/arcs/jclc_arc.svg b/afjrotc/arcs/jclc_arc.svg
similarity index 100%
rename from arcs/jclc_arc.svg
rename to afjrotc/arcs/jclc_arc.svg
diff --git a/arcs/jlab_arc.svg b/afjrotc/arcs/jlab_arc.svg
similarity index 100%
rename from arcs/jlab_arc.svg
rename to afjrotc/arcs/jlab_arc.svg
diff --git a/arcs/leadership_arc.svg b/afjrotc/arcs/leadership_arc.svg
similarity index 100%
rename from arcs/leadership_arc.svg
rename to afjrotc/arcs/leadership_arc.svg
diff --git a/arcs/orienteering_arc.svg b/afjrotc/arcs/orienteering_arc.svg
similarity index 100%
rename from arcs/orienteering_arc.svg
rename to afjrotc/arcs/orienteering_arc.svg
diff --git a/arcs/parade_arc.svg b/afjrotc/arcs/parade_arc.svg
similarity index 100%
rename from arcs/parade_arc.svg
rename to afjrotc/arcs/parade_arc.svg
diff --git a/arcs/pt_team_arc.svg b/afjrotc/arcs/pt_team_arc.svg
similarity index 100%
rename from arcs/pt_team_arc.svg
rename to afjrotc/arcs/pt_team_arc.svg
diff --git a/arcs/raider_arc.svg b/afjrotc/arcs/raider_arc.svg
similarity index 100%
rename from arcs/raider_arc.svg
rename to afjrotc/arcs/raider_arc.svg
diff --git a/arcs/rappelling_arc.svg b/afjrotc/arcs/rappelling_arc.svg
similarity index 100%
rename from arcs/rappelling_arc.svg
rename to afjrotc/arcs/rappelling_arc.svg
diff --git a/arcs/rifle_team_arc.svg b/afjrotc/arcs/rifle_team_arc.svg
similarity index 100%
rename from arcs/rifle_team_arc.svg
rename to afjrotc/arcs/rifle_team_arc.svg
diff --git a/arcs/sabre_guard_arc.svg b/afjrotc/arcs/sabre_guard_arc.svg
similarity index 100%
rename from arcs/sabre_guard_arc.svg
rename to afjrotc/arcs/sabre_guard_arc.svg
diff --git a/arcs/staff_arc.svg b/afjrotc/arcs/staff_arc.svg
similarity index 100%
rename from arcs/staff_arc.svg
rename to afjrotc/arcs/staff_arc.svg
diff --git a/arcs/summer_camp_arc.svg b/afjrotc/arcs/summer_camp_arc.svg
similarity index 100%
rename from arcs/summer_camp_arc.svg
rename to afjrotc/arcs/summer_camp_arc.svg
diff --git a/badges/01_officers_service_cap_insignia.svg b/afjrotc/badges/01_officers_service_cap_insignia.svg
similarity index 100%
rename from badges/01_officers_service_cap_insignia.svg
rename to afjrotc/badges/01_officers_service_cap_insignia.svg
diff --git a/badges/02_officers_service_cap_insignia.svg b/afjrotc/badges/02_officers_service_cap_insignia.svg
similarity index 100%
rename from badges/02_officers_service_cap_insignia.svg
rename to afjrotc/badges/02_officers_service_cap_insignia.svg
diff --git a/badges/_meta.json b/afjrotc/badges/_meta.json
similarity index 100%
rename from badges/_meta.json
rename to afjrotc/badges/_meta.json
diff --git a/badges/aef_badge.svg b/afjrotc/badges/aef_badge.svg
similarity index 100%
rename from badges/aef_badge.svg
rename to afjrotc/badges/aef_badge.svg
diff --git a/badges/apt_badge.svg b/afjrotc/badges/apt_badge.svg
similarity index 100%
rename from badges/apt_badge.svg
rename to afjrotc/badges/apt_badge.svg
diff --git a/badges/cmp_junior_bronze_distinguished_badge.svg b/afjrotc/badges/cmp_junior_bronze_distinguished_badge.svg
similarity index 100%
rename from badges/cmp_junior_bronze_distinguished_badge.svg
rename to afjrotc/badges/cmp_junior_bronze_distinguished_badge.svg
diff --git a/badges/cmp_junior_gold_distinguished_badge.svg b/afjrotc/badges/cmp_junior_gold_distinguished_badge.svg
similarity index 100%
rename from badges/cmp_junior_gold_distinguished_badge.svg
rename to afjrotc/badges/cmp_junior_gold_distinguished_badge.svg
diff --git a/badges/cmp_junior_silver_distinguished_badge.svg b/afjrotc/badges/cmp_junior_silver_distinguished_badge.svg
similarity index 100%
rename from badges/cmp_junior_silver_distinguished_badge.svg
rename to afjrotc/badges/cmp_junior_silver_distinguished_badge.svg
diff --git a/badges/cyberpatriot_badge.svg b/afjrotc/badges/cyberpatriot_badge.svg
similarity index 100%
rename from badges/cyberpatriot_badge.svg
rename to afjrotc/badges/cyberpatriot_badge.svg
diff --git a/badges/distinguished_cadet_badge.svg b/afjrotc/badges/distinguished_cadet_badge.svg
similarity index 100%
rename from badges/distinguished_cadet_badge.svg
rename to afjrotc/badges/distinguished_cadet_badge.svg
diff --git a/badges/flight_certifcate_badge.svg b/afjrotc/badges/flight_certifcate_badge.svg
similarity index 100%
rename from badges/flight_certifcate_badge.svg
rename to afjrotc/badges/flight_certifcate_badge.svg
diff --git a/badges/flight_solo_badge.svg b/afjrotc/badges/flight_solo_badge.svg
similarity index 100%
rename from badges/flight_solo_badge.svg
rename to afjrotc/badges/flight_solo_badge.svg
diff --git a/badges/ground_school_badge.svg b/afjrotc/badges/ground_school_badge.svg
similarity index 100%
rename from badges/ground_school_badge.svg
rename to afjrotc/badges/ground_school_badge.svg
diff --git a/badges/khhs_badge.svg b/afjrotc/badges/khhs_badge.svg
similarity index 100%
rename from badges/khhs_badge.svg
rename to afjrotc/badges/khhs_badge.svg
diff --git a/badges/marksmanship_shield_badge.svg b/afjrotc/badges/marksmanship_shield_badge.svg
similarity index 100%
rename from badges/marksmanship_shield_badge.svg
rename to afjrotc/badges/marksmanship_shield_badge.svg
diff --git a/badges/model_rocketry_badge.svg b/afjrotc/badges/model_rocketry_badge.svg
similarity index 100%
rename from badges/model_rocketry_badge.svg
rename to afjrotc/badges/model_rocketry_badge.svg
diff --git a/badges/ms_expert_badge.svg b/afjrotc/badges/ms_expert_badge.svg
similarity index 100%
rename from badges/ms_expert_badge.svg
rename to afjrotc/badges/ms_expert_badge.svg
diff --git a/badges/ms_marksman_badge.svg b/afjrotc/badges/ms_marksman_badge.svg
similarity index 100%
rename from badges/ms_marksman_badge.svg
rename to afjrotc/badges/ms_marksman_badge.svg
diff --git a/badges/ms_sharpshooter_badge.svg b/afjrotc/badges/ms_sharpshooter_badge.svg
similarity index 100%
rename from badges/ms_sharpshooter_badge.svg
rename to afjrotc/badges/ms_sharpshooter_badge.svg
diff --git a/badges/unmanned_aircraft_badge.svg b/afjrotc/badges/unmanned_aircraft_badge.svg
similarity index 100%
rename from badges/unmanned_aircraft_badge.svg
rename to afjrotc/badges/unmanned_aircraft_badge.svg
diff --git a/ranks/_meta.json b/afjrotc/ranks/_meta.json
similarity index 100%
rename from ranks/_meta.json
rename to afjrotc/ranks/_meta.json
diff --git a/ranks/enlisted/2.svg b/afjrotc/ranks/enlisted/2.svg
similarity index 100%
rename from ranks/enlisted/2.svg
rename to afjrotc/ranks/enlisted/2.svg
diff --git a/ranks/enlisted/3.svg b/afjrotc/ranks/enlisted/3.svg
similarity index 100%
rename from ranks/enlisted/3.svg
rename to afjrotc/ranks/enlisted/3.svg
diff --git a/ranks/enlisted/4.svg b/afjrotc/ranks/enlisted/4.svg
similarity index 100%
rename from ranks/enlisted/4.svg
rename to afjrotc/ranks/enlisted/4.svg
diff --git a/ranks/enlisted/5.svg b/afjrotc/ranks/enlisted/5.svg
similarity index 100%
rename from ranks/enlisted/5.svg
rename to afjrotc/ranks/enlisted/5.svg
diff --git a/ranks/enlisted/6.svg b/afjrotc/ranks/enlisted/6.svg
similarity index 100%
rename from ranks/enlisted/6.svg
rename to afjrotc/ranks/enlisted/6.svg
diff --git a/ranks/enlisted/7.svg b/afjrotc/ranks/enlisted/7.svg
similarity index 100%
rename from ranks/enlisted/7.svg
rename to afjrotc/ranks/enlisted/7.svg
diff --git a/ranks/enlisted/8.svg b/afjrotc/ranks/enlisted/8.svg
similarity index 100%
rename from ranks/enlisted/8.svg
rename to afjrotc/ranks/enlisted/8.svg
diff --git a/ranks/enlisted/9.svg b/afjrotc/ranks/enlisted/9.svg
similarity index 100%
rename from ranks/enlisted/9.svg
rename to afjrotc/ranks/enlisted/9.svg
diff --git a/ranks/officer/1.svg b/afjrotc/ranks/officer/1.svg
similarity index 100%
rename from ranks/officer/1.svg
rename to afjrotc/ranks/officer/1.svg
diff --git a/ranks/officer/2.svg b/afjrotc/ranks/officer/2.svg
similarity index 100%
rename from ranks/officer/2.svg
rename to afjrotc/ranks/officer/2.svg
diff --git a/ranks/officer/3.svg b/afjrotc/ranks/officer/3.svg
similarity index 100%
rename from ranks/officer/3.svg
rename to afjrotc/ranks/officer/3.svg
diff --git a/ranks/officer/4.svg b/afjrotc/ranks/officer/4.svg
similarity index 100%
rename from ranks/officer/4.svg
rename to afjrotc/ranks/officer/4.svg
diff --git a/ranks/officer/5.svg b/afjrotc/ranks/officer/5.svg
similarity index 100%
rename from ranks/officer/5.svg
rename to afjrotc/ranks/officer/5.svg
diff --git a/ranks/officer/6.svg b/afjrotc/ranks/officer/6.svg
similarity index 100%
rename from ranks/officer/6.svg
rename to afjrotc/ranks/officer/6.svg
diff --git a/ribbons/1.svg b/afjrotc/ribbons/1.svg
similarity index 100%
rename from ribbons/1.svg
rename to afjrotc/ribbons/1.svg
diff --git a/ribbons/10.svg b/afjrotc/ribbons/10.svg
similarity index 100%
rename from ribbons/10.svg
rename to afjrotc/ribbons/10.svg
diff --git a/ribbons/11.svg b/afjrotc/ribbons/11.svg
similarity index 100%
rename from ribbons/11.svg
rename to afjrotc/ribbons/11.svg
diff --git a/ribbons/12.svg b/afjrotc/ribbons/12.svg
similarity index 100%
rename from ribbons/12.svg
rename to afjrotc/ribbons/12.svg
diff --git a/ribbons/13.svg b/afjrotc/ribbons/13.svg
similarity index 100%
rename from ribbons/13.svg
rename to afjrotc/ribbons/13.svg
diff --git a/ribbons/14.svg b/afjrotc/ribbons/14.svg
similarity index 100%
rename from ribbons/14.svg
rename to afjrotc/ribbons/14.svg
diff --git a/ribbons/15.svg b/afjrotc/ribbons/15.svg
similarity index 100%
rename from ribbons/15.svg
rename to afjrotc/ribbons/15.svg
diff --git a/ribbons/16.svg b/afjrotc/ribbons/16.svg
similarity index 100%
rename from ribbons/16.svg
rename to afjrotc/ribbons/16.svg
diff --git a/ribbons/17.svg b/afjrotc/ribbons/17.svg
similarity index 100%
rename from ribbons/17.svg
rename to afjrotc/ribbons/17.svg
diff --git a/ribbons/18.svg b/afjrotc/ribbons/18.svg
similarity index 100%
rename from ribbons/18.svg
rename to afjrotc/ribbons/18.svg
diff --git a/ribbons/19.svg b/afjrotc/ribbons/19.svg
similarity index 100%
rename from ribbons/19.svg
rename to afjrotc/ribbons/19.svg
diff --git a/ribbons/2.svg b/afjrotc/ribbons/2.svg
similarity index 100%
rename from ribbons/2.svg
rename to afjrotc/ribbons/2.svg
diff --git a/ribbons/20.svg b/afjrotc/ribbons/20.svg
similarity index 100%
rename from ribbons/20.svg
rename to afjrotc/ribbons/20.svg
diff --git a/ribbons/21.svg b/afjrotc/ribbons/21.svg
similarity index 100%
rename from ribbons/21.svg
rename to afjrotc/ribbons/21.svg
diff --git a/ribbons/22.svg b/afjrotc/ribbons/22.svg
similarity index 100%
rename from ribbons/22.svg
rename to afjrotc/ribbons/22.svg
diff --git a/ribbons/23.svg b/afjrotc/ribbons/23.svg
similarity index 100%
rename from ribbons/23.svg
rename to afjrotc/ribbons/23.svg
diff --git a/ribbons/24.svg b/afjrotc/ribbons/24.svg
similarity index 100%
rename from ribbons/24.svg
rename to afjrotc/ribbons/24.svg
diff --git a/ribbons/25.svg b/afjrotc/ribbons/25.svg
similarity index 100%
rename from ribbons/25.svg
rename to afjrotc/ribbons/25.svg
diff --git a/ribbons/26.svg b/afjrotc/ribbons/26.svg
similarity index 100%
rename from ribbons/26.svg
rename to afjrotc/ribbons/26.svg
diff --git a/ribbons/27.svg b/afjrotc/ribbons/27.svg
similarity index 100%
rename from ribbons/27.svg
rename to afjrotc/ribbons/27.svg
diff --git a/ribbons/28.svg b/afjrotc/ribbons/28.svg
similarity index 100%
rename from ribbons/28.svg
rename to afjrotc/ribbons/28.svg
diff --git a/ribbons/29.svg b/afjrotc/ribbons/29.svg
similarity index 100%
rename from ribbons/29.svg
rename to afjrotc/ribbons/29.svg
diff --git a/ribbons/3.svg b/afjrotc/ribbons/3.svg
similarity index 100%
rename from ribbons/3.svg
rename to afjrotc/ribbons/3.svg
diff --git a/ribbons/30.svg b/afjrotc/ribbons/30.svg
similarity index 100%
rename from ribbons/30.svg
rename to afjrotc/ribbons/30.svg
diff --git a/ribbons/31.svg b/afjrotc/ribbons/31.svg
similarity index 100%
rename from ribbons/31.svg
rename to afjrotc/ribbons/31.svg
diff --git a/ribbons/32.svg b/afjrotc/ribbons/32.svg
similarity index 100%
rename from ribbons/32.svg
rename to afjrotc/ribbons/32.svg
diff --git a/ribbons/33.svg b/afjrotc/ribbons/33.svg
similarity index 100%
rename from ribbons/33.svg
rename to afjrotc/ribbons/33.svg
diff --git a/ribbons/34.svg b/afjrotc/ribbons/34.svg
similarity index 100%
rename from ribbons/34.svg
rename to afjrotc/ribbons/34.svg
diff --git a/ribbons/35.svg b/afjrotc/ribbons/35.svg
similarity index 100%
rename from ribbons/35.svg
rename to afjrotc/ribbons/35.svg
diff --git a/ribbons/36.svg b/afjrotc/ribbons/36.svg
similarity index 100%
rename from ribbons/36.svg
rename to afjrotc/ribbons/36.svg
diff --git a/ribbons/37.svg b/afjrotc/ribbons/37.svg
similarity index 100%
rename from ribbons/37.svg
rename to afjrotc/ribbons/37.svg
diff --git a/ribbons/38.svg b/afjrotc/ribbons/38.svg
similarity index 100%
rename from ribbons/38.svg
rename to afjrotc/ribbons/38.svg
diff --git a/ribbons/39.svg b/afjrotc/ribbons/39.svg
similarity index 100%
rename from ribbons/39.svg
rename to afjrotc/ribbons/39.svg
diff --git a/ribbons/4.svg b/afjrotc/ribbons/4.svg
similarity index 100%
rename from ribbons/4.svg
rename to afjrotc/ribbons/4.svg
diff --git a/ribbons/40.svg b/afjrotc/ribbons/40.svg
similarity index 100%
rename from ribbons/40.svg
rename to afjrotc/ribbons/40.svg
diff --git a/ribbons/41.svg b/afjrotc/ribbons/41.svg
similarity index 100%
rename from ribbons/41.svg
rename to afjrotc/ribbons/41.svg
diff --git a/ribbons/42.svg b/afjrotc/ribbons/42.svg
similarity index 100%
rename from ribbons/42.svg
rename to afjrotc/ribbons/42.svg
diff --git a/ribbons/43.svg b/afjrotc/ribbons/43.svg
similarity index 100%
rename from ribbons/43.svg
rename to afjrotc/ribbons/43.svg
diff --git a/ribbons/44.svg b/afjrotc/ribbons/44.svg
similarity index 100%
rename from ribbons/44.svg
rename to afjrotc/ribbons/44.svg
diff --git a/ribbons/45.svg b/afjrotc/ribbons/45.svg
similarity index 100%
rename from ribbons/45.svg
rename to afjrotc/ribbons/45.svg
diff --git a/ribbons/46.svg b/afjrotc/ribbons/46.svg
similarity index 100%
rename from ribbons/46.svg
rename to afjrotc/ribbons/46.svg
diff --git a/ribbons/47.svg b/afjrotc/ribbons/47.svg
similarity index 100%
rename from ribbons/47.svg
rename to afjrotc/ribbons/47.svg
diff --git a/ribbons/48.svg b/afjrotc/ribbons/48.svg
similarity index 100%
rename from ribbons/48.svg
rename to afjrotc/ribbons/48.svg
diff --git a/ribbons/49.svg b/afjrotc/ribbons/49.svg
similarity index 100%
rename from ribbons/49.svg
rename to afjrotc/ribbons/49.svg
diff --git a/ribbons/5.svg b/afjrotc/ribbons/5.svg
similarity index 100%
rename from ribbons/5.svg
rename to afjrotc/ribbons/5.svg
diff --git a/ribbons/50.svg b/afjrotc/ribbons/50.svg
similarity index 100%
rename from ribbons/50.svg
rename to afjrotc/ribbons/50.svg
diff --git a/ribbons/51.svg b/afjrotc/ribbons/51.svg
similarity index 100%
rename from ribbons/51.svg
rename to afjrotc/ribbons/51.svg
diff --git a/ribbons/52.svg b/afjrotc/ribbons/52.svg
similarity index 100%
rename from ribbons/52.svg
rename to afjrotc/ribbons/52.svg
diff --git a/ribbons/53.svg b/afjrotc/ribbons/53.svg
similarity index 100%
rename from ribbons/53.svg
rename to afjrotc/ribbons/53.svg
diff --git a/ribbons/54.svg b/afjrotc/ribbons/54.svg
similarity index 100%
rename from ribbons/54.svg
rename to afjrotc/ribbons/54.svg
diff --git a/ribbons/55.svg b/afjrotc/ribbons/55.svg
similarity index 100%
rename from ribbons/55.svg
rename to afjrotc/ribbons/55.svg
diff --git a/ribbons/56.svg b/afjrotc/ribbons/56.svg
similarity index 100%
rename from ribbons/56.svg
rename to afjrotc/ribbons/56.svg
diff --git a/ribbons/57.svg b/afjrotc/ribbons/57.svg
similarity index 100%
rename from ribbons/57.svg
rename to afjrotc/ribbons/57.svg
diff --git a/ribbons/58.svg b/afjrotc/ribbons/58.svg
similarity index 100%
rename from ribbons/58.svg
rename to afjrotc/ribbons/58.svg
diff --git a/ribbons/59.svg b/afjrotc/ribbons/59.svg
similarity index 100%
rename from ribbons/59.svg
rename to afjrotc/ribbons/59.svg
diff --git a/ribbons/6.svg b/afjrotc/ribbons/6.svg
similarity index 100%
rename from ribbons/6.svg
rename to afjrotc/ribbons/6.svg
diff --git a/ribbons/60.svg b/afjrotc/ribbons/60.svg
similarity index 100%
rename from ribbons/60.svg
rename to afjrotc/ribbons/60.svg
diff --git a/ribbons/61.svg b/afjrotc/ribbons/61.svg
similarity index 100%
rename from ribbons/61.svg
rename to afjrotc/ribbons/61.svg
diff --git a/ribbons/62.svg b/afjrotc/ribbons/62.svg
similarity index 100%
rename from ribbons/62.svg
rename to afjrotc/ribbons/62.svg
diff --git a/ribbons/63.svg b/afjrotc/ribbons/63.svg
similarity index 100%
rename from ribbons/63.svg
rename to afjrotc/ribbons/63.svg
diff --git a/ribbons/64.svg b/afjrotc/ribbons/64.svg
similarity index 100%
rename from ribbons/64.svg
rename to afjrotc/ribbons/64.svg
diff --git a/ribbons/65.svg b/afjrotc/ribbons/65.svg
similarity index 100%
rename from ribbons/65.svg
rename to afjrotc/ribbons/65.svg
diff --git a/ribbons/66.svg b/afjrotc/ribbons/66.svg
similarity index 100%
rename from ribbons/66.svg
rename to afjrotc/ribbons/66.svg
diff --git a/ribbons/67.svg b/afjrotc/ribbons/67.svg
similarity index 100%
rename from ribbons/67.svg
rename to afjrotc/ribbons/67.svg
diff --git a/ribbons/68.svg b/afjrotc/ribbons/68.svg
similarity index 100%
rename from ribbons/68.svg
rename to afjrotc/ribbons/68.svg
diff --git a/ribbons/7.svg b/afjrotc/ribbons/7.svg
similarity index 100%
rename from ribbons/7.svg
rename to afjrotc/ribbons/7.svg
diff --git a/ribbons/8.svg b/afjrotc/ribbons/8.svg
similarity index 100%
rename from ribbons/8.svg
rename to afjrotc/ribbons/8.svg
diff --git a/ribbons/9.svg b/afjrotc/ribbons/9.svg
similarity index 100%
rename from ribbons/9.svg
rename to afjrotc/ribbons/9.svg
diff --git a/ribbons/_meta.json b/afjrotc/ribbons/_meta.json
similarity index 100%
rename from ribbons/_meta.json
rename to afjrotc/ribbons/_meta.json
diff --git a/ribbons/bronze_oak_leaf.svg b/afjrotc/ribbons/bronze_oak_leaf.svg
similarity index 100%
rename from ribbons/bronze_oak_leaf.svg
rename to afjrotc/ribbons/bronze_oak_leaf.svg
diff --git a/ribbons/golden_oak_leaf.svg b/afjrotc/ribbons/golden_oak_leaf.svg
similarity index 100%
rename from ribbons/golden_oak_leaf.svg
rename to afjrotc/ribbons/golden_oak_leaf.svg
diff --git a/ribbons/silver_oak_leaf.svg b/afjrotc/ribbons/silver_oak_leaf.svg
similarity index 100%
rename from ribbons/silver_oak_leaf.svg
rename to afjrotc/ribbons/silver_oak_leaf.svg
diff --git a/afjrotc_logo.svg b/afjrotc_logo.svg
new file mode 100644
index 0000000..428397c
--- /dev/null
+++ b/afjrotc_logo.svg
@@ -0,0 +1,85 @@
+
+
+
diff --git a/cap/app.css b/cap/app.css
new file mode 100644
index 0000000..a05d28d
--- /dev/null
+++ b/cap/app.css
@@ -0,0 +1,210 @@
+.container {
+ max-width: 1000px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+.box-selection {
+ margin-bottom: 20px;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin-right: 24px;
+ height: 15px;
+ width: 15px;
+ accent-color: rgb(213, 210, 204);
+ flex-shrink: 0;
+}
+
+input[type="range"] {
+ appearance: none;
+ width: 125px;
+ height: 15px;
+ background: #ccc;
+ border: 1px solid #999;
+ border-radius: 1px;
+ margin-left: auto;
+}
+
+input[type="range"]::-webkit-slider-thumb {
+ appearance: none;
+ appearance: none;
+ width: 15px;
+ height: 15px;
+ background: #555;
+ cursor: pointer;
+ border: 1px solid #333;
+ border-radius: 1px;
+}
+
+input[type="range"]::-moz-range-thumb {
+ width: 15px;
+ height: 15px;
+ background: #555;
+ cursor: pointer;
+ border: 1px solid #333;
+ border-radius: 1px;
+}
+
+input[type="range"]::-ms-thumb {
+ width: 15px;
+ height: 15px;
+ background: #555;
+ cursor: pointer;
+ border: 1px solid #333;
+ border-radius: 1px;
+}
+
+.ribbon-option {
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+}
+
+.ribbon-option input[type="range"] {
+ margin-left: auto;
+}
+
+.ribbon-option img {
+ width: 100px;
+ height: 30px;
+ margin-right: 24px;
+ object-fit: contain;
+}
+
+.ribbon-option label {
+ cursor: pointer;
+}
+
+.rank-radio {
+ margin-right: 24px;
+ display: flex;
+ align-items: center;
+}
+
+.rank-radio img {
+ width: 60px;
+ height: 60px;
+ margin-right: 24px;
+ object-fit: contain;
+}
+
+.badge-checkbox {
+ margin-right: 24px;
+ display: flex;
+ align-items: center;
+}
+
+.badge-checkbox img {
+ width: 60px;
+ height: 60px;
+ margin-right: 24px;
+}
+
+.rack-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.rack {
+ width: 600px;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+
+/* ribbon container */
+.rack-ribbon {
+ position: relative;
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+
+/* ribbon img */
+.rack-ribbon-img {
+ width: 100px;
+ height: 30px;
+ object-fit: contain;
+}
+
+/* ribbon oak container */
+.ribbon-oak {
+ position: absolute;
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ gap: 3px;
+}
+
+/* ribbon oak img */
+.ribbon-oak-img {
+ position: static;
+ width: 20px;
+ height: 20px;
+ margin: 0 0px;
+}
+
+.rack-badge-img {
+ width: 60px;
+ height: 60px;
+ margin: 2px;
+ object-fit: contain;
+}
+
+.rack .row {
+ display: flex;
+ justify-content: center;
+ width: 100%;
+ margin-bottom: 10px;
+ gap: 10px;
+}
+
+/* .rack .row img {
+ margin: 0 5px;
+} */
+
+.button-group {
+ margin-top: 20px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ gap: 10px;
+}
+
+.tabs {
+ border: 1px solid #ccc;
+}
+
+.tabs ul {
+ display: flex;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.tabs li {
+ width: 100%;
+ text-transform: uppercase;
+ font-weight: 900;
+ text-align: center;
+ padding: 1rem 0;
+ cursor: pointer;
+ border-bottom: 1px solid #ccc;
+}
+
+.tab-content div {
+ padding: 2rem;
+}
+
+.bg-inactive {
+ background-color: white;
+}
+
+.bg-active {
+ background-color: #ccc;
+}
diff --git a/cap/app.html b/cap/app.html
new file mode 100644
index 0000000..06b304c
--- /dev/null
+++ b/cap/app.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+ Civil Air Patrol
+
+
+
+
+
+
+
+
+
+
+
Civil Air Patrol
+
Check the box next to each ribbon you would like to have
+ sorted.
+
+
+
+
+ - Ribbons
+ - Ranks
+ - Badges
+
+
+
+
+
+
+
+
+
+
Your Ribbon Rack
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cap/app.js b/cap/app.js
new file mode 100644
index 0000000..f34f873
--- /dev/null
+++ b/cap/app.js
@@ -0,0 +1,355 @@
+let selectedRibbons = [];
+let selectedRanks = [];
+let selectedBadges = [];
+let selectedArcs = [];
+
+fetch('arcs/_meta.json')
+ .then(response => response.json())
+ .then(data => {
+ const arcSelection = document.getElementById('arcSelection');
+ data.forEach(arc => {
+ const label = document.createElement('label');
+ label.classList.add('badge-checkbox');
+
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.dataset.arc = arc.path;
+
+ const img = document.createElement('img');
+ img.src = `arcs/${arc.path}`;
+ img.alt = arc.name;
+
+ const text = document.createTextNode(arc.name);
+
+ label.appendChild(checkbox);
+ label.appendChild(img);
+ label.appendChild(text);
+
+ arcSelection.appendChild(label);
+ });
+
+ // Update selected arcs when checkboxes are changed
+ const arcCheckboxes = document.querySelectorAll('input[data-arc]');
+ arcCheckboxes.forEach(checkbox => {
+ checkbox.addEventListener('change', updateSelectedRibbons);
+ });
+ });
+
+fetch('badges/_meta.json')
+ .then(response => response.json())
+ .then(data => {
+ const badgeSelection = document.getElementById('badgeSelection');
+ data.forEach(badge => {
+ const label = document.createElement('label');
+ label.classList.add('badge-checkbox');
+
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.dataset.badge = badge.path;
+
+ const img = document.createElement('img');
+ img.src = `badges/${badge.path}`;
+ img.alt = badge.name;
+
+ const text = document.createTextNode(badge.name);
+
+ label.appendChild(checkbox);
+ label.appendChild(img);
+ label.appendChild(text);
+
+ badgeSelection.appendChild(label);
+ });
+
+ // Update selected badges when checkboxes are changed
+ const badgeCheckboxes = document.querySelectorAll('input[data-badge]');
+ badgeCheckboxes.forEach(checkbox => {
+ checkbox.addEventListener('change', updateSelectedRibbons);
+ });
+ });
+
+fetch('ranks/_meta.json')
+ .then(response => response.json())
+ .then(data => {
+ function makeRanks(data, kind, rankSelection) {
+ data[kind].forEach(rank => {
+ const label = document.createElement('label');
+ label.classList.add('rank-radio');
+
+ const radio = document.createElement('input');
+ radio.dataset.rank = `${kind}/${rank.id}`;
+ radio.type = 'radio';
+ radio.name = 'rank';
+ radio.value = rank.id;
+ label.appendChild(radio);
+
+ if (rank.id != 1 || kind != "enlisted") {
+ const img = document.createElement('img');
+ img.src = `ranks/${kind}/${rank.id}.svg`;
+ img.alt = rank.name;
+ label.appendChild(img);
+ }
+
+ const text = document.createTextNode(`[${kind[0].toUpperCase()}-${rank.id}] ${rank.name}`);
+ label.appendChild(text);
+
+ rankSelection.appendChild(label);
+ });
+ }
+
+ const rankSelection = document.getElementById('rankSelection');
+ makeRanks(data, 'enlisted', rankSelection);
+ makeRanks(data, 'officer', rankSelection);
+
+ // Update selected ranks when radios are changed
+ const ranksRadios = document.querySelectorAll('input[data-rank]');
+ ranksRadios.forEach(radio => {
+ radio.addEventListener('change', updateSelectedRibbons);
+ });
+ });
+
+fetch('ribbons/_meta.json')
+ .then(response => response.json())
+ .then(data => {
+ const ribbonSelection = document.getElementById('ribbonSelection');
+ data.forEach(ribbon => {
+ const label = document.createElement('label');
+ label.classList.add('ribbon-option');
+
+ const checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.dataset.ribbon = ribbon.id;
+
+ const img = document.createElement('img');
+ img.src = `ribbons/${ribbon.id}.svg`;
+ img.alt = ribbon.name;
+
+ const text = document.createTextNode(ribbon.id + ". " + ribbon.name);
+
+ const oakNumber = document.createElement('input');
+ oakNumber.classList.add('ribbon-option-input');
+ oakNumber.type = 'range';
+ oakNumber.value = 0;
+ oakNumber.min = 0;
+ oakNumber.max = 25;
+ oakNumber.dataset.ribbon = ribbon.id; // Store ribbon id for easy reference
+
+ label.appendChild(checkbox);
+ label.appendChild(img);
+ label.appendChild(text);
+ label.appendChild(oakNumber);
+
+ ribbonSelection.appendChild(label);
+ });
+
+ // Update selected ribbons when checkboxes are changed
+ const ribbonCheckboxes = document.querySelectorAll('input[data-ribbon]');
+ ribbonCheckboxes.forEach(checkbox => {
+ checkbox.addEventListener('change', updateSelectedRibbons);
+ });
+
+ const oakNumberInputs = document.querySelectorAll('.ribbon-option-input');
+ oakNumberInputs.forEach(input => {
+ input.addEventListener('input', updateSelectedRibbons);
+ });
+ });
+
+function updateSelectedRibbons() {
+ selectedArcs = Array.from(document.querySelectorAll('input[data-arc]'))
+ .filter(checkbox => checkbox.checked)
+ .map(checkbox => checkbox.dataset.arc);
+
+ selectedBadges = Array.from(document.querySelectorAll('input[data-badge]'))
+ .filter(checkbox => checkbox.checked)
+ .map(checkbox => checkbox.dataset.badge);
+
+ selectedRanks = Array.from(document.querySelectorAll('input[data-rank]'))
+ .filter(radio => radio.checked)
+ .map(radio => radio.dataset.rank);
+
+ selectedRibbons = Array.from(document.querySelectorAll('input[data-ribbon]'))
+ .filter(checkbox => checkbox.checked)
+ .map(checkbox => {
+ const ribbonId = parseInt(checkbox.dataset.ribbon);
+ const oakNumber = parseInt(document.querySelector(`.ribbon-option-input[data-ribbon="${checkbox.dataset.ribbon}"]`).value);
+ return [ribbonId, oakNumber, []];
+ });
+
+ updateRack();
+}
+
+function updateRack() {
+ const rack = document.getElementById('rack');
+ rack.innerHTML = '';
+
+ // Sort the selected ribbons using the sortRibbons function
+ const sortedRibbons = sortRibbons(selectedRibbons.map(ribbonId => {
+ return ribbonId;
+ }));
+
+ const badgesRow = [];
+
+ selectedRanks.forEach(rank => {
+ if (rank == "enlisted/1") {
+ return;
+ }
+
+ const rankElement = document.createElement('img');
+ rankElement.src = `ranks/${rank}.svg`;
+ rankElement.className = 'rack-badge-img';
+
+ badgesRow.push(rankElement);
+ });
+
+ selectedBadges.forEach(badge => {
+ const badgeElement = document.createElement('img');
+ badgeElement.src = `badges/${badge}`;
+ badgeElement.className = 'rack-badge-img';
+
+ badgesRow.push(badgeElement);
+ });
+
+ selectedArcs.forEach(badge => {
+ const arcElement = document.createElement('img');
+ arcElement.src = `arcs/${badge}`;
+ arcElement.className = 'rack-badge-img';
+
+ badgesRow.push(arcElement);
+ });
+
+ // Loop through the ribbons in the current row
+ badgesRow.forEach(child => {
+ rack.appendChild(child);
+ });
+
+ // Loop through the sorted ribbons
+ sortedRibbons.forEach((row, _rowIndex) => {
+ // Create a row element
+ const rowElement = document.createElement('div');
+ rowElement.classList.add('row');
+
+ // Loop through the ribbons in the current row
+ row.forEach(ribbon => {
+ const ribbonContainer = document.createElement('div');
+ ribbonContainer.className = 'rack-ribbon';
+
+ // Create an image element for each ribbon
+ const ribbonElement = document.createElement('img');
+ ribbonElement.src = `ribbons/${ribbon[0]}.svg`;
+ ribbonElement.className = 'rack-ribbon-img';
+ ribbonContainer.appendChild(ribbonElement);
+
+ const oakContainer = document.createElement('div');
+ oakContainer.className = 'ribbon-oak';
+
+ if (Array.isArray(ribbon[2]) && ribbon[2].length === 0) {
+ if (ribbon[1] > 0) {
+ const numberOfGoldenOaks = Math.floor(ribbon[1] / 5 / 5);
+ const numberOfSilverOaks = Math.floor((ribbon[1] % 25) / 5);
+ const remainderBronzeOaks = ribbon[1] % 5;
+
+ // Create golden oak leaves
+ for (let i = 0; i < numberOfGoldenOaks; i++) {
+ const ribbonOak = document.createElement('img');
+ ribbonOak.src = `ribbons/golden_oak_leaf.svg`;
+ ribbonOak.className = 'ribbon-oak-img';
+ oakContainer.appendChild(ribbonOak);
+ }
+
+ // Create silver oak leaves
+ for (let i = 0; i < numberOfSilverOaks; i++) {
+ const ribbonOak = document.createElement('img');
+ ribbonOak.src = `ribbons/silver_oak_leaf.svg`;
+ ribbonOak.className = 'ribbon-oak-img';
+ oakContainer.appendChild(ribbonOak);
+ }
+
+ // Create bronze oak leaves for the remainder
+ for (let i = 0; i < remainderBronzeOaks; i++) {
+ const ribbonOak = document.createElement('img');
+ ribbonOak.src = `ribbons/bronze_oak_leaf.svg`;
+ ribbonOak.className = 'ribbon-oak-img';
+ oakContainer.appendChild(ribbonOak);
+ }
+ }
+ } else {
+ if (ribbon[1] > 0) {
+ const ribbonOak = document.createElement('img');
+ ribbonOak.src = `ribbons/` + ribbon[2][ribbon[1]] + `_oak_leaf.svg`;
+ ribbonOak.className = 'ribbon-oak-img';
+ oakContainer.appendChild(ribbonOak);
+ }
+ }
+
+ ribbonContainer.appendChild(oakContainer);
+ rowElement.appendChild(ribbonContainer);
+ });
+
+ // Append the row element to the rack
+ rack.appendChild(rowElement);
+ });
+}
+
+function sortRibbons(ribbons) {
+ ribbons.sort((a, b) => a - b);
+
+ const evenRows = ribbons.length % 3; // >1 = unven, 0 = even
+
+ const rows = [];
+ const ribbonsPerRow = 3;
+ const numRows = Math.ceil(ribbons.length / ribbonsPerRow);
+
+ for (let i = 0; i < numRows; i++) {
+ // if it's uneven then 1 or 2 go on the top
+ // and the reset of the ribbons follow the 3 per row princlpe
+ const row = [];
+
+ if (evenRows && i === 0) {
+ // If it's an odd count of ribbons and it's the first row,
+ // add 1 or 2 ribbons to the top row
+ const ribbonsToAdd = Math.min(evenRows, ribbons.length);
+ console.log(ribbonsToAdd);
+ for (let j = 0; j < ribbonsToAdd; j++) {
+ row.push(ribbons.shift());
+ }
+ } else {
+ // Add ribbons following the 3 per row principle
+ for (let j = 0; j < ribbonsPerRow && ribbons.length > 0; j++) {
+ row.push(ribbons.shift());
+ }
+ }
+
+ rows.push(row);
+ }
+
+ return rows;
+}
+
+function saveRackPng() {
+ html2canvas(document.getElementById('rack'), { backgroundColor: null, scale: 4 }).then(canvas => {
+ const link = document.createElement('a');
+ link.href = canvas.toDataURL('image/png');
+ link.download = 'ribbon_rack.png';
+ link.click();
+ });
+}
+
+function openTab(evt, tabName) {
+ // Declare all variables
+ var i, tabcontent, tablinks;
+
+ // Get all elements with class="tabcontent" and hide them
+ tabcontent = document.getElementsByClassName("tab-content");
+ for (i = 0; i < tabcontent.length; i++) {
+ tabcontent[i].style.display = "none";
+ }
+
+ // Get all elements with class="tablinks" and remove the class "active"
+ tablinks = document.querySelectorAll('[id=tab]');
+ for (i = 0; i < tablinks.length; i++) {
+ tablinks[i].className = "bg-inactive";
+ }
+
+ // Show the current tab, and add an "active" class to the button that opened the tab
+ document.getElementById(tabName).style.display = "block";
+ evt.currentTarget.className = "bg-active";
+}
diff --git a/cap/badges/_meta.json b/cap/badges/_meta.json
new file mode 100644
index 0000000..87b2751
--- /dev/null
+++ b/cap/badges/_meta.json
@@ -0,0 +1,6 @@
+[
+ {
+ "path": "model_rocketry_badge.svg",
+ "name": "Model Rocketry Badge"
+ }
+]
\ No newline at end of file
diff --git a/cap/badges/model_rocketry_badge.svg b/cap/badges/model_rocketry_badge.svg
new file mode 100644
index 0000000..bdc67b4
--- /dev/null
+++ b/cap/badges/model_rocketry_badge.svg
@@ -0,0 +1,260 @@
+
+
+
+
diff --git a/cap/ranks/_meta.json b/cap/ranks/_meta.json
new file mode 100644
index 0000000..560feaf
--- /dev/null
+++ b/cap/ranks/_meta.json
@@ -0,0 +1,24 @@
+{
+ "enlisted": [
+ { "id": 1, "name": "Cadet Airman Basic" },
+ { "id": 2, "name": "Cadet Airman" },
+ { "id": 3, "name": "Cadet Airman First Class" },
+ { "id": 4, "name": "Cadet Senior Airman" },
+ { "id": 5, "name": "Cadet Staff Sergeant" },
+ { "id": 6, "name": "Cadet Technical Sergeant" },
+ { "id": 7, "name": "Cadet Master Sergeant" },
+ { "id": 8, "name": "Cadet Senior Master Sergeant" },
+ { "id": 9, "name": "Cadet Chief Master Sergeant" },
+ { "id": 10.7, "name": "Cadet First Sergeant" },
+ { "id": 10.8, "name": "Cadet First Sergeant" },
+ { "id": 10.9, "name": "Cadet First Sergeant" }
+ ],
+ "officer": [
+ { "id": 1, "name": "Cadet Second Lieutenant" },
+ { "id": 2, "name": "Cadet First Lieutenant" },
+ { "id": 3, "name": "Cadet Captain" },
+ { "id": 4, "name": "Cadet Major" },
+ { "id": 5, "name": "Cadet Lieutenant Colonel" },
+ { "id": 6, "name": "Cadet Colonel" }
+ ]
+}
\ No newline at end of file
diff --git a/cap/ranks/enlisted/10.7.svg b/cap/ranks/enlisted/10.7.svg
new file mode 100644
index 0000000..809cdab
--- /dev/null
+++ b/cap/ranks/enlisted/10.7.svg
@@ -0,0 +1,234 @@
+
+
diff --git a/cap/ranks/enlisted/10.8.svg b/cap/ranks/enlisted/10.8.svg
new file mode 100644
index 0000000..cabb624
--- /dev/null
+++ b/cap/ranks/enlisted/10.8.svg
@@ -0,0 +1,223 @@
+
+
diff --git a/cap/ranks/enlisted/10.9.svg b/cap/ranks/enlisted/10.9.svg
new file mode 100644
index 0000000..acf18a3
--- /dev/null
+++ b/cap/ranks/enlisted/10.9.svg
@@ -0,0 +1,269 @@
+
+
+
+
diff --git a/cap/ranks/enlisted/2.svg b/cap/ranks/enlisted/2.svg
new file mode 100644
index 0000000..725ffd1
--- /dev/null
+++ b/cap/ranks/enlisted/2.svg
@@ -0,0 +1,1454 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
diff --git a/cap/ranks/enlisted/3.svg b/cap/ranks/enlisted/3.svg
new file mode 100644
index 0000000..12e41cb
--- /dev/null
+++ b/cap/ranks/enlisted/3.svg
@@ -0,0 +1,1458 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
diff --git a/cap/ranks/enlisted/4.svg b/cap/ranks/enlisted/4.svg
new file mode 100644
index 0000000..179e3ca
--- /dev/null
+++ b/cap/ranks/enlisted/4.svg
@@ -0,0 +1,1463 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
diff --git a/cap/ranks/enlisted/5.svg b/cap/ranks/enlisted/5.svg
new file mode 100644
index 0000000..3369799
--- /dev/null
+++ b/cap/ranks/enlisted/5.svg
@@ -0,0 +1,1468 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
diff --git a/cap/ranks/enlisted/6.svg b/cap/ranks/enlisted/6.svg
new file mode 100644
index 0000000..3868a07
--- /dev/null
+++ b/cap/ranks/enlisted/6.svg
@@ -0,0 +1,1477 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
diff --git a/cap/ranks/enlisted/7.svg b/cap/ranks/enlisted/7.svg
new file mode 100644
index 0000000..d286984
--- /dev/null
+++ b/cap/ranks/enlisted/7.svg
@@ -0,0 +1,85 @@
+
+
\ No newline at end of file
diff --git a/cap/ranks/enlisted/8.svg b/cap/ranks/enlisted/8.svg
new file mode 100644
index 0000000..547eaab
--- /dev/null
+++ b/cap/ranks/enlisted/8.svg
@@ -0,0 +1,88 @@
+
+
diff --git a/cap/ranks/enlisted/9.svg b/cap/ranks/enlisted/9.svg
new file mode 100644
index 0000000..c0d63d9
--- /dev/null
+++ b/cap/ranks/enlisted/9.svg
@@ -0,0 +1,1488 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
diff --git a/cap/ranks/officer/1.svg b/cap/ranks/officer/1.svg
new file mode 100644
index 0000000..2c3a21e
--- /dev/null
+++ b/cap/ranks/officer/1.svg
@@ -0,0 +1,106 @@
+
+
diff --git a/cap/ranks/officer/2.svg b/cap/ranks/officer/2.svg
new file mode 100644
index 0000000..d492638
--- /dev/null
+++ b/cap/ranks/officer/2.svg
@@ -0,0 +1,111 @@
+
+
diff --git a/cap/ranks/officer/3.svg b/cap/ranks/officer/3.svg
new file mode 100644
index 0000000..61519d6
--- /dev/null
+++ b/cap/ranks/officer/3.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/cap/ranks/officer/4.svg b/cap/ranks/officer/4.svg
new file mode 100644
index 0000000..8bc770e
--- /dev/null
+++ b/cap/ranks/officer/4.svg
@@ -0,0 +1,134 @@
+
+
diff --git a/cap/ranks/officer/5.svg b/cap/ranks/officer/5.svg
new file mode 100644
index 0000000..0608f78
--- /dev/null
+++ b/cap/ranks/officer/5.svg
@@ -0,0 +1,141 @@
+
+
diff --git a/cap/ranks/officer/6.svg b/cap/ranks/officer/6.svg
new file mode 100644
index 0000000..95b4733
--- /dev/null
+++ b/cap/ranks/officer/6.svg
@@ -0,0 +1,147 @@
+
+
diff --git a/cap/ribbons/1.svg b/cap/ribbons/1.svg
new file mode 100644
index 0000000..b198444
--- /dev/null
+++ b/cap/ribbons/1.svg
@@ -0,0 +1,289 @@
+
+
diff --git a/cap/ribbons/10.svg b/cap/ribbons/10.svg
new file mode 100644
index 0000000..7a08164
--- /dev/null
+++ b/cap/ribbons/10.svg
@@ -0,0 +1,203 @@
+
+
diff --git a/cap/ribbons/11.svg b/cap/ribbons/11.svg
new file mode 100644
index 0000000..a75b1ff
--- /dev/null
+++ b/cap/ribbons/11.svg
@@ -0,0 +1,102 @@
+
+
diff --git a/cap/ribbons/12.svg b/cap/ribbons/12.svg
new file mode 100644
index 0000000..970e36d
--- /dev/null
+++ b/cap/ribbons/12.svg
@@ -0,0 +1,126 @@
+
+
diff --git a/cap/ribbons/13.svg b/cap/ribbons/13.svg
new file mode 100644
index 0000000..2936428
--- /dev/null
+++ b/cap/ribbons/13.svg
@@ -0,0 +1,131 @@
+
+
diff --git a/cap/ribbons/14.svg b/cap/ribbons/14.svg
new file mode 100644
index 0000000..c42bdda
--- /dev/null
+++ b/cap/ribbons/14.svg
@@ -0,0 +1,138 @@
+
+
diff --git a/cap/ribbons/15.svg b/cap/ribbons/15.svg
new file mode 100644
index 0000000..28e9a59
--- /dev/null
+++ b/cap/ribbons/15.svg
@@ -0,0 +1,171 @@
+
+
diff --git a/cap/ribbons/16.svg b/cap/ribbons/16.svg
new file mode 100644
index 0000000..1d50fe7
--- /dev/null
+++ b/cap/ribbons/16.svg
@@ -0,0 +1,171 @@
+
+
diff --git a/cap/ribbons/17.svg b/cap/ribbons/17.svg
new file mode 100644
index 0000000..bef94bc
--- /dev/null
+++ b/cap/ribbons/17.svg
@@ -0,0 +1,165 @@
+
+
diff --git a/cap/ribbons/18.svg b/cap/ribbons/18.svg
new file mode 100644
index 0000000..81eaa06
--- /dev/null
+++ b/cap/ribbons/18.svg
@@ -0,0 +1,169 @@
+
+
diff --git a/cap/ribbons/19.svg b/cap/ribbons/19.svg
new file mode 100644
index 0000000..c1052a0
--- /dev/null
+++ b/cap/ribbons/19.svg
@@ -0,0 +1,169 @@
+
+
diff --git a/cap/ribbons/2.svg b/cap/ribbons/2.svg
new file mode 100644
index 0000000..c5fa90d
--- /dev/null
+++ b/cap/ribbons/2.svg
@@ -0,0 +1,254 @@
+
+
diff --git a/cap/ribbons/20.svg b/cap/ribbons/20.svg
new file mode 100644
index 0000000..5c103f0
--- /dev/null
+++ b/cap/ribbons/20.svg
@@ -0,0 +1,165 @@
+
+
diff --git a/cap/ribbons/21.svg b/cap/ribbons/21.svg
new file mode 100644
index 0000000..eb03d5b
--- /dev/null
+++ b/cap/ribbons/21.svg
@@ -0,0 +1,176 @@
+
+
diff --git a/cap/ribbons/22.svg b/cap/ribbons/22.svg
new file mode 100644
index 0000000..dcbaaaa
--- /dev/null
+++ b/cap/ribbons/22.svg
@@ -0,0 +1,192 @@
+
+
diff --git a/cap/ribbons/23.svg b/cap/ribbons/23.svg
new file mode 100644
index 0000000..e81d406
--- /dev/null
+++ b/cap/ribbons/23.svg
@@ -0,0 +1,139 @@
+
+
diff --git a/cap/ribbons/24.svg b/cap/ribbons/24.svg
new file mode 100644
index 0000000..f2e4348
--- /dev/null
+++ b/cap/ribbons/24.svg
@@ -0,0 +1,139 @@
+
+
diff --git a/cap/ribbons/25.svg b/cap/ribbons/25.svg
new file mode 100644
index 0000000..b25e449
--- /dev/null
+++ b/cap/ribbons/25.svg
@@ -0,0 +1,154 @@
+
+
diff --git a/cap/ribbons/26.svg b/cap/ribbons/26.svg
new file mode 100644
index 0000000..c4ddb16
--- /dev/null
+++ b/cap/ribbons/26.svg
@@ -0,0 +1,154 @@
+
+
diff --git a/cap/ribbons/27.svg b/cap/ribbons/27.svg
new file mode 100644
index 0000000..517b3ff
--- /dev/null
+++ b/cap/ribbons/27.svg
@@ -0,0 +1,154 @@
+
+
diff --git a/cap/ribbons/28.svg b/cap/ribbons/28.svg
new file mode 100644
index 0000000..01088d3
--- /dev/null
+++ b/cap/ribbons/28.svg
@@ -0,0 +1,201 @@
+
+
diff --git a/cap/ribbons/29.svg b/cap/ribbons/29.svg
new file mode 100644
index 0000000..fd169e4
--- /dev/null
+++ b/cap/ribbons/29.svg
@@ -0,0 +1,185 @@
+
+
diff --git a/cap/ribbons/3.svg b/cap/ribbons/3.svg
new file mode 100644
index 0000000..994f89b
--- /dev/null
+++ b/cap/ribbons/3.svg
@@ -0,0 +1,259 @@
+
+
diff --git a/cap/ribbons/30.svg b/cap/ribbons/30.svg
new file mode 100644
index 0000000..af77720
--- /dev/null
+++ b/cap/ribbons/30.svg
@@ -0,0 +1,199 @@
+
+
diff --git a/cap/ribbons/31.svg b/cap/ribbons/31.svg
new file mode 100644
index 0000000..605bf94
--- /dev/null
+++ b/cap/ribbons/31.svg
@@ -0,0 +1,203 @@
+
+
diff --git a/cap/ribbons/32.svg b/cap/ribbons/32.svg
new file mode 100644
index 0000000..22b5da7
--- /dev/null
+++ b/cap/ribbons/32.svg
@@ -0,0 +1,191 @@
+
+
diff --git a/cap/ribbons/33.svg b/cap/ribbons/33.svg
new file mode 100644
index 0000000..31c14ac
--- /dev/null
+++ b/cap/ribbons/33.svg
@@ -0,0 +1,200 @@
+
+
diff --git a/cap/ribbons/34.svg b/cap/ribbons/34.svg
new file mode 100644
index 0000000..c5e4e9d
--- /dev/null
+++ b/cap/ribbons/34.svg
@@ -0,0 +1,185 @@
+
+
diff --git a/cap/ribbons/35.svg b/cap/ribbons/35.svg
new file mode 100644
index 0000000..e9c9a2f
--- /dev/null
+++ b/cap/ribbons/35.svg
@@ -0,0 +1,203 @@
+
+
diff --git a/cap/ribbons/36.svg b/cap/ribbons/36.svg
new file mode 100644
index 0000000..e24901d
--- /dev/null
+++ b/cap/ribbons/36.svg
@@ -0,0 +1,258 @@
+
+
diff --git a/cap/ribbons/37.svg b/cap/ribbons/37.svg
new file mode 100644
index 0000000..2fcb54b
--- /dev/null
+++ b/cap/ribbons/37.svg
@@ -0,0 +1,258 @@
+
+
diff --git a/cap/ribbons/38.svg b/cap/ribbons/38.svg
new file mode 100644
index 0000000..b8c48b6
--- /dev/null
+++ b/cap/ribbons/38.svg
@@ -0,0 +1,205 @@
+
+
diff --git a/cap/ribbons/39.svg b/cap/ribbons/39.svg
new file mode 100644
index 0000000..f12cd3b
--- /dev/null
+++ b/cap/ribbons/39.svg
@@ -0,0 +1,203 @@
+
+
diff --git a/cap/ribbons/4.svg b/cap/ribbons/4.svg
new file mode 100644
index 0000000..a0bc9b8
--- /dev/null
+++ b/cap/ribbons/4.svg
@@ -0,0 +1,267 @@
+
+
diff --git a/cap/ribbons/40.svg b/cap/ribbons/40.svg
new file mode 100644
index 0000000..7597306
--- /dev/null
+++ b/cap/ribbons/40.svg
@@ -0,0 +1,224 @@
+
+
diff --git a/cap/ribbons/41.svg b/cap/ribbons/41.svg
new file mode 100644
index 0000000..de999ad
--- /dev/null
+++ b/cap/ribbons/41.svg
@@ -0,0 +1,215 @@
+
+
diff --git a/cap/ribbons/5.svg b/cap/ribbons/5.svg
new file mode 100644
index 0000000..9a21b5d
--- /dev/null
+++ b/cap/ribbons/5.svg
@@ -0,0 +1,276 @@
+
+
diff --git a/cap/ribbons/6.svg b/cap/ribbons/6.svg
new file mode 100644
index 0000000..41e9d0a
--- /dev/null
+++ b/cap/ribbons/6.svg
@@ -0,0 +1,252 @@
+
+
diff --git a/cap/ribbons/7.svg b/cap/ribbons/7.svg
new file mode 100644
index 0000000..362389c
--- /dev/null
+++ b/cap/ribbons/7.svg
@@ -0,0 +1,223 @@
+
+
diff --git a/cap/ribbons/8.svg b/cap/ribbons/8.svg
new file mode 100644
index 0000000..ecf0c77
--- /dev/null
+++ b/cap/ribbons/8.svg
@@ -0,0 +1,258 @@
+
+
diff --git a/cap/ribbons/9.svg b/cap/ribbons/9.svg
new file mode 100644
index 0000000..a284f68
--- /dev/null
+++ b/cap/ribbons/9.svg
@@ -0,0 +1,230 @@
+
+
diff --git a/cap/ribbons/_meta.json b/cap/ribbons/_meta.json
new file mode 100644
index 0000000..788358c
--- /dev/null
+++ b/cap/ribbons/_meta.json
@@ -0,0 +1,166 @@
+[
+ {
+ "id": 1,
+ "name": "Silver Medal of Valor"
+ },
+ {
+ "id": 2,
+ "name": "Bronze Medal of Valor"
+ },
+ {
+ "id": 3,
+ "name": "Distinguished Service Award"
+ },
+ {
+ "id": 4,
+ "name": "Exceptional Service Award"
+ },
+ {
+ "id": 5,
+ "name": "Meritorious Service Award"
+ },
+ {
+ "id": 6,
+ "name": "Commander's Commendation Award"
+ },
+ {
+ "id": 7,
+ "name": "CAP Achievement Award"
+ },
+ {
+ "id": 8,
+ "name": "Certificate of Recognition for Lifesaving"
+ },
+ {
+ "id": 9,
+ "name": "National Commander's Unit Citation Award"
+ },
+ {
+ "id": 10,
+ "name": "Unit Citation Award"
+ },
+ {
+ "id": 11,
+ "name": "General Carl A. Spaatz Award"
+ },
+ {
+ "id": 12,
+ "name": "General Ira C. Eaker Award"
+ },
+ {
+ "id": 13,
+ "name": "Amelia Earhart Award"
+ },
+ {
+ "id": 14,
+ "name": "General Billy Mitchell Award"
+ },
+ {
+ "id": 15,
+ "name": "Neil Armstrong Achievement"
+ },
+ {
+ "id": 16,
+ "name": "Dr. Robert H. Goddard Achievement"
+ },
+ {
+ "id": 17,
+ "name": "General Jimmy F. Doolittle Achievement"
+ },
+ {
+ "id": 18,
+ "name": "Charles A. Lindbergh Achievement"
+ },
+ {
+ "id": 19,
+ "name": "Captain Eddie Rickenbacker Achievement"
+ },
+ {
+ "id": 20,
+ "name": "Wright Brothers Award"
+ },
+ {
+ "id": 21,
+ "name": "Mary Feik Achievement"
+ },
+ {
+ "id": 22,
+ "name": "General Hap Arnold Achievement"
+ },
+ {
+ "id": 23,
+ "name": "General J.F. Curry Achievement Award"
+ },
+ {
+ "id": 24,
+ "name": "AFA Squadron Cadet of the Year"
+ },
+ {
+ "id": 25,
+ "name": "AFSA Squadron NCO of the Year"
+ },
+ {
+ "id": 26,
+ "name": "VFW Cadet Officer Award"
+ },
+ {
+ "id": 27,
+ "name": "VFW Cadet NCO Award"
+ },
+ {
+ "id": 28,
+ "name": "CAP Crisis Service Ribbon"
+ },
+ {
+ "id": 29,
+ "name": "Red Service Ribbon"
+ },
+ {
+ "id": 30,
+ "name": "Search “Find” Ribbon"
+ },
+ {
+ "id": 31,
+ "name": "Air Search and Rescue Ribbon"
+ },
+ {
+ "id": 32,
+ "name": "Disaster Relief Ribbon"
+ },
+ {
+ "id": 33,
+ "name": "Homeland Security Ribbon"
+ },
+ {
+ "id": 34,
+ "name": "Community Service Ribbon"
+ },
+ {
+ "id": 35,
+ "name": "International Air Cadet Exchange"
+ },
+ {
+ "id": 36,
+ "name": "National Cadet Competition Ribbon"
+ },
+ {
+ "id": 37,
+ "name": "National Color Guard Competition Ribbon"
+ },
+ {
+ "id": 38,
+ "name": "Cadet Advisory Council Ribbon"
+ },
+ {
+ "id": 39,
+ "name": "Cadet Special Activity Ribbon"
+ },
+ {
+ "id": 40,
+ "name": "Encampment Ribbon"
+ },
+ {
+ "id": 41,
+ "name": "Cadet Recruiter Ribbon"
+ }
+]
\ No newline at end of file
diff --git a/cap_logo.svg b/cap_logo.svg
new file mode 100644
index 0000000..6885562
--- /dev/null
+++ b/cap_logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/index.css b/index.css
new file mode 100644
index 0000000..c12cdde
--- /dev/null
+++ b/index.css
@@ -0,0 +1,76 @@
+@font-face {
+ font-family: FFDINWeb;
+ src: url('fonts/FFDINWeb.ttf');
+}
+
+@font-face {
+ font-family: Stratum;
+ src: url('fonts/Stratum.ttf');
+}
+
+@font-face {
+ font-family: StratumBold;
+ src: url('fonts/StratumBold.ttf');
+}
+
+body {
+ font-family: FFDINWeb, Arial, sans-serif;
+ font-weight: 400;
+ letter-spacing: normal;
+ color: #0e172d;
+}
+
+h1 {
+ font-weight: 700;
+ font-family: Stratum, Arial, sans-serif;
+ text-transform: uppercase;
+ font-style: normal;
+ text-align: center;
+}
+
+h2 {
+ font-weight: 500;
+ font-family: Stratum, Arial, sans-serif;
+ text-transform: uppercase;
+ font-style: normal;
+ text-align: center;
+}
+
+h3 {
+ font-weight: 200;
+ font-family: Stratum, Arial, sans-serif;
+ text-transform: uppercase;
+ font-style: normal;
+ text-align: center;
+}
+
+button {
+ font-family: StratumBold;
+ font-style: normal;
+ font-weight: 500;
+ font-size: 17px;
+ line-height: 20px;
+ letter-spacing: 2px;
+ text-align: center;
+ height: 40px;
+ text-transform: uppercase;
+ border: 0px solid #ffffff;
+ border-top-color: rgb(255, 255, 255);
+ border-right-color: rgb(255, 255, 255);
+ border-bottom-color: rgb(255, 255, 255);
+ border-left-color: rgb(255, 255, 255);
+ border-radius: 0px;
+}
+
+#close-image img {
+ display: block;
+ height: 130px;
+ width: 100px;
+}
+
+#close-CSS {
+ background-image: url('http://thinkingstiff.com/images/matt.jpg');
+ background-size: 100px 130px;
+ height: 134px;
+ width: 104px;
+}
\ No newline at end of file
diff --git a/index.html b/index.html
index 9d63397..457405e 100644
--- a/index.html
+++ b/index.html
@@ -2,75 +2,48 @@
-
-
- AFJROTC Ribbon Rack Builder
-
+
+
+ AFJROTC/CAP Ribbon Rack Builder
+
+
-
-
-
-
AFJROTC Ribbon Rack Builder
-
Check the box next to each ribbon you would like to have
- sorted.
+
+
AFJROTC & Civil Air Patrol RRB Builder
+
Used by NJ-20181.
+
-
-
-
- - Ribbons
- - Ranks
- - Arcs
- - Badges
-
-
-
-
-
-
-
-
-
-
-
-
Your Ribbon Rack
-
-
-
-
-
-
-
-
\ No newline at end of file