@justeattakeaway/pie-button 0.25.0 → 0.27.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 +19 -10
- package/dist/index.d.ts +9 -3
- package/dist/index.js +36 -29
- package/dist/react.d.ts +9 -3
- package/dist/react.js +44 -1565
- package/package.json +2 -2
- package/src/button.scss +29 -33
- package/src/defs.ts +7 -1
- package/src/index.ts +19 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@justeattakeaway/pie-button",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.0",
|
|
4
4
|
"description": "PIE design system button built using web components",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"**/*.d.ts"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"build": "yarn build:wrapper pie-button && run -T vite build
|
|
15
|
+
"build": "yarn build:wrapper pie-button && run -T vite build",
|
|
16
16
|
"lint:scripts": "run -T eslint .",
|
|
17
17
|
"lint:scripts:fix": "run -T eslint . --fix",
|
|
18
18
|
"lint:style": "run -T stylelint ./src/**/*.{css,scss}",
|
package/src/button.scss
CHANGED
|
@@ -214,13 +214,18 @@
|
|
|
214
214
|
@include spinner-base-colors('--dt-color-content-interactive-secondary');
|
|
215
215
|
}
|
|
216
216
|
|
|
217
|
-
&[variant='ghost-inverse']
|
|
217
|
+
&[variant='ghost-inverse'],
|
|
218
|
+
&[variant='outline-inverse'] {
|
|
218
219
|
--btn-bg-color: transparent;
|
|
219
220
|
--btn-text-color: var(--dt-color-content-interactive-primary);
|
|
220
221
|
|
|
221
222
|
@include button-interactive-states('--dt-color-container-inverse', true);
|
|
222
223
|
}
|
|
223
224
|
|
|
225
|
+
&[variant='outline-inverse'] {
|
|
226
|
+
border: 1px solid var(--dt-color-border-strong);
|
|
227
|
+
}
|
|
228
|
+
|
|
224
229
|
&[variant='destructive'] {
|
|
225
230
|
--btn-bg-color: var(--dt-color-support-error);
|
|
226
231
|
|
|
@@ -258,7 +263,7 @@
|
|
|
258
263
|
|
|
259
264
|
&[size='xsmall'] {
|
|
260
265
|
--btn-padding: 6px var(--dt-spacing-b);
|
|
261
|
-
--btn-font-size:
|
|
266
|
+
--btn-font-size: #{p.font-size(--dt-font-size-14)};
|
|
262
267
|
--btn-line-height: calc(var(--dt-font-size-14-line-height) * 1px);
|
|
263
268
|
--btn-icon-size: 16px;
|
|
264
269
|
--spinner-size: var(--spinner-size-s);
|
|
@@ -267,7 +272,7 @@
|
|
|
267
272
|
|
|
268
273
|
&[size='small-expressive'] {
|
|
269
274
|
--btn-padding: 6px var(--dt-spacing-d);
|
|
270
|
-
--btn-font-size:
|
|
275
|
+
--btn-font-size: #{p.font-size(--dt-font-size-20)};
|
|
271
276
|
--btn-line-height: calc(var(--dt-font-size-20-line-height) * 1px);
|
|
272
277
|
--btn-icon-size: 20px;
|
|
273
278
|
--spinner-size: var(--spinner-size-s);
|
|
@@ -276,7 +281,7 @@
|
|
|
276
281
|
|
|
277
282
|
&[size='small-productive'] {
|
|
278
283
|
--btn-padding: 8px var(--dt-spacing-d);
|
|
279
|
-
--btn-font-size:
|
|
284
|
+
--btn-font-size: #{p.font-size(--dt-font-size-16)};
|
|
280
285
|
--btn-line-height: calc(var(--dt-font-size-16-line-height) * 1px);
|
|
281
286
|
--btn-icon-size: 20px;
|
|
282
287
|
--spinner-size: var(--spinner-size-s);
|
|
@@ -289,45 +294,36 @@
|
|
|
289
294
|
|
|
290
295
|
&[size='large'] {
|
|
291
296
|
--btn-padding: 14px var(--dt-spacing-e);
|
|
292
|
-
--btn-font-size:
|
|
297
|
+
--btn-font-size: #{p.font-size(--dt-font-size-20)};
|
|
293
298
|
--btn-line-height: calc(var(--dt-font-size-20-line-height) * 1px);
|
|
294
299
|
--spinner-size: var(--spinner-size-m);
|
|
295
300
|
--spinner-border-width: var(--spinner-border-width-m);
|
|
296
301
|
}
|
|
297
302
|
|
|
298
|
-
&:before {
|
|
299
|
-
content: '';
|
|
300
|
-
|
|
301
|
-
// Centre the spinner over the top of the button text
|
|
302
|
-
position: absolute;
|
|
303
|
-
left: 50%;
|
|
304
|
-
top: 50%;
|
|
305
|
-
translate: -50% -50%;
|
|
306
|
-
|
|
307
|
-
height: var(--spinner-size);
|
|
308
|
-
width: var(--spinner-size);
|
|
309
|
-
display: block;
|
|
310
|
-
background-color: transparent;
|
|
311
|
-
border-radius: 50%;
|
|
312
|
-
border-color: var(--spinner-left-color) var(--spinner-right-color) var(--spinner-right-color) var(--spinner-left-color);
|
|
313
|
-
border-width: var(--spinner-border-width);
|
|
314
|
-
border-style: solid;
|
|
315
|
-
will-change: transform;
|
|
316
|
-
opacity: 0;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
.o-btn-text {
|
|
320
|
-
flex-grow: 1;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
303
|
&[isLoading] {
|
|
324
304
|
&:before {
|
|
305
|
+
content: '';
|
|
306
|
+
|
|
307
|
+
// Centre the spinner over the top of the button text
|
|
308
|
+
position: absolute;
|
|
309
|
+
left: 50%;
|
|
310
|
+
top: 50%;
|
|
311
|
+
translate: -50% -50%;
|
|
312
|
+
|
|
313
|
+
height: var(--spinner-size);
|
|
314
|
+
width: var(--spinner-size);
|
|
315
|
+
display: block;
|
|
316
|
+
background-color: transparent;
|
|
317
|
+
border-radius: 50%;
|
|
318
|
+
border-color: var(--spinner-left-color) var(--spinner-right-color) var(--spinner-right-color) var(--spinner-left-color);
|
|
319
|
+
border-width: var(--spinner-border-width);
|
|
320
|
+
border-style: solid;
|
|
321
|
+
will-change: transform;
|
|
325
322
|
animation: rotate360 var(--spinner-animation-duration) var(--spinner-animation-timing-function) var(--spinner-animation-iteration-count);
|
|
326
|
-
opacity: 1;
|
|
327
323
|
}
|
|
328
324
|
|
|
329
|
-
&
|
|
330
|
-
|
|
325
|
+
& > * {
|
|
326
|
+
visibility: hidden;
|
|
331
327
|
}
|
|
332
328
|
}
|
|
333
329
|
}
|
package/src/defs.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export const sizes = ['xsmall', 'small-productive', 'small-expressive', 'medium', 'large'] as const;
|
|
2
2
|
export const types = ['submit', 'button', 'reset', 'menu'] as const;
|
|
3
3
|
export const variants = [
|
|
4
|
-
'primary', 'secondary', 'outline', '
|
|
4
|
+
'primary', 'secondary', 'outline', 'outline-inverse', 'ghost',
|
|
5
|
+
'inverse', 'ghost-inverse', 'destructive', 'destructive-ghost',
|
|
5
6
|
] as const;
|
|
7
|
+
export const iconPlacements = ['leading', 'trailing'] as const;
|
|
6
8
|
|
|
7
9
|
export type Variant = typeof variants[number];
|
|
8
10
|
|
|
@@ -19,6 +21,10 @@ export interface ButtonProps {
|
|
|
19
21
|
* What style variant the button should be such as primary, outline or ghost.
|
|
20
22
|
*/
|
|
21
23
|
variant: Variant;
|
|
24
|
+
/**
|
|
25
|
+
* The placement of the icon slot, if provided, such as leading or trailing
|
|
26
|
+
*/
|
|
27
|
+
iconPlacement?: typeof iconPlacements[number];
|
|
22
28
|
/**
|
|
23
29
|
* When true, the button element is disabled.
|
|
24
30
|
*/
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
LitElement, html, unsafeCSS, nothing,
|
|
3
|
+
} from 'lit';
|
|
2
4
|
import { property } from 'lit/decorators.js';
|
|
3
5
|
import { validPropertyValues } from '@justeattakeaway/pie-webc-core';
|
|
4
6
|
import styles from './button.scss?inline';
|
|
5
7
|
import {
|
|
6
|
-
ButtonProps, sizes, types, variants,
|
|
8
|
+
ButtonProps, sizes, types, variants, iconPlacements,
|
|
7
9
|
} from './defs';
|
|
8
10
|
|
|
9
11
|
// Valid values available to consumers
|
|
@@ -12,8 +14,7 @@ export * from './defs';
|
|
|
12
14
|
const componentSelector = 'pie-button';
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
|
-
* @slot icon
|
|
16
|
-
* @slot icon-trailing - Trailing icon
|
|
17
|
+
* @slot icon - The icon slot
|
|
17
18
|
* @slot - Default slot
|
|
18
19
|
*/
|
|
19
20
|
export class PieButton extends LitElement implements ButtonProps {
|
|
@@ -29,6 +30,10 @@ export class PieButton extends LitElement implements ButtonProps {
|
|
|
29
30
|
@validPropertyValues(componentSelector, variants, 'primary')
|
|
30
31
|
public variant: ButtonProps['variant'] = 'primary';
|
|
31
32
|
|
|
33
|
+
@property({ type: String })
|
|
34
|
+
@validPropertyValues(componentSelector, iconPlacements, 'leading')
|
|
35
|
+
public iconPlacement: ButtonProps['iconPlacement'] = 'leading';
|
|
36
|
+
|
|
32
37
|
@property({ type: Boolean })
|
|
33
38
|
public disabled = false;
|
|
34
39
|
|
|
@@ -40,7 +45,13 @@ export class PieButton extends LitElement implements ButtonProps {
|
|
|
40
45
|
|
|
41
46
|
render () {
|
|
42
47
|
const {
|
|
43
|
-
type,
|
|
48
|
+
type,
|
|
49
|
+
disabled,
|
|
50
|
+
isFullWidth,
|
|
51
|
+
variant,
|
|
52
|
+
size,
|
|
53
|
+
isLoading,
|
|
54
|
+
iconPlacement,
|
|
44
55
|
} = this;
|
|
45
56
|
|
|
46
57
|
return html`
|
|
@@ -52,9 +63,9 @@ export class PieButton extends LitElement implements ButtonProps {
|
|
|
52
63
|
?disabled=${disabled}
|
|
53
64
|
?isFullWidth=${isFullWidth}
|
|
54
65
|
?isLoading=${isLoading}>
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
66
|
+
${iconPlacement === 'leading' ? html`<slot name="icon"></slot>` : nothing}
|
|
67
|
+
<slot></slot>
|
|
68
|
+
${iconPlacement === 'trailing' ? html`<slot name="icon"></slot>` : nothing}
|
|
58
69
|
</button>`;
|
|
59
70
|
}
|
|
60
71
|
|