Dates Table

import { ChangeDetectionStrategy, Component, computed, signal, Signal } from '@angular/core';
import { CommonModule } from '@angular/common';

/**
* Interface defining a choice for the Kilimanjaro climb options.
*/
interface ClimbOption {
id: string;
name: string;
minDays: number;
maxDays: number;
description: string;
}

/**
* Interface defining a choice for the Safari options.
*/
interface SafariOption {
id: string;
name: string;
description: string;
popularDurationDays: number;
}

/**
* Main application component for the itinerary builder.
*/
@Component({
selector: 'app-root',
standalone: true,
imports: [CommonModule],
template: `

Tanzania Custom Adventure

Design Your Dream Climb & Safari Itinerary

@for (step of steps; track step; let i = $index) {


{{ i + 1 }}


{{ step.name }}

}



@if (currentStep() === 'climb') {

1. Choose Your Climb

Select a Kilimanjaro route that fits your challenge level and schedule.

@for (climb of climbOptions; track climb.id) {

{{ climb.name }}

{{ climb.minDays }}-{{ climb.maxDays }} Days

{{ climb.description }}

}


@if (selectedClimb()) {


{{ climbDays() }} days

We recommend more days for better acclimatization and a higher chance of success.

}

}


@if (currentStep() === 'safari') {

2. Design Your Safari

Explore the famous Northern Circuit or the secluded South.

@for (safari of safariOptions; track safari.id) {

{{ safari.name }}

Recommended: {{ safari.popularDurationDays }} Days

{{ safari.description }}

}


@if (selectedSafari()) {


{{ safariDays() }} days

A minimum of 3 days is required, but 5-7 days allows you to cover more parks and wildlife.

}


}


@if (currentStep() === 'summary') {

3. Your Complete Itinerary

{{ totalDays() }}
TOTAL ADVENTURE DAYS


The Climb: {{ selectedClimb()?.name || 'Not Selected' }}

@if (selectedClimb()) {

{{ climbDays() }} Days

{{ selectedClimb()!.description }}

} @else {

Please select a Kilimanjaro route.

}


The Safari: {{ selectedSafari()?.name || 'Not Selected' }}

@if (selectedSafari()) {

{{ safariDays() }} Days

{{ selectedSafari()!.description }}

} @else {

Please select a Safari circuit.

}

Next Steps:

{{ itinerarySummary() }}


}


@if (showModal()) {

Itinerary Submitted!

Thank you for building your dream adventure.

Summary:

{{ totalDays() }} Days: {{ selectedClimb()!.name }} Climb + {{ selectedSafari()!.name }} Safari.

Our team will be in touch within 24 hours to finalize details and provide a custom quote for your adventure.

}

`,
styles: `
/* Custom style for the range input thumb */
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 20px;
height: 20px;
background: #3B82F6; /* Blue 500 */
border-radius: 50%;
cursor: pointer;
transition: background 0.15s ease-in-out;
}

input[type=range]:hover::-webkit-slider-thumb {
background: #1D4ED8; /* Blue 700 */
}
`,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class App {
// --- Data Definitions ---

readonly climbOptions: ClimbOption[] = [
{ id: 'lemosho', name: 'Lemosho Route', minDays: 7, maxDays: 9, description: 'The most scenic route with the highest summit success rate due to excellent acclimatization.' },
{ id: 'machame', name: 'Machame Route', minDays: 6, maxDays: 8, description: 'The "Whiskey Route." Very popular, challenging, and offering stunning views. Best done in 7 days.' },
{ id: 'marangu', name: 'Marangu Route', minDays: 5, maxDays: 6, description: 'The "Coca-Cola Route." The only one with hut accommodation, but has a lower success rate.' },
{ id: 'rongai', name: 'Rongai Route', minDays: 6, maxDays: 7, description: 'The only northern approach, drier conditions, and less crowded. Excellent for less experienced hikers.' },
];

readonly safariOptions: SafariOption[] = [
{ id: 'north', name: 'Northern Circuit Deluxe', description: 'Serengeti, Ngorongoro Crater, Tarangire, Lake Manyara. The ultimate Big Five experience.', popularDurationDays: 6 },
{ id: 'south', name: 'Southern Wilderness', description: 'Ruaha National Park & Nyerere (Selous). Exclusive, rugged, and less crowded game viewing.', popularDurationDays: 7 },
{ id: 'west', name: 'Western Chimpanzee Trek', description: 'Gombe Stream and Mahale Mountains. Focus on primate viewing and lake life.', popularDurationDays: 4 },
];

// --- State Management (Signals) ---

currentStep = signal<'climb' | 'safari' | 'summary'>('climb');
showModal = signal(false);

// Climb State
selectedClimb = signal(null);
climbDays = signal(0);

// Safari State
selectedSafari = signal(null);
safariDays = signal(0);

// List of steps for the indicator
readonly steps = [
{ key: 'climb', name: 'Climb' },
{ key: 'safari', name: 'Safari' },
{ key: 'summary', name: 'Summary' },
];

// --- Computed Signals ---

/** Calculates the total duration of the entire trip (climb + safari). */
totalDays: Signal = computed(() => {
return this.climbDays() + this.safariDays();
});

/** Generates a conversational summary of the chosen itinerary. */
itinerarySummary: Signal = computed(() => {
const climb = this.selectedClimb();
const safari = this.selectedSafari();
const total = this.totalDays();

if (!climb || !safari) {
return "Please complete both the Climb and Safari selections to generate your personalized summary and request a quote.";
}

return You have created a spectacular ${total}-day Tanzania Adventure! It includes a ${this.climbDays()}-day trek on the ${climb.name} (known for its excellent views and high success rate) followed by a ${this.safariDays()}-day immersion in the ${safari.name}. This combination provides a perfect blend of high-altitude challenge and world-class wildlife viewing. We are ready to start planning your perfect departure date.;
});

// --- Methods ---

/**
* Selects a climb option and sets the default days.
* @param climb The selected ClimbOption.
*/
selectClimb(climb: ClimbOption): void {
this.selectedClimb.set(climb);
// Set a good default: 7 days is a good balance for most routes
this.climbDays.set(Math.min(climb.maxDays, 7));
}

/**
* Sets the number of days for the climb from the range slider.
* @param event The input event from the range slider.
*/
setClimbDays(event: Event): void {
const value = parseInt((event.target as HTMLInputElement).value, 10);
this.climbDays.set(value);
}

/**
* Selects a safari option and sets the default days.
* @param safari The selected SafariOption.
*/
selectSafari(safari: SafariOption): void {
this.selectedSafari.set(safari);
this.safariDays.set(safari.popularDurationDays);
}

/**
* Sets the number of days for the safari from the range slider.
* @param event The input event from the range slider.
*/
setSafariDays(event: Event): void {
const value = parseInt((event.target as HTMLInputElement).value, 10);
this.safariDays.set(value);
}

/**
* Moves to the next step if the current step is complete.
*/
nextStep(): void {
if (this.currentStep() === 'climb' && this.selectedClimb()) {
this.currentStep.set('safari');
} else if (this.currentStep() === 'safari' && this.selectedSafari()) {
this.currentStep.set('summary');
}
}

/**
* Moves to the previous step.
*/
prevStep(): void {
if (this.currentStep() === 'safari') {
this.currentStep.set('climb');
} else if (this.currentStep() === 'summary') {
this.currentStep.set('safari');
}
}

/**
* Allows jumping to a specific step based on index.
* @param index The index of the step to go to.
*/
goToStep(index: number): void {
this.currentStep.set(this.steps[index].key as 'climb' | 'safari' | 'summary');
}

/**
* Generates the CSS classes for the step indicator circles.
* @param key The key of the step.
* @returns The combined CSS classes.
*/
getStepClass(key: 'climb' | 'safari' | 'summary'): string {
const isCurrent = this.currentStep() === key;
const isComplete = (key === 'climb' && this.selectedClimb()) || (key === 'safari' && this.selectedSafari());

if (isCurrent) {
return 'bg-indigo-600 ring-4 ring-indigo-300';
} else if (isComplete) {
return 'bg-indigo-400 hover:bg-indigo-500';
} else {
return 'bg-gray-400';
}
}

/**
* Shows the modal confirmation for quote request.
*/
requestQuote(): void {
if (this.totalDays() > 0) {
this.showModal.set(true);
}
}
}

  • Mara Kati Kati is a mobile camp strategically situated in north Serengeti, ideal for exploring the Mara Ecosystem. The camp offers comfortable accommodation together with the unique opportunity to enjoy a real safari experience on a camp. In its comfortable tents one will feel completely immersed in the surroundings and one can enjoy the rich animal life and vegetation of the area.

    An original form of accommodation which resembles the old camps of the first explorers in Africa, with all the commodities of today.

    The camp has been designed to cause a minimum impact on the environment. All of the infrastructure is mobile and the philosophy of the company is not to leave anything behind.


    The tents at Mara Kati Kati are meticulously designed to blend the essence of classic safari adventures with modern comforts. Each tent is furnished with plush bedding, locally inspired décor, and ensuite bathrooms equipped with hot showers and eco-friendly toiletries. The subtle lighting, soft linens, and rustic yet sophisticated furnishings create an ambiance that seamlessly merges the raw beauty of the wilderness with the elegance of a homey accommodation.

  •  

    Experience the Wild…

    Welcome to Tarangire Simba Lodge, Tarangire National Park is a gem on the northern safari circuit. Teeming with wildlife, especially in the dry season, this area is a safari-goers dream. Located near the new Sangaiwe Gate of Tarangire National Park. Tarangire Simba Lodge is situated in a wildlife-rich area with unhampered views to beautiful Lake Burunge, bordered by the park and a Wildlife Management Area. The setting is stunning; with a giant old Baobab tree anchoring one corner and a permeating feeling of real Africa.

    The lodge opened in mid 2015 (July) and has 24 classic tents under thatch. Resident wildlife includes lion, zebra, bushbuck, impala, porcupine, monkeys, warthog, mongoose and more. Elephant, buffalo, ostrich and giraffe frequently pass through while the bird life is prolific and vibrant.

    Areas surrounding national parks are critical for conservation. The location of Tarangire Simba Lodge creates a buffer between the park and the nearby village areas, which, although currently sparse in population, are under cultivation and could be subject to human/wildlife conflict. We work closely with the rangers at the nearby station to ensure that the wildlife is not compromised.

     


     

    During the dry season groups of elephant, giraffe, waterbuck, zebra and more come to a small waterhole located in front of the lodge. Lucky guests can watch wildlife right from their rooms or the elevated viewing platform near the pool.

    Guests are able to enter, exit and re-enter from the Sangaiwe gate of Tarangire National Park with ease.


     

    Fine hospitality for safari travellers

    Accommodation at Tarangire Simba Lodge is in sixteen classic canvas safari tents situated permanently under thatch. The spacious tents are constructed on platforms complete with wooden floors, large en-suite dressing room, toilet and shower. There are twin and queen tents; triples are possible. There is also a family tent with two queen-sized beds. Additionally there is an outdoor shower and each tent has a private veranda with views to the bush and Lake Burunge. Furnishings are handcrafted from African hardwood complimented with tastefully selected fabrics; electricity and hot water are solar powered. Full amenities are provided.

    If you’re lucky you may see wildlife right from your room or verandah!

    Each room has a torch (flashlight) and umbrella for you to use during your stay with us and there is a power strip to charge your devices.