@intecnopt/admin-shell 1.0.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 +244 -0
- package/dist/index.d.mts +102 -0
- package/dist/index.d.ts +102 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +71 -0
- package/src/styles/intecno.css +230 -0
- package/tailwind-preset.js +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# @intecnopt/admin-shell
|
|
2
|
+
|
|
3
|
+
A **production-ready React + TypeScript admin dashboard shell** with beautiful themes, authentication screens, and responsive layouts.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## ✨ Features
|
|
8
|
+
|
|
9
|
+
- 🎨 **4 Beautiful Themes** - Intecno Navy, Dark Mode, Red, and Green
|
|
10
|
+
- 🔐 **Authentication Shell** - Professional login/register pages
|
|
11
|
+
- 📱 **Fully Responsive** - Mobile-first design with collapsible sidebar
|
|
12
|
+
- 🎯 **TypeScript First** - Full type safety out of the box
|
|
13
|
+
- ⚡ **Tailwind CSS** - Easy customization with utility classes
|
|
14
|
+
- 🔧 **Framework Agnostic** - Works with Next.js, Vite, CRA, Remix, and more
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 📦 Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @intecnopt/admin-shell
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 🚀 Quick Start
|
|
27
|
+
|
|
28
|
+
### 1. Add the Tailwind Preset
|
|
29
|
+
|
|
30
|
+
Update your `tailwind.config.js`:
|
|
31
|
+
|
|
32
|
+
```js
|
|
33
|
+
/** @type {import('tailwindcss').Config} */
|
|
34
|
+
module.exports = {
|
|
35
|
+
content: [
|
|
36
|
+
"./src/**/*.{js,ts,jsx,tsx}",
|
|
37
|
+
// Add this line to include IntecnoManager components
|
|
38
|
+
"./node_modules/@intecnopt/admin-shell/**/*.{js,mjs}"
|
|
39
|
+
],
|
|
40
|
+
presets: [require('@intecnopt/admin-shell/preset')],
|
|
41
|
+
theme: {
|
|
42
|
+
extend: {},
|
|
43
|
+
},
|
|
44
|
+
plugins: [],
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. Import the Styles
|
|
49
|
+
|
|
50
|
+
In your main CSS file (e.g., `globals.css` or `index.css`):
|
|
51
|
+
|
|
52
|
+
```css
|
|
53
|
+
/* Tailwind base styles */
|
|
54
|
+
@tailwind base;
|
|
55
|
+
@tailwind components;
|
|
56
|
+
@tailwind utilities;
|
|
57
|
+
|
|
58
|
+
/* IntecnoManager theme styles - MUST come after Tailwind */
|
|
59
|
+
@import '@intecnopt/admin-shell/styles';
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Or** import directly in your entry file (e.g., `main.tsx`):
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import '@intecnopt/admin-shell/styles';
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 3. Use the Components
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { AdminShell, AuthShell } from '@intecnopt/admin-shell';
|
|
72
|
+
import type { AdminTab } from '@intecnopt/admin-shell';
|
|
73
|
+
import { LayoutDashboard, Users, Settings } from 'lucide-react';
|
|
74
|
+
|
|
75
|
+
// Define your navigation tabs
|
|
76
|
+
const tabs: AdminTab[] = [
|
|
77
|
+
{ key: 'dashboard', label: 'Dashboard', icon: <LayoutDashboard size={18} />, group: 'Main' },
|
|
78
|
+
{ key: 'users', label: 'Users', icon: <Users size={18} />, group: 'Main' },
|
|
79
|
+
{ key: 'settings', label: 'Settings', icon: <Settings size={18} />, group: 'System' },
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
// Dashboard Layout
|
|
83
|
+
function Dashboard() {
|
|
84
|
+
return (
|
|
85
|
+
<AdminShell
|
|
86
|
+
tabs={tabs}
|
|
87
|
+
activeKey="dashboard"
|
|
88
|
+
brandName="MyApp"
|
|
89
|
+
userLabel="John Doe"
|
|
90
|
+
onLogout={() => console.log('Logout')}
|
|
91
|
+
currentTheme="default"
|
|
92
|
+
onThemeChange={(theme) => console.log('Theme:', theme)}
|
|
93
|
+
>
|
|
94
|
+
<div>Your dashboard content here</div>
|
|
95
|
+
</AdminShell>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Login Page
|
|
100
|
+
function Login() {
|
|
101
|
+
return (
|
|
102
|
+
<AuthShell brandName="MyApp">
|
|
103
|
+
<form>
|
|
104
|
+
<input type="email" placeholder="Email" />
|
|
105
|
+
<input type="password" placeholder="Password" />
|
|
106
|
+
<button type="submit">Sign In</button>
|
|
107
|
+
</form>
|
|
108
|
+
</AuthShell>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 🎨 Theming
|
|
116
|
+
|
|
117
|
+
IntecnoManager comes with 4 built-in themes. Switch themes by setting the `data-theme` attribute on your `<html>` or root element:
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
// In your app
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
document.documentElement.setAttribute('data-theme', currentTheme);
|
|
123
|
+
}, [currentTheme]);
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Available Themes
|
|
127
|
+
|
|
128
|
+
| Theme | Value | Description |
|
|
129
|
+
|-------|-------|-------------|
|
|
130
|
+
| Intecno Navy | `default` | Deep blue professional look |
|
|
131
|
+
| Dark Mode | `dark` | True black/zinc neutral |
|
|
132
|
+
| Red | `red` | Bold red/crimson theme |
|
|
133
|
+
| Green | `green` | Forest green light mode |
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 📚 API Reference
|
|
138
|
+
|
|
139
|
+
### AdminShell Props
|
|
140
|
+
|
|
141
|
+
| Prop | Type | Description |
|
|
142
|
+
|------|------|-------------|
|
|
143
|
+
| `tabs` | `AdminTab[]` | Navigation items |
|
|
144
|
+
| `activeKey` | `string` | Currently active tab key |
|
|
145
|
+
| `children` | `ReactNode` | Main content |
|
|
146
|
+
| `brandName` | `string` | App name in sidebar |
|
|
147
|
+
| `logo` | `ReactNode` | Logo element |
|
|
148
|
+
| `userLabel` | `string` | Current user name |
|
|
149
|
+
| `onLogout` | `() => void` | Logout handler |
|
|
150
|
+
| `currentTheme` | `string` | Active theme ID |
|
|
151
|
+
| `onThemeChange` | `(theme: string) => void` | Theme change handler |
|
|
152
|
+
| `LinkComponent` | `React.ComponentType` | Custom link component (for Next.js, etc.) |
|
|
153
|
+
| `basePath` | `string` | Base URL path for links |
|
|
154
|
+
|
|
155
|
+
### AuthShell Props
|
|
156
|
+
|
|
157
|
+
| Prop | Type | Description |
|
|
158
|
+
|------|------|-------------|
|
|
159
|
+
| `children` | `ReactNode` | Login form content |
|
|
160
|
+
| `brandName` | `string` | App name |
|
|
161
|
+
| `logo` | `ReactNode` | Logo element |
|
|
162
|
+
| `quote` | `string` | Inspirational quote |
|
|
163
|
+
| `quoteAuthor` | `string` | Quote author |
|
|
164
|
+
|
|
165
|
+
### AdminTab Type
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
interface AdminTab {
|
|
169
|
+
key: string; // Unique identifier
|
|
170
|
+
label: string; // Display text
|
|
171
|
+
icon?: ReactNode; // Icon element
|
|
172
|
+
badge?: string | number; // Optional badge
|
|
173
|
+
group?: string; // Navigation group
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 🔗 Framework Integration
|
|
180
|
+
|
|
181
|
+
### Next.js (App Router)
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
// Use the LinkComponent prop for Next.js routing
|
|
185
|
+
import Link from 'next/link';
|
|
186
|
+
|
|
187
|
+
<AdminShell
|
|
188
|
+
LinkComponent={Link}
|
|
189
|
+
basePath="/admin"
|
|
190
|
+
// ...other props
|
|
191
|
+
/>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### React Router
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
import { Link } from 'react-router-dom';
|
|
198
|
+
|
|
199
|
+
<AdminShell
|
|
200
|
+
LinkComponent={Link}
|
|
201
|
+
basePath=""
|
|
202
|
+
// ...other props
|
|
203
|
+
/>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 📋 Requirements
|
|
209
|
+
|
|
210
|
+
- **React** ≥ 18.0.0
|
|
211
|
+
- **React DOM** ≥ 18.0.0
|
|
212
|
+
- **Tailwind CSS** ≥ 3.0.0
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 🛠️ Development
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
# Clone the repo
|
|
220
|
+
git clone https://github.com/intecnopt/admin-shell.git
|
|
221
|
+
|
|
222
|
+
# Install dependencies
|
|
223
|
+
npm install
|
|
224
|
+
|
|
225
|
+
# Build the library
|
|
226
|
+
npm run build
|
|
227
|
+
|
|
228
|
+
# Run the example app
|
|
229
|
+
cd example && npm install && npm run dev
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 📄 License
|
|
235
|
+
|
|
236
|
+
MIT © [Intecno](https://intecnopt.com)
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 🤝 Support
|
|
241
|
+
|
|
242
|
+
- 🌐 Website: [intecnopt.com](https://intecnopt.com)
|
|
243
|
+
- 📧 Email: contact@intecnopt.com
|
|
244
|
+
- 🐛 Issues: [GitHub Issues](https://github.com/intecnopt/admin-shell/issues)
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
type AdminTab = {
|
|
5
|
+
key: string;
|
|
6
|
+
label: string;
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
badge?: string | number;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
group?: string;
|
|
11
|
+
};
|
|
12
|
+
type LinkComponentProps = {
|
|
13
|
+
href: string;
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
};
|
|
17
|
+
type AdminShellProps = {
|
|
18
|
+
tabs: AdminTab[];
|
|
19
|
+
activeKey: string;
|
|
20
|
+
children: React.ReactNode;
|
|
21
|
+
LinkComponent: React.ComponentType<LinkComponentProps>;
|
|
22
|
+
basePath?: string;
|
|
23
|
+
brandName?: string;
|
|
24
|
+
logo?: React.ReactNode;
|
|
25
|
+
userLabel?: string;
|
|
26
|
+
onLogout?: () => void;
|
|
27
|
+
currentTheme?: string;
|
|
28
|
+
onThemeChange?: (theme: string) => void;
|
|
29
|
+
};
|
|
30
|
+
type TopbarProps = {
|
|
31
|
+
onToggleSidebar: () => void;
|
|
32
|
+
userLabel?: string;
|
|
33
|
+
onLogout?: () => void;
|
|
34
|
+
currentTheme?: string;
|
|
35
|
+
onThemeChange?: (theme: string) => void;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
declare function AdminShell({ tabs, activeKey, children, LinkComponent, basePath, brandName, logo, userLabel, onLogout, currentTheme, onThemeChange }: AdminShellProps): react_jsx_runtime.JSX.Element;
|
|
39
|
+
|
|
40
|
+
interface SidebarProps {
|
|
41
|
+
tabs: AdminTab[];
|
|
42
|
+
activeKey: string;
|
|
43
|
+
LinkComponent: React.ComponentType<LinkComponentProps>;
|
|
44
|
+
basePath?: string;
|
|
45
|
+
isOpen: boolean;
|
|
46
|
+
onClose: () => void;
|
|
47
|
+
brandName?: string;
|
|
48
|
+
logo?: React.ReactNode;
|
|
49
|
+
}
|
|
50
|
+
declare function Sidebar({ isOpen, onClose, brandName, logo, tabs, activeKey, LinkComponent, basePath }: SidebarProps): react_jsx_runtime.JSX.Element;
|
|
51
|
+
|
|
52
|
+
declare function Topbar({ onToggleSidebar, userLabel, onLogout, currentTheme, onThemeChange }: TopbarProps): react_jsx_runtime.JSX.Element;
|
|
53
|
+
|
|
54
|
+
interface EmptyStateProps {
|
|
55
|
+
title: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
icon?: React.ReactNode;
|
|
58
|
+
action?: React.ReactNode;
|
|
59
|
+
className?: string;
|
|
60
|
+
}
|
|
61
|
+
declare function EmptyState({ title, description, icon, action, className }: EmptyStateProps): react_jsx_runtime.JSX.Element;
|
|
62
|
+
|
|
63
|
+
interface SectionProps {
|
|
64
|
+
children: React.ReactNode;
|
|
65
|
+
className?: string;
|
|
66
|
+
title?: string;
|
|
67
|
+
description?: string;
|
|
68
|
+
actions?: React.ReactNode;
|
|
69
|
+
}
|
|
70
|
+
declare function Section({ children, className, title, description, actions }: SectionProps): react_jsx_runtime.JSX.Element;
|
|
71
|
+
|
|
72
|
+
interface CardProps {
|
|
73
|
+
children: React.ReactNode;
|
|
74
|
+
className?: string;
|
|
75
|
+
title?: string;
|
|
76
|
+
actions?: React.ReactNode;
|
|
77
|
+
}
|
|
78
|
+
declare function Card({ children, className, title, actions }: CardProps): react_jsx_runtime.JSX.Element;
|
|
79
|
+
|
|
80
|
+
interface StatCardProps {
|
|
81
|
+
label: string;
|
|
82
|
+
value: string | number;
|
|
83
|
+
icon?: React.ReactNode;
|
|
84
|
+
trend?: {
|
|
85
|
+
value: string | number;
|
|
86
|
+
direction: 'up' | 'down' | 'neutral';
|
|
87
|
+
label?: string;
|
|
88
|
+
};
|
|
89
|
+
className?: string;
|
|
90
|
+
}
|
|
91
|
+
declare function StatCard({ label, value, icon, trend, className }: StatCardProps): react_jsx_runtime.JSX.Element;
|
|
92
|
+
|
|
93
|
+
interface AuthShellProps {
|
|
94
|
+
children: React.ReactNode;
|
|
95
|
+
brandName?: string;
|
|
96
|
+
logo?: React.ReactNode;
|
|
97
|
+
quote?: string;
|
|
98
|
+
quoteAuthor?: string;
|
|
99
|
+
}
|
|
100
|
+
declare function AuthShell({ children, brandName, logo, quote, quoteAuthor }: AuthShellProps): react_jsx_runtime.JSX.Element;
|
|
101
|
+
|
|
102
|
+
export { AdminShell, type AdminShellProps, type AdminTab, AuthShell, type AuthShellProps, Card, type CardProps, EmptyState, type EmptyStateProps, type LinkComponentProps, Section, type SectionProps, Sidebar, type SidebarProps, StatCard, type StatCardProps, Topbar, type TopbarProps };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
type AdminTab = {
|
|
5
|
+
key: string;
|
|
6
|
+
label: string;
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
badge?: string | number;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
group?: string;
|
|
11
|
+
};
|
|
12
|
+
type LinkComponentProps = {
|
|
13
|
+
href: string;
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
};
|
|
17
|
+
type AdminShellProps = {
|
|
18
|
+
tabs: AdminTab[];
|
|
19
|
+
activeKey: string;
|
|
20
|
+
children: React.ReactNode;
|
|
21
|
+
LinkComponent: React.ComponentType<LinkComponentProps>;
|
|
22
|
+
basePath?: string;
|
|
23
|
+
brandName?: string;
|
|
24
|
+
logo?: React.ReactNode;
|
|
25
|
+
userLabel?: string;
|
|
26
|
+
onLogout?: () => void;
|
|
27
|
+
currentTheme?: string;
|
|
28
|
+
onThemeChange?: (theme: string) => void;
|
|
29
|
+
};
|
|
30
|
+
type TopbarProps = {
|
|
31
|
+
onToggleSidebar: () => void;
|
|
32
|
+
userLabel?: string;
|
|
33
|
+
onLogout?: () => void;
|
|
34
|
+
currentTheme?: string;
|
|
35
|
+
onThemeChange?: (theme: string) => void;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
declare function AdminShell({ tabs, activeKey, children, LinkComponent, basePath, brandName, logo, userLabel, onLogout, currentTheme, onThemeChange }: AdminShellProps): react_jsx_runtime.JSX.Element;
|
|
39
|
+
|
|
40
|
+
interface SidebarProps {
|
|
41
|
+
tabs: AdminTab[];
|
|
42
|
+
activeKey: string;
|
|
43
|
+
LinkComponent: React.ComponentType<LinkComponentProps>;
|
|
44
|
+
basePath?: string;
|
|
45
|
+
isOpen: boolean;
|
|
46
|
+
onClose: () => void;
|
|
47
|
+
brandName?: string;
|
|
48
|
+
logo?: React.ReactNode;
|
|
49
|
+
}
|
|
50
|
+
declare function Sidebar({ isOpen, onClose, brandName, logo, tabs, activeKey, LinkComponent, basePath }: SidebarProps): react_jsx_runtime.JSX.Element;
|
|
51
|
+
|
|
52
|
+
declare function Topbar({ onToggleSidebar, userLabel, onLogout, currentTheme, onThemeChange }: TopbarProps): react_jsx_runtime.JSX.Element;
|
|
53
|
+
|
|
54
|
+
interface EmptyStateProps {
|
|
55
|
+
title: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
icon?: React.ReactNode;
|
|
58
|
+
action?: React.ReactNode;
|
|
59
|
+
className?: string;
|
|
60
|
+
}
|
|
61
|
+
declare function EmptyState({ title, description, icon, action, className }: EmptyStateProps): react_jsx_runtime.JSX.Element;
|
|
62
|
+
|
|
63
|
+
interface SectionProps {
|
|
64
|
+
children: React.ReactNode;
|
|
65
|
+
className?: string;
|
|
66
|
+
title?: string;
|
|
67
|
+
description?: string;
|
|
68
|
+
actions?: React.ReactNode;
|
|
69
|
+
}
|
|
70
|
+
declare function Section({ children, className, title, description, actions }: SectionProps): react_jsx_runtime.JSX.Element;
|
|
71
|
+
|
|
72
|
+
interface CardProps {
|
|
73
|
+
children: React.ReactNode;
|
|
74
|
+
className?: string;
|
|
75
|
+
title?: string;
|
|
76
|
+
actions?: React.ReactNode;
|
|
77
|
+
}
|
|
78
|
+
declare function Card({ children, className, title, actions }: CardProps): react_jsx_runtime.JSX.Element;
|
|
79
|
+
|
|
80
|
+
interface StatCardProps {
|
|
81
|
+
label: string;
|
|
82
|
+
value: string | number;
|
|
83
|
+
icon?: React.ReactNode;
|
|
84
|
+
trend?: {
|
|
85
|
+
value: string | number;
|
|
86
|
+
direction: 'up' | 'down' | 'neutral';
|
|
87
|
+
label?: string;
|
|
88
|
+
};
|
|
89
|
+
className?: string;
|
|
90
|
+
}
|
|
91
|
+
declare function StatCard({ label, value, icon, trend, className }: StatCardProps): react_jsx_runtime.JSX.Element;
|
|
92
|
+
|
|
93
|
+
interface AuthShellProps {
|
|
94
|
+
children: React.ReactNode;
|
|
95
|
+
brandName?: string;
|
|
96
|
+
logo?: React.ReactNode;
|
|
97
|
+
quote?: string;
|
|
98
|
+
quoteAuthor?: string;
|
|
99
|
+
}
|
|
100
|
+
declare function AuthShell({ children, brandName, logo, quote, quoteAuthor }: AuthShellProps): react_jsx_runtime.JSX.Element;
|
|
101
|
+
|
|
102
|
+
export { AdminShell, type AdminShellProps, type AdminTab, AuthShell, type AuthShellProps, Card, type CardProps, EmptyState, type EmptyStateProps, type LinkComponentProps, Section, type SectionProps, Sidebar, type SidebarProps, StatCard, type StatCardProps, Topbar, type TopbarProps };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';var E=require('react'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var E__default=/*#__PURE__*/_interopDefault(E);function _({isOpen:l,onClose:s,brandName:a,logo:r,tabs:d,activeKey:p,LinkComponent:g,basePath:h="/admin"}){return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[l&&jsxRuntime.jsx("div",{className:"fixed inset-0 z-40 bg-gray-900/60 backdrop-blur-sm transition-opacity lg:hidden",onClick:s}),jsxRuntime.jsxs("aside",{className:`
|
|
2
|
+
fixed top-0 left-0 z-50 min-h-screen h-full w-72 bg-theme-sidebar backdrop-blur-xl border-r border-white/5 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.1)] transition-transform duration-300 ease-in-out lg:translate-x-0 lg:static
|
|
3
|
+
${l?"translate-x-0":"-translate-x-full"}
|
|
4
|
+
flex flex-col flex-shrink-0
|
|
5
|
+
`,children:[jsxRuntime.jsx("div",{className:"absolute inset-0 bg-[radial-gradient(circle_at_top_left,_var(--tw-gradient-stops))] from-intecno-blue/10 via-transparent to-transparent pointer-events-none"}),jsxRuntime.jsxs("div",{className:"flex-shrink-0 flex items-center h-20 px-8 border-b border-sidebar-theme bg-theme-sidebar",children:[r&&jsxRuntime.jsx("span",{className:"mr-3",children:r}),a&&jsxRuntime.jsx("span",{className:"text-xl font-bold tracking-tight text-sidebar-primary",children:a})]}),jsxRuntime.jsx("div",{className:"flex flex-col flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent py-4 px-3",children:(()=>{let v=d.reduce((x,o)=>{let u=o.group||"Main Navigation";return x[u]||(x[u]=[]),x[u].push(o),x},{});return Object.entries(v).map(([x,o],u)=>jsxRuntime.jsxs("div",{className:`${u>0?"mt-6":""}`,children:[jsxRuntime.jsx("div",{className:"px-3 mb-2 text-[11px] font-bold text-sidebar-muted uppercase tracking-widest opacity-80",children:x}),jsxRuntime.jsx("div",{className:"space-y-1",children:o.map(c=>{let w=c.key===p,$=`${h}/${c.key}`;return c.disabled?jsxRuntime.jsxs("div",{className:"flex items-center px-3 py-2.5 text-sm font-medium text-sidebar-muted/50 rounded-lg cursor-not-allowed",children:[c.icon&&jsxRuntime.jsx("span",{className:"mr-3 text-lg opacity-40",children:c.icon}),jsxRuntime.jsx("span",{className:"flex-1",children:c.label})]},c.key):jsxRuntime.jsxs(g,{href:$,className:`
|
|
6
|
+
group flex items-center px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-300 ease-out
|
|
7
|
+
${w?"bg-brand text-white shadow-lg scale-[1.02]":"text-sidebar-muted hover:bg-white/10 hover:text-sidebar-primary hover:translate-x-1"}
|
|
8
|
+
`,children:[c.icon&&jsxRuntime.jsx("span",{className:`mr-3 text-lg transition-colors duration-300 ${w?"text-white":"text-sidebar-muted group-hover:text-sidebar-primary"}`,children:c.icon}),jsxRuntime.jsx("span",{className:"flex-1",children:c.label}),c.badge&&jsxRuntime.jsx("span",{className:`
|
|
9
|
+
ml-auto inline-flex items-center justify-center h-5 px-1.5 text-[10px] font-bold tracking-wide uppercase rounded-md
|
|
10
|
+
${w?"bg-white/20 text-white backdrop-blur-sm":"bg-white/10 text-white group-hover:bg-white/20"}
|
|
11
|
+
`,children:c.badge})]},c.key)})})]},x))})()}),jsxRuntime.jsxs("div",{className:"flex-shrink-0 p-4 border-t border-sidebar-theme bg-theme-sidebar z-10",children:[jsxRuntime.jsxs("div",{className:"p-3.5 rounded-xl border border-sidebar-theme bg-white/5 group transition-all duration-300 relative overflow-hidden",children:[jsxRuntime.jsx("div",{className:"absolute top-3 right-3 w-1.5 h-1.5 rounded-full bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.6)] animate-pulse"}),jsxRuntime.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[jsxRuntime.jsx("div",{className:"w-8 h-8 rounded-lg bg-white/10 border border-white/5 flex items-center justify-center text-white",children:jsxRuntime.jsx("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsx("div",{className:"text-sm font-bold text-sidebar-primary tracking-tight",children:"System Updates"}),jsxRuntime.jsx("div",{className:"text-[10px] text-sidebar-muted font-medium tracking-wide uppercase",children:"v2.4.1 available"})]})]}),jsxRuntime.jsx("button",{className:"w-full py-1.5 text-xs font-semibold text-center text-sidebar-primary border border-sidebar-theme hover:border-sidebar-muted bg-transparent hover:bg-white/5 rounded-lg transition-all duration-200",children:"Check Update"})]}),jsxRuntime.jsxs("a",{href:"https://intecnopt.com",target:"_blank",rel:"noopener noreferrer",className:"block mt-4 text-center group cursor-pointer",children:[jsxRuntime.jsxs("p",{className:"text-[10px] text-sidebar-muted font-medium group-hover:text-sidebar-primary transition-colors duration-300",children:["Powered by ",jsxRuntime.jsx("span",{className:"font-bold",children:"IntecnoManager"})]}),jsxRuntime.jsxs("p",{className:"text-[9px] text-sidebar-muted/70 mt-0.5 group-hover:text-sidebar-muted transition-colors",children:["\xA9 ",new Date().getFullYear()," intecnopt.com"]})]})]})]})]})}function A({onToggleSidebar:l,userLabel:s,onLogout:a,currentTheme:r,onThemeChange:d}){let[p,g]=E.useState(null),h=E.useRef(null),v=E.useRef(null);E.useEffect(()=>{function o(u){p==="notifications"&&h.current&&!h.current.contains(u.target)&&g(null),p==="user"&&v.current&&!v.current.contains(u.target)&&g(null);}return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[p]);let x=o=>{g(u=>u===o?null:o);};return jsxRuntime.jsxs("header",{className:"sticky top-0 z-30 flex items-center justify-between h-20 px-8 bg-theme-header border-b border-theme shadow-sm transition-all duration-300",children:[jsxRuntime.jsxs("div",{className:"flex items-center flex-1 gap-4",children:[jsxRuntime.jsxs("button",{onClick:l,className:"p-2 text-gray-500 rounded-lg lg:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 transition-all duration-200",children:[jsxRuntime.jsx("span",{className:"sr-only",children:"Open sidebar"}),jsxRuntime.jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 6h16M4 12h16M4 18h16"})})]}),jsxRuntime.jsxs("div",{className:"relative hidden md:block w-full max-w-md group",children:[jsxRuntime.jsx("div",{className:"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none transition-colors duration-200 text-gray-400 group-focus-within:text-gray-500",children:jsxRuntime.jsx("svg",{className:"w-5 h-5 fill-none","aria-hidden":"true",viewBox:"0 0 20 20",children:jsxRuntime.jsx("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"})})}),jsxRuntime.jsx("input",{type:"text",className:"block w-full p-2.5 pl-10 text-sm text-gray-900 border border-gray-200 rounded-xl bg-gray-50 focus:ring-2 focus:ring-[#0ea5e9]/20 focus:border-[#0ea5e9] focus:bg-white outline-none transition-all duration-200 placeholder-gray-400 hover:bg-white hover:border-gray-300",placeholder:"Search projects, users, or settings..."}),jsxRuntime.jsx("div",{className:"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none",children:jsxRuntime.jsx("span",{className:"text-gray-400 text-xs border border-gray-200 rounded px-1.5 py-0.5 shadow-sm",children:"\u2318K"})})]})]}),jsxRuntime.jsxs("div",{className:"flex items-center gap-2 sm:gap-4",children:[jsxRuntime.jsxs("div",{className:"relative",ref:h,children:[jsxRuntime.jsxs("button",{onClick:()=>x("notifications"),className:`relative p-2 rounded-lg transition-all duration-200 outline-none
|
|
12
|
+
${p==="notifications"?"bg-theme-active text-theme-primary":"text-theme-secondary hover:text-theme-primary bg-theme-hover:hover"}
|
|
13
|
+
`,children:[jsxRuntime.jsx("span",{className:"sr-only",children:"View notifications"}),jsxRuntime.jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"})}),jsxRuntime.jsx("div",{className:"absolute top-2.5 right-3 w-2.5 h-2.5 bg-red-500 rounded-full border-2 border-theme-header z-10 animate-pulse"})]}),jsxRuntime.jsxs("div",{className:`
|
|
14
|
+
absolute right-0 mt-3 w-80 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden
|
|
15
|
+
${p==="notifications"?"opacity-100 scale-100 translate-y-0":"opacity-0 scale-95 -translate-y-2 pointer-events-none"}
|
|
16
|
+
`,children:[jsxRuntime.jsxs("div",{className:"p-4 border-b border-theme flex justify-between items-center bg-theme-hover",children:[jsxRuntime.jsx("h3",{className:"font-semibold text-theme-primary",children:"Notifications"}),jsxRuntime.jsx("button",{className:"text-xs text-intecno-blue hover:text-indigo-400 font-medium",children:"Mark all read"})]}),jsxRuntime.jsx("div",{className:"p-2 space-y-1",children:jsxRuntime.jsxs("div",{className:"p-8 text-center text-theme-secondary",children:[jsxRuntime.jsx("div",{className:"mx-auto w-12 h-12 bg-theme-hover rounded-full flex items-center justify-center mb-3",children:jsxRuntime.jsx("svg",{className:"w-6 h-6 text-theme-secondary opacity-50",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})})}),jsxRuntime.jsx("p",{className:"text-sm",children:"No new notifications"})]})}),jsxRuntime.jsx("div",{className:"p-2 border-t border-theme bg-theme-hover text-center",children:jsxRuntime.jsx("button",{className:"text-xs font-medium text-theme-secondary hover:text-theme-primary transition-colors",children:"View all activity"})})]})]}),jsxRuntime.jsxs("div",{className:"relative pl-2 sm:pl-4 border-l border-theme",ref:v,children:[jsxRuntime.jsxs("button",{onClick:()=>x("user"),className:"flex items-center gap-3 group focus:outline-none transition-all duration-200",children:[jsxRuntime.jsxs("div",{className:"text-right hidden sm:block",children:[jsxRuntime.jsx("div",{className:"text-sm font-semibold text-theme-primary leading-none group-hover:text-intecno-blue transition-colors",children:s||"Guest User"}),jsxRuntime.jsx("div",{className:"text-xs text-theme-secondary mt-1",children:"Administrator"})]}),jsxRuntime.jsx("div",{className:`
|
|
17
|
+
w-10 h-10 rounded-full bg-gradient-to-br from-[#0f172a] to-[#334155] border-2 border-white/20 shadow-md flex items-center justify-center text-white font-medium text-lg overflow-hidden transition-all duration-300
|
|
18
|
+
${p==="user"?"ring-2 ring-intecno-blue ring-offset-2 ring-offset-theme":"group-hover:shadow-lg group-hover:ring-2 group-hover:ring-[#0ea5e9]/20"}
|
|
19
|
+
`,children:s?s.charAt(0).toUpperCase():"U"})]}),jsxRuntime.jsxs("div",{className:`
|
|
20
|
+
absolute right-0 mt-3 w-64 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden
|
|
21
|
+
${p==="user"?"opacity-100 scale-100 translate-y-0":"opacity-0 scale-95 -translate-y-2 pointer-events-none"}
|
|
22
|
+
`,children:[d&&jsxRuntime.jsxs("div",{className:"px-4 py-3 border-b border-theme bg-theme-hover",children:[jsxRuntime.jsx("p",{className:"text-[10px] font-bold text-theme-secondary uppercase tracking-widest mb-3",children:"Select Theme"}),jsxRuntime.jsx("div",{className:"grid grid-cols-4 gap-2",children:[{id:"default",color:"bg-[#051e34]",label:"Intecno"},{id:"dark",color:"bg-[#0f172a]",label:"Dark"},{id:"red",color:"bg-[#450a0a]",label:"Red"},{id:"green",color:"bg-[#022c22]",label:"Green"}].map(o=>jsxRuntime.jsx("button",{onClick:()=>d(o.id),className:`
|
|
23
|
+
w-8 h-8 rounded-lg ${o.color} border transition-all duration-300 flex items-center justify-center group relative shadow-sm overflow-hidden
|
|
24
|
+
${r===o.id?"border-white ring-2 ring-white/20 scale-110":"border-white/10 hover:border-white/30 hover:scale-105 hover:shadow-md"}
|
|
25
|
+
`,title:o.label,children:r===o.id&&jsxRuntime.jsx("div",{className:"w-1.5 h-1.5 bg-white rounded-full shadow-sm animate-bounce"})},o.id))})]}),jsxRuntime.jsx("div",{className:"p-1.5 space-y-0.5",children:["Your Profile","Settings","Team","Billing"].map(o=>jsxRuntime.jsx("button",{className:"flex w-full items-center px-3 py-2 text-sm text-theme-primary rounded-lg hover:bg-theme-hover hover:text-intecno-blue transition-colors",children:o},o))}),a&&jsxRuntime.jsx("div",{className:"p-1.5 border-t border-theme",children:jsxRuntime.jsx("button",{onClick:a,className:"flex w-full items-center px-3 py-2 text-sm text-red-500 rounded-lg hover:bg-red-500/10 transition-colors",children:"Sign out"})})]})]})]})]})}function F({tabs:l,activeKey:s,children:a,LinkComponent:r,basePath:d="",brandName:p,logo:g,userLabel:h,onLogout:v,currentTheme:x,onThemeChange:o}){let[u,c]=E.useState(false);return jsxRuntime.jsxs("div",{className:"flex h-screen w-full overflow-hidden bg-theme-page text-theme-primary transition-colors duration-300",children:[jsxRuntime.jsx(_,{tabs:l,activeKey:s,LinkComponent:r,isOpen:u,onClose:()=>c(false),basePath:d,brandName:p,logo:g}),jsxRuntime.jsxs("div",{className:"flex-1 flex flex-col min-w-0 h-full relative",children:[jsxRuntime.jsx(A,{onToggleSidebar:()=>c(!u),userLabel:h,onLogout:v,currentTheme:x,onThemeChange:o}),jsxRuntime.jsx("main",{className:"flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-gray-200 hover:scrollbar-thumb-gray-300 p-4 sm:p-6 lg:p-8",children:a})]})]})}function J({title:l,description:s,icon:a,action:r,className:d=""}){return jsxRuntime.jsxs("div",{className:`flex flex-col items-center justify-center p-12 text-center rounded-lg border-2 border-dashed border-gray-200 bg-gray-50/50 ${d}`,children:[a&&jsxRuntime.jsx("div",{className:"mb-4 text-gray-400 p-3 bg-white rounded-full shadow-sm border border-gray-100",children:a}),jsxRuntime.jsx("h3",{className:"text-lg font-medium text-gray-900 mb-1",children:l}),s&&jsxRuntime.jsx("p",{className:"text-sm text-gray-500 max-w-sm mb-6",children:s}),r]})}function ee({children:l,className:s="",title:a,description:r,actions:d}){return jsxRuntime.jsxs("section",{className:`flex flex-col gap-6 ${s}`,children:[(a||r||d)&&jsxRuntime.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[jsxRuntime.jsxs("div",{className:"flex flex-col gap-1",children:[a&&jsxRuntime.jsx("h2",{className:"text-2xl font-semibold text-gray-900",children:a}),r&&jsxRuntime.jsx("p",{className:"text-sm text-gray-500",children:r})]}),d&&jsxRuntime.jsx("div",{className:"flex items-center gap-3",children:d})]}),l]})}function ae({children:l,className:s="",title:a,actions:r}){return jsxRuntime.jsxs("div",{className:`bg-white rounded-lg border border-gray-200 shadow-sm ${s}`,children:[(a||r)&&jsxRuntime.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-100",children:[a&&jsxRuntime.jsx("h3",{className:"text-lg font-medium text-gray-900",children:a}),r&&jsxRuntime.jsx("div",{className:"flex items-center gap-2",children:r})]}),jsxRuntime.jsx("div",{className:"p-6",children:l})]})}function ie({label:l,value:s,icon:a,trend:r,className:d=""}){return jsxRuntime.jsxs("div",{className:`bg-white rounded-2xl border border-gray-100 p-6 shadow-sm hover:shadow-md transition-shadow duration-300 flex items-start justify-between ${d}`,children:[jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsx("span",{className:"text-sm font-medium text-gray-500 tracking-wide uppercase",children:l}),jsxRuntime.jsx("span",{className:"text-3xl font-bold text-gray-900 tracking-tight",children:s}),r&&jsxRuntime.jsxs("div",{className:"flex items-center gap-1.5 mt-2",children:[jsxRuntime.jsxs("span",{className:`text-sm font-medium ${r.direction==="up"?"text-green-600":r.direction==="down"?"text-red-600":"text-gray-600"}`,children:[r.direction==="up"?"\u2191":r.direction==="down"?"\u2193":"\u2022"," ",r.value]}),r.label&&jsxRuntime.jsx("span",{className:"text-sm text-gray-400",children:r.label})]})]}),a&&jsxRuntime.jsx("div",{className:"p-2.5 bg-gray-50 rounded-lg text-gray-500",children:a})]})}var R=[{text:"I'm in.",source:"Hacker Movies Generic"},{text:"Access Granted, Mr. Anderson.",source:"The Matrix"},{text:"Protocol Zero: Initiated.",source:"Mission Impossible"},{text:"With great power comes great dashboards.",source:"Spider-Man"},{text:"May the WiFi be with you.",source:"Star Wars"},{text:"Encryption Level: Jedi.",source:"Star Wars"},{text:"Mainframe: Secure.",source:"Generic Cyberpunk"},{text:"Houston, we have a login.",source:"Apollo 13"},{text:"System Status: 100% Awesome.",source:"The LEGO Movie"}];function ce({children:l,brandName:s,logo:a,quote:r="Manage your business with confidence and style.",quoteAuthor:d="Intecno Team"}){let[p,g]=E__default.default.useState(R[0]);return E__default.default.useEffect(()=>{g(R[Math.floor(Math.random()*R.length)]);},[]),jsxRuntime.jsxs("div",{className:"flex min-h-screen w-full bg-white overflow-hidden font-sans",children:[jsxRuntime.jsxs("div",{className:"w-full lg:w-1/2 xl:w-5/12 flex flex-col items-center justify-center p-8 sm:p-12 lg:p-24 bg-white relative z-20",children:[jsxRuntime.jsx("div",{className:"absolute inset-0 bg-[linear-gradient(to_right,#f1f5f9_1px,transparent_1px),linear-gradient(to_bottom,#f1f5f9_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_0%,#000_70%,transparent_100%)] pointer-events-none"}),jsxRuntime.jsxs("div",{className:"absolute top-8 left-8 hidden sm:flex items-center gap-2 px-3 py-1.5 bg-white border border-gray-100 rounded-lg shadow-sm",children:[jsxRuntime.jsxs("div",{className:"relative flex h-2.5 w-2.5",children:[jsxRuntime.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"}),jsxRuntime.jsx("span",{className:"relative inline-flex rounded-full h-2.5 w-2.5 bg-green-500"})]}),jsxRuntime.jsx("span",{className:"text-xs font-semibold text-gray-600",children:"All Systems Operational"})]}),jsxRuntime.jsxs("div",{className:"w-full max-w-md space-y-8 relative z-10",children:[jsxRuntime.jsxs("div",{className:"lg:hidden text-center mb-8",children:[a&&jsxRuntime.jsx("div",{className:"inline-block p-3 rounded-2xl bg-gradient-to-br from-intecno-navy to-intecno-blue text-white shadow-xl mb-4",children:a}),s&&jsxRuntime.jsx("h2",{className:"text-3xl font-bold text-gray-900 tracking-tight",children:s})]}),jsxRuntime.jsxs("div",{className:"text-center lg:text-left mb-10 space-y-2",children:[jsxRuntime.jsxs("div",{title:`Reference: ${p.source}`,className:"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-50 border border-blue-100 text-blue-600 text-[11px] font-bold uppercase tracking-wider mb-2 transition-all hover:bg-blue-100 cursor-help",children:[jsxRuntime.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})}),p.text]}),jsxRuntime.jsx("h2",{className:"text-4xl font-extrabold text-gray-900 tracking-tight",children:"Welcome back"}),jsxRuntime.jsx("p",{className:"text-gray-500 text-lg",children:"Enter your credentials to access your workspace."})]}),jsxRuntime.jsx("div",{className:"bg-white/50 backdrop-blur-sm",children:l}),jsxRuntime.jsxs("div",{className:"flex items-center justify-center lg:justify-start gap-4 text-xs text-gray-400 mt-8 pt-6 border-t border-gray-100",children:[jsxRuntime.jsxs("span",{className:"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors",children:[jsxRuntime.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})})," SSL Secured"]}),jsxRuntime.jsxs("span",{className:"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors",children:[jsxRuntime.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})," Help Center"]})]}),jsxRuntime.jsxs("p",{className:"text-center lg:text-left text-xs font-medium text-gray-400 mt-4 uppercase tracking-wide",children:["\xA9 ",new Date().getFullYear()," ",jsxRuntime.jsx("a",{href:"https://intecnopt.com",target:"_blank",rel:"noopener noreferrer",className:"text-intecno-blue hover:text-cyan-600 font-bold hover:underline transition-all",children:"intecnopt.com"})]})]}),jsxRuntime.jsx("div",{className:"absolute bottom-6 left-8 hidden sm:block text-[10px] font-mono text-gray-300",children:"v2.4.0-release"})]}),jsxRuntime.jsxs("div",{className:"hidden lg:flex lg:w-1/2 xl:w-7/12 relative bg-[#051e34] overflow-hidden items-center justify-center text-white",children:[jsxRuntime.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-[#020617] via-[#051e34] to-[#0e7490]"}),jsxRuntime.jsx("div",{className:"absolute inset-0 opacity-30 mixture-blend-overlay bg-[radial-gradient(ellipse_at_top_right,_var(--tw-gradient-stops))] from-cyan-400/20 via-transparent to-transparent"}),jsxRuntime.jsx("div",{className:"absolute bottom-0 left-0 right-0 opacity-20 transform translate-y-12",children:jsxRuntime.jsx("svg",{className:"w-full h-[600px]",viewBox:"0 0 1440 320",preserveAspectRatio:"none",children:jsxRuntime.jsx("path",{fill:"#22d3ee",fillOpacity:"1",d:"M0,224L48,213.3C96,203,192,181,288,181.3C384,181,480,203,576,224C672,245,768,267,864,261.3C960,256,1056,224,1152,197.3C1248,171,1344,149,1392,138.7L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"})})}),jsxRuntime.jsx("div",{className:"absolute bottom-0 left-0 right-0 opacity-10 transform translate-y-4 animate-pulse",children:jsxRuntime.jsx("svg",{className:"w-full h-[600px]",viewBox:"0 0 1440 320",preserveAspectRatio:"none",children:jsxRuntime.jsx("path",{fill:"#0891b2",fillOpacity:"1",d:"M0,96L48,112C96,128,192,160,288,186.7C384,213,480,235,576,213.3C672,192,768,128,864,128C960,128,1056,192,1152,213.3C1248,235,1344,213,1392,202.7L1440,192L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"})})}),jsxRuntime.jsx("div",{className:"relative z-10 p-12 max-w-2xl",children:jsxRuntime.jsxs("div",{className:"relative backdrop-blur-3xl bg-white/5 border border-white/10 p-10 rounded-3xl shadow-[0_8px_32px_0_rgba(31,38,135,0.37)] overflow-hidden",children:[jsxRuntime.jsx("div",{className:"absolute -top-20 -left-20 w-40 h-40 bg-cyan-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob"}),jsxRuntime.jsx("div",{className:"absolute -bottom-20 -right-20 w-40 h-40 bg-purple-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob animation-delay-2000"}),jsxRuntime.jsxs("div",{className:"relative z-10 flex flex-col items-center text-center space-y-6",children:[a&&jsxRuntime.jsx("div",{className:"w-20 h-20 rounded-2xl bg-gradient-to-br from-white/20 to-white/5 border border-white/20 flex items-center justify-center mb-4 shadow-2xl skew-y-3 transform hover:skew-y-0 transition-transform duration-500 cursor-pointer",children:jsxRuntime.jsx("div",{className:"transform scale-150",children:a})}),jsxRuntime.jsxs("div",{className:"space-y-2",children:[jsxRuntime.jsxs("h1",{className:"text-4xl font-bold tracking-tight text-white drop-shadow-lg",children:[s," ",jsxRuntime.jsx("span",{className:"text-cyan-400",children:"Pro"})]}),jsxRuntime.jsx("p",{className:"text-sm font-medium text-cyan-200 uppercase tracking-[0.2em]",children:"Enterprise Dashboard v2.4"})]}),jsxRuntime.jsxs("p",{className:"text-lg text-gray-300 leading-relaxed font-light max-w-lg mx-auto",children:['"',r,'"',jsxRuntime.jsxs("span",{className:"block mt-4 text-sm font-semibold text-cyan-400 not-italic",children:["\u2014 ",d]})]}),jsxRuntime.jsx("div",{className:"h-px w-24 bg-gradient-to-r from-transparent via-cyan-500 to-transparent mt-8"}),jsxRuntime.jsxs("div",{className:"flex gap-4 pt-4",children:[jsxRuntime.jsx("span",{className:"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100",children:"REACT"}),jsxRuntime.jsx("span",{className:"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100",children:"TAILWIND"}),jsxRuntime.jsx("span",{className:"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100",children:"TYPESCRIPT"})]})]})]})}),jsxRuntime.jsx("div",{className:"absolute top-20 right-20 w-24 h-24 bg-gradient-to-r from-cyan-500 to-blue-500 rounded-full blur-3xl opacity-20 animate-pulse"})]})]})}
|
|
26
|
+
exports.AdminShell=F;exports.AuthShell=ce;exports.Card=ae;exports.EmptyState=J;exports.Section=ee;exports.Sidebar=_;exports.StatCard=ie;exports.Topbar=A;//# sourceMappingURL=index.js.map
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Sidebar.tsx","../src/components/Topbar.tsx","../src/AdminShell.tsx","../src/components/EmptyState.tsx","../src/components/Section.tsx","../src/components/Card.tsx","../src/components/StatCard.tsx","../src/components/AuthShell.tsx"],"names":["Sidebar","isOpen","onClose","brandName","logo","tabs","activeKey","LinkComponent","basePath","jsxs","Fragment","jsx","groupedTabs","acc","tab","groupName","groupTabs","groupIndex","isActive","href","Topbar","onToggleSidebar","userLabel","onLogout","currentTheme","onThemeChange","openDropdown","setOpenDropdown","useState","notificationsRef","useRef","userRef","useEffect","handleClickOutside","event","toggleDropdown","name","prev","t","item","AdminShell","children","isSidebarOpen","setIsSidebarOpen","EmptyState","title","description","icon","action","className","Section","actions","Card","StatCard","label","value","trend","ACCESS_MESSAGES","AuthShell","quote","quoteAuthor","accessMessage","setAccessMessage","React"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\r\nimport { AdminTab, LinkComponentProps } from '../types';\r\n\r\nexport interface SidebarProps {\r\n tabs: AdminTab[];\r\n activeKey: string;\r\n LinkComponent: React.ComponentType<LinkComponentProps>;\r\n basePath?: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n brandName?: string;\r\n logo?: React.ReactNode;\r\n}\r\n\r\nexport function Sidebar({ isOpen, onClose, brandName, logo, tabs, activeKey, LinkComponent, basePath = '/admin' }: SidebarProps) {\r\n return (\r\n <>\r\n {/* Mobile Overlay */}\r\n {isOpen && (\r\n <div\r\n className=\"fixed inset-0 z-40 bg-gray-900/60 backdrop-blur-sm transition-opacity lg:hidden\"\r\n onClick={onClose}\r\n />\r\n )}\r\n\r\n {/* Sidebar Container */}\r\n {/* Added min-h-screen to ensure no white gaps at bottom */}\r\n <aside className={`\r\n fixed top-0 left-0 z-50 min-h-screen h-full w-72 bg-theme-sidebar backdrop-blur-xl border-r border-white/5 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.1)] transition-transform duration-300 ease-in-out lg:translate-x-0 lg:static\r\n ${isOpen ? 'translate-x-0' : '-translate-x-full'}\r\n flex flex-col flex-shrink-0\r\n `}>\r\n {/* Subtle Background Gradient for Depth */}\r\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_top_left,_var(--tw-gradient-stops))] from-intecno-blue/10 via-transparent to-transparent pointer-events-none\" />\r\n\r\n {/* Branding */}\r\n <div className=\"flex-shrink-0 flex items-center h-20 px-8 border-b border-sidebar-theme bg-theme-sidebar\">\r\n {logo && <span className=\"mr-3\">{logo}</span>}\r\n {brandName && <span className=\"text-xl font-bold tracking-tight text-sidebar-primary\">{brandName}</span>}\r\n </div>\r\n\r\n {/* Navigation Scroll Area */}\r\n <div className=\"flex flex-col flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent py-4 px-3\">\r\n {/* Render Grouped Tabs */}\r\n {(() => {\r\n // Group tabs by 'group' property, defaulting to 'Main Navigation'\r\n const groupedTabs = tabs.reduce((acc, tab) => {\r\n const groupName = tab.group || 'Main Navigation';\r\n if (!acc[groupName]) acc[groupName] = [];\r\n acc[groupName].push(tab);\r\n return acc;\r\n }, {} as Record<string, typeof tabs>);\r\n\r\n return Object.entries(groupedTabs).map(([groupName, groupTabs], groupIndex) => (\r\n <div key={groupName} className={`${groupIndex > 0 ? 'mt-6' : ''}`}>\r\n <div className=\"px-3 mb-2 text-[11px] font-bold text-sidebar-muted uppercase tracking-widest opacity-80\">\r\n {groupName}\r\n </div>\r\n <div className=\"space-y-1\">\r\n {groupTabs.map((tab) => {\r\n const isActive = tab.key === activeKey;\r\n const href = `${basePath}/${tab.key}`;\r\n\r\n if (tab.disabled) {\r\n return (\r\n <div key={tab.key} className=\"flex items-center px-3 py-2.5 text-sm font-medium text-sidebar-muted/50 rounded-lg cursor-not-allowed\">\r\n {tab.icon && <span className=\"mr-3 text-lg opacity-40\">{tab.icon}</span>}\r\n <span className=\"flex-1\">{tab.label}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <LinkComponent\r\n key={tab.key}\r\n href={href}\r\n className={`\r\n group flex items-center px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-300 ease-out\r\n ${isActive\r\n ? 'bg-brand text-white shadow-lg scale-[1.02]'\r\n : 'text-sidebar-muted hover:bg-white/10 hover:text-sidebar-primary hover:translate-x-1'\r\n }\r\n `}\r\n >\r\n {tab.icon && (\r\n <span className={`mr-3 text-lg transition-colors duration-300 ${isActive ? 'text-white' : 'text-sidebar-muted group-hover:text-sidebar-primary'}`}>\r\n {tab.icon}\r\n </span>\r\n )}\r\n\r\n <span className=\"flex-1\">{tab.label}</span>\r\n\r\n {tab.badge && (\r\n <span className={`\r\n ml-auto inline-flex items-center justify-center h-5 px-1.5 text-[10px] font-bold tracking-wide uppercase rounded-md\r\n ${isActive\r\n ? 'bg-white/20 text-white backdrop-blur-sm'\r\n : 'bg-white/10 text-white group-hover:bg-white/20'\r\n }\r\n `}>\r\n {tab.badge}\r\n </span>\r\n )}\r\n </LinkComponent>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ));\r\n })()}\r\n </div>\r\n\r\n {/* Fixed Footer Area (Mandatory & Floating at Bottom) */}\r\n <div className=\"flex-shrink-0 p-4 border-t border-sidebar-theme bg-theme-sidebar z-10\">\r\n <div className=\"p-3.5 rounded-xl border border-sidebar-theme bg-white/5 group transition-all duration-300 relative overflow-hidden\">\r\n {/* Status Dot */}\r\n <div className=\"absolute top-3 right-3 w-1.5 h-1.5 rounded-full bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.6)] animate-pulse\"></div>\r\n\r\n <div className=\"flex items-center gap-3 mb-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-white/10 border border-white/5 flex items-center justify-center text-white\">\r\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" /></svg>\r\n </div>\r\n <div>\r\n <div className=\"text-sm font-bold text-sidebar-primary tracking-tight\">System Updates</div>\r\n <div className=\"text-[10px] text-sidebar-muted font-medium tracking-wide uppercase\">v2.4.1 available</div>\r\n </div>\r\n </div>\r\n <button className=\"w-full py-1.5 text-xs font-semibold text-center text-sidebar-primary border border-sidebar-theme hover:border-sidebar-muted bg-transparent hover:bg-white/5 rounded-lg transition-all duration-200\">\r\n Check Update\r\n </button>\r\n </div>\r\n\r\n {/* Mandatory Credits - Linked */}\r\n <a\r\n href=\"https://intecnopt.com\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"block mt-4 text-center group cursor-pointer\"\r\n >\r\n <p className=\"text-[10px] text-sidebar-muted font-medium group-hover:text-sidebar-primary transition-colors duration-300\">\r\n Powered by <span className=\"font-bold\">IntecnoManager</span>\r\n </p>\r\n <p className=\"text-[9px] text-sidebar-muted/70 mt-0.5 group-hover:text-sidebar-muted transition-colors\">\r\n © {new Date().getFullYear()} intecnopt.com\r\n </p>\r\n </a>\r\n </div>\r\n </aside>\r\n </>\r\n );\r\n}\r\n","import { useState, useRef, useEffect } from 'react';\r\nimport { TopbarProps } from '../types';\r\n\r\nexport function Topbar({ onToggleSidebar, userLabel, onLogout, currentTheme, onThemeChange }: TopbarProps) {\r\n const [openDropdown, setOpenDropdown] = useState<'notifications' | 'user' | null>(null);\r\n const notificationsRef = useRef<HTMLDivElement>(null);\r\n const userRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (openDropdown === 'notifications' && notificationsRef.current && !notificationsRef.current.contains(event.target as Node)) {\r\n setOpenDropdown(null);\r\n }\r\n if (openDropdown === 'user' && userRef.current && !userRef.current.contains(event.target as Node)) {\r\n setOpenDropdown(null);\r\n }\r\n }\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [openDropdown]);\r\n\r\n const toggleDropdown = (name: 'notifications' | 'user') => {\r\n setOpenDropdown(prev => prev === name ? null : name);\r\n };\r\n\r\n return (\r\n <header className=\"sticky top-0 z-30 flex items-center justify-between h-20 px-8 bg-theme-header border-b border-theme shadow-sm transition-all duration-300\">\r\n <div className=\"flex items-center flex-1 gap-4\">\r\n {/* Mobile Toggle Button */}\r\n <button\r\n onClick={onToggleSidebar}\r\n className=\"p-2 text-gray-500 rounded-lg lg:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 transition-all duration-200\"\r\n >\r\n <span className=\"sr-only\">Open sidebar</span>\r\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Global Search Bar */}\r\n <div className=\"relative hidden md:block w-full max-w-md group\">\r\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none transition-colors duration-200 text-gray-400 group-focus-within:text-gray-500\">\r\n <svg className=\"w-5 h-5 fill-none\" aria-hidden=\"true\" viewBox=\"0 0 20 20\">\r\n <path stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z\" />\r\n </svg>\r\n </div>\r\n <input\r\n type=\"text\"\r\n className=\"block w-full p-2.5 pl-10 text-sm text-gray-900 border border-gray-200 rounded-xl bg-gray-50 focus:ring-2 focus:ring-[#0ea5e9]/20 focus:border-[#0ea5e9] focus:bg-white outline-none transition-all duration-200 placeholder-gray-400 hover:bg-white hover:border-gray-300\"\r\n placeholder=\"Search projects, users, or settings...\"\r\n />\r\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none\">\r\n <span className=\"text-gray-400 text-xs border border-gray-200 rounded px-1.5 py-0.5 shadow-sm\">⌘K</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Right Actions */}\r\n <div className=\"flex items-center gap-2 sm:gap-4\">\r\n {/* Notifications Dropdown */}\r\n <div className=\"relative\" ref={notificationsRef}>\r\n <button\r\n onClick={() => toggleDropdown('notifications')}\r\n className={`relative p-2 rounded-lg transition-all duration-200 outline-none\r\n ${openDropdown === 'notifications' ? 'bg-theme-active text-theme-primary' : 'text-theme-secondary hover:text-theme-primary bg-theme-hover:hover'}\r\n `}\r\n >\r\n <span className=\"sr-only\">View notifications</span>\r\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\r\n </svg>\r\n <div className=\"absolute top-2.5 right-3 w-2.5 h-2.5 bg-red-500 rounded-full border-2 border-theme-header z-10 animate-pulse\"></div>\r\n </button>\r\n\r\n {/* Animated Dropdown Content */}\r\n <div className={`\r\n absolute right-0 mt-3 w-80 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden\r\n ${openDropdown === 'notifications' ? 'opacity-100 scale-100 translate-y-0' : 'opacity-0 scale-95 -translate-y-2 pointer-events-none'}\r\n `}>\r\n <div className=\"p-4 border-b border-theme flex justify-between items-center bg-theme-hover\">\r\n <h3 className=\"font-semibold text-theme-primary\">Notifications</h3>\r\n <button className=\"text-xs text-intecno-blue hover:text-indigo-400 font-medium\">Mark all read</button>\r\n </div>\r\n <div className=\"p-2 space-y-1\">\r\n {/* Empty/Placeholder State */}\r\n <div className=\"p-8 text-center text-theme-secondary\">\r\n <div className=\"mx-auto w-12 h-12 bg-theme-hover rounded-full flex items-center justify-center mb-3\">\r\n <svg className=\"w-6 h-6 text-theme-secondary opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4\" /></svg>\r\n </div>\r\n <p className=\"text-sm\">No new notifications</p>\r\n </div>\r\n </div>\r\n <div className=\"p-2 border-t border-theme bg-theme-hover text-center\">\r\n <button className=\"text-xs font-medium text-theme-secondary hover:text-theme-primary transition-colors\">View all activity</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* User Profile Menu with Dropdown */}\r\n <div className=\"relative pl-2 sm:pl-4 border-l border-theme\" ref={userRef}>\r\n <button\r\n onClick={() => toggleDropdown('user')}\r\n className=\"flex items-center gap-3 group focus:outline-none transition-all duration-200\"\r\n >\r\n <div className=\"text-right hidden sm:block\">\r\n <div className=\"text-sm font-semibold text-theme-primary leading-none group-hover:text-intecno-blue transition-colors\">{userLabel || 'Guest User'}</div>\r\n <div className=\"text-xs text-theme-secondary mt-1\">Administrator</div>\r\n </div>\r\n <div className={`\r\n w-10 h-10 rounded-full bg-gradient-to-br from-[#0f172a] to-[#334155] border-2 border-white/20 shadow-md flex items-center justify-center text-white font-medium text-lg overflow-hidden transition-all duration-300\r\n ${openDropdown === 'user' ? 'ring-2 ring-intecno-blue ring-offset-2 ring-offset-theme' : 'group-hover:shadow-lg group-hover:ring-2 group-hover:ring-[#0ea5e9]/20'}\r\n `}>\r\n {userLabel ? userLabel.charAt(0).toUpperCase() : 'U'}\r\n </div>\r\n </button>\r\n\r\n {/* Animated User Dropdown */}\r\n <div className={`\r\n absolute right-0 mt-3 w-64 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden\r\n ${openDropdown === 'user' ? 'opacity-100 scale-100 translate-y-0' : 'opacity-0 scale-95 -translate-y-2 pointer-events-none'}\r\n `}>\r\n\r\n {/* Theme Section */}\r\n {onThemeChange && (\r\n <div className=\"px-4 py-3 border-b border-theme bg-theme-hover\">\r\n <p className=\"text-[10px] font-bold text-theme-secondary uppercase tracking-widest mb-3\">Select Theme</p>\r\n <div className=\"grid grid-cols-4 gap-2\">\r\n {[\r\n { id: 'default', color: 'bg-[#051e34]', label: 'Intecno' },\r\n { id: 'dark', color: 'bg-[#0f172a]', label: 'Dark' },\r\n { id: 'red', color: 'bg-[#450a0a]', label: 'Red' },\r\n { id: 'green', color: 'bg-[#022c22]', label: 'Green' },\r\n ].map((t) => (\r\n <button\r\n key={t.id}\r\n onClick={() => onThemeChange(t.id)}\r\n className={`\r\n w-8 h-8 rounded-lg ${t.color} border transition-all duration-300 flex items-center justify-center group relative shadow-sm overflow-hidden\r\n ${currentTheme === t.id\r\n ? 'border-white ring-2 ring-white/20 scale-110'\r\n : 'border-white/10 hover:border-white/30 hover:scale-105 hover:shadow-md'\r\n }\r\n `}\r\n title={t.label}\r\n >\r\n {currentTheme === t.id && (\r\n <div className=\"w-1.5 h-1.5 bg-white rounded-full shadow-sm animate-bounce\"></div>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"p-1.5 space-y-0.5\">\r\n {['Your Profile', 'Settings', 'Team', 'Billing'].map(item => (\r\n <button key={item} className=\"flex w-full items-center px-3 py-2 text-sm text-theme-primary rounded-lg hover:bg-theme-hover hover:text-intecno-blue transition-colors\">\r\n {item}\r\n </button>\r\n ))}\r\n </div>\r\n {onLogout && (\r\n <div className=\"p-1.5 border-t border-theme\">\r\n <button\r\n onClick={onLogout}\r\n className=\"flex w-full items-center px-3 py-2 text-sm text-red-500 rounded-lg hover:bg-red-500/10 transition-colors\"\r\n >\r\n Sign out\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { AdminShellProps } from './types';\r\nimport { Sidebar } from './components/Sidebar';\r\nimport { Topbar } from './components/Topbar';\r\n\r\n// Removed duplicate AdminShellProps interface definition\r\n\r\n\r\n\r\nexport function AdminShell({\r\n tabs,\r\n activeKey,\r\n children,\r\n LinkComponent,\r\n basePath = '',\r\n brandName,\r\n logo,\r\n userLabel,\r\n onLogout,\r\n currentTheme,\r\n onThemeChange\r\n}: AdminShellProps) {\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n\r\n return (\r\n /* Fixed Viewport Layout - Prevents body scroll */\r\n <div className=\"flex h-screen w-full overflow-hidden bg-theme-page text-theme-primary transition-colors duration-300\">\r\n <Sidebar\r\n tabs={tabs}\r\n activeKey={activeKey}\r\n LinkComponent={LinkComponent}\r\n isOpen={isSidebarOpen}\r\n onClose={() => setIsSidebarOpen(false)}\r\n basePath={basePath}\r\n brandName={brandName}\r\n logo={logo}\r\n />\r\n\r\n {/* Main Content Wrapper - Handles its own scrolling */}\r\n <div className=\"flex-1 flex flex-col min-w-0 h-full relative\">\r\n <Topbar\r\n onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)}\r\n userLabel={userLabel}\r\n onLogout={onLogout}\r\n currentTheme={currentTheme}\r\n onThemeChange={onThemeChange}\r\n />\r\n\r\n <main className=\"flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-gray-200 hover:scrollbar-thumb-gray-300 p-4 sm:p-6 lg:p-8\">\r\n {children}\r\n </main>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface EmptyStateProps {\r\n title: string;\r\n description?: string;\r\n icon?: React.ReactNode;\r\n action?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function EmptyState({ title, description, icon, action, className = '' }: EmptyStateProps) {\r\n return (\r\n <div className={`flex flex-col items-center justify-center p-12 text-center rounded-lg border-2 border-dashed border-gray-200 bg-gray-50/50 ${className}`}>\r\n {icon && (\r\n <div className=\"mb-4 text-gray-400 p-3 bg-white rounded-full shadow-sm border border-gray-100\">\r\n {icon}\r\n </div>\r\n )}\r\n <h3 className=\"text-lg font-medium text-gray-900 mb-1\">{title}</h3>\r\n {description && <p className=\"text-sm text-gray-500 max-w-sm mb-6\">{description}</p>}\r\n {action}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface SectionProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n title?: string;\r\n description?: string;\r\n actions?: React.ReactNode;\r\n}\r\n\r\nexport function Section({ children, className = '', title, description, actions }: SectionProps) {\r\n return (\r\n <section className={`flex flex-col gap-6 ${className}`}>\r\n {(title || description || actions) && (\r\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4\">\r\n <div className=\"flex flex-col gap-1\">\r\n {title && <h2 className=\"text-2xl font-semibold text-gray-900\">{title}</h2>}\r\n {description && <p className=\"text-sm text-gray-500\">{description}</p>}\r\n </div>\r\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\r\n </div>\r\n )}\r\n {children}\r\n </section>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n title?: string;\r\n actions?: React.ReactNode;\r\n}\r\n\r\nexport function Card({ children, className = '', title, actions }: CardProps) {\r\n return (\r\n <div className={`bg-white rounded-lg border border-gray-200 shadow-sm ${className}`}>\r\n {(title || actions) && (\r\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-100\">\r\n {title && <h3 className=\"text-lg font-medium text-gray-900\">{title}</h3>}\r\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\r\n </div>\r\n )}\r\n <div className=\"p-6\">\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface StatCardProps {\r\n label: string;\r\n value: string | number;\r\n icon?: React.ReactNode;\r\n trend?: {\r\n value: string | number;\r\n direction: 'up' | 'down' | 'neutral';\r\n label?: string;\r\n };\r\n className?: string;\r\n}\r\n\r\nexport function StatCard({ label, value, icon, trend, className = '' }: StatCardProps) {\r\n return (\r\n <div className={`bg-white rounded-2xl border border-gray-100 p-6 shadow-sm hover:shadow-md transition-shadow duration-300 flex items-start justify-between ${className}`}>\r\n <div className=\"flex flex-col gap-2\">\r\n <span className=\"text-sm font-medium text-gray-500 tracking-wide uppercase\">{label}</span>\r\n <span className=\"text-3xl font-bold text-gray-900 tracking-tight\">{value}</span>\r\n\r\n {trend && (\r\n <div className=\"flex items-center gap-1.5 mt-2\">\r\n <span className={`text-sm font-medium ${trend.direction === 'up' ? 'text-green-600' :\r\n trend.direction === 'down' ? 'text-red-600' :\r\n 'text-gray-600'\r\n }`}>\r\n {trend.direction === 'up' ? '↑' : trend.direction === 'down' ? '↓' : '•'} {trend.value}\r\n </span>\r\n {trend.label && <span className=\"text-sm text-gray-400\">{trend.label}</span>}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {icon && (\r\n <div className=\"p-2.5 bg-gray-50 rounded-lg text-gray-500\">\r\n {icon}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface AuthShellProps {\r\n children: React.ReactNode;\r\n brandName?: string;\r\n logo?: React.ReactNode;\r\n quote?: string;\r\n quoteAuthor?: string;\r\n}\r\n\r\n// --- Fun/Geeky Access Messages ---\r\nconst ACCESS_MESSAGES = [\r\n { text: \"I'm in.\", source: \"Hacker Movies Generic\" },\r\n { text: \"Access Granted, Mr. Anderson.\", source: \"The Matrix\" },\r\n { text: \"Protocol Zero: Initiated.\", source: \"Mission Impossible\" },\r\n { text: \"With great power comes great dashboards.\", source: \"Spider-Man\" },\r\n { text: \"May the WiFi be with you.\", source: \"Star Wars\" },\r\n { text: \"Encryption Level: Jedi.\", source: \"Star Wars\" },\r\n { text: \"Mainframe: Secure.\", source: \"Generic Cyberpunk\" },\r\n { text: \"Houston, we have a login.\", source: \"Apollo 13\" },\r\n { text: \"System Status: 100% Awesome.\", source: \"The LEGO Movie\" }\r\n];\r\n\r\nexport function AuthShell({\r\n children,\r\n brandName,\r\n logo,\r\n quote = \"Manage your business with confidence and style.\",\r\n quoteAuthor = \"Intecno Team\"\r\n}: AuthShellProps) {\r\n const [accessMessage, setAccessMessage] = React.useState(ACCESS_MESSAGES[0]);\r\n\r\n React.useEffect(() => {\r\n setAccessMessage(ACCESS_MESSAGES[Math.floor(Math.random() * ACCESS_MESSAGES.length)]);\r\n }, []);\r\n\r\n return (\r\n <div className=\"flex min-h-screen w-full bg-white overflow-hidden font-sans\">\r\n {/* Left Panel: Auth Form (Clear & Clean) */}\r\n <div className=\"w-full lg:w-1/2 xl:w-5/12 flex flex-col items-center justify-center p-8 sm:p-12 lg:p-24 bg-white relative z-20\">\r\n {/* Subtle Grid Pattern for Professional Feel */}\r\n <div className=\"absolute inset-0 bg-[linear-gradient(to_right,#f1f5f9_1px,transparent_1px),linear-gradient(to_bottom,#f1f5f9_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_0%,#000_70%,transparent_100%)] pointer-events-none\"></div>\r\n\r\n {/* Top Left: System Status Widget */}\r\n <div className=\"absolute top-8 left-8 hidden sm:flex items-center gap-2 px-3 py-1.5 bg-white border border-gray-100 rounded-lg shadow-sm\">\r\n <div className=\"relative flex h-2.5 w-2.5\">\r\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\"></span>\r\n <span className=\"relative inline-flex rounded-full h-2.5 w-2.5 bg-green-500\"></span>\r\n </div>\r\n <span className=\"text-xs font-semibold text-gray-600\">All Systems Operational</span>\r\n </div>\r\n\r\n <div className=\"w-full max-w-md space-y-8 relative z-10\">\r\n {/* Mobile Brand (Visible only on small screens) */}\r\n <div className=\"lg:hidden text-center mb-8\">\r\n {logo && <div className=\"inline-block p-3 rounded-2xl bg-gradient-to-br from-intecno-navy to-intecno-blue text-white shadow-xl mb-4\">{logo}</div>}\r\n {brandName && <h2 className=\"text-3xl font-bold text-gray-900 tracking-tight\">{brandName}</h2>}\r\n </div>\r\n\r\n <div className=\"text-center lg:text-left mb-10 space-y-2\">\r\n {/* Dynamic \"Funny\" Secure Badge */}\r\n <div\r\n title={`Reference: ${accessMessage.source}`}\r\n className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-50 border border-blue-100 text-blue-600 text-[11px] font-bold uppercase tracking-wider mb-2 transition-all hover:bg-blue-100 cursor-help\"\r\n >\r\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" /></svg>\r\n {accessMessage.text}\r\n </div>\r\n <h2 className=\"text-4xl font-extrabold text-gray-900 tracking-tight\">Welcome back</h2>\r\n <p className=\"text-gray-500 text-lg\">Enter your credentials to access your workspace.</p>\r\n </div>\r\n\r\n <div className=\"bg-white/50 backdrop-blur-sm\">\r\n {children}\r\n </div>\r\n\r\n {/* Security Footer Links */}\r\n <div className=\"flex items-center justify-center lg:justify-start gap-4 text-xs text-gray-400 mt-8 pt-6 border-t border-gray-100\">\r\n <span className=\"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors\"><svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" /></svg> SSL Secured</span>\r\n <span className=\"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors\"><svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" /></svg> Help Center</span>\r\n </div>\r\n\r\n <p className=\"text-center lg:text-left text-xs font-medium text-gray-400 mt-4 uppercase tracking-wide\">\r\n © {new Date().getFullYear()} <a href=\"https://intecnopt.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-intecno-blue hover:text-cyan-600 font-bold hover:underline transition-all\">intecnopt.com</a>\r\n </p>\r\n </div>\r\n\r\n {/* Bottom Left: Version Badge */}\r\n <div className=\"absolute bottom-6 left-8 hidden sm:block text-[10px] font-mono text-gray-300\">\r\n v2.4.0-release\r\n </div>\r\n </div>\r\n\r\n {/* Right Panel: Flashy Brand Experience */}\r\n <div className=\"hidden lg:flex lg:w-1/2 xl:w-7/12 relative bg-[#051e34] overflow-hidden items-center justify-center text-white\">\r\n\r\n {/* 1. Dynamic Gradient Background */}\r\n <div className=\"absolute inset-0 bg-gradient-to-br from-[#020617] via-[#051e34] to-[#0e7490]\"></div>\r\n\r\n {/* 2. CSS Mesh/Wave Pattern Overlay */}\r\n <div className=\"absolute inset-0 opacity-30 mixture-blend-overlay bg-[radial-gradient(ellipse_at_top_right,_var(--tw-gradient-stops))] from-cyan-400/20 via-transparent to-transparent\"></div>\r\n\r\n {/* 3. Animated Waves (SVG) */}\r\n <div className=\"absolute bottom-0 left-0 right-0 opacity-20 transform translate-y-12\">\r\n <svg className=\"w-full h-[600px]\" viewBox=\"0 0 1440 320\" preserveAspectRatio=\"none\">\r\n <path fill=\"#22d3ee\" fillOpacity=\"1\" d=\"M0,224L48,213.3C96,203,192,181,288,181.3C384,181,480,203,576,224C672,245,768,267,864,261.3C960,256,1056,224,1152,197.3C1248,171,1344,149,1392,138.7L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z\"></path>\r\n </svg>\r\n </div>\r\n <div className=\"absolute bottom-0 left-0 right-0 opacity-10 transform translate-y-4 animate-pulse\">\r\n <svg className=\"w-full h-[600px]\" viewBox=\"0 0 1440 320\" preserveAspectRatio=\"none\">\r\n <path fill=\"#0891b2\" fillOpacity=\"1\" d=\"M0,96L48,112C96,128,192,160,288,186.7C384,213,480,235,576,213.3C672,192,768,128,864,128C960,128,1056,192,1152,213.3C1248,235,1344,213,1392,202.7L1440,192L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z\"></path>\r\n </svg>\r\n </div>\r\n\r\n {/* 4. Glassmorphism Content Card */}\r\n <div className=\"relative z-10 p-12 max-w-2xl\">\r\n <div className=\"relative backdrop-blur-3xl bg-white/5 border border-white/10 p-10 rounded-3xl shadow-[0_8px_32px_0_rgba(31,38,135,0.37)] overflow-hidden\">\r\n\r\n {/* Glow Effect */}\r\n <div className=\"absolute -top-20 -left-20 w-40 h-40 bg-cyan-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob\"></div>\r\n <div className=\"absolute -bottom-20 -right-20 w-40 h-40 bg-purple-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob animation-delay-2000\"></div>\r\n\r\n <div className=\"relative z-10 flex flex-col items-center text-center space-y-6\">\r\n {logo && (\r\n <div className=\"w-20 h-20 rounded-2xl bg-gradient-to-br from-white/20 to-white/5 border border-white/20 flex items-center justify-center mb-4 shadow-2xl skew-y-3 transform hover:skew-y-0 transition-transform duration-500 cursor-pointer\">\r\n <div className=\"transform scale-150\">\r\n {logo}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-2\">\r\n <h1 className=\"text-4xl font-bold tracking-tight text-white drop-shadow-lg\">\r\n {brandName} <span className=\"text-cyan-400\">Pro</span>\r\n </h1>\r\n <p className=\"text-sm font-medium text-cyan-200 uppercase tracking-[0.2em]\">Enterprise Dashboard v2.4</p>\r\n </div>\r\n\r\n <p className=\"text-lg text-gray-300 leading-relaxed font-light max-w-lg mx-auto\">\r\n \"{quote}\"\r\n <span className=\"block mt-4 text-sm font-semibold text-cyan-400 not-italic\">— {quoteAuthor}</span>\r\n </p>\r\n\r\n <div className=\"h-px w-24 bg-gradient-to-r from-transparent via-cyan-500 to-transparent mt-8\"></div>\r\n\r\n <div className=\"flex gap-4 pt-4\">\r\n <span className=\"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100\">REACT</span>\r\n <span className=\"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100\">TAILWIND</span>\r\n <span className=\"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100\">TYPESCRIPT</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Floating Elements */}\r\n <div className=\"absolute top-20 right-20 w-24 h-24 bg-gradient-to-r from-cyan-500 to-blue-500 rounded-full blur-3xl opacity-20 animate-pulse\"></div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import E,{useState,useRef,useEffect}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';function _({isOpen:l,onClose:s,brandName:a,logo:r,tabs:d,activeKey:p,LinkComponent:g,basePath:h="/admin"}){return jsxs(Fragment,{children:[l&&jsx("div",{className:"fixed inset-0 z-40 bg-gray-900/60 backdrop-blur-sm transition-opacity lg:hidden",onClick:s}),jsxs("aside",{className:`
|
|
2
|
+
fixed top-0 left-0 z-50 min-h-screen h-full w-72 bg-theme-sidebar backdrop-blur-xl border-r border-white/5 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.1)] transition-transform duration-300 ease-in-out lg:translate-x-0 lg:static
|
|
3
|
+
${l?"translate-x-0":"-translate-x-full"}
|
|
4
|
+
flex flex-col flex-shrink-0
|
|
5
|
+
`,children:[jsx("div",{className:"absolute inset-0 bg-[radial-gradient(circle_at_top_left,_var(--tw-gradient-stops))] from-intecno-blue/10 via-transparent to-transparent pointer-events-none"}),jsxs("div",{className:"flex-shrink-0 flex items-center h-20 px-8 border-b border-sidebar-theme bg-theme-sidebar",children:[r&&jsx("span",{className:"mr-3",children:r}),a&&jsx("span",{className:"text-xl font-bold tracking-tight text-sidebar-primary",children:a})]}),jsx("div",{className:"flex flex-col flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent py-4 px-3",children:(()=>{let v=d.reduce((x,o)=>{let u=o.group||"Main Navigation";return x[u]||(x[u]=[]),x[u].push(o),x},{});return Object.entries(v).map(([x,o],u)=>jsxs("div",{className:`${u>0?"mt-6":""}`,children:[jsx("div",{className:"px-3 mb-2 text-[11px] font-bold text-sidebar-muted uppercase tracking-widest opacity-80",children:x}),jsx("div",{className:"space-y-1",children:o.map(c=>{let w=c.key===p,$=`${h}/${c.key}`;return c.disabled?jsxs("div",{className:"flex items-center px-3 py-2.5 text-sm font-medium text-sidebar-muted/50 rounded-lg cursor-not-allowed",children:[c.icon&&jsx("span",{className:"mr-3 text-lg opacity-40",children:c.icon}),jsx("span",{className:"flex-1",children:c.label})]},c.key):jsxs(g,{href:$,className:`
|
|
6
|
+
group flex items-center px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-300 ease-out
|
|
7
|
+
${w?"bg-brand text-white shadow-lg scale-[1.02]":"text-sidebar-muted hover:bg-white/10 hover:text-sidebar-primary hover:translate-x-1"}
|
|
8
|
+
`,children:[c.icon&&jsx("span",{className:`mr-3 text-lg transition-colors duration-300 ${w?"text-white":"text-sidebar-muted group-hover:text-sidebar-primary"}`,children:c.icon}),jsx("span",{className:"flex-1",children:c.label}),c.badge&&jsx("span",{className:`
|
|
9
|
+
ml-auto inline-flex items-center justify-center h-5 px-1.5 text-[10px] font-bold tracking-wide uppercase rounded-md
|
|
10
|
+
${w?"bg-white/20 text-white backdrop-blur-sm":"bg-white/10 text-white group-hover:bg-white/20"}
|
|
11
|
+
`,children:c.badge})]},c.key)})})]},x))})()}),jsxs("div",{className:"flex-shrink-0 p-4 border-t border-sidebar-theme bg-theme-sidebar z-10",children:[jsxs("div",{className:"p-3.5 rounded-xl border border-sidebar-theme bg-white/5 group transition-all duration-300 relative overflow-hidden",children:[jsx("div",{className:"absolute top-3 right-3 w-1.5 h-1.5 rounded-full bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.6)] animate-pulse"}),jsxs("div",{className:"flex items-center gap-3 mb-3",children:[jsx("div",{className:"w-8 h-8 rounded-lg bg-white/10 border border-white/5 flex items-center justify-center text-white",children:jsx("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})}),jsxs("div",{children:[jsx("div",{className:"text-sm font-bold text-sidebar-primary tracking-tight",children:"System Updates"}),jsx("div",{className:"text-[10px] text-sidebar-muted font-medium tracking-wide uppercase",children:"v2.4.1 available"})]})]}),jsx("button",{className:"w-full py-1.5 text-xs font-semibold text-center text-sidebar-primary border border-sidebar-theme hover:border-sidebar-muted bg-transparent hover:bg-white/5 rounded-lg transition-all duration-200",children:"Check Update"})]}),jsxs("a",{href:"https://intecnopt.com",target:"_blank",rel:"noopener noreferrer",className:"block mt-4 text-center group cursor-pointer",children:[jsxs("p",{className:"text-[10px] text-sidebar-muted font-medium group-hover:text-sidebar-primary transition-colors duration-300",children:["Powered by ",jsx("span",{className:"font-bold",children:"IntecnoManager"})]}),jsxs("p",{className:"text-[9px] text-sidebar-muted/70 mt-0.5 group-hover:text-sidebar-muted transition-colors",children:["\xA9 ",new Date().getFullYear()," intecnopt.com"]})]})]})]})]})}function A({onToggleSidebar:l,userLabel:s,onLogout:a,currentTheme:r,onThemeChange:d}){let[p,g]=useState(null),h=useRef(null),v=useRef(null);useEffect(()=>{function o(u){p==="notifications"&&h.current&&!h.current.contains(u.target)&&g(null),p==="user"&&v.current&&!v.current.contains(u.target)&&g(null);}return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[p]);let x=o=>{g(u=>u===o?null:o);};return jsxs("header",{className:"sticky top-0 z-30 flex items-center justify-between h-20 px-8 bg-theme-header border-b border-theme shadow-sm transition-all duration-300",children:[jsxs("div",{className:"flex items-center flex-1 gap-4",children:[jsxs("button",{onClick:l,className:"p-2 text-gray-500 rounded-lg lg:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 transition-all duration-200",children:[jsx("span",{className:"sr-only",children:"Open sidebar"}),jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 6h16M4 12h16M4 18h16"})})]}),jsxs("div",{className:"relative hidden md:block w-full max-w-md group",children:[jsx("div",{className:"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none transition-colors duration-200 text-gray-400 group-focus-within:text-gray-500",children:jsx("svg",{className:"w-5 h-5 fill-none","aria-hidden":"true",viewBox:"0 0 20 20",children:jsx("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"})})}),jsx("input",{type:"text",className:"block w-full p-2.5 pl-10 text-sm text-gray-900 border border-gray-200 rounded-xl bg-gray-50 focus:ring-2 focus:ring-[#0ea5e9]/20 focus:border-[#0ea5e9] focus:bg-white outline-none transition-all duration-200 placeholder-gray-400 hover:bg-white hover:border-gray-300",placeholder:"Search projects, users, or settings..."}),jsx("div",{className:"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none",children:jsx("span",{className:"text-gray-400 text-xs border border-gray-200 rounded px-1.5 py-0.5 shadow-sm",children:"\u2318K"})})]})]}),jsxs("div",{className:"flex items-center gap-2 sm:gap-4",children:[jsxs("div",{className:"relative",ref:h,children:[jsxs("button",{onClick:()=>x("notifications"),className:`relative p-2 rounded-lg transition-all duration-200 outline-none
|
|
12
|
+
${p==="notifications"?"bg-theme-active text-theme-primary":"text-theme-secondary hover:text-theme-primary bg-theme-hover:hover"}
|
|
13
|
+
`,children:[jsx("span",{className:"sr-only",children:"View notifications"}),jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"})}),jsx("div",{className:"absolute top-2.5 right-3 w-2.5 h-2.5 bg-red-500 rounded-full border-2 border-theme-header z-10 animate-pulse"})]}),jsxs("div",{className:`
|
|
14
|
+
absolute right-0 mt-3 w-80 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden
|
|
15
|
+
${p==="notifications"?"opacity-100 scale-100 translate-y-0":"opacity-0 scale-95 -translate-y-2 pointer-events-none"}
|
|
16
|
+
`,children:[jsxs("div",{className:"p-4 border-b border-theme flex justify-between items-center bg-theme-hover",children:[jsx("h3",{className:"font-semibold text-theme-primary",children:"Notifications"}),jsx("button",{className:"text-xs text-intecno-blue hover:text-indigo-400 font-medium",children:"Mark all read"})]}),jsx("div",{className:"p-2 space-y-1",children:jsxs("div",{className:"p-8 text-center text-theme-secondary",children:[jsx("div",{className:"mx-auto w-12 h-12 bg-theme-hover rounded-full flex items-center justify-center mb-3",children:jsx("svg",{className:"w-6 h-6 text-theme-secondary opacity-50",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})})}),jsx("p",{className:"text-sm",children:"No new notifications"})]})}),jsx("div",{className:"p-2 border-t border-theme bg-theme-hover text-center",children:jsx("button",{className:"text-xs font-medium text-theme-secondary hover:text-theme-primary transition-colors",children:"View all activity"})})]})]}),jsxs("div",{className:"relative pl-2 sm:pl-4 border-l border-theme",ref:v,children:[jsxs("button",{onClick:()=>x("user"),className:"flex items-center gap-3 group focus:outline-none transition-all duration-200",children:[jsxs("div",{className:"text-right hidden sm:block",children:[jsx("div",{className:"text-sm font-semibold text-theme-primary leading-none group-hover:text-intecno-blue transition-colors",children:s||"Guest User"}),jsx("div",{className:"text-xs text-theme-secondary mt-1",children:"Administrator"})]}),jsx("div",{className:`
|
|
17
|
+
w-10 h-10 rounded-full bg-gradient-to-br from-[#0f172a] to-[#334155] border-2 border-white/20 shadow-md flex items-center justify-center text-white font-medium text-lg overflow-hidden transition-all duration-300
|
|
18
|
+
${p==="user"?"ring-2 ring-intecno-blue ring-offset-2 ring-offset-theme":"group-hover:shadow-lg group-hover:ring-2 group-hover:ring-[#0ea5e9]/20"}
|
|
19
|
+
`,children:s?s.charAt(0).toUpperCase():"U"})]}),jsxs("div",{className:`
|
|
20
|
+
absolute right-0 mt-3 w-64 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden
|
|
21
|
+
${p==="user"?"opacity-100 scale-100 translate-y-0":"opacity-0 scale-95 -translate-y-2 pointer-events-none"}
|
|
22
|
+
`,children:[d&&jsxs("div",{className:"px-4 py-3 border-b border-theme bg-theme-hover",children:[jsx("p",{className:"text-[10px] font-bold text-theme-secondary uppercase tracking-widest mb-3",children:"Select Theme"}),jsx("div",{className:"grid grid-cols-4 gap-2",children:[{id:"default",color:"bg-[#051e34]",label:"Intecno"},{id:"dark",color:"bg-[#0f172a]",label:"Dark"},{id:"red",color:"bg-[#450a0a]",label:"Red"},{id:"green",color:"bg-[#022c22]",label:"Green"}].map(o=>jsx("button",{onClick:()=>d(o.id),className:`
|
|
23
|
+
w-8 h-8 rounded-lg ${o.color} border transition-all duration-300 flex items-center justify-center group relative shadow-sm overflow-hidden
|
|
24
|
+
${r===o.id?"border-white ring-2 ring-white/20 scale-110":"border-white/10 hover:border-white/30 hover:scale-105 hover:shadow-md"}
|
|
25
|
+
`,title:o.label,children:r===o.id&&jsx("div",{className:"w-1.5 h-1.5 bg-white rounded-full shadow-sm animate-bounce"})},o.id))})]}),jsx("div",{className:"p-1.5 space-y-0.5",children:["Your Profile","Settings","Team","Billing"].map(o=>jsx("button",{className:"flex w-full items-center px-3 py-2 text-sm text-theme-primary rounded-lg hover:bg-theme-hover hover:text-intecno-blue transition-colors",children:o},o))}),a&&jsx("div",{className:"p-1.5 border-t border-theme",children:jsx("button",{onClick:a,className:"flex w-full items-center px-3 py-2 text-sm text-red-500 rounded-lg hover:bg-red-500/10 transition-colors",children:"Sign out"})})]})]})]})]})}function F({tabs:l,activeKey:s,children:a,LinkComponent:r,basePath:d="",brandName:p,logo:g,userLabel:h,onLogout:v,currentTheme:x,onThemeChange:o}){let[u,c]=useState(false);return jsxs("div",{className:"flex h-screen w-full overflow-hidden bg-theme-page text-theme-primary transition-colors duration-300",children:[jsx(_,{tabs:l,activeKey:s,LinkComponent:r,isOpen:u,onClose:()=>c(false),basePath:d,brandName:p,logo:g}),jsxs("div",{className:"flex-1 flex flex-col min-w-0 h-full relative",children:[jsx(A,{onToggleSidebar:()=>c(!u),userLabel:h,onLogout:v,currentTheme:x,onThemeChange:o}),jsx("main",{className:"flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-gray-200 hover:scrollbar-thumb-gray-300 p-4 sm:p-6 lg:p-8",children:a})]})]})}function J({title:l,description:s,icon:a,action:r,className:d=""}){return jsxs("div",{className:`flex flex-col items-center justify-center p-12 text-center rounded-lg border-2 border-dashed border-gray-200 bg-gray-50/50 ${d}`,children:[a&&jsx("div",{className:"mb-4 text-gray-400 p-3 bg-white rounded-full shadow-sm border border-gray-100",children:a}),jsx("h3",{className:"text-lg font-medium text-gray-900 mb-1",children:l}),s&&jsx("p",{className:"text-sm text-gray-500 max-w-sm mb-6",children:s}),r]})}function ee({children:l,className:s="",title:a,description:r,actions:d}){return jsxs("section",{className:`flex flex-col gap-6 ${s}`,children:[(a||r||d)&&jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[jsxs("div",{className:"flex flex-col gap-1",children:[a&&jsx("h2",{className:"text-2xl font-semibold text-gray-900",children:a}),r&&jsx("p",{className:"text-sm text-gray-500",children:r})]}),d&&jsx("div",{className:"flex items-center gap-3",children:d})]}),l]})}function ae({children:l,className:s="",title:a,actions:r}){return jsxs("div",{className:`bg-white rounded-lg border border-gray-200 shadow-sm ${s}`,children:[(a||r)&&jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-100",children:[a&&jsx("h3",{className:"text-lg font-medium text-gray-900",children:a}),r&&jsx("div",{className:"flex items-center gap-2",children:r})]}),jsx("div",{className:"p-6",children:l})]})}function ie({label:l,value:s,icon:a,trend:r,className:d=""}){return jsxs("div",{className:`bg-white rounded-2xl border border-gray-100 p-6 shadow-sm hover:shadow-md transition-shadow duration-300 flex items-start justify-between ${d}`,children:[jsxs("div",{className:"flex flex-col gap-2",children:[jsx("span",{className:"text-sm font-medium text-gray-500 tracking-wide uppercase",children:l}),jsx("span",{className:"text-3xl font-bold text-gray-900 tracking-tight",children:s}),r&&jsxs("div",{className:"flex items-center gap-1.5 mt-2",children:[jsxs("span",{className:`text-sm font-medium ${r.direction==="up"?"text-green-600":r.direction==="down"?"text-red-600":"text-gray-600"}`,children:[r.direction==="up"?"\u2191":r.direction==="down"?"\u2193":"\u2022"," ",r.value]}),r.label&&jsx("span",{className:"text-sm text-gray-400",children:r.label})]})]}),a&&jsx("div",{className:"p-2.5 bg-gray-50 rounded-lg text-gray-500",children:a})]})}var R=[{text:"I'm in.",source:"Hacker Movies Generic"},{text:"Access Granted, Mr. Anderson.",source:"The Matrix"},{text:"Protocol Zero: Initiated.",source:"Mission Impossible"},{text:"With great power comes great dashboards.",source:"Spider-Man"},{text:"May the WiFi be with you.",source:"Star Wars"},{text:"Encryption Level: Jedi.",source:"Star Wars"},{text:"Mainframe: Secure.",source:"Generic Cyberpunk"},{text:"Houston, we have a login.",source:"Apollo 13"},{text:"System Status: 100% Awesome.",source:"The LEGO Movie"}];function ce({children:l,brandName:s,logo:a,quote:r="Manage your business with confidence and style.",quoteAuthor:d="Intecno Team"}){let[p,g]=E.useState(R[0]);return E.useEffect(()=>{g(R[Math.floor(Math.random()*R.length)]);},[]),jsxs("div",{className:"flex min-h-screen w-full bg-white overflow-hidden font-sans",children:[jsxs("div",{className:"w-full lg:w-1/2 xl:w-5/12 flex flex-col items-center justify-center p-8 sm:p-12 lg:p-24 bg-white relative z-20",children:[jsx("div",{className:"absolute inset-0 bg-[linear-gradient(to_right,#f1f5f9_1px,transparent_1px),linear-gradient(to_bottom,#f1f5f9_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_0%,#000_70%,transparent_100%)] pointer-events-none"}),jsxs("div",{className:"absolute top-8 left-8 hidden sm:flex items-center gap-2 px-3 py-1.5 bg-white border border-gray-100 rounded-lg shadow-sm",children:[jsxs("div",{className:"relative flex h-2.5 w-2.5",children:[jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"}),jsx("span",{className:"relative inline-flex rounded-full h-2.5 w-2.5 bg-green-500"})]}),jsx("span",{className:"text-xs font-semibold text-gray-600",children:"All Systems Operational"})]}),jsxs("div",{className:"w-full max-w-md space-y-8 relative z-10",children:[jsxs("div",{className:"lg:hidden text-center mb-8",children:[a&&jsx("div",{className:"inline-block p-3 rounded-2xl bg-gradient-to-br from-intecno-navy to-intecno-blue text-white shadow-xl mb-4",children:a}),s&&jsx("h2",{className:"text-3xl font-bold text-gray-900 tracking-tight",children:s})]}),jsxs("div",{className:"text-center lg:text-left mb-10 space-y-2",children:[jsxs("div",{title:`Reference: ${p.source}`,className:"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-50 border border-blue-100 text-blue-600 text-[11px] font-bold uppercase tracking-wider mb-2 transition-all hover:bg-blue-100 cursor-help",children:[jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})}),p.text]}),jsx("h2",{className:"text-4xl font-extrabold text-gray-900 tracking-tight",children:"Welcome back"}),jsx("p",{className:"text-gray-500 text-lg",children:"Enter your credentials to access your workspace."})]}),jsx("div",{className:"bg-white/50 backdrop-blur-sm",children:l}),jsxs("div",{className:"flex items-center justify-center lg:justify-start gap-4 text-xs text-gray-400 mt-8 pt-6 border-t border-gray-100",children:[jsxs("span",{className:"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors",children:[jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})})," SSL Secured"]}),jsxs("span",{className:"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors",children:[jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})," Help Center"]})]}),jsxs("p",{className:"text-center lg:text-left text-xs font-medium text-gray-400 mt-4 uppercase tracking-wide",children:["\xA9 ",new Date().getFullYear()," ",jsx("a",{href:"https://intecnopt.com",target:"_blank",rel:"noopener noreferrer",className:"text-intecno-blue hover:text-cyan-600 font-bold hover:underline transition-all",children:"intecnopt.com"})]})]}),jsx("div",{className:"absolute bottom-6 left-8 hidden sm:block text-[10px] font-mono text-gray-300",children:"v2.4.0-release"})]}),jsxs("div",{className:"hidden lg:flex lg:w-1/2 xl:w-7/12 relative bg-[#051e34] overflow-hidden items-center justify-center text-white",children:[jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-[#020617] via-[#051e34] to-[#0e7490]"}),jsx("div",{className:"absolute inset-0 opacity-30 mixture-blend-overlay bg-[radial-gradient(ellipse_at_top_right,_var(--tw-gradient-stops))] from-cyan-400/20 via-transparent to-transparent"}),jsx("div",{className:"absolute bottom-0 left-0 right-0 opacity-20 transform translate-y-12",children:jsx("svg",{className:"w-full h-[600px]",viewBox:"0 0 1440 320",preserveAspectRatio:"none",children:jsx("path",{fill:"#22d3ee",fillOpacity:"1",d:"M0,224L48,213.3C96,203,192,181,288,181.3C384,181,480,203,576,224C672,245,768,267,864,261.3C960,256,1056,224,1152,197.3C1248,171,1344,149,1392,138.7L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"})})}),jsx("div",{className:"absolute bottom-0 left-0 right-0 opacity-10 transform translate-y-4 animate-pulse",children:jsx("svg",{className:"w-full h-[600px]",viewBox:"0 0 1440 320",preserveAspectRatio:"none",children:jsx("path",{fill:"#0891b2",fillOpacity:"1",d:"M0,96L48,112C96,128,192,160,288,186.7C384,213,480,235,576,213.3C672,192,768,128,864,128C960,128,1056,192,1152,213.3C1248,235,1344,213,1392,202.7L1440,192L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"})})}),jsx("div",{className:"relative z-10 p-12 max-w-2xl",children:jsxs("div",{className:"relative backdrop-blur-3xl bg-white/5 border border-white/10 p-10 rounded-3xl shadow-[0_8px_32px_0_rgba(31,38,135,0.37)] overflow-hidden",children:[jsx("div",{className:"absolute -top-20 -left-20 w-40 h-40 bg-cyan-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob"}),jsx("div",{className:"absolute -bottom-20 -right-20 w-40 h-40 bg-purple-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob animation-delay-2000"}),jsxs("div",{className:"relative z-10 flex flex-col items-center text-center space-y-6",children:[a&&jsx("div",{className:"w-20 h-20 rounded-2xl bg-gradient-to-br from-white/20 to-white/5 border border-white/20 flex items-center justify-center mb-4 shadow-2xl skew-y-3 transform hover:skew-y-0 transition-transform duration-500 cursor-pointer",children:jsx("div",{className:"transform scale-150",children:a})}),jsxs("div",{className:"space-y-2",children:[jsxs("h1",{className:"text-4xl font-bold tracking-tight text-white drop-shadow-lg",children:[s," ",jsx("span",{className:"text-cyan-400",children:"Pro"})]}),jsx("p",{className:"text-sm font-medium text-cyan-200 uppercase tracking-[0.2em]",children:"Enterprise Dashboard v2.4"})]}),jsxs("p",{className:"text-lg text-gray-300 leading-relaxed font-light max-w-lg mx-auto",children:['"',r,'"',jsxs("span",{className:"block mt-4 text-sm font-semibold text-cyan-400 not-italic",children:["\u2014 ",d]})]}),jsx("div",{className:"h-px w-24 bg-gradient-to-r from-transparent via-cyan-500 to-transparent mt-8"}),jsxs("div",{className:"flex gap-4 pt-4",children:[jsx("span",{className:"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100",children:"REACT"}),jsx("span",{className:"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100",children:"TAILWIND"}),jsx("span",{className:"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100",children:"TYPESCRIPT"})]})]})]})}),jsx("div",{className:"absolute top-20 right-20 w-24 h-24 bg-gradient-to-r from-cyan-500 to-blue-500 rounded-full blur-3xl opacity-20 animate-pulse"})]})]})}
|
|
26
|
+
export{F as AdminShell,ce as AuthShell,ae as Card,J as EmptyState,ee as Section,_ as Sidebar,ie as StatCard,A as Topbar};//# sourceMappingURL=index.mjs.map
|
|
27
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Sidebar.tsx","../src/components/Topbar.tsx","../src/AdminShell.tsx","../src/components/EmptyState.tsx","../src/components/Section.tsx","../src/components/Card.tsx","../src/components/StatCard.tsx","../src/components/AuthShell.tsx"],"names":["Sidebar","isOpen","onClose","brandName","logo","tabs","activeKey","LinkComponent","basePath","jsxs","Fragment","jsx","groupedTabs","acc","tab","groupName","groupTabs","groupIndex","isActive","href","Topbar","onToggleSidebar","userLabel","onLogout","currentTheme","onThemeChange","openDropdown","setOpenDropdown","useState","notificationsRef","useRef","userRef","useEffect","handleClickOutside","event","toggleDropdown","name","prev","t","item","AdminShell","children","isSidebarOpen","setIsSidebarOpen","EmptyState","title","description","icon","action","className","Section","actions","Card","StatCard","label","value","trend","ACCESS_MESSAGES","AuthShell","quote","quoteAuthor","accessMessage","setAccessMessage","React"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\r\nimport { AdminTab, LinkComponentProps } from '../types';\r\n\r\nexport interface SidebarProps {\r\n tabs: AdminTab[];\r\n activeKey: string;\r\n LinkComponent: React.ComponentType<LinkComponentProps>;\r\n basePath?: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n brandName?: string;\r\n logo?: React.ReactNode;\r\n}\r\n\r\nexport function Sidebar({ isOpen, onClose, brandName, logo, tabs, activeKey, LinkComponent, basePath = '/admin' }: SidebarProps) {\r\n return (\r\n <>\r\n {/* Mobile Overlay */}\r\n {isOpen && (\r\n <div\r\n className=\"fixed inset-0 z-40 bg-gray-900/60 backdrop-blur-sm transition-opacity lg:hidden\"\r\n onClick={onClose}\r\n />\r\n )}\r\n\r\n {/* Sidebar Container */}\r\n {/* Added min-h-screen to ensure no white gaps at bottom */}\r\n <aside className={`\r\n fixed top-0 left-0 z-50 min-h-screen h-full w-72 bg-theme-sidebar backdrop-blur-xl border-r border-white/5 shadow-[4px_0_24px_-12px_rgba(0,0,0,0.1)] transition-transform duration-300 ease-in-out lg:translate-x-0 lg:static\r\n ${isOpen ? 'translate-x-0' : '-translate-x-full'}\r\n flex flex-col flex-shrink-0\r\n `}>\r\n {/* Subtle Background Gradient for Depth */}\r\n <div className=\"absolute inset-0 bg-[radial-gradient(circle_at_top_left,_var(--tw-gradient-stops))] from-intecno-blue/10 via-transparent to-transparent pointer-events-none\" />\r\n\r\n {/* Branding */}\r\n <div className=\"flex-shrink-0 flex items-center h-20 px-8 border-b border-sidebar-theme bg-theme-sidebar\">\r\n {logo && <span className=\"mr-3\">{logo}</span>}\r\n {brandName && <span className=\"text-xl font-bold tracking-tight text-sidebar-primary\">{brandName}</span>}\r\n </div>\r\n\r\n {/* Navigation Scroll Area */}\r\n <div className=\"flex flex-col flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-white/10 scrollbar-track-transparent py-4 px-3\">\r\n {/* Render Grouped Tabs */}\r\n {(() => {\r\n // Group tabs by 'group' property, defaulting to 'Main Navigation'\r\n const groupedTabs = tabs.reduce((acc, tab) => {\r\n const groupName = tab.group || 'Main Navigation';\r\n if (!acc[groupName]) acc[groupName] = [];\r\n acc[groupName].push(tab);\r\n return acc;\r\n }, {} as Record<string, typeof tabs>);\r\n\r\n return Object.entries(groupedTabs).map(([groupName, groupTabs], groupIndex) => (\r\n <div key={groupName} className={`${groupIndex > 0 ? 'mt-6' : ''}`}>\r\n <div className=\"px-3 mb-2 text-[11px] font-bold text-sidebar-muted uppercase tracking-widest opacity-80\">\r\n {groupName}\r\n </div>\r\n <div className=\"space-y-1\">\r\n {groupTabs.map((tab) => {\r\n const isActive = tab.key === activeKey;\r\n const href = `${basePath}/${tab.key}`;\r\n\r\n if (tab.disabled) {\r\n return (\r\n <div key={tab.key} className=\"flex items-center px-3 py-2.5 text-sm font-medium text-sidebar-muted/50 rounded-lg cursor-not-allowed\">\r\n {tab.icon && <span className=\"mr-3 text-lg opacity-40\">{tab.icon}</span>}\r\n <span className=\"flex-1\">{tab.label}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <LinkComponent\r\n key={tab.key}\r\n href={href}\r\n className={`\r\n group flex items-center px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-300 ease-out\r\n ${isActive\r\n ? 'bg-brand text-white shadow-lg scale-[1.02]'\r\n : 'text-sidebar-muted hover:bg-white/10 hover:text-sidebar-primary hover:translate-x-1'\r\n }\r\n `}\r\n >\r\n {tab.icon && (\r\n <span className={`mr-3 text-lg transition-colors duration-300 ${isActive ? 'text-white' : 'text-sidebar-muted group-hover:text-sidebar-primary'}`}>\r\n {tab.icon}\r\n </span>\r\n )}\r\n\r\n <span className=\"flex-1\">{tab.label}</span>\r\n\r\n {tab.badge && (\r\n <span className={`\r\n ml-auto inline-flex items-center justify-center h-5 px-1.5 text-[10px] font-bold tracking-wide uppercase rounded-md\r\n ${isActive\r\n ? 'bg-white/20 text-white backdrop-blur-sm'\r\n : 'bg-white/10 text-white group-hover:bg-white/20'\r\n }\r\n `}>\r\n {tab.badge}\r\n </span>\r\n )}\r\n </LinkComponent>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ));\r\n })()}\r\n </div>\r\n\r\n {/* Fixed Footer Area (Mandatory & Floating at Bottom) */}\r\n <div className=\"flex-shrink-0 p-4 border-t border-sidebar-theme bg-theme-sidebar z-10\">\r\n <div className=\"p-3.5 rounded-xl border border-sidebar-theme bg-white/5 group transition-all duration-300 relative overflow-hidden\">\r\n {/* Status Dot */}\r\n <div className=\"absolute top-3 right-3 w-1.5 h-1.5 rounded-full bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.6)] animate-pulse\"></div>\r\n\r\n <div className=\"flex items-center gap-3 mb-3\">\r\n <div className=\"w-8 h-8 rounded-lg bg-white/10 border border-white/5 flex items-center justify-center text-white\">\r\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" /></svg>\r\n </div>\r\n <div>\r\n <div className=\"text-sm font-bold text-sidebar-primary tracking-tight\">System Updates</div>\r\n <div className=\"text-[10px] text-sidebar-muted font-medium tracking-wide uppercase\">v2.4.1 available</div>\r\n </div>\r\n </div>\r\n <button className=\"w-full py-1.5 text-xs font-semibold text-center text-sidebar-primary border border-sidebar-theme hover:border-sidebar-muted bg-transparent hover:bg-white/5 rounded-lg transition-all duration-200\">\r\n Check Update\r\n </button>\r\n </div>\r\n\r\n {/* Mandatory Credits - Linked */}\r\n <a\r\n href=\"https://intecnopt.com\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"block mt-4 text-center group cursor-pointer\"\r\n >\r\n <p className=\"text-[10px] text-sidebar-muted font-medium group-hover:text-sidebar-primary transition-colors duration-300\">\r\n Powered by <span className=\"font-bold\">IntecnoManager</span>\r\n </p>\r\n <p className=\"text-[9px] text-sidebar-muted/70 mt-0.5 group-hover:text-sidebar-muted transition-colors\">\r\n © {new Date().getFullYear()} intecnopt.com\r\n </p>\r\n </a>\r\n </div>\r\n </aside>\r\n </>\r\n );\r\n}\r\n","import { useState, useRef, useEffect } from 'react';\r\nimport { TopbarProps } from '../types';\r\n\r\nexport function Topbar({ onToggleSidebar, userLabel, onLogout, currentTheme, onThemeChange }: TopbarProps) {\r\n const [openDropdown, setOpenDropdown] = useState<'notifications' | 'user' | null>(null);\r\n const notificationsRef = useRef<HTMLDivElement>(null);\r\n const userRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on click outside\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (openDropdown === 'notifications' && notificationsRef.current && !notificationsRef.current.contains(event.target as Node)) {\r\n setOpenDropdown(null);\r\n }\r\n if (openDropdown === 'user' && userRef.current && !userRef.current.contains(event.target as Node)) {\r\n setOpenDropdown(null);\r\n }\r\n }\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [openDropdown]);\r\n\r\n const toggleDropdown = (name: 'notifications' | 'user') => {\r\n setOpenDropdown(prev => prev === name ? null : name);\r\n };\r\n\r\n return (\r\n <header className=\"sticky top-0 z-30 flex items-center justify-between h-20 px-8 bg-theme-header border-b border-theme shadow-sm transition-all duration-300\">\r\n <div className=\"flex items-center flex-1 gap-4\">\r\n {/* Mobile Toggle Button */}\r\n <button\r\n onClick={onToggleSidebar}\r\n className=\"p-2 text-gray-500 rounded-lg lg:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 transition-all duration-200\"\r\n >\r\n <span className=\"sr-only\">Open sidebar</span>\r\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Global Search Bar */}\r\n <div className=\"relative hidden md:block w-full max-w-md group\">\r\n <div className=\"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none transition-colors duration-200 text-gray-400 group-focus-within:text-gray-500\">\r\n <svg className=\"w-5 h-5 fill-none\" aria-hidden=\"true\" viewBox=\"0 0 20 20\">\r\n <path stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z\" />\r\n </svg>\r\n </div>\r\n <input\r\n type=\"text\"\r\n className=\"block w-full p-2.5 pl-10 text-sm text-gray-900 border border-gray-200 rounded-xl bg-gray-50 focus:ring-2 focus:ring-[#0ea5e9]/20 focus:border-[#0ea5e9] focus:bg-white outline-none transition-all duration-200 placeholder-gray-400 hover:bg-white hover:border-gray-300\"\r\n placeholder=\"Search projects, users, or settings...\"\r\n />\r\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none\">\r\n <span className=\"text-gray-400 text-xs border border-gray-200 rounded px-1.5 py-0.5 shadow-sm\">⌘K</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Right Actions */}\r\n <div className=\"flex items-center gap-2 sm:gap-4\">\r\n {/* Notifications Dropdown */}\r\n <div className=\"relative\" ref={notificationsRef}>\r\n <button\r\n onClick={() => toggleDropdown('notifications')}\r\n className={`relative p-2 rounded-lg transition-all duration-200 outline-none\r\n ${openDropdown === 'notifications' ? 'bg-theme-active text-theme-primary' : 'text-theme-secondary hover:text-theme-primary bg-theme-hover:hover'}\r\n `}\r\n >\r\n <span className=\"sr-only\">View notifications</span>\r\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\r\n </svg>\r\n <div className=\"absolute top-2.5 right-3 w-2.5 h-2.5 bg-red-500 rounded-full border-2 border-theme-header z-10 animate-pulse\"></div>\r\n </button>\r\n\r\n {/* Animated Dropdown Content */}\r\n <div className={`\r\n absolute right-0 mt-3 w-80 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden\r\n ${openDropdown === 'notifications' ? 'opacity-100 scale-100 translate-y-0' : 'opacity-0 scale-95 -translate-y-2 pointer-events-none'}\r\n `}>\r\n <div className=\"p-4 border-b border-theme flex justify-between items-center bg-theme-hover\">\r\n <h3 className=\"font-semibold text-theme-primary\">Notifications</h3>\r\n <button className=\"text-xs text-intecno-blue hover:text-indigo-400 font-medium\">Mark all read</button>\r\n </div>\r\n <div className=\"p-2 space-y-1\">\r\n {/* Empty/Placeholder State */}\r\n <div className=\"p-8 text-center text-theme-secondary\">\r\n <div className=\"mx-auto w-12 h-12 bg-theme-hover rounded-full flex items-center justify-center mb-3\">\r\n <svg className=\"w-6 h-6 text-theme-secondary opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4\" /></svg>\r\n </div>\r\n <p className=\"text-sm\">No new notifications</p>\r\n </div>\r\n </div>\r\n <div className=\"p-2 border-t border-theme bg-theme-hover text-center\">\r\n <button className=\"text-xs font-medium text-theme-secondary hover:text-theme-primary transition-colors\">View all activity</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* User Profile Menu with Dropdown */}\r\n <div className=\"relative pl-2 sm:pl-4 border-l border-theme\" ref={userRef}>\r\n <button\r\n onClick={() => toggleDropdown('user')}\r\n className=\"flex items-center gap-3 group focus:outline-none transition-all duration-200\"\r\n >\r\n <div className=\"text-right hidden sm:block\">\r\n <div className=\"text-sm font-semibold text-theme-primary leading-none group-hover:text-intecno-blue transition-colors\">{userLabel || 'Guest User'}</div>\r\n <div className=\"text-xs text-theme-secondary mt-1\">Administrator</div>\r\n </div>\r\n <div className={`\r\n w-10 h-10 rounded-full bg-gradient-to-br from-[#0f172a] to-[#334155] border-2 border-white/20 shadow-md flex items-center justify-center text-white font-medium text-lg overflow-hidden transition-all duration-300\r\n ${openDropdown === 'user' ? 'ring-2 ring-intecno-blue ring-offset-2 ring-offset-theme' : 'group-hover:shadow-lg group-hover:ring-2 group-hover:ring-[#0ea5e9]/20'}\r\n `}>\r\n {userLabel ? userLabel.charAt(0).toUpperCase() : 'U'}\r\n </div>\r\n </button>\r\n\r\n {/* Animated User Dropdown */}\r\n <div className={`\r\n absolute right-0 mt-3 w-64 bg-theme-dropdown rounded-2xl shadow-xl border border-theme transform origin-top-right transition-all duration-200 ease-out z-50 overflow-hidden\r\n ${openDropdown === 'user' ? 'opacity-100 scale-100 translate-y-0' : 'opacity-0 scale-95 -translate-y-2 pointer-events-none'}\r\n `}>\r\n\r\n {/* Theme Section */}\r\n {onThemeChange && (\r\n <div className=\"px-4 py-3 border-b border-theme bg-theme-hover\">\r\n <p className=\"text-[10px] font-bold text-theme-secondary uppercase tracking-widest mb-3\">Select Theme</p>\r\n <div className=\"grid grid-cols-4 gap-2\">\r\n {[\r\n { id: 'default', color: 'bg-[#051e34]', label: 'Intecno' },\r\n { id: 'dark', color: 'bg-[#0f172a]', label: 'Dark' },\r\n { id: 'red', color: 'bg-[#450a0a]', label: 'Red' },\r\n { id: 'green', color: 'bg-[#022c22]', label: 'Green' },\r\n ].map((t) => (\r\n <button\r\n key={t.id}\r\n onClick={() => onThemeChange(t.id)}\r\n className={`\r\n w-8 h-8 rounded-lg ${t.color} border transition-all duration-300 flex items-center justify-center group relative shadow-sm overflow-hidden\r\n ${currentTheme === t.id\r\n ? 'border-white ring-2 ring-white/20 scale-110'\r\n : 'border-white/10 hover:border-white/30 hover:scale-105 hover:shadow-md'\r\n }\r\n `}\r\n title={t.label}\r\n >\r\n {currentTheme === t.id && (\r\n <div className=\"w-1.5 h-1.5 bg-white rounded-full shadow-sm animate-bounce\"></div>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"p-1.5 space-y-0.5\">\r\n {['Your Profile', 'Settings', 'Team', 'Billing'].map(item => (\r\n <button key={item} className=\"flex w-full items-center px-3 py-2 text-sm text-theme-primary rounded-lg hover:bg-theme-hover hover:text-intecno-blue transition-colors\">\r\n {item}\r\n </button>\r\n ))}\r\n </div>\r\n {onLogout && (\r\n <div className=\"p-1.5 border-t border-theme\">\r\n <button\r\n onClick={onLogout}\r\n className=\"flex w-full items-center px-3 py-2 text-sm text-red-500 rounded-lg hover:bg-red-500/10 transition-colors\"\r\n >\r\n Sign out\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport { AdminShellProps } from './types';\r\nimport { Sidebar } from './components/Sidebar';\r\nimport { Topbar } from './components/Topbar';\r\n\r\n// Removed duplicate AdminShellProps interface definition\r\n\r\n\r\n\r\nexport function AdminShell({\r\n tabs,\r\n activeKey,\r\n children,\r\n LinkComponent,\r\n basePath = '',\r\n brandName,\r\n logo,\r\n userLabel,\r\n onLogout,\r\n currentTheme,\r\n onThemeChange\r\n}: AdminShellProps) {\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n\r\n return (\r\n /* Fixed Viewport Layout - Prevents body scroll */\r\n <div className=\"flex h-screen w-full overflow-hidden bg-theme-page text-theme-primary transition-colors duration-300\">\r\n <Sidebar\r\n tabs={tabs}\r\n activeKey={activeKey}\r\n LinkComponent={LinkComponent}\r\n isOpen={isSidebarOpen}\r\n onClose={() => setIsSidebarOpen(false)}\r\n basePath={basePath}\r\n brandName={brandName}\r\n logo={logo}\r\n />\r\n\r\n {/* Main Content Wrapper - Handles its own scrolling */}\r\n <div className=\"flex-1 flex flex-col min-w-0 h-full relative\">\r\n <Topbar\r\n onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)}\r\n userLabel={userLabel}\r\n onLogout={onLogout}\r\n currentTheme={currentTheme}\r\n onThemeChange={onThemeChange}\r\n />\r\n\r\n <main className=\"flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-gray-200 hover:scrollbar-thumb-gray-300 p-4 sm:p-6 lg:p-8\">\r\n {children}\r\n </main>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface EmptyStateProps {\r\n title: string;\r\n description?: string;\r\n icon?: React.ReactNode;\r\n action?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function EmptyState({ title, description, icon, action, className = '' }: EmptyStateProps) {\r\n return (\r\n <div className={`flex flex-col items-center justify-center p-12 text-center rounded-lg border-2 border-dashed border-gray-200 bg-gray-50/50 ${className}`}>\r\n {icon && (\r\n <div className=\"mb-4 text-gray-400 p-3 bg-white rounded-full shadow-sm border border-gray-100\">\r\n {icon}\r\n </div>\r\n )}\r\n <h3 className=\"text-lg font-medium text-gray-900 mb-1\">{title}</h3>\r\n {description && <p className=\"text-sm text-gray-500 max-w-sm mb-6\">{description}</p>}\r\n {action}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface SectionProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n title?: string;\r\n description?: string;\r\n actions?: React.ReactNode;\r\n}\r\n\r\nexport function Section({ children, className = '', title, description, actions }: SectionProps) {\r\n return (\r\n <section className={`flex flex-col gap-6 ${className}`}>\r\n {(title || description || actions) && (\r\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4\">\r\n <div className=\"flex flex-col gap-1\">\r\n {title && <h2 className=\"text-2xl font-semibold text-gray-900\">{title}</h2>}\r\n {description && <p className=\"text-sm text-gray-500\">{description}</p>}\r\n </div>\r\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\r\n </div>\r\n )}\r\n {children}\r\n </section>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n title?: string;\r\n actions?: React.ReactNode;\r\n}\r\n\r\nexport function Card({ children, className = '', title, actions }: CardProps) {\r\n return (\r\n <div className={`bg-white rounded-lg border border-gray-200 shadow-sm ${className}`}>\r\n {(title || actions) && (\r\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-100\">\r\n {title && <h3 className=\"text-lg font-medium text-gray-900\">{title}</h3>}\r\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\r\n </div>\r\n )}\r\n <div className=\"p-6\">\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface StatCardProps {\r\n label: string;\r\n value: string | number;\r\n icon?: React.ReactNode;\r\n trend?: {\r\n value: string | number;\r\n direction: 'up' | 'down' | 'neutral';\r\n label?: string;\r\n };\r\n className?: string;\r\n}\r\n\r\nexport function StatCard({ label, value, icon, trend, className = '' }: StatCardProps) {\r\n return (\r\n <div className={`bg-white rounded-2xl border border-gray-100 p-6 shadow-sm hover:shadow-md transition-shadow duration-300 flex items-start justify-between ${className}`}>\r\n <div className=\"flex flex-col gap-2\">\r\n <span className=\"text-sm font-medium text-gray-500 tracking-wide uppercase\">{label}</span>\r\n <span className=\"text-3xl font-bold text-gray-900 tracking-tight\">{value}</span>\r\n\r\n {trend && (\r\n <div className=\"flex items-center gap-1.5 mt-2\">\r\n <span className={`text-sm font-medium ${trend.direction === 'up' ? 'text-green-600' :\r\n trend.direction === 'down' ? 'text-red-600' :\r\n 'text-gray-600'\r\n }`}>\r\n {trend.direction === 'up' ? '↑' : trend.direction === 'down' ? '↓' : '•'} {trend.value}\r\n </span>\r\n {trend.label && <span className=\"text-sm text-gray-400\">{trend.label}</span>}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {icon && (\r\n <div className=\"p-2.5 bg-gray-50 rounded-lg text-gray-500\">\r\n {icon}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport interface AuthShellProps {\r\n children: React.ReactNode;\r\n brandName?: string;\r\n logo?: React.ReactNode;\r\n quote?: string;\r\n quoteAuthor?: string;\r\n}\r\n\r\n// --- Fun/Geeky Access Messages ---\r\nconst ACCESS_MESSAGES = [\r\n { text: \"I'm in.\", source: \"Hacker Movies Generic\" },\r\n { text: \"Access Granted, Mr. Anderson.\", source: \"The Matrix\" },\r\n { text: \"Protocol Zero: Initiated.\", source: \"Mission Impossible\" },\r\n { text: \"With great power comes great dashboards.\", source: \"Spider-Man\" },\r\n { text: \"May the WiFi be with you.\", source: \"Star Wars\" },\r\n { text: \"Encryption Level: Jedi.\", source: \"Star Wars\" },\r\n { text: \"Mainframe: Secure.\", source: \"Generic Cyberpunk\" },\r\n { text: \"Houston, we have a login.\", source: \"Apollo 13\" },\r\n { text: \"System Status: 100% Awesome.\", source: \"The LEGO Movie\" }\r\n];\r\n\r\nexport function AuthShell({\r\n children,\r\n brandName,\r\n logo,\r\n quote = \"Manage your business with confidence and style.\",\r\n quoteAuthor = \"Intecno Team\"\r\n}: AuthShellProps) {\r\n const [accessMessage, setAccessMessage] = React.useState(ACCESS_MESSAGES[0]);\r\n\r\n React.useEffect(() => {\r\n setAccessMessage(ACCESS_MESSAGES[Math.floor(Math.random() * ACCESS_MESSAGES.length)]);\r\n }, []);\r\n\r\n return (\r\n <div className=\"flex min-h-screen w-full bg-white overflow-hidden font-sans\">\r\n {/* Left Panel: Auth Form (Clear & Clean) */}\r\n <div className=\"w-full lg:w-1/2 xl:w-5/12 flex flex-col items-center justify-center p-8 sm:p-12 lg:p-24 bg-white relative z-20\">\r\n {/* Subtle Grid Pattern for Professional Feel */}\r\n <div className=\"absolute inset-0 bg-[linear-gradient(to_right,#f1f5f9_1px,transparent_1px),linear-gradient(to_bottom,#f1f5f9_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_0%,#000_70%,transparent_100%)] pointer-events-none\"></div>\r\n\r\n {/* Top Left: System Status Widget */}\r\n <div className=\"absolute top-8 left-8 hidden sm:flex items-center gap-2 px-3 py-1.5 bg-white border border-gray-100 rounded-lg shadow-sm\">\r\n <div className=\"relative flex h-2.5 w-2.5\">\r\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\"></span>\r\n <span className=\"relative inline-flex rounded-full h-2.5 w-2.5 bg-green-500\"></span>\r\n </div>\r\n <span className=\"text-xs font-semibold text-gray-600\">All Systems Operational</span>\r\n </div>\r\n\r\n <div className=\"w-full max-w-md space-y-8 relative z-10\">\r\n {/* Mobile Brand (Visible only on small screens) */}\r\n <div className=\"lg:hidden text-center mb-8\">\r\n {logo && <div className=\"inline-block p-3 rounded-2xl bg-gradient-to-br from-intecno-navy to-intecno-blue text-white shadow-xl mb-4\">{logo}</div>}\r\n {brandName && <h2 className=\"text-3xl font-bold text-gray-900 tracking-tight\">{brandName}</h2>}\r\n </div>\r\n\r\n <div className=\"text-center lg:text-left mb-10 space-y-2\">\r\n {/* Dynamic \"Funny\" Secure Badge */}\r\n <div\r\n title={`Reference: ${accessMessage.source}`}\r\n className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-50 border border-blue-100 text-blue-600 text-[11px] font-bold uppercase tracking-wider mb-2 transition-all hover:bg-blue-100 cursor-help\"\r\n >\r\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" /></svg>\r\n {accessMessage.text}\r\n </div>\r\n <h2 className=\"text-4xl font-extrabold text-gray-900 tracking-tight\">Welcome back</h2>\r\n <p className=\"text-gray-500 text-lg\">Enter your credentials to access your workspace.</p>\r\n </div>\r\n\r\n <div className=\"bg-white/50 backdrop-blur-sm\">\r\n {children}\r\n </div>\r\n\r\n {/* Security Footer Links */}\r\n <div className=\"flex items-center justify-center lg:justify-start gap-4 text-xs text-gray-400 mt-8 pt-6 border-t border-gray-100\">\r\n <span className=\"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors\"><svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" /></svg> SSL Secured</span>\r\n <span className=\"flex items-center gap-1 hover:text-gray-600 cursor-pointer transition-colors\"><svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" /></svg> Help Center</span>\r\n </div>\r\n\r\n <p className=\"text-center lg:text-left text-xs font-medium text-gray-400 mt-4 uppercase tracking-wide\">\r\n © {new Date().getFullYear()} <a href=\"https://intecnopt.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-intecno-blue hover:text-cyan-600 font-bold hover:underline transition-all\">intecnopt.com</a>\r\n </p>\r\n </div>\r\n\r\n {/* Bottom Left: Version Badge */}\r\n <div className=\"absolute bottom-6 left-8 hidden sm:block text-[10px] font-mono text-gray-300\">\r\n v2.4.0-release\r\n </div>\r\n </div>\r\n\r\n {/* Right Panel: Flashy Brand Experience */}\r\n <div className=\"hidden lg:flex lg:w-1/2 xl:w-7/12 relative bg-[#051e34] overflow-hidden items-center justify-center text-white\">\r\n\r\n {/* 1. Dynamic Gradient Background */}\r\n <div className=\"absolute inset-0 bg-gradient-to-br from-[#020617] via-[#051e34] to-[#0e7490]\"></div>\r\n\r\n {/* 2. CSS Mesh/Wave Pattern Overlay */}\r\n <div className=\"absolute inset-0 opacity-30 mixture-blend-overlay bg-[radial-gradient(ellipse_at_top_right,_var(--tw-gradient-stops))] from-cyan-400/20 via-transparent to-transparent\"></div>\r\n\r\n {/* 3. Animated Waves (SVG) */}\r\n <div className=\"absolute bottom-0 left-0 right-0 opacity-20 transform translate-y-12\">\r\n <svg className=\"w-full h-[600px]\" viewBox=\"0 0 1440 320\" preserveAspectRatio=\"none\">\r\n <path fill=\"#22d3ee\" fillOpacity=\"1\" d=\"M0,224L48,213.3C96,203,192,181,288,181.3C384,181,480,203,576,224C672,245,768,267,864,261.3C960,256,1056,224,1152,197.3C1248,171,1344,149,1392,138.7L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z\"></path>\r\n </svg>\r\n </div>\r\n <div className=\"absolute bottom-0 left-0 right-0 opacity-10 transform translate-y-4 animate-pulse\">\r\n <svg className=\"w-full h-[600px]\" viewBox=\"0 0 1440 320\" preserveAspectRatio=\"none\">\r\n <path fill=\"#0891b2\" fillOpacity=\"1\" d=\"M0,96L48,112C96,128,192,160,288,186.7C384,213,480,235,576,213.3C672,192,768,128,864,128C960,128,1056,192,1152,213.3C1248,235,1344,213,1392,202.7L1440,192L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z\"></path>\r\n </svg>\r\n </div>\r\n\r\n {/* 4. Glassmorphism Content Card */}\r\n <div className=\"relative z-10 p-12 max-w-2xl\">\r\n <div className=\"relative backdrop-blur-3xl bg-white/5 border border-white/10 p-10 rounded-3xl shadow-[0_8px_32px_0_rgba(31,38,135,0.37)] overflow-hidden\">\r\n\r\n {/* Glow Effect */}\r\n <div className=\"absolute -top-20 -left-20 w-40 h-40 bg-cyan-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob\"></div>\r\n <div className=\"absolute -bottom-20 -right-20 w-40 h-40 bg-purple-400 rounded-full mix-blend-multiply filter blur-3xl opacity-20 animate-blob animation-delay-2000\"></div>\r\n\r\n <div className=\"relative z-10 flex flex-col items-center text-center space-y-6\">\r\n {logo && (\r\n <div className=\"w-20 h-20 rounded-2xl bg-gradient-to-br from-white/20 to-white/5 border border-white/20 flex items-center justify-center mb-4 shadow-2xl skew-y-3 transform hover:skew-y-0 transition-transform duration-500 cursor-pointer\">\r\n <div className=\"transform scale-150\">\r\n {logo}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-2\">\r\n <h1 className=\"text-4xl font-bold tracking-tight text-white drop-shadow-lg\">\r\n {brandName} <span className=\"text-cyan-400\">Pro</span>\r\n </h1>\r\n <p className=\"text-sm font-medium text-cyan-200 uppercase tracking-[0.2em]\">Enterprise Dashboard v2.4</p>\r\n </div>\r\n\r\n <p className=\"text-lg text-gray-300 leading-relaxed font-light max-w-lg mx-auto\">\r\n \"{quote}\"\r\n <span className=\"block mt-4 text-sm font-semibold text-cyan-400 not-italic\">— {quoteAuthor}</span>\r\n </p>\r\n\r\n <div className=\"h-px w-24 bg-gradient-to-r from-transparent via-cyan-500 to-transparent mt-8\"></div>\r\n\r\n <div className=\"flex gap-4 pt-4\">\r\n <span className=\"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100\">REACT</span>\r\n <span className=\"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100\">TAILWIND</span>\r\n <span className=\"px-3 py-1 rounded-full text-[10px] font-bold bg-white/10 border border-white/5 text-cyan-100\">TYPESCRIPT</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Floating Elements */}\r\n <div className=\"absolute top-20 right-20 w-24 h-24 bg-gradient-to-r from-cyan-500 to-blue-500 rounded-full blur-3xl opacity-20 animate-pulse\"></div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@intecnopt/admin-shell",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A production-ready React + TypeScript admin dashboard shell with beautiful themes, authentication screens, and responsive layouts.",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./styles": "./src/styles/intecno.css",
|
|
15
|
+
"./styles.css": "./src/styles/intecno.css",
|
|
16
|
+
"./preset": "./tailwind-preset.js"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"dev": "tsup --watch",
|
|
21
|
+
"lint": "tsc",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"react": ">=18",
|
|
26
|
+
"react-dom": ">=18",
|
|
27
|
+
"tailwindcss": ">=3.0.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^22.0.0",
|
|
31
|
+
"@types/react": "^18.3.12",
|
|
32
|
+
"@types/react-dom": "^18.3.1",
|
|
33
|
+
"react": "^18.3.1",
|
|
34
|
+
"react-dom": "^18.3.1",
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^5.7.2"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"src/styles",
|
|
44
|
+
"tailwind-preset.js"
|
|
45
|
+
],
|
|
46
|
+
"keywords": [
|
|
47
|
+
"react",
|
|
48
|
+
"typescript",
|
|
49
|
+
"admin",
|
|
50
|
+
"dashboard",
|
|
51
|
+
"shell",
|
|
52
|
+
"tailwindcss",
|
|
53
|
+
"intecno",
|
|
54
|
+
"admin-panel",
|
|
55
|
+
"component-library",
|
|
56
|
+
"ui-kit",
|
|
57
|
+
"authentication",
|
|
58
|
+
"login",
|
|
59
|
+
"themes"
|
|
60
|
+
],
|
|
61
|
+
"author": "Intecno <contact@intecnopt.com>",
|
|
62
|
+
"license": "MIT",
|
|
63
|
+
"homepage": "https://intecnopt.com",
|
|
64
|
+
"repository": {
|
|
65
|
+
"type": "git",
|
|
66
|
+
"url": "https://github.com/intecnopt/admin-shell.git"
|
|
67
|
+
},
|
|
68
|
+
"bugs": {
|
|
69
|
+
"url": "https://github.com/intecnopt/admin-shell/issues"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* IntecnoManager Admin Shell - Styles
|
|
3
|
+
* @intecnopt/admin-shell
|
|
4
|
+
*
|
|
5
|
+
* Import this file AFTER your Tailwind CSS imports
|
|
6
|
+
* Example: import '@intecnopt/admin-shell/styles';
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Google Fonts - Inter */
|
|
10
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
|
|
11
|
+
|
|
12
|
+
/* ========================================
|
|
13
|
+
THEME DEFINITIONS
|
|
14
|
+
======================================== */
|
|
15
|
+
|
|
16
|
+
@layer base {
|
|
17
|
+
:root {
|
|
18
|
+
/* --- 1. INTECNO BRAND THEME (Default - Immersive Navy) --- */
|
|
19
|
+
--bg-page: #102a43;
|
|
20
|
+
--bg-header: #173451;
|
|
21
|
+
--bg-sidebar: #051e34;
|
|
22
|
+
--bg-card: #243b53;
|
|
23
|
+
--bg-dropdown: #0f172a;
|
|
24
|
+
|
|
25
|
+
--bg-item-hover: rgba(255, 255, 255, 0.05);
|
|
26
|
+
--bg-item-active: rgba(255, 255, 255, 0.1);
|
|
27
|
+
|
|
28
|
+
--text-primary: #f8fafc;
|
|
29
|
+
--text-secondary: #cbd5e1;
|
|
30
|
+
--text-sidebar: #ffffff;
|
|
31
|
+
--text-sidebar-muted: #94a3b8;
|
|
32
|
+
|
|
33
|
+
--border-color: #334155;
|
|
34
|
+
--border-sidebar: rgba(255, 255, 255, 0.08);
|
|
35
|
+
|
|
36
|
+
--color-primary: #0891b2;
|
|
37
|
+
--color-accent: #22d3ee;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
[data-theme="dark"] {
|
|
41
|
+
/* --- 2. DARK MODE (Zinc) --- */
|
|
42
|
+
--bg-page: #27272a;
|
|
43
|
+
--bg-header: #18181b;
|
|
44
|
+
--bg-sidebar: #09090b;
|
|
45
|
+
--bg-card: #3f3f46;
|
|
46
|
+
--bg-dropdown: #18181b;
|
|
47
|
+
|
|
48
|
+
--bg-item-hover: rgba(255, 255, 255, 0.05);
|
|
49
|
+
--bg-item-active: rgba(255, 255, 255, 0.1);
|
|
50
|
+
|
|
51
|
+
--text-primary: #f4f4f5;
|
|
52
|
+
--text-secondary: #a1a1aa;
|
|
53
|
+
--text-sidebar: #e4e4e7;
|
|
54
|
+
--text-sidebar-muted: #71717a;
|
|
55
|
+
|
|
56
|
+
--border-color: #3f3f46;
|
|
57
|
+
--border-sidebar: #27272a;
|
|
58
|
+
|
|
59
|
+
--color-primary: #d4d4d8;
|
|
60
|
+
--color-accent: #52525b;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
[data-theme="red"] {
|
|
64
|
+
/* --- 3. RED THEME --- */
|
|
65
|
+
--bg-page: #5b1010;
|
|
66
|
+
--bg-header: #450a0a;
|
|
67
|
+
--bg-sidebar: #2b0505;
|
|
68
|
+
--bg-card: #7f1d1d;
|
|
69
|
+
--bg-dropdown: #450a0a;
|
|
70
|
+
|
|
71
|
+
--bg-item-hover: rgba(255, 255, 255, 0.1);
|
|
72
|
+
--bg-item-active: rgba(255, 255, 255, 0.2);
|
|
73
|
+
|
|
74
|
+
--text-primary: #ffffff;
|
|
75
|
+
--text-secondary: #fca5a5;
|
|
76
|
+
--text-sidebar: #ffffff;
|
|
77
|
+
--text-sidebar-muted: #e5e7eb;
|
|
78
|
+
|
|
79
|
+
--border-color: #7f1d1d;
|
|
80
|
+
--border-sidebar: rgba(255, 255, 255, 0.1);
|
|
81
|
+
|
|
82
|
+
--color-primary: #ef4444;
|
|
83
|
+
--color-accent: #b91c1c;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
[data-theme="green"] {
|
|
87
|
+
/* --- 4. GREEN THEME (Light Mode) --- */
|
|
88
|
+
--bg-page: #f5f5f4;
|
|
89
|
+
--bg-header: #ffffff;
|
|
90
|
+
--bg-sidebar: #14532d;
|
|
91
|
+
--bg-card: #ffffff;
|
|
92
|
+
--bg-dropdown: #ffffff;
|
|
93
|
+
|
|
94
|
+
--bg-item-hover: #f3f4f6;
|
|
95
|
+
--bg-item-active: #e5e7eb;
|
|
96
|
+
|
|
97
|
+
--text-primary: #1c1917;
|
|
98
|
+
--text-secondary: #57534e;
|
|
99
|
+
--text-sidebar: #ffffff;
|
|
100
|
+
--text-sidebar-muted: #e2e8f0;
|
|
101
|
+
|
|
102
|
+
--border-color: #e7e5e4;
|
|
103
|
+
--border-sidebar: rgba(255, 255, 255, 0.1);
|
|
104
|
+
|
|
105
|
+
--color-primary: #15803d;
|
|
106
|
+
--color-accent: #22c55e;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* Base body styling */
|
|
110
|
+
body {
|
|
111
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
112
|
+
-webkit-font-smoothing: antialiased;
|
|
113
|
+
-moz-osx-font-smoothing: grayscale;
|
|
114
|
+
background-color: var(--bg-page);
|
|
115
|
+
color: var(--text-primary);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* ========================================
|
|
120
|
+
THEME UTILITY CLASSES
|
|
121
|
+
======================================== */
|
|
122
|
+
|
|
123
|
+
@layer utilities {
|
|
124
|
+
.bg-theme-page {
|
|
125
|
+
background-color: var(--bg-page);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.bg-theme-header {
|
|
129
|
+
background-color: var(--bg-header);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.bg-theme-sidebar {
|
|
133
|
+
background-color: var(--bg-sidebar);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.bg-theme-card {
|
|
137
|
+
background-color: var(--bg-card);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.bg-theme-dropdown {
|
|
141
|
+
background-color: var(--bg-dropdown);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.bg-theme-hover:hover {
|
|
145
|
+
background-color: var(--bg-item-hover);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.bg-theme-active {
|
|
149
|
+
background-color: var(--bg-item-active);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.text-theme-primary {
|
|
153
|
+
color: var(--text-primary);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.text-theme-secondary {
|
|
157
|
+
color: var(--text-secondary);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.text-sidebar-primary {
|
|
161
|
+
color: var(--text-sidebar);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.text-sidebar-muted {
|
|
165
|
+
color: var(--text-sidebar-muted);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.border-theme {
|
|
169
|
+
border-color: var(--border-color);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.border-sidebar-theme {
|
|
173
|
+
border-color: var(--border-sidebar);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.border-theme-header {
|
|
177
|
+
border-color: var(--bg-header);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.text-brand {
|
|
181
|
+
color: var(--color-primary);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.bg-brand {
|
|
185
|
+
background-color: var(--color-primary);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.text-theme-accent {
|
|
189
|
+
color: var(--color-accent);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.bg-theme-accent {
|
|
193
|
+
background-color: var(--color-accent);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* Animation delays */
|
|
197
|
+
.animation-delay-2000 {
|
|
198
|
+
animation-delay: 2s;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.animation-delay-4000 {
|
|
202
|
+
animation-delay: 4s;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* ========================================
|
|
207
|
+
ANIMATIONS
|
|
208
|
+
======================================== */
|
|
209
|
+
|
|
210
|
+
@keyframes blob {
|
|
211
|
+
0% {
|
|
212
|
+
transform: translate(0px, 0px) scale(1);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
33% {
|
|
216
|
+
transform: translate(30px, -50px) scale(1.1);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
66% {
|
|
220
|
+
transform: translate(-20px, 20px) scale(0.9);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
100% {
|
|
224
|
+
transform: translate(0px, 0px) scale(1);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.animate-blob {
|
|
229
|
+
animation: blob 7s infinite;
|
|
230
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IntecnoManager Admin Shell - Tailwind Preset
|
|
3
|
+
* @intecnopt/admin-shell
|
|
4
|
+
*
|
|
5
|
+
* Usage in tailwind.config.js:
|
|
6
|
+
*
|
|
7
|
+
* module.exports = {
|
|
8
|
+
* presets: [require('@intecnopt/admin-shell/preset')],
|
|
9
|
+
* // ... your config
|
|
10
|
+
* }
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
module.exports = {
|
|
14
|
+
theme: {
|
|
15
|
+
extend: {
|
|
16
|
+
colors: {
|
|
17
|
+
intecno: {
|
|
18
|
+
navy: '#051e34',
|
|
19
|
+
dark: '#0b1d2e',
|
|
20
|
+
blue: '#0891b2',
|
|
21
|
+
cyan: '#22d3ee',
|
|
22
|
+
accent: '#67e8f9',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
fontFamily: {
|
|
26
|
+
sans: ['Inter', 'system-ui', '-apple-system', 'BlinkMacSystemFont', 'sans-serif'],
|
|
27
|
+
},
|
|
28
|
+
animation: {
|
|
29
|
+
'blob': 'blob 7s infinite',
|
|
30
|
+
},
|
|
31
|
+
keyframes: {
|
|
32
|
+
blob: {
|
|
33
|
+
'0%': { transform: 'translate(0px, 0px) scale(1)' },
|
|
34
|
+
'33%': { transform: 'translate(30px, -50px) scale(1.1)' },
|
|
35
|
+
'66%': { transform: 'translate(-20px, 20px) scale(0.9)' },
|
|
36
|
+
'100%': { transform: 'translate(0px, 0px) scale(1)' },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
plugins: [],
|
|
42
|
+
};
|