From e2e7095b7db4a2cb1026823a2939f7b2a2630ad9 Mon Sep 17 00:00:00 2001 From: thomashamburg Date: Tue, 30 Sep 2025 12:47:59 +0200 Subject: [PATCH] adding server and db --- lcars/.log | 2 + lcars/embed/create_state_db.sql | 14 + lcars/embed/crew.json | 95 + lcars/embed/messages.json | 1066 +++++++ lcars/experiments.go | 79 + lcars/frontend/assets/Antonio-Bold.woff | Bin 0 -> 21984 bytes lcars/frontend/assets/Antonio-Bold.woff2 | Bin 0 -> 16600 bytes lcars/frontend/assets/Antonio-Regular.woff | Bin 0 -> 21844 bytes lcars/frontend/assets/Antonio-Regular.woff2 | Bin 0 -> 16440 bytes lcars/frontend/assets/beep1.mp3 | Bin 0 -> 4641 bytes lcars/frontend/assets/beep2.mp3 | Bin 0 -> 4641 bytes lcars/frontend/assets/beep3.mp3 | Bin 0 -> 13857 bytes lcars/frontend/assets/beep4.mp3 | Bin 0 -> 28449 bytes lcars/frontend/assets/classic.css | 3011 +++++++++++++++++++ lcars/frontend/assets/lcars.js | 50 + lcars/frontend/assets/lower-decks-padd.css | 1881 ++++++++++++ lcars/frontend/assets/lower-decks.css | 1856 ++++++++++++ lcars/frontend/assets/nemesis-blue.css | 2830 +++++++++++++++++ lcars/frontend/index copy 2.html | 321 ++ lcars/frontend/index copy.html | 235 ++ lcars/frontend/index.html | 345 +++ lcars/go.mod | 18 + lcars/go.sum | 49 + lcars/interval/interval.go | 94 + lcars/ld.log | 0 lcars/main.go | 153 + lcars/server/server.go | 103 + lcars/server/taskengine.go | 118 + lcars/sqlite/database.go | 428 +++ lcars/state.db | Bin 0 -> 4096 bytes lcars/state.db-shm | Bin 0 -> 32768 bytes lcars/state.db-wal | Bin 0 -> 24752 bytes 32 files changed, 12748 insertions(+) create mode 100644 lcars/.log create mode 100644 lcars/embed/create_state_db.sql create mode 100644 lcars/embed/crew.json create mode 100644 lcars/embed/messages.json create mode 100644 lcars/experiments.go create mode 100644 lcars/frontend/assets/Antonio-Bold.woff create mode 100644 lcars/frontend/assets/Antonio-Bold.woff2 create mode 100644 lcars/frontend/assets/Antonio-Regular.woff create mode 100644 lcars/frontend/assets/Antonio-Regular.woff2 create mode 100644 lcars/frontend/assets/beep1.mp3 create mode 100644 lcars/frontend/assets/beep2.mp3 create mode 100644 lcars/frontend/assets/beep3.mp3 create mode 100644 lcars/frontend/assets/beep4.mp3 create mode 100644 lcars/frontend/assets/classic.css create mode 100644 lcars/frontend/assets/lcars.js create mode 100644 lcars/frontend/assets/lower-decks-padd.css create mode 100644 lcars/frontend/assets/lower-decks.css create mode 100644 lcars/frontend/assets/nemesis-blue.css create mode 100644 lcars/frontend/index copy 2.html create mode 100644 lcars/frontend/index copy.html create mode 100644 lcars/frontend/index.html create mode 100644 lcars/go.mod create mode 100644 lcars/go.sum create mode 100644 lcars/interval/interval.go create mode 100644 lcars/ld.log create mode 100644 lcars/main.go create mode 100644 lcars/server/server.go create mode 100644 lcars/server/taskengine.go create mode 100644 lcars/sqlite/database.go create mode 100644 lcars/state.db create mode 100644 lcars/state.db-shm create mode 100644 lcars/state.db-wal diff --git a/lcars/.log b/lcars/.log new file mode 100644 index 0000000..07ce2a0 --- /dev/null +++ b/lcars/.log @@ -0,0 +1,2 @@ +2025/09/30 11:18:25 Failed to create internal StateDB: SQL logic error: near ")": syntax error (1) +2025/09/30 11:20:30 Failed to create internal StateDB: SQL logic error: near ")": syntax error (1) diff --git a/lcars/embed/create_state_db.sql b/lcars/embed/create_state_db.sql new file mode 100644 index 0000000..241d099 --- /dev/null +++ b/lcars/embed/create_state_db.sql @@ -0,0 +1,14 @@ +CREATE TABLE ship_messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + timestamp TEXT NOT NULL, + subsystem TEXT NOT NULL, + severity TEXT CHECK(severity IN ('CRITICAL', 'ALERT', 'WARNING', 'NOTICE', 'INFO')) NOT NULL DEFAULT 'INFO', + color TEXT NOT NULL, + message TEXT NOT NULL +); + +CREATE TABLE crew_member ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + rank TEXT NOT NULL, + name TEXT NOT NULL +); \ No newline at end of file diff --git a/lcars/embed/crew.json b/lcars/embed/crew.json new file mode 100644 index 0000000..1b2a1fa --- /dev/null +++ b/lcars/embed/crew.json @@ -0,0 +1,95 @@ +[ + "Ensign Beckett Mariner", + "Ensign Brad Boimler", + "Captain Carol Freeman", + "Commander Jack Ransom", + "Ensign Barsa Orsino", + "Lieutenant Commander D'Vana Tendi", + "Lieutenant Commander Sam Rutherford", + "Lieutenant Commander Shaxs", + "Ensign Liora Vance", + "Ensign Rylan Sato", + "Lieutenant Jarek Torin", + "Lieutenant Kira Dallin", + "Lieutenant T'Lara Venn", + "Lieutenant Shonnie Velar", + "Lieutenant Commander Aric Thorne", + "Lieutenant Commander Selene Marvik", + "Lieutenant Commander Jovan Kreel", + "Lieutenant Orin Kallis", + "Ensign Mira Talon", + "Ensign Fynn Darvik", + "Lieutenant Commander Elara Voss", + "Lieutenant Zev Ralyn", + "Ensign Daxia Morn", + "Lieutenant Varek Solis", + "Ensign Tylen Kael", + "Lieutenant Commander Nira Falco", + "Lieutenant Kael Dorran", + "Ensign Saren Vale", + "Ensign Tova Lin", + "Lieutenant Commander Ryn Talor", + "Lieutenant Draven Korr", + "Ensign Lyra Kenning", + "Ensign Joren Pax", + "Lieutenant Commander Calix Arden", + "Lieutenant Selan Vey", + "Ensign Aricel Taren", + "Ensign Velin Daro", + "Lieutenant Caris Vennor", + "Lieutenant Kellen Dray", + "Lieutenant Risa Talven", + "Lieutenant Commander Thalen Voss", + "Lieutenant Commander Sariah Quell", + "Ensign Orin Talvik", + "Ensign Lyric Selden", + "Lieutenant Commander Varen Korr", + "Lieutenant Elara Vynn", + "Ensign Jax Talmar", + "Lieutenant Commander Neris Vay", + "Lieutenant Draven Solis", + "Ensign Tavia Korlen", + "Ensign Ryn Paxil", + "Lieutenant Commander Kira Dalen", + "Lieutenant Zev Ardin", + "Ensign Lyra Taven", + "Ensign Fynn Velar", + "Lieutenant Commander Calen Rhos", + "Lieutenant Selan Vaylen", + "Ensign Aricel Dorran", + "Ensign Tylen Korr", + "Lieutenant Commander Nira Talos", + "Lieutenant Kael Venn", + "Ensign Saren Daro", + "Ensign Tova Vennor", + "Lieutenant Commander Ryn Arden", + "Lieutenant Draven Voss", + "Ensign Lyra Talin", + "Ensign Joren Vay", + "Lieutenant Commander Calix Talven", + "Lieutenant Selan Korr", + "Ensign Aricel Vynn", + "Ensign Velin Talor", + "Lieutenant Caris Vaylen", + "Lieutenant Kellen Rhos", + "Lieutenant Risa Vennor", + "Lieutenant Commander Thalen Daro", + "Lieutenant Commander Sariah Voss", + "Ensign Orin Vaylen", + "Ensign Lyric Talven", + "Lieutenant Commander Varen Talos", + "Lieutenant Elara Solis", + "Ensign Jax Vennor", + "Lieutenant Commander Neris Talor", + "Lieutenant Draven Vaylen", + "Ensign Tavia Dorran", + "Ensign Ryn Voss", + "Lieutenant Commander Kira Arden", + "Lieutenant Zev Vay", + "Ensign Lyra Daro", + "Ensign Fynn Talor", + "Lieutenant Commander Calen Venn", + "Lieutenant Selan Talvik", + "Ensign Aricel Rhos" + ] + diff --git a/lcars/embed/messages.json b/lcars/embed/messages.json new file mode 100644 index 0000000..4d468e7 --- /dev/null +++ b/lcars/embed/messages.json @@ -0,0 +1,1066 @@ +[ + { + "timestamp": "2258-03-14T10:00:00Z", + "subsystem": "Engineering", + "severity": "CRITICAL", + "color": "red", + "message": "Coolant leak detected in Port Nacelle plasma manifold. Lt. Alvarez leading EVA team." + }, + { + "timestamp": "2258-03-14T10:00:05Z", + "subsystem": "Medical", + "severity": "CRITICAL", + "color": "red", + "message": "Crewman Jayala reported missing from Beta Shift muster. Last seen entering Holodeck 3." + }, + { + "timestamp": "2258-03-14T10:00:10Z", + "subsystem": "Security", + "severity": "ALERT", + "color": "orange", + "message": "Brig forcefield cycling unpredictably after power surge; holding cell offline." + }, + { + "timestamp": "2258-03-14T10:00:15Z", + "subsystem": "Security", + "severity": "ALERT", + "color": "orange", + "message": "Three failed command authorization attempts by Crewman Dovan during Gamma Shift." + }, + { + "timestamp": "2258-03-14T10:00:20Z", + "subsystem": "Navigation", + "severity": "ALERT", + "color": "orange", + "message": "Shuttlecraft Sequoia overdue by two hours; last piloted by Ensign Boimler." + }, + { + "timestamp": "2258-03-14T10:00:25Z", + "subsystem": "Computer", + "severity": "WARNING", + "color": "yellow", + "message": "Memory parity mismatch detected in Core Segment Gamma-12; recalibration required." + }, + { + "timestamp": "2258-03-14T10:00:30Z", + "subsystem": "Engineering", + "severity": "WARNING", + "color": "yellow", + "message": "Warp Core plasma injectors 3 and 5 at 94% efficiency." + }, + { + "timestamp": "2258-03-14T10:00:35Z", + "subsystem": "Tactical", + "severity": "WARNING", + "color": "yellow", + "message": "Two dorsal phaser array emitters offline; Lt. Shaxs coordinating repairs." + }, + { + "timestamp": "2258-03-14T10:00:40Z", + "subsystem": "Life Support", + "severity": "WARNING", + "color": "yellow", + "message": "Environmental controls on Deck 7 report humidity spike to 78%." + }, + { + "timestamp": "2258-03-14T10:00:45Z", + "subsystem": "Medical", + "severity": "WARNING", + "color": "yellow", + "message": "Biofilter malfunction in Sickbay stasis bed 2; engineering support requested." + }, + { + "timestamp": "2258-03-14T10:00:50Z", + "subsystem": "Engineering", + "severity": "WARNING", + "color": "yellow", + "message": "Jefferies Tube 22 flooded with hydraulic fluid. Cleanup team assigned." + }, + { + "timestamp": "2258-03-14T10:00:55Z", + "subsystem": "Security", + "severity": "WARNING", + "color": "yellow", + "message": "Photon torpedo #17 removed by Ensign Faranak without clearance." + }, + { + "timestamp": "2258-03-14T10:01:00Z", + "subsystem": "Engineering", + "severity": "NOTICE", + "color": "blue", + "message": "Dilithium crystal lattice shows micro-fracturing; rotation cycle initiated." + }, + { + "timestamp": "2258-03-14T10:01:05Z", + "subsystem": "Life Support", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 11 grav plating fluctuation caused minor injuries to three crew members." + }, + { + "timestamp": "2258-03-14T10:01:10Z", + "subsystem": "Computer", + "severity": "NOTICE", + "color": "blue", + "message": "Secondary Core experiencing intermittent lag on Ops data uplink." + }, + { + "timestamp": "2258-03-14T10:01:15Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Ensign Phelps admitted with plasma burn to left arm; stable condition." + }, + { + "timestamp": "2258-03-14T10:01:20Z", + "subsystem": "Computer", + "severity": "NOTICE", + "color": "blue", + "message": "Holographic LCARS terminals on Deck 4 flickering due to power variance." + }, + { + "timestamp": "2258-03-14T10:01:25Z", + "subsystem": "Security", + "severity": "NOTICE", + "color": "blue", + "message": "Transporter Room 1 reports pattern buffer ghost echo under review." + }, + { + "timestamp": "2258-03-14T10:01:30Z", + "subsystem": "Crew", + "severity": "NOTICE", + "color": "blue", + "message": "D'Vana Tendi missed Sickbay shift after volunteering for shuttle maintenance." + }, + { + "timestamp": "2258-03-14T10:01:35Z", + "subsystem": "Crew", + "severity": "NOTICE", + "color": "blue", + "message": "Commander Ransom reported muscle strain during holodeck combat program." + }, + { + "timestamp": "2258-03-14T10:01:40Z", + "subsystem": "Computer", + "severity": "INFO", + "color": "teal", + "message": "Memory integrity at 99.3% overall." + }, + { + "timestamp": "2258-03-14T10:01:45Z", + "subsystem": "Life Support", + "severity": "INFO", + "color": "teal", + "message": "Replicator in Mess Hall 2 producing lukewarm coffee; morale note logged." + }, + { + "timestamp": "2258-03-14T10:01:50Z", + "subsystem": "Tactical", + "severity": "INFO", + "color": "teal", + "message": "Security drill caused nine-second transporter lockout; Lt. Kayshon apologized." + }, + { + "timestamp": "2258-03-14T10:01:55Z", + "subsystem": "Science", + "severity": "INFO", + "color": "teal", + "message": "Sensor probe launched to examine tetryon emissions near bow hull." + }, + { + "timestamp": "2258-03-14T10:02:00Z", + "subsystem": "Hydroponics", + "severity": "INFO", + "color": "teal", + "message": "Fungal bloom detected in Deck 5 greenhouse; Lt. K’Raa leading analysis." + }, + { + "timestamp": "2258-03-14T10:02:05Z", + "subsystem": "Computer", + "severity": "INFO", + "color": "teal", + "message": "Subspace comm buffer corrupted; Ensign Maru re-indexing manually." + }, + { + "timestamp": "2258-03-14T10:02:10Z", + "subsystem": "Holodeck", + "severity": "INFO", + "color": "teal", + "message": "Holodeck 1 stuck in black-and-white detective mode; access requires period slang." + }, + { + "timestamp": "2258-03-14T10:02:15Z", + "subsystem": "Cargo", + "severity": "INFO", + "color": "teal", + "message": "Anti-grav pallets in Cargo Bay 6 oscillating; Crewman Knox avoided injury." + }, + { + "timestamp": "2258-03-14T10:02:20Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Beckett Mariner left three Type-II phasers in the gym locker room." + }, + { + "timestamp": "2258-03-14T10:02:25Z", + "subsystem": "Environmental", + "severity": "INFO", + "color": "teal", + "message": "Observation lounge viewport frosting unexpectedly; climate sync pending." + }, + { + "timestamp": "2258-03-14T10:02:30Z", + "subsystem": "Hydroponics", + "severity": "INFO", + "color": "teal", + "message": "Deck 5 tomato vines achieved limited sentience; requesting voting rights in jest. Lt. K’Raa unconcerned." + }, + { + "timestamp": "2258-03-14T10:02:35Z", + "subsystem": "Computer", + "severity": "NOTICE", + "color": "blue", + "message": "Isolinear Chip Bank E7 humming the Bajoran Gratitude Chant at 11 Hz. Diagnostics inconclusive." + }, + { + "timestamp": "2258-03-14T10:02:40Z", + "subsystem": "Environmental", + "severity": "WARNING", + "color": "yellow", + "message": "Observation Deck 2 oxygen mix replaced with helium for 14 seconds. Voices recorded for morale bulletin." + }, + { + "timestamp": "2258-03-14T10:02:45Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Mess Hall 1 replicator now defaulting to 'Spicy Bolian Nutripaste' for all beverage requests." + }, + { + "timestamp": "2258-03-14T10:02:50Z", + "subsystem": "Security", + "severity": "INFO", + "color": "teal", + "message": "Lt. Shaxs reported ‘honor dueling’ with a malfunctioning training dummy. Dummy lost two limbs." + }, + { + "timestamp": "2258-03-14T10:02:55Z", + "subsystem": "Engineering", + "severity": "WARNING", + "color": "yellow", + "message": "Jefferies Tube 14 now leads to a broom closet on Deck 1 after map update glitch." + }, + { + "timestamp": "2258-03-14T10:03:00Z", + "subsystem": "Holodeck", + "severity": "ALERT", + "color": "orange", + "message": "Holodeck 3 spawned three Dixon Hill NPCs outside its grid. Containment field recalibrated." + }, + { + "timestamp": "2258-03-14T10:03:05Z", + "subsystem": "Astrometrics", + "severity": "NOTICE", + "color": "blue", + "message": "Unidentified subspace ping repeating Morse for 'send snacks'. Source undetermined." + }, + { + "timestamp": "2258-03-14T10:03:10Z", + "subsystem": "Engineering", + "severity": "CRITICAL", + "color": "red", + "message": "EPS conduit K-47 briefly rerouted power to the shipwide karaoke buffer. Warp modulation destabilized." + }, + { + "timestamp": "2258-03-14T10:03:15Z", + "subsystem": "Medical", + "severity": "INFO", + "color": "teal", + "message": "Dr. T’Ana confiscated 19 unauthorized hyposprays labeled 'just caffeine.'" + }, + { + "timestamp": "2258-03-14T10:03:20Z", + "subsystem": "Crew", + "severity": "WARNING", + "color": "yellow", + "message": "Ensign Mariner attempting to persuade replicator to produce contraband Romulan Ale using voice modulation." + }, + { + "timestamp": "2258-03-14T10:03:25Z", + "subsystem": "Transporter", + "severity": "NOTICE", + "color": "blue", + "message": "Pattern buffer registered a transient sixth finger on Lt. Barnes during beam-out. No physical trace remains." + }, + { + "timestamp": "2258-03-14T10:03:30Z", + "subsystem": "Science", + "severity": "INFO", + "color": "teal", + "message": "Chroniton surge around Astrometrics Console 4 now forming smiley faces on sensor readouts." + }, + { + "timestamp": "2258-03-14T10:03:35Z", + "subsystem": "Computer", + "severity": "WARNING", + "color": "yellow", + "message": "LCARS sidebar fonts replaced with Ferengi cursive after unapproved theme install by Crewman Drox." + }, + { + "timestamp": "2258-03-14T10:03:40Z", + "subsystem": "Cargo Bay", + "severity": "ALERT", + "color": "orange", + "message": "Crate of self-warming blankets activated simultaneously. Temperature spike registered, no injuries." + }, + { + "timestamp": "2258-03-14T10:03:45Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 3 climate regulator attempted to simulate 'San Francisco Fog' without authorization." + }, + { + "timestamp": "2258-03-14T10:03:50Z", + "subsystem": "Computer", + "severity": "WARNING", + "color": "yellow", + "message": "Core subroutine briefly reclassified Captain Freeman as 'Furniture: Command-Class Recliner.'" + }, + { + "timestamp": "2258-03-14T10:03:55Z", + "subsystem": "Holodeck", + "severity": "INFO", + "color": "teal", + "message": "Holodeck 2 running unauthorized program: 'Worf’s Bat’leth Pilates Volume 3.' Participation at 38%." + }, + { + "timestamp": "2258-03-14T10:04:00Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Power relay S-19 redirected output to deck lighting in rhythmic pulses. Crew reports 'disco corridor effect.'" + }, + { + "timestamp": "2258-03-14T10:04:05Z", + "subsystem": "Science", + "severity": "WARNING", + "color": "yellow", + "message": "Sensor array detected neutrino echo shaped like the ship’s logo. Astrometrics refuses to comment." + }, + { + "timestamp": "2258-03-14T10:04:10Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Nurse Stevens miscalibrated dermal regenerator; gave Ensign T’Lun faint forehead tattoo of a targ." + }, + { + "timestamp": "2258-03-14T10:04:15Z", + "subsystem": "Security", + "severity": "INFO", + "color": "teal", + "message": "Brig camera feed replaced with loop of Lt. Shaxs bench-pressing a photon torpedo. No one claims responsibility." + }, + { + "timestamp": "2258-03-14T10:04:20Z", + "subsystem": "Crew", + "severity": "WARNING", + "color": "yellow", + "message": "Ensign Boimler filed formal complaint about being listed as 'Adventure Liability' in crew roster metadata." + }, + { + "timestamp": "2258-03-14T10:04:25Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Replicator 4B insists every meal be served on ornate Klingon ceremonial plates. Lt. K'orin approves." + }, + { + "timestamp": "2258-03-14T10:04:30Z", + "subsystem": "Astrometrics", + "severity": "ALERT", + "color": "orange", + "message": "Random subspace fold briefly displayed giant Vulcan eyebrow on long-range scans." + }, + { + "timestamp": "2258-03-14T10:04:35Z", + "subsystem": "Transporter", + "severity": "WARNING", + "color": "yellow", + "message": "Pattern enhancers created residual duplicate of Crewman Sirota’s left shoe. Duplicate is three sizes larger." + }, + { + "timestamp": "2258-03-14T10:04:40Z", + "subsystem": "Tactical", + "severity": "INFO", + "color": "teal", + "message": "Phaser diagnostics reported emitter latency due to Shaxs yelling 'MORE POWER' at random intervals." + }, + { + "timestamp": "2258-03-14T10:04:45Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Core logic node began recursively indexing its own error logs, generating 438 phantom alerts in 3 seconds." + }, + { + "timestamp": "2258-03-14T10:04:50Z", + "subsystem": "Cargo Bay", + "severity": "NOTICE", + "color": "blue", + "message": "Container labeled 'Do Not Open Under Any Circumstances' found open. Contents: 400 plush targ puppets." + }, + { + "timestamp": "2258-03-14T10:04:55Z", + "subsystem": "Environmental", + "severity": "INFO", + "color": "teal", + "message": "Air filtration temporarily smelled of Andorian peppermint. Crew mildly pleased." + }, + { + "timestamp": "2258-03-14T10:05:00Z", + "subsystem": "Computer", + "severity": "NOTICE", + "color": "blue", + "message": "Auxiliary core started auto-generating haiku about warp plasma. Reading shows minor philosophical inconsistencies." + }, + { + "timestamp": "2258-03-14T10:05:05Z", + "subsystem": "Engineering", + "severity": "INFO", + "color": "teal", + "message": "Warp plasma manifold 3A produced sparks shaped like smiley faces. Crewman Patel applauded gesture." + }, + { + "timestamp": "2258-03-14T10:05:10Z", + "subsystem": "Holodeck", + "severity": "ALERT", + "color": "orange", + "message": "Holodeck 5 running unauthorized program 'Interstellar Dog Show'; canine avatars escaped into corridor 12." + }, + { + "timestamp": "2258-03-14T10:05:15Z", + "subsystem": "Medical", + "severity": "WARNING", + "color": "yellow", + "message": "Dr. T’Ana reported Ensign Maru using hypospray as an air freshener. Room 3 now smells faintly of plasma burn." + }, + { + "timestamp": "2258-03-14T10:05:20Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Lt. Shaxs attempting to bench-press an EPS conduit for morale purposes; zero gravity assist enabled." + }, + { + "timestamp": "2258-03-14T10:05:25Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 9 air filters began playing 4D jazz through vent system. Crew reports mild disorientation." + }, + { + "timestamp": "2258-03-14T10:05:30Z", + "subsystem": "Security", + "severity": "INFO", + "color": "teal", + "message": "Brig door control temporarily replaced with voice recognition. Lt. Kayshon recited Klingon tongue twisters to test." + }, + { + "timestamp": "2258-03-14T10:05:35Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "EPS conduit Y-12 emitted random spark bursts. Crewman Sirota instructed to 'interpret as performance art.'" + }, + { + "timestamp": "2258-03-14T10:05:40Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Core subroutine attempted to compile itself into origami. Manual override required." + }, + { + "timestamp": "2258-03-14T10:05:45Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Replicator 6A produced 14 perfectly edible tribbles. Crewman Mariner attempted to negotiate ownership." + }, + { + "timestamp": "2258-03-14T10:05:50Z", + "subsystem": "Astrometrics", + "severity": "INFO", + "color": "teal", + "message": "Random subspace anomaly reported as 'smiling starfish'; sensors indicate no threat." + }, + { + "timestamp": "2258-03-14T10:05:55Z", + "subsystem": "Transporter", + "severity": "WARNING", + "color": "yellow", + "message": "Pattern buffer generated minor echo of Ensign Phelps’ eyebrows during routine beam-in." + }, + { + "timestamp": "2258-03-14T10:06:00Z", + "subsystem": "Tactical", + "severity": "NOTICE", + "color": "blue", + "message": "Phaser bank 2 now aligned to emit harmless holographic butterflies for crew morale exercises." + }, + { + "timestamp": "2258-03-14T10:06:05Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Ensign Boimler insists his shoes were temporarily listed as 'hazardous cargo' in the inventory system." + }, + { + "timestamp": "2258-03-14T10:06:10Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Warp coil stabilization module emitted 7-second burst of blue sparks; crew advised to document spectacle." + }, + { + "timestamp": "2258-03-14T10:06:15Z", + "subsystem": "Medical", + "severity": "INFO", + "color": "teal", + "message": "Lt. Cmdr. T’Ana reports successful extraction of a micro-Targ from Ensign Mariner’s locker." + }, + { + "timestamp": "2258-03-14T10:06:20Z", + "subsystem": "Computer", + "severity": "NOTICE", + "color": "blue", + "message": "LCARS dashboard spontaneously switched to retro monochrome theme; crew nostalgia rating: high." + }, + { + "timestamp": "2258-03-14T10:06:25Z", + "subsystem": "Environmental", + "severity": "INFO", + "color": "teal", + "message": "Hydroponics room 4 briefly filled with harmless bio-luminescent fog; visibility reduced to 73%." + }, + { + "timestamp": "2258-03-14T10:06:30Z", + "subsystem": "Security", + "severity": "NOTICE", + "color": "blue", + "message": "Transporter pad in Security Office used as temporary catwalk for a very confused tribble." + }, + { + "timestamp": "2258-03-14T10:06:35Z", + "subsystem": "Cargo Bay", + "severity": "ALERT", + "color": "orange", + "message": "Automated pallet lift unexpectedly delivered 12 crates of rubber ducks to Deck 7 recreation area." + }, + { + "timestamp": "2258-03-14T10:06:40Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Captain Freeman approved spontaneous yoga break after micro-anomaly readings spiked morale sensors." + }, + { + "timestamp": "2258-03-14T10:06:45Z", + "subsystem": "Holodeck", + "severity": "WARNING", + "color": "yellow", + "message": "Holodeck 7 attempted to simulate 'All Crew as Tribbles'; program aborted after 2.3 seconds." + }, + { + "timestamp": "2258-03-14T10:06:50Z", + "subsystem": "Astrometrics", + "severity": "INFO", + "color": "teal", + "message": "Sensors detected anomalous quantum ping spelling out 'HI CAPTAIN'; source unknown." + }, + { + "timestamp": "2258-03-14T10:06:55Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Deck 12 EPS relay began pulsing Morse code for 'I need coffee.' Crewman Patel acknowledged." + }, + { + "timestamp": "2258-03-14T10:07:00Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Core logic node entered recursive loop generating holographic cat memes on every console. Manual intervention required." + }, + { + "timestamp": "2258-03-14T10:07:05Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Replicator outputting edible mini phasers at 72% efficiency. Lt. Shaxs approves as training tools." + }, + { + "timestamp": "2258-03-14T10:07:10Z", + "subsystem": "Medical", + "severity": "WARNING", + "color": "yellow", + "message": "Hypospray refill system labeled 'Mystery Juice' briefly administered non-lethal blue ink to volunteers." + }, + { + "timestamp": "2258-03-14T10:07:15Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 4 air vents released faint aroma of Vulcan plumeria. Crew morale up 3%." + }, + { + "timestamp": "2258-03-14T10:07:20Z", + "subsystem": "Security", + "severity": "INFO", + "color": "teal", + "message": "Security holo-training dummy reported to have 'requested vacation'. Lt. Kayshon amused." + }, + { + "timestamp": "2258-03-14T10:07:25Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Warp manifold 6C produced small plasma tornado. Crewman Patel advised to avoid standing in it." + }, + { + "timestamp": "2258-03-14T10:07:30Z", + "subsystem": "Computer", + "severity": "WARNING", + "color": "yellow", + "message": "Auxiliary AI attempted to rewrite ship-wide protocol using limericks. Partial success." + }, + { + "timestamp": "2258-03-14T10:07:35Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Ensign Boimler challenged replicator to a duel; replicator declined citing non-violence protocol." + }, + { + "timestamp": "2258-03-14T10:07:40Z", + "subsystem": "Holodeck", + "severity": "ALERT", + "color": "orange", + "message": "Holodeck 6 generated 12 dancing Klingons; program paused after two accidental phaser discharges." + }, + { + "timestamp": "2258-03-14T10:07:45Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Dr. T’Ana treated Crewman Mariner for paper cut from top-secret manual. Crew morale slightly increased." + }, + { + "timestamp": "2258-03-14T10:07:50Z", + "subsystem": "Tactical", + "severity": "INFO", + "color": "teal", + "message": "Phaser bank diagnostics now include simulated applause for successful hits." + }, + { + "timestamp": "2258-03-14T10:07:55Z", + "subsystem": "Astrometrics", + "severity": "WARNING", + "color": "yellow", + "message": "Sensor anomaly caused star map to display large smiling face. No known threat." + }, + { + "timestamp": "2258-03-14T10:08:00Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Replicator 3C producing only spherical bread products. Crewman Mariner unsure if intentional." + }, + { + "timestamp": "2258-03-14T10:08:05Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "EPS conduit L-12 briefly emitted rainbow-colored sparks; sensors report no lasting damage." + }, + { + "timestamp": "2258-03-14T10:08:10Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Core logic node attempting to simulate alternate universe where Captain Freeman is a tribble. Manual override required." + }, + { + "timestamp": "2258-03-14T10:08:15Z", + "subsystem": "Environmental", + "severity": "INFO", + "color": "teal", + "message": "Humidity spikes detected in Deck 8 greenhouse; plants unaffected, crew mildly confused." + }, + { + "timestamp": "2258-03-14T10:08:20Z", + "subsystem": "Security", + "severity": "NOTICE", + "color": "blue", + "message": "Transporter room keypad briefly replaced by fortune-telling device. Lt. Kayshon predicted 'exciting day ahead'." + }, + { + "timestamp": "2258-03-14T10:08:25Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Ensign Rutherford accidentally uploaded his vacation photos to LCARS dashboard. Crew mildly entertained." + }, + { + "timestamp": "2258-03-14T10:08:30Z", + "subsystem": "Holodeck", + "severity": "WARNING", + "color": "yellow", + "message": "Holodeck 8 tried to simulate ‘All Crew as Ferengi’; program aborted after 4 seconds due to laughter overload." + }, + { + "timestamp": "2258-03-14T10:08:35Z", + "subsystem": "Cargo Bay", + "severity": "ALERT", + "color": "orange", + "message": "Conveyor belt delivered 200 rubber ducks into zero-G recreation area; clean-up team dispatched." + }, + { + "timestamp": "2258-03-14T10:08:40Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Deck 14 warp stabilizer briefly emitted glow resembling smiley face; no damage detected." + }, + { + "timestamp": "2258-03-14T10:08:45Z", + "subsystem": "Computer", + "severity": "WARNING", + "color": "yellow", + "message": "Auxiliary AI began writing short stories about the ship’s life support ducts. Narrative incomplete." + }, + { + "timestamp": "2258-03-14T10:08:50Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Dr. T’Ana administered mild sedative to Crewman Mariner after spontaneous karaoke performance." + }, + { + "timestamp": "2258-03-14T10:08:55Z", + "subsystem": "Tactical", + "severity": "INFO", + "color": "teal", + "message": "Phaser bank 3 now emits gentle musical notes on idle to boost crew morale." + }, + { + "timestamp": "2258-03-14T10:09:00Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 10 oxygen mixture briefly modified to simulate Martian atmosphere; crew unaffected." + }, + { + "timestamp": "2258-03-14T10:09:05Z", + "subsystem": "Astrometrics", + "severity": "INFO", + "color": "teal", + "message": "Sensor array detected star shaped like a cat; no navigational hazard." + }, + { + "timestamp": "2258-03-14T10:09:10Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Replicator produced miniature tribble sculptures for crew gift exchange; edible but squeaky." + }, + { + "timestamp": "2258-03-14T10:09:15Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "EPS conduit M-09 randomly pulsed rainbow light; engineers advised to log as 'artistic output.'" + }, + { + "timestamp": "2258-03-14T10:09:20Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Lt. Shaxs held impromptu strength contest with gravity training hologram; hologram lost." + }, + { + "timestamp": "2258-03-14T10:09:25Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Core attempted to simulate entire starship in a single memory sector. Partial crash occurred." + }, + { + "timestamp": "2258-03-14T10:09:30Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Crewman Phelps received temporary tattoo of mini-targ on left shoulder; non-toxic." + }, + { + "timestamp": "2258-03-14T10:09:35Z", + "subsystem": "Holodeck", + "severity": "WARNING", + "color": "yellow", + "message": "Holodeck 9 running 'Galactic Tea Party'; minor quantum displacement detected in replicator outputs." + }, + { + "timestamp": "2258-03-14T10:09:40Z", + "subsystem": "Security", + "severity": "INFO", + "color": "teal", + "message": "Deck 2 surveillance feed replaced with continuous loop of Lt. Kayshon juggling phasers." + }, + { + "timestamp": "2258-03-14T10:09:45Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 7 ventilation briefly simulated ocean breeze. Crew reported mild relaxation." + }, + { + "timestamp": "2258-03-14T10:09:50Z", + "subsystem": "Cargo Bay", + "severity": "ALERT", + "color": "orange", + "message": "Zero-G crate misaligned; 3 crates of Targ plushies drifted into corridor 11." + }, + { + "timestamp": "2258-03-14T10:09:55Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Deck 11 warp stabilizer output showing unexpected rainbow spectrum; no critical damage." + }, + { + "timestamp": "2258-03-14T10:10:00Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Auxiliary AI attempted to merge all ship logs into a single poem; caused minor UI collapse." + }, + { + "timestamp": "2258-03-14T10:10:05Z", + "subsystem": "Holodeck", + "severity": "WARNING", + "color": "yellow", + "message": "Holodeck 10 ran 'Galactic Zoo'; 5 simulated Targs escaped into corridor 9." + }, + { + "timestamp": "2258-03-14T10:10:10Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Ensign Maru given non-lethal shock for attempting to teach replicator interpretive dance." + }, + { + "timestamp": "2258-03-14T10:10:15Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "EPS conduit N-17 briefly pulsed Morse code: 'I love coffee.' Crew morale confirmed uplifted." + }, + { + "timestamp": "2258-03-14T10:10:20Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 5 greenhouse ambient light cycled through rainbow spectrum for 12 seconds; photosynthesis unaffected." + }, + { + "timestamp": "2258-03-14T10:10:25Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Replicator 2A producing miniature photon torpedoes for training; edible but slightly metallic taste." + }, + { + "timestamp": "2258-03-14T10:10:30Z", + "subsystem": "Tactical", + "severity": "INFO", + "color": "teal", + "message": "Phaser bank 4 outputting harmless holographic stars as idle animation." + }, + { + "timestamp": "2258-03-14T10:10:35Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Captain Freeman conducted spontaneous trivia contest on Deck 3; winners rewarded with mini tribbles." + }, + { + "timestamp": "2258-03-14T10:10:40Z", + "subsystem": "Astrometrics", + "severity": "NOTICE", + "color": "blue", + "message": "Sensor anomaly showed distant star blinking rhythmically; logged as 'friendly hello.'" + }, + { + "timestamp": "2258-03-14T10:10:45Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Warp coil 7B emitted sparks shaped like miniature starships. Crewman Patel photographed for morale log." + }, + { + "timestamp": "2258-03-14T10:10:50Z", + "subsystem": "Computer", + "severity": "WARNING", + "color": "yellow", + "message": "LCARS interface generated random motivational quotes for each console; some contradictory." + }, + { + "timestamp": "2258-03-14T10:10:55Z", + "subsystem": "Holodeck", + "severity": "ALERT", + "color": "orange", + "message": "Holodeck 11 simulated 'Crew as Giant Cheese Wheels'; program paused after 3 seconds to prevent existential distress." + }, + { + "timestamp": "2258-03-14T10:11:00Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Crewman Boimler treated for minor paper cut from holo-legal form; minor embarrassment reported." + }, + { + "timestamp": "2258-03-14T10:11:05Z", + "subsystem": "Security", + "severity": "INFO", + "color": "teal", + "message": "Deck 6 security cameras briefly displayed live feed of tribble horde in recreation bay. No alarm triggered." + }, + { + "timestamp": "2258-03-14T10:11:10Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Air mixture in Deck 7 briefly shifted to simulate Klingon vineyard; crew requested repeat performance." + }, + { + "timestamp": "2258-03-14T10:11:15Z", + "subsystem": "Cargo Bay", + "severity": "ALERT", + "color": "orange", + "message": "Zero-G pallet misaligned; 8 crates of plush Targs floated into corridor 12. Crewman Knox deployed net." + }, + { + "timestamp": "2258-03-14T10:11:20Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Deck 13 EPS stabilizer emitted rainbow-colored sparks; no damage detected." + }, + { + "timestamp": "2258-03-14T10:11:25Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Core attempted to simulate entire ship as holographic chessboard; partial memory lock occurred." + }, + { + "timestamp": "2258-03-14T10:11:30Z", + "subsystem": "Replicators", + "severity": "NOTICE", + "color": "blue", + "message": "Replicator produced 50 mini photon torpedoes for training; edible but slightly metallic taste." + }, + { + "timestamp": "2258-03-14T10:11:35Z", + "subsystem": "Tactical", + "severity": "INFO", + "color": "teal", + "message": "Phaser bank 5 configured to emit harmless confetti bursts on idle; morale boost noted." + }, + { + "timestamp": "2258-03-14T10:11:40Z", + "subsystem": "Crew", + "severity": "INFO", + "color": "teal", + "message": "Lt. Shaxs conducted impromptu arm wrestling contest with holographic duplicate; duplicate lost." + }, + { + "timestamp": "2258-03-14T10:11:45Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 8 greenhouse briefly bathed in rainbow lighting to test plant photosynthesis under alternate spectra." + }, + { + "timestamp": "2258-03-14T10:11:50Z", + "subsystem": "Astrometrics", + "severity": "INFO", + "color": "teal", + "message": "Sensor anomaly displayed star in shape of peace sign; logged as decorative phenomenon." + }, + { + "timestamp": "2258-03-14T10:11:55Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "EPS conduit O-21 emitted sparks resembling miniature ships; crew documented for morale." + }, + { + "timestamp": "2258-03-14T10:12:00Z", + "subsystem": "Computer", + "severity": "WARNING", + "color": "yellow", + "message": "Auxiliary AI began writing short adventure stories about the ship’s ducts; story incomplete." + }, + { + "timestamp": "2258-03-14T10:12:05Z", + "subsystem": "Medical", + "severity": "NOTICE", + "color": "blue", + "message": "Crewman Phelps temporarily given minor tattoo of mini-Targ; non-toxic." + }, + { + "timestamp": "2258-03-14T10:12:10Z", + "subsystem": "Holodeck", + "severity": "WARNING", + "color": "yellow", + "message": "Holodeck 12 attempted 'Galactic Tea Party'; minor quantum displacement detected in replicator outputs." + }, + { + "timestamp": "2258-03-14T10:12:15Z", + "subsystem": "Security", + "severity": "INFO", + "color": "teal", + "message": "Deck 7 surveillance temporarily replaced with footage of Lt. Kayshon juggling phasers." + }, + { + "timestamp": "2258-03-14T10:12:20Z", + "subsystem": "Environmental", + "severity": "NOTICE", + "color": "blue", + "message": "Deck 7 air briefly simulated Martian atmosphere; crew unaffected." + }, + { + "timestamp": "2258-03-14T10:12:25Z", + "subsystem": "Cargo Bay", + "severity": "ALERT", + "color": "orange", + "message": "Zero-G crate misaligned; 10 crates of Targ plushies drifted into corridor 13." + }, + { + "timestamp": "2258-03-14T10:12:30Z", + "subsystem": "Engineering", + "severity": "ALERT", + "color": "orange", + "message": "Deck 15 warp stabilizer outputting rainbow spectrum; no critical damage." + }, + { + "timestamp": "2258-03-14T10:12:35Z", + "subsystem": "Computer", + "severity": "CRITICAL", + "color": "red", + "message": "Core attempted to rewrite it's internal sub routines; manual intervention required. Shipwide system failure imminent." + } +] \ No newline at end of file diff --git a/lcars/experiments.go b/lcars/experiments.go new file mode 100644 index 0000000..4cfee16 --- /dev/null +++ b/lcars/experiments.go @@ -0,0 +1,79 @@ +package main + +import ( + "encoding/json" + "fmt" + "strings" +) + +func readCrew() (string, error) { + + content, err := embedded.ReadFile("embed/crew.json") + if err != nil { + return "", err + } + + // Create a slice to hold the parsed names + var crewNames []string + + // Parse the JSON + err = json.Unmarshal(content, &crewNames) + if err != nil { + fmt.Println("Error parsing JSON:", err) + return "", err + } + + // Print the results + for i, text := range crewNames { + rank, name := splitRank(text) + if rank == "" { + rank = "ERROR" + } + fmt.Printf("%d: rank: %s name: %s\n", i+1, rank , name) + } + // fmt.Println(string(content)) + return "", nil + +} + +// splitRank separates the rank (all tokens except the last two) from the crewman's name (last two tokens) +func splitRank(fullName string) (rank, name string) { + tokens := strings.Fields(fullName) + if len(tokens) < 2 { + return fullName, "" // fallback if malformed + } + + nameTokens := tokens[len(tokens)-2:] // last 2 tokens as name + rankTokens := tokens[:len(tokens)-2] // everything else as rank + name = strings.Join(nameTokens, " ") + rank = strings.Join(rankTokens, " ") + + return rank, name +} + +type Message struct { + Timestamp string `json:"timestamp"` + Subsystem string `json:"subsystem"` + Severity string `json:"severity"` + Color string `json:"color"` + Message string `json:"message"` +} + +func readMessages() ([]Message, error) { + content, err := embedded.ReadFile("embed/messages.json") + if err != nil { + return nil, err + } + + var messages []Message + if err := json.Unmarshal(content, &messages); err != nil { + return nil, err + } + + // For demonstration, print the parsed messages + for _, m := range messages { + fmt.Printf("[%s] %s (%s) - %s\n", m.Timestamp, m.Subsystem, m.Severity, m.Message) + } + + return messages, nil +} diff --git a/lcars/frontend/assets/Antonio-Bold.woff b/lcars/frontend/assets/Antonio-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..6f24591e31da5885892b7407dbc5f388d2250bd2 GIT binary patch literal 21984 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 W0%9^SfkhY?S()}QFaQ88GXlYTveiWZ literal 0 HcmV?d00001 diff --git a/lcars/frontend/assets/Antonio-Bold.woff2 b/lcars/frontend/assets/Antonio-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e772d58c9dec8677daa00ac7d64af59f497a79c2 GIT binary patch literal 16600 zcmV({K+?Z=Pew8T0RR9106^FP5C8xG0F#&i06=yC0RR9100000000000000000000 z0000QU>mj~9EKVOU_Vn-K~yRLiFOeP3W2IPfsYjnhH?M_HUcCAjbH>I1&9U*ltl~& z8)ShsY@0?6gYy8L6W4N+2{(q`;~+}BSrp}z%U1UPpOBo4AxvY;tju>P%Cw_|ILk5( znG}e`PD)NF#b?gzmMbwD#z-3E)(46Ng^rg>jc=e`XOXXx>0PK<5Y6qW9SHYHTgLr^ zd3N|hA7F+44!b)1pzu+Ovj5fH3O|LfqK}1BjSuv1d!=w=QDL_$JVIli%R(`rT{&Pe7$e@%5&X#^PCYzP6N2EK&$L#|Rx_OAc$+S`52 z6bKX$SR`R86u}Y+*^^0rUj}$VudGrleBDw+2iy55uq1;dNw@;lD8V}@^n`Moa)}Gv zGj3)de}rY^pJf>jx9IOz3R{bws#Z?a@nuu9H2v@2ZHifZ{8hg=FXcjj90so$2!(7&jM+kNFOar1}Vg3 zeU$8g6=JT4Pap1p`+}gTQgmI4I$Z+))iR~m{S@|Ean2zj1Hxvfm3IF)u9ev_V*x@O z02Fi?p8uxb^!%Co`)nIpHDY}hp>T3G*`XzmmV}m1&8M{H*r+}0a9A7%;ae3Fl*I2_ z*6i&4Dl@%vgucs)xDVrY5b9f$JE+>tMNT$)gz6>Bk@rvjlGAMD>A`5RWGBv$&Yj|}xyF|-=e)h_ zD*>0j9zq9cEbQICVF_5RhC2UWI7zv?_?9C6iPb+1;XyX<=7AXcf{ z=g0xri-q@Z(Ta4~iqG0D3H$5L#^SGu1#$Vhi$0s%R2wMh*=wRaD^*8WIVv!aC2pkj zx;s=U@~Jkll|_ObRex&M_Od-Bw5!NJ4RZLK$w>N_!<+3N7-&z2KRg~Y5KypRetb|u zLJ>hkV$Fsvdtt(r<7?7k+P$R1rId0i;Zsd5^)%8|S0U3}9S&$7meNFOp6y&?rAiTGvur({31ZPc1 zf@Da6R7gu?tX7$j1=)~8O{3I-@qKZ|X#u_MZ%NPk&PJ+B`yg9eD-3Duwomili2`@A zn3~wkSGKx|Pz5@58BPgM1{J`AYG|=;XZwxT{;@&aTh$~$)@MNh7zhCz5FiXlK!HfY zd~sM%c_BV$4R39oVub$lTMUeS43HMrBB2G!Cv9kM^(lHc=rJKg0EdxX_Fn~6(sb#P zVa}E;8V|}?yl4xPgQ!RmiV`KL%JI?EsO79d6IU%-F|}#qp~G>WP8tww*sv(0rbT<; zffO&im+GSpg}(c4e{d>7X`)mCewZ+-lTKPqvdO9qm#Vtd($bPEMjgdS=wK;QItoe) zga{aMvLGhpA!W$FSwOO61%t$vm?0o0`J8a#A|!(1NCTHHowN)&P)0$51ZI$*ji8$D zMO;gPXqA*{ldL=y*XcMR6trouLfZvl=#K>us$2-8!dgTaQInY1X*v@`Oaz@@!-*1w zCJqCNK$FB%Ni?3Iwh#k`@UGNUb{EtTaG<~>w!VqkiGJ!A9)qbg@qZA`nFH~{Du@q0 zfY|Y!M1TM#$O6PxJ-;miq^T@jRo_juhD5bFh|wd6n#f7m1$lWeBM8%4e2)0bzlc#| z{|X8Pcp~5_igA@0RAks5cp(T8b`zojKYzK@N9a?3C=D3ksArjafqI#Gjd~MrR$o-_ zRPR?Gl}}$UejPxLdJup92mn3kKiI)})P2yxL5lzfnT9o{GdHu$5_g*(YrJNS4Ys%Z z8~~$1h{MTc2{ABEZj?nG5T`68c32oR8MRNxv6_uA!N3+LT=2k`U?PdjleI#<+5Q3a zFqz4o%wqC+&6G^-;b{i^v$H(TpY~(qGsYe|=;kB?jPVzBN|Z(0Mgp|1s? z9T-QEyieIr(kq;_DDxi5(zc9w=nB!5oJ6+heaR&RFZx`Lz3p?m;LoRC2=PP<$vvrB z>LM0rBnxLNr_3da4|pO=sRmyIQ_MA8*0^mZtb*lvTSY2vbe`N<>-+m1l37%KA`Mgm zUuvy5jgGI(G)#wH8B;i!hR*oj79$5e!vM%h2%OEorJ~F?Nqk8x4G1n zCElqHdWfjkt+Aw!>YjzDuinjLUn8cNYq+f0EO48L@*Kwme#c#}CvacyX`Hj}zYu`7vyQ<&vsRNGJ~8a#NI% z#PaTHmBo@aX3axe+83>dk>F9>n~*G9%wA*XEWI7C-clCvv@)@$QP^RYi>gOj)=0~2 zJy@nLR?9{f;(q%0K&d`r_J! z%eAcgQV~aNK0Ff6>&!mh8?k1v zVtyCW(!WEW;REDZikW2whBFu8a8{eJK$>r8vu-w1oG4p1uqjEsNFr|*r;d_%FXD(- zbw-Xxye60yFCx7l*0Rs6-|yiS0BWSW4uq zlmRk?>1CH)5uX8t58}v(#O0~uiI|(~7Qz4o^F2&H^RH^71mld0n0*T6F!^z}mZzaT z$0L_3Z~!!?4n0K#F)k$WsEV65vfYWV`^qkX9l1xw1vVD0wn8E zZ+~RtpuU*wJgo<0dI9IpzEqn}3%C;heEMDoDU(p;suE8sQG|yJuber6*)}4=h%f^Q z58)xHYLd;0nINDY-9>ANyZuIcQgNfUCGV$Q@9dXBl zhkyV80fiU{;0X17o=AsxT=s@qZ?bq3k~h{{e}Vu(18;Gsn_WQ4`+sGp_yLS?+ZEIo z+E)z+ga%b#&{!ryPueCpr`Cx83M>f&f&mIcg_EX0x_PHVx=M_Ibg^T=7?_kc;FCP$ zvhq=aMn`CtIN~6!Ms)+?m^8sUz3^prkQ-Y7CG?9=fH?in%9s~|lr#nkDnTwtA8tXg zFGVN07jQt7L>UOaUa3(w(DYqnc}Hx(LoyYo3dUGSTMzXE683N(G#ee<%xarpC=P^$aw_QKzX{n802p5Ow#)l#IwNP72kZV%RcQMMcoZ@?6NX4i zauFp~iPmoRZ72@Qab;W|&&To<5=Ej+REnCZJIFk`;$75nk z(Ar|32bh-tu)QcbsCsJVp~?p<-<}<^vcGbqGDo>o`3t@lFNeqB@mQI(@==}a@peGZ zdf^oQ|Jpz6^I@LPv-VT|#yc$IjY2=)Zu6xcmfVe3A2b=7|62yPNTl!q0vO%aAHeIA3Kk1ajri4O2~(RmYMZgcxyH`=}z& zLS)Voi32hk7H>WRgo(hBBwdEwq6CQ6T&M}1PC8}KsA=cSyXc17?s?*=7uJ06(WV_g z!le`;wX}F#>-}0qNal6m?}?wWR6bPStf7OIb;$C4HcbN2v9;q zz@dmjQzl0djxjw33`wJ6pmX8DH9mK2k)p-O^OrHFO}gT;MgJJG z?6sE!-g#Ap7604y%kR{^Pm{1CU=Be#NLp{CtPv{Ck~dDt8F*6^Oi(vV z%?wR*G@Pg70&NS-EHQD7zQ38e&d4RYuCj28l{@aTcAu?>Y&>A+5qpn0dWPa(PM%|W z%h`Y2yy0n;uXX-5`1vHzmJnYB`y$9^;l4{uQJg)n>ZgPh#QGyXc`2#LN<+51bQGj3 zKO(Ne0CBLtG#_Xl9QII&j)6_qFrgT;fFJ|j-Bgf(C4+$y&1Ui~PE_5%CdX)c4c zO>iOrHYs^9eC-|MkT>q;ws|GDiMc&r;%Pm_gNisvR40d{xor^Jn{V>^-7lA1!W z)0QSGuec#^11L|El98mmT1SS-#B4}#t+ z3LM^5?+W``t@gyE7Oia)Lx*E$r>!3koUUbazEHy)kD*?PUE!6Z`BhEL%wumweCb&T zp-JsPL)62Bd$#O+FqLs>%`zBxURbR&kbN{I&&eSl8B+)Fz8^BLiZ?_jDMY%eRD}-? zx(D-gD=XIYnu0}_`X7!hD0)+Vu6mqqPE1E`K4${g!|rge77{~-)}G)YtIdB+ZPzDu z`=kvbWbDz@%wFDyFaff>!rce~Z^HA9FtA}e`8-iTDPNe=ODCd5W1W3Pm$Ic*Svr2xnx8Zx zkk6AA2JR36-?EX3GTnp!tO|i+LJ_qxbK#|DwGmDXC|X^R&i=FpXXr}PDyBvhc4rRmkw%mt zr&dXui%aW#nJUX_q}WBG8tACJR<~lnPM^(^W}&9cn~Fp4+_Ga|G)>`$p;xpP6=Cf= zv`v(y;a^x{?5ljIGr;c@x3@Kn0LOAnCOVomK5lVJDxL-Hp<_l+qyji=<+Ja2NEHrP z=3U53q8h`&b-9Cxi+1BKM7#je$x1C4C}@kUfFrAQq)=A7*IUh@RI}enZEe zbi4a9zv0ZJf{ZkDRCfO)d#kXmF3`O)JcK`MVAvX-H|6W@X6E3|LDv&tgv^e-RB}=S z#LV#@-{&~tdT_Xjps5+gqL283r9!781`>N5w#`DRD{b;kI6s*4HW=$*kdG^%T(%nC z&dw1qhctVv?8hv{>O?3!i-ONwim7op(4I&@B0BV>6a9GSKl9_FF0I zG09qnxj_)&%>@^bN95u-GiNwgpcJK zBc2uHl0|hh+kN-79afIb`dXGwIM33R)v+nKBIMF~DxT^LGor1-#vnia(K)&Rhb8AM?$mLoBhqt@ z-hWGOiK;NLJtVh2oSYVoqu0z|m)6|= zZ%&JVa@u+KhqlcgOox=oBR~8{uS0n~U3#T-wktowpbULD`$FBuWK^OCGm?4699voO zwnPwZ(F90Ch7I3CJ$yLv3m>+DAlb!db5WhU$6Y?RqHdT{=zouIT6!arkWLHJa%XzV6g&t+EQ@7}zJ%Ltjx8x~xkQVr@kf6;}1 z{p9N&+_*2H?N(=GmvVz+Oy;vNm8v@2kXr1S*w7i6Z&=o$HK6gRnr1Ooa4L?^h+9AuhzlRB^-5m{j zt_xR2>Qy*OuNu6F>f9bP0ML!8DC-FFS69;T-7Qbcn>>cEw5O7IL-r;?Z0M9s+&F(P zO~3hU5_2?Z<+QC0S96*=)G)FR*Knc>SL)oEGCi?mqBfrM1(~sv=QQJh5J!p`V@}xM zhH6a8gAD8N{G3N~7wpZ7iFm>Cbcqv&oUL0~kxuM6c6j5=tyM6-p))_Aaybiyr7#Fn zyD_ZR9};Oco#ZXOo0v#=&EGN5HeB5Ydc+BEhj9QQ@V53o##RD^bR}G73c!PS5Z8v2Acfhy~rt2Pv;55_&02V-mU??jkyD5gX-mKtTdXIzg_ zJClwKpmLn$U0sR6U>#dJnB)8U#Gbw2Qcz91Ybv{*99W<|lKchss!W&bk?yvhTyxZ^oav(+Fi(OZFg5z?%31AgQ8E<>jYIE)c8m=fu1_5krm1B;NCqt3P zsuM7IZDN#h`^_Hup7qe`gB1zfmO6Inr^5fadNbjrolZ&FEmV&(rTP5gpXc(7VyJGU z?Dk)MMvWd!`__?9Rext(%GVx|32uxLuubgR)-|!>Q){wi0$@4OR}XPKpAV=WbiX~6*uYywf!(!TqReX3S{i_h zCc7BN<`_gurW>~PRnV4L>)=_edagiY$av+G#a-0g@abhn+sQS zYABw3!Ue#^4cTlTtb@!M8l+F zDr`f*A~v;^>dRMK;2!yNy3w%E*+>i>&5H3p58nQTsRTkz^NuPi&Q4F zQofh4(1{QAh-R`(J4;1RlIv)5cYIpb=k}wN$H!8D0Kk9TUOTpSCI7Pseqn2d<2>(X z^*Df^dMJROa7(eYJBg$xn)U+l6AlINQ{U`ycPI{69wjT-6E;1CZYXSf1p?OkZ^@~j z0r+88zb&NnZ$zm7ry{<8VfEj97VG<&DC*@^BI>UKI!At;K)*41Jtk6r@UJ6Hh1A!O zwMkqv4)9K3bpeyD3PxLmx?1+`wy9nK4jZzMM479x&txCrV^=|*L|5*AkaLmw)b{;h zr)kMrJ7eU`-V*H^n?V&lvfn)Nc+ zC*x*05KjyRcFh=eB};|O_93TeJM{FuyuyZL(V9v^CTPjpp)O)6-TFFL(S9^nxWo?c zSE*mB1>85^GBB~ufmJ{lN_KwvCsd02Ti;Zdf#L!hND!vy$}hN7*1DuW)^*;Wm%R1i z(r#9rf0CvbACJ0;#~si$mlR8P0}&FGWET~$dK5rxqV{uA93yifyiAiD{KEalHwtnV zAJA0!yf~^@e3yYvfP73ar-)byK1pS@(|s#cFBH7%v-{My|7cW&jaRz*F?KH)a}*72 zHqe*Cggf<6(Gjl=^cTe=94EoSc(nnqyecx_NpN$@)c&iBDIi@e%Sa~2+MZ5V{MVyS z$t}rU`o57iCO0H7mB@3Z5=*iZ-7%@p!3XKikql=+Z~Qp*ZD(o`wAlkUDDE!oCFYBE z>A9OluAWOgmSBUf?r;}vb|X=)q&QYjMiEr=6k4%|P}L@k37hSKlAbk&X;vvYkY-6T zFqO^-KjSAG84ma9#^J-lH#x;|r}6)pDlkC^DJON3aTT=RJ5W z6!AATk1sm!Lrq+aLj_Z>voGX$l<;Z`?1M3X_5ZD6TBAolc;Vn{@K8_)88xAkLi-$x zh%Uelc*Y0h$ul^XOiq59@uk8y<)$}_b5eji+a2ptfdX)~Ag#8LZjetKv*f28LKlJ8>SVye@C^RWs6)d0SXvX=lXFIst` zDrZhOimUhI0K5|g;0@uX1>rVL7nt9BRrpuNyAqPut^+SPvsalxIFFU)+992{7bdQImTIp zv%aNGl$1yMk0qnX$EZ?Kk974{&{5Q5WOUR!pg0nvsPaUft%#+U@V_h{rIK5n0!lTf zatt{-O;H6!_RIU1MzNuQ5=aFG92tK-={_)nIXiyqL)30Tv|+4;nK8}Z1Q%u-{Ijwk z)F3z-vM@s{MnT z^*H=Ns`t_Af83RlX|$8R*zhRLW0~&hN)ztf28WDpmKQ9|bL_$XFwdL|-}XMXnl3t@UE-2Q?qED0vC+F+sVW)<^TJMI!ulA}Dl|WM?29 zg~VFB-HL9B(EuslzWft`RmR6jE5^f3m44K}eS)82?aTkU<*Pa(@J@kwZV9BQBpnX~ z&fO{brRd7?8j2q;q8<+v(Pt!gZ+<*9Q9kkE|245MJMv=fMG%Ob4$xb$N`^VvNx~2Q zj`*W>KvwNQz@J}LbesrXGtga|23)U6_ZS<$vA-bAcd&j5MpHuN9ATq|_IeFQ0bFTw zr*jYXufF;Ydv0Ki4=Z^ZpdkBEWP8Q=66%t+?{+^zQ6;tAFauE`(JdP+2@uzj06}t+ zV2i8M{Gw&mufnOun%s=^j+W|$cGEIHpa4&w8!-WC^^7#nk7YDk1>lMHuvjr&W4w!x z^<8yu#Zt$hEQ7#=A}_0>*?tdGJ3_qS{o3zC8_0?bBW0>>fj5Bx?hvyo!Yn6>7SgRo zDxx!U%c9IiG8PKVPnSnz4GOeEz4v($!ptn}CGpzlsTBqYk`{tw$v6S^j0v*c84n6( z0HOmX_iJb@>upH?O)5gw5ouABfCt;s&0{$pFS=b1vTlzjHZ+VSdfh(gnxi`%w!hOU z`JK`i4NRPGP_$b3yc%IxJ&YafhmMo^44?qsR_LnfjnTO3%rOfJQFOcu5CU*KAyRwV zXWl+x6t9FMW8Fof$x*V2gUZT6im4g@f#d}f$s^4tirdR6%az`^CgYOtCscOr^UTVn z+&b=qhuB+3w|CEfaf2i?%q`5#$(XX}Ecr&7qZ9KcgG{%=6~%=s#`tUM+e^p!nZqpC zd*9r;HnX}`=XWifKvVH7R2@ly{DlHy7L)(TnXM?_uYOu>aZmhBEO?A9IuuAhnfBt> zC7Nm|nMCvpxa_Z%U~gjX6Yvq6U$@m3s}ZAT&B-k^+PktonQ!#tO&;KjH1{yWuK~YQ z`rvxN>O@pkPKTfCWpFCwr+SQN_GM#Jb##8hud9i~tvpCow&nY=s9v(5C!=%CC_p;W zuRmHk$6Q~tR>#WTPd1qk?n-?Q9>~ceog!A)4?1msKwU<9rU_Y2>Nof>Y%|1`z)R_i z7hbNE1gRb)b2nYhoUZPFH+k>c&5@fQdE_e$(>wNs_+xXGm%i3f#;LndHwpS_qkxluWq-C2$U#+U4tY`Bdcp8XRVt>qy zCYCg*urc3uwVzysU-YhRcgf+lIlI-$-{fDo?!GmUgrrmx2FGhk3w84;MzWX`?<3)u z3@rF$y7)anj#w5QuElUX)II{vnc3^&IEFdaIkt%w-dYE7MGj6<&c9@3MKKI|*A#HA zP@l?($aD%dB?T+wQX>t!-Ku;`U8|%$)jC0cP)q)aQy#OPAu1kLB&D#(M59DErFw-| zX>trFJ88!t1r>V<3JEs{z~RCJtxc7k2SdzCoMc^j3XM;@ zs7qf+@9aMwe0Tf;@3;O8e>jzS*OB3Jx0k0TXl>nIzWHUWR?rPA!4 z!6(OM);cg)yEMb2iDT6o)q!96hk4Sk>9hYqg}dpy$s_O&TOasU?a{T( z%fcXRsUSALsNIIrT8{OT2_r;dOSDF^tUbUUZINI-&?5m|vov?SF_>w8v zv2X3^^$CEVf7P!4T!gxeI@E9Xt)#?L@|6hhbKG+5lL+&BS`?fC2*H!Pw*cJX);&;l zZ#jJT$;$HzYAEiMYN*?8G83H0cF(SYGyYF5$|a``G~VX?pHkH0o>hfVdRh;N>>NsN zPXoEdD+mZ@>qu5j9SR*iBnLznb;3pt$%mn<&I0;9=MOmS2MICDddv3DCwTe!cIv~$YEJ$H{D^JGKC3H@jy>4A-@!b3=Ng6V5 zm5p(Sy5eK(V>M#X&~R$B2&JFIaBXq**KxB^JD-||(3zbGj<%F92YS)7YV zl-D*QyBdJy8}%E}latXK_4Uyklam|K^~E!+D@{J@Rng+QkkVSZ@n2)hi=VZ&lx_+d z8-o(cayTs|nY^Odl<3$)y|J2c`*2^B4#{$4_C?~`2T!F$rU3M)uWAf6DO8K5=EKTO zF?T%2lwaME=L1l5cU~u;5iVBL7f`X;sSLWU$o}wOHo)Pi6 zjClIK#;$$f!$6ZAz_qz09cB4#q(kIc!bV)mqw9BOMCYafwT6y*?VV;W;`Z^90<0d4rx6-Db+oH_vSNhkH639s;cb+ zmN@2&zKNTnj+3>KYO$;vX~BI#F(2uz5vzN|EBUbEYY=9AXs7e84Ri|b;GtXA&pa(= z+4KJS>F29ctN)(<_dT!~3&K03Q>R*QQ+_W7Va00+YuB2IXgaTnZ$=QWJ`bIT_@9HG z16^!`gKL)+J6;M9$^N@({=Ux*e)c(F}_*G5qtD&Zw znm2)|22{~e?sAF!cJ6OKN$JjJIuEM>Lh!>FA}ajx_jDlh1?B+e#4W#jROnG?BlQ)) z&%K4YE=tfYf@|97N;$A7?@>t|5$xQ;OC&`evlz{HOck7dr8q z=(;HAAU+n{B+>;Pl-%}U+WFSFHmB(}KW^axzdRJz+AO6lIQP7xfp_3~fUX;rqQ~@K z53KHh&nX$!Wo;ep9ftk%W<$e6$k#_EuZ`S=Y)a=0VuseVI4>h= zfAJNK!Pu7o)wqP$3a|fIO90c1dnfu1NIp(j>PCfi*LFg(QDt7BBAdW9yLEUW&Mz@9 zIBX^J(v(zgX+#9KG&#)H+RND3nq_Na!!kCu@dB!S z33@TwQQAaw)K}&+o+*}M>ETS!(@9p3QI{9G*ZI2vY$!I##Cf{_*!gdo(whR(H%*XA zT!_1M_?p>T;u$w^*r>l02W2m;XaaRLJ`3=U=m73`YrS+bQxEt;KcT_=Cm`j+>wo6T zQx{!6Eh1V=ovcBP@>02LNl|9<=~XEp9(x48CGILPGLmx@AF-g+&tnZy_|gP zshT%iYEkSPfSrGRie?I+U2e{I5a)vc4oKUB2sz)dgUgJ}k_;=C*;g`1I|g)J!}0?U z4G?FYG8++tBt>AA@xV?W!0u=3@&85x-selP&nRB#zA}*6P;N8J^_6YwtQ_C;g}MuX z1Ys5ioS3Dai6a4*tid+4x~j6uS|jc=A1XmK16OBu)*|z&Ww|2Q7RZX&w!f~u*_VC{ zh}m0BOY_kwjj&uE9zj~Ein?qyZ=MI{|32~{wgQ~kHx2|j4PYrbTF8eZG{`AJhtix^ zX)d>Epmilm!^#%t)Uj_Qd$QoeI-N~}<14}(0a@F0uwgVvtOKho=h!cVWwVweVsdFl z>=gryBIRZ=Hv#JLftZgwfW(g5$smQ%kjuV@; zb=0;{Sv~BF3*^o%fy@*fNjsh<&>z&5Ek1UEn>K29MhBK;J#G3zz9@#Y9Rt?pjmhRr z9`q!ifOLbk!a2l^eKP*meF#({425`WEs`O@3N0B>A4sYXdNcwG8iDZ$%OLt87Ix|a z+khad$ro`*LtI!XyaXhFGz>%N9O#sRZO5TQ`}po#Bd@h|eDMmg?+B;mbX`lMYVSUA zY9=HWr^Ib@JHSbz%5G?(6f_1;JkR8b_U1%Z@P3O?0!Bxp0XC<&Qyu0;UTE*WP{ph~ zVqZ&6{T1gBr(lDN2a20f=Kda*i}{`h*?+%P{|V$+P1waH@rivGKu7dVDd#H|PUM<()Lj=G);{BHonp?&FBmD+nr?`E|x9#w08d))rv7n*wSIVJ4Y zSVVO#hBy1-+X3;!zT$lpPve5+@@YW5Cya>WD7E+0)fdTazt9&WOfd9ff+qKrNs0}V zq{_!+NIn*StaW_1*zCZXY!(+WCsu~}er!9>eLK6u;QyTXVGJhv1Ecbzcyw*#%?ohO+IP0nduj!oA~%UACS{ggV50kch(7PBe?YMa`sWumySHu8UlwV_*S z_oE-$Uzp#CM{QHpws6fycI9$x?KHo21Z^MeZu`q$PwZaq?w&v2lXOBsgWVmq`z1@2AI58GT0K#hl{K7}dc%v^bihAY2qVJxGZ3xDix3rMwb(&Z7GS4XUXtz^xl`d(PO>*WF~RCyiUixHzcmxytGTS}Ys zpcX*KcbNS!y(3`hn)>d_nBf*|8^Car@UedWFaiFMYgRhn_{nP3A!*rDDBhs9V$cOn zN=kYO`A9K&%6zSdc2MKBQ+#F82(Ma5(Bp_qP`2BZLwFc-EslrTwE= zV)B&vS`R*`{n{~Kb;nxZ>CssyVSuV3#hf4XkeJk(gdyhqpa((+_zyrByY513Mmlt6 zK-NxY_N;cj&-AQ5B>akt2fm%iPD(AaKuuq%<3})=K{k( zJ!UUssrwXa12&~ZrIJq>fW+Ig8?apcH?{J~4Q7o|(M`mt6KMd`l1Ckt8#Ou31vri#?J z-U6y*!^t-ydla1$P5}d0x!>3)oPQsgPtpU2X+8eXWlh*=tz{_M$BxGsGb@~9nHgkA zyL8{b*dmshK?XwCfX4xau}hh4Uj<>(4j2U3!Cz^P*ET2KR|eK|OgiBhg@McZI3)b^ z&$G<*2qCrgJBjb>dcwmx#(`JO_idSNOkj zQTkOD1OgPeVg7$;!-xFBVM4bb#HY{VKD{Z6o5$dePy2S8*?fvWuS-4jE&M@bfv!nV zSfH^oANF0$HL1ND8sD+Rc?}h{yL)QwLZWL2=2#0}!5)6X%Jxfhk`Goq!tWki>6yr+ z$5w^4x2xrrZ2Gvu=c?3EzHkh04+@Qs_B_@~|50{a+@xH4$KNp58j1NT?|MB+bH~cy zC{7-onVQrY$2tcfoVCM#8GnD1om6+Y;RF7I1*IhPJ2+-v%o+UpW`c%S6ujhC(X2%r zN55gNBP?JR+^zV8m*_>(-n~7S#2yWHrzFjHs^*YZ1iah%O~m$hz2T=(H~9Jlk2X&8 zB{uZms+hr9t%f153aVLtbbW;xY9wK^(W-*)u)Skp=&{Awt;h3{s z|2}c0jCTU%^EWQmlGNHbcGD=j8=OQh zd!qZxQa1@o^NVONuij-7}75uAp#^uG>$f1JK>ufkoyqeY4)Nc?eS9Z_-XADD8&TJ1+{^AyGfA`A>F{s}BVKGHfmsi`e|6lXiG(3|R| z(R~RsyZG^3uqGU*IFioWd-|8Vg_ZcCv*#I68v>a-X~|>H`G!LEG?2M{6|)&R74^{$ zJfZARHD$hvXzm%{YL>SzRpN$TB@NAJy1SuH(Y?kw^kD%(3N;Ip+X@0Cj~JUU4?;in znQiG&?t_7B#R4BR>tPTQ#twr*nmY`}z~W&-g~LRd zb-cgWVd8c5(3T)Jw&%#NHGu#QoxLRUSA1b-Nnuzek0GcO(%029fZQ5@?3nJ7Nx(wn z#Ao9DAd+g35hd#-$m)>AQdVN9qk~}Y_s)dcqO(*2&tzhu1TZs!l3r~v%Uis!S6hK5 z(n^Z;v~_j$jpPvnh195Tu(eMib)nG*SR9G8SOaHfh-9|)03x3gF`&5W0s?GK@bpGw zAA%bxkt`2!vy6?FtYHNX&>q5x*il)MH>x97GjKPra{yH_P|DP zDu9;v2~!cY#fG91T(guYZX`zK&_VPg396(jx=Dqh7uL-HrZyEeGZX1aza5xL+8xpXK?UXFH~5WvI;Mw2$8vB*ey!5 znA~EEjp>Q(;>wjLr+5hxadIz7avr5f&9gM=GGz7!i&t5)<&@7`LAezw!YxmJClou) z#|B@172qn&zoJ(Bu2@Mm0@`1ol1i20*&na6%Hvm2WmQ#IQ*CwC*HB|kHP=#W2WqRm zjygNop}IO;cSkxZNN~qG-ib~M5o*0tX6q4FuhshMZ=k`38g|6dMjC}BO@^#}%(Lerj)|6?3 zhAg-MPDCFyDAg*}sa3CBgf(R@cNX6~VHG+^*tF#wye6ttv}_G|BZ8qdYN5q3cwcBH9K0lSuj6HnB!wUayYJ_zr9{}ugNGJQOr7+AJ0FoHpvvYTM7D;W_+ zaRy17*Al`g-pc*ocMc@%dRZVt#i2Pq_JjZy1SVKIM{tcqCe8q-1|k3e+a}w|MOrjM zb6~HoHq0VMV8UR2tzVb8IbI*cBYw{O=)dUtkb#8TuzW6kNbrho=?w?dHfqGT{6;`> z{$yi90jmI1|0-EK)68KLzCgp2CL%7wq%)&6{c=bB#<)wzAh1r(Kuw^IAD8)?A b1{pd^N%&Xr+c2MQ`Oy5 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 literal 0 HcmV?d00001 diff --git a/lcars/frontend/assets/Antonio-Regular.woff2 b/lcars/frontend/assets/Antonio-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2c89826192e934f952f79702bf058d19ceaf3eee GIT binary patch literal 16440 zcmV-8K*zs#Pew8T0RR9106;hZ5C8xG0Fx*H06*3M0RR9100000000000000000000 z0000QU>mkH9EKVOU_Vn-K~ydPiFOeP3W2E{fsh#shH?M_HUcCAjbH>I1&AI8ltl~& z8y12!GOy*~h&vDjo|c+tBW#aDLF@rW2V&Sbc*aAE+5i7Jfr<=u+)Z%+3j2ixi#pLv znPZfiql0O6R}6qbQ~C_k_VV|6U=q7M>yOgq)IE3Uh&(`D*y{hgHduU-ua|AQ*`GI%a|G5*yjWfQHq2ieN)$(O#!x>M_=g*YdHn!S)MOI>) z@QQ;5f&t+`&6b+YXEwDlzfUA+Y`?y=(8#_}%xx_6!5DI!4_Yi%O$r7>&eq}(Y_oH- z0!6WEW`K!ANr?%H1tN%;v{5~))^5f!)YT7{x*yJqf zO#l=?fHNkBYc3F=c3MuU2`ygyqO(deS;E8JebIi|{n!LE!-WtqYM_PoQ;ywkZa)GR zZK*HW>@a{KL}hewT8LTF)6{frHnTL@hSH?Zce3p`l5^~t%qb8-T6l>LWEDO*4|upL!k zSqCf>lM)rW72a1!Ut?Q+T)xt8DM@{DSH=d2eEYdmE;)DJv6P`=SiqLww^ZrLe}~+< zuUzXr6J`VUsS&hyB&&@}t0_DHoq`UgG{}NOXnfn}nm`C!ZEsfekkTxFH>_zEB<9xk zmKzli0w_aV*M7U<>BRs4w`S;h@4t_#xGJy4h^mMf5!LtqeNGCL4FH#hq5*G&(8eDU zL3Tp2E4v`slRc2gQVEMP4KN54H~}~n1R8DXpwM~%rxtO1;22kB&r0}KFhkE5aRNO% z&jTaSC8s%bf4i*&y^3HsPB9ZEngDd30f`h8Ch5{Clo}4CTFJ3-qa1B z9p?p*lN7$Q%@LiXJVC(-Ri32#VT3`Tu+EYFGnnVI8c84UycTkp~-L z6Ks}6mMn*z=UbRJxOvjXrrxB{XlSO((33b8B}odiKyK=kWbSy7rMb+OP6eY2!+4N0 zjn<4^fequp9mYchMD5KS>mi8(;_;BNfoKW}V1NSwB+!5k7Ql#v4^I(NxXVJ$NF;IC zC8;=P@Uj$=&9BXm2k&T(JAs8^$oFQEp z_CViJ1iFbPVTu&Rsv`pd+v8cl+CryM7H4>>?!Ku~uZK%ArStW>|ua%--ZOF&MxweA^Q&S+Zk| z3B|z$DYq3X1=^QkWnc!)w3h|%3hl@s4Aj7sRr_ECCw*6UeUe^&+? z-diXO;1R&1?X+Ei8Uk9Qpbml{@FO_l&-|UHo^X2NIW1n8;N(wR;W_Xkcm=%9d<%RD z-UT0kkLk}Gi{F5p{Gk-`+aF!fqY>CK6yY9SJ!%IW-8OwxnvxSe+~bk$g~w|?(#N-7 zH7@{Ird|PwmB(C*CL32T=J{!RmHM!G=2NpIQZY6eLWm%W=_HU$y2@Jab?0xel-rAS zcTr_|Vs*2Iwe#|}YSk7($+lyv(>MMxldH@%9D<@88A_^Y;Jn|u*TMDrlkIf68vo$| z^xM8+tG2VhO&Os4e0uWe{4_`CBAQs45l5!3*QlnopMl_jtHs-M)kUZmMZ8d?j3x8R za^C6d4NEAj(LaJ7#jL&`ToVHik@fmM838<@i@n+OpjKBQX}zkvCQ;>ey&JjR&2rw5krs{enh6nHr0KmDU7N`B3)=>d z>Oqv0+hms4&=X#3A4n%$x7}iDS9hSMzJV>i+wkwZ>#2yj!O=~gX1MYvrZRX2*4KR) zMf-dH`x8~fspm8B517b^J*Y_sF4%x0u(bQ}JrjVH_WvAanw<`8Y{qHa$9IA!e9%J- z#gMEA+uC>?v}|}Nj2xSx{V|s}J}I(c&}!CVEZdty>O=7tV+N1u*bI;~>oLD}X`*<6 z7xvPP4<)3?CKraN#?t-8#)nkme(2STHcB9O&ZFUtPl{}EVbE&UVvN?g+N-Z%)99Cw z^Zs4<5j{8S#Nk97CwzbpKb^Kg(&gv}NL|3*wegh{*)T+ZsjbqBq9HCkUkH578IQF4 zZ{mQY?@`V2gCE6hIh<^LW$LM?p8BM3;7vnmRa$e&+g3J;Y#5>miqFL$e1@6HbVlZW z)Bs$8rE@%Q8!zTdN6y+dWiT5la;e2qY*!`7a5mgDWDwCrDZ9}1)M*%duM-YmSTE4e z@)b{R*OP;DN2BcUg`Ikj(`^eFf3@n?hZH`qS-y|SDiA038*2s>kp-O=ljfeX8VD#3Wyr4@O0ODZLDxfUUCul{_;F<0jg7f! z&50|{&jMexc##)B*@OsYrLurAHjc6}krVfZ6VLBfpI13t1#;%qfv@Z+*!;x2Mb2Ps z9~Vr=n(}=nuKw1sauG5rX-A~F*d7eS7>Ev<%p)!s?)}dE*;ayHg?UpPOCvHPm4(#Q)|w* zE&P|uPLnwA{}-X(;SRY&EAK=Lh1TEI5Q;Y4n=^v8-&@ig?cTWWccS~{MFL4!TW-BA z?`X+(0HAcfV;LEri8yd`$e~a7PKNsf;fR@6zED@*XH_c z(v8-p2DsD|AZ3;6_BYvS0$n}%MLd%TFtmIX*&Kfxm;f?_5|w2_Le1OcH-Z+2f(TI1 zBvf++RMj>@n(Sr74JT@g>^;l_0dk6ie%MhJnmgR_oi&ul2};gBr-G8riqCY z5?H3$^#sxPI04X9f;DtKA$W~OfJjOZkxALXG{bvqC*-!Sm)~&i*-PO}LM#ro$ zTa4L09p0sV`79XwIQy*Ju;7wMBZKbIA;#6+(?^*LGbfdEQqC#TGD5bz;e@~39;3k7 zg!oNmc*)MnNYb9K1@(Nu7K~B1Z|+8veT@D3kqagqMAR_g9_&s^_z0g|WpBs~cth_M zhvy!851$X+hrjdR{=&o2!`{Q6yJFvl;wM*2KlQw??(r(nIE-I2J~E~o1`G`VKYEIx z+#ogN7zhS8fbV@15P87U;#|v%Dha5MRA)WIM2qx%fVOgLCXBRCXJA&C4QAKOb_2L` zySJyazI~dZA*Jy@-#N!Dn6&!v+=bI;Ok6icgbF}<{Wa=X=hw?#aA}m_tZ15ZTrsme)idLZf!et z?mlx#&aMd=E7#0l`_IygHw~D(duI7lx9%7dbGdZh_@_@DSdO(jyTbLV7I96By6oyoB`v%@&fksNQ4v zDA5m?ev;%z$#(GlD$6f2eX_tGR%K1#|1`8MWqs&8TUP|&*raSk#tckL5BwOO_r1?!z_9rVUYgSdS zD0^yUm7bV-bI_Ng{+tZtY%mu?xhl$0es&6TAkS@1VP1a0>}AU*94LJFA!?9+6o7mH z{Qx-tQM{P78Fi|x`F56Nr5Yd!qUR)S693dH&6XtY5sd0xxsR1S^h-?<2% zzxZRk!CWJwAa3HuX6vam9%JmLja1U9jQYo!tra!>s#a9r>e^3W3yUb~NMU~>v1v+; z+Avt$sP8l41beaJTRZ3#`~IN*ltg<)iA$lq3^z8xi2&H9;= z^p|TqjIr3#YhVY4 zs2#Qa)zPm~>!WF{#YdsYW9VvT@^??{Pl`h?wvf%s-i$_*x*3s^mfg`N!0RiU@tCe_ zhHNll+j9COR>r*zWLZx7t%a<-ux}z1X{bZ?=c6XCoE~VRfIQS7wF=S@XOAzV7eoak z$p72{GB^O>mY2US2Pfi$ynMYIF*9^#K5|Ypxh^5GV3q;Z7iM7L7|@vYT+T28kh7Ra zGQcmYGt5Uyp z#7q|i6eh=Rd`ebaemg39CGRw)Ioq!w%!ibG#T<*Lo{pra&k!AV24?-xHcoi?NzeZ= zsxjT+xKpN8xtBCfW5P`67qC$rH4vjbiLe0jZBgA-nqLkA2i|PB>$rcSrc=V4=$Vz+ zMD^IV)sdHMwi_}^js^4@&dj9o@U3Co;6#7eVb5{%AhCK@)_ihw02Opg9Oxe}dl!I@ zzdr6X(3^DWA6+-8T!|R7)yIOZbT(|_mISWl#!MPWSbY%>vrxy3NyJEfGf<(m#z0Bf z7Hb-QvxvD4qHt-zo~EABKZ$(aRAD_}PW^?2Id+*6x7Otzb(Q5ZRhsp4$iEoutP?zs zC~4>KOR@|)&Z1cMc~Tsv+z)KmsPc~JB-l!VWj z#{)xMt8Jl;_=P0NeIr%G{P7tQWU4G2dylAkyuVL*9>kjzl;+m9;aYejZ>kX@#-YFQ z0V1-=4KJ?e!(TAD9=Nr?sRuHm^yJS2tv=_MyeItTGl4i5d3g7bcw*G2L;m*tK$$>? z@E;u*_MDFy_lb)rs~0xNIaEHxZDLqfyrngmm>cMDouKhO`6B=`!MO<0jvz3|Q8;BF zb&(U%;#TTMGQB376p*VAjIjwgIj4xk0V;8nUb&##NhpU=!*wD}aCb;|=c z_zYv&qo=4pBEHm5on6Ej6))|pU_!o8TJoDy|9cql-*rmB$|>dk2bZr;hes?a8Jy0# zhVYwqKABU8$?S0SCuGSJ{Y*ikHA?!@AT?a`UexJhfAbYT4iNQhLWl{JL@eBE3|{S( z6vG2PqTYPM+fB(Y{;xH5VM*wYCaYDcJ{l7LkYX+Lm2A8e z92;IO-w=R~G4=#!$vk`o>(;is=1jxYd=011tZmI5A=3>yZXX?>D%4UZyDaL*8)l#( z4caU+k0~c?O=W%V1I+Jk0ZT``{azScKHha@C+N-xj>359XsInO%FRUK9Le4SAwQkD zuwv0J;Aa7*)%|sYIl}k8c#DAYyXyWnnH$kSKIWk$t-ZqhJ1^aNHa{?pCE$gZSVcxpjWFrBE6sE)U% z{epW^trWw-UAq==`8r%>gSv@Q(Xmh%isd3fhK(0Z!tsFRbdsYESZT<8R}fDlEa{Mu za3k<2X!m&(7qsVTAL+fnmO^(Vfi5`9HLpI8sJ>YXH1b0z!F<>>|QQ2>0Z2aMM z)h|;LA>*k(a~|c{%4o=6!_>o2TkcR}j>Tyw&wni`TtY&=5|Gpk3UJ|tD$Xkp75cnr z{6pRah8t3L=@8I*mwD^((nY)j_wM37IDa7}@1J5hd3#xUtq(Y#7OTUp#XEn?%_(pt zibrIo?3P>Z8#8xxjzuV33b2EFAvV0nGu++dEaCfRF=T8f8W?YAB@X1cFG2)c9Y*Q>|kS`Mj@ z7FSn6>n)GWfx7v3UrZntlTM<2Z@Jr2E6A`ym#o-uEsiU(&fJDC3m%KdYO?D_%9M;I zjtKo^iJje$jX;!@9q?Sllb2#e>3;R(-K`2+td3SCK4K=>+!Al1K=Fk*|B)hFAM;tK)kDAZ^?1&B6d6U_Kpvy~*|pt)rEepHmx6YO*?0y!zGJyzgv0 zD}4Xd-!*2Fk)*JMpaWNKsID$W{@h>6@aWFc0mb%R@U6oweEyi59L0P4FZw5g7RbolKaQ_u4i^}$ZDdhl9R=5Fc3IYP z^Ic6~S!@!f_w3d^#8Eag@|fyf_cVRHz`EI*ToOZI{O%{#*SpDbL@Oe|HY-FmqClxx zh>aNb9-J^eFnZ_yhuhC_x+p| zp|rj6aKaG){|tM+8Md5znZ=rEKN)LOL*UgvtL2tQA-#}6?*U_i_d|`s3yfPf95elQ z`SdSO4_ll#qj&ya@Hez!Sc?93Nqacr?MQj2sF4_5XMI|ty%hEBkhFd|ECOw|w-z=T zus4wvIW%crXEuaHgL>5xH=h;@k+U@^3%<|(ZrGcP-dxfe4u3RK+*!8Z!L~SNQRBN% zzuW?d9rdh;+DX$o(~j%nz6Y{$>j;E;i?cH8WyH^2C5`>ZGpmqDJZ!4f>2T0&N1lVk=-I1U}?C-$G^?y)n!`}GlIwmY~@$WC< zj>ata>wD)gmou#Yh??fyZus4bFB0qBL+}YsCWMqp`WsV~L5S=cOm}Hhjjqn;nuJ-4)#CLmll0O2-`x<4cU$xPPxpD8n1qN1F`2|Cu=DS4wJBxL%ao$Yt^EB09yNaxVm!I0V2;$#?ez~ zA>bqH;Un1#qQOF*|*dliDn zdnQ>G#4q^?5kgl)N9)6D{b2Eo>N4g563>mFsbBeDNEiYl=OQTny@JUPSoW6$CgfC- z&~;`f^6jo#3m{E!Y-pH2Rkw*%bURXJd?})}io!UIpc9tibSExcWEzidsrD+IeEY41 ztylIFJR+22RLcT^`pCj4duo*mkc0QdM#a&{Vrix4vt~@Q`_saTqx&f!pnp0o(V)Vg z0QY(3pj2{(1NVY^#sv*ze4F_d#pj`bZ+dHcvdb{&a@dhv;q3;duIwcuECg**l2Day zRF)Qs@JAbzCH3B3Tx50KAm5f;fZn~| zZ^Ncq$?o$XOrU@XJ!2UxNOceabVA!l3!#2968d ze&8RiwX3J+YkS*h8$di!0pdoqnz090o4`_*AKX8!(j;N92s$30GQCk1izJ4U zDe192*fXY}gu1*`aiyqXZ7hj2j&pXUM%vP^N{Q;DiA|Olz?WsL2Wdt!D>YW zm71T&x73kEhY`Uf=v#p`bDiXQ-#-fJ7 zY_rvc(ciBXazlNzAhtLvAwd!qms3GP*TJ0ZYVKXG1IeLc=+U8_UqZE3lMCYukvMEo z6#Xy)PT4S78%i*y$*fRP!`s0Ywyw(&@<%HXNQ?p5r>e9i%TUPtf~q~w+w8kMx5^sJ z!qbRVil!rE5ZpJBnP5;EKty;wbySw*3(RMdHIcDc5?y(p*>A&bN9h;kJm`;w3NJhv}V|N@3I0(svB_Q6cf*R=bzMG%KH;StejVM%joCt0�dOz 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 S+^39++}fw*f3)!yjsO7Z>G^X2 literal 0 HcmV?d00001 diff --git a/lcars/frontend/assets/beep1.mp3 b/lcars/frontend/assets/beep1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9b8c564e8caed3f06c0e3764654a3e68f3f0159c GIT binary patch literal 4641 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 V|3%;X-x#z1i`@NxssED^_-`?2?sxzI literal 0 HcmV?d00001 diff --git a/lcars/frontend/assets/beep4.mp3 b/lcars/frontend/assets/beep4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8b39d772fec1255538851ee173d1bb116e1867fd GIT binary patch literal 28449 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 color + 2. lcars-list default bullet color + 3. blockquote border color + 4. images with the *border* class border color +*/ + --font-color: var(--african-violet); + --sub-fonts: .875rem; + --dc-font-size: .875rem; + --dc-row-height: calc(var(--dc-font-size) + .125rem); + --banner-color: var(--orange); + --meta-data-color: var(--african-violet); + --data-cascade-color: var(--orange); + --light-color: white; + --h1-color: var(--african-violet); + --h2-color: var(--african-violet); + --h3-color: var(--african-violet); + --h4-color: var(--african-violet); + --link-color: #c16fff; + --code-color: var(--orange); + --nav-width: 240px; + --nav-1-color: var(--bluey); + --nav-2-color: var(--butterscotch); + --nav-3-color: var(--orange); + --nav-4-color: var(--red); + --button-color: var(--african-violet); + --button-color-sidebar: var(--red); + --lcars-bar-color: var(--african-violet); + --lcars-bar-start-color: var(--moonlit-violet); + --lcars-bar-end-color: var(--moonlit-violet); + --lcars-bar-text-color: var(--golden-orange); + +/* Image Frame */ + + --image-border-color: var(--almond-creme); + --primary-color: var(--orange); + --secondary-color: var(--moonlit-violet); + --accent-color: var(--almond-creme); + --title-color: var(--almond-creme); + --spacers: .65rem; + --frame-height: 40px; +} + +@media (max-width: 1500px) { + :root { + --lfw: 200px; + --radius-top: 0 0 0 130px; + --radius-bottom: 130px 0 0 0; + --divider-height: .4rem; + --nav-width: 210px; + --dc-font-size: .75rem; + --bar-height: 24px; + } +} + +@media (max-width: 1300px) { + :root { + font-size: 1.2rem; + --sub-fonts: .9rem; + --lfw: 180px; + --nav-width: 180px; + --radius-top: 0 0 0 100px; + --radius-bottom: 100px 0 0 0; + --radius-content-top: 0 0 0 40px; + --radius-content-bottom: 40px 0 0 0; + --bar-height: 20px; + } +} + +@media (max-width: 950px) { + :root { + --lfw: 150px; + } +} + +@media (max-width: 750px) { + :root { + --panel-border: .25rem solid black; + --bar-border: .25rem solid black; + --lfw: 120px; + --radius-top: 0 0 0 80px; + --radius-bottom: 80px 0 0 0; + --radius-content-top: 0 0 0 34px; + --radius-content-bottom: 34px 0 0 0; + --nav-width: 174px; + --bar-height: 16px; + --spacers: .5rem; + --frame-height: 25px; + } +} + +@media (max-width: 525px) { + :root { + --lfw: 62px; + --left-frame-padding: .5rem; + --radius-top: 0 0 0 40px; + --radius-bottom: 40px 0 0 0; + --bar-height: 10px; + --divider-height: .3rem; + } +} + +@media (max-width: 450px) { + :root { + --nav-width: 48%; + } +} + +*, *:after, *:before { + box-sizing: border-box; +} + +* { + margin: 0; + padding: 0; + font: inherit; +} + +img { + display: block; + max-width: 100%; + height: auto; +} + +input, textarea, button, select { + font: inherit; +} + +@font-face { + font-family: 'Antonio'; + font-weight: 400; + src: url('Antonio-Regular.woff2') format('woff2'), + url('Antonio-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Antonio'; + font-weight: 700; + src: url('Antonio-Bold.woff2') format('woff2'), + url('Antonio-Bold.woff') format('woff') +} + +html { + scroll-behavior: smooth; +} + +body { + display: flex; + padding-top: 10px; + padding-left: 5px; + background-color: black; + font-family: 'Antonio', 'Arial Narrow', 'Avenir Next Condensed', sans-serif; + font-weight: 400; + line-height: 1.5; + color: var(--font-color); +} + +a { + text-decoration: underline; + text-decoration-thickness: 2px; + text-underline-offset: .2rem; + color: var(--link-color); +} + +a:hover { + filter: brightness(115%); + animation: none; +} + +a:active { + filter: brightness(80%); + outline: none; +} + +button { + border: none; + outline: none; + color: black; + transition: width 1s; +} + +button:hover { + cursor: pointer; + animation: none; + filter: brightness(115%); + color: black; +} + +button:active { + filter: brightness(85%); +} + +/* Ultra Layout elements */ + +.wrap-everything { + display: flex; + width: 100%; + column-gap: 10px; +} + +.wrap-standard { + width: 100%; +} + +#column-1 { + width: 350px; + padding: 10px 10px 10px 20px; + transition: 800ms; +} + +#column-2 { + width: var(--lfw); + background-color: var(--section-2-color); + text-align: right; + font-weight: bold; + line-height: 1.2; + color: black; + transition: 800ms; + z-index: 2; +} + +#column-2 a { + color: black; + text-decoration: none; +} + +#column-3 { + flex: 1; + margin-inline: auto; +} + +.wrap { + display: flex; + margin-inline: auto; + padding-left: 5px; + padding-right: 15px; + overflow: hidden; +} + +@media (max-width: 1680px) { + #column-1 { + margin-left: -370px; + } + + #column-2 { + margin-left: -230px; + } + + .wrap-everything { + column-gap: 5px; + } +} + +@media (max-width: 1500px) { + #column-1, + #column-2 { + display: none; + } +} + +.lcars-frame { + display: flex; + min-height: 280px; + position: relative; + --frame-color: var(--african-violet); +} + +.frame-col-1 { + width: 20px; + height: 280px; + background: var(--frame-color); + border-radius: 16px 0 0 16px; + position: relative; +} + +.frame-col-1:before { + content: ''; + display: block; + width: 20px; + height: 200px; + border-top: 5px solid black; + border-bottom: 5px solid black; + background-color: var(--frame-color); + position: absolute; + top: 40px; + left: 0; +} + +.frame-col-1-cell-a { + width: 14px; + height: 65px; + background-color: var(--tomato); + border-left: 4px solid black; + border-bottom: 4px solid black; + position: absolute; + top: 45px; + right: 0; + z-index: 2; +} + +.frame-col-1-cell-b { + width: 14px; + height: 70px; + background-color: var(--bluey); + border-left: 4px solid black; + position: absolute; + top: 110px; + right: 0; + z-index: 2; +} + +.frame-col-1-cell-c { + width: 14px; + height: 65px; + background-color: var(--orange); + border-top: 4px solid black; + border-left: 4px solid black; + position: absolute; + bottom: 45px; + right: 0; + z-index: 2; +} + +.frame-col-1-blocks:before { + content: ''; + display: block; + width: 10px; + height: 3px; + background-color: black; + position: absolute; + top: 54px; + left: 0; +} + +.frame-col-2 { + width:20px; + height: 280px; + background-color: var(--frame-color); + position: relative; +} + +.frame-col-2:before { + content: ''; + display: block; + width: 20px; + height: 240px; + background-color: black; + border-radius: 10px 0 0 10px; + position: absolute; + top: 20px; + left: 0; +} + +.frame-col-3 { + display: flex; + width: 240px; + height: 280px; + align-items: center; + justify-content: center; +} + +.frame-col-4 { + width:20px; + height: 280px; + background-color: var(--frame-color); + position: relative; +} + +.frame-col-4:before { + content: ''; + display: block; + width: 20px; + height: 240px; + background-color: black; + border-radius: 0 10px 10px 0; + position: absolute; + top: 20px; + left: 0; +} + +.display-horizontal { + rotate: 90deg; +} + +.frame-col-5 { + width:20px; + height: 280px; + background-color: var(--frame-color); + border-radius: 0 16px 16px 0; + padding-top: 40px; + position: relative; +} + +.frame-col-5:before { + content: ''; + display: block; + width: 20px; + height: 200px; + border-top: 5px solid black; + border-bottom: 5px solid black; + background-color: var(--frame-color); +} + +.frame-col-5-cell-a { + width: 14px; + height: 65px; + background-color: var(--lilac); + border-bottom: 4px solid black; + border-right: 4px solid black; + position: absolute; + top: 45px; + left: 0; + z-index: 2; +} + +.frame-col-5-cell-b { + width: 14px; + height: 70px; + background-color: var(--violet-creme); + border-right: 4px solid black; + position: absolute; + top: 110px; + left: 0; + z-index: 2; +} + +.frame-col-5-cell-c { + width: 14px; + height: 65px; + background-color: var(--moonlit-violet); + border-top: 4px solid black; + border-right: 4px solid black; + position: absolute; + bottom: 45px; + left: 0; + z-index: 2; +} + +.line { + height: 20px; + width: 12px; + background: linear-gradient(#600, var(--mars), #600); +} + +.line:nth-child(1) { + animation: animateLine6 1s 0.2s infinite; +} + +.line:nth-child(2) { + animation: animateLine5 1s 0.3s infinite; +} + +.line:nth-child(3) { + animation: animateLine3 1s 0.4s infinite; +} + +.line:nth-child(4) { + animation: animateLine3 1s 0.5s infinite; +} + +.line:nth-child(5) { + animation: animateLine2 1s 0.6s infinite; +} + +.line:nth-child(6) { + animation: animateLine2 1s 0.7s infinite; +} + +.line:nth-child(7) { + animation: animateLine2 1s 0.8s infinite; +} + +/* 8 & 9 are middle lines*/ + +.line:nth-child(8) { + animation: animateLine4 1s 0.9s infinite; +} + +.line:nth-child(9) { + animation: animateLine4 1s 1s infinite; +} + +.line:nth-child(10) { + animation: animateLine2 1s 0.8s infinite; +} + +.line:nth-child(11) { + animation: animateLine2 1s 0.7s infinite; +} + +.line:nth-child(12) { + animation: animateLine2 1s 0.6s infinite; +} + +.line:nth-child(13) { + animation: animateLine3 1s 0.5s infinite; +} + +.line:nth-child(14) { + animation: animateLine3 1s 0.4s infinite; +} + +.line:nth-child(15) { + animation: animateLine5 1s 0.3s infinite; +} + +.line:nth-child(16) { + animation: animateLine6 1s 0.2s infinite; +} + +@keyframes animateLine2 { + 0% { + height: 180px; + } + 50% { + height: 90px; + } + 100% { + height: 180px; + } +} + +@keyframes animateLine3 { + 0% { + height: 120px; + } + 50% { + height: 60px; + } + 100% { + height: 120px; + } +} + +@keyframes animateLine4 { + 0% { + height: 230px; + } + 50% { + height: 115px; + } + 100% { + height: 230px; + } +} + +@keyframes animateLine5 { + 0% { + height: 60px; + } + 50% { + height: 30px; + } + 100% { + height: 60px; + } +} + +@keyframes animateLine6 { + 0% { + height: 30px; + } + 50% { + height: 15px; + } + 100% { + height: 30px; + } +} + +.pillbox, +.pillbox-2 { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 8px; + margin: 1.25rem auto; + text-align: right; + font-size: var(--sub-fonts); +} + +.pill, +.pill-2 { + display: flex; + width: 100%; + height: 56px; + justify-content: flex-end; + align-items: flex-end; + text-decoration: none; + color: black; + font-weight: bold; + padding-right: .75rem; + padding-bottom: .35rem; +} + +.pillbox a { + display: flex; + width: 100%; + height: 56px; + justify-content: flex-end; + align-items: flex-end; + text-decoration: none; + color: black; + font-weight: bold; + padding-right: .75rem; + padding-bottom: .35rem; +} + +.pillbox-2 a { + display: flex; + width: 100%; + height: 56px; + justify-content: flex-end; + align-items: flex-end; + text-decoration: none; + color: black; + font-weight: bold; + padding-right: .75rem; + padding-bottom: .35rem; +} + +.pill:hover, +.pill-2:hover { + filter: brightness(115%); +} + +.pill:active, +.pill-2:active { + filter: brightness(80%); +} + +.pill:nth-child(1), +.pillbox a:nth-child(1) { + border-radius: 100vmax 0 0 100vmax; + background-color: var(--pill-1-color); +} + +.pill:nth-child(2), +.pillbox a:nth-child(2) { + background-color: var(--pill-2-color); +} + +.pill:nth-child(3), +.pillbox a:nth-child(3) { + border-radius: 100vmax 0 0 100vmax; + background-color: var(--pill-3-color); +} + +.pill:nth-child(4), +.pillbox a:nth-child(4) { + background-color: var(--pill-4-color); +} + +.pill:nth-child(5), +.pillbox a:nth-child(5) { + background-color: var(--pill-5-color); + border-radius: 100vmax 0 0 100vmax; +} + +.pill:nth-child(6), +.pillbox a:nth-child(6) { + background-color: var(--pill-6-color); +} + +.pill-2:nth-child(1), +.pillbox-2 a:nth-child(1) { + border-radius: 100vmax 0 0 100vmax; + background-color: var(--pill-a1-color); +} + +.pill-2:nth-child(2), +.pillbox-2 a:nth-child(2) { + background-color: var(--pill-a2-color); + border-radius: 0 100vmax 100vmax 0; + padding-right: 1rem; +} + +.pill-2:nth-child(3), +.pillbox-2 a:nth-child(3) { + background-color: var(--pill-a3-color); +} + +.pill-2:nth-child(4), +.pillbox-2 a:nth-child(4) { + background-color: var(--pill-a4-color); + border-radius: 0 100vmax 100vmax 0; + padding-right: 1rem; +} + +.pill-2:nth-child(5), +.pillbox-2 a:nth-child(5) { + background-color: var(--pill-a5-color); + border-radius: 100vmax 0 0 100vmax; +} + +.pill-2:nth-child(6), +.pillbox-2 a:nth-child(6) { + background-color: var(--pill-a6-color); + border-radius: 0 100vmax 100vmax 0; + padding-right: 1rem; +} + +.lcars-list-2 ul { + list-style: none; +} + +.lcars-list-2 { + margin: 0 auto 50px auto; + padding-left: 5px; +} + +.lcars-list-2 li { + position: relative; + padding-bottom: 5px; + padding-left: 38px; + font-size: var(--sub-fonts); + color: var(--orange); +} + +.lcars-list-2 li::before { + content: ''; + display: block; + width: 24px; + height: 14px; + border-radius: 50%; + background-color: var(--orange); + position: absolute; + top: 8px; + left: 0; +} + +.panel-11 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 27vh; + max-height: 275px; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-11-color); + border-bottom: var(--panel-border); +} + + +.panel-12 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 34vh; + max-height: 350px; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-12-color); + border-bottom: var(--panel-border); +} + +.panel-13 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 20vh; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-13-color); + border-bottom: var(--panel-border); +} + +.panel-14 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 20vh; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-14-color); + border-bottom: var(--panel-border); +} + +.panel-15 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 20vh; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-15-color); + border-bottom: var(--panel-border); +} + +.section-2-buttons a { + display: block; + text-decoration: none; + text-align: right; + border-bottom: var(--panel-border); + padding: 1.5rem .75rem .75rem 2px; + background-color: var(--section-2-color); + text-transform: uppercase; + color: black; +} + +.section-2-buttons a:nth-child(2) { + background-color: var(--butterscotch); +} + +.section-2-buttons a:nth-child(3) { + background-color: var(--african-violet); +} + +/* End Ultra layout elements */ + +.scroll-top { + display: none; +} + +.left-frame-top, +.left-frame { + width: var(--lfw); + text-align: right; + font-size: clamp(.875rem, 2vw, 1rem); + line-height: 1.2; + font-weight: bold; + color: black; + transition: width 1s; +} + +.left-frame-top { + background-color: var(--left-frame-top-color); + border-radius: var(--radius-top); +} + +.left-frame-top a, +.left-frame a { + text-decoration: none; + color: black; +} + +.left-frame { + display: flex; + flex-direction: column; + justify-content: space-between; + padding-top: 100px; + background-color: var(--left-frame-color); + border-radius: var(--radius-bottom); +} + +.right-frame-top { + flex: 1; + align-content: flex-end; + position: relative; +} + +.right-frame-top:before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to top right, var(--corner-color-top) 50%, black 50%); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +.right-frame-top:after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-top); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +@media (max-width: 650px) { + .right-frame-top:before { + bottom: 16px; + } + + .right-frame-top:after { + bottom: 16px; + } +} + +@media (max-width: 525px) { + .right-frame-top:before { + bottom: 10px; + } + + .right-frame-top:after { + bottom: 10px; + } +} + +.banner { + padding-bottom: 1rem; + padding-left: 5px; + text-align: right; + text-transform: uppercase; + line-height: 1.1; + font-size: clamp(1.25rem, 0.75rem + 4vw, 4rem); + color: var(--banner-color); +} + +.banner a { + color: var(--banner-color); + text-decoration: none; +} + +.data-cascade-button-group { + display: flex; + justify-content: flex-end; + align-items: flex-start; + flex-wrap: wrap; +} + +.header-content { + flex: 1; + min-height: 180px; + padding-right: .5rem; + padding-left: clamp(20px, 3vw, 50px); +} + +.header-content > *:first-child { + margin-top: 0; +} + +.header-content > *:last-child { + margin-bottom: 0; +} + +/* Data Cascade 2025 */ + +.data-cascade-wrapper { + flex: 1; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + max-width: 100%; + height: calc(var(--dc-row-height) * 9); /* 204px */ + overflow: hidden; + padding-right: .5rem; + padding-left: clamp(20px, 3vw, 50px); + column-gap: .5rem; +} + +.data-column { + display: grid; + grid-template-columns: 1fr; + margin-top: 1px; + text-align: right; + font-size: var(--dc-font-size); /* .938 */ + line-height: 1; + color: black; +} + +.dc-row-1, +.dc-row-2, +.dc-row-3, +.dc-row-4, +.dc-row-5, +.dc-row-6, +.dc-row-7 { + text-box: trim-both cap alphabetic; + height: var(--dc-row-height); +} + +@media (max-width: 780px) { + .data-cascade-wrapper { + display: none; + } +} + +@keyframes data-group-1 { + + 0%, + 3.99% { + color: black; + } + + 4%, + 45.99% { + color: var(--data-cascade-color); + } + + 46%, + 49.99% { + color: var(--light-color); + } + + 50%, + 63.99% { + color: var(--data-cascade-color); + } + + 64%, + 67.99% { + color: var(--light-color); + } + + 68%, + 100% { + color: var(--data-cascade-color); + } +} + +@keyframes data-group-1a { + + 0%, + 4.99% { + color: black; + } + + 5%, + 45.99% { + color: var(--data-cascade-color); + } + + 46%, + 49.99% { + color: var(--light-color); + } + + 50%, + 63.99% { + color: var(--data-cascade-color); + } + + 64%, + 67.99% { + color: var(--light-color); + } + + 68%, + 100% { + color: var(--data-cascade-color); + } +} + +@keyframes data-group-2 { + + 0%, + 12.99% { + color: black; + } + + 13%, + 49.99% { + color: var(--data-cascade-color); + } + + 50%, + 53.99% { + color: var(--light-color); + } + + 54%, + 67.99% { + color: var(--data-cascade-color); + } + + 68%, + 71.99% { + color: var(--light-color); + } + + 72%, + 100% { + color: var(--data-cascade-color); + } +} + +@keyframes data-group-2b { + + 0%, + 14.99% { + color: black; + } + + 15%, + 49.99% { + color: var(--data-cascade-color); + } + + 50%, + 53.99% { + color: var(--light-color); + } + + 54%, + 67.99% { + color: var(--data-cascade-color); + } + + 68%, + 71.99% { + color: var(--light-color); + } + + 72%, + 81.99% { + color: var(--data-cascade-color); + } + + 82%, + 100% { + color: var(--light-color); + } +} + +@keyframes data-group-3 { + + 0%, + 26.99% { + color: black; + } + + 27%, + 40.99% { + color: var(--light-color); + } + + 41%, + 53.99% { + color: var(--data-cascade-color); + } + + 54%, + 57.99% { + color: var(--light-color); + } + + 58%, + 71.99% { + color: var(--data-cascade-color); + } + + 72%, + 75.99% { + color: var(--light-color); + } + + 76%, + 100% { + color: var(--data-cascade-color); + } +} + +.dc-row-1 { + animation: data-group-1 6000ms ease 200ms infinite; +} + +.dc-row-2 { + animation: data-group-1a 6000ms ease 200ms infinite; +} + +.dc-row-3 { + animation: data-group-2 6000ms ease 200ms infinite; +} + +.dc-row-4 { + animation: data-group-2b 6000ms ease 200ms infinite; +} + +.dc-row-5 { + animation: data-group-3 6000ms ease 200ms infinite; +} + +.dc-row-6 { + animation: data-group-3 6000ms ease 200ms infinite; +} + +.dc-row-7 { + animation: data-group-3 6000ms ease 200ms infinite; +} + +/* Static data cascade */ + +.data-cascade-wrapper#frozen .dc-row-1 { + animation: none; + color: var(--orange); +} + +.data-cascade-wrapper#frozen .dc-row-2 { + animation: none; + color: var(--orange); +} + +.data-cascade-wrapper#frozen .dc-row-3 { + animation: none; + color: var(--orange); +} + +.data-cascade-wrapper#frozen .dc-row-4 { + animation: none; + color: var(--orange); +} + +.data-cascade-wrapper#frozen .dc-row-5 { + animation: none; + color: var(--light-color); +} + +.data-cascade-wrapper#frozen .dc-row-6 { + animation: none; + color: var(--light-color); +} + +.data-cascade-wrapper#frozen .dc-row-7 { + animation: none; + color: var(--light-color); +} + +/* Navigation & buttons */ + +.lcars-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + margin-block: 1rem; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1 a { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + height: clamp(90px, 11vw, 160px); + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + transition: width 1s; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1-button { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + min-height: clamp(90px, 11vw, 160px); + overflow: hidden; + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +nav { + display: flex; + flex-wrap: wrap; + align-self: center; + width: calc(var(--nav-width) + var(--nav-width) + 1rem); + justify-content: flex-end; + column-gap: .5rem; + row-gap: .65rem; +} + +@media (max-width: 1500px) { + nav { + column-gap: .375rem; + row-gap: .5rem; + } +} + +@media (max-width: 1440px) { + .data-cascade-button-group:has(.header-content) { + row-gap: 1rem; + } + + .data-cascade-button-group:has(.header-content) > nav { + width: 100%; + } +} + +nav a, +nav button, +.buttons button { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: flex-end; + width: var(--nav-width); + height: calc(var(--nav-width) / 2.8); + padding-inline: 1.5rem; + padding-bottom: .7rem; + border-radius: 100vmax; + background-color: var(--button-color); + text-align: right; + line-height: 1.175; + text-decoration: none; + text-transform: uppercase; + font-weight: bold; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +nav a:nth-child(1), +nav button:nth-child(1) { + background-color: var(--nav-1-color); +} + +nav a:nth-child(2), +nav button:nth-child(2) { + background-color: var(--nav-2-color); +} + +nav a:nth-child(3), +nav button:nth-child(3) { + background-color: var(--nav-3-color); +} + +nav a:nth-child(4), +nav button:nth-child(4) { + background-color: var(--nav-4-color); +} + +@media (max-width: 1300px) { + nav { + padding-left: .5rem; + gap: .5rem; + } + + nav button { + padding-bottom: .5rem; + font-size: .875rem; + padding-inline: 1.25rem; + } +} + +@media (max-width: 780px) { + nav { + flex: 1; + } + + .data-cascade-button-group:has(.header-content) > *:nth-child(2) { + flex: none; + } +} + +@media (max-width: 450px) { + nav a, + nav button { + height: 63px; + } +} + +.buttons { + display: flex; + flex-wrap: wrap; + gap: .5rem; + margin-block: 2rem; +} + +.justify-space-between { + justify-content: space-between; +} + +.justify-center { + justify-content: center; +} + +.justify-flex-end { + justify-content: flex-end; +} + +.justify-space-around { + justify-content: space-around; +} + +.justify-space-evenly { + justify-content: space-evenly; +} + +.buttons a, +.buttons button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.sidebar-nav button, +.sidebar-nav a, +.sidebar-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + min-height: 3.75rem; + width: var(--lfw); + background-color: var(--button-color-sidebar); + border-radius: 0; + border-bottom: var(--panel-border); + padding: var(--left-frame-padding); + text-decoration: none; + text-align: right; + word-break: break-all; + text-transform: uppercase; + color: black; +} + +@media (max-width: 1300px) { + .lcars-button, + .buttons a, + .buttons button { + width: 200px; + height: 74px; + } +} + +.panel-button { + display: flex; + justify-content: flex-end; + width: var(--lfw); + border-radius: 0; + padding: var(--left-frame-padding); + border-bottom: var(--panel-border); +} + +.pan-0 /* use this if you're not mimicking an established panel */ { + height: 18vh; + max-height: 240px; + background-color: var(--button-color-sidebar); +} + +.pan-4 { + height: 22vh; + max-height: 300px; + background-color: var(--panel-4-color) !important; +} + +.pan-5 { + height: 4.25rem; + background-color: var(--panel-5-color) !important; + align-items: center; +} + +.pan-6 { + height: 29vh; + max-height: 360px; + background-color: var(--panel-6-color) !important; +} + +.pan-7 { + height: 27vh; + max-height: 350px; + background-color: var(--panel-7-color) !important; +} + +.pan-8 { + height: 15vh; + background-color: var(--panel-8-color) !important; +} + +.pan-10 { + height: 30vh; + background-color: var(--panel-10-color) !important; +} + +.text-bottom { + align-items: flex-end; +} + +#topBtn { + display: none; + position: fixed; + bottom: 0; + z-index: 99; + border-radius: 0; + border-top: var(--panel-border); + border-right: none; + border-bottom: var(--panel-border); + border-left: none; + outline: none; + width: var(--lfw); + padding: var(--left-frame-padding); + padding-bottom: 10vh; + background-color: var(--panel-top-button-color); + text-align: right; + line-height: 1; + font-weight: bold; + text-transform: uppercase; + color: black; + cursor: pointer; +} + +#topBtn:hover { + filter: brightness(115%); +} + +#topBtn:active { + filter: brightness(80%); +} + +@media (max-width: 525px) { + .sidebar-button, + .sidebar-nav a, + .sidebar-nav button, + .panel-button { + font-size: .75rem; + } + + #topBtn { + padding-bottom: 6vh; + } +} + +/* --- Horizontal bar panels & sidebar panels --- */ + +.bar-panel { + display: flex; + height: var(--bar-height); +} + +.first-bar-panel { + margin-top: clamp(15px, 2vw, 30px); +} + +.bar-1, +.bar-2, +.bar-3, +.bar-4, +.bar-5, +.bar-6, +.bar-7, +.bar-9, +.bar-10 { + height: var(--bar-height); +} + +.bar-1, +.bar-2, +.bar-3, +.bar-4, +.bar-6, +.bar-7, +.bar-8, +.bar-9 { + border-right: var(--bar-border); +} + +.bar-1 { + width: var(--bar-1-6-width); + background-color: var(--bar-1-color); +} + +.bar-2 { + width: var(--bar-2-7-width); + background-color: var(--bar-2-color); +} + +.bar-3 { + width: var(--bar-3-8-width); + background-color: var(--bar-3-color); +} + +.bar-4 { + flex: 1; + background-color: var(--bar-4-color); +} + +.bar-5 { + width: var(--bar-5-10-width); + background-color: var(--bar-5-color); +} + +.bar-6 { + width: var(--bar-1-6-width); + background-color: var(--bar-6-color); +} + +.bar-7 { + width: var(--bar-2-7-width); + background-color: var(--bar-7-color); +} + +.bar-8 { + width: var(--bar-3-8-width); + height: 50%; + background-color: var(--bar-8-color); +} + +.bar-9 { + flex: 1; + background-color: var(--bar-9-color); +} + +.bar-10 { + width: var(--bar-5-10-width); + background-color: var(--bar-10-color); +} + +#gap { + margin-top: var(--divider-height); +} + +.panel-3, +.panel-4, +.panel-5, +.panel-6, +.panel-7, +.panel-8 { + border-bottom: var(--panel-border); +} + +.panel-2, +.panel-3, +.panel-4, +.panel-6, +.panel-7, +.panel-8, +.panel-10 { + padding: var(--left-frame-padding); +} + +.panel-4 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 22vh; + max-height: 300px; + background-color: var(--panel-4-color); +} + +.panel-5 { + display: flex; + justify-content: flex-end; + align-items: center; + height: 4.25rem; + padding: var(--left-frame-padding); + background-color: var(--panel-5-color); +} + +.panel-6 { + height: 29vh; + max-height: 360px; + background-color: var(--panel-6-color); +} + +.panel-7 { + height: 27vh; + max-height: 350px; + background-color: var(--panel-7-color); +} + +.panel-8 { + height: 15vh; + background-color: var(--panel-8-color); +} + +/* Note: panel-9 height is fluid and governed by the amount of content on the page. Background color is inherited from :root --left-frame-color */ + +.panel-9 { + min-height: 27vh; + padding: var(--left-frame-padding); +} + +.panel-10 { + height: 30vh; + border-top: var(--panel-border); + background-color: var(--panel-10-color); +} + +@media (max-width: 525px) { + .panel-4, + .panel-6, + .panel-7 { + height: 18vh; + } +} + +.right-frame { + flex: 1; + position: relative; +} + +.right-frame::before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to bottom right, var(--corner-color-bottom) 50%, black 50%); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +.right-frame::after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-bottom); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +main { + padding-top: 1.5rem; + padding-bottom: .5rem; + padding-left: clamp(20px, 3vw, 50px); +} + +main > *:first-child, +article > *:first-child { + margin-top: 0; +} + +main:has(.floor-heading) > *:nth-child(2) { + margin-top: 0; +} + +@media (max-width: 1400px) { + main { + padding-top: 1rem; + } +} + +.flexbox { + display: flex; + gap: 2vw; + flex-wrap: wrap; +} + +.col { + flex: 1 1 360px; +} + +.col > *:first-child { + margin-top: 0; +} + +h1, h2, h3, h4 { + margin-block: 1.75rem; + font-weight: normal; + line-height: 1.2; + text-transform: uppercase; + text-box: trim-both cap alphabetic; +} + +h1 { + font-size: clamp(1.5rem, 1.25rem + 3.5vw, 4rem); + text-align: right; + color: var(--h1-color); +} + +h2 { + font-size: clamp(1.4rem, 1.1rem + 2.25vw, 2.3rem); + color: var(--h2-color); +} + +h3 { + font-size: clamp(1.15rem, 1.05rem + 1.25vw, 1.875rem); + color: var(--h3-color); +} + +h4 { + font-size: clamp(1.025rem, 1rem + 1.125vw, 1.575rem); + color: var(--h4-color); +} + +.floor-heading { + display: flex; + justify-content: flex-end; + width: 100%; + position: fixed; + left: 50%; + transform: translate(-50%, 0); + bottom: 10px; + z-index:4; +} + +.floor-heading > * { + margin-block: 0; + width: fit-content; + padding-inline: .5rem; + padding-bottom: .5rem; + background-color: black; +} + +p { + margin-block: 1.75rem; + text-box: trim-both cap alphabetic; +} + +.caption { + margin-top: -1rem; + margin-bottom: 2.75rem; + text-align: center; + font-size: var(--sub-fonts); +} + +.pics-right .caption, +.pics-left .caption { + margin-top: 1rem; +} + +.indent { + padding-left: 1.5rem; +} + +.postmeta { + margin-block: 1.25rem; + text-align: right; + font-size: clamp(1.2rem, 0.88rem + 1.28vw, 1.6rem); + line-height: 1.2; + text-transform: uppercase; +} + +article h1 { + margin-bottom: 0; +} + +hr { + margin-block: 1.5rem; + height: 6px; + border: none; + background-color: var(--font-color); + border-radius: 3px; +} + +blockquote { + margin-block: 1.75rem; + margin-left: 1.5rem; + padding-block: .25rem; + padding-left: 1.5rem; + position: relative; + text-box: trim-both cap alphabetic; +} + +blockquote::before { + content: ''; + display: block; + width: 10px; + height: 100%; + background-color: var(--font-color); + border-radius: 5px; + position: absolute; + left: 0; + top: 0; +} + +blockquote > *:first-child { + margin-top: 0; +} + +blockquote > * { + margin-bottom: 0; +} + +iframe { + display: block; + width: 100%; + border: none; +} + +.flush { + margin-top: -1rem; +} + +.nomar { + margin-block: 0 !important; +} + +.go-center { + text-align: center !important; +} + +.go-right { + text-align: right !important; +} + +.go-left { + text-align: left !important; +} + +.go-big { + font-size: clamp(1.2rem, 1rem + 1vw, 1.275rem); +} + +.uppercase { + text-transform: uppercase; +} + +.strike { + text-decoration: line-through; + text-decoration-thickness: .15rem; +} + +.now { + white-space: nowrap; +} + +.big-sky { + margin-top: 5rem; +} + +.smoke-glass { + opacity: .35; +} + +strong { + font-weight: bold; +} + +code { + font-family: monospace; + font-size: .9rem; + color: var(--code-color); +} + +.code { + width: 100%; + min-height: 5rem; + padding-block: .5rem; + padding-inline: 1rem; + background-color: black; + border-color: var(--code-color); + tab-size: 4; + font-family: monospace; + font-size: .85rem; + color: var(--code-color); +} + +::selection { + background-color: var(--orange); + color: black; +} + +@keyframes blink { + 0% {opacity: 0} + 49%{opacity: 0} + 50% {opacity: 1} +} + +.blink-slow { + animation: blink 3500ms infinite; +} + +.blink { + animation: blink 2s infinite; +} + +.blink-fast { + animation: blink 1s infinite; +} + +@keyframes pulse { + 0% {filter: brightness(1.0)} + 50% {filter: brightness(.25)} +} + +.pulse { + animation: pulse 2s infinite; +} + +.pulse-rate-high { + animation: pulse 1s infinite; +} + +.pulse-rate-low { + animation: pulse 3s infinite; +} + +/* Accordion Dropdown */ + +.accordion-wrapper { + display: block; + margin: 1.75rem auto; + width: 100%; +} + +.limit-width { + max-width: 1240px; +} + +.accordion { + display: flex; + align-items: center; + min-height: 3rem; + width: 100%; + padding-right: 2.75rem; + padding-left: 1rem; + border-radius: 100vmax; + background-color: var(--african-violet); + border-left: solid 3rem var(--moonlit-violet); + text-align: left; + font-size: 1.25rem; + color: black; + cursor: pointer; + transition: 0.4s ease; + position: relative; +} + +.active, .accordion:hover { + background-color: var(--violet-creme); + border-left-color: var(--orange); + filter: none; +} + +.accordion:before { + content: ''; + display: block; + width: .5rem; + height: 4rem; + background-color: black; + position: absolute; + top: 0; + left: 0; +} + +.accordion:after { + display: block; + content: '\276F'; + position: absolute; + right: 1.5rem; + top: 21%; + transform: rotate(90deg); + transition: 0.4s; + font-weight: bold; + color: black; +} + +.active:after { + content: "\276F"; + transform:rotate(-90deg); + transition: 0.4s ease; +} + +.accordionContent { + padding-block: .5rem; + padding-inline: 3.5rem; + max-height: 0; + overflow: hidden; + transition: max-height 0.25s ease-out; +} + +.accordionContent ul { + margin-left: 0; +} + +@media (max-width: 525px) { + .accordion { + min-height: 2.5rem; + font-size: 1rem; + border-left-width: 2.5rem; + } +} + +/* Images */ + +.pics-right { + float: right; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; + clear: both; +} + +.pics-left { + float: left; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; +} + +@media (max-width: 1060px) { + .pics-right, + .pics-left { + float: none; + margin-inline: auto; + } + + .pics-right img, + .pics-left img { + margin-inline: auto; + } +} + +.pics { + margin-block: 2rem; + margin-inline: auto; +} + +.border { + border: 2px solid var(--font-color); +} + +/* + +Gallery + +NOTE: Gallery is experimental and still under development. + +*/ + +.gallery { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: .75rem; + list-style: none; + text-align: center; + font-size: .875rem; +} + +.gallery img { + align-self: flex-start; + border: 4px solid black; +} + +.gallery li div { + padding-block: .6rem; + text-box: trim-both cap alphabetic; +} + +.thumbs img { + width: 340px; +} + +.gallery a { + align-self: flex-start; +} + +.gallery a img:hover { + border-color: var(--font-color); +} + +.lcars-list { + margin-block: 1.15rem; + margin-left: 2rem; + list-style: none; +} + +.lcars-list li { + position: relative; + padding-block: .45rem; + padding-left: 2.25rem; + text-box: trim-both cap alphabetic; +} + +.lcars-list li::before { + content: ''; + display: block; + width: 34px; + height: 18px; + border-radius: 50%; + background-color: var(--font-color); + position: absolute; + top: .45rem; + left: 0; +} + +@media (max-width: 650px) { + .lcars-list { + margin-left: .5rem; + } + + .lcars-list li::before { + transform: scale(90%); + } +} + +.lcars-bar { + margin-block: 1.75rem; + height: clamp(15px, 2vh, 25px); + background: transparent; + border-right: clamp(15px, 2vh, 25px) solid var(--lcars-bar-end-color); + border-left: clamp(15px, 2vh, 25px) solid var(--lcars-bar-start-color); + border-radius: 100vmax; + position: relative; +} + +.lcars-bar::after { + content: ''; + display: block; + height: clamp(15px, 2vh, 25px); + width: 100%; + background-color: var(--lcars-bar-color); + border-right: .8vh solid black; + border-left: .8vh solid black; + position: absolute; + top: 0; + left: 0; +} + +.lcars-text-bar { + display: flex; + position: relative; + height: clamp(16px, 4vh, 41px); + margin-block: 2.75rem; + overflow: visible; + border-radius: 100vmax; + background-color: var(--lcars-bar-color); + border-right: clamp(16px, 4vh, 43px) solid var(--lcars-bar-end-color); + border-left: clamp(16px, 4vh, 43px) solid var(--lcars-bar-start-color); +} + +.the-end { + justify-content: flex-end; +} + +.lcars-text-bar h2, +.lcars-text-bar h3, +.lcars-text-bar h4, +.lcars-text-bar span { + margin-block: 0; + background-color: black; + height: clamp(20px, 5.5vh, 60px); /* Setting height is a Firefox fix */ + overflow: visible; + border-top: 1px solid black; + padding-inline: 1vh; + font-size: clamp(17px, 4.5vh, 46px); + line-height: 1; + text-transform: uppercase; + color: var(--lcars-bar-text-color); + z-index: 1; + text-box: trim-both cap alphabetic; +} + +.lcars-text-bar::before { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + left: 0; + overflow: hidden; +} + +.lcars-text-bar::after { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + right: 0; + overflow: hidden; +} + +/* Image Frame */ + +.image-frame { + display: block; + margin: 2.75rem auto; + width: fit-content; + background: linear-gradient(var(--primary-color) 56%, var(--secondary-color) 44%); + border-radius: 50px 25px 0 50px; + position: relative; +} + +.image-frame::before { + content: ''; + display: block; + width: 40px; + height: 40px; + background-color: black; + position: absolute; + right: 0; + top: 0; +} + +.image-frame::after { + content: ''; + display: block; + border-top: var(--spacers) solid black; + border-bottom: var(--spacers) solid black; + width: 45px; + height: 80px; + background-color: var(--secondary-color); + position: absolute; + left: 0; + top: 56%; +} + +.imgf-title { + display: flex; + justify-content: flex-end; + height: 40px; + border-right: 40px solid var(--secondary-color); + border-radius: 25px 100vh 100vh 0; + position: relative; + z-index: 1; + text-align: right; +} + +.h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + border-right: var(--spacers) solid black; +} + +.imgf-title h4 { + margin-block: 0; + width: fit-content; + background-color: black; + padding-left: var(--spacers); + font-size: 2.05rem; + color: var(--title-color); + line-height: 40px; + text-transform: uppercase; +} + +.imgf-image-body { + margin-left: 45px; + background-color: black; + width: fit-content; + padding: 1rem; + border-radius: 28px 0 0 28px; + +} + +.image-holder { + width: fit-content; + padding: 1rem; + border: 2px solid var(--image-border-color); + border-radius: 20px; +} + +.imgf-base { + display: grid; + grid-template-columns: 20% 13% 35px 15% 1fr; + margin-left: 80px; + border-left: var(--spacers) solid black; + +} + +.imgf-block-1 { + height: var(--frame-height); + background-color: var(--accent-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-2 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-3 { + height: var(--frame-height); + background-color: black; + border-right: 10px solid var(--secondary-color); + border-left: 10px solid var(--accent-color); +} + +.imgf-block-4 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-left: var(--spacers) solid black; +} + +.imgf-block-5 { + height: var(--frame-height); + background-color: black; +} + +@media (max-width: 750px) { + .image-frame { + border-radius: 40px 25px 0 40px; + } + + .image-frame::after { + width: 25px; + height: 60px; + top: 50%; + } + + .imgf-title { + height: 25px; + border-right: 24px solid var(--secondary-color); + } + + .h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + } + + .imgf-title h4 { + font-size: 1.45rem; + } + + .imgf-image-body { + margin-left: 25px; + padding: .75rem; + border-radius: 20px 0 0 20px; + } + + .image-holder { + padding: .75rem; + border-radius: 10px; + } +} + +/* color custom classes */ + +.font-african-violet { + color: var(--african-violet) !important; +} + +.button-african-violet, +.background-african-violet, +.bullet-african-violet { + background-color: var(--african-violet) !important; +} + +.font-almond { + color: var(--almond) !important; +} + +.button-almond, +.background-almond, +.bullet-almond::before { + background-color: var(--almond) !important; +} + +.font-almond-creme { + color: var(--almond-creme) !important; +} + +.button-almond-creme, +.background-almond-creme, +.bullet-almond-creme::before { + background-color: var(--almond-creme) !important; +} + +.font-blue { + color: var(--blue) !important; +} + +.button-blue, +.background-blue, +.bullet-blue::before { + background-color: var(--blue) !important; +} + +.font-bluey { + color: var(--bluey) !important; +} + +.button-bluey, +.background-bluey, +.bullet-bluey::before { + background-color: var(--bluey) !important; +} + +.font-butterscotch { + color: var(--butterscotch) !important; +} + +.button-butterscotch, +.background-butterscotch, +.bullet-butterscotch::before { + background-color: var(--butterscotch) !important; +} + +.font-gold { + color: var(--gold) !important; +} + +.button-gold, +.background-gold, +.bullet-gold::before { + background-color: var(--gold) !important; +} + +.font-golden-orange { + color: var(--golden-orange) !important; +} + +.button-golden-orange, +.background-golden-orange, +.bullet-golden-orange::before { + background-color: var(--golden-orange) !important; +} + +.font-gray { + color: var(--gray) !important; +} + +.button-gray, +.background-gray, +.bullet-gray::before { + background-color: var(--gray) !important; +} + +.font-green { + color: var(--green) !important; +} + +.button-green, +.background-green, +.bullet-green::before { + background-color: var(--green) !important; +} + +.font-ice { + color: var(--ice) !important; +} + +.button-ice, +.background-ice, +.bullet-ice::before { + background-color: var(--ice) !important; +} + +.font-lilac { + color: var(--lilac) !important; +} + +.button-lilac, +.background-lilac, +.bullet-lilac::before { + background-color: var(--lilac) !important; +} + +.font-lima-bean { + color: var(--lima-bean) !important; +} + +.button-lima-bean, +.background-lima-bean, +.bullet-lima-bean::before { + background-color: var(--lima-bean) !important; +} + +.font-magenta { + color: var(--magenta) !important; +} + +.button-magenta, +.background-magenta, +.bullet-magenta::before { + background-color: var(--magenta) !important; +} + +.font-mars { + color: var(--mars) !important; +} + +.button-mars, +.background-mars, +.bullet-mars::before { + background-color: var(--mars) !important; +} + +.font-moonlit-violet { + color: var(--moonlit-violet) !important; +} + +.button-moonlit-violet, +.background-moonlit-violet, +.bullet-moonlit-violet::before { + background-color: var(--moonlit-violet) !important; +} + +.font-orange { + color: var(--orange) !important; +} + +.button-orange, +.background-orange, +.bullet-orange::before { + background-color: var(--orange) !important; +} + +.font-peach { + color: var(--peach) !important; +} + +.button-peach, +.background-peach, +.bullet-peach::before { + background-color: var(--peach) !important; +} + +.font-red { + color: var(--red) !important; +} + +.button-red, +.background-red, +.bullet-red::before { + background-color: var(--red) !important; +} + +.font-sky { + color: var(--sky) !important; +} + +.button-sky, +.background-sky, +.bullet-sky::before { + background-color: var(--sky) !important; +} + +.font-space-white { + color: var(--space-white) !important; +} + +.button-space-white, +.background-space-white, +.bullet-space-white::before { + background-color: var(--space-white) !important; +} + +.font-sunflower { + color: var(--sunflower) !important; +} + +.button-sunflower, +.background-sunflower, +.bullet-sunflower::before { + background-color: var(--sunflower) !important; +} + +.font-tomato { + color: var(--tomato) !important; +} + +.button-tomato, +.background-tomato, +.bullet-tomato::before { + background-color: var(--tomato) !important; +} + +.font-violet-creme { + color: var(--violet-creme) !important; +} + +.button-violet-creme, +.background-violet-creme, +.bullet-violet-creme::before { + background-color: var(--violet-creme) !important; +} + +/* Footer */ + +footer { + margin-top: 2.5vw; + padding-bottom: 3rem; + padding-left: clamp(20px, 3vw, 50px); + font-size: .825rem; + --footer-bar-height: 1rem; +} + +footer:has(.footer-frame) { + font-size: inherit; +} + +.footer-frame { + display: grid; + grid-template-columns: 1fr var(--lfw); + align-items: center; + background: linear-gradient(var(--red) 50%, var(--bluey) 50%); + border-radius: 0 2rem 2rem 0; + padding-block: var(--footer-bar-height); + position: relative; +} + +.footer-frame::before { + content: ''; + display: block; + width: 20%; + height: calc(var(--footer-bar-height) / 2); + /*border-radius: 100vmax 0 0 100vmax;*/ + position: absolute; + left: 0; + top: calc(var(--footer-bar-height) + .5rem); + background-color: var(--red); + z-index: 1; +} + +.footer-frame::after { + content: ''; + display: block; + width: 20%; + height: calc(var(--footer-bar-height) / 2); + /*border-radius: 100vmax 0 0 100vmax;*/ + position: absolute; + left: 0; + bottom: var(--footer-bar-height); + background-color: var(--bluey); +} + +.footer-frame-content { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: black; + min-height: 250px; + border-radius: 0 1.5rem 1.5rem 0; + padding-block: 2.5rem; + padding-inline: 2rem; + position: relative; + text-align: center; +} + +.footer-frame-content::before { + content: ''; + display: block; + width: .25rem; + height: var(--footer-bar-height); + background-color: black; + position: absolute; + top: calc(var(--footer-bar-height) - var(--footer-bar-height) * 2); + left: 62%; +} + +.footer-frame-content::after { + content: ''; + display: block; + width: .25rem; + height: var(--footer-bar-height); + background-color: black; + position: absolute; + bottom: calc(var(--footer-bar-height) - var(--footer-bar-height) * 2); + left: 62%; +} + +.footer-frame-content p { + margin-block: .8rem; +} + +@media (max-width: 880px) { + .footer-frame-content .buttons { + justify-content: center; + } +} + +@media (max-width: 600px) { + footer { + --footer-bar-height: .75rem; + } + + .footer-frame-content { + padding-inline: .5rem; + } +} + +.footer-frame-content *:first-child { + margin-top: 0; +} + +.footer-frame-content *:last-child { + margin-bottom: 0; +} + +.footer-frame-panel { + height: 50%; + min-height: 100px; + background-color: var(--butterscotch); + border-block: var(--bar-border); + padding: var(--left-frame-padding); + font-size: clamp(.875rem, 2vw, 1rem); + font-weight: bold; + color: black; +} + +.headtrim { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + top: 0; + left: 0; + z-index: 999; +} + +.baseboard { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + bottom: 0; + left: 0; + z-index: 999; +} + +/* Grouped @media */ + +@media (max-width: 525px) { + body { + padding: .25rem; + } + + .baseboard, + .headtrim { + display: none; + } + + .wrap { + padding-left: 0; + padding-right: .25rem; + } + + .left-frame { + padding-top: 25px; + } + + .floor-heading { + bottom: 0; + } + + .hop { + display: none; + } + + blockquote { + margin-left: .75rem; + } +} + +@-moz-document url-prefix() { + + main { + padding-top: clamp(1rem, 4vw, 30px); + } + + h1, h2, h3, h4, p { + margin-block: 1.15rem; + } + + .imgf-title h4 { + margin-top: -4px; + margin-bottom: 0; + } + + .postmeta { + margin-top: .75rem; + } + + .lcars-text-bar h2, + .lcars-text-bar h3, + .lcars-text-bar h4, + .lcars-text-bar span { + position: absolute; + top: -.7vh; + } + + .lcars-list li::before { + top: .85rem; + } + + .meta-data { + height: 1.3rem; + line-height: 1rem; + } +} \ No newline at end of file diff --git a/lcars/frontend/assets/lcars.js b/lcars/frontend/assets/lcars.js new file mode 100644 index 0000000..3c067eb --- /dev/null +++ b/lcars/frontend/assets/lcars.js @@ -0,0 +1,50 @@ +document.addEventListener("touchstart", function() {},false); +let mybutton = document.getElementById("topBtn"); +window.onscroll = function() {scrollFunction()}; +function scrollFunction() { + if (document.body.scrollTop > 200 || document.documentElement.scrollTop > 200) { + mybutton.style.display = "block"; + } else { + mybutton.style.display = "none"; + } +} +function topFunction() { + document.body.scrollTop = 0; + document.documentElement.scrollTop = 0; +} +function playSoundAndRedirect(audioId, url) { + var audio = document.getElementById(audioId); + audio.play(); + + audio.onended = function() { + window.location.href = url; + }; +} +function goToAnchor(anchorId) { + window.location.hash = anchorId; +} +// Accordion drop-down +var acc = document.getElementsByClassName("accordion"); +var i; + +for (i = 0; i < acc.length; i++) { + acc[i].addEventListener("click", function() { + this.classList.toggle("active"); + var accordionContent = this.nextElementSibling; + if (accordionContent.style.maxHeight){ + accordionContent.style.maxHeight = null; + } else { + accordionContent.style.maxHeight = accordionContent.scrollHeight + "px"; + } + }); +} +// LCARS keystroke sound (not to be used with hyperlinks) + const LCARSkeystroke = document.getElementById('LCARSkeystroke'); + const allPlaySoundButtons = document.querySelectorAll('.playSoundButton'); + allPlaySoundButtons.forEach(button => { + button.addEventListener('click', function() { + LCARSkeystroke.pause(); + LCARSkeystroke.currentTime = 0; // Reset to the beginning of the sound + LCARSkeystroke.play(); + }); + }); \ No newline at end of file diff --git a/lcars/frontend/assets/lower-decks-padd.css b/lcars/frontend/assets/lower-decks-padd.css new file mode 100644 index 0000000..d914632 --- /dev/null +++ b/lcars/frontend/assets/lower-decks-padd.css @@ -0,0 +1,1881 @@ +@charset "utf-8"; + +/* + + CSS Document + LCARS Lower Decks PADD Theme + Version 24.2 + By Jim Robertus www.thelcars.com + Modified: 2025 Aug 4 + +*/ + +:root { + font-size: 1.375rem; + color-scheme: dark; + --lfw: 240px; + --alpha-blue: #58e; + --arctic-ice: #6cf; + --arctic-snow: #9cf; + --radioactive: #8ff; + --beta-blue: #79d; + --night-cloud: #344470; + --night-rain: #455580; + --sunset-red: #f30; + --left-frame-top-color: var(--alpha-blue); + --left-frame-color: var(--alpha-blue); /* panel-6 inherits this color */ + --left-frame-padding: .75rem; + --corner-color-top: var(--alpha-blue); + --corner-color-bottom: var(--alpha-blue); + --panel-1-color: var(--night-rain); + --panel-4-color: var(--beta-blue); + --panel-5-color: var(--night-rain); + --panel-7-color: var(--night-cloud); + --panel-top-button-color: var(--beta-blue); + --bar-height: 28px; + --bar-1-6-width: 10%; + --bar-2-7-width: 28%; + --bar-3-8-width: 7%; + --bar-5-10-width: 5%; + --bar-1-color: var(--alpha-blue); + --bar-2-color: var(--radioactive); + --bar-3-color: var(--beta-blue); + --bar-4-color: var(--alpha-blue); + --bar-5-color: var(--arctic-ice); + --bar-6-color: var(--alpha-blue); + --bar-7-color: var(--radioactive); + --bar-8-color: var(--beta-blue); + --bar-9-color: var(--alpha-blue); + --bar-10-color: var(--arctic-ice); +/* + NOTE: --font-color also sets the following: + 1. horizontal line
color + 2. lcars-list bullet color + 3. blockquote border color + 4. images with the *border* class + 5. data-cascade text color +*/ + --font-color: var(--beta-blue); + --sub-fonts: .875rem; + --banner-color: var(--radioactive); + --h1-color: var(--arctic-ice); + --h2-color: var(--arctic-ice); + --h3-color: var(--arctic-ice); + --h4-color: var(--arctic-ice); + --light-color: #bdf; + --link-color: var(--beta-blue); + --code-color: var(--alpha-blue); + --nav-width: 240px; + --nav-1-color: var(--alpha-blue); + --nav-2-color: var(--beta-blue); + --nav-3-color: var(--arctic-ice); + --nav-4-color: var(--night-rain); + --button-color: var(--alpha-blue); + --button-color-sidebar: var(--alpha-blue); + --radius-top: 0 0 0 100px; + --radius-bottom: 100px 0 0 0; + --radius-content-top: 0 0 0 44px; + --radius-content-bottom: 44px 0 0 0; + --panel-border: .4rem solid #000; + --bar-border: .4rem solid #000; + --bar-cut-width: 27%; + --divider-height: .75rem; + --lcars-bar-color: var(--night-rain); + --lcars-bar-start-color: var(--beta-blue); + --lcars-bar-end-color: var(--beta-blue); + --lcars-bar-text-color: var(--beta-blue); + +/* Image Frame: */ + + --image-border-color: var(--beta-blue); + --primary-color: var(--night-rain); + --secondary-color: var(--beta-blue); + --accent-color: var(--arctic-snow); + --spacers: .65rem; + --frame-height: 40px; +} + +@media (max-width: 1500px) { + :root { + --lfw: 200px; + --nav-width: 210px; + --bar-height: 20px; + --divider-height: .5rem; + } +} + +@media (max-width: 1300px) { + :root { + font-size: 1.2rem; + --sub-fonts: .9rem; + --lfw: 180px; + --radius-top: 0 0 0 80px; + --radius-bottom: 80px 0 0 0; + --radius-content-top: 0 0 0 30px; + --radius-content-bottom: 30px 0 0 0; + --nav-width: 180px; + } +} + +@media (max-width: 950px) { + :root { + --lfw: 150px; + } +} + +@media (max-width: 750px) { + :root { + --lfw: 120px; + --radius-top: 0 0 0 60px; + --radius-bottom: 60px 0 0 0; + --radius-content-top: 0 0 0 24px; + --radius-content-bottom: 24px 0 0 0; + --bar-height: 16px; + --spacers: .5rem; + --frame-height: 25px; + } +} + +@media (max-width: 525px) { + :root { + --lfw: 62px; + --left-frame-padding: .5rem; + --radius-top: 0 0 0 30px; + --radius-bottom: 30px 0 0 0; + --bar-height: 10px; + --panel-border: .25rem solid black; + --bar-border: .25rem solid black; + --divider-height: .345rem; + } +} + +@media (max-width: 450px) { + :root { + --nav-width: 48%; + } +} + +*, *:after, *:before { + box-sizing: border-box; +} + +* { + margin: 0; + padding: 0; + font: inherit; +} + +img { + display: block; + max-width: 100%; + height: auto; +} + +input, textarea, button, select { + font: inherit; +} + +@font-face { + font-family: 'Antonio'; + font-weight: 400; + src: url('Antonio-Regular.woff2') format('woff2'), + url('Antonio-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Antonio'; + font-weight: 700; + src: url('Antonio-Bold.woff2') format('woff2'), + url('Antonio-Bold.woff') format('woff') +} + +html { + scroll-behavior: smooth; +} + +body { + display: flex; + padding-top: 10px; + padding-left: 5px; + background-color: black; + font-family: 'Antonio', 'Arial Narrow', 'Avenir Next Condensed', sans-serif; + font-weight: 400; + line-height: 1.5; + color: var(--font-color); +} + +a { + text-decoration: underline; + text-decoration-thickness: 2px; + text-underline-offset: .2rem; + color: var(--link-color); +} + +a:hover { + filter: brightness(115%); + animation: none; +} + +a:active { + filter: brightness(80%); + outline: none; +} + +button { + border: none; + outline: none; + word-break: break-all; + color: black; + transition: width 1s; +} + +button:hover { + cursor: pointer; + animation: none; + filter: brightness(115%); + color: black; +} + +button:active { + filter: brightness(85%); +} + +@keyframes colorchange { + 0% {color: var(--night-cloud)} + 25% {color: var(--night-cloud);} + 50% {color: var(--arctic-snow);} + 75% {color: var(--arctic-snow);} + 80% {color: var(--arctic-snow);} + 90% {color: var(--night-cloud);} + 100% {color: var(--night-cloud);} +} + +.wrap-all { + width: 100%; +} + +.wrap { + display: flex; + width: 100%; + padding-left: 5px; + padding-right: 15px; + overflow: hidden; +} + +.scroll-top { + display: none; +} + +.left-frame-top, +.left-frame { + width: var(--lfw); + text-align: right; + font-size: clamp(.875rem, 2vw, 1rem); + line-height: 1.2; + font-weight: bold; + color: black; + transition: width 1s; +} + +.left-frame-top { + background-color: var(--left-frame-top-color); + border-radius: var(--radius-top); +} + +.left-frame-top a, +.left-frame a { + text-decoration: none; + color: black; +} + +.left-frame { + display: flex; + flex-direction: column; + justify-content: space-between; + padding-top: 14vh; + background-color: var(--left-frame-color); + border-radius: var(--radius-bottom); +} + +.left-frame:has(.sidebar-nav) { + padding-top: 10vh; +} + +.panel-2 { + padding-top: .75rem; + padding-right: .75rem; +} + +.right-frame-top { + flex: 1; + position: relative; +} + +.right-frame-top::before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to top right, var(--corner-color-top) 50%, #000 50%); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +.right-frame-top::after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-top); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +@media (max-width: 500px) { + .right-frame-top::before { + bottom: 10px; + } + + .right-frame-top::after { + bottom: 10px; + } +} + +.banner { + padding-bottom: 1rem; + padding-left: 5px; + text-align: right; + text-transform: uppercase; + line-height: 1.1; + font-size: clamp(1.5rem, 1.25rem + 3.5vw, 4rem); + color: var(--banner-color); +} + +.banner a { + color: var(--banner-color); + text-decoration: none; +} + +.data-cascade-button-group { + display: flex; + justify-content: flex-end; + align-items: flex-start; + flex-wrap: wrap; + padding-bottom: .75rem; +} + +.data-cascade-button-group:has(.header-content) { + justify-content: flex-start; +} + +@media (max-width: 1440px) { + .data-cascade-button-group:has(.header-content) { + row-gap: 1rem; + } + + .data-cascade-button-group:has(.header-content) > nav { + width: 100%; + } +} + +.header-content { + flex: 1; + min-height: 184px; + padding-right: 2rem; + padding-left: clamp(20px, 3vw, 50px); +} + +.header-content > *:first-child { + margin-top: 0; +} + +.header-content > *:last-child { + margin-bottom: 0; +} + +/* Data Stream */ + +.data-wrapper { + flex: 1; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + align-items: flex-end; + max-width: 100%; + height: 164px; + overflow: hidden; + padding-top: 10px; + padding-right: 2rem; + padding-left: clamp(20px, 3vw, 50px); + column-gap: 1rem; + font-size: 1.25rem; +} + +.data-column { + display: grid; + grid-template-columns: 1fr; + line-height: 1; + --dc-row-height: 40px; +} + +.data-bullet { + width: 38px; + height: 22px; + border-radius: 50%; + background-color: var(--font-color); +} + +.dc-row-1, +.dc-row-2, +.dc-row-3, +.dc-row-4 { + display: flex; + align-items: center; + min-height: var(--dc-row-height); +} + +.dc-row-1:has(.data-bullet) { + padding-inline: 1rem; +} + +.dc-row-2:has(.data-bullet) { + padding-inline: 1rem; +} + +.dc-row-3:has(.data-bullet) { + padding-inline: 1rem; +} + +.dc-row-4:has(.data-bullet) { + padding-inline: 1rem; +} + +.darkspace { + min-width: 3rem; + text-align: center; + justify-content: center; +} + +.darkfont { + color: black; +} + +@media (max-width: 1300px) { + .data-wrapper { + height: 130px; + font-size: 1rem; + } + + .data-column { + --dc-row-height: 30px; + } + + .data-bullet { + transform: scale(.8); + } +} + +@media (max-width: 1100px) { + .hide-data { + display: none; + } + + .data-wrapper { + column-gap: .575rem; + padding-right: 1rem; + } +} + +@media (max-width: 740px) { + .data-wrapper { + display: none; + } +} + +/* Navigation & buttons */ + +.lcars-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + margin-block: 1rem; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1 a { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + height: clamp(90px, 11vw, 160px); + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + transition: width 1s; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1-button { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + min-height: clamp(90px, 11vw, 160px); + overflow: hidden; + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +nav { + display: flex; + flex-wrap: wrap; + align-self: center; + width: calc(var(--nav-width) + var(--nav-width) + 1rem); + justify-content: flex-end; + column-gap: .5rem; + row-gap: .65rem; +} + +@media (max-width: 1500px) { + nav { + column-gap: .375rem; + row-gap: .5rem; + } +} + +@media (max-width: 1440px) { + .data-cascade-button-group:has(.header-content) { + row-gap: 1rem; + } + + .data-cascade-button-group:has(.header-content) > nav { + width: 100%; + } +} + +nav a, +nav button, +.buttons button { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: flex-end; + width: var(--nav-width); + height: calc(var(--nav-width) / 2.8); + padding-inline: 1.5rem; + padding-bottom: .7rem; + border-radius: 100vmax; + background-color: var(--button-color); + text-align: right; + line-height: 1.175; + text-decoration: none; + text-transform: uppercase; + font-weight: bold; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +nav a:nth-child(1), +nav button:nth-child(1) { + background-color: var(--nav-1-color); +} + +nav a:nth-child(2), +nav button:nth-child(2) { + background-color: var(--nav-2-color); +} + +nav a:nth-child(3), +nav button:nth-child(3) { + background-color: var(--nav-3-color); +} + +nav a:nth-child(4), +nav button:nth-child(4) { + background-color: var(--nav-4-color); +} + +@media (max-width: 1300px) { + nav { + padding-left: .5rem; + gap: .5rem; + } + + nav button { + padding-bottom: .5rem; + font-size: .875rem; + padding-inline: 1.25rem; + } +} + +@media (max-width: 780px) { + nav { + flex: 1; + } + + .data-cascade-button-group:has(.header-content) > *:nth-child(2) { + flex: none; + } +} + +@media (max-width: 450px) { + nav a, + nav button { + height: 63px; + } +} + +.buttons { + display: flex; + flex-wrap: wrap; + gap: .5rem; + margin-block: 2rem; +} + +.justify-space-between { + justify-content: space-between; +} + +.justify-center { + justify-content: center; +} + +.justify-flex-end { + justify-content: flex-end; +} + +.justify-space-around { + justify-content: space-around; +} + +.justify-space-evenly { + justify-content: space-evenly; +} + +.buttons a, +.buttons button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.sidebar-nav button, +.sidebar-nav a, +.sidebar-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + min-height: 3.75rem; + width: var(--lfw); + background-color: var(--button-color-sidebar); + border-radius: 0; + border-bottom: var(--panel-border); + padding: var(--left-frame-padding); + text-decoration: none; + text-align: right; + word-break: break-all; + text-transform: uppercase; + color: black; +} + +@media (max-width: 1300px) { + .lcars-button, + .buttons a, + .buttons button { + width: 200px; + height: 74px; + } +} + +.panel-button { + display: flex; + justify-content: flex-end; + width: var(--lfw); + border-radius: 0; + padding: var(--left-frame-padding); + border-bottom: var(--panel-border); +} + +.pan-0 /* use this if you're not mimicking an established panel */ { + height: 18vh; + max-height: 240px; + background-color: var(--button-color-sidebar); +} + +.pan-4 { + height: 14vh; + background-color: var(--panel-4-color) !important; +} + +.pan-5 { + height: 30vh; + background-color: var(--panel-5-color) !important; +} + +.pan-7 { + height: 30vh; + background-color: var(--panel-7-color) !important; +} + +.text-bottom { + align-items: flex-end; +} + +#topBtn { + display: none; + position: fixed; + bottom: 0; + z-index: 99; + border-radius: 0; + border-top: var(--panel-border); + border-right: none; + border-bottom: var(--panel-border); + border-left: none; + outline: none; + width: var(--lfw); + padding: var(--left-frame-padding); + padding-bottom: 10vh; + background-color: var(--panel-top-button-color); + text-align: right; + line-height: 1; + font-weight: bold; + text-transform: uppercase; + color: black; + cursor: pointer; +} + +#topBtn:hover { + filter: brightness(115%); +} + +#topBtn:active { + filter: brightness(80%); +} + +@media (max-width: 525px) { + .sidebar-button, + .sidebar-nav a, + .sidebar-nav button, + .panel-button { + font-size: .75rem; + } + + #topBtn { + padding-bottom: 6vh; + } +} + +.bar-panel { + display: flex; + height: var(--bar-height); +} + +.first-bar-panel { + margin-top: 2.5vh; + position: relative; +} + +.bar-1, +.bar-2, +.bar-3, +.bar-4, +.bar-5, +.bar-6, +.bar-7, +.bar-8, +.bar-9, +.bar-10 { + height: var(--bar-height); +} + +.bar-1, +.bar-2, +.bar-3, +.bar-4, +.bar-6, +.bar-7, +.bar-8, +.bar-9 { + border-right: var(--bar-border); +} + +.divider { + display: flex; + height: var(--divider-height); + z-index: 1999; +} + +.block-left { + width: var(--lfw); + height: var(--divider-height); +} + +.block-right { + flex: 1; + height: var(--divider-height); + position: relative; +} + +.block-row { + display: flex; + width: 100%; + height: var(--divider-height); + padding-right: .4rem; + padding-left: 1px; +} + +.bar-11 { + height: var(--divider-height); + width: var(--bar-1-6-width); +} + +.bar-12 { + height: var(--divider-height); + width: var(--bar-2-7-width); + +} + +.bar-13 { + height: var(--divider-height); + width: var(--bar-3-8-width); +} +.bar-14 { + flex: 1; + height: var(--divider-height); + z-index: 1999; +} + +.bar-1 { + width: var(--bar-1-6-width); + background-color: var(--bar-1-color); +} + +.bar-2 { + width: var(--bar-2-7-width); + background-color: var(--bar-2-color); +} + +.bar-3 { + width: var(--bar-3-8-width); + background-color: var(--bar-3-color); +} + +.bar-4 { + flex: 1; + position: relative; + background-color: var(--bar-4-color); +} + +.bar-5 { + width: var(--bar-5-10-width); + background-color: var(--bar-5-color); +} + +.bar-6 { + width: var(--bar-1-6-width); + background-color: var(--bar-6-color); +} + +.bar-7 { + width: var(--bar-2-7-width); + background-color: var(--bar-7-color); +} + +.bar-8 { + width: var(--bar-3-8-width); + background-color: var(--bar-8-color); +} + +.bar-9 { + flex: 1; + position: relative; + background-color: var(--bar-9-color); +} + +.bar-4::after { + content: ""; + display: block; + width: var(--bar-cut-width); + height: 48%; + background-color: black; + border-radius: 0 8px 0 0; + position: absolute; + left: 0; + bottom: 0; +} + +.bar-9::after { + content: ""; + display: block; + width: var(--bar-cut-width); + height: 48%; + background-color: black; + border-radius: 0 0 8px 0; + position: absolute; + left: 0; + top: 0; +} + +.bar-10 { + width: var(--bar-5-10-width); + background-color: var(--bar-10-color); +} + +/* Bottom half */ + +#gap { + margin-top: var(--divider-height); +} + +.panel-3, +.panel-4, +.panel-5 { + border-bottom: var(--panel-border); +} + +.panel-2, +.panel-3, +.panel-4, +.panel-5, +.panel-6, +.panel-7 { + padding: var(--left-frame-padding); +} + +.panel-4 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + min-height: 14vh; + background-color: var(--panel-4-color); +} + +.panel-5 { + height: 30vh; + background-color: var(--panel-5-color); +} + +/* Note: panel-6 height is fluid and governed by the amount of content on the page. Background color is inherited from :root --left-frame-color */ + +.panel-6 { + min-height: 15vh; +} + +.panel-7 { + height: 30vh; + border-top: var(--panel-border); + background-color: var(--panel-7-color); +} + +.right-frame { + flex: 1; + position: relative; +} + +.right-frame::before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to bottom right, var(--corner-color-bottom) 50%, #000 50%); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +.right-frame::after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-bottom); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +main { + padding-top: 1.5rem; + padding-bottom: .5rem; + padding-left: clamp(20px, 3vw, 50px); +} + +main > *:first-child, +article > *:first-child { + margin-top: 0; +} + +main:has(.floor-heading) > *:nth-child(2) { + margin-top: 0; +} + +.flexbox { + display: flex; + gap: 1.2rem; + flex-wrap: wrap; +} + +.col { + flex: 1 1 360px; +} + +.col > *:first-child { + margin-top: 0; +} + +h1, h2, h3, h4 { + margin-block: 1.75rem; + font-weight: normal; + line-height: 1.2; + text-transform: uppercase; + text-box: trim-both cap alphabetic; +} + +h1 { + font-size: clamp(1.5rem, 1.25rem + 3.5vw, 4rem); + text-align: right; + color: var(--h1-color); +} + +h2 { + font-size: clamp(1.4rem, 1.1rem + 2.25vw, 2.3rem); + color: var(--h2-color); +} + +h3 { + font-size: clamp(1.15rem, 1.05rem + 1.25vw, 1.875rem); + color: var(--h3-color); +} + +h4 { + font-size: clamp(1.025rem, 1rem + 1.125vw, 1.575rem); + color: var(--h4-color); +} + +.floor-heading { + display: flex; + justify-content: flex-end; + width: 100%; + position: fixed; + left: 50%; + transform: translate(-50%, 0); + bottom: 10px; + z-index:4; +} + +.floor-heading > * { + margin-block: 0; + width: fit-content; + padding: .5rem; + background-color: black; +} + +p { + margin-block: 1.75rem; + text-box: trim-both cap alphabetic; +} + +.caption { + margin-top: -1rem; + text-align: center; + font-size: var(--sub-fonts); +} + +.indent { + padding-left: 1.5rem; +} + +.postmeta { + margin-block: 1.25rem; + text-align: right; + font-size: clamp(1.2rem, 0.88rem + 1.28vw, 1.6rem); + line-height: 1.2; + text-transform: uppercase; +} + +article h1 { + margin-bottom: 0; +} + +hr { + margin-block: 1.5rem; + height: 6px; + border: none; + background-color: var(--font-color); + border-radius: 3px; +} + +blockquote { + margin-block: 1.75rem; + margin-left: 1.5rem; + padding-block: .25rem; + padding-left: 1.5rem; + position: relative; + text-box: trim-both cap alphabetic; +} + +blockquote::before { + content: ''; + display: block; + width: 10px; + height: 100%; + background-color: var(--font-color); + border-radius: 5px; + position: absolute; + left: 0; + top: 0; +} + +blockquote > *:first-child { + margin-top: 0; +} + +blockquote > * { + margin-bottom: 0; +} + +.flush { + margin-top: -1rem; +} + +.nomar { + margin-block: 0 !important; +} + +.go-center { + text-align: center !important; +} + +.go-right { + text-align: right !important; +} + +.go-left { + text-align: left !important; +} + +.go-big { + font-size: clamp(1.2rem, 1rem + 1vw, 1.275rem); +} + +.uppercase { + text-transform: uppercase; +} + +.strike { + text-decoration: line-through; + text-decoration-thickness: .15rem; +} + +.now { + white-space: nowrap; +} + +.big-sky { + margin-top: 5rem; +} + +.smoke-glass { + opacity: .35; +} + +strong { + font-weight: bold; +} + +code { + font-family: monospace; + font-size: .9rem; + color: var(--code-color); +} + +.code { + width: 100%; + min-height: 5rem; + padding-block: .5rem; + padding-inline: 1rem; + background-color: #232323; + border-color: #4c4c4c; + tab-size: 4; + font-family: monospace; + font-size: .85rem; + color: #dcdcdc; +} + +@keyframes blink { + 0% {opacity: 0} + 49%{opacity: 0} + 50% {opacity: 1} +} + +.blink-slow { + animation: blink 3500ms infinite; + animation-delay: 1s; +} + +.blink { + animation: blink 2s infinite; + animation-delay: 1s; +} + +.blink-fast { + animation: blink 1s infinite; + animation-delay: 1s; +} + +@keyframes pulse { + 0% {filter: brightness(1.0)} + 50% {filter: brightness(.25)} +} + +.pulse { + animation: pulse 2300ms infinite; +} + +.pulse-rate-high { + animation: pulse 1s infinite; +} + +.accordion-wrapper { + display: block; + margin: 1.75rem auto; + width: 100%; +} + +.limit-width { + max-width: 1240px; +} + +.accordion { + display: flex; + align-items: center; + min-height: 3rem; + width: 100%; + padding-right: 2.75rem; + padding-left: 1rem; + border-radius: 100vmax; + background-color: var(--alpha-blue); + border-left: solid 3rem var(--night-rain); + text-align: left; + font-size: 1.25rem; + color: black; + cursor: pointer; + transition: 0.4s ease; + position: relative; +} + +.active, .accordion:hover { + background-color: var(--beta-blue); + border-left-color: var(--radioactive); + filter: none; +} + +.accordion:before { + content: ''; + display: block; + width: .5rem; + height: 4rem; + background-color: black; + position: absolute; + top: 0; + left: 0; +} + +.accordion:after { + display: block; + content: '\276F'; + position: absolute; + right: 1.5rem; + top: 21%; + transform: rotate(90deg); + transition: 0.4s; + font-weight: bold; + color: black; +} + +.active:after { + content: "\276F"; + transform:rotate(-90deg); + transition: 0.4s ease; +} + +.accordionContent { + padding-block: .5rem; + padding-inline: 3.5rem; + max-height: 0; + overflow: hidden; + transition: max-height 0.25s ease-out; +} + +.accordionContent ul { + margin-left: 0; +} + +@media (max-width: 525px) { + .accordion { + min-height: 2.5rem; + font-size: 1rem; + border-left-width: 2.5rem; + } +} + +/* Images */ + +.pics-right { + float: right; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; +} + +.pics-left { + float: left; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; +} + +@media (max-width: 1060px) { + .pics-right, + .pics-left { + float: none; + margin-inline: auto; + } + + .pics-right img, + .pics-left img { + margin-inline: auto; + } +} + +.pics { + margin-block: 2rem; + margin-inline: auto; +} + +.border { + border: 2px solid var(--font-color); +} + +.lcars-list { + margin-block: 1.15rem; + margin-left: 2rem; + list-style: none; +} + +.lcars-list li { + position: relative; + padding-block: .45rem; + padding-left: 2.25rem; + text-box: trim-both cap alphabetic; +} + +.lcars-list li::before { + content: ''; + display: block; + width: 34px; + height: 18px; + border-radius: 50%; + background-color: var(--font-color); + position: absolute; + top: .45rem; + left: 0; +} + +@media (max-width: 650px) { + + .lcars-list { + margin-left: .5rem; + } + + .lcars-list li::before { + transform: scale(90%); + } +} + +.lcars-bar { + margin-block: 1.75rem; + height: clamp(15px, 2vh, 25px); + background: transparent; + border-right: clamp(15px, 2vh, 25px) solid var(--lcars-bar-end-color); + border-left: clamp(15px, 2vh, 25px) solid var(--lcars-bar-start-color); + border-radius: 100vmax; + position: relative; +} + +.lcars-bar::after { + content: ''; + display: block; + height: clamp(15px, 2vh, 25px); + width: 100%; + background-color: var(--lcars-bar-color); + border-right: .8vh solid black; + border-left: .8vh solid black; + position: absolute; + top: 0; + left: 0; +} + +.lcars-text-bar { + display: flex; + position: relative; + height: clamp(16px, 4vh, 41px); + margin-block: 2.75rem; + overflow: visible; + border-radius: 100vmax; + background-color: var(--lcars-bar-color); + border-right: clamp(16px, 4vh, 43px) solid var(--lcars-bar-end-color); + border-left: clamp(16px, 4vh, 43px) solid var(--lcars-bar-start-color); +} + +.the-end { + justify-content: flex-end; +} + +.lcars-text-bar h2, +.lcars-text-bar h3, +.lcars-text-bar h4, +.lcars-text-bar span { + margin-block: 0; + background-color: black; + height: clamp(20px, 5.5vh, 60px); /* Setting height is a Firefox fix */ + overflow: visible; + border-top: 1px solid black; + padding-inline: 1vh; + font-size: clamp(17px, 4.5vh, 46px); + line-height: 1; + text-transform: uppercase; + color: var(--lcars-bar-text-color); + z-index: 1; + text-box: trim-both cap alphabetic; +} + +.lcars-text-bar::before { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + left: 0; + overflow: hidden; +} + +.lcars-text-bar::after { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + right: 0; + overflow: hidden; +} + +/* LCARS Image Frame */ + +.image-frame { + margin: 2.75rem auto; + width: fit-content; + background: linear-gradient(var(--primary-color) 56%, var(--secondary-color) 44%); + border-radius: 50px 25px 0 50px; + position: relative; +} + +.image-frame::before { + content: ''; + display: block; + width: 40px; + height: 40px; + background-color: black; + position: absolute; + right: 0; + top: 0; +} + +.image-frame::after { + content: ''; + display: block; + border-top: var(--spacers) solid black; + border-bottom: var(--spacers) solid black; + width: 45px; + height: 80px; + background-color: var(--secondary-color); + position: absolute; + left: 0; + top: 56%; +} + +.imgf-title { + display: flex; + justify-content: flex-end; + height: 40px; + border-right: 40px solid var(--secondary-color); + border-radius: 25px 100vh 100vh 0; + position: relative; + z-index: 1; + text-align: right; +} + +.h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + border-right: var(--spacers) solid black; +} + +.imgf-title h4 { + margin-block: 0; + width: fit-content; + background-color: black; + padding-left: var(--spacers); + font-size: 2.05rem; + color: var(--title-color); + line-height: 40px; + text-transform: uppercase; +} + +.imgf-image-body { + margin-left: 45px; + background-color: black; + width: fit-content; + padding: 1rem; + border-radius: 28px 0 0 28px; +} + +.image-holder { + width: fit-content; + padding: 1rem; + border: 2px solid var(--image-border-color); + border-radius: 20px; +} + +.imgf-base { + display: grid; + grid-template-columns: 20% 13% 35px 15% 1fr; + margin-left: 80px; + border-left: var(--spacers) solid black; +} + +.imgf-block-1 { + height: var(--frame-height); + background-color: var(--accent-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-2 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-3 { + height: var(--frame-height); + background-color: black; + border-right: 10px solid var(--secondary-color); + border-left: 10px solid var(--accent-color); +} + +.imgf-block-4 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-left: var(--spacers) solid black; +} + +.imgf-block-5 { + height: var(--frame-height); + background-color: black; +} + +@media (max-width: 750px) { + + .image-frame { + border-radius: 40px 25px 0 40px; + } + + .image-frame::after { + width: 25px; + height: 60px; + top: 50%; + } + + .imgf-title { + height: 25px; + border-right: 24px solid var(--secondary-color); + } + + .h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + } + + .imgf-title h4 { + font-size: 1.45rem; + } + + .imgf-image-body { + margin-left: 25px; + padding: .75rem; + border-radius: 20px 0 0 20px; + } + + .image-holder { + padding: .75rem; + border-radius: 10px; + } +} + +/* Color Styles */ + +.font-alpha-blue { + color: var(--alpha-blue) !important; +} + +.button-alpha-blue, +.background-alpha-blue, +.bullet-alpha-blue::before { + background-color: var(--alpha-blue) !important; +} + +.font-arctic-ice { + color: var(--arctic-ice) !important; +} + +.button-arctic-ice, +.background-arctic-ice, +.bullet-arctic-ice::before { + background-color: var(--arctic-ice) !important; +} + +.font-arctic-snow { + color: var(--arctic-snow) !important; +} + +.button-arctic-snow, +.background-snow, +.bullet-arctic-snow::before { + background-color: var(--arctic-snow) !important; +} + +.font-radioactive { + color: var(--radioactive) !important; +} + +.button-radioactive, +.background-radioactive, +.bullet-radioactive::before { + background-color: var(--radioactive) !important; +} + +.font-beta-blue { + color: var(--beta-blue) !important; +} + +.button-beta-blue, +.background-beta-blue, +.bullet-beta-blue::before { + background-color: var(--beta-blue) !important; +} + +.font-night-cloud { + color: var(--night-cloud) !important; +} + +.button-night-cloud, +.background-night-cloud, +.bullet-night-cloud::before { + background-color: var(--night-cloud) !important; +} + +.font-night-rain { + color: var(--night-rain) !important; +} + +.button-night-rain, +.background-night-rain, +.bullet-night-rain::before { + background-color: var(--night-rain) !important; +} + +.font-sunset-red { + color: var(--sunset-red) !important; +} + +.button-sunset-red, +.background-sunset-red, +.bullet-sunset-red::before { + background-color: var(--sunset-red) !important; +} + +/* Footer */ + +footer { + margin-top: 2.5vw; + padding-bottom: 3rem; + padding-left: clamp(20px, 3vw, 50px); + font-size: .875rem; +} + +.headtrim { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + top: 0; + left: 0; + z-index: 999; +} + +.baseboard { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + bottom: 0; + left: 0; + z-index: 999; +} + +/* Grouped @media */ + +@media (max-width: 650px) { + + .first-bar-panel { + margin-top: .75rem; + } + + .bar-4::before { + height: 5px; + top: -12px; + } + + .bar-9::before { + height: 5px; + bottom: -12px; + } +} + +@media (max-width: 525px) { + + body { + padding: .25rem; + } + + .baseboard { + display: none; + } + + .wrap { + padding-left: 0; + padding-right: .25rem; + } + + .left-frame { + padding-top: 8vh; + } + + .divider { + padding-right: 10px; + } + + .block-row { + padding-right: 0; + padding-left: .25rem; + } + + .floor-heading { + bottom: 0; + } + + .hop { + display: none; + } + + blockquote { + margin-left: .75rem; + } +} + +@-moz-document url-prefix() { + + main { + padding-top: clamp(1rem, 4vw, 30px); + } + + h1, h2, h3, h4, p { + margin-block: 1.15rem; + } + + .postmeta { + margin-top: .75rem; + } + + .lcars-text-bar h2, + .lcars-text-bar h3, + .lcars-text-bar h4, + .lcars-text-bar span { + position: absolute; + top: -.7vh; + } +} \ No newline at end of file diff --git a/lcars/frontend/assets/lower-decks.css b/lcars/frontend/assets/lower-decks.css new file mode 100644 index 0000000..32c9827 --- /dev/null +++ b/lcars/frontend/assets/lower-decks.css @@ -0,0 +1,1856 @@ +@charset "utf-8"; + +/* + + CSS Document + LCARS Lower Decks Theme + Version 24.2 + By Jim Robertus www.thelcars.com + Modified: 2025 Jul 27 + +*/ + +:root { + font-size: 1.375rem; + color-scheme: dark; + --lfw: 240px; + --butter: #fec; + --daybreak: #f91; + --harvestgold: #fa4; + --honey: #fc9; + --october-sunset: #f40; + --orange: #f70; + --rich-pumpkin: #c50; + --left-frame-top-color: var(--october-sunset); + --left-frame-color: var(--october-sunset); /* panel-6 inherits this color */ + --left-frame-padding: .75rem; + --corner-color-top: var(--october-sunset); + --corner-color-bottom: var(--october-sunset); + --panel-1-color: var(--orange); + --panel-4-color: var(--orange); + --panel-5-color: var(--harvestgold); + --panel-7-color: var(--harvestgold); + --panel-top-button-color: var(--honey); + --bar-height: 28px; + --bar-1-6-width: 10%; + --bar-2-7-width: 12%; + --bar-3-8-width: 17%; + --bar-5-10-width: 5%; + --bar-1-color: var(--october-sunset); + --bar-2-color: var(--orange); + --bar-3-color: var(--honey); + --bar-4-color: var(--harvestgold); + --bar-5-color: var(--october-sunset); + --bar-6-color: var(--october-sunset); + --bar-7-color: var(--orange); + --bar-8-color: var(--honey); + --bar-9-color: var(--harvestgold); + --bar-10-color: var(--october-sunset); +/* + NOTE: --font-color also sets the following: + 1. horizontal line
color + 2. lcars-list bullet color + 3. blockquote border color + 4. images with the *border* class border color +*/ + --font-color: var(--daybreak); + --sub-fonts: .875rem; + --banner-color: var(--honey); + --data-cascade-color: var(--orange); + --light-color: white; + --h1-color: var(--honey); + --h2-color: var(--honey); + --h3-color: var(--honey); + --h4-color: var(--honey); + --light-color: var(--butter); + --link-color: var(--october-sunset); + --code-color: var(--october-sunset); + --nav-width: 240px; + --nav-1-color: var(--honey); + --nav-2-color: var(--harvestgold); + --nav-3-color: var(--orange); + --nav-4-color: var(--october-sunset); + --button-color: var(--harvestgold); + --button-color-sidebar: var(--october-sunset); + --radius-top: 0 0 0 100px; + --radius-bottom: 100px 0 0 0; + --radius-content-top: 0 0 0 44px; + --radius-content-bottom: 44px 0 0 0; + --panel-border: .4rem solid black; + --bar-border: .4rem solid black; + --bar-cut-width: 32%; + --bar-cut-out-width: 40%; + --bar-cut-out-top-color: var(--october-sunset); + --bar-cut-out-bottom-color: var(--october-sunset); + --divider-height: .75rem; + --lcars-bar-color: var(--october-sunset); + --lcars-bar-start-color: var(--harvestgold); + --lcars-bar-end-color: var(--harvestgold); + --lcars-bar-text-color: var(--harvestgold); + +/* Image Frame */ + + --image-border-color: var(--honey); + --primary-color: var(--orange); + --secondary-color: var(--harvestgold); + --accent-color: var(--honey); + --spacers: .65rem; + --frame-height: 40px; +} + +@media (max-width: 1500px) { + :root { + --lfw: 200px; + --nav-width: 210px; + --bar-height: 20px; + --divider-height: .5rem; + } +} + +@media (max-width: 1300px) { + :root { + font-size: 1.2rem; + --sub-fonts: .9rem; + --lfw: 180px; + --radius-top: 0 0 0 80px; + --radius-bottom: 80px 0 0 0; + --radius-content-top: 0 0 0 30px; + --radius-content-bottom: 30px 0 0 0; + --nav-width: 180px; + } +} + +@media (max-width: 950px) { + :root { + --lfw: 150px; + } +} + +@media (max-width: 750px) { + :root { + --lfw: 120px; + --radius-top: 0 0 0 60px; + --radius-bottom: 60px 0 0 0; + --radius-content-top: 0 0 0 24px; + --radius-content-bottom: 24px 0 0 0; + --bar-height: 16px; + --spacers: .5rem; + --frame-height: 25px; + } +} + +@media (max-width: 525px) { + :root { + --lfw: 62px; + --left-frame-padding: .5rem; + --radius-top: 0 0 0 30px; + --radius-bottom: 30px 0 0 0; + --bar-height: 10px; + --panel-border: .25rem solid black; + --bar-border: .25rem solid black; + --divider-height: .345rem; + } +} + +@media (max-width: 450px) { + :root { + --nav-width: 48%; + } +} + +*, *:after, *:before { + box-sizing: border-box; +} + +* { + margin: 0; + padding: 0; + font: inherit; +} + +img { + display: block; + max-width: 100%; + height: auto; +} + +input, textarea, button, select { + font: inherit; +} + +@font-face { + font-family: 'Antonio'; + font-weight: 400; + src: url('Antonio-Regular.woff2') format('woff2'), + url('Antonio-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Antonio'; + font-weight: 700; + src: url('Antonio-Bold.woff2') format('woff2'), + url('Antonio-Bold.woff') format('woff') +} + +html { + scroll-behavior: smooth; +} + +body { + display: flex; + padding-top: 10px; + padding-left: 5px; + background-color: black; + font-family: 'Antonio', 'Arial Narrow', 'Avenir Next Condensed', sans-serif; + font-weight: 400; + line-height: 1.5; + color: var(--font-color); +} + +a { + text-decoration: underline; + text-decoration-thickness: 2px; + text-underline-offset: .2rem; + color: var(--link-color); +} + +a:hover { + filter: brightness(115%); + animation: none; +} + +a:active { + filter: brightness(80%); + outline: none; +} + +button { + border: none; + outline: none; + color: black; + transition: width 1s; +} + +button:hover { + cursor: pointer; + animation: none; + filter: brightness(115%); + color: black; +} + +button:active { + filter: brightness(85%); +} + +.wrap-all { + width: 100%; +} + +.wrap { + display: flex; + margin-inline: auto; + padding-left: 5px; + padding-right: 15px; + overflow: hidden; +} + +.divider { + display: flex; + width: 100%; + flex-wrap: nowrap; + height: var(--divider-height); +} + +.scroll-top { + display: none; +} + +.left-frame-top, +.left-frame { + width: var(--lfw); + text-align: right; + font-size: clamp(.875rem, 2vw, 1rem); + line-height: 1.2; + font-weight: bold; + color: black; + transition: width 1s; +} + +.left-frame-top { + background-color: var(--left-frame-top-color); + border-radius: var(--radius-top); +} + +.left-frame-top a, +.left-frame a { + text-decoration: none; + color: black; +} + +.left-frame { + display: flex; + flex-direction: column; + justify-content: space-between; + padding-top: 19vh; + background-color: var(--left-frame-color); + border-radius: var(--radius-bottom); +} + +.left-frame:has(.sidebar-nav) { + padding-top: 10vh; +} + +.left-frame:has(button) { + padding-top: 10vh; +} + +@keyframes panel-1-color-change { + 0%, + 49.99% { + background-color: var(--orange); + } + 50%, + 100% { + background-color: var(--butter); + } +} + +.right-frame-top { + flex: 1; + align-content: flex-end; + position: relative; +} + +.right-frame-top::before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to top right, var(--corner-color-top) 50%, black 50%); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +.right-frame-top::after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-top); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +.banner { + padding-bottom: 1rem; + padding-left: 5px; + text-align: right; + text-transform: uppercase; + line-height: 1.1; + font-size: clamp(1.25rem, 0.75rem + 4vw, 3.75rem); + color: var(--banner-color); +} + +.banner a { + color: var(--banner-color); + text-decoration: none; +} + +.data-cascade-button-group { + display: flex; + justify-content: flex-end; + align-items: flex-start; + flex-wrap: wrap; + padding-bottom: .75rem; +} + +.data-cascade-button-group:has(.header-content) { + justify-content: flex-start; +} + +@media (max-width: 1440px) { + .data-cascade-button-group:has(.header-content) { + row-gap: 1rem; + } + + .data-cascade-button-group:has(.header-content) > nav { + width: 100%; + } +} + +.header-content { + flex: 1; + min-height: 184px; + padding-right: 2rem; + padding-left: clamp(20px, 3vw, 50px); +} + +.header-content > *:first-child { + margin-top: 0; +} + +.header-content > *:last-child { + margin-bottom: 0; +} + +/* Data Stream */ + +.data-wrapper { + flex: 1; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + align-items: flex-end; + max-width: 100%; + height: 184px; + overflow: hidden; + padding-top: 10px; + padding-right: 2rem; + padding-left: clamp(20px, 3vw, 50px); + column-gap: .5rem; + font-size: 1.25rem; +} + +.data-column { + display: grid; + grid-template-columns: 1fr; + text-align: right; + line-height: 1; + --dc-row-height: 45px; +} + +@media (max-width: 1300px) { + .data-wrapper { + height: 150px; + font-size: 1rem; + } + + .data-column { + --dc-row-height: 35px; + } + +} + +@media (max-width: 740px) { + .data-wrapper { + display: none; + } +} + +.dc-row-1 { + min-height: var(--dc-row-height); + color: var(--october-sunset); +} + +.dc-row-2 { + min-height: var(--dc-row-height); + color: var(--honey); +} + +.dc-row-3 { + min-height: var(--dc-row-height); + color: var(--october-sunset); +} + +.dc-row-4 { + min-height: var(--dc-row-height); + color: var(--harvestgold); +} + +.darkspace { + min-width: 4rem; + text-align: center; + color: var(--october-sunset); +} + +.darkfont { + color: black; +} + +@media (max-width: 1100px) { + .hide-data { + display: none; + } + + .data-wrapper { + padding-right: 1rem; + } +} + +/* Navigation & buttons */ + +.lcars-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + margin-block: 1rem; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1 a { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + height: clamp(90px, 11vw, 160px); + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + transition: width 1s; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1-button { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + min-height: clamp(90px, 11vw, 160px); + overflow: hidden; + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +nav { + display: flex; + flex-wrap: wrap; + align-self: center; + width: calc(var(--nav-width) + var(--nav-width) + 1rem); + justify-content: flex-end; + column-gap: .5rem; + row-gap: .65rem; +} + +@media (max-width: 1500px) { + nav { + column-gap: .375rem; + row-gap: .5rem; + } +} + +@media (max-width: 1440px) { + .data-cascade-button-group:has(.header-content) { + row-gap: 1rem; + } + + .data-cascade-button-group:has(.header-content) > nav { + width: 100%; + } +} + +nav a, +nav button, +.buttons button { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: flex-end; + width: var(--nav-width); + height: calc(var(--nav-width) / 2.8); + padding-inline: 1.5rem; + padding-bottom: .7rem; + border-radius: 100vmax; + background-color: var(--button-color); + text-align: right; + line-height: 1.175; + text-decoration: none; + text-transform: uppercase; + font-weight: bold; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +nav a:nth-child(1), +nav button:nth-child(1) { + background-color: var(--nav-1-color); +} + +nav a:nth-child(2), +nav button:nth-child(2) { + background-color: var(--nav-2-color); +} + +nav a:nth-child(3), +nav button:nth-child(3) { + background-color: var(--nav-3-color); +} + +nav a:nth-child(4), +nav button:nth-child(4) { + background-color: var(--nav-4-color); +} + +@media (max-width: 1300px) { + nav { + padding-left: .5rem; + gap: .5rem; + } + + nav button { + padding-bottom: .5rem; + font-size: .875rem; + padding-inline: 1.25rem; + } +} + +@media (max-width: 780px) { + nav { + flex: 1; + } + + .data-cascade-button-group:has(.header-content) > *:nth-child(2) { + flex: none; + } +} + +@media (max-width: 450px) { + nav a, + nav button { + height: 63px; + } +} + +.buttons { + display: flex; + flex-wrap: wrap; + gap: .5rem; + margin-block: 2rem; +} + +.justify-space-between { + justify-content: space-between; +} + +.justify-center { + justify-content: center; +} + +.justify-flex-end { + justify-content: flex-end; +} + +.justify-space-around { + justify-content: space-around; +} + +.justify-space-evenly { + justify-content: space-evenly; +} + +.buttons a, +.buttons button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.sidebar-nav button, +.sidebar-nav a, +.sidebar-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + min-height: 3.75rem; + width: var(--lfw); + background-color: var(--button-color-sidebar); + border-radius: 0; + border-bottom: var(--panel-border); + padding: var(--left-frame-padding); + text-decoration: none; + text-align: right; + word-break: break-all; + text-transform: uppercase; + color: black; +} + +@media (max-width: 1300px) { + .lcars-button, + .buttons a, + .buttons button { + width: 200px; + height: 74px; + } +} + +.panel-button { + display: flex; + justify-content: flex-end; + width: var(--lfw); + border-radius: 0; + padding: var(--left-frame-padding); + border-bottom: var(--panel-border); +} + +.pan-0 /* use this if you're not mimicking an established panel */ { + height: 18vh; + max-height: 240px; + background-color: var(--button-color-sidebar); +} + +.pan-4 { + height: 14vh; + background-color: var(--panel-4-color) !important; +} + +.pan-5 { + height: 30vh; + background-color: var(--panel-5-color) !important; +} + +.pan-7 { + height: 30vh; + background-color: var(--panel-7-color) !important; +} + +.text-bottom { + align-items: flex-end; +} + +#topBtn { + display: none; + position: fixed; + bottom: 0; + z-index: 99; + border-radius: 0; + border-top: var(--panel-border); + border-right: none; + border-bottom: var(--panel-border); + border-left: none; + outline: none; + width: var(--lfw); + padding: var(--left-frame-padding); + padding-bottom: 10vh; + background-color: var(--panel-top-button-color); + text-align: right; + line-height: 1; + font-weight: bold; + text-transform: uppercase; + color: black; + cursor: pointer; +} + +#topBtn:hover { + filter: brightness(115%); +} + +#topBtn:active { + filter: brightness(80%); +} + +@media (max-width: 525px) { + .sidebar-button, + .sidebar-nav a, + .sidebar-nav button, + .panel-button { + font-size: .75rem; + } + + #topBtn { + padding-bottom: 6vh; + } +} + +zack { + +} + +.bar-panel { + display: flex; + height: var(--bar-height); +} + +.first-bar-panel { + margin-top: 2.5vh; + position: relative; +} + +.bar-1, +.bar-2, +.bar-3, +.bar-4, +.bar-5, +.bar-6, +.bar-7, +.bar-9, +.bar-10 { + height: var(--bar-height); +} + +.bar-1, +.bar-2, +.bar-3, +.bar-6, +.bar-7, +.bar-8 { + border-right: var(--bar-border); +} + +.bar-5, +.bar-10 { + border-left: var(--bar-border); +} + +.bar-1 { + width: var(--bar-1-6-width); + background-color: var(--bar-1-color); +} + +.bar-2 { + width: var(--bar-2-7-width); + background-color: var(--bar-2-color); +} + +.bar-3 { + width: var(--bar-3-8-width); + background-color: var(--bar-3-color); +} + +.bar-4 { + flex: 1; + position: relative; + background-color: var(--bar-4-color); + z-index: -1; +} + +.bar-5 { + width: var(--bar-5-10-width); + background-color: var(--bar-5-color); +} + +.bar-6 { + width: var(--bar-1-6-width); + background-color: var(--bar-6-color); +} + +.bar-7 { + width: var(--bar-2-7-width); + background-color: var(--bar-7-color); +} + +.bar-8 { + width: var(--bar-3-8-width); + background-color: var(--bar-8-color); +} + +.bar-9 { + flex: 1; + position: relative; + background-color: var(--bar-9-color); + z-index: -1; +} + +.bar-4::before { + content: ''; + display: block; + width: var(--bar-cut-out-width); + height: 8px; + background-color: var(--bar-cut-out-top-color); + position: absolute; + top: -22px; + left: 0; +} + +.bar-4::after { + content: ""; + display: block; + width: var(--bar-cut-width); + height: 48%; + background-color: black; + border-radius: 0 8px 0 0; + position: absolute; + left: 0; + bottom: 0; + z-index: -1; +} + +.bar-9::before { + content: ''; + display: block; + width: var(--bar-cut-out-width); + height: 8px; + background-color: var(--bar-cut-out-bottom-color); + position: absolute; + bottom: -22px; + left: 0; +} + +.bar-9::after { + content: ""; + display: block; + width: var(--bar-cut-width); + height: 48%; + background-color: black; + border-radius: 0 0 8px 0; + position: absolute; + left: 0; + top: 0; + z-index: -1; +} + +.bar-10 { + width: var(--bar-5-10-width); + background-color: var(--bar-10-color); +} + +/* Bottom half */ + +#gap { + margin-top: var(--divider-height); +} + +.panel-3, +.panel-4, +.panel-5 { + border-bottom: var(--panel-border); +} + +.panel-2, +.panel-3, +.panel-4, +.panel-5, +.panel-6, +.panel-7 { + padding: var(--left-frame-padding); +} + +.panel-4 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + min-height: 14vh; + background-color: var(--panel-4-color); +} + +.panel-5 { + height: 30vh; + background-color: var(--panel-5-color); +} + +/* Note: panel-6 height is fluid and governed by the amount of content on the page. Background color is inherited from :root --left-frame-color */ + +.panel-6 { + min-height: 15vh; +} + +.panel-7 { + height: 30vh; + border-top: var(--panel-border); + background-color: var(--panel-7-color); +} + +.right-frame { + flex: 1; + position: relative; +} + +.right-frame::before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to bottom right, var(--corner-color-bottom) 50%, #000 50%); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +.right-frame::after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-bottom); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +main { + padding-top: clamp(1.5rem, 5vw, 60px); + padding-bottom: .5rem; + padding-left: clamp(20px, 3vw, 50px); +} + +main > *:first-child, +article > *:first-child { + margin-top: 0; +} + +main:has(.floor-heading) > *:nth-child(2) { + margin-top: 0; +} + +.flexbox { + display: flex; + gap: 1.2rem; + flex-wrap: wrap; +} + +.col { + flex: 1 1 360px; +} + +.col > *:first-child { + margin-top: 0; +} + +h1, h2, h3, h4 { + margin-block: 1.75rem; + font-weight: normal; + line-height: 1.2; + text-transform: uppercase; + text-box: trim-both cap alphabetic; +} + +h1 { + font-size: clamp(1.5rem, 1.25rem + 3.5vw, 4rem); + text-align: right; + color: var(--h1-color); +} + +h2 { + font-size: clamp(1.4rem, 1.1rem + 2.25vw, 2.3rem); + color: var(--h2-color); +} + +h3 { + font-size: clamp(1.15rem, 1.05rem + 1.25vw, 1.875rem); + color: var(--h3-color); +} + +h4 { + font-size: clamp(1.025rem, 1rem + 1.125vw, 1.575rem); + color: var(--h4-color); +} + +.floor-heading { + display: flex; + justify-content: flex-end; + width: 100%; + position: fixed; + left: 50%; + transform: translate(-50%, 0); + bottom: 10px; + z-index:4; +} + +.floor-heading > * { + margin-block: 0; + width: fit-content; + padding-inline: .5rem; + padding-bottom: .5rem; + background-color: black; +} + +p { + margin-block: 1.75rem; + text-box: trim-both cap alphabetic; +} + +.caption { + margin-top: -1rem; + text-align: center; + font-size: var(--sub-fonts); +} + +.indent { + padding-left: 1.5rem; +} + +.postmeta { + margin-block: 1.25rem; + text-align: right; + font-size: clamp(1.2rem, 0.88rem + 1.28vw, 1.6rem); + line-height: 1.2; + text-transform: uppercase; +} + +article h1 { + margin-bottom: 0; +} + +code { + font-family: monospace; + font-size: .9rem; + color: var(--code-color); +} + +.code { + width: 100%; + min-height: 5rem; + padding-block: .5rem; + padding-inline: 1rem; + background-color: #232323; + border-color: #4c4c4c; + tab-size: 4; + font-family: monospace; + font-size: .85rem; + color: #dcdcdc; +} + +hr { + margin-block: 1.5rem; + height: 6px; + border: none; + background-color: var(--font-color); + border-radius: 3px; +} + +blockquote { + margin-block: 1.75rem; + margin-left: 1.5rem; + padding-block: .25rem; + padding-left: 1.5rem; + position: relative; + text-box: trim-both cap alphabetic; +} + +blockquote::before { + content: ''; + display: block; + width: 10px; + height: 100%; + background-color: var(--font-color); + border-radius: 5px; + position: absolute; + left: 0; + top: 0; +} + +blockquote > *:first-child { + margin-top: 0; +} + +blockquote > * { + margin-bottom: 0; +} + +.flush { + margin-top: -1rem; +} + +.nomar { + margin-block: 0 !important; +} + +.go-center { + text-align: center !important; +} + +.go-right { + text-align: right !important; +} + +.go-left { + text-align: left !important; +} + +.go-big { + font-size: clamp(1.2rem, 1rem + 1vw, 1.275rem); +} + +.uppercase { + text-transform: uppercase; +} + +.strike { + text-decoration: line-through; + text-decoration-thickness: .15rem; +} + +.now { + white-space: nowrap; +} + +.big-sky { + margin-top: 5rem; +} + +strong { + font-weight: bold; +} + +code { + font-family: monospace; + font-size: .9rem; + color: var(--code-color); +} + +.code { + width: 100%; + min-height: 5rem; + padding-block: .5rem; + padding-inline: 1rem; + tab-size: 4; + font-family: monospace; + font-size: .85rem; +} + +@keyframes blink { + 0% {opacity: 0} + 49%{opacity: 0} + 50% {opacity: 1} +} + +.blink-slow { + animation: blink 3500ms infinite; +} + +.blink { + animation: blink 2s infinite; +} + +.blink-fast { + animation: blink 1s infinite; +} + +@keyframes pulse { + 0% {filter: brightness(1.0)} + 50% {filter: brightness(.25)} +} + +.pulse { + animation: pulse 2300ms infinite; +} + +.pulse-rate-high { + animation: pulse 1s infinite; +} + +.accordion-wrapper { + display: block; + margin: 1.75rem auto; + width: 100%; +} + +.limit-width { + max-width: 1240px; +} + +.accordion { + display: flex; + align-items: center; + min-height: 3rem; + width: 100%; + padding-right: 2.75rem; + padding-left: 1rem; + border-radius: 100vmax; + background-color: var(--harvestgold); + border-left: solid 3rem var(--orange); + text-align: left; + font-size: 1.25rem; + color: black; + cursor: pointer; + transition: 0.4s ease; + position: relative; +} + +.active, .accordion:hover { + background-color: var(--honey); + border-left-color: var(--butter); + filter: none; +} + +.accordion:before { + content: ''; + display: block; + width: .5rem; + height: 4rem; + background-color: black; + position: absolute; + top: 0; + left: 0; +} + +.accordion:after { + display: block; + content: '\276F'; + position: absolute; + right: 1.5rem; + top: 21%; + transform: rotate(90deg); + transition: 0.4s; + font-weight: bold; + color: black; +} + +.active:after { + content: "\276F"; + transform:rotate(-90deg); + transition: 0.4s ease; +} + +.accordionContent { + padding-block: .5rem; + padding-inline: 3.5rem; + max-height: 0; + overflow: hidden; + transition: max-height 0.25s ease-out; +} + +.accordionContent ul { + margin-left: 0; +} + +@media (max-width: 525px) { + .accordion { + min-height: 2.5rem; + font-size: 1rem; + border-left-width: 2.5rem; + } +} + +/* Images */ + +.pics-right { + float: right; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; +} + +.pics-left { + float: left; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; +} + +@media (max-width: 1060px) { + .pics-right, + .pics-left { + float: none; + margin-inline: auto; + } + + .pics-right img, + .pics-left img { + margin-inline: auto; + } +} + +.pics { + margin-block: 2rem; + margin-inline: auto; +} + +.border { + border: 2px solid var(--font-color); +} + +.lcars-list { + margin-block: 1.15rem; + margin-left: 2rem; + list-style: none; +} + +.lcars-list li { + position: relative; + padding-block: .45rem; + padding-left: 2.25rem; + text-box: trim-both cap alphabetic; +} + +.lcars-list li::before { + content: ''; + display: block; + width: 34px; + height: 18px; + border-radius: 50%; + background-color: var(--font-color); + position: absolute; + top: .45rem; + left: 0; +} + +@media (max-width: 650px) { + + .lcars-list { + margin-left: .5rem; + } + + .lcars-list li::before { + transform: scale(90%); + } +} + +.lcars-bar { + margin-block: 1.75rem; + height: clamp(15px, 2vh, 25px); + background: transparent; + border-right: clamp(15px, 2vh, 25px) solid var(--lcars-bar-end-color); + border-left: clamp(15px, 2vh, 25px) solid var(--lcars-bar-start-color); + border-radius: 100vmax; + position: relative; +} + +.lcars-bar::after { + content: ''; + display: block; + height: clamp(15px, 2vh, 25px); + width: 100%; + background-color: var(--lcars-bar-color); + border-right: .8vh solid black; + border-left: .8vh solid black; + position: absolute; + top: 0; + left: 0; +} + +.lcars-text-bar { + display: flex; + position: relative; + height: clamp(16px, 4vh, 41px); + margin-block: 2.75rem; + overflow: visible; + border-radius: 100vmax; + background-color: var(--lcars-bar-color); + border-right: clamp(16px, 4vh, 43px) solid var(--lcars-bar-end-color); + border-left: clamp(16px, 4vh, 43px) solid var(--lcars-bar-start-color); +} + +.the-end { + justify-content: flex-end; +} + +.lcars-text-bar h2, +.lcars-text-bar h3, +.lcars-text-bar h4, +.lcars-text-bar span { + margin-block: 0; + background-color: black; + height: clamp(20px, 5.5vh, 60px); /* Setting height is a Firefox fix */ + overflow: visible; + border-top: 1px solid black; + padding-inline: 1vh; + font-size: clamp(17px, 4.5vh, 46px); + line-height: 1; + text-transform: uppercase; + color: var(--lcars-bar-text-color); + z-index: 1; + text-box: trim-both cap alphabetic; +} + +.lcars-text-bar::before { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + left: 0; + overflow: hidden; +} + +.lcars-text-bar::after { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + right: 0; + overflow: hidden; +} + +/* LCARS Image Frame */ + +.image-frame { + margin: 2.75rem auto; + width: fit-content; + background: linear-gradient(var(--primary-color) 56%, var(--secondary-color) 44%); + border-radius: 50px 25px 0 50px; + position: relative; +} + +.image-frame::before { + content: ''; + display: block; + width: 40px; + height: 40px; + background-color: black; + position: absolute; + right: 0; + top: 0; +} + +.image-frame::after { + content: ''; + display: block; + border-top: var(--spacers) solid black; + border-bottom: var(--spacers) solid black; + width: 45px; + height: 80px; + background-color: var(--secondary-color); + position: absolute; + left: 0; + top: 56%; +} + +.imgf-title { + display: flex; + justify-content: flex-end; + height: 40px; + border-right: 40px solid var(--secondary-color); + border-radius: 25px 100vh 100vh 0; + position: relative; + z-index: 1; + text-align: right; +} + +.h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + border-right: var(--spacers) solid black; +} + +.imgf-title h4 { + margin-block: 0; + width: fit-content; + background-color: black; + padding-left: var(--spacers); + font-size: 2.05rem; + color: var(--title-color); + line-height: 40px; + text-transform: uppercase; +} + +.imgf-image-body { + margin-left: 45px; + background-color: black; + width: fit-content; + padding: 1rem; + border-radius: 28px 0 0 28px; +} + +.image-holder { + width: fit-content; + padding: 1rem; + border: 2px solid var(--image-border-color); + border-radius: 20px; +} + +.imgf-base { + display: grid; + grid-template-columns: 20% 13% 35px 15% 1fr; + margin-left: 80px; + border-left: var(--spacers) solid black; +} + +.imgf-block-1 { + height: var(--frame-height); + background-color: var(--accent-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-2 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-3 { + height: var(--frame-height); + background-color: black; + border-right: 10px solid var(--secondary-color); + border-left: 10px solid var(--accent-color); +} + +.imgf-block-4 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-left: var(--spacers) solid black; +} + +.imgf-block-5 { + height: var(--frame-height); + background-color: black; +} + +@media (max-width: 750px) { + + .image-frame { + border-radius: 40px 25px 0 40px; + } + + .image-frame::after { + width: 25px; + height: 60px; + top: 50%; + } + + .imgf-title { + height: 25px; + border-right: 24px solid var(--secondary-color); + } + + .h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + } + + .imgf-title h4 { + font-size: 1.45rem; + } + + .imgf-image-body { + margin-left: 25px; + padding: .75rem; + border-radius: 20px 0 0 20px; + } + + .image-holder { + padding: .75rem; + border-radius: 10px; + } +} + +/* color styles */ + +.font-butter { + color: var(--butter) !important; +} + +.button-butter, +.background-butter, +.bullet-butter::before { + background-color: var(--butter) !important; +} + +.font-daybreak { + color: var(--daybreak) !important; +} + +.button-daybreak, +.background-daybreak, +.bullet-daybreak::before { + background-color: var(--daybreak) !important; +} + +.font-harvestgold { + color: var(--harvestgold) !important; +} + +.button-harvestgold, +.background-harvestgold, +.bullet-harvestgold::before { + background-color: var(--harvestgold) !important; +} + +.font-honey { + color: var(--honey) !important; +} + +.button-honey, +.background-honey, +.bullet-honey::before { + background-color: var(--honey) !important; +} + +.font-october-sunset { + color: var(--october-sunset) !important; +} + +.button-october-sunset, +.background-october-sunset, +.bullet-october-sunset::before { + background-color: var(--october-sunset) !important; +} + +.font-orange { + color: var(--orange) !important; +} + +.button-orange, +.background-orange, +.bullet-orange::before { + background-color: var(--orange) !important; +} + +.font-rich-pumpkin{ + color: var(--rich-pumpkin) !important; +} + +.button-rich-pumpkin, +.background-rich-pumpkin, +.bullet-rich-pumpkin::before { + background-color: var(--rich-pumpkin) !important; +} + +/* Footer */ + +footer { + margin-top: 2rem; + padding-bottom: 3rem; + padding-left: clamp(20px, 3vw, 50px); + font-size: .875rem; +} + +.headtrim { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + top: 0; + left: 0; + z-index: 999; +} + +.baseboard { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + bottom: 0; + left: 0; + z-index: 999; +} + +/* Grouped @Media */ + +@media (max-width: 650px) { + + .first-bar-panel { + margin-top: .75rem; + } + + .bar-4::before { + height: 5px; + top: -12px; + } + + .bar-9::before { + height: 5px; + bottom: -12px; + } +} + +@media (max-width: 525px) { + + body { + padding: .25rem; + } + + .baseboard { + display: none; + } + + .wrap { + padding-left: 0; + padding-right: .25rem; + } + + .hop { + display: none; + } + + .left-frame { + padding-top: 8vh; + } + + .left-frame:has(.sidebar-nav) { + padding-top: 5vh; + } + + .left-frame:has(button) { + padding-top: 5vh; + } + + .floor-heading { + bottom: 0; + } + + blockquote { + margin-left: .75rem; + } +} + + @-moz-document url-prefix() { + + main { + padding-top: clamp(1rem, 4vw, 30px); + } + + h1, h2, h3, h4, p { + margin-block: 1.15rem; + } + + .postmeta { + margin-top: .75rem; + } + + .lcars-text-bar h2, + .lcars-text-bar h3, + .lcars-text-bar h4, + .lcars-text-bar span { + position: absolute; + top: -.7vh; + } + + .meta-data { + height: 1.15rem; + line-height: 1rem; + } +} \ No newline at end of file diff --git a/lcars/frontend/assets/nemesis-blue.css b/lcars/frontend/assets/nemesis-blue.css new file mode 100644 index 0000000..e763cc4 --- /dev/null +++ b/lcars/frontend/assets/nemesis-blue.css @@ -0,0 +1,2830 @@ +@charset "utf-8"; + +/* + + CSS Document + LCARS Nemesis Blue Theme + Version 24.2 + By Jim Robertus www.thelcars.com + Modified: 2025 Aug 11 + +*/ + +:root { + font-size: 1.375rem; + color-scheme: dark; + --lfw: 240px; + --cardinal: #c23; + --cool: #69f; + --evening: #26f; + --galaxy-gray: #52526a; + --ghost: #8bf; + --grape: #96c; + --honey: #fc9; + --lawn: #9a2; + --martian: #9c3; /* 9d6/9c3 (#982 dark olive & #992 light olive or yellow-green) (#9a2 lawn) (#971 flat-dark-grass) */ + --midnight: #23f; + --moonbeam: #ebf0ff; + --pumpkinshade: #f74; + --roseblush: #c66; + --tangerine: #f83; + --wheat: #ca8; + --left-frame-top-color: var(--evening); + --left-frame-color: var(--evening); /* panel-9 inherits this color */ + --left-frame-padding: .75rem; + --corner-color-top: var(--evening); + --corner-color-bottom: var(--evening); + --panel-1-color: var(--wheat); + --panel-2-color: var(--moonbeam); + --panel-4-color: var(--evening); + --panel-5-color: var(--cool); + --panel-6-color: var(--evening); + --panel-7-color: var(--evening); + --panel-8-color: var(--moonbeam); + --panel-10-color: var(--evening); + --panel-top-button-color: var(--tangerine); + --bar-height: 28px; + --bar-1-6-width: 40%; + --bar-2-7-width: 4%; + --bar-3-8-width: 17%; + --bar-5-10-width: 4%; + --bar-1-color: var(--evening); + --bar-2-color: var(--honey); + --bar-3-color: var(--cool); + --bar-4-color: var(--midnight); + --bar-5-color: var(--galaxy-gray); + --bar-6-color: var(--evening); + --bar-7-color: var(--tangerine); + --bar-8-color: var(--moonbeam); + --bar-9-color: var(--evening); + --bar-10-color: var(--galaxy-gray); + +/* Ultra layout elements */ + + --section-2-color: var(--cool); + --pill-1-color: var(--evening); + --pill-2-color: var(--cool); + --pill-3-color: var(--cool); + --pill-4-color: var(--evening); + --pill-5-color: var(--midnight); + --pill-6-color: var(--midnight); + --pill-a1-color: var(--midnight); + --pill-a2-color: var(--cool); + --pill-a3-color: black; + --pill-a4-color: var(--evening); + --pill-a5-color: var(--tangerine); + --pill-a6-color: var(--honey); + --panel-11-color: var(--cool); + --panel-12-color: var(--cool); + --panel-13-color: var(--honey); + --panel-14-color: var(--evening); + --panel-15-color: var(--cool); + + /* End Ultra layout elements */ + + --radius-top: 0 0 0 160px; + --radius-bottom: 160px 0 0 0; + --radius-content-top: 0 0 0 60px; + --radius-content-bottom: 60px 0 0 0; + --panel-border: .25rem solid black; + --bar-border: .25rem solid black; + --bar-cut-width: 34%; + --bar-cut-out-width: 34%; + --divider-height: .5rem; +/* + NOTE: --font-color also sets the following: + 1. horizontal line
color + 2. lcars-list default bullet color + 3. blockquote border color + 4. images with the *border* class border color +*/ + --font-color: var(--cool); + --sub-fonts: .875rem; + --dc-font-size: .875rem; + --dc-row-height: calc(var(--dc-font-size) + .125rem); + --banner-color: var(--ghost); + --data-cascade-color: var(--evening); + --light-color: var(--moonbeam); + --h1-color: var(--ghost); + --h2-color: var(--ghost); + --h3-color: var(--ghost); + --h4-color: var(--ghost); + --link-color: var(--cool); + --code-color: var(--martian); + --nav-width: 240px; + --nav-1-color: var(--cool); + --nav-2-color: var(--roseblush); + --nav-3-color: var(--honey); + --nav-4-color: var(--cardinal); + --button-color: var(--cool); + --button-color-sidebar: var(--cool); + --lcars-bar-color: var(--evening); + --lcars-bar-start-color: var(--midnight); + --lcars-bar-end-color: var(--midnight); + --lcars-bar-text-color: var(--moonbeam); + +/* Image Frame */ + + --image-border-color: var(--cool); + --primary-color: var(--evening); + --secondary-color: var(--cool); + --accent-color: #adcaff; /* bdd1ff */ + --spacers: .65rem; + --frame-height: 40px; +} + +@media (max-width: 1500px) { + :root { + --lfw: 200px; + --radius-top: 0 0 0 130px; + --radius-bottom: 130px 0 0 0; + --divider-height: .4rem; + --nav-width: 210px; + --dc-font-size: .75rem; + --bar-height: 24px; + } +} + +@media (max-width: 1300px) { + :root { + font-size: 1.2rem; + --sub-fonts: .9rem; + --lfw: 180px; + --nav-width: 180px; + --radius-top: 0 0 0 100px; + --radius-bottom: 100px 0 0 0; + --radius-content-top: 0 0 0 40px; + --radius-content-bottom: 40px 0 0 0; + --bar-height: 20px; + } +} + +@media (max-width: 950px) { + :root { + --lfw: 150px; + } +} + +@media (max-width: 750px) { + :root { + --panel-border: .25rem solid black; + --bar-border: .25rem solid black; + --lfw: 120px; + --radius-top: 0 0 0 80px; + --radius-bottom: 80px 0 0 0; + --radius-content-top: 0 0 0 34px; + --radius-content-bottom: 34px 0 0 0; + --nav-width: 174px; + --bar-height: 16px; + --spacers: .5rem; + --frame-height: 25px; + } +} + +@media (max-width: 525px) { + :root { + --lfw: 62px; + --left-frame-padding: .5rem; + --radius-top: 0 0 0 40px; + --radius-bottom: 40px 0 0 0; + --bar-height: 10px; + --divider-height: .3rem; + } +} + +@media (max-width: 450px) { + :root { + --nav-width: 48%; + } +} + +*, *:after, *:before { + box-sizing: border-box; +} + +* { + margin: 0; + padding: 0; + font: inherit; +} + +img { + display: block; + max-width: 100%; + height: auto; +} + +input, textarea, button, select { + font: inherit; +} + +@font-face { + font-family: 'Antonio'; + font-weight: 400; + src: url('Antonio-Regular.woff2') format('woff2'), + url('Antonio-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Antonio'; + font-weight: 700; + src: url('Antonio-Bold.woff2') format('woff2'), + url('Antonio-Bold.woff') format('woff') +} + +html { + scroll-behavior: smooth; +} + +body { + display: flex; + padding-top: 10px; + padding-left: 5px; + background-color: black; + font-family: 'Antonio', 'Arial Narrow', 'Avenir Next Condensed', sans-serif; + font-weight: 400; + line-height: 1.5; + color: var(--font-color); +} + +a { + text-decoration: underline; + text-decoration-thickness: 2px; + text-underline-offset: .2rem; + color: var(--link-color); +} + +a:hover { + filter: brightness(115%); + animation: none; +} + +a:active { + filter: brightness(80%); + outline: none; +} + +button { + border: none; + outline: none; + color: black; + transition: width 1s; +} + +button:hover { + cursor: pointer; + animation: none; + filter: brightness(115%); + color: black; +} + +button:active { + filter: brightness(85%); +} + +/* Ultra Layout elements */ + +.wrap-everything { + display: flex; + width: 100%; + column-gap: 10px; +} + +#column-1 { + width: 350px; + padding: 10px 10px 10px 20px; + transition: 800ms; +} + +#column-2 { + width: var(--lfw); + background-color: var(--section-2-color); + text-align: right; + font-weight: bold; + line-height: 1.2; + color: black; + transition: 800ms; + z-index: 2; +} + +#column-2 a { + color: black; + text-decoration: none; +} + +#column-3 { + flex: 1; + margin-inline: auto; +} + +.wrap { + display: flex; + margin-inline: auto; + padding-left: 5px; + padding-right: 15px; + overflow: hidden; +} + +@media (max-width: 1680px) { + #column-1 { + margin-left: -370px; + } + + #column-2 { + margin-left: -230px; + } + + .wrap-everything { + column-gap: 5px; + } +} + +@media (max-width: 1500px) { + #column-1, + #column-2 { + display: none; + } +} + +.lcars-frame { + display: flex; + min-height: 280px; + position: relative; + --frame-color: var(--evening); +} + +.frame-col-1 { + width: 20px; + height: 280px; + background: var(--frame-color); + border-radius: 16px 0 0 16px; + position: relative; +} + +.frame-col-1:before { + content: ''; + display: block; + width: 20px; + height: 200px; + border-top: 5px solid black; + border-bottom: 5px solid black; + background-color: var(--frame-color); + position: absolute; + top: 40px; + left: 0; +} + +.frame-col-1-cell-a { + width: 14px; + height: 65px; + background-color: var(--grape); + border-left: 4px solid black; + border-bottom: 4px solid black; + position: absolute; + top: 45px; + right: 0; + z-index: 2; +} + +.frame-col-1-cell-b { + width: 14px; + height: 70px; + background-color: var(--cool); + border-left: 4px solid black; + position: absolute; + top: 110px; + right: 0; + z-index: 2; +} + +.frame-col-1-cell-c { + width: 14px; + height: 65px; + background-color: var(--grape); + border-top: 4px solid black; + border-left: 4px solid black; + position: absolute; + bottom: 45px; + right: 0; + z-index: 2; +} + +.frame-col-1-blocks:before { + content: ''; + display: block; + width: 10px; + height: 3px; + background-color: black; + position: absolute; + top: 54px; + left: 0; +} + +.frame-col-2 { + width:20px; + height: 280px; + background-color: var(--frame-color); + position: relative; +} + +.frame-col-2:before { + content: ''; + display: block; + width: 20px; + height: 240px; + background-color: black; + border-radius: 10px 0 0 10px; + position: absolute; + top: 20px; + left: 0; +} + +.frame-col-3 { + display: flex; + width: 240px; + height: 280px; + align-items: center; + justify-content: center; +} + +.frame-col-4 { + width:20px; + height: 280px; + background-color: var(--frame-color); + position: relative; +} + +.frame-col-4:before { + content: ''; + display: block; + width: 20px; + height: 240px; + background-color: black; + border-radius: 0 10px 10px 0; + position: absolute; + top: 20px; + left: 0; +} + +.display-horizontal { + rotate: 90deg; +} + +.frame-col-5 { + width:20px; + height: 280px; + background-color: var(--frame-color); + border-radius: 0 16px 16px 0; + padding-top: 40px; + position: relative; +} + +.frame-col-5:before { + content: ''; + display: block; + width: 20px; + height: 200px; + border-top: 5px solid black; + border-bottom: 5px solid black; + background-color: var(--frame-color); +} + +.frame-col-5-cell-a { + width: 14px; + height: 65px; + background-color: var(--tangerine); + border-bottom: 4px solid black; + border-right: 4px solid black; + position: absolute; + top: 45px; + left: 0; + z-index: 2; +} + +.frame-col-5-cell-b { + width: 14px; + height: 70px; + background-color: var(--cool); + border-right: 4px solid black; + position: absolute; + top: 110px; + left: 0; + z-index: 2; +} + +.frame-col-5-cell-c { + width: 14px; + height: 65px; + background-color: var(--tangerine); + border-top: 4px solid black; + border-right: 4px solid black; + position: absolute; + bottom: 45px; + left: 0; + z-index: 2; +} + +.line { + height: 20px; + width: 12px; + background: linear-gradient(#600, #f20, #600); +} + +.line:nth-child(1) { + animation: animateLine6 1s 0.2s infinite; +} + +.line:nth-child(2) { + animation: animateLine5 1s 0.3s infinite; +} + +.line:nth-child(3) { + animation: animateLine3 1s 0.4s infinite; +} + +.line:nth-child(4) { + animation: animateLine3 1s 0.5s infinite; +} + +.line:nth-child(5) { + animation: animateLine2 1s 0.6s infinite; +} + +.line:nth-child(6) { + animation: animateLine2 1s 0.7s infinite; +} + +.line:nth-child(7) { + animation: animateLine2 1s 0.8s infinite; +} + +/* 8 & 9 are middle lines*/ + +.line:nth-child(8) { + animation: animateLine4 1s 0.9s infinite; +} + +.line:nth-child(9) { + animation: animateLine4 1s 1s infinite; +} + +.line:nth-child(10) { + animation: animateLine2 1s 0.8s infinite; +} + +.line:nth-child(11) { + animation: animateLine2 1s 0.7s infinite; +} + +.line:nth-child(12) { + animation: animateLine2 1s 0.6s infinite; +} + +.line:nth-child(13) { + animation: animateLine3 1s 0.5s infinite; +} + +.line:nth-child(14) { + animation: animateLine3 1s 0.4s infinite; +} + +.line:nth-child(15) { + animation: animateLine5 1s 0.3s infinite; +} + +.line:nth-child(16) { + animation: animateLine6 1s 0.2s infinite; +} + +@keyframes animateLine2 { + 0% { + height: 180px; + } + 50% { + height: 90px; + } + 100% { + height: 180px; + } +} + +@keyframes animateLine3 { + 0% { + height: 120px; + } + 50% { + height: 60px; + } + 100% { + height: 120px; + } +} + +@keyframes animateLine4 { + 0% { + height: 230px; + } + 50% { + height: 115px; + } + 100% { + height: 230px; + } +} + +@keyframes animateLine5 { + 0% { + height: 60px; + } + 50% { + height: 30px; + } + 100% { + height: 60px; + } +} + +@keyframes animateLine6 { + 0% { + height: 30px; + } + 50% { + height: 15px; + } + 100% { + height: 30px; + } +} + +.pillbox, +.pillbox-2 { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 8px; + margin: 1.25rem auto; + text-align: right; + font-size: var(--sub-fonts); +} + +.pill, +.pill-2 { + display: flex; + width: 100%; + height: 56px; + justify-content: flex-end; + align-items: flex-end; + text-decoration: none; + color: black; + font-weight: bold; + padding-right: .75rem; + padding-bottom: .35rem; +} + +.pillbox a { + display: flex; + width: 100%; + height: 56px; + justify-content: flex-end; + align-items: flex-end; + text-decoration: none; + color: black; + font-weight: bold; + padding-right: .75rem; + padding-bottom: .35rem; +} + +.pillbox-2 a { + display: flex; + width: 100%; + height: 56px; + justify-content: flex-end; + align-items: flex-end; + text-decoration: none; + color: black; + font-weight: bold; + padding-right: .75rem; + padding-bottom: .35rem; +} + +.pill:hover, +.pill-2:hover { + filter: brightness(115%); +} + +.pill:active, +.pill-2:active { + filter: brightness(80%); +} + +.pill:nth-child(1), +.pillbox a:nth-child(1) { + border-radius: 100vmax 0 0 100vmax; + background-color: var(--pill-1-color); +} + +.pill:nth-child(2), +.pillbox a:nth-child(2) { + background-color: var(--pill-2-color); +} + +.pill:nth-child(3), +.pillbox a:nth-child(3) { + border-radius: 100vmax 0 0 100vmax; + background-color: var(--pill-3-color); +} + +.pill:nth-child(4), +.pillbox a:nth-child(4) { + background-color: var(--pill-4-color); +} + +.pill:nth-child(5), +.pillbox a:nth-child(5) { + background-color: var(--pill-5-color); + border-radius: 100vmax 0 0 100vmax; +} + +.pill:nth-child(6), +.pillbox a:nth-child(6) { + background-color: var(--pill-6-color); +} + +.pill-2:nth-child(1), +.pillbox-2 a:nth-child(1) { + border-radius: 100vmax 0 0 100vmax; + background-color: var(--pill-a1-color); +} + +.pill-2:nth-child(2), +.pillbox-2 a:nth-child(2) { + background-color: var(--pill-a2-color); + border-radius: 0 100vmax 100vmax 0; + padding-right: 1rem; +} + +.pill-2:nth-child(3), +.pillbox-2 a:nth-child(3) { + background-color: var(--pill-a3-color); +} + +.pill-2:nth-child(4), +.pillbox-2 a:nth-child(4) { + background-color: var(--pill-a4-color); + border-radius: 0 100vmax 100vmax 0; + padding-right: 1rem; +} + +.pill-2:nth-child(5), +.pillbox-2 a:nth-child(5) { + background-color: var(--pill-a5-color); + border-radius: 100vmax 0 0 100vmax; +} + +.pill-2:nth-child(6), +.pillbox-2 a:nth-child(6) { + background-color: var(--pill-a6-color); + border-radius: 0 100vmax 100vmax 0; + padding-right: 1rem; +} + +.lcars-list-2 ul { + list-style: none; +} + +.lcars-list-2 { + margin: 0 auto 50px auto; + padding-left: 5px; +} + +.lcars-list-2 li { + position: relative; + padding-bottom: 5px; + padding-left: 38px; + font-size: var(--sub-fonts); + color: var(--font-color); +} + +.lcars-list-2 li::before { + content: ''; + display: block; + width: 24px; + height: 14px; + border-radius: 50%; + background-color: var(--font-color); + position: absolute; + top: 8px; + left: 0; +} + +.panel-11 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 23vh; + max-height: 275px; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-11-color); + border-bottom: var(--panel-border); +} + +.panel-12 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 15vh; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-12-color); + border-bottom: var(--panel-border); +} + +.panel-13 a { + display: flex; + align-items: flex-end; + justify-content: flex-end; + padding: 1.5rem .75rem .75rem 2px; + background-color: var(--panel-13-color); + border-bottom: var(--panel-border); +} + +.panel-14 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 20vh; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-14-color); + border-bottom: var(--panel-border); +} + +.panel-15 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 20vh; + padding-right: .75rem; + padding-bottom: .75rem; + background-color: var(--panel-15-color); + border-bottom: var(--panel-border); +} + +.section-2-buttons a { + display: block; + text-decoration: none; + text-align: right; + border-bottom: var(--panel-border); + padding: 1.5rem .75rem .75rem 2px; + background-color: var(--evening); + text-transform: uppercase; + color: black; +} + +.section-2-buttons a:nth-child(2) { + background-color: var(--moonbeam); +} + +/* End Ultra layout elements */ + +.scroll-top { + display: none; +} + +.left-frame-top, +.left-frame { + width: var(--lfw); + text-align: right; + font-size: clamp(.875rem, 2vw, 1rem); + line-height: 1.2; + font-weight: bold; + color: black; + transition: width 1s; +} + +.left-frame-top { + background-color: var(--left-frame-top-color); + border-radius: var(--radius-top); +} + +.left-frame-top a, +.left-frame a { + text-decoration: none; + color: black; +} + +.left-frame { + display: flex; + flex-direction: column; + justify-content: space-between; + padding-top: 100px; + background-color: var(--left-frame-color); + border-radius: var(--radius-bottom); +} + +.panel-1 a { + display: block; + background-color: var(--panel-1-color); + padding-top: clamp(40px, 8vw, 110px); + padding-right: .75rem; + padding-bottom: .75rem; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.right-frame-top { + flex: 1; + align-content: flex-end; + position: relative; +} + +.right-frame-top:before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to top right, var(--corner-color-top) 50%, black 50%); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +.right-frame-top:after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-top); + position: absolute; + left: 0; + bottom: var(--bar-height); + z-index: -1; +} + +@media (max-width: 650px) { + .right-frame-top:before { + bottom: 16px; + } + + .right-frame-top:after { + bottom: 16px; + } +} + +@media (max-width: 525px) { + .right-frame-top:before { + bottom: 10px; + } + + .right-frame-top:after { + bottom: 10px; + } +} + +.banner { + padding-bottom: 1rem; + padding-left: 5px; + text-align: right; + text-transform: uppercase; + line-height: 1.1; + font-size: clamp(1.25rem, 0.75rem + 4vw, 3.75rem); + color: var(--banner-color); +} + +.banner a { + color: var(--banner-color); + text-decoration: none; +} + +.data-cascade-button-group { + display: flex; + justify-content: flex-end; +} + +@media (max-width: 1440px) { + .data-cascade-button-group:has(.header-content) { + row-gap: 1rem; + } + + .data-cascade-button-group:has(.header-content) > nav { + width: 100%; + } +} + +.header-content { + flex: 1; + min-height: 180px; + padding-right: .5rem; + padding-left: clamp(20px, 3vw, 50px); +} + +.header-content > *:first-child { + margin-top: 0; +} + +.header-content > *:last-child { + margin-bottom: 0; +} + +/* Data Cascade 2025 */ + +.data-cascade-wrapper { + flex: 1; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + max-width: 100%; + height: calc(var(--dc-row-height) * 9); /* 204px */ + overflow: hidden; + padding-right: .5rem; + padding-left: clamp(20px, 3vw, 50px); + column-gap: .5rem; +} + +.data-column { + display: grid; + grid-template-columns: 1fr; + margin-top: 1px; + text-align: right; + font-size: var(--dc-font-size); /* .938 */ + line-height: 1; + text-box: trim-both cap alphabetic; + color: black; +} + +.dc-row-1, +.dc-row-2, +.dc-row-3, +.dc-row-4, +.dc-row-5, +.dc-row-6, +.dc-row-7 { + text-box: trim-both cap alphabetic; + height: var(--dc-row-height); +} + +@media (max-width: 850px) { + .data-cascade-wrapper { + display: none; + } +} + + +@keyframes data-group-1 { + + 0%, + 3.99% { + color: black; + } + + 4%, + 45.99% { + color: var(--data-cascade-color); + } + + 46%, + 49.99% { + color: var(--light-color); + } + + 50%, + 63.99% { + color: var(--data-cascade-color); + } + + 64%, + 67.99% { + color: var(--light-color); + } + + 68%, + 100% { + color: var(--data-cascade-color); + } + + +} + +@keyframes data-group-1a { + + 0%, + 4.99% { + color: black; + } + + 5%, + 45.99% { + color: var(--data-cascade-color); + } + + 46%, + 49.99% { + color: var(--light-color); + } + + 50%, + 63.99% { + color: var(--data-cascade-color); + } + + 64%, + 67.99% { + color: var(--light-color); + } + + 68%, + 100% { + color: var(--data-cascade-color); + } + + +} + +@keyframes data-group-2 { + + 0%, + 12.99% { + color: black; + } + + 13%, + 49.99% { + color: var(--data-cascade-color); + } + + 50%, + 53.99% { + color: var(--light-color); + } + + 54%, + 67.99% { + color: var(--data-cascade-color); + } + + 68%, + 71.99% { + color: var(--light-color); + } + + 72%, + 100% { + color: var(--data-cascade-color); + } + + +} + +@keyframes data-group-2b { + + 0%, + 14.99% { + color: black; + } + + 15%, + 49.99% { + color: var(--data-cascade-color); + } + + 50%, + 53.99% { + color: var(--light-color); + } + + 54%, + 67.99% { + color: var(--data-cascade-color); + } + + 68%, + 71.99% { + color: var(--light-color); + } + + 72%, + 81.99% { + color: var(--data-cascade-color); + } + + 82%, + 100% { + color: var(--light-color); + } + + +} + +@keyframes data-group-3 { + + 0%, + 26.99% { + color: black; + } + + 27%, + 40.99% { + color: var(--light-color); + } + + 41%, + 53.99% { + color: var(--data-cascade-color); + } + + 54%, + 57.99% { + color: var(--light-color); + } + + 58%, + 71.99% { + color: var(--data-cascade-color); + } + + 72%, + 75.99% { + color: var(--light-color); + } + + 76%, + 100% { + color: var(--data-cascade-color); + } + +} + +.dc-row-1 { + animation: data-group-1 6000ms ease 200ms infinite; +} + +.dc-row-2 { + animation: data-group-1a 6000ms ease 200ms infinite; +} + +.dc-row-3 { + animation: data-group-2 6000ms ease 200ms infinite; +} + +.dc-row-4 { + animation: data-group-2b 6000ms ease 200ms infinite; +} + +.dc-row-5 { + animation: data-group-3 6000ms ease 200ms infinite; +} + +.dc-row-6 { + animation: data-group-3 6000ms ease 200ms infinite; +} + +.dc-row-7 { + animation: data-group-3 6000ms ease 200ms infinite; +} + + +/* Static data cascade */ + +.data-cascade-wrapper#frozen .dc-row-1 { + animation: none; + color: var(--data-cascade-color); +} + +.data-cascade-wrapper#frozen .dc-row-2 { + animation: none; + color: var(--data-cascade-color); +} + +.data-cascade-wrapper#frozen .dc-row-3 { + animation: none; + color: var(--data-cascade-color); +} + +.data-cascade-wrapper#frozen .dc-row-4 { + animation: none; + color: var(--data-cascade-color); +} + +.data-cascade-wrapper#frozen .dc-row-5 { + animation: none; + color: var(--light-color); +} + +.data-cascade-wrapper#frozen .dc-row-6 { + animation: none; + color: var(--light-color); +} + +.data-cascade-wrapper#frozen .dc-row-7 { + animation: none; + color: var(--light-color); +} + +/* Navigation & Buttons */ + +.lcars-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + margin-block: 1rem; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1 a { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + height: clamp(90px, 11vw, 160px); + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + transition: width 1s; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-1-button { + display: flex; + width: var(--lfw); + justify-content: flex-end; + align-items: flex-end; + background-color: var(--panel-1-color); + min-height: clamp(90px, 11vw, 160px); + overflow: hidden; + padding: var(--left-frame-padding); + border-radius: 0; + border-bottom: var(--panel-border); + text-decoration: none; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.panel-2 a { + display: flex; + justify-content: flex-end; + align-items: flex-end; + min-height: 3.75rem; + padding: var(--left-frame-padding); + background-color: var(--panel-2-color); + border-bottom: var(--panel-border); +} + +nav { + display: flex; + flex-wrap: wrap; + align-self: center; + width: calc(var(--nav-width) + var(--nav-width) + 1rem); + justify-content: flex-end; + column-gap: .5rem; + row-gap: .65rem; +} + +@media (max-width: 1500px) { + nav { + column-gap: .375rem; + row-gap: .5rem; + } +} + +@media (max-width: 1440px) { + .data-cascade-button-group:has(.header-content) { + row-gap: 1rem; + } + + .data-cascade-button-group:has(.header-content) > nav { + width: 100%; + } +} + +nav a, +nav button, +.buttons button { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: flex-end; + width: var(--nav-width); + height: calc(var(--nav-width) / 2.8); + padding-inline: 1.5rem; + padding-bottom: .7rem; + border-radius: 100vmax; + background-color: var(--button-color); + text-align: right; + line-height: 1.175; + text-decoration: none; + text-transform: uppercase; + font-weight: bold; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +nav a:nth-child(1), +nav button:nth-child(1) { + background-color: var(--nav-1-color); +} + +nav a:nth-child(2), +nav button:nth-child(2) { + background-color: var(--nav-2-color); +} + +nav a:nth-child(3), +nav button:nth-child(3) { + background-color: var(--nav-3-color); +} + +nav a:nth-child(4), +nav button:nth-child(4) { + background-color: var(--nav-4-color); +} + +@media (max-width: 1300px) { + nav { + padding-left: .5rem; + gap: .5rem; + } + + nav button { + padding-bottom: .5rem; + font-size: .875rem; + padding-inline: 1.25rem; + } +} + +@media (max-width: 780px) { + nav { + flex: 1; + } + + .data-cascade-button-group:has(.header-content) > *:nth-child(2) { + flex: none; + } +} + +@media (max-width: 450px) { + nav a, + nav button { + height: 63px; + } +} + +.buttons { + display: flex; + flex-wrap: wrap; + gap: .5rem; + margin-block: 2rem; +} + +.justify-space-between { + justify-content: space-between; +} + +.justify-center { + justify-content: center; +} + +.justify-flex-end { + justify-content: flex-end; +} + +.justify-space-around { + justify-content: space-around; +} + +.justify-space-evenly { + justify-content: space-evenly; +} + +.buttons a, +.buttons button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + width: 224px; + height: 80px; + padding-inline: 1.75rem; + padding-bottom: .675rem; + background-color: var(--button-color); + border-radius: 100vmax; + border-width: 0; + text-align: right; + line-height: 1.175; + text-decoration: none; + font-weight: bold; + text-transform: uppercase; + color: black; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.sidebar-nav button, +.sidebar-nav a, +.sidebar-button { + display: flex; + justify-content: flex-end; + align-items: flex-end; + min-height: 3.75rem; + width: var(--lfw); + background-color: var(--button-color-sidebar); + border-radius: 0; + border-bottom: var(--panel-border); + padding: var(--left-frame-padding); + text-decoration: none; + text-align: right; + word-break: break-all; + text-transform: uppercase; + color: black; +} + +@media (max-width: 1300px) { + .lcars-button, + .buttons a, + .buttons button { + width: 200px; + height: 74px; + } +} + +.panel-button { + display: flex; + justify-content: flex-end; + width: var(--lfw); + border-radius: 0; + padding: var(--left-frame-padding); + border-bottom: var(--panel-border); +} + +.pan-0 /* use this if you're not mimicking an established panel */ { + height: 18vh; + max-height: 240px; + background-color: var(--button-color-sidebar); +} + +.pan-4 { + height: 22vh; + max-height: 300px; + background-color: var(--panel-4-color) !important; +} + +.pan-5 { + height: 4.25rem; + background-color: var(--panel-5-color) !important; + align-items: center; +} + +.pan-6 { + height: 29vh; + max-height: 360px; + background-color: var(--panel-6-color) !important; +} + +.pan-7 { + height: 27vh; + max-height: 350px; + background-color: var(--panel-7-color) !important; +} + +.pan-8 { + height: 15vh; + background-color: var(--panel-8-color) !important; +} + +.pan-10 { + height: 30vh; + background-color: var(--panel-10-color) !important; +} + +.text-bottom { + align-items: flex-end; +} + +#topBtn { + display: none; + position: fixed; + bottom: 0; + z-index: 99; + border-radius: 0; + border-top: var(--panel-border); + border-right: none; + border-bottom: var(--panel-border); + border-left: none; + outline: none; + width: var(--lfw); + padding: var(--left-frame-padding); + padding-bottom: 10vh; + background-color: var(--panel-top-button-color); + text-align: right; + line-height: 1; + font-weight: bold; + text-transform: uppercase; + color: black; + cursor: pointer; +} + +#topBtn:hover { + filter: brightness(115%); +} + +#topBtn:active { + filter: brightness(80%); +} + +@media (max-width: 525px) { + .sidebar-button, + .sidebar-nav a, + .sidebar-nav button, + .panel-button { + font-size: .75rem; + } + + #topBtn { + padding-bottom: 6vh; + } +} + +/* --- Horizontal bar panels & sidebar panels --- */ + +.floor-text { + padding-top: .25rem; + font-size: 1.4rem; + text-align: right; + text-transform: uppercase; + color: var(--cool); +} + +.bar-panel { + display: flex; + height: var(--bar-height); +} + +.first-bar-panel { + margin-top: .5rem; +} + +.bar-1, +.bar-2, +.bar-3, +.bar-4, +.bar-5, +.bar-6, +.bar-7, +.bar-9, +.bar-10 { + height: var(--bar-height); +} + +.bar-1, +.bar-2, +.bar-3, +.bar-4, +.bar-6, +.bar-7, +.bar-8, +.bar-9 { + border-right: var(--bar-border); +} + +.bar-1 { + width: var(--bar-1-6-width); + background-color: var(--bar-1-color); +} + +.bar-2 { + width: var(--bar-2-7-width); + background-color: var(--bar-2-color); +} + +.bar-3 { + width: var(--bar-3-8-width); + background-color: var(--bar-3-color); +} + +.bar-4 { + flex: 1; + background-color: var(--bar-4-color); +} + +.bar-5 { + width: var(--bar-5-10-width); + background-color: var(--bar-5-color); +} + +.bar-6 { + width: var(--bar-1-6-width); + background-color: var(--bar-6-color); +} + +.bar-7 { + width: var(--bar-2-7-width); + background-color: var(--bar-7-color); +} + +.bar-8 { + width: var(--bar-3-8-width); + height: 50%; + background-color: var(--bar-8-color); +} + +.bar-9 { + flex: 1; + background-color: var(--bar-9-color); +} + +.bar-10 { + width: var(--bar-5-10-width); + background-color: var(--bar-10-color); +} + +/* LCARS bottom section */ + +#gap { + margin-top: var(--divider-height); +} + +.panel-3, +.panel-4, +.panel-5, +.panel-6, +.panel-7, +.panel-8 { + border-bottom: var(--panel-border); +} + +.panel-3, +.panel-4, +.panel-6, +.panel-7, +.panel-8, +.panel-10 { + padding: var(--left-frame-padding); +} + +.panel-4 { + display: flex; + align-items: flex-end; + justify-content: flex-end; + height: 22vh; + max-height: 300px; + background-color: var(--panel-4-color); +} + +.panel-5 { + display: flex; + justify-content: flex-end; + align-items: center; + height: 4.25rem; + padding: var(--left-frame-padding); + background-color: var(--panel-5-color); +} + +.panel-6 { + height: 29vh; + max-height: 360px; + background-color: var(--panel-6-color); +} + +.panel-7 { + height: 27vh; + max-height: 350px; + background-color: var(--panel-7-color); +} + +.panel-8 { + height: 15vh; + background-color: var(--panel-8-color); +} + +/* panel-9 height is fluid and governed by the amount of content on the page. Background color is inherited from :root --left-frame-color */ + +.panel-9 { + min-height: 27vh; + padding: var(--left-frame-padding); +} + +.panel-10 { + height: 30vh; + border-top: var(--panel-border); + background-color: var(--panel-10-color); +} + +@media (max-width: 525px) { + .panel-4, + .panel-6, + .panel-7 { + height: 18vh; + } +} + +.right-frame { + flex: 1; + position: relative; +} + +.right-frame:before { + content: ''; + display: block; + width: 60px; + height: 60px; + background: linear-gradient(to bottom right, var(--corner-color-bottom) 50%, black 50%); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +.right-frame:after { + content: ''; + display: block; + width: 60px; + height: 60px; + background-color: black; + border-radius: var(--radius-content-bottom); + position: absolute; + left: 0; + top: var(--bar-height); + z-index: -1; +} + +main { + padding-top: clamp(1rem, 4vw, 45px); + padding-bottom: .5rem; + padding-left: clamp(20px, 3vw, 50px); +} + +main > *:first-child, +article > *:first-child { + margin-top: 0; +} + +main:has(.floor-heading) > *:nth-child(2) { + margin-top: 0; +} + +.flexbox { + display: flex; + gap: 1.2rem; + flex-wrap: wrap; +} + +.col { + flex: 1 1 360px; +} + +.col > *:first-child { + margin-top: 0; +} + +h1, h2, h3, h4 { + margin-block: 1.75rem; + font-weight: normal; + line-height: 1.2; + text-transform: uppercase; + text-box: trim-both cap alphabetic; +} + +h1 { + font-size: clamp(1.5rem, 1.25rem + 3.5vw, 4rem); + text-align: right; + color: var(--h1-color); +} + +h2 { + font-size: clamp(1.4rem, 1.1rem + 2.25vw, 2.3rem); + color: var(--h2-color); +} + +h3 { + font-size: clamp(1.15rem, 1.05rem + 1.25vw, 1.875rem); + color: var(--h3-color); +} + +h4 { + font-size: clamp(1.025rem, 1rem + 1.125vw, 1.575rem); + color: var(--h4-color); +} + +.floor-heading { + display: flex; + justify-content: flex-end; + width: 100%; + position: fixed; + left: 50%; + transform: translate(-50%, 0); + bottom: 10px; + z-index:4; +} + +.floor-heading > * { + margin-block: 0; + width: fit-content; + padding-inline: .5rem; + padding-bottom: .5rem; + background-color: black; +} + +p { + margin-block: 1.75rem; + text-box: trim-both cap alphabetic; +} + +.caption { + margin-top: -1rem; + text-align: center; + font-size: var(--sub-fonts); +} + +.indent { + padding-left: 1.5rem; +} + +.postmeta { + margin-block: 1.25rem; + text-align: right; + font-size: clamp(1.2rem, 0.88rem + 1.28vw, 1.6rem); + line-height: 1.2; + text-transform: uppercase; +} + +article h1 { + margin-bottom: 0; +} + +hr { + margin-block: 1.5rem; + height: 6px; + border: none; + background-color: var(--font-color); + border-radius: 3px; +} + +blockquote { + margin-block: 1.75rem; + margin-left: 1.5rem; + padding-block: .25rem; + padding-left: 1.5rem; + position: relative; + text-box: trim-both cap alphabetic; +} + +blockquote::before { + content: ''; + display: block; + width: 10px; + height: 100%; + background-color: var(--font-color); + border-radius: 5px; + position: absolute; + left: 0; + top: 0; +} + +blockquote > *:first-child { + margin-top: 0; +} + +blockquote > * { + margin-bottom: 0; +} + +iframe { + display: block; + width: 100%; + border: none; +} + +.flush { + margin-top: -1rem; +} + +.nomar { + margin-block: 0 !important; +} + +.go-center { + text-align: center !important; +} + +.go-right { + text-align: right !important; +} + +.go-left { + text-align: left !important; +} + +.go-big { + font-size: clamp(1.2rem, 1rem + 1vw, 1.275rem); +} + +.uppercase { + text-transform: uppercase; +} + +.strike { + text-decoration: line-through; + text-decoration-thickness: .15rem; +} + +.now { + white-space: nowrap; +} + +.big-sky { + margin-top: 5rem; +} + +.smoke-glass { + opacity: .35; +} + +strong { + font-weight: bold; +} + +code { + font-family: monospace; + font-size: .9rem; + color: var(--code-color); +} + +.code { + width: 100%; + min-height: 5rem; + padding-block: .5rem; + padding-inline: 1rem; + background-color: #232323; + border-color: #4c4c4c; + tab-size: 4; + font-family: monospace; + font-size: .85rem; + color: #dcdcdc; +} + +@keyframes blink { + 0% {opacity: 0} + 49%{opacity: 0} + 50% {opacity: 1} +} + +.blink-slow { + animation: blink 3500ms infinite; +} + +.blink { + animation: blink 2s infinite; +} + +.blink-fast { + animation: blink 1s infinite; +} + +@keyframes pulse { + 0% {filter: brightness(1.0)} + 50% {filter: brightness(.25)} +} + +.pulse { + animation: pulse 2s infinite; +} + +.pulse-rate-high { + animation: pulse 1s infinite; +} + +.pulse-rate-low { + animation: pulse 3s infinite; +} + +.accordion-wrapper { + display: block; + margin: 1.75rem auto; + width: 100%; +} + +.limit-width { + max-width: 1240px; +} + +.accordion { + display: flex; + align-items: center; + min-height: 3rem; + width: 100%; + padding-right: 2.75rem; + padding-left: 1rem; + border-radius: 100vmax; + background-color: var(--cool); + border-left: solid 3rem var(--evening); + text-align: left; + font-size: 1.25rem; + color: black; + cursor: pointer; + transition: 0.4s ease; + position: relative; +} + +.active, .accordion:hover { + background-color: var(--ghost); /* 8bf */ + border-left-color: var(--moonbeam); + filter: none; +} + +.accordion:before { + content: ''; + display: block; + width: .5rem; + height: 4rem; + background-color: black; + position: absolute; + top: 0; + left: 0; +} + +.accordion:after { + display: block; + content: '\276F'; + position: absolute; + right: 1.5rem; + top: 21%; + transform: rotate(90deg); + transition: 0.4s; + font-weight: bold; + color: black; +} + +.active:after { + content: "\276F"; + transform:rotate(-90deg); + transition: 0.4s ease; +} + +.accordionContent { + padding-block: .5rem; + padding-inline: 3.5rem; + max-height: 0; + overflow: hidden; + transition: max-height 0.25s ease-out; +} + +.accordionContent ul { + margin-left: 0; +} + +@media (max-width: 525px) { + .accordion { + min-height: 2.5rem; + font-size: 1rem; + border-left-width: 2.5rem; + } +} + +/* Images */ + +.pics-right { + float: right; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; +} + +.pics-left { + float: left; + margin-inline: 1rem; + margin-bottom: 2rem; + max-width: 500px; +} + +@media (max-width: 1060px) { + .pics-right, + .pics-left { + float: none; + margin-inline: auto; + } + + .pics-right img, + .pics-left img { + margin-inline: auto; + } +} + +.pics { + margin-block: 2rem; + margin-inline: auto; +} + +.border { + border: 2px solid var(--font-color); +} + +.lcars-list { + margin-block: 1.15rem; + margin-left: 2rem; + list-style: none; +} + +.lcars-list li { + position: relative; + padding-block: .45rem; + padding-left: 2.25rem; + text-box: trim-both cap alphabetic; +} + +.lcars-list li::before { + content: ''; + display: block; + width: 34px; + height: 18px; + border-radius: 50%; + background-color: var(--font-color); + position: absolute; + top: .45rem; + left: 0; +} + +@media (max-width: 650px) { + + .lcars-list { + margin-left: .5rem; + } + + .lcars-list li::before { + transform: scale(90%); + } +} + +.lcars-bar { + margin-block: 1.75rem; + height: clamp(15px, 2vh, 25px); + background: transparent; + border-right: clamp(15px, 2vh, 25px) solid var(--lcars-bar-end-color); + border-left: clamp(15px, 2vh, 25px) solid var(--lcars-bar-start-color); + border-radius: 100vmax; + position: relative; +} + +.lcars-bar::after { + content: ''; + display: block; + height: clamp(15px, 2vh, 25px); + width: 100%; + background-color: var(--lcars-bar-color); + border-right: .8vh solid black; + border-left: .8vh solid black; + position: absolute; + top: 0; + left: 0; +} + +.lcars-text-bar { + display: flex; + position: relative; + height: clamp(16px, 4vh, 41px); + margin-block: 2.75rem; + overflow: visible; + border-radius: 100vmax; + background-color: var(--lcars-bar-color); + border-right: clamp(16px, 4vh, 43px) solid var(--lcars-bar-end-color); + border-left: clamp(16px, 4vh, 43px) solid var(--lcars-bar-start-color); +} + +.the-end { + justify-content: flex-end; +} + +.lcars-text-bar h2, +.lcars-text-bar h3, +.lcars-text-bar h4, +.lcars-text-bar span { + margin-block: 0; + background-color: black; + height: clamp(20px, 5.5vh, 60px); /* Setting height is a Firefox fix */ + overflow: visible; + border-top: 1px solid black; + padding-inline: 1vh; + font-size: clamp(17px, 4.5vh, 46px); + line-height: 1; + text-transform: uppercase; + color: var(--lcars-bar-text-color); + z-index: 1; + text-box: trim-both cap alphabetic; +} + +.lcars-text-bar::before { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + left: 0; + overflow: hidden; +} + +.lcars-text-bar::after { + content: ''; + background-color: black; + display: block; + width: 1vh; + height: 6vh; + position: absolute; + top: 0; + right: 0; + overflow: hidden; +} + +/* Image Frame */ + +.image-frame { + display: block; + margin: 2.75rem auto; + width: fit-content; + background: linear-gradient(var(--primary-color) 56%, var(--secondary-color) 44%); + border-radius: 50px 25px 0 50px; + position: relative; +} + +.image-frame::before { + content: ''; + display: block; + width: 40px; + height: 40px; + background-color: black; + position: absolute; + right: 0; + top: 0; +} + +.image-frame::after { + content: ''; + display: block; + border-top: var(--spacers) solid black; + border-bottom: var(--spacers) solid black; + width: 45px; + height: 80px; + background-color: var(--secondary-color); + position: absolute; + left: 0; + top: 56%; +} + +.imgf-title { + display: flex; + justify-content: flex-end; + height: 40px; + border-right: 40px solid var(--secondary-color); + border-radius: 25px 100vh 100vh 0; + position: relative; + z-index: 1; + text-align: right; +} + +.h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + border-right: var(--spacers) solid black; +} + +.imgf-title h4 { + margin-block: 0; + width: fit-content; + background-color: black; + padding-left: var(--spacers); + font-size: 2.05rem; + color: var(--title-color); + line-height: 40px; + text-transform: uppercase; +} + +.imgf-image-body { + margin-left: 45px; + background-color: black; + width: fit-content; + padding: 1rem; + border-radius: 28px 0 0 28px; + +} + +.image-holder { + width: fit-content; + padding: 1rem; + border: 2px solid var(--image-border-color); + border-radius: 20px; +} + +.imgf-base { + display: grid; + grid-template-columns: 20% 13% 35px 15% 1fr; + margin-left: 80px; + border-left: var(--spacers) solid black; + +} + +.imgf-block-1 { + height: var(--frame-height); + background-color: var(--accent-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-2 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-right: var(--spacers) solid black; +} + +.imgf-block-3 { + height: var(--frame-height); + background-color: black; + border-right: 10px solid var(--secondary-color); + border-left: 10px solid var(--accent-color); +} + +.imgf-block-4 { + height: var(--frame-height); + background-color: var(--secondary-color); + border-left: var(--spacers) solid black; +} + +.imgf-block-5 { + height: var(--frame-height); + background-color: black; +} + +@media (max-width: 750px) { + + .image-frame { + border-radius: 40px 25px 0 40px; + } + + .image-frame::after { + width: 25px; + height: 60px; + top: 50%; + } + + .imgf-title { + height: 25px; + border-right: 24px solid var(--secondary-color); + } + + .h4-wrapper { + width: fit-content; + height: var(--frame-height); + background-color: black; + } + + .imgf-title h4 { + font-size: 1.45rem; + } + + .imgf-image-body { + margin-left: 25px; + padding: .75rem; + border-radius: 20px 0 0 20px; + } + + .image-holder { + padding: .75rem; + border-radius: 10px; + } +} + +/* color styles */ + +.font-cardinal { + color: var(--cardinal) !important; +} + +.button-cardinal, +.background-cardinal, +.bullet-cardinal::before { + background-color: var(--cardinal) !important; +} + +.font-cool { + color: var(--cool) !important; +} + +.button-cool, +.background-cool, +.bullet-cool::before { + background-color: var(--cool) !important; +} + +.font-evening { + color: var(--evening) !important; +} + +.button-evening, +.background-evening, +.bullet-evening::before { + background-color: var(--evening) !important; +} + +.font-galaxy-gray { + color: var(--galaxy-gray) !important; +} + +.button-galaxy-gray, +.background-galaxy-gray, +.bullet-galaxy-gray::before { + background-color: var(--galaxy-gray) !important; +} + +.font-ghost { + color: var(--ghost) !important; +} + +.button-ghost, +.background-ghost, +.bullet-ghost::before { + background-color: var(--ghost) !important; +} + +.font-grape { + color: var(--grape) !important; +} + +.button-grape, +.background-grape, +.bullet-grape::before { + background-color: var(--grape) !important; +} + +.font-honey { + color: var(--honey) !important; +} + +.button-honey, +.background-honey, +.bullet-honey::before { + background-color: var(--honey) !important; +} + +.font-lawn { + color: var(--lawn) !important; +} + +.button-lawn, +.background-lawn, +.bullet-lawn::before { + background-color: var(--lawn) !important; +} + +.font-martian { + color: var(--martian) !important; +} + +.button-martian, +.background-martian, +.bullet-martian::before { + background-color: var(--martian) !important; +} + +.font-midnight { + color: var(--midnight) !important; +} + +.button-midnight, +.background-midnight, +.bullet-midnight::before { + background-color: var(--midnight) !important; +} + +.font-moonbeam { + color: var(--moonbeam) !important; +} + +.button-moonbeam, +.background-moonbeam, +.bullet-moonbeam::before { + background-color: var(--moonbeam) !important; +} + +.font-pumpkinshade { + color: var(--pumpkinshade) !important; +} + +.button-pumpkinshade, +.background-pumpkinshade, +.bullet-pumpkinshade::before { + background-color: var(--pumpkinshade) !important; +} + +.font-roseblush { + color: var(--roseblush) !important; +} + +.button-roseblush, +.background-roseblush, +.bullet-roseblush::before { + background-color: var(--roseblush) !important; +} + +.font-tangerine { + color: var(--tangerine) !important; +} + +.button-tangerine, +.background-tangerine, +.bullet-tangerine::before { + background-color: var(--tangerine) !important; +} + +.font-wheat { + color: var(--wheat) !important; +} + +.button-wheat, +.background-wheat, +.bullet-wheat::before { + background-color: var(--wheat) !important; +} + +/* Footer */ + +footer { + margin-top: 2.5vw; + padding-bottom: 3rem; + padding-left: clamp(20px, 3vw, 50px); + font-size: .875rem; +} + +.meta-data { + margin-bottom: 1rem; + width: fit-content; + font-size: 1.25rem; + border-right: 24px solid var(--cool); + border-left: 24px solid var(--cool); + border-radius: 0 100vmax 100vmax 0; + padding-inline: .375rem; + position: relative; + line-height: 1; + text-box: trim-both cap alphabetic; +} + +.meta-data:before { + content: ''; + display: block; + width: 5px; + height: 2rem; + background-color: black; + position: absolute; + top: 0; + left: -20px; +} + +.headtrim { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + top: 0; + left: 0; + z-index: 999; +} + +.baseboard { + height: 10px; + width: 100%; + background-color: black; + position: fixed; + bottom: 0; + left: 0; + z-index: 999; +} + +/* Grouped @media */ + +@media (max-width: 525px) { + + body { + padding: .25rem; + } + + .baseboard { + display: none; + } + + .wrap { + padding-left: 0; + padding-right: .25rem; + } + + .left-frame { + padding-top: 25px; + } + + .floor-heading { + bottom: 0; + } + + .hop { + display: none; + } + + .floor-text { + font-size: 1.125rem; + } + + blockquote { + margin-left: .75rem; + } +} + +@-moz-document url-prefix() { + + main { + padding-top: clamp(1rem, 4vw, 30px); + } + + h1, h2, h3, h4, p { + margin-block: 1.1rem; + } + + .lcars-text-bar h2, + .lcars-text-bar span { + position: absolute; + top: -.6vh; + } + + .meta-data { + height: 1.15rem; + line-height: 1rem; + } +} + +@-moz-document url-prefix() { + + main { + padding-top: clamp(1rem, 4vw, 30px); + } + + h1, h2, h3, h4, p { + margin-block: 1.15rem; + } + + .imgf-title h4 { + margin-top: -4px; + margin-bottom: 0; + } + + .postmeta { + margin-top: .75rem; + } + + .lcars-text-bar h2, + .lcars-text-bar h3, + .lcars-text-bar h4, + .lcars-text-bar span { + position: absolute; + top: -.7vh; + } + + .lcars-list li::before { + top: .85rem; + } + + .meta-data { + height: 1.15rem; + line-height: 1rem; + } +} \ No newline at end of file diff --git a/lcars/frontend/index copy 2.html b/lcars/frontend/index copy 2.html new file mode 100644 index 0000000..c80719d --- /dev/null +++ b/lcars/frontend/index copy 2.html @@ -0,0 +1,321 @@ + + + + + Lower Decks PADD + + + + + + + + + + + +
+
+
+ + +
02-262000
+
+
+ +
+
+
+
47
+
31
+
28
+
94
+
+
+
329
+
128
+
605
+
704
+
+
+
39725514862
+
51320259663
+
21857221984
+
40372566301
+
+
+
56
+
04
+
40
+
35
+
+
+
614
+
883
+
109
+
297
+
+
+
000
+
13
+
05
+
25
+
+
+
48
+
07
+
38
+
62
+
+
+
416
+
001
+
888
+
442
+
+
+
86225514862
+
31042009183
+
74882306985
+
54048523421
+
+
+
10
+
80
+
31
+
85
+
+
+
87
+
71
+
40
+
26
+
+
+
98
+
63
+
52
+
71
+
+
+
118
+
270
+
395
+
260
+
+
+
8675309
+
7952705
+
9282721
+
4981518
+
+
+
000
+
99
+
10
+
84
+
+
+
65821407321
+
54018820533
+
27174523016
+
38954062564
+
+
+
999
+
202
+
574
+
293
+
+
+
3872
+
1105
+
1106
+
7411
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
03-111968
+
04-041969
+
05-1701D
+
06-071984
+
+
+
07-081940
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ CRITICAL: Core logic node recursion detected! ACK + required! +
+
+ + +
+
+ ALERT: Warp coil 7C emitting sparks +
+
+ + + + + + + + +
+
+ INFO: Crewman Mariner spilled coffee +
+
+ + +
+
+ CRITICAL: Warp field instability detected! Immediate + action! +
+
+ + +
+
+ ALERT: Transporter buffer overload +
+
+ + + + + + + + +
+
+ INFO: Crewman Boimler practicing tap-dancing in + holodeck +
+
+ +
+ + + + + +
+
+ + Content Copyright © 2025 ld.hedeler.com
+ + + LCARS Inspired Website Template by www.TheLCARS.com. +
+
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/lcars/frontend/index copy.html b/lcars/frontend/index copy.html new file mode 100644 index 0000000..1583566 --- /dev/null +++ b/lcars/frontend/index copy.html @@ -0,0 +1,235 @@ + + + + Lower Decks PADD + + + + + + + + + + +
+
+
+ + +
02-262000
+
+
+ +
+
+
+
47
+
31
+
28
+
94
+
+
+
329
+
128
+
605
+
704
+
+
+
39725514862
+
51320259663
+
21857221984
+
40372566301
+
+
+
56
+
04
+
40
+
35
+
+
+
614
+
883
+
109
+
297
+
+
+
000
+
13
+
05
+
25
+
+
+
48
+
07
+
38
+
62
+
+
+
416
+
001
+
888
+
442
+
+
+
86225514862
+
31042009183
+
74882306985
+
54048523421
+
+
+
10
+
80
+
31
+
85
+
+
+
87
+
71
+
40
+
26
+
+
+
98
+
63
+
52
+
71
+
+
+
118
+
270
+
395
+
260
+
+
+
8675309
+
7952705
+
9282721
+
4981518
+
+
+
000
+
99
+
10
+
84
+
+
+
65821407321
+
54018820533
+
27174523016
+
38954062564
+
+
+
999
+
202
+
574
+
293
+
+
+
3872
+
1105
+
1106
+
7411
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
03-111968
+
04-041969
+
05-1701D
+
06-071984
+
+
+
07-081940
+
+
+
+
+
+
+
+
+
+
+
+ + + +

Hello

+

Welcome to LCARS • Lower Decks PADD Theme

+

Version 24.2

+

Replace This Content With Your Own

+

Live long and prosper.

+ + + +
+
+ + Content Copyright © 2025 ld.hedeler.com
+ + + LCARS Inspired Website Template by www.TheLCARS.com. +
+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/lcars/frontend/index.html b/lcars/frontend/index.html new file mode 100644 index 0000000..1963f18 --- /dev/null +++ b/lcars/frontend/index.html @@ -0,0 +1,345 @@ + + + + + Lower Decks PADD + + + + + + + + + + + +
+
+
+ + +
02-262000
+
+
+ +
+
+
+
47
+
31
+
28
+
94
+
+
+
329
+
128
+
605
+
704
+
+
+
39725514862
+
51320259663
+
21857221984
+
40372566301
+
+
+
56
+
04
+
40
+
35
+
+
+
614
+
883
+
109
+
297
+
+
+
000
+
13
+
05
+
25
+
+
+
48
+
07
+
38
+
62
+
+
+
416
+
001
+
888
+
442
+
+
+
86225514862
+
31042009183
+
74882306985
+
54048523421
+
+
+
10
+
80
+
31
+
85
+
+
+
87
+
71
+
40
+
26
+
+
+
98
+
63
+
52
+
71
+
+
+
118
+
270
+
395
+
260
+
+
+
8675309
+
7952705
+
9282721
+
4981518
+
+
+
000
+
99
+
10
+
84
+
+
+
65821407321
+
54018820533
+
27174523016
+
38954062564
+
+
+
999
+
202
+
574
+
293
+
+
+
3872
+
1105
+
1106
+
7411
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
03-111968
+
04-041969
+
05-1701D
+
06-071984
+
+
+
07-081940
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+ CRITICAL: Core logic node recursion detected! ACK + required! +
+ ×1 +
+
+ + +
+
+
+
+ ALERT: Warp coil 7C emitting sparks +
+ ×1 +
+
+ + + + + + + + +
+
+
+
+ INFO: Crewman Mariner spilled coffee +
+ ×1 +
+
+ +
+ + + +
+
+ + Content Copyright © 2025 ld.hedeler.com
+ + + LCARS Inspired Website Template by www.TheLCARS.com. +
+
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/lcars/go.mod b/lcars/go.mod new file mode 100644 index 0000000..5a773da --- /dev/null +++ b/lcars/go.mod @@ -0,0 +1,18 @@ +module ld + +go 1.25.0 + +require modernc.org/sqlite v1.39.0 + +require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect + golang.org/x/sys v0.34.0 // indirect + modernc.org/libc v1.66.3 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect +) diff --git a/lcars/go.sum b/lcars/go.sum new file mode 100644 index 0000000..c46fb2d --- /dev/null +++ b/lcars/go.sum @@ -0,0 +1,49 @@ +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM= +modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU= +modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE= +modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM= +modernc.org/fileutil v1.3.8/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ= +modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.39.0 h1:6bwu9Ooim0yVYA7IZn9demiQk/Ejp0BtTjBWFLymSeY= +modernc.org/sqlite v1.39.0/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/lcars/interval/interval.go b/lcars/interval/interval.go new file mode 100644 index 0000000..e755d5e --- /dev/null +++ b/lcars/interval/interval.go @@ -0,0 +1,94 @@ +package interval + +import ( + "errors" + "math/rand" + "sync" + "time" +) + +type MutexMap[K comparable, V any] struct { + mutex sync.Mutex + m map[K]V +} + +func (m *MutexMap[K, V]) Get(key K) (V, error) { + m.mutex.Lock() + defer m.mutex.Unlock() + + v, ok := m.m[key] + if !ok { + return v, errors.New("unknown key") + } + return v, nil +} + +func (m *MutexMap[K, V]) Set(key K, value V) { + m.mutex.Lock() + defer m.mutex.Unlock() + + m.m[key] = value +} + +func (m *MutexMap[K, V]) Delete(key K) { + m.mutex.Lock() + defer m.mutex.Unlock() + + delete(m.m, key) +} + +var stopChannels = MutexMap[int, chan bool]{ + m: make(map[int]chan bool), +} + +// SetInterval schedules a repeating task to be executed at a specified interval. +func SetInterval(f func(), milliseconds int) (id int) { + for { + id = rand.Int() + if _, err := stopChannels.Get(id); err == nil { + continue // ID collision, keep looking for another unique random value + } + break + } + + stop := make(chan bool) + stopChannels.Set(id, stop) + + ticker := time.NewTicker(time.Duration(milliseconds) * time.Millisecond) + + go func() { + for { + select { + case <-stop: + ticker.Stop() + return + case <-ticker.C: + f() + } + } + }() + + return +} + +// ClearInterval stops a scheduled interval identified by the specified interval ID. +func ClearInterval(id int) error { + stop, err := stopChannels.Get(id) + if err != nil { + return err + } + stop <- true + stopChannels.Delete(id) + + return nil +} + +// SetTimeout schedules a one-time task to be executed after a specified interval. +func SetTimeout(f func(), milliseconds int) { + timer := time.NewTimer(time.Duration(milliseconds) * time.Millisecond) + go func() { + <-timer.C + timer.Stop() + f() + }() +} diff --git a/lcars/ld.log b/lcars/ld.log new file mode 100644 index 0000000..e69de29 diff --git a/lcars/main.go b/lcars/main.go new file mode 100644 index 0000000..8bf7efc --- /dev/null +++ b/lcars/main.go @@ -0,0 +1,153 @@ +package main + +import ( + "embed" + "fmt" + "ld/server" + "ld/sqlite" + "log" + "os" + "os/signal" + "path/filepath" + "strings" + "syscall" +) + +const ( + exitCodeErr = 1 + exitCodeInterrupt = 2 +) + +var AppRoot = "./" // path for supporting files that sit in app root folder in production + +//go:embed frontend/* +var frontend embed.FS + +//go:embed embed +var embedded embed.FS + +// main specific variables +var ExecutableName string + +func main() { + fmt.Println("Here") + err := run() + if err != nil { + os.Exit(exitCodeErr) + } + ExecutableName, err = getExecutableName() + if err != nil { + os.Exit(exitCodeErr) + } + + readCrew() + + readMessages() + + run() + +} + +func run() error { + + // setting up logging to file + logFileName := AppRoot + ExecutableName + ".log" + logFile, err := os.OpenFile(logFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Printf("error opening file: %v", err) + os.Exit(exitCodeErr) + } + defer logFile.Close() + log.SetOutput(logFile) + + stateDB, err := createStateDB(true) + if err != nil { + log.Fatalf("Failed to create internal StateDB: %v", err) + } + + return nil + // setting up the server + server, err := server.New( + logFileName, + stateDB, + embedded, + ) + + if err != nil { + log.Fatalf("server-app not created - error: %v", err) + } + + // tasks.SetupTasks(server) + + err = server.Start() + if err != nil { + fmt.Printf("server not started - error: %v \n", err) + log.Fatalf("server not started - error: %v", err) + } + + // listen for os shutdown events, report them into log file and exit application + chanOS := make(chan os.Signal, 2) + signal.Notify(chanOS, os.Interrupt, syscall.SIGTERM) + go func() { + <-chanOS + log.Println("shutting down request signal received") + server.Close() + os.Exit(exitCodeInterrupt) + }() + + // setting up the routes, hooking up API endpoints with backend functions + // routes.SetupRoutes(server) + + return nil + +} + +// some internal functions + +func getExecutableName() (string, error) { + name, err := os.Executable() + if err != nil { + return "", err + } + name = filepath.Base(name) + return strings.TrimSuffix(name, filepath.Ext(name)), nil +} + +func createStateDB(StateDBDelete bool) (*sqlite.Database, error) { + + // fileName := fmt.Sprintf("state-%s.db", ulid.Make()) + + fileName := "state.db" + + if StateDBDelete { + _, err := os.Stat(fileName) + if err == nil { + err := os.Remove(fileName) + if err != nil { + log.Fatal("error deleting statedb-file:", err) + } + } + } + + db, err := sqlite.New(fileName) + if err != nil { + return nil, err + } + + err = db.Open() + if err != nil { + return nil, err + } + + query, err := embedded.ReadFile("embed/create_state_db.sql") + if err != nil { + return nil, err + } + + _, err = db.DB().Exec(string(query)) + if err != nil { + return nil, err + } + + return db, nil +} diff --git a/lcars/server/server.go b/lcars/server/server.go new file mode 100644 index 0000000..8215953 --- /dev/null +++ b/lcars/server/server.go @@ -0,0 +1,103 @@ +// Copyright 2024 codeM GmbH +// Author: Thomas Hedeler +package server + +import ( + "embed" + "ld/interval" + "ld/sqlite" + "log" +) + +type Server struct { + SQLiteVersion string + ServerInfo map[string]any + StateDB *sqlite.Database + Embedded embed.FS + LogFileName string + TokenDuration int // TODO einbauen + Secret []byte + Header string + intervalID int + Tasks map[string]TaskFunc +} + +func New( + logfilename string, + StateDB *sqlite.Database, + embedded embed.FS, + +) (*Server, error) { + + // creating the server + return &Server{ + LogFileName: logfilename, + StateDB: StateDB, + Embedded: embedded, + Tasks: make(map[string]func(s *Server) error), + }, nil +} + +func (s *Server) Start() error { + + // query, err := s.Embedded.ReadFile("embed/win/server_info.sql") + // if err != nil { + // return err + // } + + // res, err := s.StundenDB.ReadRecords(string(query)) + // if err != nil { + // return err + // } + + // s.ServerInfo = res[0] + + // err = inits.LoadLogins(s.StundenDB, s.StateDB) + // if err != nil { + // return err + // } + + // err = inits.LoadTasks(s.StundenDB, s.StateDB) + // if err != nil { + // return err + // } + + // // start the task engine + // if s.Production { + // s.intervalID = interval.SetInterval(s.interval, 60000) // check for executable tasks every 60 seconds + // } else { + // s.intervalID = interval.SetInterval(s.interval, 30000) // check for executable tasks every 30 seconds + // } + return nil +} + +func (s *Server) Close() error { + + // stop the task engine + err := interval.ClearInterval(s.intervalID) + if err != nil { + log.Print(err) + } + + err = s.StateDB.Close() + if err != nil { + log.Print(err) + } + return err +} + +// func to dispatch routes to all parts of the application: +// they receive references to the server and the current fiber context via closures +// this way all functions have access to server properties and can handle the +// incoming requests themselves. + +// type HandlerFunc = func(s *Server, c *fiber.Ctx) error + +// func (s *Server) Handler(handler HandlerFunc) func(c *fiber.Ctx) error { +// return func(c *fiber.Ctx) error { +// return handler(s, c) +// } +// } + +// signature for internal tasks +type TaskFunc = func(s *Server) error diff --git a/lcars/server/taskengine.go b/lcars/server/taskengine.go new file mode 100644 index 0000000..7062e81 --- /dev/null +++ b/lcars/server/taskengine.go @@ -0,0 +1,118 @@ +package server + +import ( + "log" + "time" +) + +// this function schedules the tasks and will be called periodically, see server.Start() +func (s *Server) interval() { + + // read scheduled task list from stateDB + // check for next executable task: + // - if there is one or more tasks ready for execution then select one of them. + // - if there is a selected task, update its next execution field and execute the task + + defer func() { + if r := recover(); r != nil { + // fmt.Println("Recovered from panic in worker:", r) + log.Printf("recovered from panic in taskengine: %v ", r) + } + }() + + tasks, err := s.StateDB.ReadRecords("SELECT * FROM tasks ORDER by next_execution limit 1;") + + if err != nil { + log.Printf("error in taskengine: %s ", err) + return + } + + if len(tasks) < 1 { + log.Printf("error in taskengine: %s ", "found no task for execution") + return + } + + task := tasks[0] // pick the one task with the smallest next execution time, see previous sql statement + + task_name, haveTask := task["task_name"].(string) + if !haveTask { + log.Printf("error in taskengine: task %s is of wrong type", task["task_name"]) + return + } + + nextExecution := task["next_execution"].(int64) + startTime := task["start_time"].(int64) + execInterval := task["interval"].(int64) + nowSeconds := time.Now().Unix() + + if nowSeconds < nextExecution { // task execution is not yet due + return + } + + // calculate next execution time + for nextExecution = startTime; nowSeconds > nextExecution; nextExecution += execInterval { + // add as many intervals to the starttime until the next execution lies in the future + } + + task["start_time"] = task["next_execution"] + task["next_execution"] = nextExecution + + /* + no_executions INTEGER, -- how often executed + duration INTEGER, -- duration of the last exec in ms + no_errors INTEGER, -- error count + last_error_text TEXT, + + */ + + if count, ok := task["no_executions"].(int64); ok { + task["no_executions"] = count + 1 + } + + // update next_execution in state database + _, err = s.StateDB.UpsertRecord("tasks", "task_id", task) + if err != nil { + log.Printf("error in taskengine: cannot update task record - before execution %s ", err) + return + } + + task_func, haveTask := s.Tasks[task_name] // select the function with the matching name + + if !haveTask { + log.Printf("error in taskengine: task %s is not defined", task_name) + } + + if haveTask { + + start := time.Now() + // if !s.Production { + // fmt.Println("Taskengine: executing task:", task_name, start) + // } + err = task_func(s) // finally execute the task; attention: a task that panics will kill the server! + + task["duration"] = int(time.Since(start).Milliseconds()) + + if err != nil { + log.Printf("taskengine: execution task: %s failed with error: %s ", task_name, err) + task["last_error_text"] = err.Error() + if count, ok := task["no_errors"].(int64); ok { + task["no_errors"] = count + 1 + } + // if !s.Production { + // fmt.Println("Taskengine: failed task:", task_name, err) + // } + } else { + // if !s.Production { + // fmt.Println("Taskengine: successfully completed task:", task_name, time.Now()) + // } + } + + _, err = s.StateDB.UpsertRecord("tasks", "task_id", task) + if err != nil { + log.Printf("error in taskengine: cannot update task record - after execution %s ", err) + return + } + + } + +} diff --git a/lcars/sqlite/database.go b/lcars/sqlite/database.go new file mode 100644 index 0000000..f3c4b83 --- /dev/null +++ b/lcars/sqlite/database.go @@ -0,0 +1,428 @@ +package sqlite // name the package as you see fit + +import ( + "database/sql" + "errors" + "fmt" + "os" + "strconv" + "strings" + + _ "modernc.org/sqlite" +) + +// This is the data type to exchange data with the database +type Record = map[string]any + +type Database struct { + databaseName string + database *sql.DB +} + +type Transaction struct { + tx *sql.Tx + err error +} + +type Action func(tx *sql.Tx) error + +func New(DBName string) (*Database, error) { + return &Database{databaseName: DBName}, nil +} + +func (d *Database) Close() error { + return d.database.Close() +} + +// provides access to the internal database object +func (d *Database) DB() *sql.DB { + return d.database +} + +func (d *Database) Name() string { + return d.databaseName +} + +func (d *Database) Open() (err error) { + d.database, err = openSqliteDB(d.databaseName) + return err +} + +func (d *Database) OpenInMemory() (err error) { + d.database, err = sql.Open("sqlite", ":memory:") + return err +} + +func openSqliteDB(databasefilename string) (*sql.DB, error) { + + _, err := os.Stat(databasefilename) + if errors.Is(err, os.ErrNotExist) { + return createDB(databasefilename) + } + if err != nil { + return nil, err + } + return sql.Open("sqlite", databasefilename) + +} + +func createDB(dbfileName string) (*sql.DB, error) { + + query := ` + PRAGMA page_size = 4096; + PRAGMA synchronous = off; + PRAGMA foreign_keys = off; + PRAGMA journal_mode = WAL; + PRAGMA user_version = 1; + ` + db, err := sql.Open("sqlite", dbfileName) + if err != nil { + + return nil, err + } + _, err = db.Exec(query) + if err != nil { + return nil, err + } + return db, nil +} + +func (d *Database) TableList() (result []Record, err error) { + return d.ReadRecords("select name from sqlite_master where type='table';") +} + +func (d *Database) ReadTable(tablename string) (result []Record, err error) { + + return d.ReadRecords(fmt.Sprintf("select * from '%s';", tablename)) +} + +func (d *Database) ReadRecords(query string, args ...any) (result []Record, err error) { + + rows, err := d.DB().Query(query, args...) + if err != nil { + return result, err + } + defer rows.Close() + return Rows2records(rows) + +} + +func (d *Database) GetRecord(tablename string, idfield string, key any) (result Record, err error) { + + query := fmt.Sprintf("select * from %s where %s = ?;", tablename, idfield) + res, err := d.DB().Query(query, key) + if err != nil { + return result, err + } + defer res.Close() + return Rows2record(res) + +} + +func (d *Database) UpsertRecord(tablename string, idfield string, record Record) (result Record, err error) { + + return upsert(d.DB(), tablename, idfield, record) + +} + +func (d *Database) DeleteRecord(tablename string, idfield string, id any) (err error) { + + return deleteRecord(d.DB(), tablename, idfield, id) + +} + +// *sql.DB and *sql.Tx both have a method named 'Query', +// this way they can both be passed into upsert and deleteRecord function +type iquery interface { + Query(query string, args ...any) (*sql.Rows, error) +} + +func upsert(t iquery, tablename string, idfield string, record Record) (result Record, err error) { + + fields := []string{} + data := []any{} + for k, v := range record { + fields = append(fields, k) + data = append(data, v) + } + query, err := buildUpsertCommand(tablename, idfield, fields) + if err != nil { + return result, err + } + res, err := t.Query(query, data...) // res contains the full record - see SQLite: RETURNING * + if err != nil { + return result, err + } + defer res.Close() + return Rows2record(res) + +} + +func deleteRecord(t iquery, tablename string, idfield string, id any) (err error) { + + query := fmt.Sprintf("DELETE FROM \"%s\" WHERE \"%s\" = ?;", tablename, idfield) + _, err = t.Query(query, id) + return err + +} + +func buildUpsertCommand(tablename string, idfield string, fields []string) (string, error) { + var sb strings.Builder + sb.Grow(256 + len(fields)*20) // rough preallocation + + // INSERT INTO + sb.WriteString(`INSERT INTO "`) + sb.WriteString(tablename) + sb.WriteString(`"(`) + for i, f := range fields { + sb.WriteString(` "`) + sb.WriteString(f) + sb.WriteByte('"') + if i < len(fields)-1 { + sb.WriteByte(',') + } + } + sb.WriteString(")\n\tVALUES(") + + // VALUES + for i := 0; i < len(fields); i++ { + sb.WriteString(" ?") + sb.Write(strconv.AppendInt(nil, int64(i+1), 10)) + if i < len(fields)-1 { + sb.WriteByte(',') + } + } + sb.WriteString(")\n\tON CONFLICT(\"") + sb.WriteString(tablename) + sb.WriteString(`"."`) + sb.WriteString(idfield) + sb.WriteString("\")\n\tDO UPDATE SET ") + + // UPDATE SET + for i, f := range fields { + sb.WriteByte('"') + sb.WriteString(f) + sb.WriteString(`"= ?`) + sb.Write(strconv.AppendInt(nil, int64(i+1), 10)) + if i < len(fields)-1 { + sb.WriteByte(',') + } + } + sb.WriteString("\n\tRETURNING *;") + + return sb.String(), nil +} + +// func buildUpsertCommand(tablename string, idfield string, fields []string) (result string, err error) { + +// pname := map[string]string{} // assign correct index for parameter name +// // parameter position, starts at 1 in sql! So it needs to be calculated by function pname inside template + +// for i, k := range fields { +// pname[k] = strconv.Itoa(i + 1) +// } +// funcMap := template.FuncMap{ +// "pname": func(fieldname string) string { +// return pname[fieldname] +// }, +// } +// tableDef := struct { +// Tablename string +// KeyField string +// LastField int +// FieldNames []string +// }{ +// Tablename: tablename, +// KeyField: idfield, +// LastField: len(fields) - 1, +// FieldNames: fields, +// } +// var templString = `{{$last := .LastField}}INSERT INTO "{{ .Tablename }}"({{ range $i,$el := .FieldNames }} "{{$el}}"{{if ne $i $last}},{{end}}{{end}}) +// VALUES({{ range $i,$el := .FieldNames }} ?{{pname $el}}{{if ne $i $last}},{{end}}{{end}}) +// ON CONFLICT("{{ .Tablename }}"."{{.KeyField}}") +// DO UPDATE SET {{ range $i,$el := .FieldNames }}"{{$el}}"= ?{{pname $el}}{{if ne $i $last}},{{end}}{{end}} +// RETURNING *;` + +// dbTempl, err := template.New("upsertDB").Funcs(funcMap).Parse(templString) +// if err != nil { +// return result, err +// } +// var templBytes bytes.Buffer +// err = dbTempl.Execute(&templBytes, tableDef) +// if err != nil { +// return result, err +// } +// return templBytes.String(), nil +// } + +func Rows2record(rows *sql.Rows) (Record, error) { + columns, err := rows.Columns() + if err != nil { + return nil, err + } + values := make([]any, len(columns)) + valuePtrs := make([]any, len(columns)) + for i := range values { + valuePtrs[i] = &values[i] + } + result := Record{} + for rows.Next() { + if err := rows.Scan(valuePtrs...); err != nil { + return nil, err + } + for i, col := range columns { + result[col] = values[i] + } + } + if len(result) == 0 { + return nil, errors.New("no rows found") + } + return result, nil +} + +func Rows2records(rows *sql.Rows) ([]Record, error) { + columns, err := rows.Columns() + if err != nil { + return nil, err + } + recLength := len(columns) + results := []Record{} + for rows.Next() { + values := make([]any, recLength) + valuePtrs := make([]any, recLength) + for i := range values { + valuePtrs[i] = &values[i] + } + record := Record{} + if err := rows.Scan(valuePtrs...); err != nil { + return nil, err + } + for i, col := range columns { + record[col] = values[i] + } + results = append(results, record) + } + if len(results) == 0 { + return nil, errors.New("no rows found") + } + return results, nil +} + +func (d *Database) Version() (string, error) { + result := "" + sqliteversion, err := d.ReadRecords("SELECT sqlite_version();") + if len(sqliteversion) == 1 { + result = sqliteversion[0]["sqlite_version()"].(string) + } + return result, err +} + +func (d *Database) UserVersion() (int64, error) { + + var result int64 + userversion, err := d.ReadRecords("PRAGMA user_version;") + if len(userversion) == 1 { + result = userversion[0]["user_version"].(int64) + } + return result, err +} + +func (d *Database) Begin() *Transaction { + tx, err := d.database.Begin() + return &Transaction{tx, err} +} + +func (t *Transaction) Next(action Action) *Transaction { + if t.err != nil { + return t + } + t.err = action(t.tx) + return t +} + +func (t *Transaction) End() error { + + if t.err != nil { + err := t.tx.Rollback() + if err != nil { + t.err = errors.Join(t.err, err) + } + return t.err + } + t.err = t.tx.Commit() + return t.err +} + +func (t *Transaction) GetRecord(tablename string, idfield string, key any, output Record) *Transaction { + + if t.err != nil { + return t + } + query := fmt.Sprintf("select * from %s where %s = ?;", tablename, idfield) + res, err := t.tx.Query(query, key) + if err != nil { + t.err = err + return t + } + defer res.Close() + result, err := Rows2record(res) + if err != nil { + t.err = err + return t + } + for k := range output { + delete(output, k) + } + for k, v := range result { + output[k] = v + } + return t +} + +func (t *Transaction) UpsertRecord(tablename string, idfield string, record Record, output Record) *Transaction { + + if t.err != nil { + return t + } + result, err := upsert(t.tx, tablename, idfield, record) + if err != nil { + t.err = err + return t + } + for k := range output { + delete(output, k) + } + for k, v := range result { + output[k] = v + } + return t +} + +func (t *Transaction) DeleteRecord(tablename string, idfield string, id any) *Transaction { + + if t.err != nil { + return t + } + err := deleteRecord(t.tx, tablename, idfield, id) + if err != nil { + t.err = err + } + return t +} + +// returns a value of the provided type, if the field exist and if it can be cast into the provided type parameter +func Value[T any](rec Record, field string) (value T, ok bool) { + var v any + if v, ok = rec[field]; ok { + value, ok = v.(T) + } + return +} + +// don't report an error if there are simply just 'no rows found' +func NoRowsOk(recs []Record, err error) ([]Record, error) { + if err != nil && err.Error() != "no rows found" { + return recs, err + } + return recs, nil +} diff --git a/lcars/state.db b/lcars/state.db new file mode 100644 index 0000000000000000000000000000000000000000..4db8e9520220e3b0bef7a66e0a5e6d84a20a2a9c GIT binary patch literal 4096 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|@t|AVoG{WYFsp<^^dNAlr;ljiVtj n8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O6ovo*T>J*E literal 0 HcmV?d00001 diff --git a/lcars/state.db-shm b/lcars/state.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..22ce83b72e8cd68278635c222077d94b3c900025 GIT binary patch literal 32768 zcmeI)Ee^sk7zW^u0eW(h3!q3i!cK$Y8YnDhAZQc{#R1TSAkYL4?XoO5f+O4WCSTe# zO@E#PeC2f-Qu0_?2*o&#!&uMl{WLkw&dXx`*sS)8e7?I~4pmkDxIZ3MC!P8FNVD7y z@$Phg7{qGcQop0!U_yWZ0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAkaa9EcTlib?{%lMBuwX>a!vQ z`YDh)5($BR3ZyU$ z!2%O2I~xNdVgW=25{Ri1EQo;tI>3ThP#5l!xU$pImP$wvy(jtaer)GaJox;5M{W+S za)&>qIc}6=#T~u({r=s@jaS#lZhuWLtKTHzb)*XyA^?(xHC4)dUS7Vx4vkD00bZa0SG_<0uX=z1Rwwb2teTP z33T4!gL#3M!p~#przXDaF)t7c-3}Wc?>pZ2ynrxrfg5>5S11sG00bZa0SG_<0uX=z z1RyYg0<*$UYJ8lp_*S)HdkYQv33|@67Z&Yit^Y748;WEq#FS2G3hC>cZCZ|PbAY_ykbx9+#QZSpBap2>Pa zovM?pC>yG&%91ALi707`VX~dGlA)`5f$h?Zsj|ZMRDHT6=5kw?CnuF@sjQj3mhRou zT8);w)1CB?qD{#h{nN4U|66ec8)g1bVe`gOe9Ire#}PjX0uX=z1Rwwb2tWV=5P$## zAh2D4efy6E@dE7+4>mu)c{+u8f$dPJfdB*`009U<00Izz00bZa0SFABKqQagd4pWd zd`!IEBaa}QH^AZz!pH1<`_3bX4ZrB*5zq|^1Rwwb2tWV=5P$##AOHaf986#(9ZRG# z8GdEC6Rux#?PVHT?^JC!v>T6v)rT7XIH=yWn%APy=-mi*7V00ZPv($E5abMW5)l5) wJOcJk9}nUMUT-}7@osXBAYR~L4