omnira-ui 0.5.0 → 0.6.5
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 +3 -3
- package/cli/omnira-init.mjs +20 -1
- package/components/ui/ActivityFeed/ActivityFeed.module.css +143 -0
- package/components/ui/ActivityFeed/ActivityFeed.tsx +94 -0
- package/components/ui/ActivityFeed/index.ts +2 -0
- package/components/ui/AuthPage/AuthPage.module.css +554 -0
- package/components/ui/AuthPage/AuthPage.tsx +376 -0
- package/components/ui/AuthPage/index.ts +2 -0
- package/components/ui/Button/Button.module.css +5 -5
- package/components/ui/ButtonGroup/ButtonGroup.module.css +103 -0
- package/components/ui/ButtonGroup/ButtonGroup.tsx +153 -0
- package/components/ui/ButtonGroup/index.ts +2 -0
- package/components/ui/Carousel/Carousel.module.css +95 -0
- package/components/ui/Carousel/Carousel.tsx +137 -0
- package/components/ui/Carousel/index.ts +2 -0
- package/components/ui/CommandMenu/CommandMenu.module.css +187 -0
- package/components/ui/CommandMenu/CommandMenu.tsx +205 -0
- package/components/ui/CommandMenu/index.ts +2 -0
- package/components/ui/FeaturedIcon/FeaturedIcon.module.css +212 -0
- package/components/ui/FeaturedIcon/FeaturedIcon.tsx +46 -0
- package/components/ui/FeaturedIcon/index.ts +2 -0
- package/components/ui/HeaderNavigation/HeaderNavigation.module.css +99 -0
- package/components/ui/HeaderNavigation/HeaderNavigation.tsx +103 -0
- package/components/ui/HeaderNavigation/index.ts +2 -0
- package/components/ui/InlineCTA/InlineCTA.module.css +101 -0
- package/components/ui/InlineCTA/InlineCTA.tsx +59 -0
- package/components/ui/InlineCTA/index.ts +2 -0
- package/components/ui/LineBarChart/LineBarChart.module.css +41 -0
- package/components/ui/LineBarChart/LineBarChart.tsx +191 -0
- package/components/ui/LineBarChart/index.ts +2 -0
- package/components/ui/LoginCardSeparated/LoginCardSeparated.module.css +341 -0
- package/components/ui/LoginCardSeparated/LoginCardSeparated.tsx +293 -0
- package/components/ui/LoginCardSeparated/index.ts +2 -0
- package/components/ui/LoginSimple/LoginSimple.module.css +342 -0
- package/components/ui/LoginSimple/LoginSimple.tsx +213 -0
- package/components/ui/LoginSimple/index.ts +2 -0
- package/components/ui/LoginSplitImage/LoginSplitImage.module.css +395 -0
- package/components/ui/LoginSplitImage/LoginSplitImage.tsx +199 -0
- package/components/ui/LoginSplitImage/index.ts +2 -0
- package/components/ui/LoginSplitQuote/LoginSplitQuote.module.css +416 -0
- package/components/ui/LoginSplitQuote/LoginSplitQuote.tsx +224 -0
- package/components/ui/LoginSplitQuote/index.ts +2 -0
- package/components/ui/Matrix/Matrix.module.css +54 -0
- package/components/ui/Matrix/Matrix.tsx +99 -0
- package/components/ui/Matrix/index.ts +2 -0
- package/components/ui/Messaging/Messaging.module.css +186 -0
- package/components/ui/Messaging/Messaging.tsx +168 -0
- package/components/ui/Messaging/index.ts +2 -0
- package/components/ui/Pagination/Pagination.module.css +161 -0
- package/components/ui/Pagination/Pagination.tsx +150 -0
- package/components/ui/Pagination/index.ts +2 -0
- package/components/ui/PieChart/PieChart.module.css +91 -0
- package/components/ui/PieChart/PieChart.tsx +185 -0
- package/components/ui/PieChart/index.ts +2 -0
- package/components/ui/ProgressSteps/ProgressSteps.module.css +232 -0
- package/components/ui/ProgressSteps/ProgressSteps.tsx +134 -0
- package/components/ui/ProgressSteps/index.ts +2 -0
- package/components/ui/RadarChart/RadarChart.module.css +25 -0
- package/components/ui/RadarChart/RadarChart.tsx +140 -0
- package/components/ui/RadarChart/index.ts +2 -0
- package/components/ui/SectionFooter/SectionFooter.module.css +55 -0
- package/components/ui/SectionFooter/SectionFooter.tsx +63 -0
- package/components/ui/SectionFooter/index.ts +2 -0
- package/components/ui/SectionHeader/SectionHeader.module.css +73 -0
- package/components/ui/SectionHeader/SectionHeader.tsx +121 -0
- package/components/ui/SectionHeader/index.ts +2 -0
- package/components/ui/SignUpCardSeparated/SignUpCardSeparated.module.css +342 -0
- package/components/ui/SignUpCardSeparated/SignUpCardSeparated.tsx +214 -0
- package/components/ui/SignUpCardSeparated/index.ts +2 -0
- package/components/ui/SignUpSimple/SignUpSimple.module.css +330 -0
- package/components/ui/SignUpSimple/SignUpSimple.tsx +225 -0
- package/components/ui/SignUpSimple/index.ts +2 -0
- package/components/ui/SignUpSplitImage/SignUpSplitImage.module.css +399 -0
- package/components/ui/SignUpSplitImage/SignUpSplitImage.tsx +235 -0
- package/components/ui/SignUpSplitImage/index.ts +2 -0
- package/components/ui/SignUpSplitQuote/SignUpSplitQuote.module.css +430 -0
- package/components/ui/SignUpSplitQuote/SignUpSplitQuote.tsx +260 -0
- package/components/ui/SignUpSplitQuote/index.ts +2 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ A premium glassmorphism design system — dark-first, glass-forward, no compromi
|
|
|
4
4
|
|
|
5
5
|
30+ base components, sidebar navigation, feature cards, 1,000+ icons, and a CLI to scaffold your project with your chosen accent color and theme mode.
|
|
6
6
|
|
|
7
|
-
**[Live Documentation →](https://
|
|
7
|
+
**[Live Documentation →](https://omnira.one)**
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -75,7 +75,7 @@ export default function MyPage() {
|
|
|
75
75
|
|
|
76
76
|
Browse the full library and copy advanced components (Sidebar, Feature Cards, etc.) directly from the docs:
|
|
77
77
|
|
|
78
|
-
**[
|
|
78
|
+
**[omnira.one →](https://omnira.one)**
|
|
79
79
|
|
|
80
80
|
---
|
|
81
81
|
|
|
@@ -170,4 +170,4 @@ lib/ # Shared utilities
|
|
|
170
170
|
|
|
171
171
|
## License
|
|
172
172
|
|
|
173
|
-
MIT © [Omnira UI](https://
|
|
173
|
+
MIT © [Omnira UI](https://omnira.one)
|
package/cli/omnira-init.mjs
CHANGED
|
@@ -384,7 +384,7 @@ async function main() {
|
|
|
384
384
|
log(` ${MAGENTA}import${RESET} { Button } ${MAGENTA}from${RESET} ${WHITE}"@/components/ui/Button"${RESET};`);
|
|
385
385
|
blank();
|
|
386
386
|
log(` ${DIM}4.${RESET} Browse all components & copy advanced ones:`);
|
|
387
|
-
log(` ${CYAN}https://
|
|
387
|
+
log(` ${CYAN}https://omnira.one${RESET}`);
|
|
388
388
|
blank();
|
|
389
389
|
}
|
|
390
390
|
|
|
@@ -468,6 +468,25 @@ const PAGE_BUNDLES = {
|
|
|
468
468
|
"card": ["Card", "Button", "Badge"],
|
|
469
469
|
// Matrix
|
|
470
470
|
"matrix": ["Card"],
|
|
471
|
+
// ── Base component slug aliases (hyphenated → PascalCase folder) ──
|
|
472
|
+
"app-store-button": ["AppStoreButton"],
|
|
473
|
+
"badge-group": ["BadgeGroup"],
|
|
474
|
+
"button-group": ["ButtonGroup"],
|
|
475
|
+
"credit-card": ["CreditCard"],
|
|
476
|
+
"featured-icon": ["FeaturedIcon"],
|
|
477
|
+
"progress-indicator": ["ProgressBar"],
|
|
478
|
+
"qr-code": ["QRCode"],
|
|
479
|
+
"radio-button": ["RadioButton"],
|
|
480
|
+
"radio-group": ["RadioGroup"],
|
|
481
|
+
"social-button": ["SocialButton"],
|
|
482
|
+
"text-editor": ["TextEditor"],
|
|
483
|
+
"utility": ["ButtonUtility"],
|
|
484
|
+
"verification-code-input": ["PinInput"],
|
|
485
|
+
"video-player": ["VideoPlayer"],
|
|
486
|
+
"agent-thinking": ["AgentThinking"],
|
|
487
|
+
// ── Shared pages bundles ──
|
|
488
|
+
"login": ["AuthPage", "LoginSimple", "LoginSplitImage", "LoginSplitQuote", "LoginCardSeparated", "SocialButton", "Button", "Input", "Checkbox"],
|
|
489
|
+
"sign-up": ["SignUpSimple", "SignUpSplitImage", "SignUpSplitQuote", "SignUpCardSeparated", "SocialButton", "Button", "Input", "Checkbox"],
|
|
471
490
|
};
|
|
472
491
|
|
|
473
492
|
// ── Add command — copy a single component ───────────────────────────
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/* ── Root ── */
|
|
2
|
+
.root {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.card {
|
|
8
|
+
background: var(--color-bg-card);
|
|
9
|
+
border: 1px solid var(--color-border-standard);
|
|
10
|
+
border-radius: var(--radius-xl);
|
|
11
|
+
padding: 24px;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* ── Item ── */
|
|
15
|
+
.item {
|
|
16
|
+
display: flex;
|
|
17
|
+
gap: 12px;
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.default .item + .item {
|
|
22
|
+
margin-top: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.compact .item + .item {
|
|
26
|
+
margin-top: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* ── Timeline Column ── */
|
|
30
|
+
.timeline {
|
|
31
|
+
display: flex;
|
|
32
|
+
flex-direction: column;
|
|
33
|
+
align-items: center;
|
|
34
|
+
flex-shrink: 0;
|
|
35
|
+
width: 36px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.avatar {
|
|
39
|
+
width: 36px;
|
|
40
|
+
height: 36px;
|
|
41
|
+
border-radius: 50%;
|
|
42
|
+
object-fit: cover;
|
|
43
|
+
flex-shrink: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.avatarFallback {
|
|
47
|
+
width: 36px;
|
|
48
|
+
height: 36px;
|
|
49
|
+
border-radius: 50%;
|
|
50
|
+
background: var(--color-bg-elevated);
|
|
51
|
+
border: 1px solid var(--color-border-standard);
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
justify-content: center;
|
|
55
|
+
font-size: 12px;
|
|
56
|
+
font-weight: 600;
|
|
57
|
+
color: var(--color-text-secondary);
|
|
58
|
+
flex-shrink: 0;
|
|
59
|
+
font-family: var(--font-display);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.iconBubble {
|
|
63
|
+
width: 36px;
|
|
64
|
+
height: 36px;
|
|
65
|
+
border-radius: 50%;
|
|
66
|
+
background: var(--color-bg-lime-subtle);
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
justify-content: center;
|
|
70
|
+
color: var(--color-lime);
|
|
71
|
+
flex-shrink: 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.connector {
|
|
75
|
+
width: 2px;
|
|
76
|
+
flex: 1;
|
|
77
|
+
min-height: 24px;
|
|
78
|
+
background: var(--color-border-standard);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* ── Compact ── */
|
|
82
|
+
.compact .timeline {
|
|
83
|
+
width: 28px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.compact .avatar,
|
|
87
|
+
.compact .avatarFallback,
|
|
88
|
+
.compact .iconBubble {
|
|
89
|
+
width: 28px;
|
|
90
|
+
height: 28px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.compact .avatarFallback {
|
|
94
|
+
font-size: 10px;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.compact .connector {
|
|
98
|
+
min-height: 16px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* ── Content Column ── */
|
|
102
|
+
.content {
|
|
103
|
+
flex: 1;
|
|
104
|
+
min-width: 0;
|
|
105
|
+
padding-bottom: 24px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.compact .content {
|
|
109
|
+
padding-bottom: 16px;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.item:last-child .content {
|
|
113
|
+
padding-bottom: 0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.header {
|
|
117
|
+
display: flex;
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 8px;
|
|
120
|
+
margin-bottom: 4px;
|
|
121
|
+
flex-wrap: wrap;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.userName {
|
|
125
|
+
font-size: 14px;
|
|
126
|
+
font-weight: 600;
|
|
127
|
+
color: var(--color-text-primary);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.timestamp {
|
|
131
|
+
font-size: 12px;
|
|
132
|
+
color: var(--color-text-tertiary);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.body {
|
|
136
|
+
font-size: 14px;
|
|
137
|
+
color: var(--color-text-secondary);
|
|
138
|
+
line-height: 1.5;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.body p {
|
|
142
|
+
margin: 0;
|
|
143
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { cn } from "@/lib/cn";
|
|
5
|
+
import styles from "./ActivityFeed.module.css";
|
|
6
|
+
|
|
7
|
+
/* ── Types ── */
|
|
8
|
+
|
|
9
|
+
export interface ActivityFeedItem {
|
|
10
|
+
id: string;
|
|
11
|
+
/** User display name */
|
|
12
|
+
user: string;
|
|
13
|
+
/** Avatar URL (falls back to initials) */
|
|
14
|
+
avatar?: string;
|
|
15
|
+
/** Event content — plain text or ReactNode */
|
|
16
|
+
content: React.ReactNode;
|
|
17
|
+
/** Timestamp label (e.g. "2 hours ago") */
|
|
18
|
+
timestamp: string;
|
|
19
|
+
/** Optional icon (replaces avatar dot) */
|
|
20
|
+
icon?: React.ReactNode;
|
|
21
|
+
/** Icon background color */
|
|
22
|
+
iconBg?: string;
|
|
23
|
+
/** Event type for styling */
|
|
24
|
+
type?: "default" | "comment" | "status" | "assignment" | "commit";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ActivityFeedProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
28
|
+
items: ActivityFeedItem[];
|
|
29
|
+
/** Visual variant */
|
|
30
|
+
variant?: "default" | "compact" | "card";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* ── Helpers ── */
|
|
34
|
+
|
|
35
|
+
function getInitials(name: string) {
|
|
36
|
+
return name
|
|
37
|
+
.split(" ")
|
|
38
|
+
.map((w) => w[0])
|
|
39
|
+
.join("")
|
|
40
|
+
.toUpperCase()
|
|
41
|
+
.slice(0, 2);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* ── Component ── */
|
|
45
|
+
|
|
46
|
+
export const ActivityFeed = forwardRef<HTMLDivElement, ActivityFeedProps>(
|
|
47
|
+
({ items, variant = "default", className, ...props }, ref) => {
|
|
48
|
+
return (
|
|
49
|
+
<div
|
|
50
|
+
ref={ref}
|
|
51
|
+
className={cn(styles.root, styles[variant], className)}
|
|
52
|
+
{...props}
|
|
53
|
+
>
|
|
54
|
+
{items.map((item, i) => (
|
|
55
|
+
<div key={item.id} className={styles.item}>
|
|
56
|
+
{/* Timeline column */}
|
|
57
|
+
<div className={styles.timeline}>
|
|
58
|
+
{item.icon ? (
|
|
59
|
+
<div
|
|
60
|
+
className={styles.iconBubble}
|
|
61
|
+
style={item.iconBg ? { background: item.iconBg } : undefined}
|
|
62
|
+
>
|
|
63
|
+
{item.icon}
|
|
64
|
+
</div>
|
|
65
|
+
) : item.avatar ? (
|
|
66
|
+
<img
|
|
67
|
+
src={item.avatar}
|
|
68
|
+
alt={item.user}
|
|
69
|
+
className={styles.avatar}
|
|
70
|
+
/>
|
|
71
|
+
) : (
|
|
72
|
+
<div className={styles.avatarFallback}>
|
|
73
|
+
{getInitials(item.user)}
|
|
74
|
+
</div>
|
|
75
|
+
)}
|
|
76
|
+
{i < items.length - 1 && <div className={styles.connector} />}
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
{/* Content column */}
|
|
80
|
+
<div className={styles.content}>
|
|
81
|
+
<div className={styles.header}>
|
|
82
|
+
<span className={styles.userName}>{item.user}</span>
|
|
83
|
+
<span className={styles.timestamp}>{item.timestamp}</span>
|
|
84
|
+
</div>
|
|
85
|
+
<div className={styles.body}>{item.content}</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
))}
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
ActivityFeed.displayName = "ActivityFeed";
|