@svp-chain-sdk/ui 0.1.4 → 0.1.6

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/dist/styles.css CHANGED
@@ -1,7 +1,7 @@
1
1
  @import "tailwindcss";
2
2
  @theme { --color-background: oklch(0.99 0.01 220); --color-foreground: oklch(0.24 0.04 235); --color-primary: oklch(0.55 0.16 220); --color-primary-foreground: oklch(0.99 0.01 220); --color-secondary: oklch(0.93 0.04 205); --color-secondary-foreground: oklch(0.28 0.07 225); --color-accent: oklch(0.9 0.06 195); --color-accent-foreground: oklch(0.25 0.07 225); --color-destructive: oklch(0.58 0.2 25); --color-destructive-foreground: white; --color-input: oklch(0.86 0.03 220); --color-ring: oklch(0.6 0.14 195); }
3
3
 
4
- /* 钱包控件与 SVP 应用保持同一视觉基线,消费方只负责摆放。 */
4
+ /* Wallet controls */
5
5
  .svp-header-wallet {
6
6
  display: flex;
7
7
  min-width: 0;
@@ -48,10 +48,7 @@
48
48
  font-weight: 700;
49
49
  }
50
50
 
51
- .svp-wallet-btn:hover {
52
- opacity: 0.9;
53
- }
54
-
51
+ .svp-wallet-btn:hover { opacity: 0.9; }
55
52
  .svp-wallet-btn-error {
56
53
  background: linear-gradient(90deg, #ef4444, #f87171);
57
54
  box-shadow: 0 8px 20px rgba(239, 68, 68, 0.35);
@@ -72,9 +69,7 @@
72
69
  font-weight: 600;
73
70
  }
74
71
 
75
- .svp-network-btn:hover {
76
- background: #f8fafc;
77
- }
72
+ .svp-network-btn:hover { background: #f8fafc; }
78
73
 
79
74
  @media (max-width: 640px) {
80
75
  .svp-network-btn,
@@ -85,7 +80,204 @@
85
80
  font-size: 0.75rem;
86
81
  }
87
82
 
88
- .svp-wallet-btn-connect {
89
- width: 104px;
83
+ .svp-wallet-btn-connect { width: 104px; }
84
+ }
85
+
86
+ /* Notice */
87
+ @keyframes ui-notice-marquee-scroll {
88
+ from { transform: translateX(0); }
89
+ to { transform: translateX(-50%); }
90
+ }
91
+
92
+ .ui-notice-marquee {
93
+ position: fixed;
94
+ z-index: 2147483647;
95
+ top: 100px;
96
+ left: 50%;
97
+ display: grid;
98
+ width: min(42rem, calc(100vw - 32px));
99
+ min-height: 54px;
100
+ grid-template-columns: auto minmax(0, 1fr) auto;
101
+ align-items: center;
102
+ gap: 12px;
103
+ padding: 8px 10px 8px 14px;
104
+ border: 1px solid rgba(37, 99, 235, 0.18);
105
+ border-radius: 14px;
106
+ overflow: hidden;
107
+ background: rgba(255, 255, 255, 0.98);
108
+ box-shadow: 0 16px 46px rgba(15, 30, 61, 0.2);
109
+ color: var(--color-foreground, #17334a);
110
+ font-size: 0.8125rem;
111
+ line-height: 1.25rem;
112
+ transform: translateX(-50%);
113
+ }
114
+
115
+ .ui-notice-marquee__icon {
116
+ display: grid;
117
+ width: 28px;
118
+ height: 28px;
119
+ place-items: center;
120
+ border-radius: 9px;
121
+ background: linear-gradient(135deg, #2563eb, #38bdf8);
122
+ color: #fff;
123
+ font-size: 14px;
124
+ font-weight: 800;
125
+ }
126
+
127
+ .ui-notice-marquee__viewport {
128
+ min-width: 0;
129
+ overflow: hidden;
130
+ }
131
+
132
+ .ui-notice-marquee__track {
133
+ display: flex;
134
+ width: max-content;
135
+ flex-shrink: 0;
136
+ align-items: center;
137
+ animation: ui-notice-marquee-scroll var(--ui-notice-marquee-duration, 32s) linear infinite;
138
+ will-change: transform;
139
+ }
140
+
141
+ .ui-notice-marquee__group {
142
+ display: flex;
143
+ flex-shrink: 0;
144
+ align-items: center;
145
+ gap: 1rem;
146
+ padding-inline-end: 2rem;
147
+ }
148
+
149
+ .ui-notice-marquee__item {
150
+ flex-shrink: 0;
151
+ white-space: nowrap;
152
+ }
153
+
154
+ .ui-notice-marquee:hover .ui-notice-marquee__track { animation-play-state: paused; }
155
+
156
+ .ui-notice-marquee__actions {
157
+ display: flex;
158
+ align-items: center;
159
+ gap: 4px;
160
+ }
161
+
162
+ .ui-notice-marquee__acknowledge,
163
+ .ui-notice-marquee__close {
164
+ height: 36px;
165
+ border: 0;
166
+ border-radius: 9px;
167
+ cursor: pointer;
168
+ font: inherit;
169
+ font-size: 13px;
170
+ font-weight: 700;
171
+ }
172
+
173
+ .ui-notice-marquee__acknowledge {
174
+ padding: 0 13px;
175
+ background: rgba(37, 99, 235, 0.1);
176
+ color: #2563eb;
177
+ }
178
+
179
+ .ui-notice-marquee__acknowledge:hover { background: rgba(37, 99, 235, 0.16); }
180
+
181
+ .ui-notice-marquee__close {
182
+ width: 36px;
183
+ padding: 0;
184
+ background: transparent;
185
+ color: rgba(15, 30, 61, 0.58);
186
+ font-size: 21px;
187
+ line-height: 1;
188
+ }
189
+
190
+ .ui-notice-marquee__close:hover {
191
+ background: rgba(15, 30, 61, 0.06);
192
+ color: #0f1e3d;
193
+ }
194
+
195
+ .ui-notice-marquee__acknowledge:focus-visible,
196
+ .ui-notice-marquee__close:focus-visible {
197
+ outline: 2px solid var(--color-ring, #2563eb);
198
+ outline-offset: 2px;
199
+ }
200
+
201
+ @media (max-width: 560px) {
202
+ .ui-notice-marquee {
203
+ top: max(16px, env(safe-area-inset-top));
204
+ width: calc(100vw - 24px);
205
+ min-height: 0;
206
+ grid-template-columns: auto minmax(0, 1fr) auto;
207
+ gap: 9px;
208
+ padding: 9px;
209
+ border-radius: 12px;
210
+ }
211
+
212
+ .ui-notice-marquee__icon { display: none; }
213
+ .ui-notice-marquee__item { white-space: normal; }
214
+ .ui-notice-marquee__track {
215
+ width: auto;
216
+ animation: none;
217
+ }
218
+ .ui-notice-marquee__group { padding: 0; }
219
+ .ui-notice-marquee__group[aria-hidden="true"] { display: none; }
220
+ .ui-notice-marquee__acknowledge { padding: 0 10px; }
221
+ }
222
+
223
+ /* Feedback */
224
+ .svp-contact-fab {
225
+ position: fixed;
226
+ right: 1.25rem;
227
+ top: 50%;
228
+ transform: translateY(-50%);
229
+ z-index: 1500;
230
+ width: 54px;
231
+ height: 54px;
232
+ border-radius: 16px;
233
+ border: none;
234
+ cursor: pointer;
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ background: linear-gradient(135deg, var(--svp-primary, #2563eb), var(--svp-accent, #38bdf8));
239
+ color: #fff;
240
+ box-shadow: 0 12px 30px rgba(37,99,235,0.4);
241
+ transition: transform .18s ease, box-shadow .18s ease;
242
+ }
243
+
244
+ .svp-contact-fab:hover {
245
+ transform: translateY(-50%) scale(1.06);
246
+ box-shadow: 0 16px 40px rgba(37,99,235,0.5);
247
+ }
248
+
249
+ .svp-contact-fab:active { transform: translateY(-50%) scale(0.97); }
250
+ .svp-contact-fab:focus-visible {
251
+ outline: 2px solid var(--color-ring, #2563eb);
252
+ outline-offset: 3px;
253
+ }
254
+
255
+ .svp-contact-fab-icon {
256
+ width: 26px;
257
+ height: 26px;
258
+ flex: 0 0 auto;
259
+ fill: currentColor;
260
+ }
261
+
262
+ @media (max-width: 560px) {
263
+ .svp-contact-fab {
264
+ width: 48px;
265
+ height: 48px;
266
+ right: 0.85rem;
267
+ border-radius: 14px;
268
+ }
269
+
270
+ .svp-contact-fab-icon {
271
+ width: 22px;
272
+ height: 22px;
90
273
  }
91
274
  }
275
+
276
+ @media (prefers-reduced-motion: reduce) {
277
+ .ui-notice-marquee__track {
278
+ animation: none;
279
+ will-change: auto;
280
+ }
281
+
282
+ .svp-contact-fab { transition: none; }
283
+ }
@@ -36,8 +36,207 @@ export declare const uiButtonComponents: {
36
36
  };
37
37
  };
38
38
  };
39
+ /** Explicit styles matching the website footer's 16rem infinite marquee. */
40
+ export declare const uiNoticeMarqueeComponents: {
41
+ '@keyframes ui-notice-marquee-scroll': {
42
+ from: {
43
+ transform: string;
44
+ };
45
+ to: {
46
+ transform: string;
47
+ };
48
+ };
49
+ '.ui-notice-marquee': {
50
+ position: string;
51
+ 'z-index': string;
52
+ top: string;
53
+ left: string;
54
+ display: string;
55
+ width: string;
56
+ 'min-height': string;
57
+ 'grid-template-columns': string;
58
+ 'align-items': string;
59
+ gap: string;
60
+ padding: string;
61
+ border: string;
62
+ 'border-radius': string;
63
+ overflow: string;
64
+ 'background-color': string;
65
+ 'box-shadow': string;
66
+ color: string;
67
+ 'font-size': string;
68
+ 'line-height': string;
69
+ transform: string;
70
+ };
71
+ '.ui-notice-marquee__icon': {
72
+ display: string;
73
+ width: string;
74
+ height: string;
75
+ 'place-items': string;
76
+ 'border-radius': string;
77
+ background: string;
78
+ color: string;
79
+ 'font-size': string;
80
+ 'font-weight': string;
81
+ };
82
+ '.ui-notice-marquee__viewport': {
83
+ 'min-width': string;
84
+ overflow: string;
85
+ };
86
+ '.ui-notice-marquee__actions': {
87
+ display: string;
88
+ 'align-items': string;
89
+ gap: string;
90
+ };
91
+ '.ui-notice-marquee__acknowledge, .ui-notice-marquee__close': {
92
+ height: string;
93
+ border: string;
94
+ 'border-radius': string;
95
+ cursor: string;
96
+ 'font-size': string;
97
+ 'font-weight': string;
98
+ };
99
+ '.ui-notice-marquee__acknowledge': {
100
+ padding: string;
101
+ 'background-color': string;
102
+ color: string;
103
+ };
104
+ '.ui-notice-marquee__close': {
105
+ width: string;
106
+ padding: string;
107
+ 'background-color': string;
108
+ color: string;
109
+ 'font-size': string;
110
+ };
111
+ '.ui-notice-marquee__track': {
112
+ display: string;
113
+ width: string;
114
+ 'flex-shrink': string;
115
+ 'align-items': string;
116
+ animation: string;
117
+ 'will-change': string;
118
+ };
119
+ '.ui-notice-marquee__group': {
120
+ display: string;
121
+ 'flex-shrink': string;
122
+ 'align-items': string;
123
+ gap: string;
124
+ 'padding-inline-end': string;
125
+ };
126
+ '.ui-notice-marquee__item': {
127
+ 'flex-shrink': string;
128
+ 'white-space': string;
129
+ };
130
+ '.ui-notice-marquee:hover .ui-notice-marquee__track': {
131
+ 'animation-play-state': string;
132
+ };
133
+ '@media (prefers-reduced-motion: reduce)': {
134
+ '.ui-notice-marquee__track': {
135
+ animation: string;
136
+ 'will-change': string;
137
+ };
138
+ };
139
+ };
39
140
  /** Complete component configuration registered by the default SVP UI plugin. */
40
141
  export declare const uiComponents: {
142
+ '@keyframes ui-notice-marquee-scroll': {
143
+ from: {
144
+ transform: string;
145
+ };
146
+ to: {
147
+ transform: string;
148
+ };
149
+ };
150
+ '.ui-notice-marquee': {
151
+ position: string;
152
+ 'z-index': string;
153
+ top: string;
154
+ left: string;
155
+ display: string;
156
+ width: string;
157
+ 'min-height': string;
158
+ 'grid-template-columns': string;
159
+ 'align-items': string;
160
+ gap: string;
161
+ padding: string;
162
+ border: string;
163
+ 'border-radius': string;
164
+ overflow: string;
165
+ 'background-color': string;
166
+ 'box-shadow': string;
167
+ color: string;
168
+ 'font-size': string;
169
+ 'line-height': string;
170
+ transform: string;
171
+ };
172
+ '.ui-notice-marquee__icon': {
173
+ display: string;
174
+ width: string;
175
+ height: string;
176
+ 'place-items': string;
177
+ 'border-radius': string;
178
+ background: string;
179
+ color: string;
180
+ 'font-size': string;
181
+ 'font-weight': string;
182
+ };
183
+ '.ui-notice-marquee__viewport': {
184
+ 'min-width': string;
185
+ overflow: string;
186
+ };
187
+ '.ui-notice-marquee__actions': {
188
+ display: string;
189
+ 'align-items': string;
190
+ gap: string;
191
+ };
192
+ '.ui-notice-marquee__acknowledge, .ui-notice-marquee__close': {
193
+ height: string;
194
+ border: string;
195
+ 'border-radius': string;
196
+ cursor: string;
197
+ 'font-size': string;
198
+ 'font-weight': string;
199
+ };
200
+ '.ui-notice-marquee__acknowledge': {
201
+ padding: string;
202
+ 'background-color': string;
203
+ color: string;
204
+ };
205
+ '.ui-notice-marquee__close': {
206
+ width: string;
207
+ padding: string;
208
+ 'background-color': string;
209
+ color: string;
210
+ 'font-size': string;
211
+ };
212
+ '.ui-notice-marquee__track': {
213
+ display: string;
214
+ width: string;
215
+ 'flex-shrink': string;
216
+ 'align-items': string;
217
+ animation: string;
218
+ 'will-change': string;
219
+ };
220
+ '.ui-notice-marquee__group': {
221
+ display: string;
222
+ 'flex-shrink': string;
223
+ 'align-items': string;
224
+ gap: string;
225
+ 'padding-inline-end': string;
226
+ };
227
+ '.ui-notice-marquee__item': {
228
+ 'flex-shrink': string;
229
+ 'white-space': string;
230
+ };
231
+ '.ui-notice-marquee:hover .ui-notice-marquee__track': {
232
+ 'animation-play-state': string;
233
+ };
234
+ '@media (prefers-reduced-motion: reduce)': {
235
+ '.ui-notice-marquee__track': {
236
+ animation: string;
237
+ 'will-change': string;
238
+ };
239
+ };
41
240
  '.ui-button': {
42
241
  display: string;
43
242
  'align-items': string;
@@ -74,11 +273,6 @@ export declare const uiComponents: {
74
273
  };
75
274
  };
76
275
  };
77
- /**
78
- * Tailwind provider for the framework-agnostic SVP UI classes.
79
- *
80
- * Register this once in the consuming project's Tailwind configuration, then
81
- * use `ui-button` classes from HTML, JSX, or any other markup.
82
- */
276
+ /** Tailwind provider for all framework-agnostic SVP UI classes. */
83
277
  declare const svpUiPlugin: import("tailwindcss/plugin").PluginWithConfig;
84
278
  export default svpUiPlugin;
package/dist/tailwind.js CHANGED
@@ -1,14 +1,14 @@
1
- function e(o, r) {
2
- return { handler: o, config: r };
1
+ function n(e, r) {
2
+ return { handler: e, config: r };
3
3
  }
4
- e.withOptions = function(o, r = () => ({})) {
5
- function n(t) {
6
- return { handler: o(t), config: r(t) };
4
+ n.withOptions = function(e, r = () => ({})) {
5
+ function o(i) {
6
+ return { handler: e(i), config: r(i) };
7
7
  }
8
- return n.__isOptionsFunction = !0, n;
8
+ return o.__isOptionsFunction = !0, o;
9
9
  };
10
- var i = e;
11
- const c = {
10
+ var t = n;
11
+ const a = {
12
12
  ".ui-button": {
13
13
  display: "inline-flex",
14
14
  "align-items": "center",
@@ -44,11 +44,110 @@ const c = {
44
44
  "background-color": "color-mix(in srgb, var(--color-destructive, #e5484d) 90%, transparent)"
45
45
  }
46
46
  }
47
- }, a = c, u = i(({ addBase: o, addComponents: r }) => {
48
- o({ ":root": { "--svp-ui-brand": "#159bb5" } }), r(a);
47
+ }, c = {
48
+ "@keyframes ui-notice-marquee-scroll": {
49
+ from: { transform: "translateX(0)" },
50
+ to: { transform: "translateX(-50%)" }
51
+ },
52
+ ".ui-notice-marquee": {
53
+ position: "fixed",
54
+ "z-index": "2147483647",
55
+ top: "100px",
56
+ left: "50%",
57
+ display: "grid",
58
+ width: "min(42rem, calc(100vw - 32px))",
59
+ "min-height": "54px",
60
+ "grid-template-columns": "auto minmax(0, 1fr) auto",
61
+ "align-items": "center",
62
+ gap: "0.75rem",
63
+ padding: "0.5rem 0.625rem 0.5rem 0.875rem",
64
+ border: "1px solid rgba(37, 99, 235, 0.18)",
65
+ "border-radius": "0.875rem",
66
+ overflow: "hidden",
67
+ "background-color": "rgba(255, 255, 255, 0.98)",
68
+ "box-shadow": "0 16px 46px rgba(15, 30, 61, 0.2)",
69
+ color: "var(--color-foreground, #17334a)",
70
+ "font-size": "0.8125rem",
71
+ "line-height": "1.25rem",
72
+ transform: "translateX(-50%)"
73
+ },
74
+ ".ui-notice-marquee__icon": {
75
+ display: "grid",
76
+ width: "1.75rem",
77
+ height: "1.75rem",
78
+ "place-items": "center",
79
+ "border-radius": "0.5625rem",
80
+ background: "linear-gradient(135deg, #2563eb, #38bdf8)",
81
+ color: "white",
82
+ "font-size": "0.875rem",
83
+ "font-weight": "800"
84
+ },
85
+ ".ui-notice-marquee__viewport": {
86
+ "min-width": "0",
87
+ overflow: "hidden"
88
+ },
89
+ ".ui-notice-marquee__actions": {
90
+ display: "flex",
91
+ "align-items": "center",
92
+ gap: "0.25rem"
93
+ },
94
+ ".ui-notice-marquee__acknowledge, .ui-notice-marquee__close": {
95
+ height: "2.25rem",
96
+ border: "0",
97
+ "border-radius": "0.5625rem",
98
+ cursor: "pointer",
99
+ "font-size": "0.8125rem",
100
+ "font-weight": "700"
101
+ },
102
+ ".ui-notice-marquee__acknowledge": {
103
+ padding: "0 0.8125rem",
104
+ "background-color": "rgba(37, 99, 235, 0.1)",
105
+ color: "#2563eb"
106
+ },
107
+ ".ui-notice-marquee__close": {
108
+ width: "2.25rem",
109
+ padding: "0",
110
+ "background-color": "transparent",
111
+ color: "rgba(15, 30, 61, 0.58)",
112
+ "font-size": "1.3125rem"
113
+ },
114
+ ".ui-notice-marquee__track": {
115
+ display: "flex",
116
+ width: "max-content",
117
+ "flex-shrink": "0",
118
+ "align-items": "center",
119
+ animation: "ui-notice-marquee-scroll var(--ui-notice-marquee-duration, 32s) linear infinite",
120
+ "will-change": "transform"
121
+ },
122
+ ".ui-notice-marquee__group": {
123
+ display: "flex",
124
+ "flex-shrink": "0",
125
+ "align-items": "center",
126
+ gap: "1rem",
127
+ "padding-inline-end": "1rem"
128
+ },
129
+ ".ui-notice-marquee__item": {
130
+ "flex-shrink": "0",
131
+ "white-space": "nowrap"
132
+ },
133
+ ".ui-notice-marquee:hover .ui-notice-marquee__track": {
134
+ "animation-play-state": "paused"
135
+ },
136
+ "@media (prefers-reduced-motion: reduce)": {
137
+ ".ui-notice-marquee__track": {
138
+ animation: "none",
139
+ "will-change": "auto"
140
+ }
141
+ }
142
+ }, u = {
143
+ ...a,
144
+ ...c
145
+ }, m = t(({ addBase: e, addComponents: r }) => {
146
+ e({ ":root": { "--svp-ui-brand": "#159bb5" } }), r(u);
49
147
  });
50
148
  export {
51
- u as default,
52
- c as uiButtonComponents,
53
- a as uiComponents
149
+ m as default,
150
+ a as uiButtonComponents,
151
+ u as uiComponents,
152
+ c as uiNoticeMarqueeComponents
54
153
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svp-chain-sdk/ui",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Accessible UI primitives for SVP Chain SDK applications.",
5
5
  "type": "module",
6
6
  "files": [
File without changes