import { i as __toESM } from "../_runtime.mjs";
import { B as require_react, _ as createRootRoute, b as require_jsx_runtime, d as useRouterState, g as createFileRoute, h as lazyRouteComponent, l as Scripts, m as Outlet, p as createRouter, u as HeadContent, v as Link, y as useRouter, z as notFound } from "../_libs/@tanstack/react-router+[...].mjs";
import { n as TriangleAlert, r as Menu, t as X } from "../_libs/lucide-react.mjs";
import { a as union, i as string, n as number, r as object, t as literal } from "../_libs/zod.mjs";
import { t as clsx } from "../_libs/clsx.mjs";
import { t as twMerge } from "../_libs/tailwind-merge.mjs";
//#region node_modules/.nitro/vite/services/ssr/assets/content-BIS5uiZ4.js
var FIRM = {
	name: "Daciora",
	legal: "Daciora Consulting",
	email: "contact@daciora.com",
	phone: "+65 6812 4400",
	established: "2016",
	addressLines: [
		"One Raffles Quay",
		"North Tower, Level 22",
		"Singapore 048583"
	],
	hours: "Monday–Friday, 09:00–18:00 SGT"
};
var NAV = [
	{
		to: "/about",
		label: "About"
	},
	{
		to: "/practice",
		label: "Practice"
	},
	{
		to: "/insights",
		label: "Insights"
	},
	{
		to: "/contact",
		label: "Contact"
	}
];
var PRACTICES = [
	{
		id: "policy",
		numeral: "01",
		title: "Defence Policy",
		kicker: "Governments & armed forces",
		image: "/images/policy.jpg",
		summary: "Counsel to ministries, joint staffs, and civilian agencies on strategy, force design, and the political economy of defence.",
		body: "We help principals frame choices that survive contact with budgets, allies, and public scrutiny. Engagements typically combine structured assessment with discreet sounding of regional counterparts — always on unclassified terms, and always with a clear distinction between analysis and advocacy.",
		services: [
			"Strategic assessments and net assessment studies",
			"Force structure and capability planning",
			"Defence diplomacy and regional architecture",
			"Civil–military policy and total defence",
			"Crisis preparedness and tabletop design"
		]
	},
	{
		id: "industry",
		numeral: "02",
		title: "Defence Industry",
		kicker: "Primes, suppliers & investors",
		image: "/images/industry.jpg",
		summary: "Industrial strategy, market entry, and due diligence for firms navigating Asia-Pacific procurement and the defence technology base.",
		body: "The region’s industrial map is being redrawn: sovereign requirements, export-control regimes, and supply-chain risk now sit inside every board paper. We advise companies and investors who need a clear reading of policy, programme pipelines, and local partnership models — including industrial participation and offset — without treating the region as a single market.",
		services: [
			"Market entry and partnership strategy",
			"Industrial participation and offset design",
			"Programme and counterparty due diligence",
			"Export control and technology-transfer literacy",
			"Supply-chain resilience in the defence technology base"
		]
	},
	{
		id: "research",
		numeral: "03",
		title: "Defence Research",
		kicker: "Open-source & original study",
		image: "/images/research.jpg",
		summary: "Original, open-source research on capabilities, technology, and the regional military balance — written for decision, not for display.",
		body: "Our research practice produces classified-handling-free work that can be briefed in a ministry, a boardroom, or a closed seminar. Methods are explicit. Sources are documented. Judgements are separated from evidence. We do not publish for attention; most work remains with the client.",
		services: [
			"Capability and order-of-battle studies (open source)",
			"Technology horizon scanning",
			"Maritime and air domain assessments",
			"Red-team and alternative analysis",
			"Briefings, primers, and closed seminars"
		]
	}
];
var PRINCIPLES = [
	{
		title: "Independence",
		body: "We are not a lobbyist, a prime contractor, or an arm of any government. Advice is written to be used, not to be agreed with."
	},
	{
		title: "Discretion",
		body: "Defence work is trust work. We do not advertise clients, and we do not traffic in classified material. Correspondence remains unclassified."
	},
	{
		title: "Evidence",
		body: "Judgement is the product. It is built from sources that can be shown, methods that can be explained, and assumptions that can be tested."
	},
	{
		title: "Regional literacy",
		body: "The Indo-Pacific is not a theatre with a single logic. We work in the grain of each capital — its institutions, industrial base, and political calendar."
	}
];
var PRINCIPALS = [
	{
		name: "Dr. Elena Tan",
		role: "Managing Principal",
		focus: "Policy & strategy",
		bio: "Spent a decade in government on force development and international defence relations before founding Daciora in 2016. Advises principals on strategy that must hold under fiscal constraint and alliance politics. Educated at the National University of Singapore and the Department of War Studies, King’s College London."
	},
	{
		name: "James Whitmore",
		role: "Principal, Industry",
		focus: "Industrial strategy",
		bio: "Twenty years at the intersection of programme delivery and industrial policy across the United Kingdom, Australia, and Southeast Asia. Previously held commercial roles inside a prime contractor and a ministry acquisition function. Leads market entry, industrial participation, and counterparty diligence."
	},
	{
		name: "Dr. Kenji Nakamura",
		role: "Principal, Research",
		focus: "Military balance & technology",
		bio: "Strategic studies specialist with a research appointment behind him at a regional institute. Work centres on maritime domain awareness, the military applications of dual-use technology, and open-source methods for capability assessment. Publishes sparingly; most analysis remains with the client."
	}
];
var FOOTPRINT = [
	{
		city: "Singapore",
		note: "Headquarters"
	},
	{
		city: "Tokyo",
		note: "Correspondent network"
	},
	{
		city: "Canberra",
		note: "Correspondent network"
	},
	{
		city: "Jakarta",
		note: "Regional coverage"
	},
	{
		city: "New Delhi",
		note: "Regional coverage"
	},
	{
		city: "Seoul",
		note: "Regional coverage"
	}
];
var INSIGHTS = [
	{
		slug: "force-design-under-constraint",
		title: "Force design under fiscal constraint: notes from middle powers",
		dek: "Ambition is cheap. Structure is not. How smaller states in the Indo-Pacific are choosing what to keep, what to share, and what to stop pretending they can field.",
		date: "12 August 2026",
		category: "Policy",
		read: "8 min",
		image: "/images/architecture.jpg",
		paragraphs: [
			"Most defence white papers in this region still read as if the budget will catch up with the threat. It will not. The states that will field coherent forces through the 2030s are the ones willing to make force design a theory of shortage: fewer platforms, higher readiness, harder choices about what is sovereign and what is allied.",
			"Singapore’s own experience is often misread as a special case — a rich city-state with a conscript backbone and a dense defence technology ecosystem. The transferable lesson is narrower and more useful. It is the discipline of matching missions to a realistic industrial and manpower base, then refusing to decorate the force with capabilities that cannot be sustained.",
			"Three patterns recur in the work we do with ministries. First, inventories grow faster than crews and maintainers. Second, prestige platforms crowd out munitions, sensors, and the unglamorous stockpiles that decide the first thirty days of a crisis. Third, ‘self-reliance’ is invoked as a slogan rather than as a schedule of what must be produced, repaired, or replaced on national territory.",
			"A force designed under constraint starts with the campaign it must actually fight — usually a short, sharp, politically bounded contingency — and works backwards into a structure that can be generated, rotated, and supplied. That exercise is uncomfortable. It retires narratives. It also produces a document a finance ministry can live with.",
			"Allies complicate the picture, usefully. Access, basing, and industrial cooperation can substitute for mass, but only if the political terms are written down before the crisis. Middle powers that treat alliance as a mood rather than a set of logistics annexes discover the difference too late.",
			"None of this requires a new vocabulary. It requires a staff process that can say no, a political principal who will defend that no, and an industrial plan that is allowed to be smaller than the threat briefing. The rest is commentary."
		]
	},
	{
		slug: "industrial-participation-after-offset",
		title: "Industrial participation after the offset era",
		dek: "Offset as a percentage of contract value is a declining instrument. What is replacing it in Asia-Pacific procurement is more demanding — and more useful to a serious supplier.",
		date: "3 June 2026",
		category: "Industry",
		read: "7 min",
		image: "/images/industry.jpg",
		paragraphs: [
			"For two decades, offset was the price of admission to many Asia-Pacific campaigns: a percentage, a catalogue of local work, a compliance office in-country. That model is not dead, but it is no longer the centre of gravity. Buyers have learned that offset can transfer activity without transferring capability.",
			"What is replacing it is a tighter bargain. Governments want sovereign repair, software authority, and a place in the supply chain that survives the first export-licence delay. They want this written into the programme, not parked in a side letter. For primes, the commercial implication is simple. The local partner is no longer a political decoration. It is part of the delivery system.",
			"Singapore has long run a more sophisticated version of this logic through its defence technology community: the state as a demanding customer, industry as an extension of force readiness, foreign suppliers as partners under explicit technology terms. Variants of that approach are now visible, with local differences, from Australia’s continuous naval shipbuilding debate to India’s indigenisation targets and Korea’s dual posture as buyer and exporter.",
			"Due diligence therefore has to look past the term sheet. Who holds the intellectual property for the mission system? Who can certify a repair? What happens to the software baseline when the original equipment manufacturer is under a foreign disclosure constraint? These are not legal footnotes. They are operational facts.",
			"Firms that treat industrial participation as a bid-cost to be minimised will still win the occasional campaign. They will also find themselves structurally misaligned with the buyers who are now writing industrial outcomes into the requirement itself. The better reading is that participation is becoming the product: a capability that can be generated, updated, and exported from inside the region, under local political control.",
			"That is a higher bar. It is also a more durable one. The suppliers who will still be relevant in 2035 are those who can explain, in a ministry and in a factory, how the work stays in-country when the news cycle moves on."
		]
	},
	{
		slug: "open-source-capability-assessment",
		title: "What open-source methods can, and cannot, tell a principal",
		dek: "Commercial imagery, shipping data, and technical literature have changed the floor of military analysis. They have not abolished the need for judgement — or for knowing where the floor ends.",
		date: "19 March 2026",
		category: "Research",
		read: "9 min",
		image: "/images/research.jpg",
		paragraphs: [
			"The last decade has been unkind to the idea that only a classified holding can support a serious capability judgement. Commercial satellite imagery, AIS traces, patent filings, procurement gazettes, and the vernacular press now allow a competent team to bound many questions that once required a collection agency. That is a fact. It is also an invitation to overclaim.",
			"Open-source work is strongest on presence, weakest on intent, and uneven on performance. We can often say, with useful confidence, that a class of ship is fitting out, that a runway has been extended, that a factory has added a bay. We can less often say what the software build on the radar actually does in clutter, or whether the crew can fight the ship on the third night of a crisis.",
			"The method, therefore, has to be honest about its edges. We treat imagery and documents as evidence, not as theatre. We record what would change our mind. We separate the observation from the inference, and the inference from the recommendation. Clients who want a single dramatic slide are asked to want something else.",
			"There is a second discipline, particular to a firm that works in Singapore. We do not handle classified material. That is a professional boundary, not a marketing line. It means our work can be read in a room that includes people without a clearance; it also means we will not pretend to know what only a national assessment can know. The value is in the structured unknown — the list of questions a classified process should be asked to answer.",
			"Technology complicates the craft. Dual-use systems, software-defined sensors, and commercial launch have made the order-of-battle a less stable object. Counting hulls still matters. Counting the quality of the training pipeline, the magazine, and the maintenance hour often matters more. Open sources can illuminate all three, if the team is willing to read boring documents with the same care it gives a satellite pass.",
			"Principals should commission this work for the same reason they commission any staff paper: to narrow a decision, not to decorate one already taken. Used that way, open-source research is not a substitute for national intelligence. It is a way of arriving at the classified conversation less naïve than you otherwise would."
		]
	}
];
function insightBySlug(slug) {
	return INSIGHTS.find((item) => item.slug === slug);
}
//#endregion
//#region node_modules/.nitro/vite/services/ssr/assets/router-5YS9k2gO.js
var import_react = /* @__PURE__ */ __toESM(require_react());
var import_jsx_runtime = require_jsx_runtime();
var __defProp = Object.defineProperty;
var __exportAll = (all, no_symbols) => {
	let target = {};
	for (var name in all) __defProp(target, name, {
		get: all[name],
		enumerable: true
	});
	if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
	return target;
};
function AppErrorComponent({ error }) {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("main", {
		className: "flex min-h-screen flex-col items-center justify-center gap-3 px-6 text-center bg-zinc-50 text-zinc-900 dark:bg-zinc-950 dark:text-zinc-50",
		children: [
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
				className: "text-red-500",
				"aria-hidden": "true",
				children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, {
					className: "size-10",
					strokeWidth: 2
				})
			}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
				className: "text-lg font-semibold",
				children: "Something went wrong"
			}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
				className: "max-w-md text-sm break-words text-zinc-500 dark:text-zinc-400",
				children: error.message || "An unexpected error occurred. Try reloading the page."
			})
		]
	});
}
function NotFound() {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", {
		className: "bg-ink px-6 pt-36 pb-24 text-fg",
		children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
			className: "mx-auto max-w-xl",
			children: [
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
					className: "label-kicker",
					children: "404"
				}),
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
					className: "mt-4 font-display text-section font-medium",
					children: "This page is not on the map."
				}),
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
					className: "mt-4 text-muted",
					children: "The address you requested does not exist on this site."
				}),
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
					to: "/",
					className: "mt-10 inline-flex min-h-12 items-center bg-fg px-6 text-[0.78rem] font-semibold tracking-[0.16em] text-ink uppercase no-underline",
					children: "Return home"
				})
			]
		})
	});
}
/**
* App-wide client provider mounted once near the root (in `src/routes/__root.tsx`):
*
*   <AuthProvider><Outlet /></AuthProvider>
*
* Better Auth's React client (`@/lib/auth/client`) needs NO context provider —
* its `useSession()` works standalone — so this is a passthrough today. It's
* kept as the single, stable mount point for any future client-side providers
* (e.g. a toast or theme provider) without churning the root shell.
*/
function AuthProvider({ children }) {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
}
function isGrokEmbedderOrigin(origin) {
	try {
		const url = new URL(origin);
		if (url.protocol !== "https:" && url.protocol !== "http:") return false;
		const host = url.hostname.toLowerCase();
		if (host === "grok.com" || host.endsWith(".grok.com")) return true;
		if (host === "localhost" || host === "127.0.0.1" || host === "[::1]") return true;
		return false;
	} catch {
		return false;
	}
}
function isSandboxPreviewGuestHost(hostname) {
	const host = hostname.toLowerCase();
	return host === "grok-sandbox.com" || host.endsWith(".grok-sandbox.com");
}
function isRemintPreviewPair(guestHost, parentHost) {
	const guest = guestHost.toLowerCase();
	const parent = parentHost.toLowerCase();
	const i = guest.indexOf(".preview.");
	if (i <= 0) return false;
	const label = guest.slice(0, i);
	const rest = guest.slice(i + 9);
	if (label.includes(".") || !rest.includes(".")) return false;
	return parent === rest || parent === `grok.${rest}`;
}
function resolveParentEmbedderOrigin(parentIsSelf, referrer, ancestorOrigin, guestHostname = "") {
	if (parentIsSelf) return null;
	for (const candidate of [referrer, ancestorOrigin ?? ""].filter(Boolean)) try {
		const url = new URL(candidate.includes("://") ? candidate : `https://${candidate}`);
		if (url.protocol !== "https:" && url.protocol !== "http:") continue;
		if (isGrokEmbedderOrigin(url.origin)) return url.origin;
		if (isSandboxPreviewGuestHost(guestHostname) || isRemintPreviewPair(guestHostname, url.hostname)) return url.origin;
	} catch {}
	return null;
}
/**
* Guest side of the grok-web ↔ sandbox preview postMessage bridge.
*
* Activates only when this page is framed by an allowlisted Grok embedder.
* Top-level runs (download/export, local `npm run dev`, deployed sites) noop.
*/
var PREVIEW_BRIDGE_CHANNEL = "grok-preview-bridge";
var EnvelopeSchema = object({
	channel: literal(PREVIEW_BRIDGE_CHANNEL),
	version: number().int().positive(),
	type: string().min(1)
});
var HelloSchema = EnvelopeSchema.extend({ type: literal("hello") });
var NavigateSchema = EnvelopeSchema.extend({
	type: literal("navigate"),
	path: string().min(1)
});
var HistorySchema = EnvelopeSchema.extend({
	type: literal("history"),
	delta: union([literal(-1), literal(1)])
});
function isSafeBridgePath(path) {
	if (!path.startsWith("/") || path.startsWith("//") || path.includes("\\")) return false;
	try {
		return new URL(path, "https://preview.invalid").origin === "https://preview.invalid";
	} catch {
		return false;
	}
}
/**
* Install host↔guest messaging. Returns a dispose function.
* Noops (returns a no-op dispose) when not embedded under a Grok parent.
*/
function installPreviewHostBridge(options = {}) {
	if (typeof window === "undefined") return () => {};
	const ancestorOrigin = typeof location.ancestorOrigins !== "undefined" && location.ancestorOrigins.length > 0 ? location.ancestorOrigins[0] : null;
	const parentOrigin = resolveParentEmbedderOrigin(window.parent === window, document.referrer, ancestorOrigin, window.location.hostname);
	if (parentOrigin === null) return () => {};
	const ROOT_STATE_KEY = "__grokPreviewBridgeRoot";
	const originalPushState = window.history.pushState.bind(window.history);
	const originalReplaceState = window.history.replaceState.bind(window.history);
	const isAtHistoryRoot = () => {
		const state = window.history.state;
		return Boolean(state && typeof state === "object" && state[ROOT_STATE_KEY] === true);
	};
	try {
		const current = window.history.state;
		if (!(current !== null && typeof current === "object" && Object.prototype.hasOwnProperty.call(current, ROOT_STATE_KEY))) {
			const isRoot = window.history.length <= 1;
			originalReplaceState(current && typeof current === "object" ? {
				...current,
				[ROOT_STATE_KEY]: isRoot
			} : { [ROOT_STATE_KEY]: isRoot }, "", window.location.href);
		}
	} catch {}
	const post = (message) => {
		window.parent.postMessage(message, parentOrigin);
	};
	const reportLocation = () => {
		post({
			channel: PREVIEW_BRIDGE_CHANNEL,
			version: 1,
			type: "location",
			path: window.location.pathname || "/",
			search: window.location.search,
			hash: window.location.hash
		});
	};
	const reportRoutes = () => {
		const paths = options.getRoutePaths?.() ?? [];
		post({
			channel: PREVIEW_BRIDGE_CHANNEL,
			version: 1,
			type: "routes",
			paths
		});
	};
	const defaultNavigate = (path) => {
		if (!isSafeBridgePath(path)) return;
		try {
			const url = new URL(path, window.location.origin);
			if (url.origin !== window.location.origin) return;
			const next = `${url.pathname}${url.search}${url.hash}`;
			window.history.pushState(window.history.state, "", next);
			window.dispatchEvent(new PopStateEvent("popstate", { state: window.history.state }));
		} catch {}
	};
	const navigate = (path) => {
		if (!isSafeBridgePath(path)) return;
		if (options.navigate) {
			options.navigate(path);
			return;
		}
		defaultNavigate(path);
	};
	const announce = () => {
		reportLocation();
		reportRoutes();
		post({
			channel: PREVIEW_BRIDGE_CHANNEL,
			version: 1,
			type: "ready"
		});
	};
	const onMessage = (event) => {
		if (event.source !== window.parent) return;
		if (event.origin !== parentOrigin) return;
		const envelope = EnvelopeSchema.safeParse(event.data);
		if (!envelope.success || envelope.data.version !== 1) return;
		if (envelope.data.type === "hello") {
			if (!HelloSchema.safeParse(event.data).success) return;
			announce();
			return;
		}
		if (envelope.data.type === "navigate") {
			const parsed = NavigateSchema.safeParse(event.data);
			if (!parsed.success) return;
			navigate(parsed.data.path);
			queueMicrotask(reportLocation);
			return;
		}
		if (envelope.data.type === "history") {
			const parsed = HistorySchema.safeParse(event.data);
			if (!parsed.success) return;
			if (parsed.data.delta === -1 && isAtHistoryRoot()) return;
			window.history.go(parsed.data.delta);
		}
	};
	const onPopState = () => {
		reportLocation();
	};
	const onHashChange = () => {
		reportLocation();
	};
	window.history.pushState = (data, unused, url) => {
		const next = data && typeof data === "object" ? {
			...data,
			[ROOT_STATE_KEY]: false
		} : data;
		originalPushState(next, unused, url);
		reportLocation();
	};
	window.history.replaceState = (data, unused, url) => {
		const next = isAtHistoryRoot() ? {
			...data && typeof data === "object" ? data : {},
			[ROOT_STATE_KEY]: true
		} : data;
		originalReplaceState(next, unused, url);
		reportLocation();
	};
	window.addEventListener("message", onMessage);
	window.addEventListener("popstate", onPopState);
	window.addEventListener("hashchange", onHashChange);
	announce();
	return () => {
		window.removeEventListener("message", onMessage);
		window.removeEventListener("popstate", onPopState);
		window.removeEventListener("hashchange", onHashChange);
		window.history.pushState = originalPushState;
		window.history.replaceState = originalReplaceState;
	};
}
/** Collect static path patterns from a TanStack route tree (best-effort). */
function collectRoutePathsFromTree(routeTree) {
	const paths = /* @__PURE__ */ new Set();
	const walk = (node) => {
		if (!node || typeof node !== "object") return;
		const record = node;
		const full = typeof record.fullPath === "string" ? record.fullPath : typeof record.path === "string" ? record.path : null;
		if (full !== null && full !== "") paths.add(full.startsWith("/") ? full : `/${full}`);
		else if (full === "") paths.add("/");
		const children = record.children;
		if (Array.isArray(children)) for (const child of children) walk(child);
		else if (children && typeof children === "object") for (const child of Object.values(children)) walk(child);
	};
	walk(routeTree);
	return [...paths];
}
/**
* Mount once in `__root.tsx` so the Grok preview chrome can drive navigation
* (and later receive registered routes). Noops when the app is not embedded.
*/
function PreviewHostBridge() {
	const router = useRouter();
	(0, import_react.useEffect)(() => {
		return installPreviewHostBridge({
			navigate: (path) => {
				router.history.push(path);
			},
			getRoutePaths: () => collectRoutePathsFromTree(router.routeTree)
		});
	}, [router]);
	return null;
}
function cn(...inputs) {
	return twMerge(clsx(inputs));
}
function Mark({ className }) {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
		viewBox: "0 0 36 36",
		className: cn("size-7 shrink-0", className),
		"aria-hidden": "true",
		fill: "none",
		children: [
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", {
				x: "3.5",
				y: "3.5",
				width: "29",
				height: "29",
				stroke: "currentColor",
				strokeWidth: "1.2"
			}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", {
				x1: "18",
				y1: "3.5",
				x2: "18",
				y2: "32.5",
				stroke: "currentColor",
				strokeWidth: "1.2"
			}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", {
				x1: "3.5",
				y1: "21",
				x2: "32.5",
				y2: "21",
				stroke: "currentColor",
				strokeWidth: "1.2"
			}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
				cx: "18",
				cy: "21",
				r: "1.7",
				fill: "currentColor"
			})
		]
	});
}
function Logo({ tone = "light", compact = false }) {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Link, {
		to: "/",
		className: cn("group flex items-center gap-3 no-underline", tone === "light" ? "text-fg" : "text-ink-fg"),
		"aria-label": "Daciora Consulting, home",
		children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Mark, {}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
			className: "flex flex-col leading-none",
			children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
				className: "font-sans text-[0.95rem] font-semibold tracking-[0.22em] uppercase",
				children: "Daciora"
			}), !compact && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
				className: cn("mt-1 text-[0.62rem] font-medium tracking-[0.28em] uppercase", tone === "light" ? "text-muted" : "text-ink-muted"),
				children: "Consulting"
			})]
		})]
	});
}
function Footer() {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("footer", {
		className: "bg-ink text-fg",
		children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
			className: "site-wrap py-16 md:py-20",
			children: [
				/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
					className: "grid gap-12 md:grid-cols-12 md:gap-8",
					children: [
						/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
							className: "md:col-span-5",
							children: [
								/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
									className: "flex items-center gap-3",
									children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Mark, { className: "size-6" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
										className: "text-sm font-semibold tracking-[0.22em] uppercase",
										children: FIRM.legal
									})]
								}),
								/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
									className: "mt-6 max-w-sm text-[0.95rem] leading-relaxed text-muted",
									children: "Independent advisory on defence policy, industry, and research. Headquartered in Singapore, working across the Indo-Pacific."
								}),
								/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
									className: "mt-6 text-sm text-muted",
									children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
										href: `mailto:${FIRM.email}`,
										className: "text-fg underline decoration-line underline-offset-4 transition-colors duration-150 hover:text-steel",
										children: FIRM.email
									})
								})
							]
						}),
						/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
							className: "md:col-span-3",
							children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
								className: "label-kicker",
								children: "Navigate"
							}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ul", {
								className: "mt-4 space-y-2",
								children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
									to: "/",
									className: "text-sm text-muted no-underline transition-colors duration-150 hover:text-fg",
									children: "Home"
								}) }), NAV.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
									to: item.to,
									className: "text-sm text-muted no-underline transition-colors duration-150 hover:text-fg",
									children: item.label
								}) }, item.to))]
							})]
						}),
						/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
							className: "md:col-span-4",
							children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
								className: "label-kicker",
								children: "Singapore"
							}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("address", {
								className: "mt-4 not-italic text-sm leading-relaxed text-muted",
								children: [
									FIRM.addressLines.map((line) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
										className: "block",
										children: line
									}, line)),
									/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
										className: "mt-3 block",
										children: FIRM.phone
									}),
									/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
										className: "block",
										children: FIRM.hours
									})
								]
							})]
						})
					]
				}),
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("hr", { className: "hairline my-10" }),
				/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
					className: "flex flex-col gap-4 text-[0.75rem] leading-relaxed text-subtle md:flex-row md:items-start md:justify-between",
					children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
						className: "max-w-xl",
						children: [
							"Daciora Consulting is an independent firm. We do not represent any government. This website and all correspondence with the firm are unclassified. Do not send classified or restricted material to",
							" ",
							FIRM.email,
							"."
						]
					}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
						className: "shrink-0",
						children: [
							"© ",
							(/* @__PURE__ */ new Date()).getFullYear(),
							" ",
							FIRM.legal,
							". All rights reserved."
						]
					})]
				})
			]
		})
	});
}
function Header() {
	const pathname = useRouterState({ select: (s) => s.location.pathname });
	const isHome = pathname === "/";
	const [scrolled, setScrolled] = (0, import_react.useState)(false);
	const [open, setOpen] = (0, import_react.useState)(false);
	(0, import_react.useEffect)(() => {
		const onScroll = () => setScrolled(window.scrollY > 24);
		onScroll();
		window.addEventListener("scroll", onScroll, { passive: true });
		return () => window.removeEventListener("scroll", onScroll);
	}, []);
	(0, import_react.useEffect)(() => {
		setOpen(false);
	}, [pathname]);
	(0, import_react.useEffect)(() => {
		document.body.style.overflow = open ? "hidden" : "";
		return () => {
			document.body.style.overflow = "";
		};
	}, [open]);
	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", {
		className: cn("fixed inset-x-0 top-0 z-40 border-b", "transition-[background-color,border-color,box-shadow] duration-250 ease-[cubic-bezier(0.22,1,0.36,1)]", !isHome || scrolled || open ? "border-line bg-ink/95 shadow-[0_1px_0_0_rgba(243,239,230,0.04)]" : "border-transparent bg-transparent"),
		children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
			className: "site-wrap flex h-16 items-center justify-between md:h-[4.5rem]",
			children: [
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Logo, { tone: "light" }),
				/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", {
					className: "hidden items-center gap-8 md:flex",
					"aria-label": "Primary",
					children: [NAV.map((item) => {
						const active = pathname === item.to || pathname.startsWith(`${item.to}/`);
						return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Link, {
							to: item.to,
							className: cn("relative py-2 text-[0.78rem] font-semibold tracking-[0.18em] uppercase no-underline", "transition-colors duration-150 ease-out", active ? "text-fg" : "text-muted hover:text-fg"),
							children: [item.label, /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: cn("absolute inset-x-0 -bottom-0.5 h-px bg-steel transition-opacity duration-150", active ? "opacity-100" : "opacity-0") })]
						}, item.to);
					}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
						to: "/contact",
						className: "inline-flex min-h-11 items-center bg-fg px-4 text-[0.72rem] font-semibold tracking-[0.16em] text-ink uppercase no-underline transition-[background-color,scale] duration-150 ease-out hover:bg-paper-deep active:scale-[0.96]",
						children: "Enquire"
					})]
				}),
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
					type: "button",
					className: "inline-flex size-11 items-center justify-center text-fg md:hidden",
					"aria-label": open ? "Close menu" : "Open menu",
					"aria-expanded": open,
					onClick: () => setOpen((v) => !v),
					children: open ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(X, {
						className: "size-5",
						strokeWidth: 1.5
					}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Menu, {
						className: "size-5",
						strokeWidth: 1.5
					})
				})
			]
		})
	}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
		className: cn("fixed inset-0 z-30 bg-ink md:hidden", "transition-opacity duration-250 ease-[cubic-bezier(0.22,1,0.36,1)]", open ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0"),
		"aria-hidden": !open,
		children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", {
			className: "flex h-full flex-col justify-between px-6 pb-10 pt-24",
			"aria-label": "Mobile",
			children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", {
				className: "flex flex-col gap-1",
				children: NAV.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
					to: item.to,
					className: "block py-3 font-display text-4xl font-medium text-fg no-underline",
					children: item.label
				}) }, item.to))
			}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
				className: "label-kicker text-subtle",
				children: [FIRM.legal, " · Singapore"]
			})]
		})
	})] });
}
function SiteLayout({ children }) {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
		className: "flex min-h-dvh flex-col bg-ink text-fg",
		children: [
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Header, {}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)("main", {
				className: "flex-1",
				children
			}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Footer, {})
		]
	});
}
function PageIntro({ kicker, title, lede }) {
	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", {
		className: "bg-ink pt-28 pb-14 md:pt-36 md:pb-20",
		children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
			className: "site-wrap",
			children: [
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
					className: "label-kicker reveal",
					children: kicker
				}),
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
					className: "reveal reveal-delay-1 mt-5 max-w-4xl font-display text-display leading-[1.05] font-medium tracking-display text-fg",
					children: title
				}),
				/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
					className: "reveal reveal-delay-2 mt-6 max-w-2xl text-lede leading-snug text-muted",
					children: lede
				})
			]
		})
	});
}
var styles_default = "/assets/styles-CjWQb-GN.css";
var APP_NAME = "Daciora Consulting";
var Route$6 = createRootRoute({
	head: () => ({
		meta: [
			{ charSet: "utf-8" },
			{
				name: "viewport",
				content: "width=device-width, initial-scale=1"
			},
			{ title: APP_NAME },
			{
				name: "description",
				content: "Daciora Consulting is an independent Singapore advisory firm working on defence policy, defence industry, and defence research across the Indo-Pacific."
			},
			{
				name: "theme-color",
				content: "#0b1219"
			}
		],
		links: [
			{
				rel: "icon",
				type: "image/svg+xml",
				href: "/favicon.svg"
			},
			{
				rel: "stylesheet",
				href: styles_default
			},
			{
				rel: "manifest",
				href: "/__grok/manifest.webmanifest"
			},
			{
				rel: "apple-touch-icon",
				href: "/__grok/icon-180.png"
			},
			{
				rel: "preconnect",
				href: "https://fonts.googleapis.com"
			},
			{
				rel: "preconnect",
				href: "https://fonts.gstatic.com",
				crossOrigin: "anonymous"
			},
			{
				rel: "stylesheet",
				href: "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600&family=Source+Sans+3:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap"
			}
		]
	}),
	component: () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("html", {
		lang: "en",
		className: "antialiased",
		suppressHydrationWarning: true,
		children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("head", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HeadContent, {}) }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("body", { children: [
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PreviewHostBridge, {}),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AuthProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiteLayout, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Outlet, {}) }) }),
			/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Scripts, {})
		] })]
	})
});
var $$splitComponentImporter$5 = () => import("./routes-DxettZfU.mjs");
var Route$5 = createFileRoute("/")({ component: lazyRouteComponent($$splitComponentImporter$5, "component") });
var $$splitComponentImporter$4 = () => import("./about-CLpejV3Z.mjs");
var Route$4 = createFileRoute("/about")({
	component: lazyRouteComponent($$splitComponentImporter$4, "component"),
	head: () => ({ meta: [{ title: "About — Daciora Consulting" }] })
});
var $$splitComponentImporter$3 = () => import("./contact-ByL43_0K.mjs");
var Route$3 = createFileRoute("/contact")({
	component: lazyRouteComponent($$splitComponentImporter$3, "component"),
	head: () => ({ meta: [{ title: "Contact — Daciora Consulting" }] })
});
var $$splitComponentImporter$2 = () => import("./insights-BjkZ5xF8.mjs");
var Route$2 = createFileRoute("/insights")({
	component: lazyRouteComponent($$splitComponentImporter$2, "component"),
	head: () => ({ meta: [{ title: "Insights — Daciora Consulting" }] })
});
var $$splitComponentImporter$1 = () => import("./practice-BDBwBPG6.mjs");
var Route$1 = createFileRoute("/practice")({
	component: lazyRouteComponent($$splitComponentImporter$1, "component"),
	head: () => ({ meta: [{ title: "Practice — Daciora Consulting" }] })
});
var $$splitComponentImporter = () => import("./insights._slug-D_e45_H0.mjs");
var Route = createFileRoute("/insights/$slug")({
	loader: ({ params }) => {
		const article = insightBySlug(params.slug);
		if (!article) throw notFound();
		return { article };
	},
	component: lazyRouteComponent($$splitComponentImporter, "component"),
	head: ({ loaderData }) => ({ meta: [{ title: loaderData ? `${loaderData.article.title} — Daciora Consulting` : "Insights — Daciora Consulting" }] })
});
var IndexRoute = Route$5.update({
	id: "/",
	path: "/",
	getParentRoute: () => Route$6
});
var AboutRoute = Route$4.update({
	id: "/about",
	path: "/about",
	getParentRoute: () => Route$6
});
var ContactRoute = Route$3.update({
	id: "/contact",
	path: "/contact",
	getParentRoute: () => Route$6
});
var InsightsRoute = Route$2.update({
	id: "/insights",
	path: "/insights",
	getParentRoute: () => Route$6
});
var PracticeRoute = Route$1.update({
	id: "/practice",
	path: "/practice",
	getParentRoute: () => Route$6
});
var InsightsRouteChildren = { InsightsSlugRoute: Route.update({
	id: "/$slug",
	path: "/$slug",
	getParentRoute: () => InsightsRoute
}) };
var rootRouteChildren = {
	IndexRoute,
	AboutRoute,
	ContactRoute,
	InsightsRoute: InsightsRoute._addFileChildren(InsightsRouteChildren),
	PracticeRoute
};
var routeTree = Route$6._addFileChildren(rootRouteChildren)._addFileTypes();
var router_exports = /* @__PURE__ */ __exportAll({ getRouter: () => getRouter });
function getRouter() {
	return createRouter({
		routeTree,
		defaultErrorComponent: AppErrorComponent,
		defaultNotFoundComponent: NotFound
	});
}
//#endregion
export { FIRM as a, PRACTICES as c, cn as i, PRINCIPALS as l, Route as n, FOOTPRINT as o, PageIntro as r, INSIGHTS as s, router_exports as t, PRINCIPLES as u };
