@justifi/webcomponents 2.0.1 → 3.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/justifi-bank-account-form.cjs.entry.js +7 -1
  3. package/dist/cjs/justifi-billing-form_2.cjs.entry.js +3 -2
  4. package/dist/cjs/justifi-card-form.cjs.entry.js +8 -1
  5. package/dist/cjs/justifi-payment-form.cjs.entry.js +17 -5
  6. package/dist/cjs/justifi-payment-method-form.cjs.entry.js +1 -1
  7. package/dist/cjs/loader.cjs.js +1 -1
  8. package/dist/cjs/webcomponents.cjs.js +1 -1
  9. package/dist/collection/components/bank-account-form/bank-account-form.js +31 -28
  10. package/dist/collection/components/bank-account-form/bank-account-form.stories.js +68 -0
  11. package/dist/collection/components/billing-form/billing-form-schema.js +1 -1
  12. package/dist/collection/components/billing-form/billing-form.js +2 -1
  13. package/dist/collection/components/card-form/card-form.js +37 -15
  14. package/dist/collection/components/card-form/card-form.stories.js +16 -49
  15. package/dist/collection/components/payment-form/payment-form.css +384 -0
  16. package/dist/collection/components/payment-form/payment-form.js +106 -11
  17. package/dist/collection/components/payment-form/payment-form.stories.js +23 -43
  18. package/dist/components/billing-form.js +3 -2
  19. package/dist/components/justifi-bank-account-form.js +8 -2
  20. package/dist/components/justifi-card-form.js +9 -1
  21. package/dist/components/justifi-payment-form.js +24 -7
  22. package/dist/components/payment-method-form.js +1 -1
  23. package/dist/esm/justifi-bank-account-form.entry.js +7 -1
  24. package/dist/esm/justifi-billing-form_2.entry.js +3 -2
  25. package/dist/esm/justifi-card-form.entry.js +8 -1
  26. package/dist/esm/justifi-payment-form.entry.js +18 -6
  27. package/dist/esm/justifi-payment-method-form.entry.js +1 -1
  28. package/dist/esm/loader.js +1 -1
  29. package/dist/esm/webcomponents.js +1 -1
  30. package/dist/types/components/bank-account-form/bank-account-form.d.ts +27 -2
  31. package/dist/types/components/bank-account-form/bank-account-form.stories.d.ts +16 -0
  32. package/dist/types/components/billing-form/billing-form-schema.d.ts +3 -0
  33. package/dist/types/components/card-form/card-form.d.ts +32 -1
  34. package/dist/types/components/card-form/card-form.stories.d.ts +2 -22
  35. package/dist/types/components/payment-form/payment-form.d.ts +11 -5
  36. package/dist/types/components/payment-form/payment-form.stories.d.ts +2 -25
  37. package/dist/types/components.d.ts +81 -4
  38. package/dist/webcomponents/{p-e3de1db1.entry.js → p-17d2674c.entry.js} +1 -1
  39. package/dist/webcomponents/p-282af003.entry.js +1 -0
  40. package/dist/webcomponents/p-87a342be.entry.js +1 -0
  41. package/dist/webcomponents/p-af8d98bb.entry.js +1 -0
  42. package/dist/webcomponents/p-f3211155.entry.js +1 -0
  43. package/dist/webcomponents/webcomponents.esm.js +1 -1
  44. package/package.json +1 -1
  45. package/dist/webcomponents/p-33fa7295.entry.js +0 -1
  46. package/dist/webcomponents/p-388b2c5f.entry.js +0 -1
  47. package/dist/webcomponents/p-3d53bd97.entry.js +0 -1
  48. package/dist/webcomponents/p-884b845d.entry.js +0 -1
@@ -3,7 +3,8 @@ export class CardForm {
3
3
  constructor() {
4
4
  this.validationMode = undefined;
5
5
  this.iframeOrigin = undefined;
6
- this.singleLine = undefined;
6
+ this.singleLine = false;
7
+ this.internalStyleOverrides = undefined;
7
8
  }
8
9
  readyHandler(event) {
9
10
  this.cardFormReady.emit(event);
@@ -14,12 +15,18 @@ export class CardForm {
14
15
  validateHandler(event) {
15
16
  this.cardFormValidate.emit(event);
16
17
  }
18
+ /**
19
+ * Makes a tokenization request to the iframe
20
+ */
17
21
  async tokenize(...args) {
18
22
  if (!this.childRef) {
19
23
  throw new Error('Cannot call tokenize');
20
24
  }
21
25
  return this.childRef.tokenize(...args);
22
26
  }
27
+ /**
28
+ * Runs a validation on the form and shows errors if any
29
+ */
23
30
  async validate() {
24
31
  if (!this.childRef) {
25
32
  throw new Error('Cannot call validate');
@@ -48,7 +55,7 @@ export class CardForm {
48
55
  "optional": false,
49
56
  "docs": {
50
57
  "tags": [],
51
- "text": ""
58
+ "text": "When to trigger validation of the form."
52
59
  },
53
60
  "attribute": "validation-mode",
54
61
  "reflect": false
@@ -65,7 +72,7 @@ export class CardForm {
65
72
  "optional": true,
66
73
  "docs": {
67
74
  "tags": [],
68
- "text": ""
75
+ "text": "URL for the rendered iFrame. End-users need not use this."
69
76
  },
70
77
  "attribute": "iframe-origin",
71
78
  "reflect": false
@@ -82,13 +89,19 @@ export class CardForm {
82
89
  "optional": false,
83
90
  "docs": {
84
91
  "tags": [],
85
- "text": ""
92
+ "text": "Boolean indicating if the Card Form should render in a single line"
86
93
  },
87
94
  "attribute": "single-line",
88
- "reflect": false
95
+ "reflect": false,
96
+ "defaultValue": "false"
89
97
  }
90
98
  };
91
99
  }
100
+ static get states() {
101
+ return {
102
+ "internalStyleOverrides": {}
103
+ };
104
+ }
92
105
  static get events() {
93
106
  return [{
94
107
  "method": "cardFormReady",
@@ -97,8 +110,11 @@ export class CardForm {
97
110
  "cancelable": true,
98
111
  "composed": true,
99
112
  "docs": {
100
- "tags": [],
101
- "text": ""
113
+ "tags": [{
114
+ "name": "event",
115
+ "text": "justifi-card-form#cardFormReady"
116
+ }],
117
+ "text": "Triggered when iframe has loaded"
102
118
  },
103
119
  "complexType": {
104
120
  "original": "any",
@@ -112,8 +128,11 @@ export class CardForm {
112
128
  "cancelable": true,
113
129
  "composed": true,
114
130
  "docs": {
115
- "tags": [],
116
- "text": ""
131
+ "tags": [{
132
+ "name": "event",
133
+ "text": "justifi-card-form#cardFormTokenize"
134
+ }],
135
+ "text": "Triggered when the tokenize method is called on the component"
117
136
  },
118
137
  "complexType": {
119
138
  "original": "{ data: any }",
@@ -127,8 +146,11 @@ export class CardForm {
127
146
  "cancelable": true,
128
147
  "composed": true,
129
148
  "docs": {
130
- "tags": [],
131
- "text": ""
149
+ "tags": [{
150
+ "name": "event",
151
+ "text": "justifi-card-form#cardFormTokenize"
152
+ }],
153
+ "text": "Triggered when the validate method is called on the component"
132
154
  },
133
155
  "complexType": {
134
156
  "original": "{ data: { isValid: boolean } }",
@@ -160,23 +182,23 @@ export class CardForm {
160
182
  "return": "Promise<any>"
161
183
  },
162
184
  "docs": {
163
- "text": "",
185
+ "text": "Makes a tokenization request to the iframe",
164
186
  "tags": []
165
187
  }
166
188
  },
167
189
  "validate": {
168
190
  "complexType": {
169
- "signature": "() => Promise<any>",
191
+ "signature": "() => Promise<{ isValid: boolean; }>",
170
192
  "parameters": [],
171
193
  "references": {
172
194
  "Promise": {
173
195
  "location": "global"
174
196
  }
175
197
  },
176
- "return": "Promise<any>"
198
+ "return": "Promise<{ isValid: boolean; }>"
177
199
  },
178
200
  "docs": {
179
- "text": "",
201
+ "text": "Runs a validation on the form and shows errors if any",
180
202
  "tags": []
181
203
  }
182
204
  }
@@ -1,37 +1,17 @@
1
1
  import { userEvent, within } from '@storybook/testing-library';
2
2
  import { expect } from '@storybook/jest';
3
+ const isDev = process.env.NODE_ENV === 'development';
3
4
  export default {
4
5
  title: 'Components/CardForm',
5
- component: 'justifi-payment-method-form',
6
+ component: 'justifi-card-form',
6
7
  argTypes: {
7
- iframeOrigin: {
8
+ 'iframe-origin': {
8
9
  control: 'text',
9
10
  table: {
10
- category: 'Props'
11
+ disable: isDev ? false : true,
12
+ category: 'props',
11
13
  }
12
14
  },
13
- singleLine: {
14
- control: 'boolean',
15
- table: {
16
- category: 'Props'
17
- }
18
- },
19
- validationMode: {
20
- control: { type: 'select' },
21
- options: ['onSubmit', 'onBlur', 'onChange', 'onTouched', 'all'],
22
- table: {
23
- category: 'Props'
24
- }
25
- }
26
- },
27
- parameters: {
28
- actions: {
29
- handles: [
30
- 'cardFormReady',
31
- 'cardFormValidate',
32
- 'cardFormTokenize'
33
- ],
34
- },
35
15
  },
36
16
  decorators: [
37
17
  (story) => `
@@ -68,27 +48,28 @@ const FormButtons = `
68
48
  }
69
49
  .button-bar button {
70
50
  margin-right: 10px;
51
+ border-radius: 3px;
52
+ border: 1px solid black;
71
53
  }
72
54
  </style>
73
55
  <div class="button-bar">
74
56
  <button id="validate-btn">Validate</button>
75
57
  <button id="tokenize-btn">Tokenize</button>
76
- </div>
77
- `;
58
+ </div>`;
78
59
  const Template = (args) => {
79
60
  const includeButtons = true;
80
61
  return (`
81
62
  <div>
82
63
  <style>
83
64
  :root {
84
- ${args.cssVariables}
65
+ ${args['css-variables'] || ''}
85
66
  }
86
67
  </style>
87
- <justifi-card-form
88
- data-testid="card-form-iframe"
89
- validation-mode='${args.validationMode || 'onSubmit'}'
90
- iframe-origin='${args.iframeOrigin || ''}'
91
- single-line='${args.singleLine}'
68
+ <justifi-card-form
69
+ data-testid="card-form-iframe"
70
+ validation-mode='${args['validation-mode'] || 'onSubmit'}'
71
+ iframe-origin='${args['iframe-origin'] || ''}'
72
+ single-line='${args['single-line']}'
92
73
  />
93
74
  </div>
94
75
  ${includeButtons ? FormButtons : ''}
@@ -96,23 +77,9 @@ const Template = (args) => {
96
77
  };
97
78
  export const Basic = Template.bind({});
98
79
  Basic.args = {
99
- iframeOrigin: '',
100
- singleLine: false,
101
- validationMode: 'onSubmit'
80
+ 'validation-mode': 'onSubmit',
81
+ 'single-line': false,
102
82
  };
103
- export const Embedded = Template.bind({});
104
- Embedded.decorators = [
105
- (story) => `
106
- <style>
107
- #wrapper {
108
- background-color: #aaaaaa;
109
- }
110
- </style>
111
- <div id="wrapper" style="width: 50%;">
112
- ${story()}
113
- </div>
114
- `,
115
- ];
116
83
  export const Styled = Template.bind({});
117
84
  Styled.args = {
118
85
  cssVariables: (`
@@ -1543,6 +1543,390 @@ progress {
1543
1543
  --bs-gutter-y: 3rem;
1544
1544
  }
1545
1545
  }
1546
+ .btn {
1547
+ --bs-btn-padding-x: 0.75rem;
1548
+ --bs-btn-padding-y: 0.375rem;
1549
+ --bs-btn-font-family: ;
1550
+ --bs-btn-font-size: 1rem;
1551
+ --bs-btn-font-weight: 400;
1552
+ --bs-btn-line-height: 1.5;
1553
+ --bs-btn-color: #212529;
1554
+ --bs-btn-bg: transparent;
1555
+ --bs-btn-border-width: 1px;
1556
+ --bs-btn-border-color: transparent;
1557
+ --bs-btn-border-radius: 0.375rem;
1558
+ --bs-btn-hover-border-color: transparent;
1559
+ --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
1560
+ --bs-btn-disabled-opacity: 0.65;
1561
+ --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);
1562
+ display: inline-block;
1563
+ padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
1564
+ font-family: var(--bs-btn-font-family);
1565
+ font-size: var(--bs-btn-font-size);
1566
+ font-weight: var(--bs-btn-font-weight);
1567
+ line-height: var(--bs-btn-line-height);
1568
+ color: var(--bs-btn-color);
1569
+ text-align: center;
1570
+ text-decoration: none;
1571
+ vertical-align: middle;
1572
+ cursor: pointer;
1573
+ user-select: none;
1574
+ border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
1575
+ border-radius: var(--bs-btn-border-radius);
1576
+ background-color: var(--bs-btn-bg);
1577
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1578
+ }
1579
+ @media (prefers-reduced-motion: reduce) {
1580
+ .btn {
1581
+ transition: none;
1582
+ }
1583
+ }
1584
+ .btn:hover {
1585
+ color: var(--bs-btn-hover-color);
1586
+ background-color: var(--bs-btn-hover-bg);
1587
+ border-color: var(--bs-btn-hover-border-color);
1588
+ }
1589
+ .btn-check + .btn:hover {
1590
+ color: var(--bs-btn-color);
1591
+ background-color: var(--bs-btn-bg);
1592
+ border-color: var(--bs-btn-border-color);
1593
+ }
1594
+ .btn:focus-visible {
1595
+ color: var(--bs-btn-hover-color);
1596
+ background-color: var(--bs-btn-hover-bg);
1597
+ border-color: var(--bs-btn-hover-border-color);
1598
+ outline: 0;
1599
+ box-shadow: var(--bs-btn-focus-box-shadow);
1600
+ }
1601
+ .btn-check:focus-visible + .btn {
1602
+ border-color: var(--bs-btn-hover-border-color);
1603
+ outline: 0;
1604
+ box-shadow: var(--bs-btn-focus-box-shadow);
1605
+ }
1606
+ .btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {
1607
+ color: var(--bs-btn-active-color);
1608
+ background-color: var(--bs-btn-active-bg);
1609
+ border-color: var(--bs-btn-active-border-color);
1610
+ }
1611
+ .btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {
1612
+ box-shadow: var(--bs-btn-focus-box-shadow);
1613
+ }
1614
+ .btn:disabled, .btn.disabled, fieldset:disabled .btn {
1615
+ color: var(--bs-btn-disabled-color);
1616
+ pointer-events: none;
1617
+ background-color: var(--bs-btn-disabled-bg);
1618
+ border-color: var(--bs-btn-disabled-border-color);
1619
+ opacity: var(--bs-btn-disabled-opacity);
1620
+ }
1621
+
1622
+ .btn-primary {
1623
+ --bs-btn-color: #fff;
1624
+ --bs-btn-bg: #0d6efd;
1625
+ --bs-btn-border-color: #0d6efd;
1626
+ --bs-btn-hover-color: #fff;
1627
+ --bs-btn-hover-bg: #0b5ed7;
1628
+ --bs-btn-hover-border-color: #0a58ca;
1629
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
1630
+ --bs-btn-active-color: #fff;
1631
+ --bs-btn-active-bg: #0a58ca;
1632
+ --bs-btn-active-border-color: #0a53be;
1633
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1634
+ --bs-btn-disabled-color: #fff;
1635
+ --bs-btn-disabled-bg: #0d6efd;
1636
+ --bs-btn-disabled-border-color: #0d6efd;
1637
+ }
1638
+
1639
+ .btn-secondary {
1640
+ --bs-btn-color: #fff;
1641
+ --bs-btn-bg: #6c757d;
1642
+ --bs-btn-border-color: #6c757d;
1643
+ --bs-btn-hover-color: #fff;
1644
+ --bs-btn-hover-bg: #5c636a;
1645
+ --bs-btn-hover-border-color: #565e64;
1646
+ --bs-btn-focus-shadow-rgb: 130, 138, 145;
1647
+ --bs-btn-active-color: #fff;
1648
+ --bs-btn-active-bg: #565e64;
1649
+ --bs-btn-active-border-color: #51585e;
1650
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1651
+ --bs-btn-disabled-color: #fff;
1652
+ --bs-btn-disabled-bg: #6c757d;
1653
+ --bs-btn-disabled-border-color: #6c757d;
1654
+ }
1655
+
1656
+ .btn-success {
1657
+ --bs-btn-color: #fff;
1658
+ --bs-btn-bg: #198754;
1659
+ --bs-btn-border-color: #198754;
1660
+ --bs-btn-hover-color: #fff;
1661
+ --bs-btn-hover-bg: #157347;
1662
+ --bs-btn-hover-border-color: #146c43;
1663
+ --bs-btn-focus-shadow-rgb: 60, 153, 110;
1664
+ --bs-btn-active-color: #fff;
1665
+ --bs-btn-active-bg: #146c43;
1666
+ --bs-btn-active-border-color: #13653f;
1667
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1668
+ --bs-btn-disabled-color: #fff;
1669
+ --bs-btn-disabled-bg: #198754;
1670
+ --bs-btn-disabled-border-color: #198754;
1671
+ }
1672
+
1673
+ .btn-info {
1674
+ --bs-btn-color: #000;
1675
+ --bs-btn-bg: #0dcaf0;
1676
+ --bs-btn-border-color: #0dcaf0;
1677
+ --bs-btn-hover-color: #000;
1678
+ --bs-btn-hover-bg: #31d2f2;
1679
+ --bs-btn-hover-border-color: #25cff2;
1680
+ --bs-btn-focus-shadow-rgb: 11, 172, 204;
1681
+ --bs-btn-active-color: #000;
1682
+ --bs-btn-active-bg: #3dd5f3;
1683
+ --bs-btn-active-border-color: #25cff2;
1684
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1685
+ --bs-btn-disabled-color: #000;
1686
+ --bs-btn-disabled-bg: #0dcaf0;
1687
+ --bs-btn-disabled-border-color: #0dcaf0;
1688
+ }
1689
+
1690
+ .btn-warning {
1691
+ --bs-btn-color: #000;
1692
+ --bs-btn-bg: #ffc107;
1693
+ --bs-btn-border-color: #ffc107;
1694
+ --bs-btn-hover-color: #000;
1695
+ --bs-btn-hover-bg: #ffca2c;
1696
+ --bs-btn-hover-border-color: #ffc720;
1697
+ --bs-btn-focus-shadow-rgb: 217, 164, 6;
1698
+ --bs-btn-active-color: #000;
1699
+ --bs-btn-active-bg: #ffcd39;
1700
+ --bs-btn-active-border-color: #ffc720;
1701
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1702
+ --bs-btn-disabled-color: #000;
1703
+ --bs-btn-disabled-bg: #ffc107;
1704
+ --bs-btn-disabled-border-color: #ffc107;
1705
+ }
1706
+
1707
+ .btn-danger {
1708
+ --bs-btn-color: #fff;
1709
+ --bs-btn-bg: #dc3545;
1710
+ --bs-btn-border-color: #dc3545;
1711
+ --bs-btn-hover-color: #fff;
1712
+ --bs-btn-hover-bg: #bb2d3b;
1713
+ --bs-btn-hover-border-color: #b02a37;
1714
+ --bs-btn-focus-shadow-rgb: 225, 83, 97;
1715
+ --bs-btn-active-color: #fff;
1716
+ --bs-btn-active-bg: #b02a37;
1717
+ --bs-btn-active-border-color: #a52834;
1718
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1719
+ --bs-btn-disabled-color: #fff;
1720
+ --bs-btn-disabled-bg: #dc3545;
1721
+ --bs-btn-disabled-border-color: #dc3545;
1722
+ }
1723
+
1724
+ .btn-light {
1725
+ --bs-btn-color: #000;
1726
+ --bs-btn-bg: #f8f9fa;
1727
+ --bs-btn-border-color: #f8f9fa;
1728
+ --bs-btn-hover-color: #000;
1729
+ --bs-btn-hover-bg: #d3d4d5;
1730
+ --bs-btn-hover-border-color: #c6c7c8;
1731
+ --bs-btn-focus-shadow-rgb: 211, 212, 213;
1732
+ --bs-btn-active-color: #000;
1733
+ --bs-btn-active-bg: #c6c7c8;
1734
+ --bs-btn-active-border-color: #babbbc;
1735
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1736
+ --bs-btn-disabled-color: #000;
1737
+ --bs-btn-disabled-bg: #f8f9fa;
1738
+ --bs-btn-disabled-border-color: #f8f9fa;
1739
+ }
1740
+
1741
+ .btn-dark {
1742
+ --bs-btn-color: #fff;
1743
+ --bs-btn-bg: #212529;
1744
+ --bs-btn-border-color: #212529;
1745
+ --bs-btn-hover-color: #fff;
1746
+ --bs-btn-hover-bg: #424649;
1747
+ --bs-btn-hover-border-color: #373b3e;
1748
+ --bs-btn-focus-shadow-rgb: 66, 70, 73;
1749
+ --bs-btn-active-color: #fff;
1750
+ --bs-btn-active-bg: #4d5154;
1751
+ --bs-btn-active-border-color: #373b3e;
1752
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1753
+ --bs-btn-disabled-color: #fff;
1754
+ --bs-btn-disabled-bg: #212529;
1755
+ --bs-btn-disabled-border-color: #212529;
1756
+ }
1757
+
1758
+ .btn-outline-primary {
1759
+ --bs-btn-color: #0d6efd;
1760
+ --bs-btn-border-color: #0d6efd;
1761
+ --bs-btn-hover-color: #fff;
1762
+ --bs-btn-hover-bg: #0d6efd;
1763
+ --bs-btn-hover-border-color: #0d6efd;
1764
+ --bs-btn-focus-shadow-rgb: 13, 110, 253;
1765
+ --bs-btn-active-color: #fff;
1766
+ --bs-btn-active-bg: #0d6efd;
1767
+ --bs-btn-active-border-color: #0d6efd;
1768
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1769
+ --bs-btn-disabled-color: #0d6efd;
1770
+ --bs-btn-disabled-bg: transparent;
1771
+ --bs-btn-disabled-border-color: #0d6efd;
1772
+ --bs-gradient: none;
1773
+ }
1774
+
1775
+ .btn-outline-secondary {
1776
+ --bs-btn-color: #6c757d;
1777
+ --bs-btn-border-color: #6c757d;
1778
+ --bs-btn-hover-color: #fff;
1779
+ --bs-btn-hover-bg: #6c757d;
1780
+ --bs-btn-hover-border-color: #6c757d;
1781
+ --bs-btn-focus-shadow-rgb: 108, 117, 125;
1782
+ --bs-btn-active-color: #fff;
1783
+ --bs-btn-active-bg: #6c757d;
1784
+ --bs-btn-active-border-color: #6c757d;
1785
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1786
+ --bs-btn-disabled-color: #6c757d;
1787
+ --bs-btn-disabled-bg: transparent;
1788
+ --bs-btn-disabled-border-color: #6c757d;
1789
+ --bs-gradient: none;
1790
+ }
1791
+
1792
+ .btn-outline-success {
1793
+ --bs-btn-color: #198754;
1794
+ --bs-btn-border-color: #198754;
1795
+ --bs-btn-hover-color: #fff;
1796
+ --bs-btn-hover-bg: #198754;
1797
+ --bs-btn-hover-border-color: #198754;
1798
+ --bs-btn-focus-shadow-rgb: 25, 135, 84;
1799
+ --bs-btn-active-color: #fff;
1800
+ --bs-btn-active-bg: #198754;
1801
+ --bs-btn-active-border-color: #198754;
1802
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1803
+ --bs-btn-disabled-color: #198754;
1804
+ --bs-btn-disabled-bg: transparent;
1805
+ --bs-btn-disabled-border-color: #198754;
1806
+ --bs-gradient: none;
1807
+ }
1808
+
1809
+ .btn-outline-info {
1810
+ --bs-btn-color: #0dcaf0;
1811
+ --bs-btn-border-color: #0dcaf0;
1812
+ --bs-btn-hover-color: #000;
1813
+ --bs-btn-hover-bg: #0dcaf0;
1814
+ --bs-btn-hover-border-color: #0dcaf0;
1815
+ --bs-btn-focus-shadow-rgb: 13, 202, 240;
1816
+ --bs-btn-active-color: #000;
1817
+ --bs-btn-active-bg: #0dcaf0;
1818
+ --bs-btn-active-border-color: #0dcaf0;
1819
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1820
+ --bs-btn-disabled-color: #0dcaf0;
1821
+ --bs-btn-disabled-bg: transparent;
1822
+ --bs-btn-disabled-border-color: #0dcaf0;
1823
+ --bs-gradient: none;
1824
+ }
1825
+
1826
+ .btn-outline-warning {
1827
+ --bs-btn-color: #ffc107;
1828
+ --bs-btn-border-color: #ffc107;
1829
+ --bs-btn-hover-color: #000;
1830
+ --bs-btn-hover-bg: #ffc107;
1831
+ --bs-btn-hover-border-color: #ffc107;
1832
+ --bs-btn-focus-shadow-rgb: 255, 193, 7;
1833
+ --bs-btn-active-color: #000;
1834
+ --bs-btn-active-bg: #ffc107;
1835
+ --bs-btn-active-border-color: #ffc107;
1836
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1837
+ --bs-btn-disabled-color: #ffc107;
1838
+ --bs-btn-disabled-bg: transparent;
1839
+ --bs-btn-disabled-border-color: #ffc107;
1840
+ --bs-gradient: none;
1841
+ }
1842
+
1843
+ .btn-outline-danger {
1844
+ --bs-btn-color: #dc3545;
1845
+ --bs-btn-border-color: #dc3545;
1846
+ --bs-btn-hover-color: #fff;
1847
+ --bs-btn-hover-bg: #dc3545;
1848
+ --bs-btn-hover-border-color: #dc3545;
1849
+ --bs-btn-focus-shadow-rgb: 220, 53, 69;
1850
+ --bs-btn-active-color: #fff;
1851
+ --bs-btn-active-bg: #dc3545;
1852
+ --bs-btn-active-border-color: #dc3545;
1853
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1854
+ --bs-btn-disabled-color: #dc3545;
1855
+ --bs-btn-disabled-bg: transparent;
1856
+ --bs-btn-disabled-border-color: #dc3545;
1857
+ --bs-gradient: none;
1858
+ }
1859
+
1860
+ .btn-outline-light {
1861
+ --bs-btn-color: #f8f9fa;
1862
+ --bs-btn-border-color: #f8f9fa;
1863
+ --bs-btn-hover-color: #000;
1864
+ --bs-btn-hover-bg: #f8f9fa;
1865
+ --bs-btn-hover-border-color: #f8f9fa;
1866
+ --bs-btn-focus-shadow-rgb: 248, 249, 250;
1867
+ --bs-btn-active-color: #000;
1868
+ --bs-btn-active-bg: #f8f9fa;
1869
+ --bs-btn-active-border-color: #f8f9fa;
1870
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1871
+ --bs-btn-disabled-color: #f8f9fa;
1872
+ --bs-btn-disabled-bg: transparent;
1873
+ --bs-btn-disabled-border-color: #f8f9fa;
1874
+ --bs-gradient: none;
1875
+ }
1876
+
1877
+ .btn-outline-dark {
1878
+ --bs-btn-color: #212529;
1879
+ --bs-btn-border-color: #212529;
1880
+ --bs-btn-hover-color: #fff;
1881
+ --bs-btn-hover-bg: #212529;
1882
+ --bs-btn-hover-border-color: #212529;
1883
+ --bs-btn-focus-shadow-rgb: 33, 37, 41;
1884
+ --bs-btn-active-color: #fff;
1885
+ --bs-btn-active-bg: #212529;
1886
+ --bs-btn-active-border-color: #212529;
1887
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1888
+ --bs-btn-disabled-color: #212529;
1889
+ --bs-btn-disabled-bg: transparent;
1890
+ --bs-btn-disabled-border-color: #212529;
1891
+ --bs-gradient: none;
1892
+ }
1893
+
1894
+ .btn-link {
1895
+ --bs-btn-font-weight: 400;
1896
+ --bs-btn-color: var(--bs-link-color);
1897
+ --bs-btn-bg: transparent;
1898
+ --bs-btn-border-color: transparent;
1899
+ --bs-btn-hover-color: var(--bs-link-hover-color);
1900
+ --bs-btn-hover-border-color: transparent;
1901
+ --bs-btn-active-color: var(--bs-link-hover-color);
1902
+ --bs-btn-active-border-color: transparent;
1903
+ --bs-btn-disabled-color: #6c757d;
1904
+ --bs-btn-disabled-border-color: transparent;
1905
+ --bs-btn-box-shadow: none;
1906
+ --bs-btn-focus-shadow-rgb: 49, 132, 253;
1907
+ text-decoration: underline;
1908
+ }
1909
+ .btn-link:focus-visible {
1910
+ color: var(--bs-btn-color);
1911
+ }
1912
+ .btn-link:hover {
1913
+ color: var(--bs-btn-hover-color);
1914
+ }
1915
+
1916
+ .btn-lg {
1917
+ --bs-btn-padding-y: 0.5rem;
1918
+ --bs-btn-padding-x: 1rem;
1919
+ --bs-btn-font-size: 1.25rem;
1920
+ --bs-btn-border-radius: 0.5rem;
1921
+ }
1922
+
1923
+ .btn-sm {
1924
+ --bs-btn-padding-y: 0.25rem;
1925
+ --bs-btn-padding-x: 0.5rem;
1926
+ --bs-btn-font-size: 0.875rem;
1927
+ --bs-btn-border-radius: 0.25rem;
1928
+ }
1929
+
1546
1930
  :host {
1547
1931
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
1548
1932
  font-size: 1rem;