Compare commits

..

3 Commits

Author SHA1 Message Date
12dc62a07c blog articles 2026-05-26 19:02:08 -05:00
d22179288d we have been here before 2026-05-22 16:30:00 -05:00
4735704c6f Add first business article and article layout 2026-05-21 12:14:46 -05:00
9625 changed files with 989439 additions and 0 deletions

154
.astro/content.d.ts vendored Normal file
View File

@@ -0,0 +1,154 @@
declare module 'astro:content' {
export interface RenderResult {
Content: import('astro/runtime/server/index.js').AstroComponentFactory;
headings: import('astro').MarkdownHeading[];
remarkPluginFrontmatter: Record<string, any>;
}
interface Render {
'.md': Promise<RenderResult>;
}
export interface RenderedContent {
html: string;
metadata?: {
imagePaths: Array<string>;
[key: string]: unknown;
};
}
type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
export type CollectionKey = keyof DataEntryMap;
export type CollectionEntry<C extends CollectionKey> = Flatten<DataEntryMap[C]>;
type AllValuesOf<T> = T extends any ? T[keyof T] : never;
export type ReferenceDataEntry<
C extends CollectionKey,
E extends keyof DataEntryMap[C] = string,
> = {
collection: C;
id: E;
};
export type ReferenceLiveEntry<C extends keyof LiveContentConfig['collections']> = {
collection: C;
id: string;
};
export function getCollection<C extends keyof DataEntryMap, E extends CollectionEntry<C>>(
collection: C,
filter?: (entry: CollectionEntry<C>) => entry is E,
): Promise<E[]>;
export function getCollection<C extends keyof DataEntryMap>(
collection: C,
filter?: (entry: CollectionEntry<C>) => unknown,
): Promise<CollectionEntry<C>[]>;
export function getLiveCollection<C extends keyof LiveContentConfig['collections']>(
collection: C,
filter?: LiveLoaderCollectionFilterType<C>,
): Promise<
import('astro').LiveDataCollectionResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>
>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(
entry: ReferenceDataEntry<C, E>,
): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(
collection: C,
id: E,
): E extends keyof DataEntryMap[C]
? string extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]> | undefined
: Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
export function getLiveEntry<C extends keyof LiveContentConfig['collections']>(
collection: C,
filter: string | LiveLoaderEntryFilterType<C>,
): Promise<import('astro').LiveDataEntryResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>>;
/** Resolve an array of entry references from the same collection */
export function getEntries<C extends keyof DataEntryMap>(
entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[],
): Promise<CollectionEntry<C>[]>;
export function render<C extends keyof DataEntryMap>(
entry: DataEntryMap[C][string],
): Promise<RenderResult>;
export function reference<
C extends
| keyof DataEntryMap
// Allow generic `string` to avoid excessive type errors in the config
// if `dev` is not running to update as you edit.
// Invalid collection names will be caught at build time.
| (string & {}),
>(
collection: C,
): import('astro/zod').ZodPipe<
import('astro/zod').ZodString,
import('astro/zod').ZodTransform<
C extends keyof DataEntryMap
? {
collection: C;
id: string;
}
: never,
string
>
>;
type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
type InferEntrySchema<C extends keyof DataEntryMap> = import('astro/zod').infer<
ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
>;
type ExtractLoaderConfig<T> = T extends { loader: infer L } ? L : never;
type InferLoaderSchema<
C extends keyof DataEntryMap,
L = ExtractLoaderConfig<ContentConfig['collections'][C]>,
> = L extends { schema: import('astro/zod').ZodSchema }
? import('astro/zod').infer<L['schema']>
: any;
type DataEntryMap = {
};
type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
infer TData,
infer TEntryFilter,
infer TCollectionFilter,
infer TError
>
? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
: { data: never; entryFilter: never; collectionFilter: never; error: never };
type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
LiveContentConfig['collections'][C]['schema'] extends undefined
? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
: import('astro/zod').infer<
Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
>;
type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
LiveContentConfig['collections'][C]['loader']
>;
export type ContentConfig = never;
export type LiveContentConfig = never;
}

2
.astro/types.d.ts vendored Normal file
View File

@@ -0,0 +1,2 @@
/// <reference types="astro/client" />
/// <reference path="content.d.ts" />

16
Dockerfile Normal file
View File

@@ -0,0 +1,16 @@
FROM node:lts-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80

43
README.md Normal file
View File

@@ -0,0 +1,43 @@
# Astro Starter Kit: Minimal
```sh
npm create astro@latest -- --template minimal
```
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro project, you'll see the following folders and files:
```text
/
├── public/
├── src/
│ └── pages/
│ └── index.astro
└── package.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
Any static assets, like images, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).

5
astro.config.mjs Normal file
View File

@@ -0,0 +1,5 @@
// @ts-check
import { defineConfig } from 'astro/config';
// https://astro.build/config
export default defineConfig({});

View File

@@ -0,0 +1,100 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><title>Content Types Were Proto-AI Knowledge Objects | Fractional Insight CIO LLC</title><meta name="description" content="Long before vector databases and semantic retrieval pipelines, enterprise architects were already attempting to solve the problem of computational meaning at organizational scale."><style>:root{--bg: #f7f8fa;--text: #172033;--muted: #5f6b7a;--panel: #ffffff;--accent: #1d4f91;--accent-dark: #12345f;--border: #d9dee7}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);line-height:1.6}a{color:var(--accent);text-decoration:none}.site-shell{width:min(1120px,calc(100% - 32px));margin:0 auto}.site-header{background:#fff;border-bottom:1px solid var(--border);padding:20px 0}.site-nav{display:flex;justify-content:space-between;align-items:center}.brand{font-weight:700;color:var(--text)}.nav-links{display:flex;gap:24px}.hero{padding:88px 0;background:linear-gradient(135deg,#10233f,#1d4f91);color:#fff}.hero h1{font-size:clamp(2.8rem,6vw,5.2rem);line-height:1;max-width:850px}.hero p{font-size:1.25rem;max-width:720px;color:#dbe6f5}.button{display:inline-block;margin-top:24px;padding:12px 20px;background:#fff;color:var(--accent-dark);border-radius:6px;font-weight:700}.section{padding:64px 0}.section h2{font-size:2.2rem;margin-bottom:12px}.service-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:32px}.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:26px}.card h3{margin-top:0}.contact-box{max-width:720px;background:#fff;border:1px solid var(--border);border-radius:10px;padding:32px}.form-grid{display:grid;gap:16px}input,textarea{width:100%;padding:12px;border:1px solid var(--border);border-radius:6px;font:inherit}textarea{min-height:160px}button{width:fit-content;padding:12px 20px;border:0;border-radius:6px;background:var(--accent);color:#fff;font-weight:700;cursor:pointer}.site-footer{border-top:1px solid var(--border);padding:32px 0;color:var(--muted)}@media(max-width:800px){.service-grid{grid-template-columns:1fr}.site-nav{align-items:flex-start;gap:12px;flex-direction:column}}.article-hero{padding:56px 0 24px;background:#fff;border-bottom:1px solid var(--border)}.article-hero h1{font-size:clamp(2.4rem,5vw,4.2rem);line-height:1.05;max-width:900px}.article-meta{color:var(--muted);font-weight:600}.article-excerpt{max-width:760px;font-size:1.2rem;color:var(--muted)}.article-banner{width:100%;max-height:420px;object-fit:cover;border-radius:12px;border:1px solid var(--border);margin-top:32px}.article-content{max-width:820px;padding:56px 0}.article-content h2{margin-top:42px}.article-content p,.article-content li{font-size:1.08rem}
</style></head> <body> <header class="site-header"> <div class="site-shell site-nav"> <a class="brand" href="/">Fractional Insight CIO</a> <nav class="nav-links"> <a href="/">Services</a> <a href="/blog/">Articles</a> <a href="/contact/">Contact</a> </nav> </div> </header> <section class="article-hero"> <div class="site-shell"> <p class="article-meta">2026-05-23T00:00:00.000Z</p> <h1>Content Types Were Proto-AI Knowledge Objects</h1> <p class="article-excerpt">Long before vector databases and semantic retrieval pipelines, enterprise architects were already attempting to solve the problem of computational meaning at organizational scale.</p> <img class="article-banner" src="/images/blog/content-types-were-proto-ai-knowledge-objects.png" alt="Content Types Were Proto-AI Knowledge Objects"> </div> </section> <main class="site-shell article-content"> <article> <p>Most people remember SharePoint Content Types as an administrative feature. They remember mandatory metadata fields, governance meetings, and the frustration of trying to convince users that properly classifying a document actually mattered.</p>
<p>In many organizations, Content Types eventually became associated with bureaucracy. Users wanted the simplicity of dragging a file into a folder and moving on with their day. Architects and administrators, meanwhile, were trying to impose structure on systems that were already beginning to sprawl beyond anyones ability to govern them consistently. But that memory obscures the real purpose behind Content Types.</p>
<blockquote>
<p>They were never simply about metadata.</p>
</blockquote>
<p>They were an attempt to answer a much deeper question: how does an organization assign meaning to information in ways that survive scale, time, and organizational complexity?</p>
<p>Over the last several years, as organizations have rushed toward AI systems built around retrieval, contextual memory, semantic search, and knowledge orchestration, I have repeatedly found myself revisiting ideas that felt very familiar from the SharePoint era. The terminology has changed, but the underlying concerns have not. We are still struggling with the same fundamental problem that sat underneath enterprise search and knowledge management fifteen years ago:</p>
<blockquote>
<p>How do computational systems distinguish between raw information and meaningful knowledge?</p>
</blockquote>
<p>When I wrote about Content Types during the SharePoint 2010 era, I described them as “a conceptual container for content and processes in the system.” At the time, this language fit naturally into the world of enterprise content management. Looking back now, it sounds remarkably similar to the way modern AI systems discuss semantic knowledge objects. Because that is essentially what Content Types were attempting to become.</p>
<p>A document was no longer treated as an isolated file sitting in a folder somewhere on the network. It became something contextualized and understood by the surrounding architecture. A proposal carried different meaning than a policy document. Information acquired semantic identity through the architecture surrounding it.</p>
<p>That identity shaped everything else. It influenced how information was classified, how it moved through workflows, how it appeared in search results, how long it was retained, and who was considered authoritative over it. Modern AI systems are quietly rediscovering the need for this same architectural discipline.</p>
<p>One of the recurring assumptions in the current AI cycle is that embeddings and vector search somehow reduce the importance of metadata and structured information architecture. The belief is that sufficiently advanced retrieval systems will infer meaning automatically from unstructured content. That semantic similarity itself becomes enough. But semantic similarity is not the same thing as organizational understanding.</p>
<p>A language model may recognize that two documents are related while still having no understanding of which document reflects current policy, which one represents an outdated draft, or which conversation carried actual decision-making authority inside the organization. That distinction matters enormously. Especially considering that the language model is being asked to return an answer to a question rather than a list of documents that may or may not be helpful.</p>
<p>Over the last decade, many organizations abandoned the discipline required to preserve structured institutional knowledge. Information spread across collaboration platforms, SaaS systems, fragmented repositories, and years of unmanaged conversational history. Governance weakened because it was seen as friction. Metadata weakened because users resisted it. Taxonomy weakened because search appeared “good enough” to compensate for the growing entropy.</p>
<p>Now organizations are attempting to build AI systems on top of that fragmentation. In many cases, the problem is not the model itself. The problem is that organizational meaning was never preserved in ways that computational systems could reliably understand. And that was always the deeper purpose of Content Types.</p>
<h2 id="the-original-purpose-of-content-types">The Original Purpose of Content Types</h2>
<p>One of the reasons Content Types are often misunderstood is because most users only ever encountered them through the user interface. They saw a form asking for metadata, a required field blocking a document upload, or a governance policy that felt disconnected from the work they were trying to accomplish. From that perspective, Content Types looked like administrative overhead.</p>
<p>Architecturally, however, they represented something much more important. Content Types were an attempt to create reusable semantic definitions for organizational knowledge. They provided a way for the system to understand that different forms of information carried different meaning.</p>
<ul>
<li>A contract was not simply a Word document.</li>
<li>A policy was not simply a PDF.</li>
<li>A project proposal was not simply another file sitting inside a document library.</li>
</ul>
<p>Each represented a different kind of organizational knowledge with its own lifecycle, authority structure, workflow requirements, retention expectations, and retrieval value. The Content Type unified those concerns into a single architectural object.</p>
<p>In a healthcare environment, or any regulated environment for that matter, the need for semantic clarity is vital to the business. Failure to maintain that clarity results in everything from regulatory violations and fines, to revenue losses, to poor patient outcomes. For example, Medical Licenses have a lifecycle from inception to expiration. And the impact of missing the expiration is not just that the provider can not practice medicine, there are also downstream operational events tied to those dates through a discipline called credentialing. This has downwind impacts on payer contracts, patient coverage, and revenue. Content Types contain the necessary metadata to give a document, like a Medical License, the semantic identity that the system needs.</p>
<p>Once information acquired semantic identity, other systems could begin operating against that meaning. Search engines could prioritize different forms of content differently. Workflows could route information according to organizational rules. Governance policies could distinguish between temporary collaboration artifacts and long-term institutional records. Templates could enforce consistency. Metadata could normalize terminology across departments that otherwise described the same concepts differently. Content Types were an early attempt to create computationally understandable organizational knowledge.</p>
<p>Modern AI systems are struggling with many of the same problems. AI retrieval systems also need ways to distinguish between different categories of information. They need mechanisms for preserving context, authority, and semantic meaning across increasingly large collections of organizational content.</p>
<blockquote>
<p>Without that structure, information begins collapsing into ambiguity.</p>
</blockquote>
<p>A language model may understand that several documents are related to payer contracts, for example, while still having no reliable way to distinguish between medical group, provider obligations, current reimbursement tables, or even what insurance carriers are represented in the organization. To human beings inside the organization, these distinctions often feel obvious because the context exists socially. Employees know which documents matter. They know which department owns the policy. They understand which conversations were exploratory and which represented actual decisions. Computational systems do not possess that intuition. The architecture itself must preserve those distinctions.</p>
<p>This was the promise of Content Types, even if many organizations never fully realized it at the time. Not merely better document management but to embed organizational meaning into the structure of the system itself. That is why the concept feels unexpectedly modern in the age of AI.</p>
<h2 id="knowledge-requires-identity">Knowledge Requires Identity</h2>
<p>One of the persistent problems in enterprise systems is that organizations often confuse information with knowledge.</p>
<p>Information by itself is inert. It exists as disconnected fragments scattered across documents, conversations, spreadsheets, emails, presentations, and repositories. What transforms information into organizational knowledge is context. Meaning emerges from understanding what something is, why it matters, who owns it, how trustworthy it is, and how it relates to the surrounding structure of the organization.</p>
<p>A document without context is simply unstructured data. The filename alone rarely tells the full story. Even the content itself may not be enough. Two documents may discuss the same subject while carrying entirely different operational significance. One may represent a countersigned payer contract while the other reflects early draft copies. One may be current while the other is outdated. One may be authoritative while the other is informational. Human beings navigate these distinctions constantly, often without consciously thinking about them.</p>
<p>Context becomes social knowledge embedded within the culture of the organization itself. The difficulty is that computational systems cannot reliably infer these distinctions on their own. Yet one of the recurring misconceptions in enterprise AI is the belief that sufficiently advanced retrieval systems can reconstruct organizational meaning from unstructured information automatically. If enough documents are embedded into a vector database, semantic similarity will supposedly surface the correct knowledge when needed. But semantic similarity is only one layer of meaning.</p>
<p>Without semantic identity, knowledge systems begin collapsing into ambiguity. And ambiguity at organizational scale creates a profound trust problem. The issue is not merely whether AI can retrieve information. The issue is whether the system understands enough about the structure of meaning to retrieve information responsibly. This is critical when your biller needs to know the current reimbursement value of an office visit for an Aetna patient. An AI that confidently presents a value from a draft contract from 6 years ago can produce unrealized revenue in the thousands of dollars per month.</p>
<h2 id="ai-systems-have-the-same-problem">AI Systems Have the Same Problem</h2>
<p>The more I work with modern AI systems, the more convinced I become that many of the current architectural conversations are rediscovering ideas the enterprise world was already struggling with during the SharePoint era. The terminology is different now, but the underlying problems remain the same.</p>
<p>Modern AI systems speak about knowledge graphs, semantic schemas, retrieval pipelines, contextual memory, structured data, and agent orchestration. At a conceptual level, these systems are attempting to solve the same core challenge that Content Types were designed to address:<br>
how does a computational system understand the meaning and role of information inside an organization?</p>
<p>This becomes especially important once organizations move beyond novelty demonstrations and begin trying to operationalize AI in real environments. At first, many AI initiatives focus almost entirely on retrieval. The assumption is that if enough organizational information is ingested into a vector database, semantic search will surface the correct knowledge automatically. But very quickly organizations begin running into familiar problems. The system retrieves too much information, conflicting information, outdated information, or semantically related information that lacks operational authority.</p>
<p>AI architectures increasingly introduce additional structural layers around retrieval systems as attempts to preserve meaning that raw semantic similarity alone cannot reliably provide. The irony is that many organizations spent the last decade dismantling precisely these forms of structure because they were perceived as cumbersome during the collaboration-first era.</p>
<h2 id="the-myth-that-embeddings-eliminate-structure">The Myth That Embeddings Eliminate Structure</h2>
<p>One of the more common assumptions in the current AI cycle is that semantic retrieval somehow eliminates the need for structured knowledge architecture. The idea is that if large language models can understand language semantically, and if vector databases can retrieve conceptually related information without relying on exact keywords, then perhaps metadata, taxonomy, and formal information architecture are no longer necessary. The machine will infer meaning automatically from the content itself.</p>
<p>Its not enough to feed the entire corpus of redacted patient records to a vector database and then have providers use the AI to complete up to date charts. Charting requirements change based on patient history, diagnoses, current medical issues regional standards medical practices and expectations, and where midlevel providers are concerned, expectations of supervising physicians. Without semantic meaning the AI increases the providers workload rather than reducing it. The irony is that patient charts are already heavily metadata based.</p>
<p>In contrast, traditional enterprise search systems were heavily dependent upon explicit structure. Search quality often rose or fell based on the discipline of metadata strategies, managed properties, taxonomy definitions, and governance practices. Semantic retrieval appears far more flexible by comparison. A user no longer needs exact terminology to retrieve related information. The system can often recognize conceptual relationships even when the wording changes dramatically.</p>
<p>Search can find all of the charts and documents related to the treatment of undiagnosed ADHD in adults, but it only presents them as a list based on rules of relevance. Those rules are informed by the metadata, which when incomplete or absent results in relevant documents falling to the bottom of the list. Providers reading the list intuitively know what they are looking for in the list of semantically similar documents.</p>
<p>But semantic similarity is not the same thing as organizational understanding. This distinction becomes critical very quickly once AI systems move beyond generalized knowledge and begin operating inside real organizational environments. Employees understand that a conversation inside a Team channel does not necessarily override formal policy. They recognize which systems are authoritative and which are exploratory. An AI agent performing an operational task will not have the same intuition when selecting content to base actions on.</p>
<p>This is why many organizations eventually discover that retrieval quality problems are often not retrieval problems at all. The vector database may be functioning correctly. The embeddings may be technically accurate. The model may successfully retrieve semantically related information. And yet the resulting outputs are still unreliable. This is where hallucinations begin to form and in areas of patient billing this can quickly turn into incidents of fraud. Or in the case of patient charting, the documentation of conversations that did not occur.</p>
<p>This is where many modern AI conversations begin circling back toward concepts that enterprise information architects have wrestled with for years. Organizations often resist this conclusion because structured information architecture introduces friction. Metadata requires discipline. Taxonomy requires governance. Lifecycle management requires maintenance. Semantic clarity requires ongoing stewardship. These activities rarely feel innovative compared to the excitement surrounding AI itself.</p>
<p>Once a system begins generating responses rather than merely retrieving files, the quality of the underlying knowledge architecture becomes inseparable from the trustworthiness of the system itself.</p>
<h2 id="content-types-as-early-knowledge-graph-thinking">Content Types as Early Knowledge Graph Thinking</h2>
<p>For a long time, enterprise systems were largely organized around containers. File shares, folders, document libraries, and repositories all approached information primarily through location. A document “lived” somewhere, and that location often became the primary mechanism through which people understood and navigated organizational knowledge. But organizational meaning rarely conforms neatly to folders. A single document may relate simultaneously to a project, a department, a policy domain, a client, a compliance requirement, and a workflow process.</p>
<p>This was one of the important shifts introduced by Content Types and managed metadata during the SharePoint era. The architecture began moving away from purely location-based organization toward systems capable of understanding information through semantic relationships.</p>
<p>A Content Type was not simply a template attached to a document. It represented a reusable definition that could exist independently from where the content itself happened to reside. Metadata fields established relationships between concepts. Taxonomies normalized meaning across departments. Search systems increasingly operated against semantic properties rather than simple file locations.</p>
<p>In hindsight, many of these ideas resemble early forms of what we would now describe as graph-oriented thinking. Modern AI systems increasingly rely on similar principles. Knowledge graphs, semantic relationships, contextual associations, and ontology layers all attempt to solve the same fundamental problem - preserving meaning through relationships rather than mere storage hierarchy. This is necessary because organizational knowledge is inherently interconnected.</p>
<p>This is one reason modern AI systems increasingly introduce ontology layers, graph structures, metadata enrichment, and contextual linking around retrieval systems. The machine requires some mechanism for understanding how pieces of knowledge relate to one another beyond simple semantic similarity.</p>
<blockquote>
<p>Without those relationships, meaning begins flattening.</p>
</blockquote>
<p>This is also where many organizations unintentionally undermine their own AI initiatives. Over the last decade, knowledge fragmentation accelerated as information spread across disconnected SaaS platforms, chat systems, cloud drives, and collaboration tools. Relationships that once existed implicitly inside structured information architecture slowly dissolved into disconnected repositories and conversational streams.</p>
<p>This is why I sometimes view Content Types less as a document management feature and more as an early attempt at computational organizational understanding. The architecture was trying to preserve meaning through reusable semantic definitions and relationships long before modern AI systems began rediscovering the same need.</p>
<h2 id="why-organizations-resisted-metadata">Why Organizations Resisted Metadata</h2>
<p>One of the more uncomfortable truths about enterprise knowledge architecture is that most of the underlying ideas were never technically difficult. The difficulty was cultural. Very few users wake up in the morning excited about metadata governance. Nobody enjoys stopping in the middle of their work to carefully classify a document, populate structured fields, or think about lifecycle management. From the perspective of the individual employee, these activities often feel disconnected from immediate productivity.</p>
<blockquote>
<p>That tension shaped much of the resistance surrounding Content Types and information architecture during the SharePoint era.</p>
</blockquote>
<p>Architects and governance teams understood that structure was necessary for long-term discoverability, retrieval quality, institutional memory, and organizational coherence. But most users interacted with the system through the lens of their immediate task. They simply wanted to upload a file, send a message, or move a project forward without additional overhead. Providers want to reduce administrative burden, not increase it by filling out additional forms every time they sign a chart.</p>
<p>This is why governance initiatives so often struggled. The benefits of structured knowledge architecture are usually systemic and long-term. They emerge gradually through better retrieval, reduced duplication, preserved institutional memory, clearer authority, and improved organizational coherence. But users experience governance locally and immediately as friction.</p>
<p>The same metadata, taxonomy, and governance disciplines once viewed as cumbersome are now reappearing inside modern AI architectures under entirely new names. Only now the stakes are significantly higher because the quality of the knowledge architecture directly influences the quality of the AI reasoning built on top of it.</p>
<h2 id="ai-is-reintroducing-metadata-through-the-back-door">AI Is Reintroducing Metadata Through the Back Door</h2>
<p>One of the more interesting developments in the current AI cycle is that organizations are quietly rebuilding many of the structures they spent the last decade abandoning. They often do not describe it this way, of course. The language is different now. Conversations revolve around semantic enrichment, retrieval pipelines, chunk metadata, ontology mapping, contextual ranking, vector stores, and knowledge graphs. But underneath the terminology, the architectural direction feels remarkably familiar.</p>
<p>The industry is rediscovering metadata. Not because organizations suddenly became nostalgic for enterprise governance, but because AI systems struggle without structure. This becomes obvious very quickly once retrieval-based systems move beyond small demonstrations and begin interacting with large organizational knowledge environments. The initial assumption is usually that the model itself will provide the intelligence. If enough information is ingested into the system, the AI will supposedly infer the surrounding meaning automatically.</p>
<p>But the machine still requires mechanisms for understanding what information is authoritative, which content is current, how concepts relate to one another, and which sources should carry greater operational weight. Without those distinctions, retrieval systems begin producing outputs that feel superficially coherent while remaining contextually unreliable. And so organizations start rebuilding structure around the AI.</p>
<p>Organizations slowly begin rebuilding the same structures they previously abandoned. Metadata reappears through retrieval tagging. Governance reappears through ingestion controls. Ontologies reappear through contextual ranking and semantic relationship mapping.</p>
<blockquote>
<p>The cycle repeats itself under new language.</p>
</blockquote>
<h2 id="the-future-of-knowledge-objects">The Future of Knowledge Objects</h2>
<p>If there is a larger lesson emerging from all of this, it is that organizations are beginning to rediscover the difference between storing information and preserving knowledge. For years, the industry largely optimized for communication velocity. Systems became faster, more conversational, and more fragmented. Information moved fluidly across collaboration platforms, cloud repositories, project systems, and SaaS applications. The emphasis was on reducing friction and accelerating interaction.</p>
<p>What received far less attention was whether organizational meaning remained durable inside those systems over time. AI is forcing that question back into the foreground. Because once organizations begin relying on computational systems to retrieve, synthesize, and reason over institutional knowledge, the architecture itself becomes inseparable from the quality of the outcomes. The system can only reason effectively over knowledge that has preserved enough structure, context, and semantic clarity to remain intelligible at scale.</p>
<p>The future of enterprise knowledge systems will move toward increasingly AI-native forms of semantic architecture. Not simply repositories filled with documents, but environments built around contextualized knowledge objects capable of carrying meaning, authority, lifecycle state, relationships, governance, and operational context directly within the architecture itself.</p>
<blockquote>
<p>the preservation of organizational meaning.</p>
</blockquote>
<p>Unlike earlier generations of enterprise systems, AI raises the stakes considerably because the outputs are no longer passive. The system is no longer simply returning documents in response to a query. It is synthesizing responses, generating operational guidance, summarizing institutional knowledge, and increasingly participating directly in organizational reasoning itself. That changes the nature of knowledge architecture entirely.</p>
<p>The future knowledge architect may spend less time thinking about folders and repositories and far more time thinking about semantic relationships, contextual integrity, retrieval governance, and how computational systems construct meaning from organizational information. This is where the deeper significance of Content Types becomes visible again.</p>
<h2 id="conclusion--we-did-not-leave-this-problem-behind">Conclusion — We Did Not Leave This Problem Behind</h2>
<p>It is easy to look back at systems like SharePoint and remember only the friction. And to be fair, many of those implementations genuinely became cumbersome. Some organizations buried useful ideas beneath layers of administrative complexity. Others treated governance as an end in itself rather than as a mechanism for preserving meaningful organizational knowledge. But beneath all of that friction was an architectural insight that is now relevant again.</p>
<p>Information without semantic identity eventually becomes organizational entropy. That was true during the era of enterprise portals and enterprise search. It is even more true in the age of AI. The deeper I explore modern retrieval systems, semantic architectures, and AI knowledge environments, the more convinced I become that the industry is not moving away from structured knowledge architecture. It is circling back toward it from a different direction.</p>
<p>That deeper significance behind Content Types was that organizations need ways to preserve context. They were never simply about forms, templates, or metadata fields. They were an attempt to encode organizational meaning directly into the architecture itself. An attempt to create knowledge objects capable of carrying enough contextual identity that computational systems could begin operating against meaning rather than merely storing information.</p>
<p>The future of enterprise AI will depend less on model sophistication than many currently assume. Models will continue improving. Retrieval systems will become more sophisticated. Context windows will grow. Local AI systems will become increasingly accessible. But none of those advancements eliminate the need for semantic clarity.</p>
<p>Because the more organizations rely on AI systems to retrieve, synthesize, and operationalize institutional knowledge, the more dangerous ambiguity becomes. In healthcare, that may mean billing errors, compliance failures, or documentation of conversations that never occurred. In other environments, the consequences may look different. But the underlying problem remains the same.</p> </article> </main> <footer class="site-footer"> <div class="site-shell">
© 2026 Fractional Insight CIO LLC
</div> </footer> </body></html>

7
dist/blog/index.html vendored Normal file
View File

@@ -0,0 +1,7 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><title>Articles | Fractional Insight CIO LLC</title><meta name="description" content="Articles and practical guidance on IT strategy, infrastructure, security, and technology leadership."><style>:root{--bg: #f7f8fa;--text: #172033;--muted: #5f6b7a;--panel: #ffffff;--accent: #1d4f91;--accent-dark: #12345f;--border: #d9dee7}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);line-height:1.6}a{color:var(--accent);text-decoration:none}.site-shell{width:min(1120px,calc(100% - 32px));margin:0 auto}.site-header{background:#fff;border-bottom:1px solid var(--border);padding:20px 0}.site-nav{display:flex;justify-content:space-between;align-items:center}.brand{font-weight:700;color:var(--text)}.nav-links{display:flex;gap:24px}.hero{padding:88px 0;background:linear-gradient(135deg,#10233f,#1d4f91);color:#fff}.hero h1{font-size:clamp(2.8rem,6vw,5.2rem);line-height:1;max-width:850px}.hero p{font-size:1.25rem;max-width:720px;color:#dbe6f5}.button{display:inline-block;margin-top:24px;padding:12px 20px;background:#fff;color:var(--accent-dark);border-radius:6px;font-weight:700}.section{padding:64px 0}.section h2{font-size:2.2rem;margin-bottom:12px}.service-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:32px}.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:26px}.card h3{margin-top:0}.contact-box{max-width:720px;background:#fff;border:1px solid var(--border);border-radius:10px;padding:32px}.form-grid{display:grid;gap:16px}input,textarea{width:100%;padding:12px;border:1px solid var(--border);border-radius:6px;font:inherit}textarea{min-height:160px}button{width:fit-content;padding:12px 20px;border:0;border-radius:6px;background:var(--accent);color:#fff;font-weight:700;cursor:pointer}.site-footer{border-top:1px solid var(--border);padding:32px 0;color:var(--muted)}@media(max-width:800px){.service-grid{grid-template-columns:1fr}.site-nav{align-items:flex-start;gap:12px;flex-direction:column}}.article-hero{padding:56px 0 24px;background:#fff;border-bottom:1px solid var(--border)}.article-hero h1{font-size:clamp(2.4rem,5vw,4.2rem);line-height:1.05;max-width:900px}.article-meta{color:var(--muted);font-weight:600}.article-excerpt{max-width:760px;font-size:1.2rem;color:var(--muted)}.article-banner{width:100%;max-height:420px;object-fit:cover;border-radius:12px;border:1px solid var(--border);margin-top:32px}.article-content{max-width:820px;padding:56px 0}.article-content h2{margin-top:42px}.article-content p,.article-content li{font-size:1.08rem}
</style></head> <body> <header class="site-header"> <div class="site-shell site-nav"> <a class="brand" href="/">Fractional Insight CIO</a> <nav class="nav-links"> <a href="/">Services</a> <a href="/blog/">Articles</a> <a href="/contact/">Contact</a> </nav> </div> </header> <main> <section class="hero"> <div class="site-shell"> <h1>Articles and Field Notes</h1> <p>
Practical observations on IT leadership, infrastructure, security,
governance, and the operational realities behind technology decisions.
</p> </div> </section> <section class="site-shell section"> <h2>Latest Articles</h2> <div class="service-grid"> <article class="card"> <h3><a href="/blog/content-types-were-proto-ai-knowledge-objects/">Content Types Were Proto-AI Knowledge Objects</a></h3> <p><strong>May 23 2026</strong></p> <p>Long before vector databases and semantic retrieval pipelines, enterprise architects were already attempting to solve the problem of computational meaning at organizational scale.</p> <p><a href="/blog/content-types-were-proto-ai-knowledge-objects/">Read article →</a></p> </article><article class="card"> <h3><a href="/blog/we-have-been-here-before/">We Have Been Here Before</a></h3> <p><strong>May 22 2026</strong></p> <p>Artificial Intelligence is forcing organizations to confront a problem that enterprise architects, search engineers, and information architects have wrestled with for decades: how to structure knowledge in ways that preserve meaning, authority, and institutional memory at scale.</p> <p><a href="/blog/we-have-been-here-before/">Read article →</a></p> </article><article class="card"> <h3><a href="/blog/why-small-organizations-need-it-leadership/">Why Small Organizations Still Need IT Leadership</a></h3> <p><strong>May 21 2026</strong></p> <p>Small organizations may not need a full-time CIO, but they still need clear technology leadership, practical governance, and a roadmap that keeps systems aligned with the business.</p> <p><a href="/blog/why-small-organizations-need-it-leadership/">Read article →</a></p> </article> </div> </section> </main> <footer class="site-footer"> <div class="site-shell">
© 2026 Fractional Insight CIO LLC
</div> </footer> </body></html>

View File

@@ -0,0 +1,160 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><title>We Have Been Here Before | Fractional Insight CIO LLC</title><meta name="description" content="Artificial Intelligence is forcing organizations to confront a problem that enterprise architects, search engineers, and information architects have wrestled with for decades: how to structure knowledge in ways that preserve meaning, authority, and institutional memory at scale."><style>:root{--bg: #f7f8fa;--text: #172033;--muted: #5f6b7a;--panel: #ffffff;--accent: #1d4f91;--accent-dark: #12345f;--border: #d9dee7}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);line-height:1.6}a{color:var(--accent);text-decoration:none}.site-shell{width:min(1120px,calc(100% - 32px));margin:0 auto}.site-header{background:#fff;border-bottom:1px solid var(--border);padding:20px 0}.site-nav{display:flex;justify-content:space-between;align-items:center}.brand{font-weight:700;color:var(--text)}.nav-links{display:flex;gap:24px}.hero{padding:88px 0;background:linear-gradient(135deg,#10233f,#1d4f91);color:#fff}.hero h1{font-size:clamp(2.8rem,6vw,5.2rem);line-height:1;max-width:850px}.hero p{font-size:1.25rem;max-width:720px;color:#dbe6f5}.button{display:inline-block;margin-top:24px;padding:12px 20px;background:#fff;color:var(--accent-dark);border-radius:6px;font-weight:700}.section{padding:64px 0}.section h2{font-size:2.2rem;margin-bottom:12px}.service-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:32px}.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:26px}.card h3{margin-top:0}.contact-box{max-width:720px;background:#fff;border:1px solid var(--border);border-radius:10px;padding:32px}.form-grid{display:grid;gap:16px}input,textarea{width:100%;padding:12px;border:1px solid var(--border);border-radius:6px;font:inherit}textarea{min-height:160px}button{width:fit-content;padding:12px 20px;border:0;border-radius:6px;background:var(--accent);color:#fff;font-weight:700;cursor:pointer}.site-footer{border-top:1px solid var(--border);padding:32px 0;color:var(--muted)}@media(max-width:800px){.service-grid{grid-template-columns:1fr}.site-nav{align-items:flex-start;gap:12px;flex-direction:column}}.article-hero{padding:56px 0 24px;background:#fff;border-bottom:1px solid var(--border)}.article-hero h1{font-size:clamp(2.4rem,5vw,4.2rem);line-height:1.05;max-width:900px}.article-meta{color:var(--muted);font-weight:600}.article-excerpt{max-width:760px;font-size:1.2rem;color:var(--muted)}.article-banner{width:100%;max-height:420px;object-fit:cover;border-radius:12px;border:1px solid var(--border);margin-top:32px}.article-content{max-width:820px;padding:56px 0}.article-content h2{margin-top:42px}.article-content p,.article-content li{font-size:1.08rem}
</style></head> <body> <header class="site-header"> <div class="site-shell site-nav"> <a class="brand" href="/">Fractional Insight CIO</a> <nav class="nav-links"> <a href="/">Services</a> <a href="/blog/">Articles</a> <a href="/contact/">Contact</a> </nav> </div> </header> <section class="article-hero"> <div class="site-shell"> <p class="article-meta">2026-05-22T00:00:00.000Z</p> <h1>We Have Been Here Before</h1> <p class="article-excerpt">Artificial Intelligence is forcing organizations to confront a problem that enterprise architects, search engineers, and information architects have wrestled with for decades: how to structure knowledge in ways that preserve meaning, authority, and institutional memory at scale.</p> <img class="article-banner" src="/images/blog/we-have-been-here-before.png" alt="We Have Been Here Before"> </div> </section> <main class="site-shell article-content"> <article> <p>For the better part of the last two years, the technology industry has spoken about Artificial Intelligence as though it represents a complete break from the past. Every week introduces a new vocabulary and a call to learn a new technology. RAG, CAG, Semantic Retrieval, Embeddings, AI Agents, Contextual Memory, the list goes on.</p>
<p>Listening to these discussions, one might conclude that we have entered an entirely new era of computing. In some ways, we have. Considering that the capabilities of large language models are genuinely transformative. Yet as I watch organizations rush to integrate AI into their operations, I find myself with an increasingly strange sensation:</p>
<p><em>I have seen this before</em></p>
<p>Fifteen years ago, I contributed chapters on Content Types and Enterprise Search for books published by Wrox Press during the SharePoint 2010 era. At the time, we were wrestling with many of the same concerns now resurfacing in modern AI systems:</p>
<ul>
<li>how knowledge is structured,</li>
<li>how meaning is categorized,</li>
<li>how information is discovered,</li>
<li>how relevance is determined,</li>
<li>how institutional memory is preserved,</li>
<li>and how organizations retrieve truth from increasingly massive collections of content.</li>
</ul>
<p>The terminology changed, but the architectural problems did not. Back then, we spoke about Managed Metadata, Content Types, Crawled and Managed Properties, Search Scopes, and Relevance Tuning. Today its Embeddings, Semantic Retrieval, Vector Databases, Ontologies, RAG, and AI Memory.</p>
<p>Underneath the language, the underlying challenge remains the same: <em>How do human beings structure knowledge in ways that allow computational systems to retrieve, contextualize, govern, and reuse meaning?</em></p>
<p>For a time, the industry attempted to answer that question through enterprise knowledge architecture. Systems like SharePoint were built around the idea that organizational knowledge should become durable institutional memory. Documents were structured in content types that exposed metadata. The taxonomy mattered.</p>
<p>Then something changed.</p>
<p>Over the last decade, organizations increasingly abandoned structured knowledge systems in favor of communication-first platforms like Slack and Teams. Knowledge architecture slowly gave way to conversational fragmentation. Institutional memory dissolved into channels, notifications, reactions, and buried threads. Stakeholders stopped asking whether information was structured correctly and instead assumed that search would somehow compensate for the entropy.</p>
<p>Now AI has arrived, and organizations once again expect technology to reconstruct meaning from chaos. But AI systems inherit the structure of the knowledge environments beneath them. A language model cannot reliably reason over knowledge that an organization itself no longer understands. And so, after more than a decade, the old problems have returned.</p>
<p>Only now, they matter more than ever.</p>
<h2 id="the-original-promise-of-enterprise-knowledge-management">The Original Promise of Enterprise Knowledge Management</h2>
<p>To understand why AI is forcing organizations to rediscover knowledge architecture, it is important to remember that this is not the first time the industry attempted to solve the problem of institutional knowledge at scale. Long before large language models, organizations were already drowning in information.</p>
<p>Documents accumulated across file shares, intranets, email systems, and departmental applications (many of which were access databases and excel spreadsheets). The problem was never the absence of information. The problem was that organizations increasingly struggled to locate knowledge, preserve context, determine authority, and distinguish signal from noise.</p>
<p>Enterprise knowledge management systems emerged as an attempt to solve this problem.</p>
<p>At the center of many of these efforts was Microsoft SharePoint Server 2010. Whatever frustrations people may remember about SharePoint implementations, the underlying vision was ambitious and, in many ways, correct. The idea was not merely document storage. The idea was institutional memory.</p>
<p>Documents would become more than isolated files sitting in folders. Documents could be categorized, structured, versioned, governed, searchable, and connected to organizational processes. Metadata was not an afterthought. It was central to knowledge management.</p>
<p>In the SharePoint era, concepts like Content Types, Managed Metadata, Taxonomies, Search Scopes, Relevance Tuning, and Federated Search were all part of a larger architectural philosophy. The assumption beneath these systems was deceptively simple:</p>
<blockquote>
<p>knowledge becomes valuable when it can be reliably discovered, contextualized, trusted, and reused.</p>
</blockquote>
<p>This was the real purpose of Information Architecture. Information Architecture was an attempt to impose semantic structure on organizational knowledge. In my own work during that period, I spent a great deal of time focused on Content Types and Enterprise Search. In one chapter, I described Content Types as:</p>
<blockquote>
<p>“a conceptual container for content and processes in the system.”</p>
</blockquote>
<p>Looking back now, that description feels remarkably AI. Because modern AI systems increasingly depend upon the same underlying semantic objects that bind together content, metadata, workflow, context, authority, and retrieval behavior. The terminology has evolved, but the architectural concern remains the same.</p>
<p>At the time, enterprise search itself was also evolving beyond simple keyword matching. Search systems like FAST Search Server 2010 for SharePoint introduced concepts that now sound strikingly familiar in the age of AI: contextual search, managed properties, semantic refinement, relevance tuning, property extraction, and personalized search experiences.</p>
<p>In one of my FAST Search chapters, I wrote:</p>
<blockquote>
<p>“The main function of the query engine is to strike a balance between recall and precision.”</p>
</blockquote>
<p>That remains one of the central challenges of modern AI retrieval systems. The problem was never simply retrieving information. The challenge was retrieving the <em>right</em> information. And that required more than indexing documents, it required understanding meaning.</p>
<p>Enterprise search teams spent years wrestling with information architecture. It was a difficult and often frustrating problem. Governance was tedious, metadata strategies were frequently ignored by stakeholders, taxonomy discussions could become surprisingly political, and search quality was directly tied to the discipline of the organization itself.</p>
<p>But despite the frustrations, there was an important recognition embedded in these systems:</p>
<blockquote>
<p>organizational knowledge does not become useful simply because it exists.</p>
<p>It becomes useful when it is architected.</p>
</blockquote>
<p>For a time, the industry understood this. And then, gradually, it began to forget.</p>
<h2 id="the-collapse-of-knowledge-discipline">The Collapse of Knowledge Discipline</h2>
<p>Somewhere along the way, the industry stopped believing in Information Architecture.</p>
<p>Not openly. No one stood up in a conference room and declared that structure, taxonomy, and governance no longer mattered. The shift happened gradually through a long series of practical compromises. Collaboration became more important than curation. Speed became more important than structure. Convenience became more important than stewardship.</p>
<p>Platforms like Slack and Microsoft Teams quietly changed the center of gravity inside organizations. Communication became immediate in ways older enterprise systems never fully achieved. Teams could organize themselves quickly. Remote work became easier. Conversations moved faster than email ever allowed. The friction that once slowed collaboration largely disappeared.</p>
<p>But something else disappeared with it. The older generation of enterprise systems were built around the idea of durable organizational knowledge. A document was meant to become part of institutional memory. It had structure, metadata, context, and a lifecycle. It lived somewhere intentionally. Modern collaboration systems approached the problem differently. The conversation itself became the workspace.</p>
<p>At first this felt liberating. Nobody wanted to spend an afternoon debating taxonomy. Stakeholders rarely cared about metadata strategy. Governance discussions were seen as bureaucratic overhead standing in the way of “real work.” The assumption became that information no longer needed to be carefully structured because search would simply find it later.</p>
<p>I watched this happen in real time over the course of a decade.</p>
<p>Entire knowledge architecture initiatives slowly unraveled because the organization no longer valued the discipline required to sustain them. Documents became attachments inside channels. Decisions disappeared into threads. Critical operational knowledge became trapped inside conversations that were meaningful only within the moment they occurred.</p>
<p>There was a growing belief that search would simply find what you needed when you needed it. That assumption turned out to be deeply flawed. Search can improve discoverability, but it cannot reliably reconstruct missing context. It cannot fully resolve inconsistent terminology, fragmented authority, or organizational ambiguity. It cannot distinguish between institutional truth and conversational noise when both are scattered across disconnected systems.</p>
<p>Users adapted to the growing disorder. They searched repeatedly. They asked coworkers where information lived. They recreated documents they could no longer locate. Knowledge became increasingly transient, but the organization continued functioning well enough that few people questioned what was being lost underneath the surface.</p>
<blockquote>
<p>What was actually disappearing was institutional memory.</p>
</blockquote>
<p>Over time, organizations transformed durable knowledge into streams of communication. Important decisions became buried beneath notifications, reactions, and side conversations. Context dissolved. Ownership blurred. Information spread across SaaS platforms faster than governance models could adapt to them.</p>
<p>And now AI has arrived.</p>
<p>Suddenly organizations expect language models to synthesize meaning from environments that human beings themselves no longer fully understand. They expect AI to retrieve institutional knowledge from fragmented repositories filled with duplicated content, conflicting terminology, missing context, and years of unmanaged conversational debris.</p>
<p>In many cases, AI is not entering well-architected knowledge ecosystems. It is entering archaeological ruins. And yet the expectation remains the same as it was during the collapse of enterprise search discipline: somehow, the machine will figure it out.</p>
<h2 id="ai-is-exposing-the-cost">AI is Exposing the Cost</h2>
<p>One of the more persistent myths surrounding modern AI is the idea that large language models somehow eliminate the need for structured knowledge systems. In practice, the opposite appears to be happening. AI is not removing the importance of knowledge architecture. It is exposing how dependent organizations have always been upon it.</p>
<p>When organizations first began experimenting with enterprise AI, many assumed the hardest part would be the models themselves. Attention focused almost entirely on model size, context windows, GPU requirements, and which vendor appeared furthest ahead in the race.</p>
<p>But once organizations moved beyond demonstrations and attempted to integrate AI into operational environments, a different reality emerged. The AI could only reason over the information it was given, and in many organizations that information existed in fragmented, contradictory, poorly governed states. Documents existed in multiple versions across multiple systems. Terminology varied between departments. Conversations contradicted formal documentation. Important operational decisions were buried inside years of chat history. Ownership of knowledge was often unclear. Context had long since eroded.</p>
<blockquote>
<p>The language model did not create these problems. It simply made them visible.</p>
</blockquote>
<p>This is one of the reasons so many organizations encounter disappointing results when attempting to build retrieval-based AI systems. There is often an assumption that if enough content is fed into a vector database, semantic search will somehow reconstruct organizational understanding automatically. But retrieval systems inherit the architecture, and the disorder, of the architectures beneath them.</p>
<p>If the underlying corpus is inconsistent, fragmented, or semantically weak, the AI system will reflect those weaknesses. In some cases, it may even amplify them. A language model is exceptionally good at synthesizing patterns, but it has no innate understanding of organizational truth. It cannot reliably distinguish between authoritative knowledge and conversational residue unless the surrounding architecture provides enough structure to support those distinctions.</p>
<p>This becomes especially dangerous because AI systems present information with extraordinary confidence. Traditional enterprise search at least forced users to interpret lists of documents themselves. Modern AI systems instead synthesize responses directly, compressing ambiguity into a single coherent answer whether the underlying information deserved that confidence or not.</p>
<p>In this sense, many so-called “AI hallucinations” are not purely model failures. They are often failures of information architecture, governance, and retrieval. The model is attempting to construct coherence from incoherent systems.</p>
<p>I have increasingly come to believe that the future success of enterprise AI will depend less on model sophistication and more on the quality of organizational knowledge environments. As models continue to improve and become increasingly commoditized, the differentiator will not simply be who has access to AI. Everyone will eventually have access to capable models. The differentiator will be whose knowledge systems are structured well enough to support trustworthy retrieval, contextual understanding, and durable institutional memory.</p>
<p>This is where many organizations now find themselves confronting the consequences of the last decade.</p>
<ul>
<li>They abandoned taxonomy because it felt cumbersome.</li>
<li>They abandoned governance because it slowed collaboration.</li>
<li>They abandoned metadata because users resisted it.</li>
<li>They abandoned curation because search seemed sufficient.</li>
</ul>
<p>Now they want AI to recover what was lost. But AI cant magically restore the institutional discipline that organizations themselves stopped maintaining. In many ways, modern AI is functioning less like a revolutionary intelligence and more like a diagnostic instrument. It reveals the hidden condition of the organizations knowledge systems. In well-structured environments, AI appears remarkably intelligent. In chaotic environments, it becomes unreliable, inconsistent, and difficult to trust.</p>
<h2 id="why-knowledge-architecture-matters-again">Why Knowledge Architecture Matters Again</h2>
<p>What makes the current moment so interesting is that many of the disciplines the industry spent the last decade abandoning are suddenly becoming essential again. Metadata matters again. Taxonomy matters again. Authority and lifecycle management matter again. Not because organizations suddenly rediscovered a love for governance, but because AI systems place enormous pressure on the quality and structure of the knowledge environments they operate within.</p>
<p>For years, organizations were able to tolerate increasingly chaotic information ecosystems because human beings are remarkably adaptive. Employees compensate for weak systems constantly. They learn where information “really” lives. They remember which coworker knows the answer. They develop informal maps of organizational knowledge that exist nowhere in the architecture itself. Human organizations survive enormous amounts of informational disorder because people instinctively fill in the gaps socially.</p>
<blockquote>
<p>AI cannot do this.</p>
</blockquote>
<p>An AI system has no intuitive understanding of organizational context beyond what the surrounding architecture allows it to infer. It does not know which documents are outdated unless lifecycle governance exists. It does not know which terminology is authoritative unless semantic structure exists. It does not know whether a buried Teams conversation should outweigh formal policy documentation. It does not know which departments definition of a term reflects institutional truth. All of these distinctions must come from the knowledge architecture itself.</p>
<p>This is why retrieval quality is rapidly becoming one of the defining problems of enterprise AI. The challenge is no longer simply storing information or making it searchable. Organizations are increasingly facing deeper questions:</p>
<ul>
<li>What information should the AI trust?</li>
<li>What content is authoritative?</li>
<li>How is knowledge categorized?</li>
<li>How is context preserved over time?</li>
<li>How are conflicting definitions reconciled?</li>
<li>How does institutional memory survive personnel turnover?</li>
<li>Which information belongs in conversational systems and which belongs in durable repositories?</li>
</ul>
<p>These are not model questions. They are architectural questions.</p>
<p>In many ways, the current AI cycle is forcing organizations to rediscover the importance of semantic structure. During the height of enterprise search initiatives, there was at least some recognition that information required intentional organization. Managed metadata, content types, and taxonomy strategies existed because search relevance depended upon them.</p>
<blockquote>
<p>Modern AI systems depend upon them even more.</p>
</blockquote>
<p>The common assumption that embeddings and vector databases somehow eliminate the need for structure misunderstands what these systems actually do. Semantic retrieval improves flexibility. It helps systems locate related concepts even when terminology varies. But semantic similarity is not the same thing as organizational understanding. Two documents may be semantically related while still differing radically in authority, accuracy, recency, governance status, and/or operational importance. A language model cannot reliably infer those distinctions in isolation.</p>
<p>This is where knowledge architecture re-enters the picture.</p>
<p>Knowledge architecture is ultimately the discipline of creating environments in which meaning can survive scale, time, and organizational complexity. It is the work of establishing enough semantic structure that both human beings and computational systems can navigate information with confidence. For a long time, this discipline was treated as secondary to speed and convenience. Governance became synonymous with friction. Taxonomy became synonymous with bureaucracy. Metadata became something users ignored whenever possible.</p>
<p>AI is changing that equation. Once an organization begins relying on AI systems to assist with operations, analysis, retrieval, and decision support, the cost of weak knowledge architecture becomes immediately visible. Poor structure no longer results merely in inconvenience. It results in unreliable outputs, inconsistent reasoning, and loss of trust in the system itself.</p>
<p>This is why I increasingly suspect that the future leaders in enterprise AI will not necessarily be the organizations with the largest models or the most aggressive automation strategies. They will be the organizations that best preserve contextual integrity, semantic clarity, authoritative knowledge, and durable institutional memory.</p>
<p>In other words, the organizations that relearn how to architect knowledge.</p>
<h2 id="the-return-of-the-knowledge-architect">The Return of the Knowledge Architect</h2>
<p>For most of the last decade, the role of the Information Architect slowly faded into the background of enterprise technology. The industry shifted its attention toward:</p>
<ul>
<li>agility,</li>
<li>cloud adoption,</li>
<li>SaaS integration,</li>
<li>DevOps,</li>
<li>automation,</li>
<li>and collaboration tooling.</li>
</ul>
<p>Knowledge architecture increasingly came to be viewed as a legacy concern from the era of intranets and enterprise portals. The people who worried about taxonomy, metadata, governance, and retrieval quality were often treated as though they belonged to an older generation of enterprise computing.</p>
<p>In some ways, perhaps they did. But history has a habit of returning to unresolved problems. And AI is returning us to one of the oldest problems in computing: how human knowledge can be structured in ways that remain meaningful at scale.</p>
<p>What is changing now is that organizations are beginning to realize that AI systems are not merely software tools. They are interpretive systems. They operate by traversing, retrieving, synthesizing, and contextualizing information drawn from increasingly vast collections of organizational knowledge. That changes the nature of enterprise architecture itself.</p>
<p>Enterprise architecture will increasingly revolve around the stewardship of organizational meaning. That may sound abstract, but the operational implications are very concrete. Organizations are beginning to confront questions they largely ignored during the collaboration-first era:</p>
<ul>
<li>What constitutes authoritative knowledge?</li>
<li>How should institutional memory be preserved?</li>
<li>Which systems are trustworthy?</li>
<li>How should semantic conflicts be resolved?</li>
<li>What information belongs in conversational systems versus durable repositories?</li>
<li>How should AI systems distinguish policy from discussion?</li>
<li>Who governs organizational knowledge over time?</li>
</ul>
<p>These are no longer theoretical governance discussions, but the operational requirements for trustworthy AI. This is one reason I believe the next phase of enterprise AI will place increasing importance on disciplines that once sat quietly beneath the surface of enterprise systems: information architecture, records management, taxonomy design, search relevance engineering, metadata governance, and knowledge lifecycle management.</p>
<p>Ironically, many of the people best prepared for this transition may not come from the current AI hype cycle at all. They may come from the generation of architects, librarians, search engineers, records managers, and enterprise practitioners who spent years wrestling with the difficult realities of organizational knowledge systems long before large language models entered the picture.</p>
<p>Because beneath all the excitement surrounding AI lies a truth much older than the technology itself:</p>
<blockquote>
<p>An organization can only reason as effectively as it remembers.</p>
</blockquote>
<p>And memory must be curated, structured, maintained, and governed. This is the work knowledge architecture has always attempted to do. The difference now is that the consequences of neglecting it are becoming impossible to ignore.</p>
<p>For years, weak knowledge architecture primarily produced inefficiency. Employees wasted time searching for documents. Information became duplicated. Teams struggled to locate authoritative answers. Frustrating, certainly, but survivable. AI changes the stakes. When organizations begin delegating retrieval, synthesis, operational guidance, and decision support to computational systems, weak knowledge architecture no longer produces mere inconvenience. It produces unreliable reasoning.</p>
<p>This is why I increasingly believe that the next generation of enterprise leadership will need to think less like software administrators and more like custodians of institutional cognition. The systems we are building are no longer merely storing information. They are shaping how organizations remember, retrieve, and reason. In that environment, knowledge architecture stops being a forgotten enterprise discipline.</p>
<p>It becomes foundational again.</p>
<h2 id="conclusion-we-have-been-here-before">Conclusion: We Have Been Here Before</h2>
<p>There is a tendency in the technology industry to speak about each new wave of innovation as though history has somehow been reset. Artificial Intelligence is often framed this way. The language surrounding it carries the feeling of rupture, as though we have crossed into an entirely new epoch of computing disconnected from everything that came before it. But the deeper I explore modern AI systems, the more I find myself returning to older questions.</p>
<p>Questions that enterprise architects, librarians, records managers, search engineers, and information architects have been wrestling with for decades - Questions about meaning, structure, authority, discoverability, memory, and trust.</p>
<p>The tools have changed dramatically. Large language models represent a genuine leap in capability. Semantic retrieval is vastly more sophisticated than the enterprise search systems many of us worked with fifteen years ago. The scale and flexibility of modern AI systems would have seemed almost unimaginable during the SharePoint and FAST Search era.</p>
<p>And yet, beneath all of the new terminology, the underlying architectural concerns remain strikingly familiar. Organizations still struggle to preserve institutional memory. Knowledge still fragments over time. Context still erodes. Authority still becomes ambiguous. Information still decays into entropy unless deliberate effort is made to structure and govern it. AI did not create these problems, it simply removed our ability to ignore them.</p>
<p>For years, organizations compensated for weak knowledge systems through human adaptability. Employees learned where information “really” lived. Teams developed informal knowledge networks. Search engines masked structural decay just well enough to keep the organization functioning. But AI systems force organizations to confront the condition of their knowledge environments directly. They reveal whether institutional knowledge is coherent, trustworthy, contextualized, and architected, or whether it has dissolved into disconnected fragments spread across years of unmanaged collaboration systems.</p>
<p>This is why I believe the future of enterprise AI will depend far less on the sophistication of models than many currently assume. The true differentiator will be organizational knowledge quality. The organizations that succeed will not simply be the ones with the best AI tools. They will be the organizations that relearn how to preserve semantic structure, contextual integrity, and durable institutional memory. In other words, they will be the organizations that rediscover knowledge architecture.</p>
<p>We have been here before.</p>
<p>The names have changed.<br>
The interfaces have changed.<br>
The scale has changed.</p>
<p>But the problem itself remains the same.</p> </article> </main> <footer class="site-footer"> <div class="site-shell">
© 2026 Fractional Insight CIO LLC
</div> </footer> </body></html>

View File

@@ -0,0 +1,70 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><title>Why Small Organizations Still Need IT Leadership | Fractional Insight CIO LLC</title><meta name="description" content="Small organizations may not need a full-time CIO, but they still need clear technology leadership, practical governance, and a roadmap that keeps systems aligned with the business."><style>:root{--bg: #f7f8fa;--text: #172033;--muted: #5f6b7a;--panel: #ffffff;--accent: #1d4f91;--accent-dark: #12345f;--border: #d9dee7}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);line-height:1.6}a{color:var(--accent);text-decoration:none}.site-shell{width:min(1120px,calc(100% - 32px));margin:0 auto}.site-header{background:#fff;border-bottom:1px solid var(--border);padding:20px 0}.site-nav{display:flex;justify-content:space-between;align-items:center}.brand{font-weight:700;color:var(--text)}.nav-links{display:flex;gap:24px}.hero{padding:88px 0;background:linear-gradient(135deg,#10233f,#1d4f91);color:#fff}.hero h1{font-size:clamp(2.8rem,6vw,5.2rem);line-height:1;max-width:850px}.hero p{font-size:1.25rem;max-width:720px;color:#dbe6f5}.button{display:inline-block;margin-top:24px;padding:12px 20px;background:#fff;color:var(--accent-dark);border-radius:6px;font-weight:700}.section{padding:64px 0}.section h2{font-size:2.2rem;margin-bottom:12px}.service-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:32px}.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:26px}.card h3{margin-top:0}.contact-box{max-width:720px;background:#fff;border:1px solid var(--border);border-radius:10px;padding:32px}.form-grid{display:grid;gap:16px}input,textarea{width:100%;padding:12px;border:1px solid var(--border);border-radius:6px;font:inherit}textarea{min-height:160px}button{width:fit-content;padding:12px 20px;border:0;border-radius:6px;background:var(--accent);color:#fff;font-weight:700;cursor:pointer}.site-footer{border-top:1px solid var(--border);padding:32px 0;color:var(--muted)}@media(max-width:800px){.service-grid{grid-template-columns:1fr}.site-nav{align-items:flex-start;gap:12px;flex-direction:column}}.article-hero{padding:56px 0 24px;background:#fff;border-bottom:1px solid var(--border)}.article-hero h1{font-size:clamp(2.4rem,5vw,4.2rem);line-height:1.05;max-width:900px}.article-meta{color:var(--muted);font-weight:600}.article-excerpt{max-width:760px;font-size:1.2rem;color:var(--muted)}.article-banner{width:100%;max-height:420px;object-fit:cover;border-radius:12px;border:1px solid var(--border);margin-top:32px}.article-content{max-width:820px;padding:56px 0}.article-content h2{margin-top:42px}.article-content p,.article-content li{font-size:1.08rem}
</style></head> <body> <header class="site-header"> <div class="site-shell site-nav"> <a class="brand" href="/">Fractional Insight CIO</a> <nav class="nav-links"> <a href="/">Services</a> <a href="/blog/">Articles</a> <a href="/contact/">Contact</a> </nav> </div> </header> <section class="article-hero"> <div class="site-shell"> <p class="article-meta">2026-05-21T00:00:00.000Z</p> <h1>Why Small Organizations Still Need IT Leadership</h1> <p class="article-excerpt">Small organizations may not need a full-time CIO, but they still need clear technology leadership, practical governance, and a roadmap that keeps systems aligned with the business.</p> <img class="article-banner" src="/images/blog/fractional-cio-leadership.png" alt="Why Small Organizations Still Need IT Leadership"> </div> </section> <main class="site-shell article-content"> <article> <p>Small organizations often make technology decisions out of necessity.</p>
<p>A file sharing problem appears, so a platform is chosen.<br>
Email becomes painful, so a provider is selected.<br>
Security concerns increase, so MFA is added.<br>
A vendor recommends a solution, and the organization moves forward because the problem needs to be solved.</p>
<p>None of these decisions are wrong by themselves. In fact, many are reasonable responses to immediate needs. The problem is that, over time, these decisions begin to form an accidental architecture.</p>
<h2 id="technology-becomes-infrastructure-before-anyone-names-it">Technology Becomes Infrastructure Before Anyone Names It</h2>
<p>Most growing organizations do not set out to build an IT environment. They accumulate one.</p>
<p>A few cloud accounts become the collaboration platform. A handful of SaaS tools become the operational backbone. User permissions become security policy. Vendor defaults become governance. Backups are assumed to exist because the platform feels professional.</p>
<p>Eventually, the organization depends on systems that no one has fully mapped, documented, or aligned to business risk.</p>
<p>That is the point where IT leadership becomes necessary.</p>
<h2 id="a-fractional-cio-is-not-just-extra-it-help">A Fractional CIO Is Not Just “Extra IT Help”</h2>
<p>Technical support is important, but support is usually reactive. It answers the question:</p>
<blockquote>
<p>What is broken today?</p>
</blockquote>
<p>IT leadership asks different questions:</p>
<blockquote>
<p>Where is this environment going?<br>
What risk are we carrying?<br>
Are our tools aligned with how the business actually works?<br>
What should we standardize, secure, simplify, or retire?</p>
</blockquote>
<p>A fractional CIO helps bring structure to those questions without requiring the organization to hire a full-time executive.</p>
<h2 id="the-real-need-is-decision-quality">The Real Need Is Decision Quality</h2>
<p>Small businesses often do not suffer from a lack of technology options. They suffer from too many options with too little context.</p>
<p>Microsoft 365, Google Workspace, Nextcloud, hosted email, cloud storage, password managers, endpoint security, backup platforms, identity providers, compliance tools, and vendor-managed applications can all be valid choices.</p>
<p>The harder question is not whether a product is good.</p>
<p>The harder question is whether it is the right fit for the organizations size, risk profile, budget, workflow, and operational maturity.</p>
<p>That is where strategic technology guidance matters.</p>
<h2 id="security-is-an-operating-model">Security Is an Operating Model</h2>
<p>Security is often treated as a product category. Buy the right tool, enable the right feature, and the organization is safer.</p>
<p>Tools matter, but security is also an operating model.</p>
<p>Who has admin access?<br>
How is MFA enforced?<br>
What happens when an employee leaves?<br>
Where is sensitive data stored?<br>
Who reviews backups?<br>
What systems are exposed to the internet?<br>
Which vendors can access business-critical data?</p>
<p>These are not purely technical questions. They are governance questions.</p>
<h2 id="the-goal-is-practical-maturity">The Goal Is Practical Maturity</h2>
<p>Not every organization needs enterprise complexity.</p>
<p>In fact, small organizations can be harmed by overbuilt systems just as easily as they can be harmed by underbuilt ones. The goal is not to imitate a large enterprise. The goal is to adopt the right level of structure for the business.</p>
<p>That usually means:</p>
<ul>
<li>clear ownership of systems</li>
<li>documented administrative access</li>
<li>MFA and password standards</li>
<li>backup expectations</li>
<li>vendor and platform review</li>
<li>basic incident response planning</li>
<li>a roadmap for future improvements</li>
</ul>
<p>These are not glamorous activities, but they reduce confusion and risk.</p>
<h2 id="technology-should-serve-the-business">Technology Should Serve the Business</h2>
<p>Good IT leadership does not begin with tools. It begins with the business.</p>
<p>What does the organization need to protect?<br>
How does work actually get done?<br>
Where are the bottlenecks?<br>
Which systems create confidence, and which create friction?<br>
What would happen if a key platform went offline tomorrow?</p>
<p>When technology decisions are made in isolation, systems drift. When they are made within a business context, they become part of the organizations operating discipline.</p>
<h2 id="closing-thought">Closing Thought</h2>
<p>A small organization may not need a full-time CIO.</p>
<p>But it still needs someone asking the CIO-level questions.</p>
<p>Without that perspective, technology grows in fragments. With it, the organization can make calmer, clearer decisions about the systems it depends on.</p> </article> </main> <footer class="site-footer"> <div class="site-shell">
© 2026 Fractional Insight CIO LLC
</div> </footer> </body></html>

15
dist/contact/index.html vendored Normal file
View File

@@ -0,0 +1,15 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><title>Contact | Fractional Insight CIO LLC</title><style>:root{--bg: #f7f8fa;--text: #172033;--muted: #5f6b7a;--panel: #ffffff;--accent: #1d4f91;--accent-dark: #12345f;--border: #d9dee7}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);line-height:1.6}a{color:var(--accent);text-decoration:none}.site-shell{width:min(1120px,calc(100% - 32px));margin:0 auto}.site-header{background:#fff;border-bottom:1px solid var(--border);padding:20px 0}.site-nav{display:flex;justify-content:space-between;align-items:center}.brand{font-weight:700;color:var(--text)}.nav-links{display:flex;gap:24px}.hero{padding:88px 0;background:linear-gradient(135deg,#10233f,#1d4f91);color:#fff}.hero h1{font-size:clamp(2.8rem,6vw,5.2rem);line-height:1;max-width:850px}.hero p{font-size:1.25rem;max-width:720px;color:#dbe6f5}.button{display:inline-block;margin-top:24px;padding:12px 20px;background:#fff;color:var(--accent-dark);border-radius:6px;font-weight:700}.section{padding:64px 0}.section h2{font-size:2.2rem;margin-bottom:12px}.service-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:32px}.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:26px}.card h3{margin-top:0}.contact-box{max-width:720px;background:#fff;border:1px solid var(--border);border-radius:10px;padding:32px}.form-grid{display:grid;gap:16px}input,textarea{width:100%;padding:12px;border:1px solid var(--border);border-radius:6px;font:inherit}textarea{min-height:160px}button{width:fit-content;padding:12px 20px;border:0;border-radius:6px;background:var(--accent);color:#fff;font-weight:700;cursor:pointer}.site-footer{border-top:1px solid var(--border);padding:32px 0;color:var(--muted)}@media(max-width:800px){.service-grid{grid-template-columns:1fr}.site-nav{align-items:flex-start;gap:12px;flex-direction:column}}.article-hero{padding:56px 0 24px;background:#fff;border-bottom:1px solid var(--border)}.article-hero h1{font-size:clamp(2.4rem,5vw,4.2rem);line-height:1.05;max-width:900px}.article-meta{color:var(--muted);font-weight:600}.article-excerpt{max-width:760px;font-size:1.2rem;color:var(--muted)}.article-banner{width:100%;max-height:420px;object-fit:cover;border-radius:12px;border:1px solid var(--border);margin-top:32px}.article-content{max-width:820px;padding:56px 0}.article-content h2{margin-top:42px}.article-content p,.article-content li{font-size:1.08rem}
</style></head> <body> <header class="site-header"> <div class="site-shell site-nav"> <a class="brand" href="/">Fractional Insight CIO</a> <nav class="nav-links"> <a href="/">Services</a> <a href="/blog/">Articles</a> <a href="/contact/">Contact</a> </nav> </div> </header> <main class="site-shell section"> <h1>Contact</h1> <p>
Use the form below to start a conversation about IT strategy,
infrastructure, security, or advisory support.
</p> <div class="contact-box"> <form action="mailto:contact@fractionalinsightcio.com" method="post" enctype="text/plain" class="form-grid"> <label>
Name
<input type="text" name="name" required> </label> <label>
Email
<input type="email" name="email" required> </label> <label>
Organization
<input type="text" name="organization"> </label> <label>
Message
<textarea name="message" required></textarea> </label> <button type="submit">Send Message</button> </form> </div> </main> <footer class="site-footer"> <div class="site-shell">
© 2026 Fractional Insight CIO LLC
</div> </footer> </body></html>

BIN
dist/favicon.ico vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

9
dist/favicon.svg vendored Normal file
View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
<style>
path { fill: #000; }
@media (prefers-color-scheme: dark) {
path { fill: #FFF; }
}
</style>
</svg>

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

11
dist/index.html vendored Normal file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><title>Fractional Insight CIO LLC</title><meta name="description" content="Fractional CIO, IT strategy, security, compliance, and infrastructure advisory services."><style>:root{--bg: #f7f8fa;--text: #172033;--muted: #5f6b7a;--panel: #ffffff;--accent: #1d4f91;--accent-dark: #12345f;--border: #d9dee7}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--bg);color:var(--text);line-height:1.6}a{color:var(--accent);text-decoration:none}.site-shell{width:min(1120px,calc(100% - 32px));margin:0 auto}.site-header{background:#fff;border-bottom:1px solid var(--border);padding:20px 0}.site-nav{display:flex;justify-content:space-between;align-items:center}.brand{font-weight:700;color:var(--text)}.nav-links{display:flex;gap:24px}.hero{padding:88px 0;background:linear-gradient(135deg,#10233f,#1d4f91);color:#fff}.hero h1{font-size:clamp(2.8rem,6vw,5.2rem);line-height:1;max-width:850px}.hero p{font-size:1.25rem;max-width:720px;color:#dbe6f5}.button{display:inline-block;margin-top:24px;padding:12px 20px;background:#fff;color:var(--accent-dark);border-radius:6px;font-weight:700}.section{padding:64px 0}.section h2{font-size:2.2rem;margin-bottom:12px}.service-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:32px}.card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:26px}.card h3{margin-top:0}.contact-box{max-width:720px;background:#fff;border:1px solid var(--border);border-radius:10px;padding:32px}.form-grid{display:grid;gap:16px}input,textarea{width:100%;padding:12px;border:1px solid var(--border);border-radius:6px;font:inherit}textarea{min-height:160px}button{width:fit-content;padding:12px 20px;border:0;border-radius:6px;background:var(--accent);color:#fff;font-weight:700;cursor:pointer}.site-footer{border-top:1px solid var(--border);padding:32px 0;color:var(--muted)}@media(max-width:800px){.service-grid{grid-template-columns:1fr}.site-nav{align-items:flex-start;gap:12px;flex-direction:column}}.article-hero{padding:56px 0 24px;background:#fff;border-bottom:1px solid var(--border)}.article-hero h1{font-size:clamp(2.4rem,5vw,4.2rem);line-height:1.05;max-width:900px}.article-meta{color:var(--muted);font-weight:600}.article-excerpt{max-width:760px;font-size:1.2rem;color:var(--muted)}.article-banner{width:100%;max-height:420px;object-fit:cover;border-radius:12px;border:1px solid var(--border);margin-top:32px}.article-content{max-width:820px;padding:56px 0}.article-content h2{margin-top:42px}.article-content p,.article-content li{font-size:1.08rem}
</style></head> <body> <header class="site-header"> <div class="site-shell site-nav"> <a class="brand" href="/">Fractional Insight CIO</a> <nav class="nav-links"> <a href="/">Services</a> <a href="/blog/">Articles</a> <a href="/contact/">Contact</a> </nav> </div> </header> <section class="hero"> <div class="site-shell"> <h1>Enterprise-grade IT leadership for growing organizations.</h1> <p>
Fractional CIO advisory, infrastructure strategy, security planning,
vendor guidance, and practical technology leadership without the cost
of a full-time executive.
</p> <a class="button" href="/contact/">Schedule a Conversation</a> </div> </section> <main> <section class="site-shell section"> <h2>Services</h2> <p>
Practical technology leadership for organizations that need structure,
security, and direction without unnecessary complexity.
</p> <div class="service-grid"> <div class="card"> <h3>Fractional CIO Advisory</h3> <p>Technology roadmap, executive guidance, budgeting, governance, and strategic planning.</p> </div> <div class="card"> <h3>Infrastructure Architecture</h3> <p>Cloud, hybrid, self-hosted, identity, backup, networking, and systems design.</p> </div> <div class="card"> <h3>Security & Risk</h3> <p>Security baselines, MFA strategy, breach risk analysis, access control, and operational safeguards.</p> </div> <div class="card"> <h3>Microsoft 365 Strategy</h3> <p>Tenant planning, collaboration architecture, identity, Exchange, Teams, SharePoint, and governance.</p> </div> <div class="card"> <h3>Vendor & Platform Selection</h3> <p>Evaluate SaaS, cloud, open-source, and self-hosted options with practical implementation guidance.</p> </div> <div class="card"> <h3>Operational Runbooks</h3> <p>Daily, weekly, and monthly operating procedures for small teams and managed environments.</p> </div> </div> </section> </main> <footer class="site-footer"> <div class="site-shell">
© 2026 Fractional Insight CIO LLC
</div> </footer> </body></html>

12
docker-compose.yml Normal file
View File

@@ -0,0 +1,12 @@
services:
fractionalinsightcio-site:
build: .
container_name: fractionalinsightcio-site
restart: unless-stopped
networks:
blog_network:
ipv4_address: 192.168.5.91
networks:
blog_network:
external: true

11
nginx.conf Normal file
View File

@@ -0,0 +1,11 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}

1
node_modules/.bin/astro generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../astro/bin/astro.mjs

1
node_modules/.bin/esbuild generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../esbuild/bin/esbuild

1
node_modules/.bin/is-docker generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../is-docker/cli.js

1
node_modules/.bin/is-inside-container generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../is-inside-container/cli.js

1
node_modules/.bin/js-yaml generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../js-yaml/bin/js-yaml.js

1
node_modules/.bin/nanoid generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../nanoid/bin/nanoid.cjs

1
node_modules/.bin/parser generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../@babel/parser/bin/babel-parser.js

1
node_modules/.bin/rollup generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../rollup/dist/bin/rollup

1
node_modules/.bin/semver generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../semver/bin/semver.js

1
node_modules/.bin/svgo generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../svgo/bin/svgo.js

1
node_modules/.bin/vite generated vendored Symbolic link
View File

@@ -0,0 +1 @@
../vite/bin/vite.js

3591
node_modules/.package-lock.json generated vendored Normal file

File diff suppressed because it is too large Load Diff

79
node_modules/.vite/deps/_metadata.json generated vendored Normal file
View File

@@ -0,0 +1,79 @@
{
"hash": "4b3a379d",
"configHash": "25c149b0",
"lockfileHash": "56a2468d",
"browserHash": "f6797e9e",
"optimized": {
"astro > aria-query": {
"src": "../../aria-query/lib/index.js",
"file": "astro___aria-query.js",
"fileHash": "21896c5b",
"needsInterop": true
},
"astro > axobject-query": {
"src": "../../axobject-query/lib/index.js",
"file": "astro___axobject-query.js",
"fileHash": "4507b9ad",
"needsInterop": true
},
"astro > html-escaper": {
"src": "../../html-escaper/esm/index.js",
"file": "astro___html-escaper.js",
"fileHash": "4ab80f4d",
"needsInterop": false
},
"astro/runtime/client/dev-toolbar/entrypoint.js": {
"src": "../../astro/dist/runtime/client/dev-toolbar/entrypoint.js",
"file": "astro_runtime_client_dev-toolbar_entrypoint__js.js",
"fileHash": "771bfbcf",
"needsInterop": false
}
},
"chunks": {
"toolbar-2H5PSQQU": {
"file": "toolbar-2H5PSQQU.js"
},
"ui-library-EVFCBMCE": {
"file": "ui-library-EVFCBMCE.js"
},
"chunk-HNT3PLDI": {
"file": "chunk-HNT3PLDI.js"
},
"astro-IQQQXCO3": {
"file": "astro-IQQQXCO3.js"
},
"chunk-ZUETELRC": {
"file": "chunk-ZUETELRC.js"
},
"audit-XFDIA4TR": {
"file": "audit-XFDIA4TR.js"
},
"chunk-WTIA47ZU": {
"file": "chunk-WTIA47ZU.js"
},
"chunk-WDCEFGHP": {
"file": "chunk-WDCEFGHP.js"
},
"xray-XH6VIXDC": {
"file": "xray-XH6VIXDC.js"
},
"chunk-LEAOZWS7": {
"file": "chunk-LEAOZWS7.js"
},
"chunk-PXGSXSC7": {
"file": "chunk-PXGSXSC7.js"
},
"settings-K4OHAGC2": {
"file": "settings-K4OHAGC2.js"
},
"chunk-WM2KMMIK": {
"file": "chunk-WM2KMMIK.js"
},
"chunk-LEX3GG7N": {
"file": "chunk-LEX3GG7N.js"
},
"chunk-5WRI5ZAA": {
"file": "chunk-5WRI5ZAA.js"
}
}
}

433
node_modules/.vite/deps/astro-IQQQXCO3.js generated vendored Normal file
View File

@@ -0,0 +1,433 @@
import {
isDefinedIcon
} from "./chunk-ZUETELRC.js";
import {
closeOnOutsideClick,
createWindowElement,
synchronizePlacementOnUpdate
} from "./chunk-WM2KMMIK.js";
import "./chunk-LEX3GG7N.js";
import "./chunk-5WRI5ZAA.js";
// node_modules/astro/dist/runtime/client/dev-toolbar/apps/utils/icons.js
function randomFromArray(list) {
return list[Math.floor(Math.random() * list.length)];
}
var categoryIcons = new Map(
Object.entries({
frameworks: ["puzzle", "grid"],
adapters: ["puzzle", "grid", "compress"],
"css+ui": ["compress", "grid", "image", "resizeImage", "puzzle"],
"performance+seo": ["approveUser", "checkCircle", "compress", "robot", "searchFile", "sitemap"],
analytics: ["checkCircle", "compress", "searchFile"],
accessibility: ["approveUser", "checkCircle"],
other: ["checkCircle", "grid", "puzzle", "sitemap"]
})
);
function iconForIntegration(integration) {
const icons = integration.categories.filter((category) => categoryIcons.has(category)).flatMap((category) => categoryIcons.get(category));
return randomFromArray(icons);
}
var iconColors = [
"#BC52EE",
"#6D6AF0",
"#52EEBD",
"#52B7EE",
"#52EE55",
"#B7EE52",
"#EEBD52",
"#EE5552",
"#EE52B7",
"#858B98"
];
function colorForIntegration() {
return randomFromArray(iconColors);
}
// node_modules/astro/dist/runtime/client/dev-toolbar/apps/astro.js
var astroLogo = '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 99 26" width="100"><path fill="#fff" d="M6.70402 22.1453c-1.17459-1.0737-1.51748-3.3297-1.02811-4.9641.84853 1.0304 2.02424 1.3569 3.24204 1.5411 1.88005.2844 3.72635.178 5.47285-.6813.1998-.0984.3844-.2292.6027-.3617.1639.4755.2065.9554.1493 1.4439-.1392 1.1898-.7313 2.1088-1.673 2.8054-.3765.2787-.775.5278-1.1639.7905-1.1948.8075-1.518 1.7544-1.0691 3.1318.0107.0336.0202.0671.0444.149-.6101-.273-1.0557-.6705-1.39518-1.1931-.3586-.5517-.52921-1.1619-.53819-1.8221-.00449-.3213-.00449-.6455-.0477-.9623-.10551-.7722-.46804-1.118-1.15102-1.1379-.70094-.0205-1.2554.4129-1.40244 1.0953-.01122.0523-.02749.1041-.04377.1649l.00112.0006Z"/><path fill="url(#paint0_linear_386_2739)" d="M6.70402 22.1453c-1.17459-1.0737-1.51748-3.3297-1.02811-4.9641.84853 1.0304 2.02424 1.3569 3.24204 1.5411 1.88005.2844 3.72635.178 5.47285-.6813.1998-.0984.3844-.2292.6027-.3617.1639.4755.2065.9554.1493 1.4439-.1392 1.1898-.7313 2.1088-1.673 2.8054-.3765.2787-.775.5278-1.1639.7905-1.1948.8075-1.518 1.7544-1.0691 3.1318.0107.0336.0202.0671.0444.149-.6101-.273-1.0557-.6705-1.39518-1.1931-.3586-.5517-.52921-1.1619-.53819-1.8221-.00449-.3213-.00449-.6455-.0477-.9623-.10551-.7722-.46804-1.118-1.15102-1.1379-.70094-.0205-1.2554.4129-1.40244 1.0953-.01122.0523-.02749.1041-.04377.1649l.00112.0006Z"/><path fill="#fff" d="M0 16.909s3.47815-1.6944 6.96603-1.6944l2.62973-8.13858c.09846-.39359.38592-.66106.71044-.66106.3246 0 .612.26747.7105.66106l2.6297 8.13858c4.1309 0 6.966 1.6944 6.966 1.6944S14.7045.814589 14.693.782298C14.5234.306461 14.2371 0 13.8512 0H6.76183c-.38593 0-.66063.306461-.84174.782298C5.90733.81398 0 16.909 0 16.909ZM36.671 11.7318c0 1.4262-1.7739 2.2779-4.2302 2.2779-1.5985 0-2.1638-.3962-2.1638-1.2281 0-.8715.7018-1.2875 2.3003-1.2875 1.4426 0 2.6707.0198 4.0937.1981v.0396Zm.0195-1.7629c-.8772-.19808-2.2028-.31693-3.7818-.31693-4.6006 0-6.7644 1.08943-6.7644 3.62483 0 2.6344 1.4815 3.6446 4.9125 3.6446 2.9046 0 4.8735-.7328 5.5947-2.5354h.117c-.0195.4358-.039.8716-.039 1.2083 0 .931.156 1.0102.9162 1.0102h3.5869c-.1949-.5546-.3119-2.1194-.3119-3.4663 0-1.446.0585-2.5355.0585-4.00123 0-2.99098-1.7934-4.89253-7.4077-4.89253-2.4173 0-5.1074.41596-7.1543 1.03.1949.81213.4679 2.45617.6043 3.5258 1.774-.83193 4.2887-1.18847 6.2381-1.18847 2.6902 0 3.4309.61404 3.4309 1.86193v.4952ZM46.5325 12.5637c-.4874.0594-1.1502.0594-1.8325.0594-.7213 0-1.3841-.0198-1.8324-.0792 0 .1585-.0195.3367-.0195.4952 0 2.476 1.618 3.922 7.3102 3.922 5.3609 0 7.0958-1.4262 7.0958-3.9418 0-2.3769-1.1501-3.5456-6.238-3.8031-3.9573-.17827-4.3082-.61404-4.3082-1.10924 0-.57442.5068-.87154 3.158-.87154 2.7487 0 3.4894.37635 3.4894 1.16866v.17827c.3899-.01981 1.0917-.03961 1.813-.03961.6823 0 1.423.0198 1.8519.05942 0-.17827.0195-.33674.0195-.47539 0-2.91175-2.4172-3.86252-7.0958-3.86252-5.2634 0-7.0373 1.2875-7.0373 3.8031 0 2.25805 1.423 3.66445 6.472 3.88235 3.7233.1188 4.1327.5348 4.1327 1.1092 0 .6141-.6043.8914-3.2165.8914-3.0021 0-3.7623-.416-3.7623-1.2677v-.1189ZM63.6883 2.125c-1.423 1.32712-3.9768 2.65425-5.3998 3.01079.0195.73289.0195 2.07982.0195 2.81271l1.3061.01981c-.0195 1.40635-.039 3.10979-.039 4.23889 0 2.6344 1.3841 4.6152 5.6922 4.6152 1.813 0 3.0216-.1981 4.5226-.515-.1559-.9706-.3314-2.4562-.3898-3.5852-.8968.2971-2.0274.4556-3.275.4556-1.735 0-2.4368-.4754-2.4368-1.8422 0-1.1884 0-2.29767.0195-3.32768 2.2223.01981 4.4446.05943 5.7507.09904-.0195-1.03.0195-2.51559.078-3.50598-1.8909.03961-4.0157.05942-5.7702.05942.0195-.87154.039-1.70347.0585-2.5354h-.1365ZM75.3313 7.35427c.0195-1.03001.039-1.90156.0585-2.75329h-3.9183c.0585 1.70347.0585 3.44656.0585 6.00172 0 2.5553-.0195 4.3182-.0585 6.0018h4.4836c-.078-1.1885-.0975-3.189-.0975-4.8925 0-2.69388 1.0917-3.46638 3.5674-3.46638 1.1502 0 1.9689.13865 2.6902.39615.0195-1.01019.2144-2.97117.3314-3.84271-.7408-.21789-1.5595-.35655-2.5537-.35655-2.1249-.0198-3.6844.85174-4.4056 2.93156l-.156-.0198ZM94.8501 10.5235c0 2.1591-1.5595 3.1693-4.0157 3.1693-2.4368 0-3.9963-.9508-3.9963-3.1693 0-2.21846 1.579-3.05039 3.9963-3.05039 2.4367 0 4.0157.89135 4.0157 3.05039Zm4.0743-.099c0-4.29832-3.353-6.21968-8.09-6.21968-4.7566 0-7.9926 1.92136-7.9926 6.21968 0 4.2785 3.0216 6.5762 7.9731 6.5762 4.9904 0 8.1095-2.2977 8.1095-6.5762Z"/><defs><linearGradient id="paint0_linear_386_2739" x1="5.46011" x2="16.8017" y1="25.9999" y2="20.6412" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient></defs></svg>';
var integrationData;
var astro_default = {
id: "astro:home",
name: "Menu",
icon: "astro:logo",
async init(canvas, eventTarget) {
createCanvas();
document.addEventListener("astro:after-swap", createCanvas);
eventTarget.addEventListener("app-toggled", async (event) => {
resetDebugButton();
if (!(event instanceof CustomEvent)) return;
if (event.detail.state === true) {
if (!integrationData) fetchIntegrationData();
}
});
closeOnOutsideClick(eventTarget);
synchronizePlacementOnUpdate(eventTarget, canvas);
function fetchIntegrationData() {
fetch("https://astro.build/api/v1/dev-overlay/", {
cache: "no-cache"
}).then((res) => res.json()).then((data) => {
integrationData = data;
integrationData.data = integrationData.data.map((integration) => {
return integration;
});
refreshIntegrationList();
});
}
function createCanvas() {
const links = [
{
icon: "bug",
name: "Report a Bug",
link: "https://github.com/withastro/astro/issues/new/choose"
},
{
icon: "lightbulb",
name: "Feedback",
link: "https://github.com/withastro/roadmap/discussions/new/choose"
},
{
icon: "file-search",
name: "Documentation",
link: "https://docs.astro.build"
},
{
icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17 14"><path fill="currentColor" d="M14.3451 1.9072c-1.0375-.47613-2.1323-.81595-3.257-1.010998-.0102-.001716-.0207-.000234-.03.004243s-.017.011728-.022.020757c-.141.249998-.297.576998-.406.832998-1.2124-.18399-2.44561-.18399-3.658 0-.12159-.28518-.25914-.56328-.412-.832998-.00513-.00893-.01285-.016098-.02213-.02056-.00928-.004462-.0197-.00601-.02987-.00444-1.125.193998-2.22.533998-3.257 1.010998-.00888.00339-.0163.00975-.021.018-2.074 3.099-2.643004 6.122-2.364004 9.107.001.014.01.028.021.037 1.207724.8946 2.558594 1.5777 3.995004 2.02.01014.0032.02103.0031.03111-.0003.01007-.0034.01878-.01.02489-.0187.308-.42.582-.863.818-1.329.00491-.0096.0066-.0205.0048-.0312-.00181-.0106-.007-.0204-.0148-.0278-.00517-.0049-.0113-.0086-.018-.011-.43084-.1656-.84811-.3645-1.248-.595-.01117-.0063-.01948-.0167-.0232-.029-.00373-.0123-.00258-.0255.0032-.037.0034-.0074.00854-.014.015-.019.084-.063.168-.129.248-.195.00706-.0057.01554-.0093.02453-.0106.00898-.0012.01813 0 .02647.0036 2.619 1.196 5.454 1.196 8.041 0 .0086-.0037.0181-.0051.0275-.0038.0093.0012.0181.0049.0255.0108.08.066.164.132.248.195.0068.005.0123.0116.0159.0192.0036.0076.0053.016.0049.0244-.0003.0084-.0028.0166-.0072.0238-.0043.0072-.0104.0133-.0176.0176-.399.2326-.8168.4313-1.249.594-.0069.0025-.0132.0065-.0183.0117-.0052.0051-.0092.0114-.0117.0183-.0023.0067-.0032.0138-.0027.0208.0005.0071.0024.0139.0057.0202.24.465.515.909.817 1.329.0061.0087.0148.0153.0249.0187.0101.0034.021.0035.0311.0003 1.4388-.441 2.7919-1.1241 4.001-2.02.0061-.0042.0111-.0097.0147-.0161.0037-.0064.0058-.0135.0063-.0209.334-3.451-.559-6.449-2.366-9.106-.0018-.00439-.0045-.00834-.008-.01162-.0034-.00327-.0075-.00578-.012-.00738Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z"/></svg>',
name: "Community",
link: "https://astro.build/chat"
}
];
const { latestAstroVersion, version, debugInfo } = window.__astro_dev_toolbar__ ?? {};
const windowComponent = createWindowElement(
`<style>
#buttons-container {
display: flex;
gap: 16px;
justify-content: center;
}
#buttons-container astro-dev-toolbar-card {
flex: 1;
}
footer {
display: flex;
justify-content: center;
gap: 24px;
}
footer a {
color: rgba(145, 152, 173, 1);
}
footer a:hover {
color: rgba(204, 206, 216, 1);
}
#main-container {
display: flex;
flex-direction: column;
height: 100%;
gap: 24px;
}
p {
margin-top: 0;
}
header {
display: flex;
justify-content: space-between;
align-items: center;
}
header section {
display: flex;
gap: 0.8em;
}
h2 {
color: white;
margin: 0;
font-size: 18px;
}
a {
color: rgba(224, 204, 250, 1);
}
a:hover {
color: #f4ecfd;
}
#integration-list-wrapper {
position: relative;
--offset: 24px;
overflow-x: auto;
overflow-y: hidden;
margin-left: calc(var(--offset) * -1);
margin-right: calc(var(--offset) * -1);
padding-left: var(--offset);
padding-right: var(--offset);
height: 210px;
}
/* Pseudo-elements to fade cards as they scroll out of viewport */
#integration-list-wrapper::before,
#integration-list-wrapper::after {
content: '';
height: 192px;
display: block;
position: fixed;
width: var(--offset);
top: 106px;
background: red;
}
#integration-list-wrapper::before {
left: -1px;
border-left: 1px solid rgba(52, 56, 65, 1);
background: linear-gradient(to right, rgba(19, 21, 26, 1), rgba(19, 21, 26, 0));
}
#integration-list-wrapper::after {
right: -1px;
border-right: 1px solid rgba(52, 56, 65, 1);
background: linear-gradient(to left, rgba(19, 21, 26, 1), rgba(19, 21, 26, 0));
}
#integration-list-wrapper::-webkit-scrollbar {
width: 5px;
height: 8px;
background-color: rgba(255, 255, 255, 0.08); /* or add it to the track */
border-radius: 4px;
}
/* This is wild but gives us a gap on either side of the container */
#integration-list-wrapper::-webkit-scrollbar-button:start:decrement,
#integration-list-wrapper::-webkit-scrollbar-button:end:increment {
display: block;
width: 24px;
background-color: #13151A;
}
/* Removes arrows on both sides */
#integration-list-wrapper::-webkit-scrollbar-button:horizontal:start:increment,
#integration-list-wrapper::-webkit-scrollbar-button:horizontal:end:decrement {
display: none;
}
#integration-list-wrapper::-webkit-scrollbar-track-piece {
border-radius: 4px;
}
#integration-list-wrapper::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.3);
border-radius: 4px;
}
#integration-list {
margin-top: 1em;
display: flex;
gap: 16px;
padding-bottom: 1em;
}
#integration-list::after {
content: " ";
display: inline-block;
white-space: pre;
width: 1px;
height: 1px;
}
#integration-list astro-dev-toolbar-card, .integration-skeleton {
min-width: 240px;
height: 160px;
}
.integration-skeleton {
animation: pulse 2s calc(var(--i, 0) * 250ms) cubic-bezier(0.4, 0, 0.6, 1) infinite;
background-color: rgba(35, 38, 45, 1);
border-radius: 8px;
}
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: .5;
}
}
#integration-list astro-dev-toolbar-card .integration-image {
width: 40px;
height: 40px;
background-color: var(--integration-image-background, white);
border-radius: 9999px;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 8px;
}
#integration-list astro-dev-toolbar-card img {
width: 24px;
height: 24px;
}
#integration-list astro-dev-toolbar-card astro-dev-toolbar-icon {
width: 24px;
height: 24px;
color: #fff;
}
#links {
margin: auto 0;
display: flex;
justify-content: center;
gap: 24px;
}
#links a {
text-decoration: none;
align-items: center;
display: flex;
flex-direction: column;
gap: 0.7em;
flex: 1;
white-space: nowrap;
font-weight: 600;
color: white;
}
#links a:hover {
color: rgba(145, 152, 173, 1);
}
#links astro-dev-toolbar-icon {
width: 1.5em;
height: 1.5em;
display: block;
}
#integration-list astro-dev-toolbar-card svg {
width: 24px;
height: 24px;
vertical-align: bottom;
}
#integration-list astro-dev-toolbar-card h3 {
margin: 0;
margin-bottom: 8px;
color: white;
white-space: nowrap;
}
#integration-list astro-dev-toolbar-card p {
font-size: 14px;
}
@media (forced-colors: active) {
svg path[fill="#fff"] {
fill: black;
}
}
</style>
<header>
<section>
${astroLogo}
<astro-dev-toolbar-badge badge-style="gray" size="large">${version}</astro-dev-toolbar-badge>
${latestAstroVersion ? `<astro-dev-toolbar-badge badge-style="green" size="large">${latestAstroVersion} available!</astro-dev-toolbar-badge>
` : ""}
</section>
<astro-dev-toolbar-button id="copy-debug-button">Copy debug info <astro-dev-toolbar-icon icon="copy" /></astro-dev-toolbar-button>
</header>
<hr />
<div id="main-container">
<div>
<header><h2>Featured integrations</h2><a href="https://astro.build/integrations/" target="_blank">View all</a></header>
<div id="integration-list-wrapper">
<section id="integration-list">
<div class="integration-skeleton" style="--i:0;"></div>
<div class="integration-skeleton" style="--i:1;"></div>
<div class="integration-skeleton" style="--i:2;"></div>
<div class="integration-skeleton" style="--i:3;"></div>
<div class="integration-skeleton" style="--i:4;"></div>
</section>
</div>
</div>
<section id="links">
${links.map(
(link) => `<a href="${link.link}" target="_blank"><astro-dev-toolbar-icon ${isDefinedIcon(link.icon) ? `icon="${link.icon}">` : `>${link.icon}`}</astro-dev-toolbar-icon>${link.name}</a>`
).join("")}
</section>
</div>
`
);
const copyDebugButton = windowComponent.querySelector("#copy-debug-button");
copyDebugButton?.addEventListener("click", () => {
navigator.clipboard.writeText("```\n" + debugInfo + "\n```");
copyDebugButton.textContent = "Copied to clipboard!";
setTimeout(() => {
resetDebugButton();
}, 3500);
});
canvas.append(windowComponent);
if (integrationData) refreshIntegrationList();
}
function resetDebugButton() {
const copyDebugButton = canvas.querySelector("#copy-debug-button");
if (!copyDebugButton) return;
copyDebugButton.innerHTML = 'Copy debug info <astro-dev-toolbar-icon icon="copy" />';
}
function refreshIntegrationList() {
const integrationList = canvas.querySelector("#integration-list");
if (!integrationList) return;
integrationList.innerHTML = "";
const fragment = document.createDocumentFragment();
for (const integration of integrationData.data) {
const integrationComponent = document.createElement("astro-dev-toolbar-card");
integrationComponent.link = integration.homepageUrl;
const integrationContainer = document.createElement("div");
integrationContainer.className = "integration-container";
const integrationImage = document.createElement("div");
integrationImage.className = "integration-image";
if (integration.image) {
const img = document.createElement("img");
img.src = integration.image;
img.alt = integration.title;
integrationImage.append(img);
} else {
const icon = document.createElement("astro-dev-toolbar-icon");
icon.icon = iconForIntegration(integration);
integrationImage.append(icon);
integrationImage.style.setProperty(
"--integration-image-background",
colorForIntegration()
);
}
integrationContainer.append(integrationImage);
let integrationTitle = document.createElement("h3");
integrationTitle.textContent = integration.title;
if (integration.official || integration.categories.includes("official")) {
integrationTitle.innerHTML += ' <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 21 20"><rect width="19" height="19" x="1.16602" y=".5" fill="url(#paint0_linear_917_1096)" fill-opacity=".33" rx="9.5"/><path fill="#fff" d="M15.139 6.80657c-.062-.06248-.1357-.11208-.217-.14592-.0812-.03385-.1683-.05127-.2563-.05127-.0881 0-.1752.01742-.2564.05127-.0813.03384-.155.08344-.217.14592L9.22566 11.7799 7.13899 9.68657c-.06435-.06216-.14031-.11103-.22355-.14383-.08323-.03281-.17211-.04889-.26157-.04735-.08945.00155-.17773.0207-.25978.05637a.68120694.68120694 0 0 0-.21843.15148c-.06216.06435-.11104.14031-.14384.22355-.0328.08321-.04889.17211-.04734.26161.00154.0894.0207.1777.05636.2597.03566.0821.08714.1563.15148.2185l2.56 2.56c.06198.0625.13571.1121.21695.1459s.16838.0513.25639.0513c.088 0 .17514-.0175.25638-.0513s.15497-.0834.21695-.1459L15.139 7.78657c.0677-.06242.1217-.13819.1586-.22253.0369-.08433.056-.1754.056-.26747 0-.09206-.0191-.18313-.056-.26747-.0369-.08433-.0909-.1601-.1586-.22253Z"/><rect width="19" height="19" x="1.16602" y=".5" stroke="url(#paint1_linear_917_1096)" rx="9.5"/><defs><linearGradient id="paint0_linear_917_1096" x1="20.666" x2="-3.47548" y1=".00000136" y2="10.1345" gradientUnits="userSpaceOnUse"><stop stop-color="#4AF2C8"/><stop offset="1" stop-color="#2F4CB3"/></linearGradient><linearGradient id="paint1_linear_917_1096" x1="20.666" x2="-3.47548" y1=".00000136" y2="10.1345" gradientUnits="userSpaceOnUse"><stop stop-color="#4AF2C8"/><stop offset="1" stop-color="#2F4CB3"/></linearGradient></defs></svg>';
}
integrationContainer.append(integrationTitle);
const integrationDescription = document.createElement("p");
integrationDescription.textContent = integration.description.length > 90 ? integration.description.slice(0, 90) + "…" : integration.description;
integrationContainer.append(integrationDescription);
integrationComponent.append(integrationContainer);
fragment.append(integrationComponent);
}
integrationList.append(fragment);
}
}
};
export {
astro_default as default
};
//# sourceMappingURL=astro-IQQQXCO3.js.map

7
node_modules/.vite/deps/astro-IQQQXCO3.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

5
node_modules/.vite/deps/astro___aria-query.js generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import {
require_lib
} from "./chunk-WDCEFGHP.js";
import "./chunk-5WRI5ZAA.js";
export default require_lib();

7
node_modules/.vite/deps/astro___aria-query.js.map generated vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

5
node_modules/.vite/deps/astro___axobject-query.js generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import {
require_lib
} from "./chunk-WTIA47ZU.js";
import "./chunk-5WRI5ZAA.js";
export default require_lib();

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

9
node_modules/.vite/deps/astro___html-escaper.js generated vendored Normal file
View File

@@ -0,0 +1,9 @@
import {
escape,
unescape
} from "./chunk-PXGSXSC7.js";
import "./chunk-5WRI5ZAA.js";
export {
escape,
unescape
};

7
node_modules/.vite/deps/astro___html-escaper.js.map generated vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

View File

@@ -0,0 +1,241 @@
import {
ToolbarAppEventTarget
} from "./chunk-HNT3PLDI.js";
import {
settings
} from "./chunk-LEX3GG7N.js";
import "./chunk-5WRI5ZAA.js";
// node_modules/astro/dist/runtime/client/dev-toolbar/entrypoint.js
import { loadDevToolbarApps } from "astro:toolbar:internal";
var overlay;
document.addEventListener("DOMContentLoaded", async () => {
const [
customAppsDefinitions,
{ default: astroDevToolApp },
{ default: astroAuditApp },
{ default: astroXrayApp },
{ default: astroSettingsApp },
{ AstroDevToolbar, DevToolbarCanvas, getAppIcon },
{
DevToolbarCard,
DevToolbarHighlight,
DevToolbarTooltip,
DevToolbarWindow,
DevToolbarToggle,
DevToolbarButton,
DevToolbarBadge,
DevToolbarIcon,
DevToolbarSelect,
DevToolbarRadioCheckbox
}
] = await Promise.all([
loadDevToolbarApps(),
import("./astro-IQQQXCO3.js"),
import("./audit-XFDIA4TR.js"),
import("./xray-XH6VIXDC.js"),
import("./settings-K4OHAGC2.js"),
import("./toolbar-2H5PSQQU.js"),
import("./ui-library-EVFCBMCE.js")
]);
customElements.define("astro-dev-toolbar", AstroDevToolbar);
customElements.define("astro-dev-toolbar-window", DevToolbarWindow);
customElements.define("astro-dev-toolbar-app-canvas", DevToolbarCanvas);
customElements.define("astro-dev-toolbar-tooltip", DevToolbarTooltip);
customElements.define("astro-dev-toolbar-highlight", DevToolbarHighlight);
customElements.define("astro-dev-toolbar-card", DevToolbarCard);
customElements.define("astro-dev-toolbar-toggle", DevToolbarToggle);
customElements.define("astro-dev-toolbar-button", DevToolbarButton);
customElements.define("astro-dev-toolbar-badge", DevToolbarBadge);
customElements.define("astro-dev-toolbar-icon", DevToolbarIcon);
customElements.define("astro-dev-toolbar-select", DevToolbarSelect);
customElements.define("astro-dev-toolbar-radio-checkbox", DevToolbarRadioCheckbox);
overlay = document.createElement("astro-dev-toolbar");
const notificationLevels = ["error", "warning", "info"];
const notificationSVGs = {
error: '<svg viewBox="0 0 10 10" style="--fill:var(--fill-default);--fill-default:#B33E66;--fill-hover:#E3AFC1;"><rect width="9" height="9" x=".5" y=".5" fill="var(--fill)" stroke="#13151A" stroke-width="2" rx="4.5"/></svg>',
warning: '<svg width="12" height="10" fill="none" style="--fill:var(--fill-default);--fill-default:#B58A2D;--fill-hover:#D5B776;"><path fill="var(--fill)" stroke="#13151A" stroke-width="2" d="M7.29904 1.25c-.57735-1-2.02073-1-2.59808 0l-3.4641 6C.65951 8.25 1.3812 9.5 2.5359 9.5h6.9282c1.1547 0 1.8764-1.25 1.299-2.25l-3.46406-6Z"/></svg>',
info: '<svg viewBox="0 0 10 10" style="--fill:var(--fill-default);--fill-default:#3645D9;--fill-hover:#BDC3FF;"><rect width="9" height="9" x=".5" y=".5" fill="var(--fill)" stroke="#13151A" stroke-width="2" rx="1.5"/></svg>'
};
const prepareApp = (appDefinition, builtIn) => {
const eventTarget = new ToolbarAppEventTarget();
const app = {
...appDefinition,
builtIn,
active: false,
status: "loading",
notification: { state: false, level: void 0 },
eventTarget
};
eventTarget.addEventListener("toggle-notification", (evt) => {
if (!(evt instanceof CustomEvent)) return;
const target = overlay.shadowRoot?.querySelector(`[data-app-id="${app.id}"]`);
if (!target) return;
const notificationElement = target.querySelector(".notification");
if (!notificationElement) return;
let newState = evt.detail.state ?? true;
let level = notificationLevels.includes(evt?.detail?.level) ? evt.detail.level : "error";
app.notification.state = newState;
if (newState) app.notification.level = level;
notificationElement.toggleAttribute("data-active", newState);
if (newState) {
notificationElement.setAttribute("data-level", level);
notificationElement.innerHTML = notificationSVGs[level];
}
});
const onToggleApp = async (evt) => {
let newState = void 0;
if (evt instanceof CustomEvent) {
newState = evt.detail.state ?? true;
}
await overlay.setAppStatus(app, newState);
};
eventTarget.addEventListener("toggle-app", onToggleApp);
return app;
};
const astroMoreApp = {
id: "astro:more",
name: "More",
icon: "dots-three",
init(canvas, eventTarget) {
const hiddenApps = apps.filter((p) => !p.builtIn).slice(overlay.customAppsToShow);
createDropdown();
document.addEventListener("astro:after-swap", createDropdown);
function createDropdown() {
const style = document.createElement("style");
style.innerHTML = `
#dropdown {
background: rgba(19, 21, 26, 1);
border: 1px solid rgba(52, 56, 65, 1);
border-radius: 12px;
box-shadow: 0px 0px 0px 0px rgba(19, 21, 26, 0.30), 0px 1px 2px 0px rgba(19, 21, 26, 0.29), 0px 4px 4px 0px rgba(19, 21, 26, 0.26), 0px 10px 6px 0px rgba(19, 21, 26, 0.15), 0px 17px 7px 0px rgba(19, 21, 26, 0.04), 0px 26px 7px 0px rgba(19, 21, 26, 0.01);
width: 192px;
padding: 8px;
z-index: 2000000010;
transform: translate(-50%, 0%);
position: fixed;
bottom: 72px;
left: 50%;
}
.notification {
display: none;
position: absolute;
top: -4px;
right: -5px;
width: 12px;
height: 10px;
}
.notification svg {
display: block;
}
#dropdown:not([data-no-notification]) .notification[data-active] {
display: block;
}
#dropdown button {
border: 0;
background: transparent;
color: white;
font-family: system-ui, sans-serif;
font-size: 14px;
white-space: nowrap;
text-decoration: none;
margin: 0;
display: flex;
align-items: center;
width: 100%;
padding: 8px;
border-radius: 8px;
}
#dropdown button:hover, #dropdown button:focus-visible {
background: #FFFFFF20;
cursor: pointer;
}
#dropdown button.active {
background: rgba(71, 78, 94, 1);
}
#dropdown .icon {
position: relative;
height: 20px;
width: 20px;
padding: 1px;
margin-right: 0.5em;
}
#dropdown .icon svg {
max-height: 100%;
max-width: 100%;
}
`;
canvas.append(style);
const dropdown = document.createElement("div");
dropdown.id = "dropdown";
dropdown.toggleAttribute("data-no-notification", settings.config.disableAppNotification);
for (const app of hiddenApps) {
const buttonContainer = document.createElement("div");
buttonContainer.classList.add("item");
const button = document.createElement("button");
button.setAttribute("data-app-id", app.id);
const iconContainer = document.createElement("div");
const iconElement = document.createElement("template");
iconElement.innerHTML = app.icon ? getAppIcon(app.icon) : "?";
iconContainer.append(iconElement.content.cloneNode(true));
const notification = document.createElement("div");
notification.classList.add("notification");
iconContainer.append(notification);
iconContainer.classList.add("icon");
button.append(iconContainer);
button.append(document.createTextNode(app.name));
button.addEventListener("click", () => {
overlay.toggleAppStatus(app);
});
buttonContainer.append(button);
dropdown.append(buttonContainer);
app.eventTarget.addEventListener("toggle-notification", (evt) => {
if (!(evt instanceof CustomEvent)) return;
let newState = evt.detail.state ?? true;
let level = notificationLevels.includes(evt?.detail?.level) ? evt.detail.level : "error";
notification.toggleAttribute("data-active", newState);
if (newState) {
notification.setAttribute("data-level", level);
notification.innerHTML = notificationSVGs[level];
}
app.notification.state = newState;
if (newState) app.notification.level = level;
eventTarget.dispatchEvent(
new CustomEvent("toggle-notification", {
detail: {
state: hiddenApps.some((p) => p.notification.state === true),
level: ["error", "warning", "info"].find(
(notificationLevel) => hiddenApps.some(
(p) => p.notification.state === true && p.notification.level === notificationLevel
)
) ?? "error"
}
})
);
});
}
canvas.append(dropdown);
}
}
};
const apps = [
...[astroDevToolApp, astroXrayApp, astroAuditApp, astroSettingsApp, astroMoreApp].map(
(appDef) => prepareApp(appDef, true)
),
...customAppsDefinitions.map((appDef) => prepareApp(appDef, false))
];
overlay.apps = apps;
document.body.append(overlay);
document.addEventListener("astro:after-swap", () => {
document.body.append(overlay);
});
});

File diff suppressed because one or more lines are too long

1583
node_modules/.vite/deps/audit-XFDIA4TR.js generated vendored Normal file

File diff suppressed because it is too large Load Diff

7
node_modules/.vite/deps/audit-XFDIA4TR.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

30
node_modules/.vite/deps/chunk-5WRI5ZAA.js generated vendored Normal file
View File

@@ -0,0 +1,30 @@
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
export {
__commonJS,
__toESM
};

7
node_modules/.vite/deps/chunk-5WRI5ZAA.js.map generated vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

88
node_modules/.vite/deps/chunk-HNT3PLDI.js generated vendored Normal file
View File

@@ -0,0 +1,88 @@
// node_modules/astro/dist/runtime/client/dev-toolbar/helpers.js
var ToolbarAppEventTarget = class extends EventTarget {
constructor() {
super();
}
/**
* Toggle the notification state of the toolbar
* @param options - The notification options
* @param options.state - The state of the notification
* @param options.level - The level of the notification, optional when state is false
*/
toggleNotification(options) {
this.dispatchEvent(
new CustomEvent("toggle-notification", {
detail: {
state: options.state,
level: options.state === true ? options.level : void 0
}
})
);
}
/**
* Toggle the app state on or off
* @param options - The app state options
* @param options.state - The new state of the app
*/
toggleState(options) {
this.dispatchEvent(
new CustomEvent("toggle-app", {
detail: {
state: options.state
}
})
);
}
/**
* Fired when the app is toggled on or off
* @param callback - The callback to run when the event is fired, takes an object with the new state
*/
onToggled(callback) {
this.addEventListener("app-toggled", (evt) => {
if (!(evt instanceof CustomEvent)) return;
callback(evt.detail);
});
}
/**
* Fired when the toolbar placement is updated by the user
* @param callback - The callback to run when the event is fired, takes an object with the new placement
*/
onToolbarPlacementUpdated(callback) {
this.addEventListener("placement-updated", (evt) => {
if (!(evt instanceof CustomEvent)) return;
callback(evt.detail);
});
}
};
var serverHelpers = {
/**
* Send a message to the server, the payload can be any serializable data.
*
* The server can listen for this message in the `astro:server:config` hook of an Astro integration, using the `toolbar.on` method.
*
* @param event - The event name
* @param payload - The payload to send
*/
send: (event, payload) => {
if (import.meta.hot) {
import.meta.hot.send(event, payload);
}
},
/**
* Receive a message from the server.
* @param event - The event name
* @param callback - The callback to run when the event is received.
* The payload's content will be passed to the callback as an argument
*/
on: (event, callback) => {
if (import.meta.hot) {
import.meta.hot.on(event, callback);
}
}
};
export {
ToolbarAppEventTarget,
serverHelpers
};
//# sourceMappingURL=chunk-HNT3PLDI.js.map

7
node_modules/.vite/deps/chunk-HNT3PLDI.js.map generated vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../astro/dist/runtime/client/dev-toolbar/helpers.js"],
"sourcesContent": ["class ToolbarAppEventTarget extends EventTarget {\n constructor() {\n super();\n }\n /**\n * Toggle the notification state of the toolbar\n * @param options - The notification options\n * @param options.state - The state of the notification\n * @param options.level - The level of the notification, optional when state is false\n */\n toggleNotification(options) {\n this.dispatchEvent(\n new CustomEvent(\"toggle-notification\", {\n detail: {\n state: options.state,\n level: options.state === true ? options.level : void 0\n }\n })\n );\n }\n /**\n * Toggle the app state on or off\n * @param options - The app state options\n * @param options.state - The new state of the app\n */\n toggleState(options) {\n this.dispatchEvent(\n new CustomEvent(\"toggle-app\", {\n detail: {\n state: options.state\n }\n })\n );\n }\n /**\n * Fired when the app is toggled on or off\n * @param callback - The callback to run when the event is fired, takes an object with the new state\n */\n onToggled(callback) {\n this.addEventListener(\"app-toggled\", (evt) => {\n if (!(evt instanceof CustomEvent)) return;\n callback(evt.detail);\n });\n }\n /**\n * Fired when the toolbar placement is updated by the user\n * @param callback - The callback to run when the event is fired, takes an object with the new placement\n */\n onToolbarPlacementUpdated(callback) {\n this.addEventListener(\"placement-updated\", (evt) => {\n if (!(evt instanceof CustomEvent)) return;\n callback(evt.detail);\n });\n }\n}\nconst serverHelpers = {\n /**\n * Send a message to the server, the payload can be any serializable data.\n *\n * The server can listen for this message in the `astro:server:config` hook of an Astro integration, using the `toolbar.on` method.\n *\n * @param event - The event name\n * @param payload - The payload to send\n */\n send: (event, payload) => {\n if (import.meta.hot) {\n import.meta.hot.send(event, payload);\n }\n },\n /**\n * Receive a message from the server.\n * @param event - The event name\n * @param callback - The callback to run when the event is received.\n * The payload's content will be passed to the callback as an argument\n */\n on: (event, callback) => {\n if (import.meta.hot) {\n import.meta.hot.on(event, callback);\n }\n }\n};\nexport {\n ToolbarAppEventTarget,\n serverHelpers\n};\n"],
"mappings": ";AAAA,IAAM,wBAAN,cAAoC,YAAY;AAAA,EAC9C,cAAc;AACZ,UAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,SAAS;AAC1B,SAAK;AAAA,MACH,IAAI,YAAY,uBAAuB;AAAA,QACrC,QAAQ;AAAA,UACN,OAAO,QAAQ;AAAA,UACf,OAAO,QAAQ,UAAU,OAAO,QAAQ,QAAQ;AAAA,QAClD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,SAAS;AACnB,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ;AAAA,UACN,OAAO,QAAQ;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,UAAU;AAClB,SAAK,iBAAiB,eAAe,CAAC,QAAQ;AAC5C,UAAI,EAAE,eAAe,aAAc;AACnC,eAAS,IAAI,MAAM;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B,UAAU;AAClC,SAAK,iBAAiB,qBAAqB,CAAC,QAAQ;AAClD,UAAI,EAAE,eAAe,aAAc;AACnC,eAAS,IAAI,MAAM;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AACA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpB,MAAM,CAAC,OAAO,YAAY;AACxB,QAAI,YAAY,KAAK;AACnB,kBAAY,IAAI,KAAK,OAAO,OAAO;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,CAAC,OAAO,aAAa;AACvB,QAAI,YAAY,KAAK;AACnB,kBAAY,IAAI,GAAG,OAAO,QAAQ;AAAA,IACpC;AAAA,EACF;AACF;",
"names": []
}

72
node_modules/.vite/deps/chunk-LEAOZWS7.js generated vendored Normal file
View File

@@ -0,0 +1,72 @@
// node_modules/astro/dist/runtime/client/dev-toolbar/apps/utils/highlight.js
function createHighlight(rect, icon, additionalAttributes) {
const highlight = document.createElement("astro-dev-toolbar-highlight");
if (icon) highlight.icon = icon;
if (additionalAttributes) {
for (const [key, value] of Object.entries(additionalAttributes)) {
highlight.setAttribute(key, value);
}
}
highlight.tabIndex = 0;
if (rect.width === 0 || rect.height === 0) {
highlight.style.display = "none";
} else {
positionHighlight(highlight, rect);
}
return highlight;
}
function getElementsPositionInDocument(el) {
let isFixed = false;
let current = el;
while (current instanceof Element) {
let style = getComputedStyle(current);
if (style.position === "fixed") {
isFixed = true;
}
current = current.parentNode;
}
return {
isFixed
};
}
function positionHighlight(highlight, rect) {
highlight.style.display = "block";
const scrollY = highlight.style.position === "fixed" ? 0 : window.scrollY;
highlight.style.top = `${Math.max(rect.top + scrollY - 10, 0)}px`;
highlight.style.left = `${Math.max(rect.left + window.scrollX - 10, 0)}px`;
highlight.style.width = `${rect.width + 15}px`;
highlight.style.height = `${rect.height + 15}px`;
}
function attachTooltipToHighlight(highlight, tooltip, originalElement) {
highlight.shadowRoot.append(tooltip);
["mouseover", "focus"].forEach((event) => {
highlight.addEventListener(event, () => {
tooltip.dataset.show = "true";
const originalRect = originalElement.getBoundingClientRect();
const dialogRect = tooltip.getBoundingClientRect();
if (originalRect.top < dialogRect.height) {
tooltip.style.top = `${originalRect.height + 15}px`;
} else {
tooltip.style.top = `-${tooltip.offsetHeight}px`;
}
if (dialogRect.right > document.documentElement.clientWidth) {
tooltip.style.right = "0px";
} else if (dialogRect.left < 0) {
tooltip.style.left = "0px";
}
});
});
["mouseout", "blur"].forEach((event) => {
highlight.addEventListener(event, () => {
tooltip.dataset.show = "false";
});
});
}
export {
createHighlight,
getElementsPositionInDocument,
positionHighlight,
attachTooltipToHighlight
};
//# sourceMappingURL=chunk-LEAOZWS7.js.map

7
node_modules/.vite/deps/chunk-LEAOZWS7.js.map generated vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../astro/dist/runtime/client/dev-toolbar/apps/utils/highlight.js"],
"sourcesContent": ["function createHighlight(rect, icon, additionalAttributes) {\n const highlight = document.createElement(\"astro-dev-toolbar-highlight\");\n if (icon) highlight.icon = icon;\n if (additionalAttributes) {\n for (const [key, value] of Object.entries(additionalAttributes)) {\n highlight.setAttribute(key, value);\n }\n }\n highlight.tabIndex = 0;\n if (rect.width === 0 || rect.height === 0) {\n highlight.style.display = \"none\";\n } else {\n positionHighlight(highlight, rect);\n }\n return highlight;\n}\nfunction getElementsPositionInDocument(el) {\n let isFixed = false;\n let current = el;\n while (current instanceof Element) {\n let style = getComputedStyle(current);\n if (style.position === \"fixed\") {\n isFixed = true;\n }\n current = current.parentNode;\n }\n return {\n isFixed\n };\n}\nfunction positionHighlight(highlight, rect) {\n highlight.style.display = \"block\";\n const scrollY = highlight.style.position === \"fixed\" ? 0 : window.scrollY;\n highlight.style.top = `${Math.max(rect.top + scrollY - 10, 0)}px`;\n highlight.style.left = `${Math.max(rect.left + window.scrollX - 10, 0)}px`;\n highlight.style.width = `${rect.width + 15}px`;\n highlight.style.height = `${rect.height + 15}px`;\n}\nfunction attachTooltipToHighlight(highlight, tooltip, originalElement) {\n highlight.shadowRoot.append(tooltip);\n [\"mouseover\", \"focus\"].forEach((event) => {\n highlight.addEventListener(event, () => {\n tooltip.dataset.show = \"true\";\n const originalRect = originalElement.getBoundingClientRect();\n const dialogRect = tooltip.getBoundingClientRect();\n if (originalRect.top < dialogRect.height) {\n tooltip.style.top = `${originalRect.height + 15}px`;\n } else {\n tooltip.style.top = `-${tooltip.offsetHeight}px`;\n }\n if (dialogRect.right > document.documentElement.clientWidth) {\n tooltip.style.right = \"0px\";\n } else if (dialogRect.left < 0) {\n tooltip.style.left = \"0px\";\n }\n });\n });\n [\"mouseout\", \"blur\"].forEach((event) => {\n highlight.addEventListener(event, () => {\n tooltip.dataset.show = \"false\";\n });\n });\n}\nexport {\n attachTooltipToHighlight,\n createHighlight,\n getElementsPositionInDocument,\n positionHighlight\n};\n"],
"mappings": ";AAAA,SAAS,gBAAgB,MAAM,MAAM,sBAAsB;AACzD,QAAM,YAAY,SAAS,cAAc,6BAA6B;AACtE,MAAI,KAAM,WAAU,OAAO;AAC3B,MAAI,sBAAsB;AACxB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,oBAAoB,GAAG;AAC/D,gBAAU,aAAa,KAAK,KAAK;AAAA,IACnC;AAAA,EACF;AACA,YAAU,WAAW;AACrB,MAAI,KAAK,UAAU,KAAK,KAAK,WAAW,GAAG;AACzC,cAAU,MAAM,UAAU;AAAA,EAC5B,OAAO;AACL,sBAAkB,WAAW,IAAI;AAAA,EACnC;AACA,SAAO;AACT;AACA,SAAS,8BAA8B,IAAI;AACzC,MAAI,UAAU;AACd,MAAI,UAAU;AACd,SAAO,mBAAmB,SAAS;AACjC,QAAI,QAAQ,iBAAiB,OAAO;AACpC,QAAI,MAAM,aAAa,SAAS;AAC9B,gBAAU;AAAA,IACZ;AACA,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO;AAAA,IACL;AAAA,EACF;AACF;AACA,SAAS,kBAAkB,WAAW,MAAM;AAC1C,YAAU,MAAM,UAAU;AAC1B,QAAM,UAAU,UAAU,MAAM,aAAa,UAAU,IAAI,OAAO;AAClE,YAAU,MAAM,MAAM,GAAG,KAAK,IAAI,KAAK,MAAM,UAAU,IAAI,CAAC,CAAC;AAC7D,YAAU,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,OAAO,OAAO,UAAU,IAAI,CAAC,CAAC;AACtE,YAAU,MAAM,QAAQ,GAAG,KAAK,QAAQ,EAAE;AAC1C,YAAU,MAAM,SAAS,GAAG,KAAK,SAAS,EAAE;AAC9C;AACA,SAAS,yBAAyB,WAAW,SAAS,iBAAiB;AACrE,YAAU,WAAW,OAAO,OAAO;AACnC,GAAC,aAAa,OAAO,EAAE,QAAQ,CAAC,UAAU;AACxC,cAAU,iBAAiB,OAAO,MAAM;AACtC,cAAQ,QAAQ,OAAO;AACvB,YAAM,eAAe,gBAAgB,sBAAsB;AAC3D,YAAM,aAAa,QAAQ,sBAAsB;AACjD,UAAI,aAAa,MAAM,WAAW,QAAQ;AACxC,gBAAQ,MAAM,MAAM,GAAG,aAAa,SAAS,EAAE;AAAA,MACjD,OAAO;AACL,gBAAQ,MAAM,MAAM,IAAI,QAAQ,YAAY;AAAA,MAC9C;AACA,UAAI,WAAW,QAAQ,SAAS,gBAAgB,aAAa;AAC3D,gBAAQ,MAAM,QAAQ;AAAA,MACxB,WAAW,WAAW,OAAO,GAAG;AAC9B,gBAAQ,MAAM,OAAO;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,GAAC,YAAY,MAAM,EAAE,QAAQ,CAAC,UAAU;AACtC,cAAU,iBAAiB,OAAO,MAAM;AACtC,cAAQ,QAAQ,OAAO;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACH;",
"names": []
}

186
node_modules/.vite/deps/chunk-LEX3GG7N.js generated vendored Normal file
View File

@@ -0,0 +1,186 @@
// node_modules/astro/dist/runtime/client/dev-toolbar/settings.js
var defaultSettings = {
disableAppNotification: false,
verbose: false,
placement: "bottom-center"
};
var settings = getSettings();
function getSettings() {
let _settings = { ...defaultSettings };
const configPlacement = globalThis.__astro_dev_toolbar__?.placement;
if (configPlacement && isValidPlacement(configPlacement)) {
_settings.placement = configPlacement;
}
const toolbarSettings = localStorage.getItem("astro:dev-toolbar:settings");
if (toolbarSettings) {
_settings = { ..._settings, ...JSON.parse(toolbarSettings) };
}
function updateSetting(key, value) {
_settings[key] = value;
localStorage.setItem("astro:dev-toolbar:settings", JSON.stringify(_settings));
}
function log(message, level = "log") {
console[level](
`%cAstro`,
"background: linear-gradient(66.77deg, #D83333 0%, #F041FF 100%); color: white; padding-inline: 4px; border-radius: 2px; font-family: monospace;",
message
);
}
return {
get config() {
return _settings;
},
updateSetting,
logger: {
log,
warn: (message) => {
log(message, "warn");
},
error: (message) => {
log(message, "error");
},
verboseLog: (message) => {
if (_settings.verbose) {
log(message);
}
}
}
};
}
// node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/window.js
var placements = ["bottom-left", "bottom-center", "bottom-right"];
function isValidPlacement(value) {
return placements.map(String).includes(value);
}
var DevToolbarWindow = class extends HTMLElement {
shadowRoot;
_placement = defaultSettings.placement;
get placement() {
return this._placement;
}
set placement(value) {
if (!isValidPlacement(value)) {
settings.logger.error(
`Invalid placement: ${value}, expected one of ${placements.join(", ")}, got ${value}.`
);
return;
}
this._placement = value;
this.updateStyle();
}
static observedAttributes = ["placement"];
constructor() {
super();
this.shadowRoot = this.attachShadow({ mode: "open" });
}
async connectedCallback() {
this.shadowRoot.innerHTML = `
<style>
:host {
box-sizing: border-box;
display: flex;
flex-direction: column;
background: linear-gradient(0deg, #13151A, #13151A), linear-gradient(0deg, #343841, #343841);
border: 1px solid rgba(52, 56, 65, 1);
width: min(640px, 100%);
max-height: 480px;
border-radius: 12px;
padding: 24px;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
color: rgba(191, 193, 201, 1);
position: fixed;
z-index: 999999999;
bottom: 72px;
box-shadow: 0px 0px 0px 0px rgba(19, 21, 26, 0.30), 0px 1px 2px 0px rgba(19, 21, 26, 0.29), 0px 4px 4px 0px rgba(19, 21, 26, 0.26), 0px 10px 6px 0px rgba(19, 21, 26, 0.15), 0px 17px 7px 0px rgba(19, 21, 26, 0.04), 0px 26px 7px 0px rgba(19, 21, 26, 0.01);
}
@media (forced-colors: active) {
:host {
background: white;
}
}
@media (max-width: 640px) {
:host {
border-radius: 0;
}
}
::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4), ::slotted(h5) {
font-weight: 600;
color: #fff;
}
::slotted(h1) {
font-size: 22px;
}
::slotted(h2) {
font-size: 20px;
}
::slotted(h3) {
font-size: 18px;
}
::slotted(h4) {
font-size: 16px;
}
::slotted(h5) {
font-size: 14px;
}
hr, ::slotted(hr) {
border: 1px solid rgba(27, 30, 36, 1);
margin: 1em 0;
}
p, ::slotted(p) {
line-height: 1.5em;
}
</style>
<style id="selected-style"></style>
<slot />
`;
this.updateStyle();
}
attributeChangedCallback() {
if (this.hasAttribute("placement"))
this.placement = this.getAttribute("placement");
}
updateStyle() {
const style = this.shadowRoot.querySelector("#selected-style");
if (style) {
const styleMap = {
"bottom-left": `
:host {
left: 16px;
}
`,
"bottom-center": `
:host {
left: 50%;
transform: translateX(-50%);
}
`,
"bottom-right": `
:host {
right: 16px;
}
`
};
style.innerHTML = styleMap[this.placement];
}
}
};
export {
placements,
isValidPlacement,
DevToolbarWindow,
settings
};
//# sourceMappingURL=chunk-LEX3GG7N.js.map

7
node_modules/.vite/deps/chunk-LEX3GG7N.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

33
node_modules/.vite/deps/chunk-PXGSXSC7.js generated vendored Normal file
View File

@@ -0,0 +1,33 @@
// node_modules/html-escaper/esm/index.js
var { replace } = "";
var es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;
var ca = /[&<>'"]/g;
var esca = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
"'": "&#39;",
'"': "&quot;"
};
var pe = (m) => esca[m];
var escape = (es2) => replace.call(es2, ca, pe);
var unes = {
"&amp;": "&",
"&#38;": "&",
"&lt;": "<",
"&#60;": "<",
"&gt;": ">",
"&#62;": ">",
"&apos;": "'",
"&#39;": "'",
"&quot;": '"',
"&#34;": '"'
};
var cape = (m) => unes[m];
var unescape = (un) => replace.call(un, es, cape);
export {
escape,
unescape
};
//# sourceMappingURL=chunk-PXGSXSC7.js.map

7
node_modules/.vite/deps/chunk-PXGSXSC7.js.map generated vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../html-escaper/esm/index.js"],
"sourcesContent": ["/**\n * Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nconst {replace} = '';\n\n// escape\nconst es = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g;\nconst ca = /[&<>'\"]/g;\n\nconst esca = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n \"'\": '&#39;',\n '\"': '&quot;'\n};\nconst pe = m => esca[m];\n\n/**\n * Safely escape HTML entities such as `&`, `<`, `>`, `\"`, and `'`.\n * @param {string} es the input to safely escape\n * @returns {string} the escaped input, and it **throws** an error if\n * the input type is unexpected, except for boolean and numbers,\n * converted as string.\n */\nexport const escape = es => replace.call(es, ca, pe);\n\n\n// unescape\nconst unes = {\n '&amp;': '&',\n '&#38;': '&',\n '&lt;': '<',\n '&#60;': '<',\n '&gt;': '>',\n '&#62;': '>',\n '&apos;': \"'\",\n '&#39;': \"'\",\n '&quot;': '\"',\n '&#34;': '\"'\n};\nconst cape = m => unes[m];\n\n/**\n * Safely unescape previously escaped entities such as `&`, `<`, `>`, `\"`,\n * and `'`.\n * @param {string} un a previously escaped string\n * @returns {string} the unescaped input, and it **throws** an error if\n * the input type is unexpected, except for boolean and numbers,\n * converted as string.\n */\nexport const unescape = un => replace.call(un, es, cape);\n"],
"mappings": ";AAsBA,IAAM,EAAC,QAAO,IAAI;AAGlB,IAAM,KAAK;AACX,IAAM,KAAK;AAEX,IAAM,OAAO;AAAA,EACX,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AACA,IAAM,KAAK,OAAK,KAAK,CAAC;AASf,IAAM,SAAS,CAAAA,QAAM,QAAQ,KAAKA,KAAI,IAAI,EAAE;AAInD,IAAM,OAAO;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AACX;AACA,IAAM,OAAO,OAAK,KAAK,CAAC;AAUjB,IAAM,WAAW,QAAM,QAAQ,KAAK,IAAI,IAAI,IAAI;",
"names": ["es"]
}

6779
node_modules/.vite/deps/chunk-WDCEFGHP.js generated vendored Normal file

File diff suppressed because it is too large Load Diff

7
node_modules/.vite/deps/chunk-WDCEFGHP.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

54
node_modules/.vite/deps/chunk-WM2KMMIK.js generated vendored Normal file
View File

@@ -0,0 +1,54 @@
import {
settings
} from "./chunk-LEX3GG7N.js";
// node_modules/astro/dist/runtime/client/dev-toolbar/apps/utils/window.js
function createWindowElement(content, placement = settings.config.placement) {
const windowElement = document.createElement("astro-dev-toolbar-window");
windowElement.innerHTML = content;
windowElement.placement = placement;
return windowElement;
}
function closeOnOutsideClick(eventTarget, additionalCheck) {
function onPageClick(event) {
const target = event.target;
if (!target) return;
if (!target.closest) return;
if (target.closest("astro-dev-toolbar")) return;
if (additionalCheck && additionalCheck(target)) return;
eventTarget.dispatchEvent(
new CustomEvent("toggle-app", {
detail: {
state: false
}
})
);
}
eventTarget.addEventListener("app-toggled", (event) => {
if (event.detail.state === true) {
document.addEventListener("click", onPageClick, true);
} else {
document.removeEventListener("click", onPageClick, true);
}
});
}
function synchronizePlacementOnUpdate(eventTarget, canvas) {
eventTarget.addEventListener("placement-updated", (evt) => {
if (!(evt instanceof CustomEvent)) {
return;
}
const windowElement = canvas.querySelector("astro-dev-toolbar-window");
if (!windowElement) {
return;
}
const event = evt;
windowElement.placement = event.detail.placement;
});
}
export {
createWindowElement,
closeOnOutsideClick,
synchronizePlacementOnUpdate
};
//# sourceMappingURL=chunk-WM2KMMIK.js.map

7
node_modules/.vite/deps/chunk-WM2KMMIK.js.map generated vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../astro/dist/runtime/client/dev-toolbar/apps/utils/window.js"],
"sourcesContent": ["import { settings } from \"../../settings.js\";\nfunction createWindowElement(content, placement = settings.config.placement) {\n const windowElement = document.createElement(\"astro-dev-toolbar-window\");\n windowElement.innerHTML = content;\n windowElement.placement = placement;\n return windowElement;\n}\nfunction closeOnOutsideClick(eventTarget, additionalCheck) {\n function onPageClick(event) {\n const target = event.target;\n if (!target) return;\n if (!target.closest) return;\n if (target.closest(\"astro-dev-toolbar\")) return;\n if (additionalCheck && additionalCheck(target)) return;\n eventTarget.dispatchEvent(\n new CustomEvent(\"toggle-app\", {\n detail: {\n state: false\n }\n })\n );\n }\n eventTarget.addEventListener(\"app-toggled\", (event) => {\n if (event.detail.state === true) {\n document.addEventListener(\"click\", onPageClick, true);\n } else {\n document.removeEventListener(\"click\", onPageClick, true);\n }\n });\n}\nfunction synchronizePlacementOnUpdate(eventTarget, canvas) {\n eventTarget.addEventListener(\"placement-updated\", (evt) => {\n if (!(evt instanceof CustomEvent)) {\n return;\n }\n const windowElement = canvas.querySelector(\"astro-dev-toolbar-window\");\n if (!windowElement) {\n return;\n }\n const event = evt;\n windowElement.placement = event.detail.placement;\n });\n}\nexport {\n closeOnOutsideClick,\n createWindowElement,\n synchronizePlacementOnUpdate\n};\n"],
"mappings": ";;;;;AACA,SAAS,oBAAoB,SAAS,YAAY,SAAS,OAAO,WAAW;AAC3E,QAAM,gBAAgB,SAAS,cAAc,0BAA0B;AACvE,gBAAc,YAAY;AAC1B,gBAAc,YAAY;AAC1B,SAAO;AACT;AACA,SAAS,oBAAoB,aAAa,iBAAiB;AACzD,WAAS,YAAY,OAAO;AAC1B,UAAM,SAAS,MAAM;AACrB,QAAI,CAAC,OAAQ;AACb,QAAI,CAAC,OAAO,QAAS;AACrB,QAAI,OAAO,QAAQ,mBAAmB,EAAG;AACzC,QAAI,mBAAmB,gBAAgB,MAAM,EAAG;AAChD,gBAAY;AAAA,MACV,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,cAAY,iBAAiB,eAAe,CAAC,UAAU;AACrD,QAAI,MAAM,OAAO,UAAU,MAAM;AAC/B,eAAS,iBAAiB,SAAS,aAAa,IAAI;AAAA,IACtD,OAAO;AACL,eAAS,oBAAoB,SAAS,aAAa,IAAI;AAAA,IACzD;AAAA,EACF,CAAC;AACH;AACA,SAAS,6BAA6B,aAAa,QAAQ;AACzD,cAAY,iBAAiB,qBAAqB,CAAC,QAAQ;AACzD,QAAI,EAAE,eAAe,cAAc;AACjC;AAAA,IACF;AACA,UAAM,gBAAgB,OAAO,cAAc,0BAA0B;AACrE,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AACA,UAAM,QAAQ;AACd,kBAAc,YAAY,MAAM,OAAO;AAAA,EACzC,CAAC;AACH;",
"names": []
}

3757
node_modules/.vite/deps/chunk-WTIA47ZU.js generated vendored Normal file

File diff suppressed because one or more lines are too long

7
node_modules/.vite/deps/chunk-WTIA47ZU.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

48
node_modules/.vite/deps/chunk-ZUETELRC.js generated vendored Normal file

File diff suppressed because one or more lines are too long

7
node_modules/.vite/deps/chunk-ZUETELRC.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

3
node_modules/.vite/deps/package.json generated vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"type": "module"
}

213
node_modules/.vite/deps/settings-K4OHAGC2.js generated vendored Normal file
View File

@@ -0,0 +1,213 @@
import {
closeOnOutsideClick,
createWindowElement,
synchronizePlacementOnUpdate
} from "./chunk-WM2KMMIK.js";
import {
isValidPlacement,
placements,
settings
} from "./chunk-LEX3GG7N.js";
import "./chunk-5WRI5ZAA.js";
// node_modules/astro/dist/runtime/client/dev-toolbar/apps/settings.js
var settingsRows = [
{
name: "Disable notifications",
description: "Hide notification badges in the toolbar.",
input: "checkbox",
settingKey: "disableAppNotification",
changeEvent: (evt) => {
if (evt.currentTarget instanceof HTMLInputElement) {
const devToolbar = document.querySelector("astro-dev-toolbar");
if (devToolbar) {
devToolbar.setNotificationVisible(!evt.currentTarget.checked);
}
settings.updateSetting("disableAppNotification", evt.currentTarget.checked);
const action = evt.currentTarget.checked ? "disabled" : "enabled";
settings.logger.verboseLog(`App notification badges ${action}`);
}
}
},
{
name: "Verbose logging",
description: "Logs dev toolbar events in the browser console.",
input: "checkbox",
settingKey: "verbose",
changeEvent: (evt) => {
if (evt.currentTarget instanceof HTMLInputElement) {
settings.updateSetting("verbose", evt.currentTarget.checked);
const action = evt.currentTarget.checked ? "enabled" : "disabled";
settings.logger.verboseLog(`Verbose logging ${action}`);
}
}
},
{
name: "Placement",
description: "Adjust the placement of the dev toolbar.",
input: "select",
settingKey: "placement",
changeEvent: (evt) => {
if (evt.currentTarget instanceof HTMLSelectElement) {
const placement = evt.currentTarget.value;
if (isValidPlacement(placement)) {
document.querySelector("astro-dev-toolbar")?.setToolbarPlacement(placement);
settings.updateSetting("placement", placement);
settings.logger.verboseLog(`Placement set to ${placement}`);
}
}
}
}
];
var settings_default = {
id: "astro:settings",
name: "Settings",
icon: "gear",
init(canvas, eventTarget) {
createSettingsWindow();
document.addEventListener("astro:after-swap", createSettingsWindow);
closeOnOutsideClick(eventTarget);
synchronizePlacementOnUpdate(eventTarget, canvas);
function createSettingsWindow() {
const windowElement = createWindowElement(
`<style>
:host astro-dev-toolbar-window {
height: 480px;
overflow-y: auto;
color-scheme: dark;
--color-purple: rgba(224, 204, 250, 1);
}
header {
display: flex;
}
h2, h3 {
margin-top: 0;
}
.setting-row {
display: flex;
justify-content: space-between;
align-items: center;
}
h3 {
font-size: 16px;
font-weight: 400;
color: white;
margin-bottom: 4px;
}
label {
font-size: 14px;
line-height: 1.5rem;
}
h1 {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
color: #fff;
margin: 0;
font-size: 22px;
}
astro-dev-toolbar-icon {
width: 1em;
height: 1em;
display: block;
}
code {
color: var(--color-purple);
border-color: #343841;
border-style: solid;
border-width: 1px;
border-radius: .4em;
background-color: #24262D;
padding: .3em;
}
label > section {
max-width: 67%;
}
label > section.full-width {
max-width: 100%;
}
p {
line-height: 1.5em;
}
a, a:visited {
color: var(--color-purple);
}
a:hover {
color: #f4ecfd;
}
</style>
<header>
<h1><astro-dev-toolbar-icon icon="gear"></astro-dev-toolbar-icon> Settings</h1>
</header>
<hr id="general"/>
<label class="setting-row">
<section class="full-width">
<h3>Hide toolbar</h3>
Run <code>astro preferences disable devToolbar</code> in your terminal to disable the toolbar. <a href="https://docs.astro.build/en/reference/cli-reference/#astro-preferences" target="_blank">Learn more</a>.
</section>
</label>
`
);
const general = windowElement.querySelector("#general");
for (const settingsRow of settingsRows) {
general.after(document.createElement("hr"));
general.after(getElementForSettingAsString(settingsRow));
}
canvas.append(windowElement);
function getElementForSettingAsString(setting) {
const label = document.createElement("label");
label.classList.add("setting-row");
const section = document.createElement("section");
section.innerHTML = `<h3>${setting.name}</h3>${setting.description}`;
label.append(section);
switch (setting.input) {
case "checkbox": {
const astroToggle = document.createElement("astro-dev-toolbar-toggle");
astroToggle.input.addEventListener("change", setting.changeEvent);
astroToggle.input.checked = settings.config[setting.settingKey];
label.append(astroToggle);
break;
}
case "select": {
const astroSelect = document.createElement("astro-dev-toolbar-select");
placements.forEach((placement) => {
const option = document.createElement("option");
option.setAttribute("value", placement);
if (placement === settings.config[setting.settingKey]) {
option.selected = true;
}
option.textContent = `${placement.slice(0, 1).toUpperCase()}${placement.slice(
1
)}`.replace("-", " ");
astroSelect.append(option);
});
astroSelect.element.addEventListener("change", setting.changeEvent);
label.append(astroSelect);
break;
}
case "number":
case "text":
default:
break;
}
return label;
}
}
}
};
export {
settings_default as default
};
//# sourceMappingURL=settings-K4OHAGC2.js.map

7
node_modules/.vite/deps/settings-K4OHAGC2.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

525
node_modules/.vite/deps/toolbar-2H5PSQQU.js generated vendored Normal file
View File

@@ -0,0 +1,525 @@
import {
serverHelpers
} from "./chunk-HNT3PLDI.js";
import {
getIconElement,
isDefinedIcon
} from "./chunk-ZUETELRC.js";
import {
settings
} from "./chunk-LEX3GG7N.js";
import "./chunk-5WRI5ZAA.js";
// node_modules/astro/dist/runtime/client/dev-toolbar/toolbar.js
var WS_EVENT_NAME = "astro-dev-toolbar";
var HOVER_DELAY = 2 * 1e3;
var DEVBAR_HITBOX_ABOVE = 42;
var AstroDevToolbar = class extends HTMLElement {
shadowRoot;
delayedHideTimeout;
devToolbarContainer;
apps = [];
hasBeenInitialized = false;
// TODO: This should be dynamic based on the screen size or at least configurable, erika - 2023-11-29
customAppsToShow = 3;
constructor() {
super();
this.shadowRoot = this.attachShadow({ mode: "open" });
}
/**
* All one-time DOM setup runs through here. Only ever call this once,
* in connectedCallback(), and protect it from being called again.
*/
init() {
this.shadowRoot.innerHTML = `
<style>
:host {
/* Important! Reset all inherited styles to initial */
all: initial;
z-index: 999999;
view-transition-name: astro-dev-toolbar;
display: contents;
/* Hide the dev toolbar on window.print() (CTRL + P) */
@media print {
display: none;
}
}
::view-transition-old(astro-dev-toolbar),
::view-transition-new(astro-dev-toolbar) {
animation: none;
}
#dev-toolbar-root {
position: fixed;
bottom: 0px;
z-index: 2000000010;
display: flex;
flex-direction: column;
align-items: center;
transition: bottom 0.35s cubic-bezier(0.485, -0.050, 0.285, 1.505);
pointer-events: none;
}
#dev-toolbar-root[data-hidden] {
bottom: -40px;
}
#dev-toolbar-root[data-hidden] #dev-bar .item {
opacity: 0.2;
}
#dev-toolbar-root[data-placement="bottom-left"] {
left: 16px;
}
#dev-toolbar-root[data-placement="bottom-center"] {
left: 50%;
transform: translateX(-50%);
}
#dev-toolbar-root[data-placement="bottom-right"] {
right: 16px;
}
#dev-bar-hitbox-above,
#dev-bar-hitbox-below {
width: 100%;
pointer-events: auto;
}
#dev-bar-hitbox-above {
height: ${DEVBAR_HITBOX_ABOVE}px;
}
#dev-bar-hitbox-below {
height: 16px;
}
#dev-bar {
height: 40px;
overflow: hidden;
pointer-events: auto;
background: linear-gradient(180deg, #13151A 0%, rgba(19, 21, 26, 0.88) 100%);
border: 1px solid #343841;
border-radius: 9999px;
box-shadow: 0px 0px 0px 0px rgba(19, 21, 26, 0.30), 0px 1px 2px 0px rgba(19, 21, 26, 0.29), 0px 4px 4px 0px rgba(19, 21, 26, 0.26), 0px 10px 6px 0px rgba(19, 21, 26, 0.15), 0px 17px 7px 0px rgba(19, 21, 26, 0.04), 0px 26px 7px 0px rgba(19, 21, 26, 0.01);
}
@media (forced-colors: active) {
#dev-bar {
background: white;
}
}
#dev-bar .item {
display: flex;
justify-content: center;
align-items: center;
width: 44px;
border: 0;
background: transparent;
color: white;
font-family: system-ui, sans-serif;
font-size: 1rem;
line-height: 1.2;
white-space: nowrap;
text-decoration: none;
padding: 0;
margin: 0;
overflow: hidden;
transition: opacity 0.2s ease-out 0s;
}
#dev-bar #bar-container .item:hover, #dev-bar #bar-container .item:focus-visible {
background: #FFFFFF20;
cursor: pointer;
outline-offset: -3px;
}
#dev-bar #bar-container .item[data-app-error]:hover, #dev-bar #bar-container .item[data-app-error]:focus-visible {
cursor: not-allowed;
background: #ff252520;
}
#dev-bar .item:first-of-type {
border-top-left-radius: 9999px;
border-bottom-left-radius: 9999px;
width: 42px;
padding-left: 4px;
}
#dev-bar .item:last-of-type {
border-top-right-radius: 9999px;
border-bottom-right-radius: 9999px;
width: 42px;
padding-right: 4px;
}
#dev-bar #bar-container .item.active {
background: rgba(71, 78, 94, 1);
}
#dev-bar .item-tooltip {
background: linear-gradient(0deg, #13151A, #13151A), linear-gradient(0deg, #343841, #343841);
border: 1px solid rgba(52, 56, 65, 1);
border-radius: 4px;
padding: 4px 8px;
position: absolute;
top: ${4 - DEVBAR_HITBOX_ABOVE}px;
font-size: 14px;
opacity: 0;
transition: opacity 0.2s ease-in-out 0s;
pointer-events: none;
user-select: none;
}
#dev-bar .item-tooltip::after{
content: '';
position: absolute;
left: calc(50% - 5px);
bottom: -6px;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-top: 5px solid #343841;
}
#dev-bar .item[data-app-error] .icon {
opacity: 0.35;
}
#dev-bar .item:hover .item-tooltip, #dev-bar .item:not(.active):focus-visible .item-tooltip {
transition: opacity 0.2s ease-in-out 200ms;
opacity: 1;
}
@media (forced-colors: active) {
#dev-bar .item:hover .item-tooltip,
#dev-bar .item:not(.active):focus-visible .item-tooltip {
background: white;
}
}
#dev-bar #bar-container .item:hover .notification rect, #dev-bar #bar-container .item:hover .notification path {
stroke: #38393D;
--fill: var(--fill-hover);
}
#dev-bar #bar-container .item.active .notification rect, #dev-bar #bar-container .item.active .notification path {
stroke: #454C5C;
--fill: var(--fill-hover);
}
#dev-bar .item .icon {
position: relative;
max-width: 20px;
max-height: 20px;
user-select: none;
}
#dev-bar .item .icon>svg {
width: 20px;
height: 20px;
display: block;
margin: auto;
}
@media (forced-colors: active) {
#dev-bar .item svg path[fill="#fff"] {
fill: black;
}
}
#dev-bar .item .notification {
display: none;
position: absolute;
top: -4px;
right: -6px;
width: 10px;
height: 10px;
}
#dev-bar .item .notification svg {
display: block;
}
#dev-toolbar-root:not([data-no-notification]) #dev-bar .item .notification[data-active] {
display: block;
}
#dev-bar #bar-container {
height: 100%;
display: flex;
}
#dev-bar .separator {
background: rgba(52, 56, 65, 1);
width: 1px;
}
</style>
<div id="dev-toolbar-root" data-hidden ${settings.config.disableAppNotification ? "data-no-notification" : ""} data-placement="${settings.config.placement}">
<div id="dev-bar-hitbox-above"></div>
<div id="dev-bar">
<div id="bar-container">
${this.apps.filter((app) => app.builtIn && !["astro:settings", "astro:more"].includes(app.id)).map((app) => this.getAppTemplate(app)).join("")}
${this.apps.filter((app) => !app.builtIn).length > 0 ? `<div class="separator"></div>${this.apps.filter((app) => !app.builtIn).slice(0, this.customAppsToShow).map((app) => this.getAppTemplate(app)).join("")}` : ""}
${this.apps.filter((app) => !app.builtIn).length > this.customAppsToShow ? this.getAppTemplate(
this.apps.find((app) => app.builtIn && app.id === "astro:more")
) : ""}
<div class="separator"></div>
${this.getAppTemplate(
this.apps.find((app) => app.builtIn && app.id === "astro:settings")
)}
</div>
</div>
<div id="dev-bar-hitbox-below"></div>
</div>`;
this.devToolbarContainer = this.shadowRoot.querySelector("#dev-toolbar-root");
this.attachEvents();
this.apps.forEach(async (app) => {
settings.logger.verboseLog(`Creating app canvas for ${app.id}`);
const appCanvas = document.createElement("astro-dev-toolbar-app-canvas");
appCanvas.dataset.appId = app.id;
this.shadowRoot?.append(appCanvas);
});
if ("requestIdleCallback" in window) {
window.requestIdleCallback(
async () => {
this.apps.map((app) => this.initApp(app));
},
{ timeout: 300 }
);
} else {
setTimeout(async () => {
this.apps.map((app) => this.initApp(app));
}, 300);
}
}
// This is called whenever the component is connected to the DOM.
// This happens on first page load, and on each page change when
// view transitions are used.
connectedCallback() {
if (!this.hasBeenInitialized) {
this.init();
this.hasBeenInitialized = true;
}
this.apps.forEach(async (app) => {
await this.setAppStatus(app, app.active);
});
}
attachEvents() {
const items = this.shadowRoot.querySelectorAll(".item");
items.forEach((item) => {
item.addEventListener("click", async (event) => {
const target = event.currentTarget;
if (!target || !(target instanceof HTMLElement)) return;
const id = target.dataset.appId;
if (!id) return;
const app = this.getAppById(id);
if (!app) return;
event.stopPropagation();
await this.toggleAppStatus(app);
});
});
["mouseenter", "focusin"].forEach((event) => {
this.devToolbarContainer.addEventListener(event, () => {
this.clearDelayedHide();
if (this.isHidden()) {
this.setToolbarVisible(true);
}
});
});
["mouseleave", "focusout"].forEach((event) => {
this.devToolbarContainer.addEventListener(event, () => {
this.clearDelayedHide();
if (this.getActiveApp() || this.isHidden()) {
return;
}
this.triggerDelayedHide();
});
});
document.addEventListener("keyup", (event) => {
if (event.key !== "Escape") return;
if (this.isHidden()) return;
const activeApp = this.getActiveApp();
if (activeApp) {
this.toggleAppStatus(activeApp);
} else {
this.setToolbarVisible(false);
}
});
}
async initApp(app) {
const shadowRoot = this.getAppCanvasById(app.id).shadowRoot;
app.status = "loading";
try {
settings.logger.verboseLog(`Initializing app ${app.id}`);
await app.init?.(shadowRoot, app.eventTarget, serverHelpers);
app.status = "ready";
if (import.meta.hot) {
import.meta.hot.send(`${WS_EVENT_NAME}:${app.id}:initialized`);
}
} catch (e) {
console.error(`Failed to init app ${app.id}, error: ${e}`);
app.status = "error";
if (import.meta.hot) {
import.meta.hot.send("astro:devtoolbar:error:init", {
app,
error: e instanceof Error ? e.stack : e
});
}
const appButton = this.getAppButtonById(app.id);
const appTooltip = appButton?.querySelector(".item-tooltip");
if (appButton && appTooltip) {
appButton.toggleAttribute("data-app-error", true);
appTooltip.innerText = `Error initializing ${app.name}`;
}
}
}
getAppTemplate(app) {
return `<button class="item" data-app-id="${app.id}">
<div class="icon">${app.icon ? getAppIcon(app.icon) : "?"}<div class="notification"></div></div>
<span class="item-tooltip">${app.name}</span>
</button>`;
}
getAppById(id) {
return this.apps.find((app) => app.id === id);
}
getAppCanvasById(id) {
return this.shadowRoot.querySelector(
`astro-dev-toolbar-app-canvas[data-app-id="${id}"]`
);
}
getAppButtonById(id) {
return this.shadowRoot.querySelector(`[data-app-id="${id}"]`);
}
async toggleAppStatus(app) {
const activeApp = this.getActiveApp();
if (activeApp) {
const closeApp = await this.setAppStatus(activeApp, false);
if (!closeApp) return;
}
if (app.status !== "ready") return;
if (app !== activeApp) {
await this.setAppStatus(app, true);
if (import.meta.hot && app.id !== "astro:more") {
import.meta.hot.send("astro:devtoolbar:app:toggled", {
app
});
}
}
}
async setAppStatus(app, newStatus) {
const appCanvas = this.getAppCanvasById(app.id);
if (!appCanvas) return false;
if (app.active && !newStatus && app.beforeTogglingOff) {
const shouldToggleOff = await app.beforeTogglingOff(appCanvas.shadowRoot);
if (!shouldToggleOff) return false;
}
app.active = newStatus ?? !app.active;
const mainBarButton = this.getAppButtonById(app.id);
const moreBarButton = this.getAppCanvasById("astro:more")?.shadowRoot?.querySelector(
`[data-app-id="${app.id}"]`
);
if (mainBarButton) {
mainBarButton.classList.toggle("active", app.active);
}
if (moreBarButton) {
moreBarButton.classList.toggle("active", app.active);
}
if (app.active) {
appCanvas.style.display = "block";
appCanvas.setAttribute("data-active", "");
} else {
appCanvas.style.display = "none";
appCanvas.removeAttribute("data-active");
}
app.eventTarget.dispatchEvent(
new CustomEvent("app-toggled", {
detail: {
state: app.active,
app
}
})
);
import.meta.hot?.send(`${WS_EVENT_NAME}:${app.id}:toggled`, { state: app.active });
return true;
}
isHidden() {
return this.devToolbarContainer?.hasAttribute("data-hidden") ?? true;
}
getActiveApp() {
return this.apps.find((app) => app.active);
}
clearDelayedHide() {
window.clearTimeout(this.delayedHideTimeout);
this.delayedHideTimeout = void 0;
}
triggerDelayedHide() {
this.clearDelayedHide();
this.delayedHideTimeout = window.setTimeout(() => {
this.setToolbarVisible(false);
this.delayedHideTimeout = void 0;
}, HOVER_DELAY);
}
setToolbarVisible(newStatus) {
const barContainer = this.shadowRoot.querySelector("#bar-container");
const devBar = this.shadowRoot.querySelector("#dev-bar");
const devBarHitboxAbove = this.shadowRoot.querySelector("#dev-bar-hitbox-above");
if (newStatus === true) {
this.devToolbarContainer?.removeAttribute("data-hidden");
barContainer?.removeAttribute("inert");
devBar?.removeAttribute("tabindex");
if (devBarHitboxAbove) devBarHitboxAbove.style.height = "0";
return;
}
if (newStatus === false) {
this.devToolbarContainer?.setAttribute("data-hidden", "");
barContainer?.setAttribute("inert", "");
devBar?.setAttribute("tabindex", "0");
if (devBarHitboxAbove) devBarHitboxAbove.style.height = `${DEVBAR_HITBOX_ABOVE}px`;
return;
}
}
setNotificationVisible(newStatus) {
this.devToolbarContainer?.toggleAttribute("data-no-notification", !newStatus);
const moreCanvas = this.getAppCanvasById("astro:more");
moreCanvas?.shadowRoot?.querySelector("#dropdown")?.toggleAttribute("data-no-notification", !newStatus);
}
setToolbarPlacement(newPlacement) {
this.devToolbarContainer?.setAttribute("data-placement", newPlacement);
this.apps.forEach((app) => {
app.eventTarget.dispatchEvent(
new CustomEvent("placement-updated", {
detail: {
placement: newPlacement
}
})
);
});
}
};
var DevToolbarCanvas = class extends HTMLElement {
shadowRoot;
constructor() {
super();
this.shadowRoot = this.attachShadow({ mode: "open" });
}
connectedCallback() {
this.shadowRoot.innerHTML = `
<style>
:host {
position: absolute;
top: 0;
left: 0;
}
</style>`;
}
};
function getAppIcon(icon) {
if (isDefinedIcon(icon)) {
return getIconElement(icon).outerHTML;
}
return icon;
}
export {
AstroDevToolbar,
DevToolbarCanvas,
getAppIcon
};
//# sourceMappingURL=toolbar-2H5PSQQU.js.map

7
node_modules/.vite/deps/toolbar-2H5PSQQU.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

1020
node_modules/.vite/deps/ui-library-EVFCBMCE.js generated vendored Normal file

File diff suppressed because it is too large Load Diff

7
node_modules/.vite/deps/ui-library-EVFCBMCE.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

147
node_modules/.vite/deps/xray-XH6VIXDC.js generated vendored Normal file
View File

@@ -0,0 +1,147 @@
import {
attachTooltipToHighlight,
createHighlight,
getElementsPositionInDocument,
positionHighlight
} from "./chunk-LEAOZWS7.js";
import {
escape
} from "./chunk-PXGSXSC7.js";
import {
closeOnOutsideClick,
createWindowElement,
synchronizePlacementOnUpdate
} from "./chunk-WM2KMMIK.js";
import "./chunk-LEX3GG7N.js";
import "./chunk-5WRI5ZAA.js";
// node_modules/astro/dist/runtime/client/dev-toolbar/apps/xray.js
var icon = '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" aria-hidden="true"><path fill="#fff" d="M7.9 1.5v-.4a1.1 1.1 0 0 1 2.2 0v.4a1.1 1.1 0 1 1-2.2 0Zm-6.4 8.6a1.1 1.1 0 1 0 0-2.2h-.4a1.1 1.1 0 0 0 0 2.2h.4ZM12 3.7a1.1 1.1 0 0 0 1.4-.7l.4-1.1a1.1 1.1 0 0 0-2.1-.8l-.4 1.2a1.1 1.1 0 0 0 .7 1.4Zm-9.7 7.6-1.2.4a1.1 1.1 0 1 0 .8 2.1l1-.4a1.1 1.1 0 1 0-.6-2ZM20.8 17a1.9 1.9 0 0 1 0 2.6l-1.2 1.2a1.9 1.9 0 0 1-2.6 0l-4.3-4.2-1.6 3.6a1.9 1.9 0 0 1-1.7 1.2A1.9 1.9 0 0 1 7.5 20L2.7 5a1.9 1.9 0 0 1 2.4-2.4l15 5a1.9 1.9 0 0 1 .2 3.4l-3.7 1.6 4.2 4.3ZM19 18.3 14.6 14a1.9 1.9 0 0 1 .6-3l3.2-1.5L5.1 5.1l4.3 13.3 1.5-3.2a1.9 1.9 0 0 1 3-.6l4.4 4.4.7-.7Z"/></svg>';
var xray_default = {
id: "astro:xray",
name: "Inspect",
icon,
init(canvas, eventTarget) {
let islandsOverlays = [];
addIslandsOverlay();
document.addEventListener("astro:after-swap", addIslandsOverlay);
document.addEventListener("astro:page-load", refreshIslandsOverlayPositions);
closeOnOutsideClick(eventTarget);
synchronizePlacementOnUpdate(eventTarget, canvas);
function addIslandsOverlay() {
islandsOverlays.forEach(({ highlightElement }) => {
highlightElement.remove();
});
islandsOverlays = [];
const islands = document.querySelectorAll("astro-island");
if (islands.length === 0) {
const window2 = createWindowElement(
`<style>
header {
display: flex;
}
h1 {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
color: #fff;
margin: 0;
font-size: 22px;
}
astro-dev-toolbar-icon {
width: 1em;
height: 1em;
padding: 8px;
display: block;
background: #5f9ea0;
border-radius: 9999px;
}
</style>
<header>
<h1><astro-dev-toolbar-icon icon="lightbulb"></astro-dev-toolbar-icon>No islands detected.</h1>
</header>
<p>
It looks like there are no interactive component islands on this page. Did you forget to add a client directive to your interactive UI component?
</p>
`
);
canvas.append(window2);
return;
}
islands.forEach((island) => {
const computedStyle = window.getComputedStyle(island);
const islandElement = island.children[0] || island;
if (islandElement.offsetParent === null || computedStyle.display === "none") {
return;
}
const rect = islandElement.getBoundingClientRect();
const highlight = createHighlight(rect);
const tooltip = buildIslandTooltip(island);
const { isFixed } = getElementsPositionInDocument(islandElement);
if (isFixed) {
tooltip.style.position = highlight.style.position = "fixed";
}
attachTooltipToHighlight(highlight, tooltip, islandElement);
canvas.append(highlight);
islandsOverlays.push({ highlightElement: highlight, island: islandElement });
});
["scroll", "resize"].forEach((event) => {
window.addEventListener(event, refreshIslandsOverlayPositions);
});
}
function refreshIslandsOverlayPositions() {
islandsOverlays.forEach(({ highlightElement, island: islandElement }) => {
const rect = islandElement.getBoundingClientRect();
positionHighlight(highlightElement, rect);
});
}
function buildIslandTooltip(island) {
const tooltip = document.createElement("astro-dev-toolbar-tooltip");
tooltip.sections = [];
const islandProps = island.getAttribute("props") ? JSON.parse(island.getAttribute("props")) : {};
const islandClientDirective = island.getAttribute("client");
if (islandClientDirective) {
tooltip.sections.push({
title: "Client directive",
inlineTitle: `<code>client:${islandClientDirective}</code>`
});
}
const islandPropsEntries = Object.entries(islandProps).filter(
(prop) => !prop[0].startsWith("data-astro-cid-")
);
if (islandPropsEntries.length > 0) {
const stringifiedProps = JSON.stringify(
Object.fromEntries(islandPropsEntries.map((prop) => [prop[0], prop[1][1]])),
void 0,
2
);
tooltip.sections.push({
title: "Props",
content: `<pre><code>${escape(stringifiedProps)}</code></pre>`
});
}
const islandComponentPath = island.getAttribute("component-url");
if (islandComponentPath) {
tooltip.sections.push({
content: islandComponentPath,
clickDescription: "Click to go to file",
async clickAction() {
await fetch(
"/__open-in-editor?file=" + encodeURIComponent(
window.__astro_dev_toolbar__.root + islandComponentPath.slice(1)
)
);
}
});
}
return tooltip;
}
}
};
export {
xray_default as default
};
//# sourceMappingURL=xray-XH6VIXDC.js.map

7
node_modules/.vite/deps/xray-XH6VIXDC.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

53
node_modules/@astrojs/compiler/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,53 @@
MIT License
Copyright (c) 2021 [Astro contributors](https://github.com/withastro/compiler/graphs/contributors)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"""
This license applies to parts of the `internal/` subdirectory originating from
the https://cs.opensource.google/go/x/net/+/master:html/ repository:
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

72
node_modules/@astrojs/compiler/README.md generated vendored Normal file
View File

@@ -0,0 +1,72 @@
# Astro Compiler
Astros [Go](https://golang.org/) + WASM compiler.
## Install
```
npm install @astrojs/compiler
```
## Usage
#### Transform `.astro` to valid TypeScript
The Astro compiler can convert `.astro` syntax to a TypeScript Module whose default export generates HTML.
**Some notes**...
- TypeScript is valid `.astro` syntax! The output code may need an additional post-processing step to generate valid JavaScript.
- `.astro` files rely on a server implementation exposed as `astro/runtime/server/index.js` in the Node ecosystem. Other runtimes currently need to bring their own rendering implementation and reference it via `internalURL`. This is a pain point we're looking into fixing.
```js
import { transform, type TransformResult } from "@astrojs/compiler";
const result = await transform(source, {
filename: "/Users/astro/Code/project/src/pages/index.astro",
sourcemap: "both",
internalURL: "astro/runtime/server/index.js",
});
```
#### Parse `.astro` and return an AST
The Astro compiler can emit an AST using the `parse` method.
**Some notes**...
- Position data is currently incomplete and in some cases incorrect. We're working on it!
- A `TextNode` can represent both HTML `text` and JavaScript/TypeScript source code.
- The `@astrojs/compiler/utils` entrypoint exposes `walk` and `walkAsync` functions that can be used to traverse the AST. It also exposes the `is` helper which can be used as guards to derive the proper types for each `node`.
```js
import { parse } from "@astrojs/compiler";
import { walk, walkAsync, is } from "@astrojs/compiler/utils";
const result = await parse(source, {
position: false, // defaults to `true`
});
walk(result.ast, (node) => {
// `tag` nodes are `element` | `custom-element` | `component`
if (is.tag(node)) {
console.log(node.name);
}
});
await walkAsync(result.ast, async (node) => {
if (is.tag(node)) {
node.value = await expensiveCalculation(node)
}
});
```
## Develop
### VSCode / CodeSpaces
A `devcontainer` configuration is available for use with VSCode's [Remote Development extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) and GitHub CodeSpaces.
## Contributing
[CONTRIBUTING.md](/CONTRIBUTING.md)

BIN
node_modules/@astrojs/compiler/dist/astro.wasm generated vendored Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

11
node_modules/@astrojs/compiler/dist/browser/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,11 @@
import { transform as transform$1, parse as parse$1, convertToTSX as convertToTSX$1, teardown as teardown$1, initialize as initialize$1 } from '../shared/types.js';
import '../shared/ast.js';
import '../shared/diagnostics.js';
declare const transform: typeof transform$1;
declare const parse: typeof parse$1;
declare const convertToTSX: typeof convertToTSX$1;
declare const teardown: typeof teardown$1;
declare const initialize: typeof initialize$1;
export { convertToTSX, initialize, parse, teardown, transform };

1
node_modules/@astrojs/compiler/dist/browser/index.js generated vendored Normal file
View File

@@ -0,0 +1 @@
import{a as f}from"../chunk-QR6QDSEV.js";var u=(t,e)=>p().transform(t,e),S=(t,e)=>p().parse(t,e),v=(t,e)=>p().convertToTSX(t,e),a,i,h=()=>{a=void 0,i=void 0,globalThis["@astrojs/compiler"]=void 0},T=async t=>{let e=t.wasmURL;if(!e)throw new Error('Must provide the "wasmURL" option');e+="",a||(a=m(e).catch(n=>{throw a=void 0,n})),i=i||await a},p=()=>{if(!a)throw new Error('You need to call "initialize" before calling this');if(!i)throw new Error('You need to wait for the promise returned from "initialize" to be resolved before calling this');return i},y=async(t,e)=>{let n;return WebAssembly.instantiateStreaming?n=await WebAssembly.instantiateStreaming(fetch(t),e):n=await(async()=>{let s=await fetch(t).then(o=>o.arrayBuffer());return WebAssembly.instantiate(s,e)})(),n},m=async t=>{let e=new f,n=await y(t,e.importObject);e.run(n.instance);let c=globalThis["@astrojs/compiler"];return{transform:(s,o)=>new Promise(r=>r(c.transform(s,o||{}))),convertToTSX:(s,o)=>new Promise(r=>r(c.convertToTSX(s,o||{}))).then(r=>({...r,map:JSON.parse(r.map)})),parse:(s,o)=>new Promise(r=>r(c.parse(s,o||{}))).then(r=>({...r,ast:JSON.parse(r.ast)}))}};export{v as convertToTSX,T as initialize,S as parse,h as teardown,u as transform};

View File

@@ -0,0 +1,3 @@
"use strict";var c=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var u=(o,e)=>{for(var t in e)c(o,t,{get:e[t],enumerable:!0})},f=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of p(e))!N.call(o,r)&&r!==t&&c(o,r,{get:()=>e[r],enumerable:!(a=d(e,r))||a.enumerable});return o};var y=o=>f(c({},"__esModule",{value:!0}),o);var v={};u(v,{is:()=>s,serialize:()=>k,walk:()=>h,walkAsync:()=>x});module.exports=y(v);function n(o){return e=>e.type===o}var s={parent(o){return Array.isArray(o.children)},literal(o){return typeof o.value=="string"},tag(o){return o.type==="element"||o.type==="custom-element"||o.type==="component"||o.type==="fragment"},whitespace(o){return o.type==="text"&&o.value.trim().length===0},root:n("root"),element:n("element"),customElement:n("custom-element"),component:n("component"),fragment:n("fragment"),expression:n("expression"),text:n("text"),doctype:n("doctype"),comment:n("comment"),frontmatter:n("frontmatter")},l=class{constructor(e){this.callback=e}async visit(e,t,a){if(await this.callback(e,t,a),s.parent(e)){let r=[];for(let i=0;i<e.children.length;i++){let m=e.children[i];r.push(this.callback(m,e,i))}await Promise.all(r)}}};function h(o,e){new l(e).visit(o)}function x(o,e){return new l(e).visit(o)}function g(o){let e="";for(let t of o.attributes)switch(e+=" ",t.kind){case"empty":{e+=`${t.name}`;break}case"expression":{e+=`${t.name}={${t.value}}`;break}case"quoted":{e+=`${t.name}=${t.raw}`;break}case"template-literal":{e+=`${t.name}=\`${t.value}\``;break}case"shorthand":{e+=`{${t.name}}`;break}case"spread":{e+=`{...${t.value}}`;break}}return e}function k(o,e={selfClose:!0}){let t="";function a(r){if(s.root(r))for(let i of r.children)a(i);else if(s.frontmatter(r))t+=`---${r.value}---
`;else if(s.comment(r))t+=`<!--${r.value}-->`;else if(s.expression(r)){t+="{";for(let i of r.children)a(i);t+="}"}else if(s.literal(r))t+=r.value;else if(s.tag(r))if(t+=`<${r.name}`,t+=g(r),r.children.length===0&&e.selfClose)t+=" />";else{t+=">";for(let i of r.children)a(i);t+=`</${r.name}>`}}return a(o),t}0&&(module.exports={is,serialize,walk,walkAsync});

29
node_modules/@astrojs/compiler/dist/browser/utils.d.ts generated vendored Normal file
View File

@@ -0,0 +1,29 @@
import { Node, ParentNode, LiteralNode, TagLikeNode, TextNode, RootNode, ElementNode, CustomElementNode, ComponentNode, FragmentNode, ExpressionNode, DoctypeNode, CommentNode, FrontmatterNode } from '../shared/ast.js';
type Visitor = (node: Node, parent?: ParentNode, index?: number) => void | Promise<void>;
declare const is: {
parent(node: Node): node is ParentNode;
literal(node: Node): node is LiteralNode;
tag(node: Node): node is TagLikeNode;
whitespace(node: Node): node is TextNode;
root: (node: Node) => node is RootNode;
element: (node: Node) => node is ElementNode;
customElement: (node: Node) => node is CustomElementNode;
component: (node: Node) => node is ComponentNode;
fragment: (node: Node) => node is FragmentNode;
expression: (node: Node) => node is ExpressionNode;
text: (node: Node) => node is TextNode;
doctype: (node: Node) => node is DoctypeNode;
comment: (node: Node) => node is CommentNode;
frontmatter: (node: Node) => node is FrontmatterNode;
};
declare function walk(node: ParentNode, callback: Visitor): void;
declare function walkAsync(node: ParentNode, callback: Visitor): Promise<void>;
interface SerializeOptions {
selfClose: boolean;
}
/** @deprecated Please use `SerializeOptions` */
type SerializeOtions = SerializeOptions;
declare function serialize(root: Node, opts?: SerializeOptions): string;
export { SerializeOptions, SerializeOtions, Visitor, is, serialize, walk, walkAsync };

3
node_modules/@astrojs/compiler/dist/browser/utils.js generated vendored Normal file
View File

@@ -0,0 +1,3 @@
function n(o){return t=>t.type===o}var a={parent(o){return Array.isArray(o.children)},literal(o){return typeof o.value=="string"},tag(o){return o.type==="element"||o.type==="custom-element"||o.type==="component"||o.type==="fragment"},whitespace(o){return o.type==="text"&&o.value.trim().length===0},root:n("root"),element:n("element"),customElement:n("custom-element"),component:n("component"),fragment:n("fragment"),expression:n("expression"),text:n("text"),doctype:n("doctype"),comment:n("comment"),frontmatter:n("frontmatter")},l=class{constructor(t){this.callback=t}async visit(t,e,s){if(await this.callback(t,e,s),a.parent(t)){let r=[];for(let i=0;i<t.children.length;i++){let c=t.children[i];r.push(this.callback(c,t,i))}await Promise.all(r)}}};function N(o,t){new l(t).visit(o)}function u(o,t){return new l(t).visit(o)}function m(o){let t="";for(let e of o.attributes)switch(t+=" ",e.kind){case"empty":{t+=`${e.name}`;break}case"expression":{t+=`${e.name}={${e.value}}`;break}case"quoted":{t+=`${e.name}=${e.raw}`;break}case"template-literal":{t+=`${e.name}=\`${e.value}\``;break}case"shorthand":{t+=`{${e.name}}`;break}case"spread":{t+=`{...${e.value}}`;break}}return t}function f(o,t={selfClose:!0}){let e="";function s(r){if(a.root(r))for(let i of r.children)s(i);else if(a.frontmatter(r))e+=`---${r.value}---
`;else if(a.comment(r))e+=`<!--${r.value}-->`;else if(a.expression(r)){e+="{";for(let i of r.children)s(i);e+="}"}else if(a.literal(r))e+=r.value;else if(a.tag(r))if(e+=`<${r.name}`,e+=m(r),r.children.length===0&&t.selfClose)e+=" />";else{e+=">";for(let i of r.children)s(i);e+=`</${r.name}>`}}return s(o),e}export{a as is,f as serialize,N as walk,u as walkAsync};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
declare class Go {
importObject: {
gojs: {
'runtime.wasmExit': (sp: any) => void;
'runtime.wasmWrite': (sp: any) => void;
'runtime.resetMemoryDataView': (sp: any) => void;
'runtime.nanotime1': (sp: any) => void;
'runtime.walltime': (sp: any) => void;
'runtime.scheduleTimeoutEvent': (sp: any) => void;
'runtime.clearTimeoutEvent': (sp: any) => void;
'runtime.getRandomData': (sp: any) => void;
'syscall/js.finalizeRef': (sp: any) => void;
'syscall/js.stringVal': (sp: any) => void;
'syscall/js.valueGet': (sp: any) => void;
'syscall/js.valueSet': (sp: any) => void;
'syscall/js.valueDelete': (sp: any) => void;
'syscall/js.valueIndex': (sp: any) => void;
'syscall/js.valueSetIndex': (sp: any) => void;
'syscall/js.valueCall': (sp: any) => void;
'syscall/js.valueInvoke': (sp: any) => void;
'syscall/js.valueNew': (sp: any) => void;
'syscall/js.valueLength': (sp: any) => void;
'syscall/js.valuePrepareString': (sp: any) => void;
'syscall/js.valueLoadString': (sp: any) => void;
'syscall/js.valueInstanceOf': (sp: any) => void;
'syscall/js.copyBytesToGo': (sp: any) => void;
'syscall/js.copyBytesToJS': (sp: any) => void;
debug: (value: any) => void;
};
};
constructor();
run(instance: any): Promise<void>;
private _resume;
private _makeFuncWrapper;
}
export { Go as default };

View File

@@ -0,0 +1 @@
import{a}from"../chunk-QR6QDSEV.js";export{a as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
node_modules/@astrojs/compiler/dist/node/index.cjs generated vendored Normal file

File diff suppressed because one or more lines are too long

12
node_modules/@astrojs/compiler/dist/node/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,12 @@
import { transform as transform$1, parse as parse$1, convertToTSX as convertToTSX$1, teardown as teardown$1 } from '../shared/types.js';
export { HoistedScript, ParseOptions, ParseResult, PreprocessorResult, TransformOptions, TransformResult } from '../shared/types.js';
import '../shared/ast.js';
import '../shared/diagnostics.js';
declare const transform: typeof transform$1;
declare const parse: typeof parse$1;
declare const convertToTSX: typeof convertToTSX$1;
declare const compile: (template: string) => Promise<string>;
declare const teardown: typeof teardown$1;
export { compile, convertToTSX, parse, teardown, transform };

1
node_modules/@astrojs/compiler/dist/node/index.js generated vendored Normal file
View File

@@ -0,0 +1 @@
import{a as c}from"../chunk-W5DTLHV4.js";import{promises as m}from"fs";import{fileURLToPath as f}from"url";var w=async(t,s)=>i().then(r=>r.transform(t,s)),l=async(t,s)=>i().then(r=>r.parse(t,s)),b=async(t,s)=>i().then(r=>r.convertToTSX(t,s)),P=async t=>{let{default:s}=await import(`data:text/javascript;charset=utf-8;base64,${Buffer.from(t).toString("base64")}`);return s},n,g=()=>{n=void 0,globalThis["@astrojs/compiler"]=void 0},i=()=>(n||(n=d().catch(t=>{throw n=void 0,t})),n),y=async(t,s)=>{let r;return r=await(async()=>{let o=await m.readFile(t).then(e=>e.buffer);return WebAssembly.instantiate(new Uint8Array(o),s)})(),r},d=async()=>{let t=new c,s=await y(f(new URL("../astro.wasm",import.meta.url)),t.importObject);t.run(s.instance);let r=globalThis["@astrojs/compiler"];return{transform:(a,o)=>new Promise(e=>{try{e(r.transform(a,o||{}))}catch(p){throw n=void 0,p}}),parse:(a,o)=>new Promise(e=>e(r.parse(a,o||{}))).catch(e=>{throw n=void 0,e}).then(e=>({...e,ast:JSON.parse(e.ast)})),convertToTSX:(a,o)=>new Promise(e=>e(r.convertToTSX(a,o||{}))).catch(e=>{throw n=void 0,e}).then(e=>({...e,map:JSON.parse(e.map)}))}};export{P as compile,b as convertToTSX,l as parse,g as teardown,w as transform};

1
node_modules/@astrojs/compiler/dist/node/sync.cjs generated vendored Normal file

File diff suppressed because one or more lines are too long

16
node_modules/@astrojs/compiler/dist/node/sync.d.ts generated vendored Normal file
View File

@@ -0,0 +1,16 @@
import { TransformOptions, TransformResult, ParseOptions, ParseResult, ConvertToTSXOptions, TSXResult, transform as transform$1, parse as parse$1, convertToTSX as convertToTSX$1 } from '../shared/types.js';
import '../shared/ast.js';
import '../shared/diagnostics.js';
type UnwrappedPromise<T> = T extends (...params: any) => Promise<infer Return> ? (...params: Parameters<T>) => Return : T;
interface Service {
transform: UnwrappedPromise<typeof transform$1>;
parse: UnwrappedPromise<typeof parse$1>;
convertToTSX: UnwrappedPromise<typeof convertToTSX$1>;
}
declare const transform: (input: string, options: TransformOptions | undefined) => TransformResult;
declare const parse: (input: string, options: ParseOptions | undefined) => ParseResult;
declare const convertToTSX: (input: string, options: ConvertToTSXOptions | undefined) => TSXResult;
declare function startRunningService(): Service;
export { convertToTSX, parse, startRunningService, transform };

1
node_modules/@astrojs/compiler/dist/node/sync.js generated vendored Normal file
View File

@@ -0,0 +1 @@
import{a as c}from"../chunk-W5DTLHV4.js";import{readFileSync as p}from"fs";import{fileURLToPath as m}from"url";function i(){return s||(s=f()),s}var s,l=(e,t)=>i().transform(e,t),w=(e,t)=>i().parse(e,t),h=(e,t)=>i().convertToTSX(e,t);function f(){let e=new c,t=v(m(new URL("../astro.wasm",import.meta.url)),e.importObject);e.run(t);let o=globalThis["@astrojs/compiler"];return{transform:(n,a)=>{try{return o.transform(n,a||{})}catch(r){throw s=void 0,r}},parse:(n,a)=>{try{let r=o.parse(n,a||{});return{...r,ast:JSON.parse(r.ast)}}catch(r){throw s=void 0,r}},convertToTSX:(n,a)=>{try{let r=o.convertToTSX(n,a||{});return{...r,map:JSON.parse(r.map)}}catch(r){throw s=void 0,r}}}}function v(e,t){let o=p(e);return new WebAssembly.Instance(new WebAssembly.Module(o),t)}export{h as convertToTSX,w as parse,f as startRunningService,l as transform};

3
node_modules/@astrojs/compiler/dist/node/utils.cjs generated vendored Normal file
View File

@@ -0,0 +1,3 @@
"use strict";var m=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var u=(o,e)=>{for(var t in e)m(o,t,{get:e[t],enumerable:!0})},f=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of p(e))!N.call(o,r)&&r!==t&&m(o,r,{get:()=>e[r],enumerable:!(a=d(e,r))||a.enumerable});return o};var y=o=>f(m({},"__esModule",{value:!0}),o);var v={};u(v,{is:()=>s,serialize:()=>k,walk:()=>h,walkAsync:()=>x});module.exports=y(v);function n(o){return e=>e.type===o}var s={parent(o){return Array.isArray(o.children)},literal(o){return typeof o.value=="string"},tag(o){return o.type==="element"||o.type==="custom-element"||o.type==="component"||o.type==="fragment"},whitespace(o){return o.type==="text"&&o.value.trim().length===0},root:n("root"),element:n("element"),customElement:n("custom-element"),component:n("component"),fragment:n("fragment"),expression:n("expression"),text:n("text"),doctype:n("doctype"),comment:n("comment"),frontmatter:n("frontmatter")},l=class{constructor(e){this.callback=e}async visit(e,t,a){if(await this.callback(e,t,a),s.parent(e)){let r=[];for(let i=0;i<e.children.length;i++){let c=e.children[i];r.push(this.callback(c,e,i))}await Promise.all(r)}}};function h(o,e){new l(e).visit(o)}function x(o,e){return new l(e).visit(o)}function g(o){let e="";for(let t of o.attributes)switch(e+=" ",t.kind){case"empty":{e+=`${t.name}`;break}case"expression":{e+=`${t.name}={${t.value}}`;break}case"quoted":{e+=`${t.name}=${t.raw}`;break}case"template-literal":{e+=`${t.name}=\`${t.value}\``;break}case"shorthand":{e+=`{${t.name}}`;break}case"spread":{e+=`{...${t.name}}`;break}}return e}function k(o,e={selfClose:!0}){let t="";function a(r){if(s.root(r))for(let i of r.children)a(i);else if(s.frontmatter(r))t+=`---${r.value}---
`;else if(s.comment(r))t+=`<!--${r.value}-->`;else if(s.expression(r)){t+="{";for(let i of r.children)a(i);t+="}"}else if(s.literal(r))t+=r.value;else if(s.tag(r))if(t+=`<${r.name}`,t+=g(r),r.children.length===0&&e.selfClose)t+=" />";else{t+=">";for(let i of r.children)a(i);t+=`</${r.name}>`}}return a(o),t}0&&(module.exports={is,serialize,walk,walkAsync});

29
node_modules/@astrojs/compiler/dist/node/utils.d.ts generated vendored Normal file
View File

@@ -0,0 +1,29 @@
import { Node, ParentNode, LiteralNode, TagLikeNode, TextNode, RootNode, ElementNode, CustomElementNode, ComponentNode, FragmentNode, ExpressionNode, DoctypeNode, CommentNode, FrontmatterNode } from '../shared/ast.js';
type Visitor = (node: Node, parent?: ParentNode, index?: number) => void | Promise<void>;
declare const is: {
parent(node: Node): node is ParentNode;
literal(node: Node): node is LiteralNode;
tag(node: Node): node is TagLikeNode;
whitespace(node: Node): node is TextNode;
root: (node: Node) => node is RootNode;
element: (node: Node) => node is ElementNode;
customElement: (node: Node) => node is CustomElementNode;
component: (node: Node) => node is ComponentNode;
fragment: (node: Node) => node is FragmentNode;
expression: (node: Node) => node is ExpressionNode;
text: (node: Node) => node is TextNode;
doctype: (node: Node) => node is DoctypeNode;
comment: (node: Node) => node is CommentNode;
frontmatter: (node: Node) => node is FrontmatterNode;
};
declare function walk(node: ParentNode, callback: Visitor): void;
declare function walkAsync(node: ParentNode, callback: Visitor): Promise<void>;
interface SerializeOptions {
selfClose: boolean;
}
/** @deprecated Please use `SerializeOptions` */
type SerializeOtions = SerializeOptions;
declare function serialize(root: Node, opts?: SerializeOptions): string;
export { SerializeOptions, SerializeOtions, Visitor, is, serialize, walk, walkAsync };

3
node_modules/@astrojs/compiler/dist/node/utils.js generated vendored Normal file
View File

@@ -0,0 +1,3 @@
function n(o){return t=>t.type===o}var a={parent(o){return Array.isArray(o.children)},literal(o){return typeof o.value=="string"},tag(o){return o.type==="element"||o.type==="custom-element"||o.type==="component"||o.type==="fragment"},whitespace(o){return o.type==="text"&&o.value.trim().length===0},root:n("root"),element:n("element"),customElement:n("custom-element"),component:n("component"),fragment:n("fragment"),expression:n("expression"),text:n("text"),doctype:n("doctype"),comment:n("comment"),frontmatter:n("frontmatter")},l=class{constructor(t){this.callback=t}async visit(t,e,s){if(await this.callback(t,e,s),a.parent(t)){let r=[];for(let i=0;i<t.children.length;i++){let m=t.children[i];r.push(this.callback(m,t,i))}await Promise.all(r)}}};function N(o,t){new l(t).visit(o)}function u(o,t){return new l(t).visit(o)}function c(o){let t="";for(let e of o.attributes)switch(t+=" ",e.kind){case"empty":{t+=`${e.name}`;break}case"expression":{t+=`${e.name}={${e.value}}`;break}case"quoted":{t+=`${e.name}=${e.raw}`;break}case"template-literal":{t+=`${e.name}=\`${e.value}\``;break}case"shorthand":{t+=`{${e.name}}`;break}case"spread":{t+=`{...${e.name}}`;break}}return t}function f(o,t={selfClose:!0}){let e="";function s(r){if(a.root(r))for(let i of r.children)s(i);else if(a.frontmatter(r))e+=`---${r.value}---
`;else if(a.comment(r))e+=`<!--${r.value}-->`;else if(a.expression(r)){e+="{";for(let i of r.children)s(i);e+="}"}else if(a.literal(r))e+=r.value;else if(a.tag(r))if(e+=`<${r.name}`,e+=c(r),r.children.length===0&&t.selfClose)e+=" />";else{e+=">";for(let i of r.children)s(i);e+=`</${r.name}>`}}return s(o),e}export{a as is,f as serialize,N as walk,u as walkAsync};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
declare class Go {
importObject: {
gojs: {
'runtime.wasmExit': (sp: any) => void;
'runtime.wasmWrite': (sp: any) => void;
'runtime.resetMemoryDataView': (sp: any) => void;
'runtime.nanotime1': (sp: any) => void;
'runtime.walltime': (sp: any) => void;
'runtime.scheduleTimeoutEvent': (sp: any) => void;
'runtime.clearTimeoutEvent': (sp: any) => void;
'runtime.getRandomData': (sp: any) => void;
'syscall/js.finalizeRef': (sp: any) => void;
'syscall/js.stringVal': (sp: any) => void;
'syscall/js.valueGet': (sp: any) => void;
'syscall/js.valueSet': (sp: any) => void;
'syscall/js.valueDelete': (sp: any) => void;
'syscall/js.valueIndex': (sp: any) => void;
'syscall/js.valueSetIndex': (sp: any) => void;
'syscall/js.valueCall': (sp: any) => void;
'syscall/js.valueInvoke': (sp: any) => void;
'syscall/js.valueNew': (sp: any) => void;
'syscall/js.valueLength': (sp: any) => void;
'syscall/js.valuePrepareString': (sp: any) => void;
'syscall/js.valueLoadString': (sp: any) => void;
'syscall/js.valueInstanceOf': (sp: any) => void;
'syscall/js.copyBytesToGo': (sp: any) => void;
'syscall/js.copyBytesToJS': (sp: any) => void;
debug: (value: any) => void;
};
};
constructor();
run(instance: any): Promise<void>;
private _resume;
private _makeFuncWrapper;
}
export { Go as default };

View File

@@ -0,0 +1 @@
import{a}from"../chunk-W5DTLHV4.js";export{a as default};

1
node_modules/@astrojs/compiler/dist/shared/ast.cjs generated vendored Normal file
View File

@@ -0,0 +1 @@
"use strict";var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var p=(t,e,d,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of i(e))!N.call(t,o)&&o!==d&&r(t,o,{get:()=>e[o],enumerable:!(n=a(e,o))||n.enumerable});return t};var s=t=>p(r({},"__esModule",{value:!0}),t);var m={};module.exports=s(m);

74
node_modules/@astrojs/compiler/dist/shared/ast.d.ts generated vendored Normal file
View File

@@ -0,0 +1,74 @@
type ParentNode = RootNode | ElementNode | ComponentNode | CustomElementNode | FragmentNode | ExpressionNode;
type LiteralNode = TextNode | DoctypeNode | CommentNode | FrontmatterNode;
type Node = RootNode | ElementNode | ComponentNode | CustomElementNode | FragmentNode | ExpressionNode | TextNode | FrontmatterNode | DoctypeNode | CommentNode;
interface Position {
start: Point;
end?: Point;
}
interface Point {
/** 1-based line number */
line: number;
/** 1-based column number, per-line */
column: number;
/** 0-based byte offset */
offset: number;
}
interface BaseNode {
type: string;
position?: Position;
}
interface ParentLikeNode extends BaseNode {
type: 'element' | 'component' | 'custom-element' | 'fragment' | 'expression' | 'root';
children: Node[];
}
interface ValueNode extends BaseNode {
value: string;
}
interface RootNode extends ParentLikeNode {
type: 'root';
}
interface AttributeNode extends BaseNode {
type: 'attribute';
kind: 'quoted' | 'empty' | 'expression' | 'spread' | 'shorthand' | 'template-literal';
name: string;
value: string;
raw?: string;
}
interface TextNode extends ValueNode {
type: 'text';
}
interface ElementNode extends ParentLikeNode {
type: 'element';
name: string;
attributes: AttributeNode[];
}
interface FragmentNode extends ParentLikeNode {
type: 'fragment';
name: string;
attributes: AttributeNode[];
}
interface ComponentNode extends ParentLikeNode {
type: 'component';
name: string;
attributes: AttributeNode[];
}
interface CustomElementNode extends ParentLikeNode {
type: 'custom-element';
name: string;
attributes: AttributeNode[];
}
type TagLikeNode = ElementNode | FragmentNode | ComponentNode | CustomElementNode;
interface DoctypeNode extends ValueNode {
type: 'doctype';
}
interface CommentNode extends ValueNode {
type: 'comment';
}
interface FrontmatterNode extends ValueNode {
type: 'frontmatter';
}
interface ExpressionNode extends ParentLikeNode {
type: 'expression';
}
export { AttributeNode, BaseNode, CommentNode, ComponentNode, CustomElementNode, DoctypeNode, ElementNode, ExpressionNode, FragmentNode, FrontmatterNode, LiteralNode, Node, ParentLikeNode, ParentNode, Point, Position, RootNode, TagLikeNode, TextNode, ValueNode };

0
node_modules/@astrojs/compiler/dist/shared/ast.js generated vendored Normal file
View File

View File

@@ -0,0 +1 @@
"use strict";var I=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var U=(E,N)=>{for(var _ in N)I(E,_,{get:N[_],enumerable:!0})},H=(E,N,_,A)=>{if(N&&typeof N=="object"||typeof N=="function")for(let T of G(N))!S.call(E,T)&&T!==_&&I(E,T,{get:()=>N[T],enumerable:!(A=M(N,T))||A.enumerable});return E};var W=E=>H(I({},"__esModule",{value:!0}),E);var P={};U(P,{DiagnosticCode:()=>O});module.exports=W(P);var O=(R=>(R[R.ERROR=1e3]="ERROR",R[R.ERROR_UNTERMINATED_JS_COMMENT=1001]="ERROR_UNTERMINATED_JS_COMMENT",R[R.ERROR_FRAGMENT_SHORTHAND_ATTRS=1002]="ERROR_FRAGMENT_SHORTHAND_ATTRS",R[R.ERROR_UNMATCHED_IMPORT=1003]="ERROR_UNMATCHED_IMPORT",R[R.ERROR_UNSUPPORTED_SLOT_ATTRIBUTE=1004]="ERROR_UNSUPPORTED_SLOT_ATTRIBUTE",R[R.WARNING=2e3]="WARNING",R[R.WARNING_UNTERMINATED_HTML_COMMENT=2001]="WARNING_UNTERMINATED_HTML_COMMENT",R[R.WARNING_UNCLOSED_HTML_TAG=2002]="WARNING_UNCLOSED_HTML_TAG",R[R.WARNING_DEPRECATED_DIRECTIVE=2003]="WARNING_DEPRECATED_DIRECTIVE",R[R.WARNING_IGNORED_DIRECTIVE=2004]="WARNING_IGNORED_DIRECTIVE",R[R.WARNING_UNSUPPORTED_EXPRESSION=2005]="WARNING_UNSUPPORTED_EXPRESSION",R[R.WARNING_SET_WITH_CHILDREN=2006]="WARNING_SET_WITH_CHILDREN",R[R.INFO=3e3]="INFO",R[R.HINT=4e3]="HINT",R))(O||{});0&&(module.exports={DiagnosticCode});

Some files were not shown because too many files have changed in this diff Show More