@omnikit-js/ui 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,28 +19,21 @@ A comprehensive SaaS billing component for Next.js applications with Stripe inte
19
19
  npm install @omnikit-js/ui
20
20
  ```
21
21
 
22
- ### Setup
22
+ ### Simple Setup - No Tailwind Required!
23
23
 
24
- 1. Add our component to your `tailwind.config.js`:
25
- ```js
26
- module.exports = {
27
- content: [
28
- './pages/**/*.{js,ts,jsx,tsx,mdx}',
29
- './components/**/*.{js,ts,jsx,tsx,mdx}',
30
- './app/**/*.{js,ts,jsx,tsx,mdx}',
31
- // Add this line
32
- './node_modules/@omnikit-js/ui/**/*.{js,ts,jsx,tsx}',
33
- ],
34
- // ... rest of your config
35
- }
24
+ Just import the component's CSS file in your app:
25
+
26
+ **Option 1: In your `app/globals.css` or main CSS file:**
27
+ ```css
28
+ @import '@omnikit-js/ui/styles.css';
36
29
  ```
37
30
 
38
- 2. Import the component-specific styles:
31
+ **Option 2: In your layout file:**
39
32
  ```tsx
40
33
  import '@omnikit-js/ui/styles.css';
41
34
  ```
42
35
 
43
- **That's it!** The component will use your existing Tailwind configuration plus essential component-specific styles.
36
+ **That's it!** The component includes all necessary styles and works without requiring Tailwind CSS configuration.
44
37
 
45
38
  ## Prerequisites
46
39
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnikit-js/ui",
3
- "version": "0.4.6",
3
+ "version": "0.5.0",
4
4
  "description": "A SaaS billing component for Next.js with Stripe integration",
5
5
  "main": "src/index.ts",
6
6
  "module": "src/index.ts",
@@ -13,7 +13,8 @@
13
13
  }
14
14
  },
15
15
  "files": [
16
- "src"
16
+ "src",
17
+ "styles.css"
17
18
  ],
18
19
  "scripts": {
19
20
  "build": "rollup -c",
@@ -76,7 +77,6 @@
76
77
  "@types/react-dom": "^18.3.0",
77
78
  "autoprefixer": "^10.4.19",
78
79
  "postcss": "^8.4.38",
79
- "postcss-cli": "^11.0.1",
80
80
  "react": "^18.3.1",
81
81
  "react-dom": "^18.3.1",
82
82
  "rollup": "^4.17.2",
@@ -85,7 +85,7 @@
85
85
  "rollup-plugin-dts": "^6.1.1",
86
86
  "rollup-plugin-peer-deps-external": "^2.2.4",
87
87
  "rollup-plugin-postcss": "^4.0.2",
88
- "tailwindcss": "^3.4.3",
88
+ "tailwindcss": "^4.1.11",
89
89
  "typescript": "^5.4.5"
90
90
  }
91
91
  }
@@ -156,10 +156,10 @@ export default function BillingClient({ customerData, pricingData, paymentMethod
156
156
  const formatFeatureValue = (value: any) => {
157
157
  // Handle string boolean values
158
158
  if (value === 'true' || value === true) {
159
- return <span className="text-green-500 font-semibold">✓</span>
159
+ return '✓'
160
160
  }
161
161
  if (value === 'false' || value === false) {
162
- return <span className="text-red-500 font-semibold">✗</span>
162
+ return '✗'
163
163
  }
164
164
  // Handle numeric values (both string and number)
165
165
  const numValue = typeof value === 'string' ? parseFloat(value) : value
@@ -440,15 +440,15 @@ export default function BillingClient({ customerData, pricingData, paymentMethod
440
440
 
441
441
  const getStatusIcon = (percent: number, withinLimit: boolean) => {
442
442
  if (!withinLimit || percent >= 90) {
443
- return <AlertCircle className="h-4 w-4 text-red-500" />;
443
+ return <AlertCircle className="h-4 w-4 text-red-600 dark:text-red-400" />;
444
444
  }
445
445
  if (percent >= 75) {
446
- return <AlertTriangle className="h-4 w-4 text-orange-500" />;
446
+ return <AlertTriangle className="h-4 w-4 text-orange-600 dark:text-orange-400" />;
447
447
  }
448
448
  if (percent >= 50) {
449
- return <Info className="h-4 w-4 text-yellow-500" />;
449
+ return <Info className="h-4 w-4 text-yellow-600 dark:text-yellow-400" />;
450
450
  }
451
- return <CheckCircle className="h-4 w-4 text-green-500" />;
451
+ return <CheckCircle className="h-4 w-4 text-green-600 dark:text-green-400" />;
452
452
  };
453
453
 
454
454
  return (
@@ -532,11 +532,11 @@ export default function BillingClient({ customerData, pricingData, paymentMethod
532
532
  <CardContent className="text-center pb-4 flex-1">
533
533
  <div className="mb-4">
534
534
  <div className="flex items-baseline justify-center">
535
- <span className="text-3xl font-bold">
535
+ <span className="text-3xl font-bold tracking-tight">
536
536
  {parseFloat(price?.unit_amount) === 0 ? 'Free' : `$${parseFloat(price?.unit_amount).toFixed(2).replace(/\.00$/, '')}`}
537
537
  </span>
538
538
  {parseFloat(price?.unit_amount) > 0 && (
539
- <span className="text-sm text-muted-foreground font-normal ml-1">/month</span>
539
+ <span className="ml-1 text-sm text-muted-foreground">/month</span>
540
540
  )}
541
541
  </div>
542
542
  {isCurrentPlan ? (
@@ -549,12 +549,12 @@ export default function BillingClient({ customerData, pricingData, paymentMethod
549
549
  {features.map((feature: any) => (
550
550
  <div key={feature.id} className="border-t pt-3 first:border-t-0 first:pt-0 flex-1 flex flex-col justify-center">
551
551
  <div className="text-lg font-semibold text-foreground">
552
- {formatFeatureValue(feature.value)} <span className="text-sm text-muted-foreground font-normal">{feature.units}</span>
552
+ {formatFeatureValue(feature.value)} <span className="text-sm text-gray-500 font-normal">{feature.units}</span>
553
553
  </div>
554
554
  <TooltipProvider>
555
555
  <Tooltip>
556
556
  <TooltipTrigger asChild>
557
- <div className="text-xs text-muted-foreground mt-1 cursor-help">
557
+ <div className="text-xs text-gray-500 mt-1 cursor-help">
558
558
  {feature.name || feature.description}
559
559
  </div>
560
560
  </TooltipTrigger>
@@ -49,10 +49,10 @@ export default function SubscriptionConfirmModal({
49
49
  const formatFeatureValue = (value: any) => {
50
50
  // Handle string boolean values
51
51
  if (value === 'true' || value === true) {
52
- return <span className="text-green-500 font-semibold">✓</span>
52
+ return '✓'
53
53
  }
54
54
  if (value === 'false' || value === false) {
55
- return <span className="text-red-500 font-semibold">✗</span>
55
+ return '✗'
56
56
  }
57
57
  // Handle numeric values (both string and number)
58
58
  const numValue = typeof value === 'string' ? parseFloat(value) : value
@@ -129,9 +129,9 @@ export default function SubscriptionConfirmModal({
129
129
  <div className="space-y-4">
130
130
  <Card className="p-4">
131
131
  <h4 className="font-medium mb-2">{plan.name}</h4>
132
- <p className="text-3xl font-bold mb-2">
132
+ <p className="text-2xl font-bold mb-2">
133
133
  {isFree ? 'Free' : formatCurrency(parseFloat(price.unit_amount) * 100)}
134
- {!isFree && <span className="text-sm font-normal text-muted-foreground ml-1">/month</span>}
134
+ {!isFree && <span className="text-sm font-normal text-muted-foreground">/month</span>}
135
135
  </p>
136
136
  <ul className="space-y-1">
137
137
  {plan.features?.map((feature: any) => (
@@ -140,8 +140,8 @@ export default function SubscriptionConfirmModal({
140
140
  <TooltipProvider>
141
141
  <Tooltip>
142
142
  <TooltipTrigger asChild>
143
- <span className="cursor-help text-foreground">
144
- <span className="font-semibold">{formatFeatureValue(feature.value)}</span> <span className="text-sm text-muted-foreground font-normal">{feature.units}</span> - {feature.name || feature.description}
143
+ <span className="cursor-help">
144
+ {formatFeatureValue(feature.value)} <span className="text-sm text-muted-foreground font-normal">{feature.units}</span> - {feature.name || feature.description}
145
145
  </span>
146
146
  </TooltipTrigger>
147
147
  <TooltipContent>
@@ -1,91 +1,3 @@
1
- /* Essential component-specific styles only */
2
-
3
- /* Pricing text styles */
4
- span.omnikit-price-text {
5
- font-size: 2rem !important;
6
- line-height: 1 !important;
7
- font-weight: 700 !important;
8
- letter-spacing: -0.025em !important;
9
- display: inline-block !important;
10
- }
11
-
12
- .omnikit-price-units {
13
- font-size: 0.875rem;
14
- line-height: 1.25rem;
15
- color: #6b7280;
16
- font-weight: 400;
17
- margin-left: 0.25rem;
18
- }
19
-
20
- /* Feature value styles */
21
- div.omnikit-feature-value {
22
- font-size: 1rem !important;
23
- line-height: 1.5rem !important;
24
- font-weight: 600 !important;
25
- color: #111827 !important;
26
- display: block !important;
27
- }
28
-
29
- .omnikit-feature-units {
30
- font-size: 0.875rem;
31
- color: #6b7280;
32
- font-weight: 400;
33
- }
34
-
35
- .omnikit-feature-name {
36
- font-size: 0.75rem;
37
- line-height: 1rem;
38
- color: #6b7280;
39
- margin-top: 0.25rem;
40
- cursor: help;
41
- }
42
-
43
- /* Boolean feature icons */
44
- div.omnikit-feature-value span.omnikit-boolean-true {
45
- color: #22c55e !important;
46
- font-size: 1rem !important;
47
- }
48
-
49
- div.omnikit-feature-value span.omnikit-boolean-false {
50
- color: #ef4444 !important;
51
- font-size: 1rem !important;
52
- }
53
-
54
- /* Progress bar specific styles */
55
- .omnikit-progress-fill-red { background-color: #ef4444; }
56
- .omnikit-progress-fill-orange { background-color: #f97316; }
57
- .omnikit-progress-fill-yellow { background-color: #eab308; }
58
- .omnikit-progress-fill-green { background-color: #22c55e; }
59
-
60
- /* Usage status colors that might not be in standard Tailwind */
61
- .omnikit-usage-red { color: #dc2626; }
62
- .omnikit-usage-orange { color: #ea580c; }
63
- .omnikit-usage-yellow { color: #d97706; }
64
- .omnikit-usage-green { color: #16a34a; }
65
-
66
- /* Background colors for usage indicators */
67
- .omnikit-bg-red-100 { background-color: #fee2e2; }
68
- .omnikit-bg-orange-100 { background-color: #ffedd5; }
69
- .omnikit-bg-yellow-100 { background-color: #fef3c7; }
70
- .omnikit-bg-green-100 { background-color: #dcfce7; }
71
-
72
- /* Dark mode variants */
73
- @media (prefers-color-scheme: dark) {
74
- .omnikit-usage-red { color: #f87171; }
75
- .omnikit-usage-orange { color: #fb923c; }
76
- .omnikit-usage-yellow { color: #facc15; }
77
- .omnikit-usage-green { color: #4ade80; }
78
-
79
- .omnikit-bg-red-100 { background-color: #450a0a; }
80
- .omnikit-bg-orange-100 { background-color: #431407; }
81
- .omnikit-bg-yellow-100 { background-color: #451a03; }
82
- .omnikit-bg-green-100 { background-color: #14532d; }
83
-
84
- .omnikit-feature-value { color: #ffffff; }
85
- .omnikit-feature-units { color: #9ca3af; }
86
- .omnikit-feature-name { color: #9ca3af; }
87
- .omnikit-price-units { color: #9ca3af; }
88
-
89
- .omnikit-feature-value .omnikit-boolean-true { color: #4ade80; }
90
- .omnikit-feature-value .omnikit-boolean-false { color: #f87171; }
91
- }
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
@@ -0,0 +1,3 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
package/styles.css ADDED
@@ -0,0 +1,553 @@
1
+ /* @omnikit-js/ui Component Styles */
2
+ /* This file includes all Tailwind CSS classes used by the billing component */
3
+
4
+ /* Reset and base styles */
5
+ *, ::before, ::after {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ /* Color utilities */
10
+ .text-red-600 { color: #dc2626; }
11
+ .text-red-400 { color: #f87171; }
12
+ .text-orange-600 { color: #ea580c; }
13
+ .text-orange-400 { color: #fb923c; }
14
+ .text-yellow-600 { color: #d97706; }
15
+ .text-yellow-400 { color: #facc15; }
16
+ .text-green-600 { color: #16a34a; }
17
+ .text-green-400 { color: #4ade80; }
18
+ .text-gray-500 { color: #6b7280; }
19
+ .text-muted-foreground { color: #6b7280; }
20
+ .text-foreground { color: #111827; }
21
+ .text-primary { color: #3b82f6; }
22
+ .text-primary-foreground { color: #ffffff; }
23
+
24
+ /* Background colors */
25
+ .bg-red-100 { background-color: #fee2e2; }
26
+ .bg-red-950 { background-color: #450a0a; }
27
+ .bg-orange-100 { background-color: #ffedd5; }
28
+ .bg-orange-950 { background-color: #431407; }
29
+ .bg-yellow-100 { background-color: #fef3c7; }
30
+ .bg-yellow-950 { background-color: #451a03; }
31
+ .bg-green-100 { background-color: #dcfce7; }
32
+ .bg-green-950 { background-color: #14532d; }
33
+ .bg-primary { background-color: #3b82f6; }
34
+ .bg-popover { background-color: #ffffff; }
35
+ .bg-muted { background-color: #f9fafb; }
36
+ .bg-secondary { background-color: #f3f4f6; }
37
+ .bg-destructive { background-color: #ef4444; }
38
+
39
+ /* Border colors */
40
+ .border-primary { border-color: #3b82f6; }
41
+ .border-primary\/50 { border-color: rgba(59, 130, 246, 0.5); }
42
+ .border-muted { border-color: #e5e7eb; }
43
+ .border { border-width: 1px; }
44
+ .border-t { border-top-width: 1px; }
45
+
46
+ /* Text sizes */
47
+ .text-xs { font-size: 0.75rem; line-height: 1rem; }
48
+ .text-sm { font-size: 0.875rem; line-height: 1.25rem; }
49
+ .text-base { font-size: 1rem; line-height: 1.5rem; }
50
+ .text-lg { font-size: 1.125rem; line-height: 1.75rem; }
51
+ .text-xl { font-size: 1.25rem; line-height: 1.75rem; }
52
+ .text-2xl { font-size: 1.5rem; line-height: 2rem; }
53
+ .text-3xl { font-size: 1.875rem; line-height: 2.25rem; }
54
+ .text-5xl { font-size: 3rem; line-height: 1; }
55
+
56
+ /* Font weights */
57
+ .font-normal { font-weight: 400; }
58
+ .font-medium { font-weight: 500; }
59
+ .font-semibold { font-weight: 600; }
60
+ .font-bold { font-weight: 700; }
61
+
62
+ /* Spacing */
63
+ .p-1 { padding: 0.25rem; }
64
+ .p-3 { padding: 0.75rem; }
65
+ .p-4 { padding: 1rem; }
66
+ .p-6 { padding: 1.5rem; }
67
+ .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
68
+ .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
69
+ .pt-2 { padding-top: 0.5rem; }
70
+ .pt-3 { padding-top: 0.75rem; }
71
+ .pt-4 { padding-top: 1rem; }
72
+ .pb-4 { padding-bottom: 1rem; }
73
+ .pb-8 { padding-bottom: 2rem; }
74
+ .ml-1 { margin-left: 0.25rem; }
75
+ .ml-2 { margin-left: 0.5rem; }
76
+ .mr-2 { margin-right: 0.5rem; }
77
+ .mt-1 { margin-top: 0.25rem; }
78
+ .mt-2 { margin-top: 0.5rem; }
79
+ .mb-4 { margin-bottom: 1rem; }
80
+ .mb-8 { margin-bottom: 2rem; }
81
+
82
+ /* Layout */
83
+ .flex { display: flex; }
84
+ .inline-flex { display: inline-flex; }
85
+ .grid { display: grid; }
86
+ .hidden { display: none; }
87
+ .flex-col { flex-direction: column; }
88
+ .flex-1 { flex: 1 1 0%; }
89
+ .flex-shrink-0 { flex-shrink: 0; }
90
+ .items-start { align-items: flex-start; }
91
+ .items-center { align-items: center; }
92
+ .items-baseline { align-items: baseline; }
93
+ .justify-center { justify-content: center; }
94
+ .justify-between { justify-content: space-between; }
95
+ .justify-end { justify-content: flex-end; }
96
+
97
+ /* Grid */
98
+ .gap-4 { gap: 1rem; }
99
+ .gap-6 { gap: 1.5rem; }
100
+
101
+ /* Width and height */
102
+ .w-full { width: 100%; }
103
+ .h-4 { height: 1rem; }
104
+ .h-6 { height: 1.5rem; }
105
+ .h-full { height: 100%; }
106
+ .min-h-\[300px\] { min-height: 300px; }
107
+
108
+ /* Positioning */
109
+ .relative { position: relative; }
110
+ .absolute { position: absolute; }
111
+ .fixed { position: fixed; }
112
+ .top-0 { top: 0px; }
113
+ .right-0 { right: 0px; }
114
+ .left-1\/2 { left: 50%; }
115
+ .top-1\/2 { top: 50%; }
116
+ .inset { inset: 0px; }
117
+ .z-50 { z-index: 50; }
118
+ .z-51 { z-index: 51; }
119
+
120
+ /* Transforms */
121
+ .-translate-x-1\/2 { transform: translateX(-50%); }
122
+ .-translate-y-1\/2 { transform: translateY(-50%); }
123
+
124
+ /* Overflow */
125
+ .overflow-hidden { overflow: hidden; }
126
+
127
+ /* Border radius */
128
+ .rounded { border-radius: 0.25rem; }
129
+ .rounded-md { border-radius: 0.375rem; }
130
+ .rounded-lg { border-radius: 0.5rem; }
131
+ .rounded-bl-lg { border-bottom-left-radius: 0.5rem; }
132
+ .rounded-full { border-radius: 9999px; }
133
+
134
+ /* Box shadow */
135
+ .shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); }
136
+ .shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); }
137
+
138
+ /* Cursor */
139
+ .cursor-pointer { cursor: pointer; }
140
+ .cursor-help { cursor: help; }
141
+
142
+ /* Transitions */
143
+ .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
144
+ .animate-in { animation: enter 150ms ease-out; }
145
+ .animate-out { animation: exit 150ms ease-in; }
146
+ .animate-spin { animation: spin 1s linear infinite; }
147
+
148
+ /* Space between children */
149
+ .space-y-1 > :not([hidden]) ~ :not([hidden]) { margin-top: 0.25rem; }
150
+ .space-y-2 > :not([hidden]) ~ :not([hidden]) { margin-top: 0.5rem; }
151
+ .space-y-3 > :not([hidden]) ~ :not([hidden]) { margin-top: 0.75rem; }
152
+ .space-y-4 > :not([hidden]) ~ :not([hidden]) { margin-top: 1rem; }
153
+ .space-y-6 > :not([hidden]) ~ :not([hidden]) { margin-top: 1.5rem; }
154
+ .space-x-2 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.5rem; }
155
+
156
+ /* Responsive grid columns */
157
+ @media (min-width: 768px) {
158
+ .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
159
+ .md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
160
+ }
161
+
162
+ @media (min-width: 1024px) {
163
+ .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
164
+ }
165
+
166
+ @media (min-width: 1280px) {
167
+ .xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
168
+ }
169
+
170
+ /* Pseudo-class utilities */
171
+ .first\:border-t-0:first-child { border-top-width: 0px; }
172
+ .first\:pt-0:first-child { padding-top: 0px; }
173
+
174
+ /* Dark mode styles */
175
+ @media (prefers-color-scheme: dark) {
176
+ .dark\:text-red-400 { color: #f87171; }
177
+ .dark\:text-orange-400 { color: #fb923c; }
178
+ .dark\:text-yellow-400 { color: #facc15; }
179
+ .dark\:text-green-400 { color: #4ade80; }
180
+ .dark\:bg-red-950 { background-color: #450a0a; }
181
+ .dark\:bg-orange-950 { background-color: #431407; }
182
+ .dark\:bg-yellow-950 { background-color: #451a03; }
183
+ .dark\:bg-green-950 { background-color: #14532d; }
184
+ }
185
+
186
+ /* Custom keyframes */
187
+ @keyframes enter {
188
+ from { opacity: 0; transform: scale(0.95); }
189
+ to { opacity: 1; transform: scale(1); }
190
+ }
191
+
192
+ @keyframes exit {
193
+ from { opacity: 1; transform: scale(1); }
194
+ to { opacity: 0; transform: scale(0.95); }
195
+ }
196
+
197
+ @keyframes spin {
198
+ to { transform: rotate(360deg); }
199
+ }
200
+
201
+ /* Card styles */
202
+ .omnikit-card {
203
+ background: white;
204
+ border: 1px solid #e5e7eb;
205
+ border-radius: 0.5rem;
206
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
207
+ }
208
+
209
+ .omnikit-card-header {
210
+ padding: 1.5rem 1.5rem 0 1.5rem;
211
+ }
212
+
213
+ .omnikit-card-content {
214
+ padding: 1.5rem;
215
+ }
216
+
217
+ .omnikit-card-footer {
218
+ padding: 0 1.5rem 1.5rem 1.5rem;
219
+ }
220
+
221
+ /* Button styles */
222
+ .omnikit-button {
223
+ display: inline-flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ border-radius: 0.375rem;
227
+ font-size: 0.875rem;
228
+ font-weight: 500;
229
+ padding: 0.5rem 1rem;
230
+ border: 1px solid transparent;
231
+ cursor: pointer;
232
+ transition: all 0.2s;
233
+ }
234
+
235
+ .omnikit-button-primary {
236
+ background: #3b82f6;
237
+ color: white;
238
+ }
239
+
240
+ .omnikit-button-primary:hover {
241
+ background: #2563eb;
242
+ }
243
+
244
+ .omnikit-button-secondary {
245
+ background: #f3f4f6;
246
+ color: #374151;
247
+ }
248
+
249
+ .omnikit-button-secondary:hover {
250
+ background: #e5e7eb;
251
+ }
252
+
253
+ .omnikit-button-outline {
254
+ background: transparent;
255
+ border-color: #d1d5db;
256
+ color: #374151;
257
+ }
258
+
259
+ .omnikit-button-outline:hover {
260
+ background: #f9fafb;
261
+ }
262
+
263
+ .omnikit-button-destructive {
264
+ background: #ef4444;
265
+ color: white;
266
+ }
267
+
268
+ .omnikit-button-destructive:hover {
269
+ background: #dc2626;
270
+ }
271
+
272
+ /* Pricing card styles */
273
+ .omnikit-pricing-grid {
274
+ display: grid;
275
+ gap: 1rem;
276
+ grid-template-columns: 1fr;
277
+ }
278
+
279
+ @media (min-width: 768px) {
280
+ .omnikit-pricing-grid {
281
+ grid-template-columns: repeat(2, 1fr);
282
+ }
283
+ }
284
+
285
+ @media (min-width: 1024px) {
286
+ .omnikit-pricing-grid {
287
+ grid-template-columns: repeat(3, 1fr);
288
+ }
289
+ }
290
+
291
+ @media (min-width: 1280px) {
292
+ .omnikit-pricing-grid-4 {
293
+ grid-template-columns: repeat(4, 1fr);
294
+ }
295
+ }
296
+
297
+ .omnikit-pricing-card {
298
+ position: relative;
299
+ display: flex;
300
+ flex-direction: column;
301
+ height: 100%;
302
+ overflow: hidden;
303
+ }
304
+
305
+ .omnikit-pricing-card.current {
306
+ border-color: #3b82f6;
307
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
308
+ }
309
+
310
+ .omnikit-pricing-card.popular {
311
+ border-color: rgba(59, 130, 246, 0.5);
312
+ }
313
+
314
+ /* Feature styles */
315
+ .omnikit-feature-value {
316
+ font-size: 1.125rem;
317
+ font-weight: 600;
318
+ color: #111827;
319
+ }
320
+
321
+ .omnikit-feature-units {
322
+ font-size: 0.875rem;
323
+ color: #6b7280;
324
+ font-weight: 400;
325
+ }
326
+
327
+ .omnikit-feature-name {
328
+ font-size: 0.75rem;
329
+ color: #6b7280;
330
+ margin-top: 0.25rem;
331
+ cursor: help;
332
+ }
333
+
334
+ /* Badge styles */
335
+ .omnikit-badge {
336
+ display: inline-flex;
337
+ align-items: center;
338
+ border-radius: 9999px;
339
+ padding: 0.25rem 0.75rem;
340
+ font-size: 0.75rem;
341
+ font-weight: 500;
342
+ background: #f3f4f6;
343
+ color: #374151;
344
+ }
345
+
346
+ .omnikit-badge-secondary {
347
+ background: #f3f4f6;
348
+ color: #374151;
349
+ }
350
+
351
+ /* Progress bar styles */
352
+ .omnikit-progress {
353
+ width: 100%;
354
+ height: 0.5rem;
355
+ background: #f3f4f6;
356
+ border-radius: 9999px;
357
+ overflow: hidden;
358
+ }
359
+
360
+ .omnikit-progress-fill {
361
+ height: 100%;
362
+ background: #3b82f6;
363
+ transition: width 0.3s ease;
364
+ }
365
+
366
+ /* Modal/Dialog styles */
367
+ .omnikit-dialog-overlay {
368
+ position: fixed;
369
+ inset: 0;
370
+ background: rgba(0, 0, 0, 0.5);
371
+ z-index: 50;
372
+ }
373
+
374
+ .omnikit-dialog-content {
375
+ position: fixed;
376
+ left: 50%;
377
+ top: 50%;
378
+ transform: translate(-50%, -50%);
379
+ background: white;
380
+ border-radius: 0.5rem;
381
+ padding: 1.5rem;
382
+ max-width: 28rem;
383
+ width: 90vw;
384
+ z-index: 51;
385
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
386
+ }
387
+
388
+ /* Tabs styles */
389
+ .omnikit-tabs-list {
390
+ display: inline-flex;
391
+ align-items: center;
392
+ justify-content: center;
393
+ border-radius: 0.375rem;
394
+ background: #f3f4f6;
395
+ padding: 0.25rem;
396
+ }
397
+
398
+ .omnikit-tabs-trigger {
399
+ display: inline-flex;
400
+ align-items: center;
401
+ justify-content: center;
402
+ padding: 0.375rem 0.75rem;
403
+ font-size: 0.875rem;
404
+ font-weight: 500;
405
+ border-radius: 0.25rem;
406
+ cursor: pointer;
407
+ color: #6b7280;
408
+ transition: all 0.2s;
409
+ }
410
+
411
+ .omnikit-tabs-trigger[data-state="active"] {
412
+ background: white;
413
+ color: #111827;
414
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
415
+ }
416
+
417
+ /* Utility classes */
418
+ .omnikit-text-muted {
419
+ color: #6b7280;
420
+ }
421
+
422
+ .omnikit-text-foreground {
423
+ color: #111827;
424
+ }
425
+
426
+ .omnikit-text-primary {
427
+ color: #3b82f6;
428
+ }
429
+
430
+ .omnikit-flex {
431
+ display: flex;
432
+ }
433
+
434
+ .omnikit-flex-col {
435
+ flex-direction: column;
436
+ }
437
+
438
+ .omnikit-flex-1 {
439
+ flex: 1 1 0%;
440
+ }
441
+
442
+ .omnikit-items-center {
443
+ align-items: center;
444
+ }
445
+
446
+ .omnikit-justify-center {
447
+ justify-content: center;
448
+ }
449
+
450
+ .omnikit-justify-between {
451
+ justify-content: space-between;
452
+ }
453
+
454
+ .omnikit-space-y-2 > * + * {
455
+ margin-top: 0.5rem;
456
+ }
457
+
458
+ .omnikit-space-y-3 > * + * {
459
+ margin-top: 0.75rem;
460
+ }
461
+
462
+ .omnikit-space-y-4 > * + * {
463
+ margin-top: 1rem;
464
+ }
465
+
466
+ .omnikit-mt-1 {
467
+ margin-top: 0.25rem;
468
+ }
469
+
470
+ .omnikit-mt-2 {
471
+ margin-top: 0.5rem;
472
+ }
473
+
474
+ .omnikit-mb-4 {
475
+ margin-bottom: 1rem;
476
+ }
477
+
478
+ .omnikit-p-4 {
479
+ padding: 1rem;
480
+ }
481
+
482
+ .omnikit-pt-2 {
483
+ padding-top: 0.5rem;
484
+ }
485
+
486
+ .omnikit-pt-3 {
487
+ padding-top: 0.75rem;
488
+ }
489
+
490
+ .omnikit-w-full {
491
+ width: 100%;
492
+ }
493
+
494
+ .omnikit-h-6 {
495
+ height: 1.5rem;
496
+ }
497
+
498
+ .omnikit-min-h-300 {
499
+ min-height: 300px;
500
+ }
501
+
502
+ /* Dark mode support */
503
+ @media (prefers-color-scheme: dark) {
504
+ .omnikit-card {
505
+ background: #1f2937;
506
+ border-color: #374151;
507
+ color: white;
508
+ }
509
+
510
+ .omnikit-feature-value {
511
+ color: white;
512
+ }
513
+
514
+ .omnikit-text-foreground {
515
+ color: white;
516
+ }
517
+
518
+ .omnikit-button-secondary {
519
+ background: #374151;
520
+ color: #d1d5db;
521
+ }
522
+
523
+ .omnikit-button-secondary:hover {
524
+ background: #4b5563;
525
+ }
526
+
527
+ .omnikit-button-outline {
528
+ border-color: #4b5563;
529
+ color: #d1d5db;
530
+ }
531
+
532
+ .omnikit-button-outline:hover {
533
+ background: #374151;
534
+ }
535
+
536
+ .omnikit-dialog-content {
537
+ background: #1f2937;
538
+ color: white;
539
+ }
540
+
541
+ .omnikit-tabs-list {
542
+ background: #374151;
543
+ }
544
+
545
+ .omnikit-tabs-trigger {
546
+ color: #9ca3af;
547
+ }
548
+
549
+ .omnikit-tabs-trigger[data-state="active"] {
550
+ background: #1f2937;
551
+ color: white;
552
+ }
553
+ }