@kb-labs/studio-ui-kit 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +270 -0
- package/dist/index.css +169 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +2249 -0
- package/dist/index.js +2029 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# @kb-labs/studio-ui-kit
|
|
2
|
+
|
|
3
|
+
Professional React UI components using Ant Design and design tokens from `@kb-labs/studio-ui-core`.
|
|
4
|
+
|
|
5
|
+
## 🎯 Key Principles
|
|
6
|
+
|
|
7
|
+
- ✅ **NO hardcoded colors** - All colors from Ant Design tokens via `theme.useToken()`
|
|
8
|
+
- ✅ **NO inline styles** - All spacing/typography from design tokens
|
|
9
|
+
- ✅ **Type-safe** - Full TypeScript support
|
|
10
|
+
- ✅ **Composable** - Build complex components from primitives
|
|
11
|
+
|
|
12
|
+
## 📦 Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pnpm add @kb-labs/studio-ui-kit
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 🚀 Usage
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { UIText, UIBox, UIFlex, UIMetricCard, UIBadge } from '@kb-labs/studio-ui-kit';
|
|
22
|
+
|
|
23
|
+
function MyComponent() {
|
|
24
|
+
return (
|
|
25
|
+
<UIBox p={4}>
|
|
26
|
+
<UIText size="2xl" weight="bold">Hello World</UIText>
|
|
27
|
+
|
|
28
|
+
<UIFlex gap={2} align="center">
|
|
29
|
+
<UIBadge variant="success">Active</UIBadge>
|
|
30
|
+
<UIText size="sm" color="secondary">User is online</UIText>
|
|
31
|
+
</UIFlex>
|
|
32
|
+
|
|
33
|
+
<UIMetricCard
|
|
34
|
+
label="Active Users"
|
|
35
|
+
value={1234}
|
|
36
|
+
trend="up"
|
|
37
|
+
delta={15.3}
|
|
38
|
+
unit="users"
|
|
39
|
+
/>
|
|
40
|
+
</UIBox>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
<!-- AUTO-GENERATED:START -->
|
|
46
|
+
|
|
47
|
+
## 📊 Component Stats
|
|
48
|
+
|
|
49
|
+
- **Total Components:** 51
|
|
50
|
+
- **With Tests:** 4/51 (8%)
|
|
51
|
+
|
|
52
|
+
**By Category:**
|
|
53
|
+
|
|
54
|
+
- Primitives: 4
|
|
55
|
+
- Core: 8
|
|
56
|
+
- Layout: 4
|
|
57
|
+
- Form: 10
|
|
58
|
+
- Navigation: 7
|
|
59
|
+
- Composite: 4
|
|
60
|
+
- Feedback: 6
|
|
61
|
+
- Overlay: 5
|
|
62
|
+
- Content: 3
|
|
63
|
+
|
|
64
|
+
## 📚 Component Reference
|
|
65
|
+
|
|
66
|
+
### Primitives
|
|
67
|
+
|
|
68
|
+
Foundation components for layout and typography
|
|
69
|
+
|
|
70
|
+
| Component | Description | Tests |
|
|
71
|
+
|-----------|-------------|-------|
|
|
72
|
+
| **UIBox** | Box component - Layout primitive with spacing tokens | ❌ |
|
|
73
|
+
| **UIFlex** | Flex component - Flexbox layout primitive | ❌ |
|
|
74
|
+
| **UIText** | Text component - Typography primitive with design tokens | ✅ |
|
|
75
|
+
| **UITypography** | UITypography components - Rich text display | ❌ |
|
|
76
|
+
|
|
77
|
+
### Core
|
|
78
|
+
|
|
79
|
+
Essential UI components
|
|
80
|
+
|
|
81
|
+
| Component | Description | Tests |
|
|
82
|
+
|-----------|-------------|-------|
|
|
83
|
+
| **UIAvatar** | UIAvatar component - User avatar | ❌ |
|
|
84
|
+
| **UIBadge** | Badge component - Status indicator with semantic colors | ❌ |
|
|
85
|
+
| **UIButton** | UIButton component - Action button with semantic variants | ✅ |
|
|
86
|
+
| **UICard** | UICard component - Card container with header/footer | ❌ |
|
|
87
|
+
| **UIIcon** | UIIcon component - Icon wrapper with proper theming | ❌ |
|
|
88
|
+
| **UIShimmerText** | UIShimmerText - Animated gradient shimmer on text | ❌ |
|
|
89
|
+
| **UITag** | UITag component - Label/category tag with semantic colors | ❌ |
|
|
90
|
+
| **UITitle** | UITitle component - Page/section titles with hierarchy | ❌ |
|
|
91
|
+
|
|
92
|
+
### Layout
|
|
93
|
+
|
|
94
|
+
Layout and container components
|
|
95
|
+
|
|
96
|
+
| Component | Description | Tests |
|
|
97
|
+
|-----------|-------------|-------|
|
|
98
|
+
| **UIDivider** | UIDivider component - Visual separator | ❌ |
|
|
99
|
+
| **UIGrid** | UIRow / UICol components - Grid layout | ❌ |
|
|
100
|
+
| **UISpace** | UISpace component - Spacing container | ❌ |
|
|
101
|
+
| **UIStack** | UIStack component - Vertical/horizontal spacing layout | ❌ |
|
|
102
|
+
|
|
103
|
+
### Form
|
|
104
|
+
|
|
105
|
+
Form controls and inputs
|
|
106
|
+
|
|
107
|
+
| Component | Description | Tests |
|
|
108
|
+
|-----------|-------------|-------|
|
|
109
|
+
| **UICheckbox** | UICheckbox component - Checkbox input | ❌ |
|
|
110
|
+
| **UIDatePicker** | UIDatePicker component - Date/time picker | ❌ |
|
|
111
|
+
| **UIForm** | UIForm component - Form wrapper with validation | ❌ |
|
|
112
|
+
| **UIInput** | UIInput component - Text input with variants | ✅ |
|
|
113
|
+
| **UIInputNumber** | UIInputNumber component - Numeric input | ❌ |
|
|
114
|
+
| **UIRadio** | UIRadio component - Radio button | ❌ |
|
|
115
|
+
| **UISelect** | UISelect component - Dropdown select with icon support | ❌ |
|
|
116
|
+
| **UISlider** | UISlider component - Slider input | ❌ |
|
|
117
|
+
| **UISwitch** | UISwitch component - Toggle switch | ❌ |
|
|
118
|
+
| **UIUpload** | UIUpload component - File upload | ❌ |
|
|
119
|
+
|
|
120
|
+
### Navigation
|
|
121
|
+
|
|
122
|
+
Navigation and menu components
|
|
123
|
+
|
|
124
|
+
| Component | Description | Tests |
|
|
125
|
+
|-----------|-------------|-------|
|
|
126
|
+
| **UIAccordion** | UIAccordion component - Collapsible panels | ❌ |
|
|
127
|
+
| **UIBreadcrumb** | UIBreadcrumb component - Navigation breadcrumb trail | ❌ |
|
|
128
|
+
| **UIDropdown** | UIDropdown component - Dropdown menu | ❌ |
|
|
129
|
+
| **UIMenu** | UIMenu component - Navigation menu | ❌ |
|
|
130
|
+
| **UISegmented** | UISegmented component - Segmented control | ❌ |
|
|
131
|
+
| **UISteps** | UISteps component - Step indicator | ❌ |
|
|
132
|
+
| **UITabs** | UITabs component - Tabbed navigation | ❌ |
|
|
133
|
+
|
|
134
|
+
### Composite
|
|
135
|
+
|
|
136
|
+
Complex composed components
|
|
137
|
+
|
|
138
|
+
| Component | Description | Tests |
|
|
139
|
+
|-----------|-------------|-------|
|
|
140
|
+
| **UIHeader** | UIHeader component - Page header with title, subtitle, and breadcrumbs | ✅ |
|
|
141
|
+
| **UIPage** | UIPage component - Page container with padding and max-width | ❌ |
|
|
142
|
+
| **UIPageHeader** | UIPageHeader component - Standard page header | ❌ |
|
|
143
|
+
| **UIPageSection** | UIPageSection component - Section within a page | ❌ |
|
|
144
|
+
|
|
145
|
+
### Feedback
|
|
146
|
+
|
|
147
|
+
Feedback and notification components
|
|
148
|
+
|
|
149
|
+
| Component | Description | Tests |
|
|
150
|
+
|-----------|-------------|-------|
|
|
151
|
+
| **UIAlert** | UIAlert component - Alert messages and notifications | ❌ |
|
|
152
|
+
| **UIEmptyState** | UIEmptyState component - Empty state placeholder | ❌ |
|
|
153
|
+
| **UIErrorState** | UIErrorState component - Error state display | ❌ |
|
|
154
|
+
| **UIResult** | UIResult component - Result page | ❌ |
|
|
155
|
+
| **UISkeleton** | UISkeleton component - Loading skeleton | ❌ |
|
|
156
|
+
| **UISpin** | UISpin component - Loading spinner | ❌ |
|
|
157
|
+
|
|
158
|
+
### Overlay
|
|
159
|
+
|
|
160
|
+
Modal and overlay components
|
|
161
|
+
|
|
162
|
+
| Component | Description | Tests |
|
|
163
|
+
|-----------|-------------|-------|
|
|
164
|
+
| **UIDrawer** | UIDrawer component - Side panel overlay | ❌ |
|
|
165
|
+
| **UIModal** | UIModal component - Modal dialog | ❌ |
|
|
166
|
+
| **UIPopconfirm** | UIPopconfirm component - Confirmation popover | ❌ |
|
|
167
|
+
| **UIPopover** | UIPopover component - Popover overlay | ❌ |
|
|
168
|
+
| **UITooltip** | UITooltip component - Tooltip overlay | ❌ |
|
|
169
|
+
|
|
170
|
+
### Content
|
|
171
|
+
|
|
172
|
+
Content display components
|
|
173
|
+
|
|
174
|
+
| Component | Description | Tests |
|
|
175
|
+
|-----------|-------------|-------|
|
|
176
|
+
| **UIDiffViewer** | UIDiffViewer | ❌ |
|
|
177
|
+
| **UIJsonViewer** | UIJsonViewer component - JSON content viewer | ❌ |
|
|
178
|
+
| **UIMarkdownViewer** | UIMarkdownViewer component - Markdown content viewer | ❌ |
|
|
179
|
+
|
|
180
|
+
<!-- AUTO-GENERATED:END -->
|
|
181
|
+
|
|
182
|
+
## 🎨 Design Tokens
|
|
183
|
+
|
|
184
|
+
All components use design tokens from `@kb-labs/studio-ui-core`:
|
|
185
|
+
|
|
186
|
+
### Typography
|
|
187
|
+
```tsx
|
|
188
|
+
<UIText size="xs">Extra small text</UIText>
|
|
189
|
+
<UIText size="sm">Small text</UIText>
|
|
190
|
+
<UIText size="base">Base text</UIText>
|
|
191
|
+
<UIText size="lg">Large text</UIText>
|
|
192
|
+
<UIText size="xl">Extra large text</UIText>
|
|
193
|
+
<UIText size="2xl">2X large text</UIText>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Colors
|
|
197
|
+
```tsx
|
|
198
|
+
<UIText color="primary">Primary text</UIText>
|
|
199
|
+
<UIText color="secondary">Secondary text</UIText>
|
|
200
|
+
<UIText color="success">Success text</UIText>
|
|
201
|
+
<UIText color="warning">Warning text</UIText>
|
|
202
|
+
<UIText color="error">Error text</UIText>
|
|
203
|
+
<UIText color="info">Info text</UIText>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Spacing
|
|
207
|
+
```tsx
|
|
208
|
+
<UIBox p={2}>Padding 0.5rem</UIBox>
|
|
209
|
+
<UIBox p={4}>Padding 1rem</UIBox>
|
|
210
|
+
<UIBox p={6}>Padding 1.5rem</UIBox>
|
|
211
|
+
<UIBox m={2}>Margin 0.5rem</UIBox>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## 🏗️ Component Hierarchy
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
Primitives (Tier 1)
|
|
218
|
+
├── UIText - Typography
|
|
219
|
+
├── UIBox - Spacing
|
|
220
|
+
└── UIFlex - Layout
|
|
221
|
+
|
|
222
|
+
Components (Tier 2)
|
|
223
|
+
├── UIBadge - Status indicators
|
|
224
|
+
└── UIMetricCard - Metric displays
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## 📖 Examples
|
|
228
|
+
|
|
229
|
+
### Metric Display
|
|
230
|
+
```tsx
|
|
231
|
+
<UIMetricCard
|
|
232
|
+
label="Revenue"
|
|
233
|
+
value={45230}
|
|
234
|
+
unit="USD"
|
|
235
|
+
trend="up"
|
|
236
|
+
delta={12.5}
|
|
237
|
+
showDelta={true}
|
|
238
|
+
size="default"
|
|
239
|
+
/>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Badge Variants
|
|
243
|
+
```tsx
|
|
244
|
+
<UIBadge variant="success">Success</UIBadge>
|
|
245
|
+
<UIBadge variant="warning">Warning</UIBadge>
|
|
246
|
+
<UIBadge variant="error">Error</UIBadge>
|
|
247
|
+
<UIBadge variant="info">Info</UIBadge>
|
|
248
|
+
<UIBadge variant="default">Default</UIBadge>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Layout Composition
|
|
252
|
+
```tsx
|
|
253
|
+
<UIBox p={4} mb={3}>
|
|
254
|
+
<UIFlex direction="column" gap={2}>
|
|
255
|
+
<UIText size="lg" weight="bold">Header</UIText>
|
|
256
|
+
<UIText size="sm" color="secondary">Description</UIText>
|
|
257
|
+
</UIFlex>
|
|
258
|
+
</UIBox>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## 🔗 Dependencies
|
|
262
|
+
|
|
263
|
+
- `react` (peer) - ^18.3.1
|
|
264
|
+
- `react-dom` (peer) - ^18.3.1
|
|
265
|
+
- `antd` (peer) - ^5.22.5
|
|
266
|
+
- `@kb-labs/studio-ui-core` - Design tokens
|
|
267
|
+
|
|
268
|
+
## 📝 License
|
|
269
|
+
|
|
270
|
+
Private - KB Labs
|
package/dist/index.css
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/* src/core/UIButton.module.css */
|
|
2
|
+
.uiButton {
|
|
3
|
+
}
|
|
4
|
+
.uiButton svg {
|
|
5
|
+
color: inherit !important;
|
|
6
|
+
stroke: currentColor !important;
|
|
7
|
+
fill: currentColor !important;
|
|
8
|
+
}
|
|
9
|
+
.uiButton:disabled svg,
|
|
10
|
+
.uiButton.ant-btn-disabled svg {
|
|
11
|
+
opacity: 0.4;
|
|
12
|
+
}
|
|
13
|
+
.uiButton.ant-btn-sm svg {
|
|
14
|
+
width: 14px;
|
|
15
|
+
height: 14px;
|
|
16
|
+
}
|
|
17
|
+
.uiButton svg {
|
|
18
|
+
width: 16px;
|
|
19
|
+
height: 16px;
|
|
20
|
+
}
|
|
21
|
+
.uiButton.ant-btn-lg svg {
|
|
22
|
+
width: 18px;
|
|
23
|
+
height: 18px;
|
|
24
|
+
}
|
|
25
|
+
.uiButton .ant-btn-icon {
|
|
26
|
+
color: inherit !important;
|
|
27
|
+
display: inline-flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
justify-content: center;
|
|
30
|
+
}
|
|
31
|
+
.uiButton .ant-btn-icon svg {
|
|
32
|
+
vertical-align: middle;
|
|
33
|
+
display: block;
|
|
34
|
+
}
|
|
35
|
+
.uiButton.ant-btn-primary {
|
|
36
|
+
transition: transform 150ms ease, box-shadow 150ms ease;
|
|
37
|
+
}
|
|
38
|
+
.uiButton.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled) {
|
|
39
|
+
transform: translateY(-1px);
|
|
40
|
+
box-shadow: 0 4px 12px rgba(12, 102, 255, 0.3);
|
|
41
|
+
}
|
|
42
|
+
.uiButton.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled) {
|
|
43
|
+
transform: translateY(0);
|
|
44
|
+
}
|
|
45
|
+
[dir=rtl] .uiButton .ant-btn-icon {
|
|
46
|
+
transform: scaleX(-1);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* src/core/UIIcon.module.css */
|
|
50
|
+
.uiIcon {
|
|
51
|
+
display: inline-flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
vertical-align: middle;
|
|
55
|
+
}
|
|
56
|
+
.uiIcon svg {
|
|
57
|
+
color: currentColor;
|
|
58
|
+
stroke: currentColor;
|
|
59
|
+
fill: none;
|
|
60
|
+
display: block;
|
|
61
|
+
}
|
|
62
|
+
.uiIcon .anticon {
|
|
63
|
+
color: currentColor;
|
|
64
|
+
}
|
|
65
|
+
.uiIcon.clickable {
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
transition: opacity 0.2s ease, transform 0.1s ease;
|
|
68
|
+
}
|
|
69
|
+
.uiIcon.clickable:hover {
|
|
70
|
+
opacity: 0.8;
|
|
71
|
+
}
|
|
72
|
+
.uiIcon.clickable:active {
|
|
73
|
+
transform: scale(0.95);
|
|
74
|
+
}
|
|
75
|
+
.uiIcon.size-xs {
|
|
76
|
+
font-size: 12px;
|
|
77
|
+
width: 12px;
|
|
78
|
+
height: 12px;
|
|
79
|
+
}
|
|
80
|
+
.uiIcon.size-sm {
|
|
81
|
+
font-size: 14px;
|
|
82
|
+
width: 14px;
|
|
83
|
+
height: 14px;
|
|
84
|
+
}
|
|
85
|
+
.uiIcon.size-base {
|
|
86
|
+
font-size: 16px;
|
|
87
|
+
width: 16px;
|
|
88
|
+
height: 16px;
|
|
89
|
+
}
|
|
90
|
+
.uiIcon.size-lg {
|
|
91
|
+
font-size: 20px;
|
|
92
|
+
width: 20px;
|
|
93
|
+
height: 20px;
|
|
94
|
+
}
|
|
95
|
+
.uiIcon.size-xl {
|
|
96
|
+
font-size: 24px;
|
|
97
|
+
width: 24px;
|
|
98
|
+
height: 24px;
|
|
99
|
+
}
|
|
100
|
+
.uiIcon.size-2xl {
|
|
101
|
+
font-size: 32px;
|
|
102
|
+
width: 32px;
|
|
103
|
+
height: 32px;
|
|
104
|
+
}
|
|
105
|
+
.uiIcon.color-primary {
|
|
106
|
+
color: var(--link, #2563EB);
|
|
107
|
+
}
|
|
108
|
+
.uiIcon.color-secondary {
|
|
109
|
+
color: var(--text-secondary, #6B7280);
|
|
110
|
+
}
|
|
111
|
+
.uiIcon.color-success {
|
|
112
|
+
color: var(--success, #16A34A);
|
|
113
|
+
}
|
|
114
|
+
.uiIcon.color-warning {
|
|
115
|
+
color: var(--warning, #F59E0B);
|
|
116
|
+
}
|
|
117
|
+
.uiIcon.color-error {
|
|
118
|
+
color: var(--error, #DC2626);
|
|
119
|
+
}
|
|
120
|
+
.uiIcon.color-info {
|
|
121
|
+
color: var(--info, #0EA5E9);
|
|
122
|
+
}
|
|
123
|
+
.uiIcon.color-inherit {
|
|
124
|
+
color: inherit;
|
|
125
|
+
}
|
|
126
|
+
.uiIcon.spin {
|
|
127
|
+
animation: uiIconSpin 1s linear infinite;
|
|
128
|
+
}
|
|
129
|
+
@keyframes uiIconSpin {
|
|
130
|
+
from {
|
|
131
|
+
transform: rotate(0deg);
|
|
132
|
+
}
|
|
133
|
+
to {
|
|
134
|
+
transform: rotate(360deg);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
.uiIcon.disabled {
|
|
138
|
+
opacity: 0.4;
|
|
139
|
+
cursor: not-allowed;
|
|
140
|
+
pointer-events: none;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* src/core/UIShimmerText.module.css */
|
|
144
|
+
.shimmer {
|
|
145
|
+
background:
|
|
146
|
+
linear-gradient(
|
|
147
|
+
90deg,
|
|
148
|
+
var(--shimmer-color-1, #888) 0%,
|
|
149
|
+
var(--shimmer-color-2, #888) 25%,
|
|
150
|
+
var(--shimmer-highlight, #fff) 50%,
|
|
151
|
+
var(--shimmer-color-2, #888) 75%,
|
|
152
|
+
var(--shimmer-color-1, #888) 100%);
|
|
153
|
+
background-size: 200% 100%;
|
|
154
|
+
-webkit-background-clip: text;
|
|
155
|
+
background-clip: text;
|
|
156
|
+
-webkit-text-fill-color: transparent;
|
|
157
|
+
color: transparent;
|
|
158
|
+
animation: shimmerMove var(--shimmer-duration, 2s) linear infinite;
|
|
159
|
+
display: inline-block;
|
|
160
|
+
}
|
|
161
|
+
@keyframes shimmerMove {
|
|
162
|
+
0% {
|
|
163
|
+
background-position: 100% 0;
|
|
164
|
+
}
|
|
165
|
+
100% {
|
|
166
|
+
background-position: -100% 0;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/*# sourceMappingURL=index.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/UIButton.module.css","../src/core/UIIcon.module.css","../src/core/UIShimmerText.module.css"],"sourcesContent":["/**\n * UIButton styles - Proper SVG icon theming\n *\n * This ensures all SVG icons (lucide-react, etc.) inherit colors from CSS variables\n * and work correctly in both light and dark themes.\n */\n\n.uiButton {\n /* Button inherits theme colors from Ant Design tokens */\n}\n\n/*\n * CRITICAL: SVG icon color inheritance\n *\n * Force all SVG icons to inherit button text color automatically\n * Works for lucide-react, heroicons, and any other icon libraries\n */\n.uiButton svg {\n color: inherit !important;\n stroke: currentColor !important;\n fill: currentColor !important;\n}\n\n/*\n * Disabled state - reduce opacity\n */\n.uiButton:disabled svg,\n.uiButton.ant-btn-disabled svg {\n opacity: 0.4;\n}\n\n/*\n * Size variants - ensure SVG scales properly\n */\n.uiButton.ant-btn-sm svg {\n /* Small button icons */\n width: 14px;\n height: 14px;\n}\n\n.uiButton svg {\n /* Default (middle) button icons */\n width: 16px;\n height: 16px;\n}\n\n.uiButton.ant-btn-lg svg {\n /* Large button icons */\n width: 18px;\n height: 18px;\n}\n\n/*\n * Icon positioning within button\n * Ensures proper spacing between icon and text\n */\n.uiButton .ant-btn-icon {\n /* Icon wrapper - CRITICAL: must inherit color for SVG to get correct color */\n color: inherit !important;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.uiButton .ant-btn-icon svg {\n /* SVG inside icon wrapper */\n vertical-align: middle;\n display: block; /* Remove inline spacing */\n}\n\n/*\n * Primary button — subtle lift effect\n */\n.uiButton.ant-btn-primary {\n transition: transform 150ms ease, box-shadow 150ms ease;\n}\n\n.uiButton.ant-btn-primary:hover:not(:disabled):not(.ant-btn-disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(12, 102, 255, 0.3);\n}\n\n.uiButton.ant-btn-primary:active:not(:disabled):not(.ant-btn-disabled) {\n transform: translateY(0);\n}\n\n/*\n * RTL (Right-to-Left) support\n */\n[dir='rtl'] .uiButton .ant-btn-icon {\n /* Mirror icon position in RTL */\n transform: scaleX(-1);\n}\n","/**\n * UIIcon styles - Proper SVG and icon font theming\n *\n * Ensures all icons (Ant Design icons, lucide-react, custom SVG)\n * inherit colors from CSS variables and work in both light and dark themes.\n */\n\n.uiIcon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n}\n\n/*\n * SVG icons (lucide-react, custom SVG)\n * Use currentColor to inherit from parent color\n */\n.uiIcon svg {\n color: currentColor;\n stroke: currentColor;\n fill: none; /* Most icon libraries use stroke, not fill */\n display: block; /* Remove inline spacing */\n}\n\n/*\n * Ant Design icons (icon fonts)\n * Already use currentColor by default, but ensure it's explicit\n */\n.uiIcon .anticon {\n color: currentColor;\n}\n\n/*\n * Clickable icons (icon buttons)\n */\n.uiIcon.clickable {\n cursor: pointer;\n transition: opacity 0.2s ease, transform 0.1s ease;\n}\n\n.uiIcon.clickable:hover {\n opacity: 0.8;\n}\n\n.uiIcon.clickable:active {\n transform: scale(0.95);\n}\n\n/*\n * Size variants\n */\n.uiIcon.size-xs {\n font-size: 12px;\n width: 12px;\n height: 12px;\n}\n\n.uiIcon.size-sm {\n font-size: 14px;\n width: 14px;\n height: 14px;\n}\n\n.uiIcon.size-base {\n font-size: 16px;\n width: 16px;\n height: 16px;\n}\n\n.uiIcon.size-lg {\n font-size: 20px;\n width: 20px;\n height: 20px;\n}\n\n.uiIcon.size-xl {\n font-size: 24px;\n width: 24px;\n height: 24px;\n}\n\n.uiIcon.size-2xl {\n font-size: 32px;\n width: 32px;\n height: 32px;\n}\n\n/*\n * Color variants using CSS variables\n */\n.uiIcon.color-primary {\n color: var(--link, #2563EB);\n}\n\n.uiIcon.color-secondary {\n color: var(--text-secondary, #6B7280);\n}\n\n.uiIcon.color-success {\n color: var(--success, #16A34A);\n}\n\n.uiIcon.color-warning {\n color: var(--warning, #F59E0B);\n}\n\n.uiIcon.color-error {\n color: var(--error, #DC2626);\n}\n\n.uiIcon.color-info {\n color: var(--info, #0EA5E9);\n}\n\n.uiIcon.color-inherit {\n color: inherit;\n}\n\n/*\n * Spin animation\n */\n.uiIcon.spin {\n animation: uiIconSpin 1s linear infinite;\n}\n\n@keyframes uiIconSpin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/*\n * Disabled state\n */\n.uiIcon.disabled {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n}\n","/**\n * UIShimmerText - Animated gradient shimmer on text\n * Classic \"Cursor / ClickUp\" loading text effect.\n */\n\n.shimmer {\n background: linear-gradient(\n 90deg,\n var(--shimmer-color-1, #888) 0%,\n var(--shimmer-color-2, #888) 25%,\n var(--shimmer-highlight, #fff) 50%,\n var(--shimmer-color-2, #888) 75%,\n var(--shimmer-color-1, #888) 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n color: transparent;\n animation: shimmerMove var(--shimmer-duration, 2s) linear infinite;\n display: inline-block;\n}\n\n@keyframes shimmerMove {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n}\n"],"mappings":"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","names":[]}
|