fiboui 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 +101 -0
- package/dist/content/Alert/index.d.ts +878 -0
- package/dist/content/Avatar/index.d.ts +886 -0
- package/dist/content/Badge/index.d.ts +887 -0
- package/dist/content/Image/index.d.ts +893 -0
- package/dist/content/Label/index.d.ts +879 -0
- package/dist/content/Progress/index.d.ts +898 -0
- package/dist/content/Skeleton/index.d.ts +879 -0
- package/dist/content/Spinner/index.d.ts +880 -0
- package/dist/content/Text/index.d.ts +878 -0
- package/dist/content/index.d.ts +9 -0
- package/dist/core/StateWrapper.d.ts +28 -0
- package/dist/core/builder.d.ts +50 -0
- package/dist/core/component.d.ts +7 -0
- package/dist/core/effects.d.ts +3 -0
- package/dist/core/icons.d.ts +11 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/state.d.ts +37 -0
- package/dist/core/types.d.ts +51 -0
- package/dist/demo.d.ts +7 -0
- package/dist/effects-Co9C_Dyx.mjs +9 -0
- package/dist/examples/ScaffoldExamples.d.ts +3 -0
- package/dist/examples/StateExamples.d.ts +5 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.esm.js +4622 -0
- package/dist/index.umd.js +251 -0
- package/dist/interactive/Button/index.d.ts +897 -0
- package/dist/interactive/Checkbox/index.d.ts +884 -0
- package/dist/interactive/Combobox/index.d.ts +898 -0
- package/dist/interactive/RadioGroup/index.d.ts +888 -0
- package/dist/interactive/Select/index.d.ts +895 -0
- package/dist/interactive/Switch/index.d.ts +881 -0
- package/dist/interactive/TextField/index.d.ts +892 -0
- package/dist/interactive/Textarea/index.d.ts +890 -0
- package/dist/interactive/index.d.ts +8 -0
- package/dist/layout/Center/index.d.ts +869 -0
- package/dist/layout/Column/index.d.ts +881 -0
- package/dist/layout/Container/index.d.ts +870 -0
- package/dist/layout/DashboardLayout/index.d.ts +870 -0
- package/dist/layout/Header/index.d.ts +870 -0
- package/dist/layout/Line/index.d.ts +872 -0
- package/dist/layout/Row/index.d.ts +879 -0
- package/dist/layout/Scaffold/index.d.ts +878 -0
- package/dist/layout/ScrollView/index.d.ts +879 -0
- package/dist/layout/Sidebar/index.d.ts +870 -0
- package/dist/layout/Spacer/index.d.ts +875 -0
- package/dist/layout/StakentComponents.d.ts +4 -0
- package/dist/layout/index.d.ts +11 -0
- package/dist/structure/Banner/index.d.ts +879 -0
- package/dist/structure/Box/index.d.ts +869 -0
- package/dist/structure/Card/index.d.ts +881 -0
- package/dist/structure/Collapse/index.d.ts +884 -0
- package/dist/structure/Grid/index.d.ts +1757 -0
- package/dist/structure/List/index.d.ts +888 -0
- package/dist/structure/Table/index.d.ts +895 -0
- package/dist/structure/Tags/index.d.ts +876 -0
- package/dist/structure/cards/AssetCard/index.d.ts +884 -0
- package/dist/structure/cards/CollectionCard/index.d.ts +880 -0
- package/dist/structure/cards/ContentCard/index.d.ts +884 -0
- package/dist/structure/cards/ProfileCard/index.d.ts +892 -0
- package/dist/structure/cards/index.d.ts +5 -0
- package/dist/structure/cards/variants/index.d.ts +3490 -0
- package/dist/structure/index.d.ts +9 -0
- package/dist/style.css +1 -0
- package/dist/theme/cupertino.d.ts +3 -0
- package/dist/theme/index.d.ts +5 -0
- package/dist/theme/material.d.ts +3 -0
- package/dist/theme/provider.d.ts +16 -0
- package/dist/theme/types.d.ts +57 -0
- package/dist/theme/web.d.ts +3 -0
- package/package.json +54 -0
- package/src/content/Alert/index.ts +110 -0
- package/src/content/Avatar/index.ts +116 -0
- package/src/content/Badge/index.ts +162 -0
- package/src/content/Image/index.ts +137 -0
- package/src/content/Label/index.ts +66 -0
- package/src/content/Progress/index.ts +378 -0
- package/src/content/Skeleton/index.ts +71 -0
- package/src/content/Spinner/index.ts +139 -0
- package/src/content/Text/index.ts +74 -0
- package/src/content/index.ts +9 -0
- package/src/core/StateWrapper.tsx +105 -0
- package/src/core/builder.ts +259 -0
- package/src/core/component.ts +49 -0
- package/src/core/effects.ts +27 -0
- package/src/core/icons.tsx +57 -0
- package/src/core/index.ts +5 -0
- package/src/core/state.ts +233 -0
- package/src/core/types.ts +62 -0
- package/src/demo.tsx +1045 -0
- package/src/examples/ScaffoldExamples.tsx +299 -0
- package/src/examples/StateExamples.tsx +149 -0
- package/src/index.ts +8 -0
- package/src/interactive/Button/index.ts +218 -0
- package/src/interactive/Checkbox/index.ts +145 -0
- package/src/interactive/Combobox/index.ts +278 -0
- package/src/interactive/RadioGroup/index.ts +124 -0
- package/src/interactive/Select/index.ts +227 -0
- package/src/interactive/Switch/index.ts +123 -0
- package/src/interactive/TextField/index.ts +200 -0
- package/src/interactive/Textarea/index.ts +129 -0
- package/src/interactive/index.ts +8 -0
- package/src/layout/Center/index.ts +34 -0
- package/src/layout/Column/index.ts +101 -0
- package/src/layout/Container/index.ts +28 -0
- package/src/layout/DashboardLayout/index.ts +106 -0
- package/src/layout/Header/index.ts +50 -0
- package/src/layout/Line/index.ts +41 -0
- package/src/layout/Row/index.ts +93 -0
- package/src/layout/Scaffold/index.ts +133 -0
- package/src/layout/ScrollView/index.ts +67 -0
- package/src/layout/Sidebar/index.ts +56 -0
- package/src/layout/Spacer/index.ts +46 -0
- package/src/layout/StakentComponents.tsx +57 -0
- package/src/layout/index.ts +11 -0
- package/src/structure/Banner/index.ts +92 -0
- package/src/structure/Box/index.ts +45 -0
- package/src/structure/Card/index.ts +113 -0
- package/src/structure/Collapse/index.ts +122 -0
- package/src/structure/Grid/index.ts +197 -0
- package/src/structure/List/index.ts +185 -0
- package/src/structure/Table/index.ts +165 -0
- package/src/structure/Tags/index.ts +69 -0
- package/src/structure/cards/AssetCard/index.ts +158 -0
- package/src/structure/cards/CollectionCard/index.ts +95 -0
- package/src/structure/cards/ContentCard/index.ts +127 -0
- package/src/structure/cards/ProfileCard/index.ts +152 -0
- package/src/structure/cards/index.ts +5 -0
- package/src/structure/cards/variants/index.ts +301 -0
- package/src/structure/index.ts +10 -0
- package/src/styles/base.css +186 -0
- package/src/styles/core.css +52 -0
- package/src/styles/themes/cupertino.css +197 -0
- package/src/styles/themes/material.css +322 -0
- package/src/styles/themes/web.css +196 -0
- package/src/theme/cupertino.ts +85 -0
- package/src/theme/index.ts +5 -0
- package/src/theme/material.ts +86 -0
- package/src/theme/provider.tsx +76 -0
- package/src/theme/types.ts +62 -0
- package/src/theme/web.ts +82 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import React, { ReactElement } from 'react';
|
|
2
|
+
import { FiboBuilder, createBuilder } from '../../../core/builder';
|
|
3
|
+
import { Card } from '../../Card';
|
|
4
|
+
import { Text } from '../../../content/Text';
|
|
5
|
+
import { Box } from '../../Box';
|
|
6
|
+
import { Button } from '../../../interactive/Button';
|
|
7
|
+
import { Switch } from '../../../interactive/Switch';
|
|
8
|
+
import { TextField } from '../../../interactive/TextField';
|
|
9
|
+
import { Badge } from '../../../content/Badge';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const InfoCardInner = React.memo((props: any) => {
|
|
15
|
+
const { title, description, icon, footer, className, style } = props;
|
|
16
|
+
|
|
17
|
+
return Card()
|
|
18
|
+
.className(className)
|
|
19
|
+
.style(style)
|
|
20
|
+
.children([
|
|
21
|
+
Box().className("flex items-start gap-4").children([
|
|
22
|
+
icon ? Box().className("mt-1 text-gray-400").children(icon).build() : null,
|
|
23
|
+
Box().className("flex-1").children([
|
|
24
|
+
title ? Text(title).fontSize(16).fontWeight(600).color("#111827").build() : null,
|
|
25
|
+
description ? Text(description).fontSize(14).color("#6B7280").className("mt-1").build() : null,
|
|
26
|
+
footer ? Box().className("mt-4").children(footer).build() : null
|
|
27
|
+
]).build()
|
|
28
|
+
]).build()
|
|
29
|
+
]).build();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
class InfoCardBuilder extends FiboBuilder {
|
|
33
|
+
private _title?: string;
|
|
34
|
+
private _description?: string;
|
|
35
|
+
private _icon?: ReactElement;
|
|
36
|
+
private _footer?: ReactElement;
|
|
37
|
+
|
|
38
|
+
title(text: string): this {
|
|
39
|
+
this._title = text;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
description(text: string): this {
|
|
44
|
+
this._description = text;
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
icon(element: ReactElement): this {
|
|
49
|
+
this._icon = element;
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
footer(element: ReactElement): this {
|
|
54
|
+
this._footer = element;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
build(): ReactElement {
|
|
59
|
+
const props = {
|
|
60
|
+
title: this._title,
|
|
61
|
+
description: this._description,
|
|
62
|
+
icon: this._icon,
|
|
63
|
+
footer: this._footer,
|
|
64
|
+
className: this.getClassName(),
|
|
65
|
+
style: this.getStyle(),
|
|
66
|
+
...this._props
|
|
67
|
+
};
|
|
68
|
+
return React.createElement(InfoCardInner, props);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
const ActionCardInner = React.memo((props: any) => {
|
|
76
|
+
const { title, description, action, actionType, onAction, actionLabel, className, style } = props;
|
|
77
|
+
|
|
78
|
+
let ActionElement = action;
|
|
79
|
+
|
|
80
|
+
if (!ActionElement) {
|
|
81
|
+
if (actionType === 'button') {
|
|
82
|
+
ActionElement = Button(actionLabel || 'Action').variant("soft").size("sm").onPress(onAction).build();
|
|
83
|
+
} else if (actionType === 'switch') {
|
|
84
|
+
|
|
85
|
+
ActionElement = Switch().onChange(onAction).build();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return Card()
|
|
90
|
+
.className(`flex items-center justify-between gap-4 ${className || ''}`)
|
|
91
|
+
.style(style)
|
|
92
|
+
.children([
|
|
93
|
+
Box().className("flex-1").children([
|
|
94
|
+
title ? Text(title).fontSize(16).fontWeight(600).color("#111827").build() : null,
|
|
95
|
+
description ? Text(description).fontSize(14).color("#6B7280").className("mt-1").build() : null,
|
|
96
|
+
]).build(),
|
|
97
|
+
ActionElement ? Box().className("flex-shrink-0").children(ActionElement).build() : null
|
|
98
|
+
]).build();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
class ActionCardBuilder extends FiboBuilder {
|
|
102
|
+
private _title?: string;
|
|
103
|
+
private _description?: string;
|
|
104
|
+
private _action?: ReactElement;
|
|
105
|
+
private _actionType?: 'button' | 'switch';
|
|
106
|
+
private _actionLabel?: string;
|
|
107
|
+
private _onAction?: (val?: any) => void;
|
|
108
|
+
|
|
109
|
+
title(text: string): this {
|
|
110
|
+
this._title = text;
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
description(text: string): this {
|
|
115
|
+
this._description = text;
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
action(element: ReactElement): this {
|
|
120
|
+
this._action = element;
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
withButton(label: string, onPress?: () => void): this {
|
|
125
|
+
this._actionType = 'button';
|
|
126
|
+
this._actionLabel = label;
|
|
127
|
+
this._onAction = onPress;
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
withSwitch(onChange?: (val: boolean) => void): this {
|
|
132
|
+
this._actionType = 'switch';
|
|
133
|
+
this._onAction = onChange;
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
build(): ReactElement {
|
|
138
|
+
const props = {
|
|
139
|
+
title: this._title,
|
|
140
|
+
description: this._description,
|
|
141
|
+
action: this._action,
|
|
142
|
+
actionType: this._actionType,
|
|
143
|
+
actionLabel: this._actionLabel,
|
|
144
|
+
onAction: this._onAction,
|
|
145
|
+
className: this.getClassName(),
|
|
146
|
+
style: this.getStyle(),
|
|
147
|
+
...this._props
|
|
148
|
+
};
|
|
149
|
+
return React.createElement(ActionCardInner, props);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
export const InfoCard = createBuilder(InfoCardBuilder);
|
|
155
|
+
|
|
156
|
+
export const ActionCard = createBuilder(ActionCardBuilder);
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
const InputCardInner = React.memo((props: any) => {
|
|
162
|
+
const { title, description, placeholder, value, onChange, type, className, style } = props;
|
|
163
|
+
|
|
164
|
+
return Card()
|
|
165
|
+
.className(className)
|
|
166
|
+
.style(style)
|
|
167
|
+
.children([
|
|
168
|
+
title ? Text(title).fontSize(14).fontWeight(600).color("#374151").className("mb-1").build() : null,
|
|
169
|
+
description ? Text(description).fontSize(12).color("#6B7280").className("mb-3").build() : null,
|
|
170
|
+
TextField()
|
|
171
|
+
.placeholder(placeholder)
|
|
172
|
+
.value(value)
|
|
173
|
+
.type(type)
|
|
174
|
+
.onChange(onChange)
|
|
175
|
+
.className("w-full")
|
|
176
|
+
.build()
|
|
177
|
+
]).build();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
class InputCardBuilder extends FiboBuilder {
|
|
181
|
+
private _title?: string;
|
|
182
|
+
private _description?: string;
|
|
183
|
+
private _placeholder?: string;
|
|
184
|
+
private _value?: string;
|
|
185
|
+
private _type: string = 'text';
|
|
186
|
+
private _onChange?: (val: string) => void;
|
|
187
|
+
|
|
188
|
+
title(text: string): this {
|
|
189
|
+
this._title = text;
|
|
190
|
+
return this;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
description(text: string): this {
|
|
194
|
+
this._description = text;
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
placeholder(text: string): this {
|
|
199
|
+
this._placeholder = text;
|
|
200
|
+
return this;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
value(text: string): this {
|
|
204
|
+
this._value = text;
|
|
205
|
+
return this;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
type(t: string): this {
|
|
209
|
+
this._type = t;
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
onChange(cb: (val: string) => void): this {
|
|
214
|
+
this._onChange = cb;
|
|
215
|
+
return this;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
build(): ReactElement {
|
|
219
|
+
const props = {
|
|
220
|
+
title: this._title,
|
|
221
|
+
description: this._description,
|
|
222
|
+
placeholder: this._placeholder,
|
|
223
|
+
value: this._value,
|
|
224
|
+
type: this._type,
|
|
225
|
+
onChange: this._onChange,
|
|
226
|
+
className: this.getClassName(),
|
|
227
|
+
style: this.getStyle(),
|
|
228
|
+
...this._props
|
|
229
|
+
};
|
|
230
|
+
return React.createElement(InputCardInner, props);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
export const InputCard = createBuilder(InputCardBuilder);
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
const MetricCardInner = React.memo((props: any) => {
|
|
242
|
+
const { title, value, trend, trendDirection, className, style } = props;
|
|
243
|
+
|
|
244
|
+
const trendColor = trendDirection === 'up' ? 'success' : trendDirection === 'down' ? 'error' : 'none';
|
|
245
|
+
const trendIcon = trendDirection === 'up' ? '↑' : trendDirection === 'down' ? '↓' : '•';
|
|
246
|
+
|
|
247
|
+
return Card()
|
|
248
|
+
.className(className)
|
|
249
|
+
.style(style)
|
|
250
|
+
.children([
|
|
251
|
+
Text(title).fontSize(14).fontWeight(600).color("#6B7280").build(),
|
|
252
|
+
Box().className("flex items-end justify-between mt-2").children([
|
|
253
|
+
Text(value).fontSize(32).fontWeight(800).color("#111827").build(),
|
|
254
|
+
trend ? Badge()
|
|
255
|
+
.text(`${trendIcon} ${trend}`)
|
|
256
|
+
.intent(trendColor)
|
|
257
|
+
.variant("accent")
|
|
258
|
+
.build() : null
|
|
259
|
+
]).build()
|
|
260
|
+
]).build();
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
class MetricCardBuilder extends FiboBuilder {
|
|
264
|
+
private _title: string = '';
|
|
265
|
+
private _value: string = '';
|
|
266
|
+
private _trend?: string;
|
|
267
|
+
private _trendDirection: 'up' | 'down' | 'neutral' = 'neutral';
|
|
268
|
+
|
|
269
|
+
title(text: string): this {
|
|
270
|
+
this._title = text;
|
|
271
|
+
return this;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
value(text: string): this {
|
|
275
|
+
this._value = text;
|
|
276
|
+
return this;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
trend(text: string, direction: 'up' | 'down' | 'neutral' = 'neutral'): this {
|
|
280
|
+
this._trend = text;
|
|
281
|
+
this._trendDirection = direction;
|
|
282
|
+
return this;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
build(): ReactElement {
|
|
286
|
+
const props = {
|
|
287
|
+
title: this._title,
|
|
288
|
+
value: this._value,
|
|
289
|
+
trend: this._trend,
|
|
290
|
+
trendDirection: this._trendDirection,
|
|
291
|
+
className: this.getClassName(),
|
|
292
|
+
style: this.getStyle(),
|
|
293
|
+
...this._props
|
|
294
|
+
};
|
|
295
|
+
return React.createElement(MetricCardInner, props);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
export const MetricCard = createBuilder(MetricCardBuilder);
|
|
301
|
+
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
@import './core.css';
|
|
2
|
+
@import './themes/material.css';
|
|
3
|
+
@import './themes/cupertino.css';
|
|
4
|
+
@import './themes/web.css';
|
|
5
|
+
|
|
6
|
+
@tailwind base;
|
|
7
|
+
@tailwind components;
|
|
8
|
+
@tailwind utilities;
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
--fibo-theme: 'material';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
.fibo-theme-material {
|
|
16
|
+
|
|
17
|
+
--fibo-primary: #1976d2;
|
|
18
|
+
--fibo-on-primary: #FFFFFF;
|
|
19
|
+
--fibo-primary-container: #bbdefb;
|
|
20
|
+
--fibo-on-primary-container: #1976d2;
|
|
21
|
+
|
|
22
|
+
--fibo-secondary: #9c27b0;
|
|
23
|
+
--fibo-on-secondary: #FFFFFF;
|
|
24
|
+
|
|
25
|
+
--fibo-tertiary: #7D5260;
|
|
26
|
+
--fibo-on-tertiary: #FFFFFF;
|
|
27
|
+
|
|
28
|
+
--fibo-error: #d32f2f;
|
|
29
|
+
--fibo-on-error: #FFFFFF;
|
|
30
|
+
|
|
31
|
+
--fibo-background: #FFFFFF;
|
|
32
|
+
--fibo-on-background: rgba(0, 0, 0, 0.87);
|
|
33
|
+
|
|
34
|
+
--fibo-surface: #FFFFFF;
|
|
35
|
+
--fibo-on-surface: rgba(0, 0, 0, 0.87);
|
|
36
|
+
--fibo-surface-variant: #f5f5f5;
|
|
37
|
+
--fibo-on-surface-variant: rgba(0, 0, 0, 0.6);
|
|
38
|
+
|
|
39
|
+
--fibo-outline: rgba(0, 0, 0, 0.12);
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
--fibo-font-family: 'Roboto', 'Helvetica', 'Arial', sans-serif;
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
--fibo-spacing-xs: 4px;
|
|
46
|
+
--fibo-spacing-sm: 8px;
|
|
47
|
+
--fibo-spacing-md: 16px;
|
|
48
|
+
--fibo-spacing-lg: 24px;
|
|
49
|
+
--fibo-spacing-xl: 32px;
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
--fibo-radius-none: 0px;
|
|
53
|
+
--fibo-radius-xs: 2px;
|
|
54
|
+
--fibo-radius-sm: 4px;
|
|
55
|
+
--fibo-radius-md: 8px;
|
|
56
|
+
--fibo-radius-lg: 12px;
|
|
57
|
+
--fibo-radius-xl: 16px;
|
|
58
|
+
--fibo-radius-full: 9999px;
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
--fibo-elevation-0: none;
|
|
62
|
+
--fibo-elevation-1: 0px 2px 1px -1px rgba(0,0,0,0.2), 0px 1px 1px 0px rgba(0,0,0,0.14), 0px 1px 3px 0px rgba(0,0,0,0.12);
|
|
63
|
+
--fibo-elevation-2: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12);
|
|
64
|
+
--fibo-elevation-3: 0px 3px 3px -2px rgba(0,0,0,0.2), 0px 3px 4px 0px rgba(0,0,0,0.14), 0px 1px 8px 0px rgba(0,0,0,0.12);
|
|
65
|
+
--fibo-elevation-4: 0px 5px 5px -3px rgba(0,0,0,0.2), 0px 8px 10px 1px rgba(0,0,0,0.14), 0px 3px 14px 2px rgba(0,0,0,0.12);
|
|
66
|
+
|
|
67
|
+
--fibo-border-width: 1px;
|
|
68
|
+
--fibo-border-color: rgba(0, 0, 0, 0.12);
|
|
69
|
+
|
|
70
|
+
--fibo-transition-fast: 250ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
71
|
+
--fibo-transition-normal: 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
.fibo-theme-cupertino {
|
|
76
|
+
|
|
77
|
+
--fibo-primary: #007AFF;
|
|
78
|
+
--fibo-on-primary: #FFFFFF;
|
|
79
|
+
--fibo-primary-container: rgba(0, 122, 255, 0.15);
|
|
80
|
+
--fibo-on-primary-container: #007AFF;
|
|
81
|
+
|
|
82
|
+
--fibo-secondary: #5856D6;
|
|
83
|
+
--fibo-on-secondary: #FFFFFF;
|
|
84
|
+
|
|
85
|
+
--fibo-background: #F2F2F7;
|
|
86
|
+
--fibo-on-background: #000000;
|
|
87
|
+
|
|
88
|
+
--fibo-surface: #FFFFFF;
|
|
89
|
+
--fibo-on-surface: #000000;
|
|
90
|
+
--fibo-surface-variant: #E5E5EA;
|
|
91
|
+
--fibo-on-surface-variant: #8E8E93;
|
|
92
|
+
|
|
93
|
+
--fibo-error: #FF3B30;
|
|
94
|
+
--fibo-on-error: #FFFFFF;
|
|
95
|
+
|
|
96
|
+
--fibo-outline: #C7C7CC;
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
--fibo-font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'SF Pro Display', sans-serif;
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
--fibo-spacing-xs: 4px;
|
|
103
|
+
--fibo-spacing-sm: 8px;
|
|
104
|
+
--fibo-spacing-md: 16px;
|
|
105
|
+
--fibo-spacing-lg: 20px;
|
|
106
|
+
--fibo-spacing-xl: 32px;
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
--fibo-radius-none: 0px;
|
|
110
|
+
--fibo-radius-xs: 4px;
|
|
111
|
+
--fibo-radius-sm: 8px;
|
|
112
|
+
--fibo-radius-md: 10px;
|
|
113
|
+
--fibo-radius-lg: 16px;
|
|
114
|
+
--fibo-radius-xl: 20px;
|
|
115
|
+
--fibo-radius-full: 9999px;
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
--fibo-elevation-0: none;
|
|
119
|
+
--fibo-elevation-1: 0 1px 2px rgba(0,0,0,0.05);
|
|
120
|
+
--fibo-elevation-2: 0 4px 12px rgba(0,0,0,0.08);
|
|
121
|
+
--fibo-elevation-3: 0 8px 24px rgba(0,0,0,0.12);
|
|
122
|
+
--fibo-elevation-4: 0 12px 32px rgba(0,0,0,0.14);
|
|
123
|
+
|
|
124
|
+
--fibo-border-width: 0.5px;
|
|
125
|
+
--fibo-border-color: rgba(60, 60, 67, 0.29);
|
|
126
|
+
|
|
127
|
+
--fibo-transition-fast: 250ms cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
128
|
+
--fibo-transition-normal: 400ms cubic-bezier(0.25, 0.1, 0.25, 1);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
.fibo-theme-web {
|
|
133
|
+
|
|
134
|
+
--fibo-primary: #3B82F6;
|
|
135
|
+
--fibo-on-primary: #FFFFFF;
|
|
136
|
+
--fibo-primary-container: #DBEAFE;
|
|
137
|
+
--fibo-on-primary-container: #1E40AF;
|
|
138
|
+
|
|
139
|
+
--fibo-secondary: #64748B;
|
|
140
|
+
--fibo-on-secondary: #FFFFFF;
|
|
141
|
+
|
|
142
|
+
--fibo-background: #F8FAFC;
|
|
143
|
+
--fibo-on-background: #0F172A;
|
|
144
|
+
|
|
145
|
+
--fibo-surface: #FFFFFF;
|
|
146
|
+
--fibo-on-surface: #0F172A;
|
|
147
|
+
--fibo-surface-variant: #F1F5F9;
|
|
148
|
+
--fibo-on-surface-variant: #64748B;
|
|
149
|
+
|
|
150
|
+
--fibo-error: #EF4444;
|
|
151
|
+
--fibo-on-error: #FFFFFF;
|
|
152
|
+
|
|
153
|
+
--fibo-outline: #E2E8F0;
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
--fibo-font-family: 'Inter', system-ui, sans-serif;
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
--fibo-radius-none: 0px;
|
|
160
|
+
--fibo-radius-xs: 2px;
|
|
161
|
+
--fibo-radius-sm: 4px;
|
|
162
|
+
--fibo-radius-md: 6px;
|
|
163
|
+
--fibo-radius-lg: 8px;
|
|
164
|
+
--fibo-radius-xl: 12px;
|
|
165
|
+
--fibo-radius-full: 9999px;
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
--fibo-elevation-0: none;
|
|
169
|
+
--fibo-elevation-1: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
170
|
+
--fibo-elevation-2: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
171
|
+
--fibo-elevation-3: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
172
|
+
--fibo-elevation-4: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
|
173
|
+
|
|
174
|
+
--fibo-border-width: 1px;
|
|
175
|
+
--fibo-border-color: #E2E8F0;
|
|
176
|
+
|
|
177
|
+
--fibo-transition-fast: 150ms ease-out;
|
|
178
|
+
--fibo-transition-normal: 300ms ease-out;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
body {
|
|
182
|
+
font-family: var(--fibo-font-family);
|
|
183
|
+
background-color: var(--fibo-background);
|
|
184
|
+
color: var(--fibo-on-background);
|
|
185
|
+
transition: background-color var(--fibo-transition-normal), color var(--fibo-transition-normal);
|
|
186
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
*, *::before, *::after {
|
|
5
|
+
box-sizing: border-box;
|
|
6
|
+
margin: 0;
|
|
7
|
+
padding: 0;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
body {
|
|
11
|
+
margin: 0;
|
|
12
|
+
-webkit-font-smoothing: antialiased;
|
|
13
|
+
-moz-osx-font-smoothing: grayscale;
|
|
14
|
+
line-height: 1.5;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
.fibo-clickable {
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
user-select: none;
|
|
21
|
+
-webkit-tap-highlight-color: transparent;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.fibo-flex-center {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: center;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.fibo-full-width {
|
|
31
|
+
width: 100%;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@keyframes fibo-ripple-anim {
|
|
36
|
+
to {
|
|
37
|
+
transform: scale(4);
|
|
38
|
+
opacity: 0;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.fibo-ripple-container {
|
|
43
|
+
position: absolute;
|
|
44
|
+
top: 0;
|
|
45
|
+
left: 0;
|
|
46
|
+
width: 100%;
|
|
47
|
+
height: 100%;
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
border-radius: inherit;
|
|
50
|
+
pointer-events: none;
|
|
51
|
+
z-index: 0;
|
|
52
|
+
}
|