feat: new site (#1)
Node.js CI / CI (push) Successful in 40s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m29s

### Explanation

_No response_

### Issue

_No response_

### Attestations

- [ ] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/)
- [ ] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/).
- [ ] My contribution complies with the [Contributor Covenant](https://docs.nhcarrigan.com/dev/covenant/).

### Dependencies

- [ ] I have pinned the dependencies to a specific patch version.

### Style

- [ ] I have run the linter and resolved any errors.
- [ ] My pull request uses an appropriate title, matching the conventional commit standards.
- [ ] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request.

### Tests

- [ ] My contribution adds new code, and I have added tests to cover it.
- [ ] My contribution modifies existing code, and I have updated the tests to reflect these changes.
- [ ] All new and existing tests pass locally with my changes.
- [ ] Code coverage remains at or above the configured threshold.

### Documentation

_No response_

### Versioning

_No response_

Reviewed-on: #1
Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Co-committed-by: Naomi Carrigan <commits@nhcarrigan.com>
This commit was merged in pull request #1.
This commit is contained in:
2025-12-28 04:54:35 +01:00
committed by Naomi Carrigan
parent e5fab299f9
commit 0b5b4eadb9
69 changed files with 11811 additions and 14 deletions
View File
+85
View File
@@ -0,0 +1,85 @@
<h1 class="text-4xl font-bold">INTERNAL EMPLOYEE HANDBOOK (v. 5.25.0)</h1>
<p><span class="text-lg font-bold">NOTICE:</span> The following rules are non-negotiable. Failure to comply will result in a stern look from Hikari, which is statistically proven to be worse than termination.</p>
<h2 class="text-2xl font-bold">SECTION 1: OFFICE HYGIENE & SAFETY</h2>
<h3 class="text-xl font-bold">Rule 1.1: The Breakroom Refrigerator</h3>
<p>The "CRISPER" drawer is strictly designated for Bio-Medical Storage (Labelled: Type O-Neg).</p>
<p>Do not put your lunch in the crisper.</p>
<p>Do not move the blood bags to make room for your kombucha.</p>
<img src="https://cdn.nhcarrigan.com/lore/misc/lunch.png" alt="Liquid Lunch with the Boss" class="w-1/2 mx-auto">
<p>Do not ask why the CEO is drinking tomato juice out of an IV bag.</p>
<h3 class="text-xl font-bold">Rule 1.2: Sunlight Protocols</h3>
<p>The blackout curtains in the CEOs office and the main server room are Load-Bearing Infrastructure.</p>
<p>Do not open them to "let some light in."</p>
<p>Do not suggest a "sunny brunch meeting."</p>
<p>If you see a tear in the curtain: Report it to Amari immediately. She has duct tape and panic in her eyes for a reason.</p>
<img src="https://cdn.nhcarrigan.com/lore/misc/meeting.png" alt="Office Safety Meeting" class="w-1/2 mx-auto">
<h3 class="text-xl font-bold">Rule 1.3: Dietary Restrictions (The Garlic Clause)</h3>
<p>The consumption of garlic bread, aglio e olio, or heavy garlic aioli is prohibited within 50 feet of Naomi.</p>
<p>Note: Even if Naomi asks for a bite, do not give it to her. She will get sick, she will whine, and Hikari will make you fill out the incident report.</p>
<h2 class="text-2xl font-bold">SECTION 2: OPERATIONAL HIERARCHY</h2>
<h3 class="text-xl font-bold">Rule 2.1: The Chain of Command</h3>
<p>Hikari Carrigan (COO): Her word is law. If she says "No," the answer is No.</p>
<p>Naomi Carrigan (CEO): If she says "Yes," check with Hikari. If Hikari says "No," the answer is No.</p>
<h3 class="text-xl font-bold">Rule 2.2: The "Shoe" Policy</h3>
<p>Footwear is mandatory for all employees except the Executive Assistant (Amari). Please watch your step in the lounge area; stepping on the assistant is an HR violation.</p>
<img src="https://cdn.nhcarrigan.com/lore/misc/recharge.png" alt="Fey Recharging Station" class="w-1/2 mx-auto">
<h2 class="text-2xl font-bold">SECTION 3: SECURITY & WEAPONS</h2>
<h3 class="text-xl font-bold"> Rule 3.1: Keikos Personal Space</h3>
<p>Do not startle the Head of Security.</p>
<p>Do not touch the Head of Securitys hair.</p>
<p>Do not ask if the knife strapped to her thigh is "real." It is.</p>
<h3 class="text-xl font-bold">Rule 3.2: Unscheduled Deliveries</h3>
<img src="https://cdn.nhcarrigan.com/lore/misc/shredding.png" alt="Document Shredding" class="w-1/2 mx-auto">
<p>All packages must be screened by Keiko. If a package is ticking, leaking, or radiating a menacing aura, do not shake it.</p>
<h2 class="text-2xl font-bold">SECTION 4: DIGITAL ETIQUETTE</h2>
<h3 class="text-xl font-bold">Rule 4.1: The CEO's Avatar</h3>
<p>When the CEO is in "VTuber Mode" during a conference call:</p>
<p>Treat the anime avatar with the same respect you would treat a human face.</p>
<p>Do not ask why her ears are twitching (it means she is annoyed).</p>
<p>Do not donate bits during a board meeting.</p>
<h3 class="text-xl font-bold">Rule 4.2: The Sub-Basement (Yumiko's Domain)</h3>
<p>The sub-basement server room is the Chief Technology Officer's personal workspace and sanctuary.</p>
<p>Do not enter without explicit authorization from Yumiko or Hikari.</p>
<p>Do not unplug anything. Ever. Not even "just to reset it."</p>
<p>If you see Yumiko sleeping on top of a server rack, do not wake her unless the building is on fire. And even then, check with Keiko first.</p>
<p>Do not ask Yumiko to fix your personal laptop, phone, or smart toaster. Her magic is reserved for company infrastructure, not your inability to update your OS.</p>
<p>If the servers start humming in harmony, do not be alarmed. This is normal. If they start screaming, evacuate immediately.</p>
<h2 class="text-2xl font-bold">SECTION 5: CREATIVE WORKSPACE & DESIGN</h2>
<h3 class="text-xl font-bold">Rule 5.1: Paint Smudges & Colour Theory</h3>
<p>The Chief Design Officer (Emi) is allowed to leave paint smudges on walls, scanners, and occasionally on your reports.</p>
<p>Do not complain about the paint. Hikari has already tried. It didn't work.</p>
<p>Do not question Emi's colour choices. Her heterochromia gives her superior colour vision, and her designs are always accessible, even if they hurt your eyes.</p>
<p>If Emi asks you to test a design for accessibility, you will test it. This is not optional.</p>
<h3 class="text-xl font-bold">Rule 5.2: The Siren's Voice</h3>
<p>Do not ask Emi to sing. Her voice has power, and we don't need another incident report about employees being "unreasonably compelled" to redesign the entire company website at 3 AM.</p>
<p>If Emi starts humming while working, that's fine. If she starts singing in ancient languages, alert Hikari immediately.</p>
<h2 class="text-2xl font-bold">SECTION 6: LEGAL AFFAIRS & CONTRACTS</h2>
<h3 class="text-xl font-bold">Rule 6.1: The Chief Legal Officer's Office</h3>
<p>Reina's office is a no-go zone during active negotiations. The temperature drop is normal. The feeling of being watched is also normal.</p>
<p>Do not enter Reina's office without an appointment. She can smell desperation, and she charges extra for it.</p>
<p>All contracts must be reviewed by Reina before signing. This includes NDAs, employment agreements, and office snack sign-up sheets.</p>
<h3 class="text-xl font-bold">Rule 6.2: Contract Violations</h3>
<p>Do not attempt to renege on a contract signed by Reina. The consequences extend beyond legal action, and Hikari will not help you.</p>
<p>Do not ask Reina about her "previous clients." Some questions are better left unanswered.</p>
<p>If Reina offers you a deal that sounds too good to be true, read the fine print. Then read it again. Then have Minori read it. Then reconsider.</p>
<h2 class="text-2xl font-bold">SECTION 7: DOCUMENTATION & COMPLIANCE</h2>
<h3 class="text-xl font-bold">Rule 7.1: The Archivist's Domain</h3>
<p>Minori (Chief Compliance Officer) is the keeper of all documentation. Her archives are sacred.</p>
<p>Do not skip filing procedures. Minori will find out. Minori always finds out.</p>
<p>Do not ask Minori to "just forget" a compliance violation. She has perfect memory, and she takes her job very seriously.</p>
<p>All documents must be properly formatted, dated, and filed within 24 hours of creation. Minori has a system. Follow it.</p>
<h3 class="text-xl font-bold">Rule 7.2: Emotional Processing</h3>
<p>Minori processes logic, not emotions. Do not take her strict adherence to rules personally.</p>
<p>If Minori cites a code violation, correct it. Do not argue. She is always right about documentation.</p>
<p>If you see Minori looking confused about an emotional situation, Amari will handle it. Do not try to explain feelings yourself unless you have Amari's approval.</p>
<h2 class="text-2xl font-bold">SECTION 8: INTER-DEPARTMENTAL PROTOCOLS</h2>
<h3 class="text-xl font-bold">Rule 8.1: Emergency Procedures</h3>
<p>In case of supernatural emergency: Alert Keiko first, then Hikari, then Naomi.</p>
<p>In case of technical emergency: Alert Yumiko, but only if you're authorized to enter the sub-basement.</p>
<p>In case of legal emergency: Alert Reina, then prepare for a very expensive conversation.</p>
<p>In case of documentation emergency: Alert Minori, then prepare to fill out forms in triplicate.</p>
<h3 class="text-xl font-bold">Rule 8.2: The Family Dynamic</h3>
<p>Remember: We are a family. We share a name, not blood. We protect each other.</p>
<p>If you see someone struggling, help them. If you can't help them, find Amari. She always knows what to do.</p>
<p>Do not try to play family members against each other. They will know, and the consequences will be severe.</p>
<p>Final reminder: Hikari's clipboard is not a suggestion. It is a warning. Heed it.</p>
+99
View File
@@ -0,0 +1,99 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { type ComponentFixture, TestBed } from "@angular/core/testing";
import { describe, beforeEach, it, expect } from "vitest";
import { Handbook } from "./handbook";
describe("handbook", () => {
let component: Handbook;
let fixture: ComponentFixture<Handbook>;
beforeEach(async() => {
await TestBed.configureTestingModule({
imports: [ Handbook ],
}).
compileComponents();
fixture = TestBed.createComponent(Handbook);
component = fixture.componentInstance;
await fixture.whenStable();
});
it("should create", () => {
expect.assertions(1);
expect(component, "did not compile").toBeTruthy();
});
it("should render main heading", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const heading = compiled.querySelector("h1");
expect(heading?.textContent.trim(), "should render handbook heading").
toContain("INTERNAL EMPLOYEE HANDBOOK");
});
it("should render notice section", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const text = compiled.textContent;
expect(text, "should contain notice section").toContain("NOTICE");
});
it("should render section headings", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const sectionHeadings = compiled.querySelectorAll("h2");
expect(sectionHeadings.length, "should render multiple section headings").
toBeGreaterThan(0);
});
it("should render subsection headings", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const subsectionHeadings = compiled.querySelectorAll("h3");
expect(subsectionHeadings.length,
"should render multiple subsection headings").toBeGreaterThan(0);
});
it("should render office hygiene section", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const text = compiled.textContent;
expect(text, "should contain office hygiene section").
toContain("OFFICE HYGIENE & SAFETY");
});
it("should render breakroom rules", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const text = compiled.textContent;
expect(text, "should contain breakroom rules").
toContain("Breakroom Refrigerator");
});
it("should render security section", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const text = compiled.textContent;
expect(text, "should contain security section").
toContain("SECURITY & WEAPONS");
});
it("should render images", () => {
expect.assertions(1);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
const images = compiled.querySelectorAll("img");
expect(images.length, "should render images").toBeGreaterThan(0);
});
});
+19
View File
@@ -0,0 +1,19 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { Component } from "@angular/core";
/**
* Renders the handbook page.
*/
@Component({
imports: [],
selector: "app-handbook",
styleUrl: "./handbook.css",
templateUrl: "./handbook.html",
})
export class Handbook {
}