@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@justeattakeaway/pie-button",
3
- "version": "0.25.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: calc(var(--dt-font-size-14) * 1px);
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: calc(var(--dt-font-size-20) * 1px);
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: calc(var(--dt-font-size-16) * 1px);
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: calc(var(--dt-font-size-20) * 1px);
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
- & .o-btn-text {
330
- opacity: 0;
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', 'ghost', 'inverse', 'ghost-inverse', 'destructive', 'destructive-ghost',
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 { LitElement, html, unsafeCSS } from 'lit';
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-leading - Leading 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, disabled, isFullWidth, variant, size, isLoading,
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
- <slot name="icon-leading"></slot>
56
- <span class="o-btn-text"><slot></slot></span>
57
- <slot name="icon-trailing"></slot>
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