@studiocms/ui 0.1.0 → 0.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studiocms/ui",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "The UI library for StudioCMS. Includes the layouts & components we use to build StudioCMS.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,6 +34,7 @@
34
34
  "license": "MIT",
35
35
  "type": "module",
36
36
  "exports": {
37
+ ".": "./src/integration.ts",
37
38
  "./components": "./src/components.ts",
38
39
  "./layouts": "./src/layouts.ts",
39
40
  "./css/*": "./src/css/*",
@@ -41,7 +42,6 @@
41
42
  "./types": "./src/types/index.ts"
42
43
  },
43
44
  "dependencies": {
44
- "@fontsource-variable/onest": "5.1.0",
45
45
  "@iconify/utils": "^2.1.33",
46
46
  "@iconify-json/heroicons": "^1.2.1"
47
47
  },
@@ -2,23 +2,44 @@
2
2
  import type { HTMLTag, Polymorphic } from 'astro/types';
3
3
  import type { StudioCMSColorway } from '../utils/colors';
4
4
 
5
+ /**
6
+ * Props for the button component.
7
+ */
5
8
  type Props<As extends HTMLTag = 'button'> = Omit<Polymorphic<{ as: As }>, 'as'> & {
9
+ /**
10
+ * The polymorphic component to render the button as. Defaults to `button`.
11
+ */
6
12
  as?: As;
13
+ /**
14
+ * The size of the button. Defaults to `md`.
15
+ */
7
16
  size?: 'sm' | 'md' | 'lg';
17
+ /**
18
+ * Whether the button should be full width. Defaults to `false`.
19
+ */
8
20
  fullWidth?: boolean;
21
+ /**
22
+ * The colorway of the button. Defaults to `default`.
23
+ */
9
24
  color?: StudioCMSColorway;
25
+ /**
26
+ * The variant of the button. Defaults to `solid`.
27
+ */
10
28
  variant?: 'solid' | 'outlined' | 'flat';
11
- class?: string;
29
+ /**
30
+ * Whether the button is disabled. Defaults to `false`.
31
+ */
12
32
  disabled?: boolean;
13
33
  };
14
34
 
35
+ export type { Props };
36
+
15
37
  const {
16
38
  size = 'md',
17
39
  fullWidth = false,
18
40
  color = 'default',
19
- variant = 'default',
41
+ variant = 'solid',
20
42
  as: As = 'button',
21
- class: className,
22
43
  disabled = false,
23
44
  ...props
24
45
  } = Astro.props;
@@ -29,311 +50,323 @@ const {
29
50
  class:list={[
30
51
  fullWidth && "full",
31
52
  disabled && "disabled",
32
- className,
33
53
  size,
34
54
  color,
35
55
  variant,
36
56
  ]}
37
57
  disabled={disabled}
38
- tabindex={0}
39
- {...props}
40
- >
58
+ tabindex={0}
59
+ {...props}>
41
60
  <slot name="start-content" />
42
61
  <slot />
43
62
  <slot name="end-content" />
44
63
  </As>
45
64
  <style>
46
- /* Default Styles */
47
- .sui-button {
48
- display: flex;
49
- flex-direction: row;
50
- align-items: center;
51
- text-align: center;
65
+ /* Default Styles */
66
+ .sui-button {
67
+ display: flex;
68
+ flex-direction: row;
69
+ align-items: center;
70
+ text-align: center;
52
71
 
53
- position: relative;
72
+ position: relative;
54
73
 
55
- /* Move gaps & radii to spacings.css later on */
56
- gap: 0.5rem;
74
+ /* Move gaps & radii to spacings.css later on */
75
+ gap: 0.5rem;
57
76
 
58
- outline: none;
59
- border: none;
77
+ outline: none;
78
+ border: none;
60
79
 
61
- font-weight: 400;
80
+ font-weight: 400;
62
81
 
63
- border-radius: 0.5rem;
82
+ border-radius: 0.5rem;
64
83
 
65
- transition: all 0.15s ease;
84
+ transition: transform 0.15s, background-color 0.15s, border-color 0.15s, color 0.15s;
85
+ transition-timing-function: ease;
66
86
 
67
- cursor: pointer;
87
+ cursor: pointer;
68
88
 
69
- /* Default colorway */
89
+ /* Default colorway */
70
90
 
71
- background-color: hsl(var(--default-base));
72
- border-color: hsl(var(--border));
73
- color: hsl(var(--text-muted));
91
+ background-color: hsl(var(--default-base));
92
+ border-color: hsl(var(--border));
93
+ color: hsl(var(--text-normal));
74
94
 
75
- min-width: fit-content;
95
+ min-width: fit-content;
76
96
 
77
- will-change: transform;
97
+ will-change: transform;
78
98
 
79
- text-decoration: none;
80
- }
99
+ text-decoration: none;
100
+ }
81
101
 
82
- .sui-button.disabled {
83
- pointer-events: none;
84
- opacity: 0.5;
85
- }
102
+ .sui-button.disabled {
103
+ pointer-events: none;
104
+ opacity: 0.5;
105
+ }
86
106
 
87
- .sui-button.outlined {
88
- border-width: 1px;
89
- border-style: solid;
90
- }
107
+ .sui-button.outlined {
108
+ border-width: 1px;
109
+ border-style: solid;
110
+ }
91
111
 
92
- .sui-button:hover {
93
- background-color: hsl(var(--default-hover));
94
- }
112
+ .sui-button.outlined:hover {
113
+ background-color: hsl(var(--default-hover));
114
+ }
95
115
 
96
- .sui-button:active {
97
- background-color: hsl(var(--default-active));
98
- transform: scale(0.95);
99
- }
116
+ .sui-button.outlined:active {
117
+ background-color: hsl(var(--default-hover));
118
+ }
100
119
 
101
- .sui-button.flat {
102
- background: hsla(var(--default-flat));
103
- }
120
+ .sui-button:hover {
121
+ background-color: hsl(var(--default-hover));
122
+ }
104
123
 
105
- .sui-button.flat:hover {
106
- background: hsla(var(--default-flat-hover));
107
- }
124
+ .sui-button:active {
125
+ background-color: hsl(var(--default-active));
126
+ transform: scale(0.95);
127
+ }
108
128
 
109
- .sui-button.flat:active {
110
- background: hsla(var(--default-flat-active));
111
- }
129
+ .sui-button.flat {
130
+ background: hsla(var(--default-flat));
131
+ }
112
132
 
113
- /* Sizes */
114
- .sui-button.sm {
115
- height: 32px;
116
- padding: 0.5rem 0.75rem;
133
+ .sui-button.flat:hover {
134
+ background: hsla(var(--default-flat-hover));
135
+ }
117
136
 
118
- font-size: 0.825em;
119
- }
137
+ .sui-button.flat:active {
138
+ background: hsla(var(--default-flat-active));
139
+ }
120
140
 
121
- .sui-button.md {
122
- height: 40px;
123
- padding: 0.5rem 0.75rem;
141
+ /* Sizes */
142
+ .sui-button.sm {
143
+ height: 32px;
144
+ padding: 0.5rem 0.75rem;
124
145
 
125
- font-size: 0.875em;
126
- }
146
+ font-size: 0.825em;
147
+ }
127
148
 
128
- .sui-button.lg {
129
- height: 48px;
130
- padding: 0.75rem 1rem;
149
+ .sui-button.md {
150
+ height: 40px;
151
+ padding: 0.5rem 0.75rem;
131
152
 
132
- font-size: 1em;
133
- }
153
+ font-size: 0.875em;
154
+ }
134
155
 
135
- /* Primary Colorway */
136
- .sui-button.primary {
137
- background-color: hsl(var(--primary-base));
138
- border-color: hsl(var(--primary-base));
139
- color: hsl(var(--text-inverted));
140
- }
156
+ .sui-button.lg {
157
+ height: 48px;
158
+ padding: 0.75rem 1rem;
141
159
 
142
- .sui-button.primary:hover {
143
- background-color: hsl(var(--primary-hover));
144
- }
160
+ font-size: 1em;
161
+ }
145
162
 
146
- .sui-button.primary:active {
147
- background-color: hsl(var(--primary-active));
148
- }
163
+ .sui-button:focus-visible {
164
+ outline: 2px solid hsl(var(--text-normal));
165
+ outline-offset: 2px;
166
+ }
149
167
 
150
- .sui-button.primary.outlined {
151
- background-color: hsl(var(--default-base));
152
- color: hsl(var(--text-normal));
153
- }
168
+ /* Primary Colorway */
169
+ .sui-button.primary {
170
+ background-color: hsl(var(--primary-base));
171
+ border-color: hsl(var(--primary-base));
172
+ color: hsl(var(--text-inverted));
173
+ }
154
174
 
155
- .sui-button.primary.outlined:hover {
156
- background-color: hsl(var(--default-hover));
157
- }
175
+ .sui-button.primary:hover {
176
+ background-color: hsl(var(--primary-hover));
177
+ }
158
178
 
159
- .sui-button.primary.outlined:active {
160
- background-color: hsl(var(--default-active));
161
- }
162
-
163
- .sui-button.primary.flat {
164
- background-color: hsla(var(--primary-flat));
165
- color: hsl(259, 96%, 79%);
166
- }
167
-
168
- .sui-button.primary.flat:hover {
169
- background-color: hsla(var(--primary-flat-hover));
170
- }
171
-
172
- .sui-button.primary.flat:active {
173
- background-color: hsla(var(--primary-flat-active));
174
- }
175
-
176
- /* Success Colorway */
177
- .sui-button.success {
178
- background-color: hsl(var(--success-base));
179
- border-color: hsl(var(--success-base));
180
- color: hsl(var(--text-dark));
181
- }
182
-
183
- .sui-button.success:hover {
184
- background-color: hsl(var(--success-hover));
185
- }
186
-
187
- .sui-button.success:active {
188
- background-color: hsl(var(--success-active));
189
- }
190
-
191
- .sui-button.success.outlined {
192
- background-color: hsl(var(--default-base));
193
- color: hsl(var(--text-normal));
194
- }
195
-
196
- .sui-button.success.outlined:hover {
197
- background-color: hsl(var(--default-hover));
198
- }
199
-
200
- .sui-button.success.outlined:active {
201
- background-color: hsl(var(--default-active));
202
- }
203
-
204
- .sui-button.success.flat {
205
- background-color: hsla(var(--success-flat));
206
- color: hsl(var(--success-base));
207
- }
208
-
209
- .sui-button.success.flat:hover {
210
- background-color: hsla(var(--success-flat-hover));
211
- }
212
-
213
- .sui-button.success.flat:active {
214
- background-color: hsla(var(--success-flat-active));
215
- }
216
-
217
- /* Warning Colorway */
218
- .sui-button.warning {
219
- background-color: hsl(var(--warning-base));
220
- border-color: hsl(var(--warning-base));
221
- color: hsl(var(--text-dark));
222
- }
223
-
224
- .sui-button.warning:hover {
225
- background-color: hsl(var(--warning-hover));
226
- }
227
-
228
- .sui-button.warning:active {
229
- background-color: hsl(var(--warning-active));
230
- }
231
-
232
- .sui-button.warning.outlined {
233
- background-color: hsl(var(--default-base));
234
- color: hsl(var(--text-normal));
235
- }
236
-
237
- .sui-button.warning.outlined:hover {
238
- background-color: hsl(var(--default-hover));
239
- }
240
-
241
- .sui-button.warning.outlined:active {
242
- background-color: hsl(var(--default-active));
243
- }
244
-
245
- .sui-button.warning.flat {
246
- background-color: hsla(var(--warning-flat));
247
- color: hsl(var(--warning-base));
248
- }
249
-
250
- .sui-button.warning.flat:hover {
251
- background-color: hsla(var(--warning-flat-hover));
252
- }
253
-
254
- .sui-button.warning.flat:active {
255
- background-color: hsla(var(--warning-flat-active));
256
- }
257
-
258
- /* Danger Colorway */
259
- .sui-button.danger {
260
- background-color: hsl(var(--danger-base));
261
- border-color: hsl(var(--danger-base));
262
- color: hsl(var(--text-light));
263
- }
264
-
265
- .sui-button.danger:hover {
266
- background-color: hsl(var(--danger-hover));
267
- }
268
-
269
- .sui-button.danger:active {
270
- background-color: hsl(var(--danger-active));
271
- }
272
-
273
- .sui-button.danger.outlined {
274
- background-color: hsl(var(--default-base));
275
- color: hsl(var(--text-normal));
276
- }
277
-
278
- .sui-button.danger.outlined:hover {
279
- background-color: hsl(var(--default-hover));
280
- }
281
-
282
- .sui-button.danger.outlined:active {
283
- background-color: hsl(var(--default-active));
284
- }
285
-
286
- .sui-button.danger.flat {
287
- background-color: hsla(var(--danger-flat));
288
- color: hsl(337, 92%, 71%);
289
- }
290
-
291
- .sui-button.danger.flat:hover {
292
- background-color: hsla(var(--danger-flat-hover));
293
- }
294
-
295
- .sui-button.danger.flat:active {
296
- background-color: hsla(var(--danger-flat-active));
297
- }
298
-
299
- .sui-button.full {
300
- width: 100%;
301
- justify-content: center;
302
- }
303
-
304
- [data-theme="light"] {
305
- .sui-button.primary.flat {
306
- color: hsl(259, 84%, 45%);
307
- }
308
-
309
- .sui-button.success.flat {
310
- background-color: hsl(var(--success-base), 0.2);
311
- color: hsl(143, 59%, 20%);
312
- }
313
-
314
- .sui-button.success.flat:hover {
315
- background-color: hsla(var(--success-flat-hover));
316
- }
317
-
318
- .sui-button.success.flat:active {
319
- background-color: hsla(var(--success-flat-active));
320
- }
321
-
322
- .sui-button.warning.flat {
323
- background-color: hsla(var(--warning-base), 0.2);
324
- color: hsl(48, 78%, 20%);
325
- }
326
-
327
- .sui-button.warning.flat:hover {
328
- background-color: hsla(var(--warning-base), 0.25);
329
- }
330
-
331
- .sui-button.warning.flat:active {
332
- background-color: hsla(var(--warning-base), 0.4);
333
- }
334
-
335
- .sui-button.danger.flat {
336
- color: hsl(339, 97%, 29%);
337
- }
338
- }
179
+ .sui-button.primary:active {
180
+ background-color: hsl(var(--primary-active));
181
+ }
182
+
183
+ .sui-button.primary.outlined {
184
+ background-color: hsl(var(--default-base));
185
+ color: hsl(var(--text-normal));
186
+ }
187
+
188
+ .sui-button.primary.outlined:hover {
189
+ background-color: hsl(var(--default-hover));
190
+ }
191
+
192
+ .sui-button.primary.outlined:active {
193
+ background-color: hsl(var(--default-active));
194
+ }
195
+
196
+ .sui-button.primary.flat {
197
+ background-color: hsla(var(--primary-flat));
198
+ color: hsl(259, 96%, 79%);
199
+ }
200
+
201
+ .sui-button.primary.flat:hover {
202
+ background-color: hsla(var(--primary-flat-hover));
203
+ }
204
+
205
+ .sui-button.primary.flat:active {
206
+ background-color: hsla(var(--primary-flat-active));
207
+ }
208
+
209
+ /* Success Colorway */
210
+ .sui-button.success {
211
+ background-color: hsl(var(--success-base));
212
+ border-color: hsl(var(--success-base));
213
+ color: hsl(var(--text-dark));
214
+ }
215
+
216
+ .sui-button.success:hover {
217
+ background-color: hsl(var(--success-hover));
218
+ }
219
+
220
+ .sui-button.success:active {
221
+ background-color: hsl(var(--success-active));
222
+ }
223
+
224
+ .sui-button.success.outlined {
225
+ background-color: hsl(var(--default-base));
226
+ color: hsl(var(--text-normal));
227
+ }
228
+
229
+ .sui-button.success.outlined:hover {
230
+ background-color: hsl(var(--default-hover));
231
+ }
232
+
233
+ .sui-button.success.outlined:active {
234
+ background-color: hsl(var(--default-active));
235
+ }
236
+
237
+ .sui-button.success.flat {
238
+ background-color: hsla(var(--success-flat));
239
+ color: hsl(var(--success-base));
240
+ }
241
+
242
+ .sui-button.success.flat:hover {
243
+ background-color: hsla(var(--success-flat-hover));
244
+ }
245
+
246
+ .sui-button.success.flat:active {
247
+ background-color: hsla(var(--success-flat-active));
248
+ }
249
+
250
+ /* Warning Colorway */
251
+ .sui-button.warning {
252
+ background-color: hsl(var(--warning-base));
253
+ border-color: hsl(var(--warning-base));
254
+ color: hsl(var(--text-dark));
255
+ }
256
+
257
+ .sui-button.warning:hover {
258
+ background-color: hsl(var(--warning-hover));
259
+ }
260
+
261
+ .sui-button.warning:active {
262
+ background-color: hsl(var(--warning-active));
263
+ }
264
+
265
+ .sui-button.warning.outlined {
266
+ background-color: hsl(var(--default-base));
267
+ color: hsl(var(--text-normal));
268
+ }
269
+
270
+ .sui-button.warning.outlined:hover {
271
+ background-color: hsl(var(--default-hover));
272
+ }
273
+
274
+ .sui-button.warning.outlined:active {
275
+ background-color: hsl(var(--default-active));
276
+ }
277
+
278
+ .sui-button.warning.flat {
279
+ background-color: hsla(var(--warning-flat));
280
+ color: hsl(var(--warning-base));
281
+ }
282
+
283
+ .sui-button.warning.flat:hover {
284
+ background-color: hsla(var(--warning-flat-hover));
285
+ }
286
+
287
+ .sui-button.warning.flat:active {
288
+ background-color: hsla(var(--warning-flat-active));
289
+ }
290
+
291
+ /* Danger Colorway */
292
+ .sui-button.danger {
293
+ background-color: hsl(var(--danger-base));
294
+ border-color: hsl(var(--danger-base));
295
+ color: hsl(var(--text-light));
296
+ }
297
+
298
+ .sui-button.danger:hover {
299
+ background-color: hsl(var(--danger-hover));
300
+ }
301
+
302
+ .sui-button.danger:active {
303
+ background-color: hsl(var(--danger-active));
304
+ }
305
+
306
+ .sui-button.danger.outlined {
307
+ background-color: hsl(var(--default-base));
308
+ color: hsl(var(--text-normal));
309
+ }
310
+
311
+ .sui-button.danger.outlined:hover {
312
+ background-color: hsl(var(--default-hover));
313
+ }
314
+
315
+ .sui-button.danger.outlined:active {
316
+ background-color: hsl(var(--default-active));
317
+ }
318
+
319
+ .sui-button.danger.flat {
320
+ background-color: hsla(var(--danger-flat));
321
+ color: hsl(337, 92%, 71%);
322
+ }
323
+
324
+ .sui-button.danger.flat:hover {
325
+ background-color: hsla(var(--danger-flat-hover));
326
+ }
327
+
328
+ .sui-button.danger.flat:active {
329
+ background-color: hsla(var(--danger-flat-active));
330
+ }
331
+
332
+ .sui-button.full {
333
+ width: 100%;
334
+ justify-content: center;
335
+ }
336
+
337
+ [data-theme="light"] {
338
+ .sui-button.primary.flat {
339
+ color: hsl(259, 84%, 45%);
340
+ }
341
+
342
+ .sui-button.success.flat {
343
+ background-color: hsl(var(--success-base), 0.2);
344
+ color: hsl(143, 59%, 20%);
345
+ }
346
+
347
+ .sui-button.success.flat:hover {
348
+ background-color: hsla(var(--success-flat-hover));
349
+ }
350
+
351
+ .sui-button.success.flat:active {
352
+ background-color: hsla(var(--success-flat-active));
353
+ }
354
+
355
+ .sui-button.warning.flat {
356
+ background-color: hsla(var(--warning-base), 0.2);
357
+ color: hsl(48, 78%, 20%);
358
+ }
359
+
360
+ .sui-button.warning.flat:hover {
361
+ background-color: hsla(var(--warning-base), 0.25);
362
+ }
363
+
364
+ .sui-button.warning.flat:active {
365
+ background-color: hsla(var(--warning-base), 0.4);
366
+ }
367
+
368
+ .sui-button.danger.flat {
369
+ color: hsl(339, 97%, 29%);
370
+ }
371
+ }
339
372
  </style>