reend-components 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,11 +3,22 @@
3
3
  [![npm version](https://img.shields.io/npm/v/reend-components)](https://www.npmjs.com/package/reend-components)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/reend-components)](https://www.npmjs.com/package/reend-components)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
6
+ [![CI](https://github.com/VBeatDead/ReEnd-Components/actions/workflows/ci.yml/badge.svg)](https://github.com/VBeatDead/ReEnd-Components/actions/workflows/ci.yml)
6
7
 
7
- **Arknights: Endfield Design System** — A React component library inspired by the UI aesthetics of Arknights: Endfield. Built with TypeScript, Tailwind CSS, and Radix UI primitives.
8
+ **The only React component library built for tactical, sci-fi, and gaming-inspired UI.**
9
+
10
+ Not another shadcn clone. Not a Bootstrap wrapper.
11
+ ReEnd is for when your app should look like a tactical HUD.
12
+
13
+ → Dark-first design system (Endfield aesthetic)
14
+ → Signature components you won't find anywhere else
15
+ → CSS variable tokens + Tailwind preset
16
+ → TypeScript, Radix UI primitives, accessible
8
17
 
9
18
  [Documentation](https://reend-components.pages.dev) · [GitHub](https://github.com/VBeatDead/ReEnd-Components) · [npm](https://www.npmjs.com/package/reend-components)
10
19
 
20
+ ---
21
+
11
22
  ## Installation
12
23
 
13
24
  ```bash
@@ -22,11 +33,20 @@ bun add reend-components
22
33
 
23
34
  ### Peer Dependencies
24
35
 
25
- | Package | Version |
26
- | ----------- | ----------------- |
27
- | react | ≥18.0.0 |
28
- | react-dom | ≥18.0.0 |
29
- | tailwindcss | ≥3.4.0 (optional) |
36
+ | Package | Version | Required for |
37
+ | ---------------- | ------------------ | --------------------- |
38
+ | `react` | ≥18.0.0 | All components |
39
+ | `react-dom` | ≥18.0.0 | All components |
40
+ | `tailwindcss` | ≥3.4.0 *(optional)*| Tailwind preset |
41
+ | `framer-motion` | ≥10.0.0 *(optional)*| Signature components |
42
+ | `lucide-react` | ≥0.400.0 *(optional)*| HoloCard icon prop |
43
+
44
+ ```bash
45
+ # For Signature components (GlitchText, RadarChart, TacticalPanel, etc.)
46
+ npm install framer-motion lucide-react
47
+ ```
48
+
49
+ ---
30
50
 
31
51
  ## Quick Start
32
52
 
@@ -40,6 +60,7 @@ export default {
40
60
  presets: [reendPreset],
41
61
  content: [
42
62
  "./src/**/*.{ts,tsx}",
63
+ // Required for Signature component classes to be included
43
64
  "./node_modules/reend-components/dist/**/*.{js,mjs}",
44
65
  ],
45
66
  };
@@ -76,13 +97,15 @@ function App() {
76
97
 
77
98
  ### Without Tailwind
78
99
 
79
- If you're not using Tailwind CSS, import the pre-built stylesheet:
100
+ Import the pre-built stylesheet instead:
80
101
 
81
102
  ```tsx
82
103
  import "reend-components/styles.css";
83
104
  import { Tooltip } from "reend-components";
84
105
  ```
85
106
 
107
+ ---
108
+
86
109
  ## Components
87
110
 
88
111
  | Component | Description |
@@ -94,6 +117,61 @@ import { Tooltip } from "reend-components";
94
117
  | `cn()` | Utility for merging Tailwind classes |
95
118
  | `useToast()` | Toast notification hook |
96
119
 
120
+ ---
121
+
122
+ ## Signature Components
123
+
124
+ > **Requires** `framer-motion` and/or `lucide-react` peer dependencies.
125
+ > Add `./node_modules/reend-components/dist/**/*.{js,mjs}` to your Tailwind `content`
126
+ > array so animation utilities (`animate-glitch`, `clip-corner`, etc.) are included.
127
+
128
+ ```bash
129
+ npm install framer-motion lucide-react
130
+ ```
131
+
132
+ | Component | Description | Key Props |
133
+ | ---------------- | -------------------------------------------------------- | --------- |
134
+ | `GlitchText` | Animated glitch effect text span | `children: string`, `className?` |
135
+ | `DiamondLoader` | Rotating diamond loading spinner | `size?: "sm"\|"md"\|"lg"`, `label?` |
136
+ | `TacticalPanel` | HUD-style content panel with status indicator | `title`, `status?: "online"\|"warning"\|"offline"\|"scanning"` |
137
+ | `HoloCard` | Holographic stat/feature card with hover tilt | `title`, `subtitle`, `icon: React.ElementType`, `value?` |
138
+ | `DataStream` | Scrolling live data feed terminal | `messages?: string[]` |
139
+ | `TacticalBadge` | Status badge with semantic variants (CVA-powered) | `variant?: "default"\|"success"\|"warning"\|"danger"\|"info"` |
140
+ | `WarningBanner` | Alert banner with severity levels | `level?: "caution"\|"alert"\|"critical"` |
141
+ | `ScanDivider` | Animated scan-line section divider | `label?` |
142
+ | `CoordinateTag` | HUD coordinate display tag | `label`, `value`, `unit?` |
143
+ | `RadarChart` | Animated SVG radar/spider chart | `data: {label, value}[]`, `size?`, `color?: "primary"\|"cyan"` |
144
+ | `HUDOverlay` | Corner-bracket HUD overlay with crosshair and coords | `systemLabel?`, `lat?`, `lon?`, `showCoords?`, `showCrosshair?` |
145
+
146
+ ```tsx
147
+ import {
148
+ TacticalPanel,
149
+ HUDOverlay,
150
+ RadarChart,
151
+ GlitchText,
152
+ } from "reend-components";
153
+
154
+ function Dashboard() {
155
+ return (
156
+ <HUDOverlay systemLabel="ENDFIELD::DASHBOARD">
157
+ <TacticalPanel title="OPERATOR STATUS" status="online">
158
+ <GlitchText>DR. AMBROSE</GlitchText>
159
+ <RadarChart
160
+ data={[
161
+ { label: "ATK", value: 88 },
162
+ { label: "DEF", value: 62 },
163
+ { label: "TECH", value: 95 },
164
+ { label: "SPD", value: 74 },
165
+ ]}
166
+ />
167
+ </TacticalPanel>
168
+ </HUDOverlay>
169
+ );
170
+ }
171
+ ```
172
+
173
+ ---
174
+
97
175
  ## Theming
98
176
 
99
177
  ReEnd uses CSS custom properties for all colors. Override any variable:
@@ -128,6 +206,8 @@ See [CSS Variable Reference](https://reend-components.pages.dev/docs/foundations
128
206
 
129
207
  [Full token reference →](https://reend-components.pages.dev/docs/foundations)
130
208
 
209
+ ---
210
+
131
211
  ## Development
132
212
 
133
213
  ```bash
@@ -137,9 +217,27 @@ npm install
137
217
  npm run dev # docs dev server at :8080
138
218
  npm run build # build docs SPA
139
219
  npm run build:lib # build library for npm
140
- npm run test # run tests
220
+ npm run test # run tests (89 tests)
221
+ npm run test:coverage # test + coverage report
141
222
  ```
142
223
 
224
+ ---
225
+
226
+ ## Internationalization (i18n)
227
+
228
+ The documentation site supports **English** (default) and **Bahasa Indonesia** via [react-i18next](https://react.i18next.com).
229
+
230
+ ### URL Structure
231
+
232
+ | URL Pattern | Language |
233
+ | ---------------------- | ---------- |
234
+ | `/docs/foundations` | English |
235
+ | `/id/docs/foundations` | Indonesian |
236
+
237
+ **1,425 translation keys** across 16 namespaces × 2 languages.
238
+
239
+ ---
240
+
143
241
  ## License
144
242
 
145
243
  MIT © [VBeatDead](https://github.com/VBeatDead)
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),R=require("react"),D=require("@radix-ui/react-tooltip"),P=require("clsx"),E=require("tailwind-merge"),M=require("@radix-ui/react-toast"),I=require("class-variance-authority"),V=require("lucide-react"),w=require("sonner");function g(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(e,o,s.get?s:{enumerable:!0,get:()=>t[o]})}}return e.default=t,Object.freeze(e)}const i=g(R),u=g(D),a=g(M);function n(...t){return E.twMerge(P.clsx(t))}const q=u.Provider,C=u.Root,k=u.Trigger,S=i.forwardRef(({className:t,sideOffset:e=4,...o},s)=>r.jsx(u.Content,{ref:s,sideOffset:e,className:n("z-50 overflow-hidden border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",t),...o}));S.displayName=u.Content.displayName;const N=a.Provider,T=i.forwardRef(({className:t,...e},o)=>r.jsx(a.Viewport,{ref:o,className:n("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",t),...e}));T.displayName=a.Viewport.displayName;const z=I.cva("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),v=i.forwardRef(({className:t,variant:e,...o},s)=>r.jsx(a.Root,{ref:s,className:n(z({variant:e}),t),...o}));v.displayName=a.Root.displayName;const j=i.forwardRef(({className:t,...e},o)=>r.jsx(a.Action,{ref:o,className:n("inline-flex h-8 shrink-0 items-center justify-center border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",t),...e}));j.displayName=a.Action.displayName;const x=i.forwardRef(({className:t,...e},o)=>r.jsx(a.Close,{ref:o,className:n("absolute right-2 top-2 p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",t),"toast-close":"",...e,children:r.jsx(V.X,{className:"h-4 w-4"})}));x.displayName=a.Close.displayName;const b=i.forwardRef(({className:t,...e},o)=>r.jsx(a.Title,{ref:o,className:n("text-sm font-semibold",t),...e}));b.displayName=a.Title.displayName;const y=i.forwardRef(({className:t,...e},o)=>r.jsx(a.Description,{ref:o,className:n("text-sm opacity-90",t),...e}));y.displayName=a.Description.displayName;const B=1,L=5e3;let f=0;function U(){return f=(f+1)%Number.MAX_SAFE_INTEGER,f.toString()}const m=new Map,h=t=>{if(m.has(t))return;const e=setTimeout(()=>{m.delete(t),c({type:"REMOVE_TOAST",toastId:t})},L);m.set(t,e)},X=(t,e)=>{switch(e.type){case"ADD_TOAST":return{...t,toasts:[e.toast,...t.toasts].slice(0,B)};case"UPDATE_TOAST":return{...t,toasts:t.toasts.map(o=>o.id===e.toast.id?{...o,...e.toast}:o)};case"DISMISS_TOAST":{const{toastId:o}=e;return o?h(o):t.toasts.forEach(s=>{h(s.id)}),{...t,toasts:t.toasts.map(s=>s.id===o||o===void 0?{...s,open:!1}:s)}}case"REMOVE_TOAST":return e.toastId===void 0?{...t,toasts:[]}:{...t,toasts:t.toasts.filter(o=>o.id!==e.toastId)}}},l=[];let p={toasts:[]};function c(t){p=X(p,t),l.forEach(e=>{e(p)})}function A({...t}){const e=U(),o=d=>c({type:"UPDATE_TOAST",toast:{...d,id:e}}),s=()=>c({type:"DISMISS_TOAST",toastId:e});return c({type:"ADD_TOAST",toast:{...t,id:e,open:!0,onOpenChange:d=>{d||s()}}}),{id:e,dismiss:s,update:o}}function O(){const[t,e]=i.useState(p);return i.useEffect(()=>(l.push(e),()=>{const o=l.indexOf(e);o>-1&&l.splice(o,1)}),[t]),{...t,toast:A,dismiss:o=>c({type:"DISMISS_TOAST",toastId:o})}}function F(){const{toasts:t}=O();return r.jsxs(N,{children:[t.map(function({id:e,title:o,description:s,action:d,..._}){return r.jsxs(v,{..._,children:[r.jsxs("div",{className:"grid gap-1",children:[o&&r.jsx(b,{children:o}),s&&r.jsx(y,{children:s})]}),d,r.jsx(x,{})]},e)}),r.jsx(T,{})]})}const G=({theme:t="dark",...e})=>r.jsx(w.Toaster,{theme:t,className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e});Object.defineProperty(exports,"toast",{enumerable:!0,get:()=>w.toast});exports.SonnerToaster=G;exports.Toast=v;exports.ToastAction=j;exports.ToastClose=x;exports.ToastDescription=y;exports.ToastProvider=N;exports.ToastTitle=b;exports.ToastViewport=T;exports.Toaster=F;exports.Tooltip=C;exports.TooltipContent=S;exports.TooltipProvider=q;exports.TooltipTrigger=k;exports.cn=n;exports.toastAction=A;exports.useToast=O;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),ce=require("react"),de=require("@radix-ui/react-tooltip"),pe=require("clsx"),me=require("tailwind-merge"),ue=require("@radix-ui/react-toast"),U=require("class-variance-authority"),E=require("lucide-react"),G=require("sonner"),y=require("framer-motion");function R(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const a=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(r,s,a.get?a:{enumerable:!0,get:()=>t[s]})}}return r.default=t,Object.freeze(r)}const n=R(ce),j=R(de),p=R(ue);function g(...t){return me.twMerge(pe.clsx(t))}const fe=j.Provider,xe=j.Root,ge=j.Trigger,q=n.forwardRef(({className:t,sideOffset:r=4,...s},a)=>e.jsx(j.Content,{ref:a,sideOffset:r,className:g("z-50 overflow-hidden border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",t),...s}));q.displayName=j.Content.displayName;const H=p.Provider,I=n.forwardRef(({className:t,...r},s)=>e.jsx(p.Viewport,{ref:s,className:g("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",t),...r}));I.displayName=p.Viewport.displayName;const be=U.cva("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),P=n.forwardRef(({className:t,variant:r,...s},a)=>e.jsx(p.Root,{ref:a,className:g(be({variant:r}),t),...s}));P.displayName=p.Root.displayName;const z=n.forwardRef(({className:t,...r},s)=>e.jsx(p.Action,{ref:s,className:g("inline-flex h-8 shrink-0 items-center justify-center border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",t),...r}));z.displayName=p.Action.displayName;const k=n.forwardRef(({className:t,...r},s)=>e.jsx(p.Close,{ref:s,className:g("absolute right-2 top-2 p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",t),"toast-close":"",...r,children:e.jsx(E.X,{className:"h-4 w-4"})}));k.displayName=p.Close.displayName;const O=n.forwardRef(({className:t,...r},s)=>e.jsx(p.Title,{ref:s,className:g("text-sm font-semibold",t),...r}));O.displayName=p.Title.displayName;const C=n.forwardRef(({className:t,...r},s)=>e.jsx(p.Description,{ref:s,className:g("text-sm opacity-90",t),...r}));C.displayName=p.Description.displayName;const ve=1,he=5e3;let D=0;function ye(){return D=(D+1)%Number.MAX_SAFE_INTEGER,D.toString()}const $=new Map,B=t=>{if($.has(t))return;const r=setTimeout(()=>{$.delete(t),N({type:"REMOVE_TOAST",toastId:t})},he);$.set(t,r)},Ne=(t,r)=>{switch(r.type){case"ADD_TOAST":return{...t,toasts:[r.toast,...t.toasts].slice(0,ve)};case"UPDATE_TOAST":return{...t,toasts:t.toasts.map(s=>s.id===r.toast.id?{...s,...r.toast}:s)};case"DISMISS_TOAST":{const{toastId:s}=r;return s?B(s):t.toasts.forEach(a=>{B(a.id)}),{...t,toasts:t.toasts.map(a=>a.id===s||s===void 0?{...a,open:!1}:a)}}case"REMOVE_TOAST":return r.toastId===void 0?{...t,toasts:[]}:{...t,toasts:t.toasts.filter(s=>s.id!==r.toastId)}}},w=[];let S={toasts:[]};function N(t){S=Ne(S,t),w.forEach(r=>{r(S)})}function F({...t}){const r=ye(),s=o=>N({type:"UPDATE_TOAST",toast:{...o,id:r}}),a=()=>N({type:"DISMISS_TOAST",toastId:r});return N({type:"ADD_TOAST",toast:{...t,id:r,open:!0,onOpenChange:o=>{o||a()}}}),{id:r,dismiss:a,update:s}}function W(){const[t,r]=n.useState(S);return n.useEffect(()=>(w.push(r),()=>{const s=w.indexOf(r);s>-1&&w.splice(s,1)}),[t]),{...t,toast:F,dismiss:s=>N({type:"DISMISS_TOAST",toastId:s})}}function je(){const{toasts:t}=W();return e.jsxs(H,{children:[t.map(function({id:r,title:s,description:a,action:o,...c}){return e.jsxs(P,{...c,children:[e.jsxs("div",{className:"grid gap-1",children:[s&&e.jsx(O,{children:s}),a&&e.jsx(C,{children:a})]}),o,e.jsx(k,{})]},r)}),e.jsx(I,{})]})}const Te=({theme:t="dark",...r})=>e.jsx(G.Toaster,{theme:t,className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...r}),Y=n.forwardRef(({children:t,className:r=""},s)=>e.jsxs("span",{ref:s,className:`relative inline-block ${r}`,children:[e.jsx("span",{className:"relative z-10",children:t}),e.jsx("span",{"aria-hidden":!0,className:"absolute inset-0 text-ef-cyan opacity-70 animate-glitch",style:{clipPath:"inset(20% 0 50% 0)",transform:"translate(-2px, 0)"},children:t}),e.jsx("span",{"aria-hidden":!0,className:"absolute inset-0 text-ef-red opacity-70 animate-glitch",style:{clipPath:"inset(50% 0 20% 0)",transform:"translate(2px, 0)",animationDelay:"0.1s"},children:t})]}));Y.displayName="GlitchText";const we={sm:16,md:28,lg:44},X=n.forwardRef(({size:t="md",label:r,className:s},a)=>{const o=we[t];return e.jsxs("div",{ref:a,className:`flex flex-col items-center gap-3${s?` ${s}`:""}`,children:[e.jsx("div",{className:"relative",style:{width:o*2,height:o*2},children:[0,1,2].map(c=>e.jsx("div",{className:"absolute inset-0 border-2 border-primary",style:{transform:`rotate(45deg) scale(${1-c*.25})`,animation:`diamondSpin ${1.2+c*.4}s linear infinite${c===1?" reverse":""}`,opacity:1-c*.25}},c))}),r&&e.jsx("span",{className:"font-mono text-xs text-muted-foreground tracking-[0.15em] uppercase",children:r})]})});X.displayName="DiamondLoader";const Se={online:"ONLINE",warning:"CAUTION",offline:"OFFLINE",scanning:"SCANNING"},Ee={online:"bg-ef-green",warning:"bg-ef-yellow",offline:"bg-ef-red",scanning:"bg-ef-cyan animate-pulse"},K=n.forwardRef(({title:t,status:r="online",children:s,className:a},o)=>e.jsxs("div",{ref:o,className:`relative border border-border bg-surface-1 scanline-overlay${a?` ${a}`:""}`,children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-2.5 border-b border-border bg-surface-0",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(E.Crosshair,{className:"w-3.5 h-3.5 text-primary"}),e.jsx("span",{className:"font-display text-[11px] font-bold tracking-[0.15em] uppercase text-foreground",children:t})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:`w-2 h-2 ${Ee[r]}`,style:{clipPath:"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)"}}),e.jsx("span",{className:"font-mono text-[10px] tracking-[0.1em] text-muted-foreground",children:Se[r]})]})]}),e.jsx("div",{className:"absolute top-0 left-0 w-6 h-6 border-t-2 border-l-2 border-primary/40 pointer-events-none"}),e.jsx("div",{className:"absolute top-0 right-0 w-6 h-6 border-t-2 border-r-2 border-primary/40 pointer-events-none"}),e.jsx("div",{className:"absolute bottom-0 left-0 w-6 h-6 border-b-2 border-l-2 border-primary/40 pointer-events-none"}),e.jsx("div",{className:"absolute bottom-0 right-0 w-6 h-6 border-b-2 border-r-2 border-primary/40 pointer-events-none"}),e.jsx("div",{className:"p-5",children:s})]}));K.displayName="TacticalPanel";const Q=n.forwardRef(({title:t,subtitle:r,icon:s,value:a,className:o},c)=>{const[i,f]=n.useState(!1);return e.jsxs("div",{ref:c,className:`relative clip-corner border border-border bg-surface-1 p-6 overflow-hidden group cursor-pointer transition-all duration-500 hover:border-primary/30${o?` ${o}`:""}`,onMouseEnter:()=>f(!0),onMouseLeave:()=>f(!1),children:[e.jsx("div",{className:"absolute left-0 right-0 h-px bg-gradient-to-r from-transparent via-primary/60 to-transparent pointer-events-none transition-all",style:{top:i?"100%":"-10%",opacity:i?1:0,transitionDuration:"2000ms"}}),e.jsx("div",{className:"absolute inset-0 pointer-events-none transition-opacity duration-500",style:{background:"linear-gradient(135deg, transparent 0%, hsl(var(--primary) / 0.03) 40%, transparent 60%)",opacity:i?1:0}}),e.jsxs("div",{className:"relative z-10",children:[e.jsx(s,{className:"w-5 h-5 text-primary mb-4 group-hover:drop-shadow-[0_0_8px_hsl(var(--primary)/0.5)] transition-all"}),a&&e.jsx("p",{className:"font-display text-3xl font-bold text-primary mb-1",children:a}),e.jsx("h4",{className:"font-display text-sm font-bold tracking-[0.05em] uppercase text-foreground mb-1",children:t}),e.jsx("p",{className:"text-sm text-muted-foreground",children:r})]}),e.jsx("div",{className:"absolute bottom-3 right-3 text-primary/20 group-hover:text-primary/60 transition-colors text-xs",children:"◆"})]})});Q.displayName="HoloCard";const Ae=["[SYS] Initializing ENDFIELD protocol...","[NET] Connection established — latency: 12ms","[SEC] Authentication verified ◆ Level: ALPHA","[DAT] Loading design tokens: 94 variables mapped","[GPU] Render pipeline: Optimized (60fps locked)","[SYS] Component registry: 70 modules online","[NET] Sync complete — all nodes operational","[DAT] Color system: HSL-based, 9 neutrals, 9 accents","[SEC] Encryption: AES-256 ◆ Status: ACTIVE","[SYS] ENDFIELD DESIGN SYSTEM v2.0 ◆ READY"],Z=n.forwardRef(({messages:t=Ae,className:r},s)=>{const[a,o]=n.useState([]),c=n.useRef(null);return n.useEffect(()=>{let i=0;const f=setInterval(()=>{o(x=>{const u=[...x,t[i%t.length]];return u.length>8?u.slice(-8):u}),i++},1200);return()=>clearInterval(f)},[t]),n.useEffect(()=>{c.current&&(c.current.scrollTop=c.current.scrollHeight)},[a]),e.jsxs("div",{ref:s,className:`border border-border bg-background clip-corner overflow-hidden${r?` ${r}`:""}`,children:[e.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 border-b border-border bg-surface-0",children:[e.jsx(E.Terminal,{className:"w-3.5 h-3.5 text-primary"}),e.jsx("span",{className:"font-mono text-[10px] tracking-[0.1em] text-muted-foreground uppercase",children:"LIVE FEED"}),e.jsxs("div",{className:"ml-auto flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1.5 h-1.5 bg-ef-green animate-pulse",style:{clipPath:"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)"}}),e.jsx("span",{className:"font-mono text-[10px] text-ef-green",children:"ACTIVE"})]})]}),e.jsxs("div",{ref:c,className:"p-4 h-48 overflow-y-auto font-mono text-xs space-y-1",children:[e.jsx(y.AnimatePresence,{children:a.map((i,f)=>e.jsx(y.motion.div,{initial:{opacity:0,x:-10},animate:{opacity:1,x:0},className:i.includes("[SEC]")?"text-ef-green":i.includes("[NET]")?"text-ef-blue":i.includes("[DAT]")?"text-ef-cyan":i.includes("[GPU]")?"text-ef-purple":"text-muted-foreground",children:i},`${i}-${f}`))}),e.jsx("span",{className:"inline-block w-2 h-4 bg-primary animate-cursor-blink"})]})]})});Z.displayName="DataStream";const J=U.cva("inline-flex items-center gap-1.5 clip-corner-sm border px-3 py-1 font-display text-[10px] font-bold tracking-[0.15em] uppercase",{variants:{variant:{default:"border-primary/40 text-primary bg-primary/10",success:"border-ef-green/40 text-ef-green bg-ef-green/10",warning:"border-ef-yellow/40 text-ef-yellow bg-ef-yellow/10",danger:"border-ef-red/40 text-ef-red bg-ef-red/10",info:"border-ef-cyan/40 text-ef-cyan bg-ef-cyan/10"}},defaultVariants:{variant:"default"}}),ee=n.forwardRef(({variant:t,className:r,children:s,...a},o)=>e.jsxs("span",{ref:o,className:g(J({variant:t}),r),...a,children:[e.jsx("span",{style:{fontSize:"6px"},children:"◆"}),s]}));ee.displayName="TacticalBadge";const De={caution:{border:"border-ef-yellow/30",bg:"bg-ef-yellow/5",icon:"text-ef-yellow",label:"CAUTION"},alert:{border:"border-ef-orange/30",bg:"bg-ef-orange/5",icon:"text-ef-orange",label:"ALERT"},critical:{border:"border-ef-red/30",bg:"bg-ef-red/5",icon:"text-ef-red",label:"CRITICAL"}},te=n.forwardRef(({level:t="caution",children:r,className:s},a)=>{const o=De[t];return e.jsxs("div",{ref:a,className:`clip-corner border ${o.border} ${o.bg} p-4 flex items-start gap-3${s?` ${s}`:""}`,children:[e.jsx(E.AlertTriangle,{className:`w-5 h-5 ${o.icon} shrink-0 mt-0.5`}),e.jsxs("div",{children:[e.jsx("span",{className:`font-display text-[11px] font-bold tracking-[0.15em] ${o.icon}`,children:o.label}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:r})]})]})});te.displayName="WarningBanner";const re=n.forwardRef(({label:t,className:r},s)=>e.jsxs("div",{ref:s,className:`relative flex items-center gap-4 py-2${r?` ${r}`:""}`,children:[e.jsx("div",{className:"flex-1 h-px bg-gradient-to-r from-transparent via-primary/30 to-transparent"}),t&&e.jsxs("span",{className:"font-display text-[10px] font-bold tracking-[0.2em] uppercase text-primary/60 flex items-center gap-2",children:[e.jsx("span",{style:{fontSize:"6px"},children:"◆"})," ",t," ",e.jsx("span",{style:{fontSize:"6px"},children:"◆"})]}),e.jsx("div",{className:"flex-1 h-px bg-gradient-to-r from-transparent via-primary/30 to-transparent"})]}));re.displayName="ScanDivider";const se=n.forwardRef(({label:t,value:r,unit:s,className:a},o)=>e.jsxs("div",{ref:o,className:`inline-flex items-center border border-border bg-surface-0 overflow-hidden${a?` ${a}`:""}`,children:[e.jsx("span",{className:"font-mono text-[10px] tracking-[0.1em] uppercase text-muted-foreground bg-surface-2 px-2.5 py-1.5 border-r border-border",children:t}),e.jsx("span",{className:"font-mono text-xs text-primary px-2.5 py-1.5 font-bold",children:r}),s&&e.jsx("span",{className:"font-mono text-[10px] text-muted-foreground pr-2.5",children:s})]}));se.displayName="CoordinateTag";const ae=n.forwardRef(({data:t,size:r=260,color:s="primary",className:a},o)=>{const c=n.useRef(null),i=y.useInView(c,{once:!0}),f=n.useCallback(l=>{c.current=l,typeof o=="function"?o(l):o&&(o.current=l)},[o]),x=r/2,u=r/2,m=r*.38,v=4,ne=t.length,_=Math.PI*2/ne,h=s==="cyan"?"--ef-cyan":"--primary",T=(l,d)=>({x:x+d*Math.sin(l*_),y:u-d*Math.cos(l*_)}),ie=Array.from({length:v},(l,d)=>{const b=m*((d+1)/v);return t.map((A,le)=>T(le,b)).map(A=>`${A.x},${A.y}`).join(" ")}),L=t.map((l,d)=>T(d,l.value/100*m)),M=L.map(l=>`${l.x},${l.y}`).join(" "),V=t.map(()=>`${x},${u}`).join(" ");return e.jsx("div",{ref:f,className:`flex flex-col items-center w-full${a?` ${a}`:""}`,children:e.jsxs("svg",{viewBox:`0 0 ${r} ${r}`,className:"w-full max-w-[260px] h-auto overflow-visible",children:[ie.map((l,d)=>e.jsx("polygon",{points:l,fill:"none",stroke:"hsl(var(--border))",strokeWidth:1,opacity:.5},d)),t.map((l,d)=>{const b=T(d,m);return e.jsx("line",{x1:x,y1:u,x2:b.x,y2:b.y,stroke:"hsl(var(--border))",strokeWidth:1,opacity:.3},d)}),e.jsx(y.motion.polygon,{points:i?M:V,fill:`hsl(var(${h}) / 0.15)`,stroke:`hsl(var(${h}))`,strokeWidth:2,initial:!1,animate:{points:i?M:V},transition:{duration:.8,ease:[.25,.8,.25,1]},style:{filter:`drop-shadow(0 0 8px hsl(var(${h}) / 0.3))`}}),L.map((l,d)=>e.jsx(y.motion.circle,{cx:x,cy:u,r:4,fill:`hsl(var(${h}))`,stroke:"hsl(var(--background))",strokeWidth:2,initial:!1,animate:{cx:i?l.x:x,cy:i?l.y:u},transition:{duration:.8,delay:d*.05},style:{filter:`drop-shadow(0 0 4px hsl(var(${h}) / 0.5))`}},d)),t.map((l,d)=>{const b=T(d,m+20);return e.jsx("text",{x:b.x,y:b.y,textAnchor:"middle",dominantBaseline:"middle",className:"font-display text-[9px] font-bold tracking-[0.1em] uppercase",fill:"hsl(var(--muted-foreground))",children:l.label},d)})]})})});ae.displayName="RadarChart";const oe=n.forwardRef(({children:t,systemLabel:r="SYS::ENDFIELD v2.0",lat:s="LAT 37.7749°N",lon:a="LON 122.4194°W",showCoords:o=!0,showCrosshair:c=!0,className:i},f)=>{const[x,u]=n.useState("");return n.useEffect(()=>{const m=()=>u(new Date().toLocaleTimeString("en-GB"));m();const v=setInterval(m,1e3);return()=>clearInterval(v)},[]),e.jsxs("div",{ref:f,className:`relative border border-border bg-surface-0 aspect-video flex items-center justify-center overflow-hidden${i?` ${i}`:""}`,children:[e.jsx("div",{className:"absolute inset-0 scanline-overlay"}),["top-3 left-3 border-t-2 border-l-2","top-3 right-3 border-t-2 border-r-2","bottom-3 left-3 border-b-2 border-l-2","bottom-3 right-3 border-b-2 border-r-2"].map((m,v)=>e.jsx("div",{className:`absolute w-8 h-8 ${m} border-primary/40 pointer-events-none`},v)),c&&e.jsxs("div",{className:"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none",children:[e.jsx("div",{className:"w-6 h-px bg-primary/20",style:{position:"absolute",top:"50%",left:"-12px"}}),e.jsx("div",{className:"h-6 w-px bg-primary/20",style:{position:"absolute",left:"50%",top:"-12px"}})]}),o&&e.jsxs("div",{className:"absolute top-4 left-12 font-mono text-[9px] text-muted-foreground/60 space-y-0.5",children:[e.jsx("div",{children:r}),e.jsx("div",{className:"text-primary/60",children:x})]}),o&&e.jsxs("div",{className:"absolute top-4 right-12 font-mono text-[9px] text-muted-foreground/60 text-right space-y-0.5",children:[e.jsx("div",{children:s}),e.jsx("div",{children:a})]}),e.jsxs("div",{className:"absolute bottom-4 left-12 right-12 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-1.5 h-1.5 bg-ef-green",style:{clipPath:"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)"}}),e.jsx("span",{className:"font-mono text-[9px] text-ef-green/80",children:"LINK ACTIVE"})]}),e.jsx("div",{className:"flex gap-4",children:["FPS:60","MEM:47%","NET:12ms"].map(m=>e.jsx("span",{className:"font-mono text-[9px] text-muted-foreground/50",children:m},m))})]}),e.jsx("div",{className:"relative z-10",children:t})]})});oe.displayName="HUDOverlay";Object.defineProperty(exports,"toast",{enumerable:!0,get:()=>G.toast});exports.CoordinateTag=se;exports.DataStream=Z;exports.DiamondLoader=X;exports.GlitchText=Y;exports.HUDOverlay=oe;exports.HoloCard=Q;exports.RadarChart=ae;exports.ScanDivider=re;exports.SonnerToaster=Te;exports.TacticalBadge=ee;exports.TacticalPanel=K;exports.Toast=P;exports.ToastAction=z;exports.ToastClose=k;exports.ToastDescription=C;exports.ToastProvider=H;exports.ToastTitle=O;exports.ToastViewport=I;exports.Toaster=je;exports.Tooltip=xe;exports.TooltipContent=q;exports.TooltipProvider=fe;exports.TooltipTrigger=ge;exports.WarningBanner=te;exports.cn=g;exports.tacticalBadgeVariants=J;exports.toastAction=F;exports.useToast=W;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/lib/utils.ts","../../src/components/ui/tooltip.tsx","../../src/components/ui/toast.tsx","../../src/hooks/use-toast.ts","../../src/components/ui/toaster.tsx","../../src/components/ui/sonner.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import * as React from \"react\";\nimport * as ToastPrimitives from \"@radix-ui/react-toast\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst ToastProvider = ToastPrimitives.Provider;\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n \"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]\",\n className,\n )}\n {...props}\n />\n));\nToastViewport.displayName = ToastPrimitives.Viewport.displayName;\n\nconst toastVariants = cva(\n \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full\",\n {\n variants: {\n variant: {\n default: \"border bg-background text-foreground\",\n destructive:\n \"destructive group border-destructive bg-destructive text-destructive-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n return (\n <ToastPrimitives.Root\n ref={ref}\n className={cn(toastVariants({ variant }), className)}\n {...props}\n />\n );\n});\nToast.displayName = ToastPrimitives.Root.displayName;\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n \"inline-flex h-8 shrink-0 items-center justify-center border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n));\nToastAction.displayName = ToastPrimitives.Action.displayName;\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n \"absolute right-2 top-2 p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600\",\n className,\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n));\nToastClose.displayName = ToastPrimitives.Close.displayName;\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title\n ref={ref}\n className={cn(\"text-sm font-semibold\", className)}\n {...props}\n />\n));\nToastTitle.displayName = ToastPrimitives.Title.displayName;\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description\n ref={ref}\n className={cn(\"text-sm opacity-90\", className)}\n {...props}\n />\n));\nToastDescription.displayName = ToastPrimitives.Description.displayName;\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>;\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>;\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n};\n","import * as React from \"react\";\n\nimport type { ToastActionElement, ToastProps } from \"../components/ui/toast\";\n\nconst TOAST_LIMIT = 1;\nconst TOAST_REMOVE_DELAY = 5000;\n\ntype ToasterToast = ToastProps & {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n action?: ToastActionElement;\n};\n\nconst actionTypes = {\n ADD_TOAST: \"ADD_TOAST\",\n UPDATE_TOAST: \"UPDATE_TOAST\",\n DISMISS_TOAST: \"DISMISS_TOAST\",\n REMOVE_TOAST: \"REMOVE_TOAST\",\n} as const;\n\nlet count = 0;\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER;\n return count.toString();\n}\n\ntype ActionType = typeof actionTypes;\n\ntype Action =\n | {\n type: ActionType[\"ADD_TOAST\"];\n toast: ToasterToast;\n }\n | {\n type: ActionType[\"UPDATE_TOAST\"];\n toast: Partial<ToasterToast>;\n }\n | {\n type: ActionType[\"DISMISS_TOAST\"];\n toastId?: ToasterToast[\"id\"];\n }\n | {\n type: ActionType[\"REMOVE_TOAST\"];\n toastId?: ToasterToast[\"id\"];\n };\n\ninterface State {\n toasts: ToasterToast[];\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: \"REMOVE_TOAST\",\n toastId: toastId,\n });\n }, TOAST_REMOVE_DELAY);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"ADD_TOAST\":\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case \"UPDATE_TOAST\":\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t,\n ),\n };\n\n case \"DISMISS_TOAST\": {\n const { toastId } = action;\n\n // ! Side effects ! - This could be extracted into a dismissToast() action,\n // but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId);\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id);\n });\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t,\n ),\n };\n }\n case \"REMOVE_TOAST\":\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [] };\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n}\n\ntype Toast = Omit<ToasterToast, \"id\">;\n\nfunction toast({ ...props }: Toast) {\n const id = genId();\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: \"UPDATE_TOAST\",\n toast: { ...props, id },\n });\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id });\n\n dispatch({\n type: \"ADD_TOAST\",\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open) dismiss();\n },\n },\n });\n\n return {\n id: id,\n dismiss,\n update,\n };\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState);\n\n React.useEffect(() => {\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, [state]);\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n };\n}\n\nexport { useToast, toast };\n","import { useToast } from \"../../hooks/use-toast\";\nimport {\n Toast,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n} from \"./toast\";\n\nexport function Toaster() {\n const { toasts } = useToast();\n\n return (\n <ToastProvider>\n {toasts.map(function ({ id, title, description, action, ...props }) {\n return (\n <Toast key={id} {...props}>\n <div className=\"grid gap-1\">\n {title && <ToastTitle>{title}</ToastTitle>}\n {description && (\n <ToastDescription>{description}</ToastDescription>\n )}\n </div>\n {action}\n <ToastClose />\n </Toast>\n );\n })}\n <ToastViewport />\n </ToastProvider>\n );\n}\n","import { Toaster as Sonner, toast } from \"sonner\";\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ theme = \"dark\", ...props }: ToasterProps) => {\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster, toast };\n"],"names":["cn","inputs","twMerge","clsx","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","React","className","sideOffset","props","ref","jsx","ToastProvider","ToastPrimitives","ToastViewport","toastVariants","cva","Toast","variant","ToastAction","ToastClose","X","ToastTitle","ToastDescription","TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","toastTimeouts","addToRemoveQueue","toastId","timeout","dispatch","reducer","state","action","t","toast","listeners","memoryState","listener","id","update","dismiss","open","useToast","setState","index","Toaster","toasts","title","description","jsxs","theme","Sonner"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/lib/utils.ts","../../src/components/ui/tooltip.tsx","../../src/components/ui/toast.tsx","../../src/hooks/use-toast.ts","../../src/components/ui/toaster.tsx","../../src/components/ui/sonner.tsx","../../src/components/ui/signature/glitch-text.tsx","../../src/components/ui/signature/diamond-loader.tsx","../../src/components/ui/signature/tactical-panel.tsx","../../src/components/ui/signature/holo-card.tsx","../../src/components/ui/signature/data-stream.tsx","../../src/components/ui/signature/tactical-badge.tsx","../../src/components/ui/signature/warning-banner.tsx","../../src/components/ui/signature/scan-divider.tsx","../../src/components/ui/signature/coordinate-tag.tsx","../../src/components/ui/signature/radar-chart.tsx","../../src/components/ui/signature/hud-overlay.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","import * as React from \"react\";\nimport * as ToastPrimitives from \"@radix-ui/react-toast\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst ToastProvider = ToastPrimitives.Provider;\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n \"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]\",\n className,\n )}\n {...props}\n />\n));\nToastViewport.displayName = ToastPrimitives.Viewport.displayName;\n\nconst toastVariants = cva(\n \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full\",\n {\n variants: {\n variant: {\n default: \"border bg-background text-foreground\",\n destructive:\n \"destructive group border-destructive bg-destructive text-destructive-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n return (\n <ToastPrimitives.Root\n ref={ref}\n className={cn(toastVariants({ variant }), className)}\n {...props}\n />\n );\n});\nToast.displayName = ToastPrimitives.Root.displayName;\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n \"inline-flex h-8 shrink-0 items-center justify-center border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n));\nToastAction.displayName = ToastPrimitives.Action.displayName;\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n \"absolute right-2 top-2 p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600\",\n className,\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n));\nToastClose.displayName = ToastPrimitives.Close.displayName;\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title\n ref={ref}\n className={cn(\"text-sm font-semibold\", className)}\n {...props}\n />\n));\nToastTitle.displayName = ToastPrimitives.Title.displayName;\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description\n ref={ref}\n className={cn(\"text-sm opacity-90\", className)}\n {...props}\n />\n));\nToastDescription.displayName = ToastPrimitives.Description.displayName;\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>;\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>;\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n};\n","import * as React from \"react\";\n\nimport type { ToastActionElement, ToastProps } from \"../components/ui/toast\";\n\nconst TOAST_LIMIT = 1;\nconst TOAST_REMOVE_DELAY = 5000;\n\ntype ToasterToast = ToastProps & {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n action?: ToastActionElement;\n};\n\nconst actionTypes = {\n ADD_TOAST: \"ADD_TOAST\",\n UPDATE_TOAST: \"UPDATE_TOAST\",\n DISMISS_TOAST: \"DISMISS_TOAST\",\n REMOVE_TOAST: \"REMOVE_TOAST\",\n} as const;\n\nlet count = 0;\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER;\n return count.toString();\n}\n\ntype ActionType = typeof actionTypes;\n\ntype Action =\n | {\n type: ActionType[\"ADD_TOAST\"];\n toast: ToasterToast;\n }\n | {\n type: ActionType[\"UPDATE_TOAST\"];\n toast: Partial<ToasterToast>;\n }\n | {\n type: ActionType[\"DISMISS_TOAST\"];\n toastId?: ToasterToast[\"id\"];\n }\n | {\n type: ActionType[\"REMOVE_TOAST\"];\n toastId?: ToasterToast[\"id\"];\n };\n\ninterface State {\n toasts: ToasterToast[];\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: \"REMOVE_TOAST\",\n toastId: toastId,\n });\n }, TOAST_REMOVE_DELAY);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"ADD_TOAST\":\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case \"UPDATE_TOAST\":\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t,\n ),\n };\n\n case \"DISMISS_TOAST\": {\n const { toastId } = action;\n\n // ! Side effects ! - This could be extracted into a dismissToast() action,\n // but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId);\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id);\n });\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t,\n ),\n };\n }\n case \"REMOVE_TOAST\":\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [] };\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n}\n\ntype Toast = Omit<ToasterToast, \"id\">;\n\nfunction toast({ ...props }: Toast) {\n const id = genId();\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: \"UPDATE_TOAST\",\n toast: { ...props, id },\n });\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id });\n\n dispatch({\n type: \"ADD_TOAST\",\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open) dismiss();\n },\n },\n });\n\n return {\n id: id,\n dismiss,\n update,\n };\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState);\n\n React.useEffect(() => {\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, [state]);\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n };\n}\n\nexport { useToast, toast };\n","import { useToast } from \"../../hooks/use-toast\";\nimport {\n Toast,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n} from \"./toast\";\n\nexport function Toaster() {\n const { toasts } = useToast();\n\n return (\n <ToastProvider>\n {toasts.map(function ({ id, title, description, action, ...props }) {\n return (\n <Toast key={id} {...props}>\n <div className=\"grid gap-1\">\n {title && <ToastTitle>{title}</ToastTitle>}\n {description && (\n <ToastDescription>{description}</ToastDescription>\n )}\n </div>\n {action}\n <ToastClose />\n </Toast>\n );\n })}\n <ToastViewport />\n </ToastProvider>\n );\n}\n","import { Toaster as Sonner, toast } from \"sonner\";\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ theme = \"dark\", ...props }: ToasterProps) => {\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster, toast };\n","import * as React from \"react\";\n\nexport interface GlitchTextProps {\n children: string;\n className?: string;\n}\n\nexport const GlitchText = React.forwardRef<HTMLSpanElement, GlitchTextProps>(\n ({ children, className = \"\" }, ref) => (\n <span ref={ref} className={`relative inline-block ${className}`}>\n <span className=\"relative z-10\">{children}</span>\n <span\n aria-hidden\n className=\"absolute inset-0 text-ef-cyan opacity-70 animate-glitch\"\n style={{\n clipPath: \"inset(20% 0 50% 0)\",\n transform: \"translate(-2px, 0)\",\n }}\n >\n {children}\n </span>\n <span\n aria-hidden\n className=\"absolute inset-0 text-ef-red opacity-70 animate-glitch\"\n style={{\n clipPath: \"inset(50% 0 20% 0)\",\n transform: \"translate(2px, 0)\",\n animationDelay: \"0.1s\",\n }}\n >\n {children}\n </span>\n </span>\n ),\n);\nGlitchText.displayName = \"GlitchText\";\n","import * as React from \"react\";\n\nexport interface DiamondLoaderProps {\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n className?: string;\n}\n\nconst SIZE_MAP = { sm: 16, md: 28, lg: 44 } as const;\n\nexport const DiamondLoader = React.forwardRef<\n HTMLDivElement,\n DiamondLoaderProps\n>(({ size = \"md\", label, className }, ref) => {\n const s = SIZE_MAP[size];\n return (\n <div\n ref={ref}\n className={`flex flex-col items-center gap-3${className ? ` ${className}` : \"\"}`}\n >\n <div className=\"relative\" style={{ width: s * 2, height: s * 2 }}>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className=\"absolute inset-0 border-2 border-primary\"\n style={{\n transform: `rotate(45deg) scale(${1 - i * 0.25})`,\n animation: `diamondSpin ${1.2 + i * 0.4}s linear infinite${i === 1 ? \" reverse\" : \"\"}`,\n opacity: 1 - i * 0.25,\n }}\n />\n ))}\n </div>\n {label && (\n <span className=\"font-mono text-xs text-muted-foreground tracking-[0.15em] uppercase\">\n {label}\n </span>\n )}\n </div>\n );\n});\nDiamondLoader.displayName = \"DiamondLoader\";\n","import * as React from \"react\";\nimport { Crosshair } from \"lucide-react\";\n\nexport interface TacticalPanelProps {\n title: string;\n status?: \"online\" | \"warning\" | \"offline\" | \"scanning\";\n children: React.ReactNode;\n className?: string;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n online: \"ONLINE\",\n warning: \"CAUTION\",\n offline: \"OFFLINE\",\n scanning: \"SCANNING\",\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n online: \"bg-ef-green\",\n warning: \"bg-ef-yellow\",\n offline: \"bg-ef-red\",\n scanning: \"bg-ef-cyan animate-pulse\",\n};\n\nexport const TacticalPanel = React.forwardRef<\n HTMLDivElement,\n TacticalPanelProps\n>(({ title, status = \"online\", children, className }, ref) => (\n <div\n ref={ref}\n className={`relative border border-border bg-surface-1 scanline-overlay${className ? ` ${className}` : \"\"}`}\n >\n {/* HUD Header */}\n <div className=\"flex items-center justify-between px-4 py-2.5 border-b border-border bg-surface-0\">\n <div className=\"flex items-center gap-3\">\n <Crosshair className=\"w-3.5 h-3.5 text-primary\" />\n <span className=\"font-display text-[11px] font-bold tracking-[0.15em] uppercase text-foreground\">\n {title}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <div\n className={`w-2 h-2 ${STATUS_COLORS[status]}`}\n style={{ clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" }}\n />\n <span className=\"font-mono text-[10px] tracking-[0.1em] text-muted-foreground\">\n {STATUS_LABELS[status]}\n </span>\n </div>\n </div>\n {/* Corner accents */}\n <div className=\"absolute top-0 left-0 w-6 h-6 border-t-2 border-l-2 border-primary/40 pointer-events-none\" />\n <div className=\"absolute top-0 right-0 w-6 h-6 border-t-2 border-r-2 border-primary/40 pointer-events-none\" />\n <div className=\"absolute bottom-0 left-0 w-6 h-6 border-b-2 border-l-2 border-primary/40 pointer-events-none\" />\n <div className=\"absolute bottom-0 right-0 w-6 h-6 border-b-2 border-r-2 border-primary/40 pointer-events-none\" />\n {/* Content */}\n <div className=\"p-5\">{children}</div>\n </div>\n));\nTacticalPanel.displayName = \"TacticalPanel\";\n","import * as React from \"react\";\n\nexport interface HoloCardProps {\n title: string;\n subtitle: string;\n icon: React.ElementType;\n value?: string;\n className?: string;\n}\n\nexport const HoloCard = React.forwardRef<HTMLDivElement, HoloCardProps>(\n ({ title, subtitle, icon: Icon, value, className }, ref) => {\n const [hovering, setHovering] = React.useState(false);\n return (\n <div\n ref={ref}\n className={`relative clip-corner border border-border bg-surface-1 p-6 overflow-hidden group cursor-pointer transition-all duration-500 hover:border-primary/30${className ? ` ${className}` : \"\"}`}\n onMouseEnter={() => setHovering(true)}\n onMouseLeave={() => setHovering(false)}\n >\n {/* Scan line */}\n <div\n className=\"absolute left-0 right-0 h-px bg-gradient-to-r from-transparent via-primary/60 to-transparent pointer-events-none transition-all\"\n style={{\n top: hovering ? \"100%\" : \"-10%\",\n opacity: hovering ? 1 : 0,\n transitionDuration: \"2000ms\",\n }}\n />\n {/* Holographic shimmer */}\n <div\n className=\"absolute inset-0 pointer-events-none transition-opacity duration-500\"\n style={{\n background:\n \"linear-gradient(135deg, transparent 0%, hsl(var(--primary) / 0.03) 40%, transparent 60%)\",\n opacity: hovering ? 1 : 0,\n }}\n />\n <div className=\"relative z-10\">\n <Icon className=\"w-5 h-5 text-primary mb-4 group-hover:drop-shadow-[0_0_8px_hsl(var(--primary)/0.5)] transition-all\" />\n {value && (\n <p className=\"font-display text-3xl font-bold text-primary mb-1\">\n {value}\n </p>\n )}\n <h4 className=\"font-display text-sm font-bold tracking-[0.05em] uppercase text-foreground mb-1\">\n {title}\n </h4>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n {/* Bottom diamond */}\n <div className=\"absolute bottom-3 right-3 text-primary/20 group-hover:text-primary/60 transition-colors text-xs\">\n ◆\n </div>\n </div>\n );\n },\n);\nHoloCard.displayName = \"HoloCard\";\n","import * as React from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { Terminal } from \"lucide-react\";\n\nconst DEFAULT_MESSAGES = [\n \"[SYS] Initializing ENDFIELD protocol...\",\n \"[NET] Connection established — latency: 12ms\",\n \"[SEC] Authentication verified ◆ Level: ALPHA\",\n \"[DAT] Loading design tokens: 94 variables mapped\",\n \"[GPU] Render pipeline: Optimized (60fps locked)\",\n \"[SYS] Component registry: 70 modules online\",\n \"[NET] Sync complete — all nodes operational\",\n \"[DAT] Color system: HSL-based, 9 neutrals, 9 accents\",\n \"[SEC] Encryption: AES-256 ◆ Status: ACTIVE\",\n \"[SYS] ENDFIELD DESIGN SYSTEM v2.0 ◆ READY\",\n];\n\nexport interface DataStreamProps {\n messages?: string[];\n className?: string;\n}\n\nexport const DataStream = React.forwardRef<HTMLDivElement, DataStreamProps>(\n ({ messages = DEFAULT_MESSAGES, className }, ref) => {\n const [lines, setLines] = React.useState<string[]>([]);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n setLines((prev) => {\n const next = [...prev, messages[i % messages.length]];\n return next.length > 8 ? next.slice(-8) : next;\n });\n i++;\n }, 1200);\n return () => clearInterval(interval);\n }, [messages]);\n\n React.useEffect(() => {\n if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }, [lines]);\n\n return (\n <div\n ref={ref}\n className={`border border-border bg-background clip-corner overflow-hidden${className ? ` ${className}` : \"\"}`}\n >\n <div className=\"flex items-center gap-2 px-4 py-2 border-b border-border bg-surface-0\">\n <Terminal className=\"w-3.5 h-3.5 text-primary\" />\n <span className=\"font-mono text-[10px] tracking-[0.1em] text-muted-foreground uppercase\">\n LIVE FEED\n </span>\n <div className=\"ml-auto flex items-center gap-1.5\">\n <div\n className=\"w-1.5 h-1.5 bg-ef-green animate-pulse\"\n style={{ clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" }}\n />\n <span className=\"font-mono text-[10px] text-ef-green\">ACTIVE</span>\n </div>\n </div>\n <div\n ref={containerRef}\n className=\"p-4 h-48 overflow-y-auto font-mono text-xs space-y-1\"\n >\n <AnimatePresence>\n {lines.map((line, i) => (\n <motion.div\n key={`${line}-${i}`}\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n className={\n line.includes(\"[SEC]\")\n ? \"text-ef-green\"\n : line.includes(\"[NET]\")\n ? \"text-ef-blue\"\n : line.includes(\"[DAT]\")\n ? \"text-ef-cyan\"\n : line.includes(\"[GPU]\")\n ? \"text-ef-purple\"\n : \"text-muted-foreground\"\n }\n >\n {line}\n </motion.div>\n ))}\n </AnimatePresence>\n <span className=\"inline-block w-2 h-4 bg-primary animate-cursor-blink\" />\n </div>\n </div>\n );\n },\n);\nDataStream.displayName = \"DataStream\";\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\nexport const tacticalBadgeVariants = cva(\n \"inline-flex items-center gap-1.5 clip-corner-sm border px-3 py-1 font-display text-[10px] font-bold tracking-[0.15em] uppercase\",\n {\n variants: {\n variant: {\n default: \"border-primary/40 text-primary bg-primary/10\",\n success: \"border-ef-green/40 text-ef-green bg-ef-green/10\",\n warning: \"border-ef-yellow/40 text-ef-yellow bg-ef-yellow/10\",\n danger: \"border-ef-red/40 text-ef-red bg-ef-red/10\",\n info: \"border-ef-cyan/40 text-ef-cyan bg-ef-cyan/10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface TacticalBadgeProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof tacticalBadgeVariants> {}\n\nexport const TacticalBadge = React.forwardRef<\n HTMLSpanElement,\n TacticalBadgeProps\n>(({ variant, className, children, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(tacticalBadgeVariants({ variant }), className)}\n {...props}\n >\n <span style={{ fontSize: \"6px\" }}>◆</span>\n {children}\n </span>\n));\nTacticalBadge.displayName = \"TacticalBadge\";\n","import * as React from \"react\";\nimport { AlertTriangle } from \"lucide-react\";\n\nexport interface WarningBannerProps {\n level?: \"caution\" | \"alert\" | \"critical\";\n children: React.ReactNode;\n className?: string;\n}\n\nconst WARNING_STYLES = {\n caution: {\n border: \"border-ef-yellow/30\",\n bg: \"bg-ef-yellow/5\",\n icon: \"text-ef-yellow\",\n label: \"CAUTION\",\n },\n alert: {\n border: \"border-ef-orange/30\",\n bg: \"bg-ef-orange/5\",\n icon: \"text-ef-orange\",\n label: \"ALERT\",\n },\n critical: {\n border: \"border-ef-red/30\",\n bg: \"bg-ef-red/5\",\n icon: \"text-ef-red\",\n label: \"CRITICAL\",\n },\n} as const;\n\nexport const WarningBanner = React.forwardRef<\n HTMLDivElement,\n WarningBannerProps\n>(({ level = \"caution\", children, className }, ref) => {\n const s = WARNING_STYLES[level];\n return (\n <div\n ref={ref}\n className={`clip-corner border ${s.border} ${s.bg} p-4 flex items-start gap-3${className ? ` ${className}` : \"\"}`}\n >\n <AlertTriangle className={`w-5 h-5 ${s.icon} shrink-0 mt-0.5`} />\n <div>\n <span\n className={`font-display text-[11px] font-bold tracking-[0.15em] ${s.icon}`}\n >\n {s.label}\n </span>\n <p className=\"text-sm text-muted-foreground mt-1\">{children}</p>\n </div>\n </div>\n );\n});\nWarningBanner.displayName = \"WarningBanner\";\n","import * as React from \"react\";\n\nexport interface ScanDividerProps {\n label?: string;\n className?: string;\n}\n\nexport const ScanDivider = React.forwardRef<HTMLDivElement, ScanDividerProps>(\n ({ label, className }, ref) => (\n <div\n ref={ref}\n className={`relative flex items-center gap-4 py-2${className ? ` ${className}` : \"\"}`}\n >\n <div className=\"flex-1 h-px bg-gradient-to-r from-transparent via-primary/30 to-transparent\" />\n {label && (\n <span className=\"font-display text-[10px] font-bold tracking-[0.2em] uppercase text-primary/60 flex items-center gap-2\">\n <span style={{ fontSize: \"6px\" }}>◆</span> {label}{\" \"}\n <span style={{ fontSize: \"6px\" }}>◆</span>\n </span>\n )}\n <div className=\"flex-1 h-px bg-gradient-to-r from-transparent via-primary/30 to-transparent\" />\n </div>\n ),\n);\nScanDivider.displayName = \"ScanDivider\";\n","import * as React from \"react\";\n\nexport interface CoordinateTagProps {\n label: string;\n value: string;\n unit?: string;\n className?: string;\n}\n\nexport const CoordinateTag = React.forwardRef<\n HTMLDivElement,\n CoordinateTagProps\n>(({ label, value, unit, className }, ref) => (\n <div\n ref={ref}\n className={`inline-flex items-center border border-border bg-surface-0 overflow-hidden${className ? ` ${className}` : \"\"}`}\n >\n <span className=\"font-mono text-[10px] tracking-[0.1em] uppercase text-muted-foreground bg-surface-2 px-2.5 py-1.5 border-r border-border\">\n {label}\n </span>\n <span className=\"font-mono text-xs text-primary px-2.5 py-1.5 font-bold\">\n {value}\n </span>\n {unit && (\n <span className=\"font-mono text-[10px] text-muted-foreground pr-2.5\">\n {unit}\n </span>\n )}\n </div>\n));\nCoordinateTag.displayName = \"CoordinateTag\";\n","import * as React from \"react\";\nimport { motion, useInView } from \"framer-motion\";\n\nexport interface RadarChartDataPoint {\n label: string;\n value: number;\n}\n\nexport interface RadarChartProps {\n data: RadarChartDataPoint[];\n size?: number;\n color?: \"primary\" | \"cyan\";\n className?: string;\n}\n\nexport const RadarChart = React.forwardRef<HTMLDivElement, RadarChartProps>(\n ({ data, size = 260, color = \"primary\", className }, forwardedRef) => {\n // useInView requires a RefObject — maintain an internal ref and merge with\n // the forwarded ref via a callback so both are kept in sync.\n const innerRef = React.useRef<HTMLDivElement>(null);\n const isInView = useInView(innerRef, { once: true });\n\n const mergeRef = React.useCallback(\n (el: HTMLDivElement | null) => {\n (innerRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(el);\n } else if (forwardedRef) {\n (\n forwardedRef as React.MutableRefObject<HTMLDivElement | null>\n ).current = el;\n }\n },\n [forwardedRef],\n );\n\n const cx = size / 2;\n const cy = size / 2;\n const r = size * 0.38;\n const levels = 4;\n const n = data.length;\n const angleStep = (Math.PI * 2) / n;\n\n const colorVar = color === \"cyan\" ? \"--ef-cyan\" : \"--primary\";\n\n const getPoint = (i: number, radius: number) => ({\n x: cx + radius * Math.sin(i * angleStep),\n y: cy - radius * Math.cos(i * angleStep),\n });\n\n const gridPolygons = Array.from({ length: levels }, (_, level) => {\n const lr = r * ((level + 1) / levels);\n return data\n .map((_, i) => getPoint(i, lr))\n .map((p) => `${p.x},${p.y}`)\n .join(\" \");\n });\n\n const dataPoints = data.map((d, i) => getPoint(i, (d.value / 100) * r));\n const dataPath = dataPoints.map((p) => `${p.x},${p.y}`).join(\" \");\n const centerPath = data.map(() => `${cx},${cy}`).join(\" \");\n\n return (\n <div\n ref={mergeRef}\n className={`flex flex-col items-center w-full${className ? ` ${className}` : \"\"}`}\n >\n <svg\n viewBox={`0 0 ${size} ${size}`}\n className=\"w-full max-w-[260px] h-auto overflow-visible\"\n >\n {/* Grid rings */}\n {gridPolygons.map((pts, i) => (\n <polygon\n key={i}\n points={pts}\n fill=\"none\"\n stroke=\"hsl(var(--border))\"\n strokeWidth={1}\n opacity={0.5}\n />\n ))}\n {/* Axes */}\n {data.map((_, i) => {\n const p = getPoint(i, r);\n return (\n <line\n key={i}\n x1={cx}\n y1={cy}\n x2={p.x}\n y2={p.y}\n stroke=\"hsl(var(--border))\"\n strokeWidth={1}\n opacity={0.3}\n />\n );\n })}\n {/* Data area */}\n <motion.polygon\n points={isInView ? dataPath : centerPath}\n fill={`hsl(var(${colorVar}) / 0.15)`}\n stroke={`hsl(var(${colorVar}))`}\n strokeWidth={2}\n initial={false}\n animate={{ points: isInView ? dataPath : centerPath }}\n transition={{ duration: 0.8, ease: [0.25, 0.8, 0.25, 1] }}\n style={{\n filter: `drop-shadow(0 0 8px hsl(var(${colorVar}) / 0.3))`,\n }}\n />\n {/* Data points */}\n {dataPoints.map((p, i) => (\n <motion.circle\n key={i}\n cx={cx}\n cy={cy}\n r={4}\n fill={`hsl(var(${colorVar}))`}\n stroke=\"hsl(var(--background))\"\n strokeWidth={2}\n initial={false}\n animate={{ cx: isInView ? p.x : cx, cy: isInView ? p.y : cy }}\n transition={{ duration: 0.8, delay: i * 0.05 }}\n style={{\n filter: `drop-shadow(0 0 4px hsl(var(${colorVar}) / 0.5))`,\n }}\n />\n ))}\n {/* Labels */}\n {data.map((d, i) => {\n const p = getPoint(i, r + 20);\n return (\n <text\n key={i}\n x={p.x}\n y={p.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n className=\"font-display text-[9px] font-bold tracking-[0.1em] uppercase\"\n fill=\"hsl(var(--muted-foreground))\"\n >\n {d.label}\n </text>\n );\n })}\n </svg>\n </div>\n );\n },\n);\nRadarChart.displayName = \"RadarChart\";\n","import * as React from \"react\";\n\nexport interface HUDOverlayProps {\n children?: React.ReactNode;\n systemLabel?: string;\n lat?: string;\n lon?: string;\n showCoords?: boolean;\n showCrosshair?: boolean;\n className?: string;\n}\n\nexport const HUDOverlay = React.forwardRef<HTMLDivElement, HUDOverlayProps>(\n (\n {\n children,\n systemLabel = \"SYS::ENDFIELD v2.0\",\n lat = \"LAT 37.7749°N\",\n lon = \"LON 122.4194°W\",\n showCoords = true,\n showCrosshair = true,\n className,\n },\n ref,\n ) => {\n const [time, setTime] = React.useState(\"\");\n\n React.useEffect(() => {\n const tick = () => setTime(new Date().toLocaleTimeString(\"en-GB\"));\n tick();\n const id = setInterval(tick, 1000);\n return () => clearInterval(id);\n }, []);\n\n return (\n <div\n ref={ref}\n className={`relative border border-border bg-surface-0 aspect-video flex items-center justify-center overflow-hidden${className ? ` ${className}` : \"\"}`}\n >\n {/* Scanline overlay */}\n <div className=\"absolute inset-0 scanline-overlay\" />\n {/* Corner brackets */}\n {(\n [\n \"top-3 left-3 border-t-2 border-l-2\",\n \"top-3 right-3 border-t-2 border-r-2\",\n \"bottom-3 left-3 border-b-2 border-l-2\",\n \"bottom-3 right-3 border-b-2 border-r-2\",\n ] as const\n ).map((pos, i) => (\n <div\n key={i}\n className={`absolute w-8 h-8 ${pos} border-primary/40 pointer-events-none`}\n />\n ))}\n {/* Crosshair */}\n {showCrosshair && (\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 pointer-events-none\">\n <div\n className=\"w-6 h-px bg-primary/20\"\n style={{ position: \"absolute\", top: \"50%\", left: \"-12px\" }}\n />\n <div\n className=\"h-6 w-px bg-primary/20\"\n style={{ position: \"absolute\", left: \"50%\", top: \"-12px\" }}\n />\n </div>\n )}\n {/* Top-left: system label + live time */}\n {showCoords && (\n <div className=\"absolute top-4 left-12 font-mono text-[9px] text-muted-foreground/60 space-y-0.5\">\n <div>{systemLabel}</div>\n <div className=\"text-primary/60\">{time}</div>\n </div>\n )}\n {/* Top-right: coordinates */}\n {showCoords && (\n <div className=\"absolute top-4 right-12 font-mono text-[9px] text-muted-foreground/60 text-right space-y-0.5\">\n <div>{lat}</div>\n <div>{lon}</div>\n </div>\n )}\n {/* Bottom status bar */}\n <div className=\"absolute bottom-4 left-12 right-12 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div\n className=\"w-1.5 h-1.5 bg-ef-green\"\n style={{ clipPath: \"polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)\" }}\n />\n <span className=\"font-mono text-[9px] text-ef-green/80\">\n LINK ACTIVE\n </span>\n </div>\n <div className=\"flex gap-4\">\n {[\"FPS:60\", \"MEM:47%\", \"NET:12ms\"].map((s) => (\n <span\n key={s}\n className=\"font-mono text-[9px] text-muted-foreground/50\"\n >\n {s}\n </span>\n ))}\n </div>\n </div>\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n },\n);\nHUDOverlay.displayName = \"HUDOverlay\";\n"],"names":["cn","inputs","twMerge","clsx","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","React","className","sideOffset","props","ref","jsx","ToastProvider","ToastPrimitives","ToastViewport","toastVariants","cva","Toast","variant","ToastAction","ToastClose","X","ToastTitle","ToastDescription","TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","toastTimeouts","addToRemoveQueue","toastId","timeout","dispatch","reducer","state","action","t","toast","listeners","memoryState","listener","id","update","dismiss","open","useToast","setState","index","Toaster","toasts","title","description","jsxs","theme","Sonner","GlitchText","children","SIZE_MAP","DiamondLoader","size","label","s","i","STATUS_LABELS","STATUS_COLORS","TacticalPanel","status","Crosshair","HoloCard","subtitle","Icon","value","hovering","setHovering","DEFAULT_MESSAGES","DataStream","messages","lines","setLines","containerRef","interval","prev","next","Terminal","AnimatePresence","line","motion","tacticalBadgeVariants","TacticalBadge","WARNING_STYLES","WarningBanner","level","AlertTriangle","ScanDivider","CoordinateTag","unit","RadarChart","data","color","forwardedRef","innerRef","isInView","useInView","mergeRef","el","cx","cy","r","levels","n","angleStep","colorVar","getPoint","radius","gridPolygons","_","lr","p","dataPoints","d","dataPath","centerPath","pts","HUDOverlay","systemLabel","lat","lon","showCoords","showCrosshair","time","setTime","tick","pos"],"mappings":"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"}
@@ -10,8 +10,100 @@ import { VariantProps } from 'class-variance-authority';
10
10
 
11
11
  export declare function cn(...inputs: ClassValue[]): string;
12
12
 
13
+ export declare const CoordinateTag: React_2.ForwardRefExoticComponent<CoordinateTagProps & React_2.RefAttributes<HTMLDivElement>>;
14
+
15
+ export declare interface CoordinateTagProps {
16
+ label: string;
17
+ value: string;
18
+ unit?: string;
19
+ className?: string;
20
+ }
21
+
22
+ export declare const DataStream: React_2.ForwardRefExoticComponent<DataStreamProps & React_2.RefAttributes<HTMLDivElement>>;
23
+
24
+ export declare interface DataStreamProps {
25
+ messages?: string[];
26
+ className?: string;
27
+ }
28
+
29
+ export declare const DiamondLoader: React_2.ForwardRefExoticComponent<DiamondLoaderProps & React_2.RefAttributes<HTMLDivElement>>;
30
+
31
+ export declare interface DiamondLoaderProps {
32
+ size?: "sm" | "md" | "lg";
33
+ label?: string;
34
+ className?: string;
35
+ }
36
+
37
+ export declare const GlitchText: React_2.ForwardRefExoticComponent<GlitchTextProps & React_2.RefAttributes<HTMLSpanElement>>;
38
+
39
+ export declare interface GlitchTextProps {
40
+ children: string;
41
+ className?: string;
42
+ }
43
+
44
+ export declare const HoloCard: React_2.ForwardRefExoticComponent<HoloCardProps & React_2.RefAttributes<HTMLDivElement>>;
45
+
46
+ export declare interface HoloCardProps {
47
+ title: string;
48
+ subtitle: string;
49
+ icon: React_2.ElementType;
50
+ value?: string;
51
+ className?: string;
52
+ }
53
+
54
+ export declare const HUDOverlay: React_2.ForwardRefExoticComponent<HUDOverlayProps & React_2.RefAttributes<HTMLDivElement>>;
55
+
56
+ export declare interface HUDOverlayProps {
57
+ children?: React_2.ReactNode;
58
+ systemLabel?: string;
59
+ lat?: string;
60
+ lon?: string;
61
+ showCoords?: boolean;
62
+ showCrosshair?: boolean;
63
+ className?: string;
64
+ }
65
+
66
+ export declare const RadarChart: React_2.ForwardRefExoticComponent<RadarChartProps & React_2.RefAttributes<HTMLDivElement>>;
67
+
68
+ export declare interface RadarChartDataPoint {
69
+ label: string;
70
+ value: number;
71
+ }
72
+
73
+ export declare interface RadarChartProps {
74
+ data: RadarChartDataPoint[];
75
+ size?: number;
76
+ color?: "primary" | "cyan";
77
+ className?: string;
78
+ }
79
+
80
+ export declare const ScanDivider: React_2.ForwardRefExoticComponent<ScanDividerProps & React_2.RefAttributes<HTMLDivElement>>;
81
+
82
+ export declare interface ScanDividerProps {
83
+ label?: string;
84
+ className?: string;
85
+ }
86
+
13
87
  export declare const SonnerToaster: ({ theme, ...props }: ToasterProps) => JSX_2.Element;
14
88
 
89
+ export declare const TacticalBadge: React_2.ForwardRefExoticComponent<TacticalBadgeProps & React_2.RefAttributes<HTMLSpanElement>>;
90
+
91
+ export declare interface TacticalBadgeProps extends React_2.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof tacticalBadgeVariants> {
92
+ }
93
+
94
+ export declare const tacticalBadgeVariants: (props?: ({
95
+ variant?: "default" | "warning" | "success" | "danger" | "info" | null | undefined;
96
+ } & ClassProp) | undefined) => string;
97
+
98
+ export declare const TacticalPanel: React_2.ForwardRefExoticComponent<TacticalPanelProps & React_2.RefAttributes<HTMLDivElement>>;
99
+
100
+ export declare interface TacticalPanelProps {
101
+ title: string;
102
+ status?: "online" | "warning" | "offline" | "scanning";
103
+ children: React_2.ReactNode;
104
+ className?: string;
105
+ }
106
+
15
107
  export declare const Toast: React_2.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastProps & React_2.RefAttributes<HTMLLIElement>, "ref"> & VariantProps<(props?: ({
16
108
  variant?: "default" | "destructive" | null | undefined;
17
109
  } & ClassProp) | undefined) => string> & React_2.RefAttributes<HTMLLIElement>>;
@@ -67,4 +159,12 @@ export declare function useToast(): {
67
159
  toasts: ToasterToast[];
68
160
  };
69
161
 
162
+ export declare const WarningBanner: React_2.ForwardRefExoticComponent<WarningBannerProps & React_2.RefAttributes<HTMLDivElement>>;
163
+
164
+ export declare interface WarningBannerProps {
165
+ level?: "caution" | "alert" | "critical";
166
+ children: React_2.ReactNode;
167
+ className?: string;
168
+ }
169
+
70
170
  export { }